]> Dogcows Code - chaz/openbox/blobdiff - src/Window.cc
sync with bb-cvs
[chaz/openbox] / src / Window.cc
index 4824a34acadc4b2ded219ea7c32264eef5faac4a..1b86b285241795e16793f6649f598956abdeea27 100644 (file)
@@ -590,8 +590,8 @@ void BlackboxWindow::decorate(void) {
   }
 
   if (decorations & Decor_Border) {
-    frame.fborder_pixel = screen->getWindowStyle()->f_focus.pixel();
-    frame.uborder_pixel = screen->getWindowStyle()->f_unfocus.pixel();
+    frame.fborder_pixel = screen->getWindowStyle()->f_focus.color().pixel();
+    frame.uborder_pixel = screen->getWindowStyle()->f_unfocus.color().pixel();
   }
 
   if (decorations & Decor_Handle) {
@@ -1005,39 +1005,50 @@ void BlackboxWindow::updateStrut(void) {
 
 
 bool BlackboxWindow::getWindowType(void) {
-  unsigned long val;
+  window_type = (WindowType) -1;
+
+  unsigned long *val;
+  unsigned long num = (unsigned) -1;
   if (xatom->getValue(client.window, XAtom::net_wm_window_type, XAtom::atom,
-                      val)) {
-    if (val == xatom->getAtom(XAtom::net_wm_window_type_desktop))
-      window_type = Type_Desktop;
-    else if (val == xatom->getAtom(XAtom::net_wm_window_type_dock))
-      window_type = Type_Dock;
-    else if (val == xatom->getAtom(XAtom::net_wm_window_type_toolbar))
-      window_type = Type_Toolbar;
-    else if (val == xatom->getAtom(XAtom::net_wm_window_type_menu))
-      window_type = Type_Menu;
-    else if (val == xatom->getAtom(XAtom::net_wm_window_type_utility))
-      window_type = Type_Utility;
-    else if (val == xatom->getAtom(XAtom::net_wm_window_type_splash))
-      window_type = Type_Splash;
-    else if (val == xatom->getAtom(XAtom::net_wm_window_type_dialog))
+                        num, &val)) {
+    for (unsigned long i = 0; i < num; ++i) {
+      if (val[i] == xatom->getAtom(XAtom::net_wm_window_type_desktop))
+        window_type = Type_Desktop;
+      else if (val[i] == xatom->getAtom(XAtom::net_wm_window_type_dock))
+        window_type = Type_Dock;
+      else if (val[i] == xatom->getAtom(XAtom::net_wm_window_type_toolbar))
+        window_type = Type_Toolbar;
+      else if (val[i] == xatom->getAtom(XAtom::net_wm_window_type_menu))
+        window_type = Type_Menu;
+      else if (val[i] == xatom->getAtom(XAtom::net_wm_window_type_utility))
+        window_type = Type_Utility;
+      else if (val[i] == xatom->getAtom(XAtom::net_wm_window_type_splash))
+        window_type = Type_Splash;
+      else if (val[i] == xatom->getAtom(XAtom::net_wm_window_type_dialog))
+        window_type = Type_Dialog;
+      else if (val[i] == xatom->getAtom(XAtom::net_wm_window_type_normal))
+        window_type = Type_Normal;
+      else if (val[i] ==
+               xatom->getAtom(XAtom::kde_net_wm_window_type_override))
+        mwm_decorations = 0; // prevent this window from getting any decor
+    }
+    delete val;
+  }
+    
+  if (window_type == (WindowType) -1) {
+    /*
+     * the window type hint was not set, which means we either classify ourself
+     * as a normal window or a dialog, depending on if we are a transient.
+     */
+    if (isTransient())
       window_type = Type_Dialog;
-    else //if (val[0] == xatom->getAtom(XAtom::net_wm_window_type_normal))
+    else
       window_type = Type_Normal;
 
-    return True;
+    return False;
   }
 
-  /*
-   * the window type hint was not set, which means we either classify ourself
-   * as a normal window or a dialog, depending on if we are a transient.
-   */
-  if (isTransient())
-    window_type = Type_Dialog;
-
-  window_type = Type_Normal;
-
-  return False;
+  return True;
 }
 
 
@@ -2699,7 +2710,7 @@ void BlackboxWindow::reparentNotifyEvent(const XReparentEvent *re) {
 
 
 void BlackboxWindow::propertyNotifyEvent(const XPropertyEvent *pe) {
-  if (pe->state == PropertyDelete)
+  if (pe->state == PropertyDelete || ! validateClient())
     return;
 
 #if 0
@@ -3058,13 +3069,12 @@ void BlackboxWindow::doMove(int x_root, int y_root) {
   dx -= frame.border_w;
   dy -= frame.border_w;
 
-  if (screen->doWorkspaceWarping())
-    if (doWorkspaceWarping(x_root, y_root, dx, dy))
-      return;
-
   doWindowSnapping(dx, dy);
 
   if (screen->doOpaqueMove()) {
+    if (screen->doWorkspaceWarping())
+      doWorkspaceWarping(x_root, y_root, dx);
+
     configure(dx, dy, frame.rect.width(), frame.rect.height());
   } else {
     XDrawRectangle(blackbox->getXDisplay(), screen->getRootWindow(),
@@ -3074,6 +3084,9 @@ void BlackboxWindow::doMove(int x_root, int y_root) {
                    frame.changing.width() - 1,
                    frame.changing.height() - 1);
 
+    if (screen->doWorkspaceWarping())
+      doWorkspaceWarping(x_root, y_root, dx);
+
     frame.changing.setPos(dx, dy);
 
     XDrawRectangle(blackbox->getXDisplay(), screen->getRootWindow(),
@@ -3088,8 +3101,7 @@ void BlackboxWindow::doMove(int x_root, int y_root) {
 }
 
 
-bool BlackboxWindow::doWorkspaceWarping(int x_root, int y_root,
-                                        int dx, int dy) {
+void BlackboxWindow::doWorkspaceWarping(int x_root, int y_root, int &dx) {
   // workspace warping
   bool warp = False;
   unsigned int dest = screen->getCurrentWorkspaceID();
@@ -3106,40 +3118,41 @@ bool BlackboxWindow::doWorkspaceWarping(int x_root, int y_root,
     else dest = 0;
   }
   if (! warp)
-    return false;
+    return;
 
-  endMove();
   bool focus = flags.focused; // had focus while moving?
-  if (! flags.stuck)
-    screen->reassociateWindow(this, dest, False);
-  screen->changeWorkspaceID(dest);
-  if (focus)
-    setInputFocus();
 
-  /*
-     We grab the X server here because we are moving the window and then the
-     mouse cursor. When one moves, it could end up putting the mouse cursor
-     over another window for a moment. This can cause the warp to iniate a
-     move on another window.
-  */
-  XGrabServer(blackbox->getXDisplay());
-  int dest_x;
+  int dest_x = x_root;
   if (x_root <= 0) {
-    dest_x = screen->getRect().right() - 1;
-    configure(dx + (screen->getRect().width() - 1), dy,
-              frame.rect.width(), frame.rect.height());
+    dest_x += screen->getRect().width() - 1;
+    dx += screen->getRect().width() - 1;
   } else {
-    dest_x = 0;
-    configure(dx - (screen->getRect().width() - 1), dy,
-              frame.rect.width(), frame.rect.height());
+    dest_x -= screen->getRect().width() - 1;
+    dx -= screen->getRect().width() - 1;
   }
+
+  if (! flags.stuck)
+    screen->reassociateWindow(this, dest, False);
+  screen->changeWorkspaceID(dest);
+
+  if (screen->doOpaqueMove())
+    XGrabServer(blackbox->getXDisplay());
+
+  XUngrabPointer(blackbox->getXDisplay(), CurrentTime);
   XWarpPointer(blackbox->getXDisplay(), None, 
                screen->getRootWindow(), 0, 0, 0, 0,
                dest_x, y_root);
-  XUngrabServer(blackbox->getXDisplay());
+  XGrabPointer(blackbox->getXDisplay(), frame.window, False,
+               PointerMotionMask | ButtonReleaseMask,
+               GrabModeAsync, GrabModeAsync,
+               None, blackbox->getMoveCursor(), CurrentTime);
+
+  if (screen->doOpaqueMove())
+    XUngrabServer(blackbox->getXDisplay());
+
+  if (focus)
+    setInputFocus();
 
-  beginMove(dest_x, y_root);
-  return true;
 }
 
 
This page took 0.025219 seconds and 4 git commands to generate.