Selaa lähdekoodia

Merge pull request #45 from linkdd/master

Manage _NET_WM_WINDOW_TYPE_DESKTOP (Closes #29)
Martin Duquesnoy 12 vuotta sitten
vanhempi
commit
4e2c6125ca
3 muutettua tiedostoa jossa 38 lisäystä ja 1 poistoa
  1. 2 1
      src/event.c
  2. 34 0
      src/ewmh.c
  3. 2 0
      src/ewmh.h

+ 2 - 1
src/event.c

@@ -244,7 +244,8 @@ event_maprequest(XEvent *e)
 
      /* Which windows to manage */
      if(!XGetWindowAttributes(EVDPY(e), ev->window, &at)
-        || at.override_redirect)
+        || at.override_redirect
+        || ewmh_manage_window_type_desktop(ev->window))
           return;
 
      if(!client_gb_win(ev->window))

+ 34 - 0
src/ewmh.c

@@ -42,6 +42,7 @@ ewmh_init(void)
      W->net_atom[net_supporting_wm_check]        = ATOM("_NET_SUPPORTING_WM_CHECK");
      W->net_atom[net_wm_window_opacity]          = ATOM("_NET_WM_WINDOW_OPACITY");
      W->net_atom[net_wm_window_type_normal]      = ATOM("_NET_WM_WINDOW_TYPE_NORMAL");
+     W->net_atom[net_wm_window_type_desktop]     = ATOM("_NET_WM_WINDOW_TYPE_DESKTOP");
      W->net_atom[net_wm_window_type_dock]        = ATOM("_NET_WM_WINDOW_TYPE_DOCK");
      W->net_atom[net_wm_window_type_splash]      = ATOM("_NET_WM_WINDOW_TYPE_SPLASH");
      W->net_atom[net_wm_window_type_dialog]      = ATOM("_NET_WM_WINDOW_TYPE_DIALOG");
@@ -267,3 +268,36 @@ ewmh_manage_window_type(struct client *c)
      }
 }
 
+bool
+ewmh_manage_window_type_desktop(Window win)
+{
+     Atom *atom, rf;
+     int f;
+     unsigned long n, il, i;
+     unsigned char *data = NULL;
+     bool is_desktop = false;
+
+     if(XGetWindowProperty(W->dpy, win, W->net_atom[net_wm_window_type], 0L, 0x7FFFFFFF,
+                           False, XA_ATOM, &rf, &f, &n, &il, &data) == Success && n)
+     {
+          atom = (Atom*)data;
+
+          for(i = 0; i < n; ++i)
+          {
+               /* If it is a _NET_WM_WINDOW_TYPE_DESKTOP window */
+               if(atom[i] == W->net_atom[net_wm_window_type_desktop])
+               {
+                    /* map it, but don't manage it */
+                    XMapWindow(W->dpy, win);
+                    XMapSubwindows(W->dpy, win);
+
+                    is_desktop = true;
+                    break;
+               }
+          }
+
+          XFree(data);
+     }
+
+     return is_desktop;
+}

+ 2 - 0
src/ewmh.h

@@ -60,6 +60,7 @@ enum
      net_supporting_wm_check,
      net_wm_window_opacity,
      net_wm_window_type_normal,
+     net_wm_window_type_desktop,
      net_wm_window_type_dock,
      net_wm_window_type_splash,
      net_wm_window_type_dialog,
@@ -124,5 +125,6 @@ long ewmh_get_xembed_state(Window win);
 void ewmh_update_wmfs_props(void);
 void ewmh_manage_state(long data[], struct client *c);
 void ewmh_manage_window_type(struct client *c);
+bool ewmh_manage_window_type_desktop(Window win);
 
 #endif /* EWMH_H */