David Delassus преди 12 години
родител
ревизия
3878e89b99
променени са 3 файла, в които са добавени 36 реда и са изтрити 27 реда
  1. 2 27
      src/event.c
  2. 33 0
      src/ewmh.c
  3. 1 0
      src/ewmh.h

+ 2 - 27
src/event.c

@@ -242,37 +242,12 @@ event_maprequest(XEvent *e)
      XWindowAttributes at;
      struct _systray *s;
 
-     Atom *atom, rf;
-     int f;
-     unsigned long n, il, i;
-     unsigned char *data = NULL;
-
      /* 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(XGetWindowProperty(EVDPY(e), ev->window, 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(EVDPY(e), ev->window);
-                    XMapSubwindows(EVDPY(e), ev->window);
-                    XFree(data);
-                    return;
-               }
-          }
-
-          XFree(data);
-     }
-
      if(!client_gb_win(ev->window))
           client_new(ev->window, &at, false);
      else if((s = systray_find(ev->window)))

+ 33 - 0
src/ewmh.c

@@ -268,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;
+}

+ 1 - 0
src/ewmh.h

@@ -125,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 */