]> Dogcows Code - chaz/openbox/blobdiff - openbox/menuframe.c
let you alt-tab to utility windows when focus is already in the group
[chaz/openbox] / openbox / menuframe.c
index 06a434598b36bafbea6da18da159df90f4f63283..a95e46fca4e1ccc9bd300037feb7ffed9ad6c196 100644 (file)
@@ -221,15 +221,18 @@ static void menu_frame_place_topmenu(ObMenuFrame *self, gint *x, gint *y)
 
         /* try to the right of the cursor */
         menu_frame_move_on_screen(self, myx, *y, &dx, &dy);
+        self->direction_right = TRUE;
         if (dx != 0) {
             /* try to the left of the cursor */
             myx = *x - self->area.width;
             menu_frame_move_on_screen(self, myx, *y, &dx, &dy);
+            self->direction_right = FALSE;
         }
         if (dx != 0) {
             /* if didnt fit on either side so just use what it says */
             myx = *x;
             menu_frame_move_on_screen(self, myx, *y, &dx, &dy);
+            self->direction_right = TRUE;
         }
         *x = myx + dx;
         *y += dy;
@@ -241,29 +244,34 @@ static void menu_frame_place_topmenu(ObMenuFrame *self, gint *x, gint *y)
 
         /* try to the bottom right of the cursor */
         menu_frame_move_on_screen(self, myx, myy, &dx, &dy);
+        self->direction_right = TRUE;
         if (dx != 0 || dy != 0) {
             /* try to the bottom left of the cursor */
             myx = *x - self->area.width;
             myy = *y;
             menu_frame_move_on_screen(self, myx, myy, &dx, &dy);
+            self->direction_right = FALSE;
         }
         if (dx != 0 || dy != 0) {
             /* try to the top right of the cursor */
             myx = *x;
             myy = *y - self->area.height;
             menu_frame_move_on_screen(self, myx, myy, &dx, &dy);
+            self->direction_right = TRUE;
         }
         if (dx != 0 || dy != 0) {
             /* try to the top left of the cursor */
             myx = *x - self->area.width;
             myy = *y - self->area.height;
             menu_frame_move_on_screen(self, myx, myy, &dx, &dy);
+            self->direction_right = FALSE;
         }
         if (dx != 0 || dy != 0) {
             /* if didnt fit on either side so just use what it says */
             myx = *x;
             myy = *y;
             menu_frame_move_on_screen(self, myx, myy, &dx, &dy);
+            self->direction_right = TRUE;
         }
         *x = myx + dx;
         *y = myy + dy;
@@ -743,16 +751,6 @@ static gboolean menu_frame_show(ObMenuFrame *self)
 {
     GList *it;
 
-    if (menu_frame_visible == NULL) {
-        /* no menus shown yet */
-        if (!grab_pointer(TRUE, TRUE, OB_CURSOR_POINTER))
-            return FALSE;
-        if (!grab_keyboard(TRUE)) {
-            grab_pointer(FALSE, TRUE, OB_CURSOR_POINTER);
-            return FALSE;
-        }
-    }
-
     /* determine if the underlying menu is already visible */
     for (it = menu_frame_visible; it; it = g_list_next(it)) {
         ObMenuFrame *f = it->data;
@@ -761,7 +759,18 @@ static gboolean menu_frame_show(ObMenuFrame *self)
     }
     if (!it) {
         if (self->menu->update_func)
-            self->menu->update_func(self, self->menu->data);
+            if (!self->menu->update_func(self, self->menu->data))
+                return FALSE;
+    }
+
+    if (menu_frame_visible == NULL) {
+        /* no menus shown yet */
+        if (!grab_pointer(TRUE, TRUE, OB_CURSOR_POINTER))
+            return FALSE;
+        if (!grab_keyboard(TRUE)) {
+            grab_pointer(FALSE, TRUE, OB_CURSOR_POINTER);
+            return FALSE;
+        }
     }
 
     menu_frame_update(self);
This page took 0.021964 seconds and 4 git commands to generate.