]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
focus... works...? i have all cases of mozilla working, with RevertToPointerRoot...
[chaz/openbox] / openbox / client.c
index 59c2274e9104862dbdc19aaf9fc76b5d30fa0935..eddd96c427dc1de5cc08381133ce82aa26071790 100644 (file)
@@ -706,7 +706,7 @@ void client_update_normal_hints(Client *self)
 
     /* get the hints from the window */
     if (XGetWMNormalHints(ob_display, self->window, &size, &ret)) {
-       self->positioned = (size.flags & (PPosition|USPosition));
+       self->positioned = !!(size.flags & (PPosition|USPosition));
 
        if (size.flags & PWinGravity) {
            self->gravity = size.win_gravity;
@@ -1085,7 +1085,7 @@ void client_update_strut(Client *self)
     gulong *data;
 
     if (PROP_GET32A(self->window, net_wm_strut, cardinal, data, 4)) {
-       STRUT_SET(self->strut, data[0], data[1], data[2], data[3]);
+       STRUT_SET(self->strut, data[0], data[2], data[1], data[3]);
        g_free(data);
     } else
        STRUT_SET(self->strut, 0, 0, 0, 0);
@@ -1326,13 +1326,11 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h,
         /* set the size and position if maximized */
         if (self->max_horz) {
             x = screen_area(self->desktop)->x - self->frame->size.left;
-            w = screen_area(self->desktop)->x +
-                screen_area(self->desktop)->width;
+            w = screen_area(self->desktop)->width;
         }
         if (self->max_vert) {
             y = screen_area(self->desktop)->y;
-            h = screen_area(self->desktop)->y +
-                screen_area(self->desktop)->height -
+            h = screen_area(self->desktop)->height -
                 self->frame->size.top - self->frame->size.bottom;
         }
     }
@@ -1543,7 +1541,7 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
        XUnmapWindow(ob_display, self->window);
     } else {
        if (curdesk)
-           client_set_desktop(self, screen_desktop);
+           client_set_desktop(self, screen_desktop, FALSE);
        self->wmstate = self->shaded ? IconicState : NormalState;
        XMapWindow(ob_display, self->window);
     }
@@ -1704,13 +1702,14 @@ void client_kill(Client *self)
     XKillClient(ob_display, self->window);
 }
 
-void client_set_desktop(Client *self, guint target)
+void client_set_desktop(Client *self, guint target, gboolean donthide)
 {
     guint old, i;
+    ConfigValue focus_new;
 
     if (target == self->desktop) return;
   
-    g_message("Setting desktop %u\n", target);
+    g_message("Setting desktop %u", target);
 
     g_assert(target < screen_num_desktops || target == DESKTOP_ALL);
 
@@ -1720,19 +1719,31 @@ void client_set_desktop(Client *self, guint target)
     /* the frame can display the current desktop state */
     engine_frame_adjust_state(self->frame);
     /* 'move' the window to the new desktop */
-    client_showhide(self);
+    if (!donthide)
+        client_showhide(self);
+    stacking_raise(self);
     screen_update_struts();
 
     /* update the focus lists */
+    if (!config_get("focusNew", Config_Bool, &focus_new))
+        g_assert_not_reached();
     if (old == DESKTOP_ALL) {
         for (i = 0; i < screen_num_desktops; ++i)
             focus_order[i] = g_list_remove(focus_order[i], self);
-        focus_order[target] = g_list_prepend(focus_order[target], self);
-    } else {
+    } else
         focus_order[old] = g_list_remove(focus_order[old], self);
-        if (target == DESKTOP_ALL)
-            for (i = 0; i < screen_num_desktops; ++i)
+    if (target == DESKTOP_ALL) {
+        for (i = 0; i < screen_num_desktops; ++i) {
+            if (focus_new.bool)
                 focus_order[i] = g_list_prepend(focus_order[i], self);
+            else
+                focus_order[i] = g_list_append(focus_order[i], self);
+        }
+    } else {
+        if (focus_new.bool)
+            focus_order[target] = g_list_prepend(focus_order[target], self);
+        else
+            focus_order[target] = g_list_append(focus_order[target], self);
     }
 
     dispatch_client(Event_Client_Desktop, self, target, old);
@@ -1945,9 +1956,10 @@ gboolean client_focus(Client *self)
     }
 
     if (self->can_focus)
-        /* RevertToNone is used so that windows dont get focused inadvertantly
-           by having the pointer in them, and then FocusIn events go missing */
-       XSetInputFocus(ob_display, self->window, RevertToNone,
+        /* RevertToPointerRoot causes much more headache than TevertToNone, so
+           I choose to use it always, hopefully to find errors quicker, if any
+           are left. (I hate X. I hate focus events.) */
+       XSetInputFocus(ob_display, self->window, RevertToPointerRoot,
                        event_lasttime);
 
     if (self->focus_notify) {
This page took 0.032557 seconds and 4 git commands to generate.