]> Dogcows Code - chaz/openbox/blobdiff - openbox/menuframe.c
limit the size popup to the screen, maybe this doesnt work with xinerama though?
[chaz/openbox] / openbox / menuframe.c
index 5c502d84553e06b14c5489c408281b87a848eca6..0d04c7a8976e139c71d261e8e44c90ceec9e4ff7 100644 (file)
@@ -1,3 +1,21 @@
+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
+
+   menuframe.c for the Openbox window manager
+   Copyright (c) 2003        Ben Jansens
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   See the COPYING file for a copy of the GNU General Public License.
+*/
+
 #include "menuframe.h"
 #include "client.h"
 #include "menu.h"
@@ -11,7 +29,7 @@
 #define MAX_MENU_WIDTH 400
 
 #define FRAME_EVENTMASK (ButtonPressMask |ButtonMotionMask | EnterWindowMask |\
-                        LeaveWindowMask)
+                         LeaveWindowMask)
 #define TITLE_EVENTMASK (ButtonPressMask | ButtonMotionMask)
 #define ENTRY_EVENTMASK (EnterWindowMask | LeaveWindowMask | \
                          ButtonPressMask | ButtonReleaseMask)
@@ -24,11 +42,11 @@ static void menu_entry_frame_free(ObMenuEntryFrame *self);
 static void menu_frame_render(ObMenuFrame *self);
 static void menu_frame_update(ObMenuFrame *self);
 
-static Window createWindow(Window parent, unsigned long mask,
-                          XSetWindowAttributes *attrib)
+static Window createWindow(Window parent, gulong mask,
+                           XSetWindowAttributes *attrib)
 {
     return XCreateWindow(ob_display, parent, 0, 0, 1, 1, 0,
-                        RrDepth(ob_rr_inst), InputOutput,
+                         RrDepth(ob_rr_inst), InputOutput,
                          RrVisual(ob_rr_inst), mask, attrib);
 }
 
@@ -166,7 +184,7 @@ void menu_frame_move(ObMenuFrame *self, gint x, gint y)
 
 void menu_frame_move_on_screen(ObMenuFrame *self)
 {
-    Rect *a;
+    Rect *a = NULL;
     guint i;
     gint dx = 0, dy = 0;
     gint pos, half;
@@ -199,11 +217,17 @@ void menu_frame_move_on_screen(ObMenuFrame *self)
     if (dx || dy) {
         ObMenuFrame *f;
 
-        for (f = self; f; f = f->parent)
+        /* move the current menu frame to fit, but dont touch parents yet */
+        menu_frame_move(self, self->area.x + dx, self->area.y + dy);
+        if (!config_menu_xorstyle)
+            dy = 0; /* if we want to be like xor, move parents in y- *
+                     * and x-direction, otherwise just in x-dir      */
+        for (f = self->parent; f; f = f->parent)
             menu_frame_move(f, f->area.x + dx, f->area.y + dy);
         for (f = self->child; f; f = f->child)
             menu_frame_move(f, f->area.x + dx, f->area.y + dy);
-        XWarpPointer(ob_display, None, None, 0, 0, 0, 0, dx, dy);
+        if (config_menu_warppointer)
+            XWarpPointer(ob_display, None, None, 0, 0, 0, 0, dx, dy);
     }
 }
 
@@ -566,12 +590,22 @@ static void menu_frame_update(ObMenuFrame *self)
     menu_frame_render(self);
 }
 
-void menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
+gboolean menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
 {
     GList *it;
 
     if (g_list_find(menu_frame_visible, self))
-        return;
+        return TRUE;
+
+    if (menu_frame_visible == NULL) {
+        /* no menus shown yet */
+        if (!grab_pointer(TRUE, OB_CURSOR_NONE))
+            return FALSE;
+        if (!grab_keyboard(TRUE)) {
+            grab_pointer(FALSE, OB_CURSOR_NONE);
+            return FALSE;
+        }
+    }
 
     if (parent) {
         if (parent->child)
@@ -580,12 +614,6 @@ void menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
     }
     self->parent = parent;
 
-    if (menu_frame_visible == NULL) {
-        /* no menus shown yet */
-        grab_pointer(TRUE, OB_CURSOR_NONE);
-        grab_keyboard(TRUE);
-    }
-
     /* determine if the underlying menu is already visible */
     for (it = menu_frame_visible; it; it = g_list_next(it)) {
         ObMenuFrame *f = it->data;
@@ -604,6 +632,8 @@ void menu_frame_show(ObMenuFrame *self, ObMenuFrame *parent)
     menu_frame_move_on_screen(self);
 
     XMapWindow(ob_display, self->window);
+
+    return TRUE;
 }
 
 void menu_frame_hide(ObMenuFrame *self)
@@ -749,12 +779,8 @@ void menu_entry_frame_execute(ObMenuEntryFrame *self, guint state)
 
         if (func)
             func(entry, state, data);
-        else {
-            GSList *it;
-
-            for (it = acts; it; it = g_slist_next(it))
-                action_run(it->data, client, state);
-        }
+        else
+            action_run(acts, client, state);
     }
 }
 
This page took 0.02648 seconds and 4 git commands to generate.