]> Dogcows Code - chaz/openbox/commitdiff
menus works on some level. add a built-in root menu
authorDana Jansens <danakj@orodu.net>
Wed, 16 Apr 2003 18:09:11 +0000 (18:09 +0000)
committerDana Jansens <danakj@orodu.net>
Wed, 16 Apr 2003 18:09:11 +0000 (18:09 +0000)
openbox/event.c
openbox/grab.c
openbox/grab.h
openbox/menu.c
openbox/menu.h

index 4398c97724d9469d1668fa68245328e30226a8f2..7d61c9eb4940b69042a4a098efcf27e2f2df2091 100644 (file)
@@ -79,6 +79,7 @@ void event_loop()
     XEvent e;
     int x_fd;
     struct timeval *wait;
+    gboolean had_event = FALSE;
 
     while (TRUE) {
        /*
@@ -105,13 +106,16 @@ void event_loop()
        XNextEvent(ob_display, &e);
 
        event_process(&e);
+        had_event = TRUE;
+    }
+
+    if (!had_event) {
+        timer_dispatch((GTimeVal**)&wait);
+        x_fd = ConnectionNumber(ob_display);
+        FD_ZERO(&selset);
+        FD_SET(x_fd, &selset);
+        select(x_fd + 1, &selset, NULL, NULL, wait);
     }
-     
-    timer_dispatch((GTimeVal**)&wait);
-    x_fd = ConnectionNumber(ob_display);
-    FD_ZERO(&selset);
-    FD_SET(x_fd, &selset);
-    select(x_fd + 1, &selset, NULL, NULL, wait);
 }
 
 static Window event_get_window(XEvent *e)
@@ -711,7 +715,32 @@ static void event_handle_menu(Menu *menu, XEvent *e)
 {
     MenuEntry *entry;
 
+    g_message("EVENT %d", e->type);
     switch (e->type) {
+    case ButtonPress:
+        if (e->xbutton.button == 3)
+            menu_hide(menu);
+        break;
+    case ButtonRelease:
+        if (!menu->shown) break;
+
+/*        grab_pointer_window(FALSE, None, menu->frame);*/
+
+        entry = menu_find_entry(menu, e->xbutton.window);
+        if (entry) {
+            int junk;
+            Window wjunk;
+            guint ujunk, b, w, h;
+            XGetGeometry(ob_display, e->xbutton.window,
+                         &wjunk, &junk, &junk, &w, &h, &b, &ujunk);
+            if (e->xbutton.x >= (signed)-b &&
+                e->xbutton.y >= (signed)-b &&
+                e->xbutton.x < (signed)(w+b) &&
+                e->xbutton.y < (signed)(h+b)) {
+                menu_entry_fire(entry);
+            }
+        }
+        break;
     case EnterNotify:
     case LeaveNotify:
         g_message("enter/leave");
index 97a1a3db2acb631f86351fc16b59bbd64b5ced48..b2426b9da51df569b854cfb3148fb94e03044b64 100644 (file)
@@ -5,15 +5,16 @@
 #include <glib.h>
 #include <X11/Xlib.h>
 
-static guint kgrabs, pgrabs, sgrabs;
+#define GRAB_PTR_MASK (ButtonPressMask | ButtonReleaseMask | ButtonMotionMask)
 
 #define MASK_LIST_SIZE 8
 
 /*! A list of all possible combinations of keyboard lock masks */
 static unsigned int mask_list[MASK_LIST_SIZE];
 
-void grab_keyboard(gboolean grab)
+int grab_keyboard(gboolean grab)
 {
+    static guint kgrabs = 0;
     if (grab) {
         if (kgrabs++ == 0)
             XGrabKeyboard(ob_display, ob_root, 0, GrabModeAsync, GrabModeSync,
@@ -22,22 +23,41 @@ void grab_keyboard(gboolean grab)
         if (--kgrabs == 0)
             XUngrabKeyboard(ob_display, event_lasttime);
     }
+    return kgrabs;
 }
 
-void grab_pointer(gboolean grab, Cursor cur)
+int grab_pointer(gboolean grab, Cursor cur)
 {
+    static guint pgrabs = 0;
     if (grab) {
         if (pgrabs++ == 0)
-            XGrabPointer(ob_display, ob_root, False, 0, GrabModeAsync,
-                         GrabModeAsync, FALSE, cur, event_lasttime);
+            XGrabPointer(ob_display, ob_root, False, GRAB_PTR_MASK,
+                         GrabModeAsync, GrabModeAsync, FALSE, cur,
+                         event_lasttime);
     } else if (pgrabs > 0) {
         if (--pgrabs == 0)
             XUngrabPointer(ob_display, event_lasttime);
     }
+    return pgrabs;
 }
 
-void grab_server(gboolean grab)
+int grab_pointer_window(gboolean grab, Cursor cur, Window win)
 {
+    static guint pgrabs = 0;
+    if (grab) {
+        if (pgrabs++ == 0)
+            XGrabPointer(ob_display, win, False, GRAB_PTR_MASK, GrabModeAsync,
+                         GrabModeAsync, TRUE, cur, event_lasttime);
+    } else if (pgrabs > 0) {
+        if (--pgrabs == 0)
+            XUngrabPointer(ob_display, event_lasttime);
+    }
+    return pgrabs;
+}
+
+int grab_server(gboolean grab)
+{
+    static guint sgrabs = 0;
     if (grab) {
         if (sgrabs++ == 0) {
             XGrabServer(ob_display);
@@ -49,14 +69,13 @@ void grab_server(gboolean grab)
             XFlush(ob_display);
         }
     }
+    return sgrabs;
 }
 
 void grab_startup()
 {
     guint i = 0;
 
-    kgrabs = pgrabs = sgrabs = 0;
-
     mask_list[i++] = 0;
     mask_list[i++] = LockMask;
     mask_list[i++] = NumLockMask;
@@ -70,9 +89,10 @@ void grab_startup()
 
 void grab_shutdown()
 {
-    while (kgrabs) grab_keyboard(FALSE);
-    while (pgrabs) grab_pointer(FALSE, None);
-    while (sgrabs) grab_server(FALSE);
+    while (grab_keyboard(FALSE));
+    while (grab_pointer(FALSE, None));
+    while (grab_pointer_window(FALSE, None, None));
+    while (grab_server(FALSE));
 }
 
 void grab_button(guint button, guint state, Window win, guint mask,
index cf3a7fd5a35225cf28ce9eb990764879e1c682fc..2ba4ed5174390258360f8b6e2a2206d7548caf58 100644 (file)
@@ -9,6 +9,7 @@ void grab_shutdown();
 
 void grab_keyboard(gboolean grab);
 void grab_pointer(gboolean grab, Cursor cur);
+void grab_pointer_window(gboolean grab, Cursor cur, Window win);
 void grab_server(gboolean grab);
 
 void grab_button(guint button, guint state, Window win, guint mask,
index 4a37d2c60849a709dc722d81f538eac43cfe66fb..52903dcdda8776cb6c8fef32c18846c8a5d9b116 100644 (file)
@@ -1,11 +1,13 @@
 #include "menu.h"
 #include "openbox.h"
 #include "stacking.h"
+#include "grab.h"
 #include "render/theme.h"
 
 static GHashTable *menu_hash = NULL;
 GHashTable *menu_map = NULL;
 
+#define FRAME_EVENTMASK (ButtonMotionMask | EnterWindowMask | LeaveWindowMask)
 #define TITLE_EVENTMASK (ButtonPressMask | ButtonMotionMask)
 #define ENTRY_EVENTMASK (EnterWindowMask | LeaveWindowMask | \
                          ButtonPressMask | ButtonReleaseMask)
@@ -56,6 +58,7 @@ void menu_entry_free(MenuEntry *self)
 void menu_startup()
 {
     Menu *m;
+    Action *a;
 
     menu_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
                                       menu_destroy_hash_key,
@@ -63,14 +66,14 @@ void menu_startup()
     menu_map = g_hash_table_new(g_int_hash, g_int_equal);
 
     m = menu_new("sex menu", "root", NULL);
-    menu_add_entry(m, menu_entry_new("foo shit etc bleh",
-                                     action_from_string("restart")));
-    menu_add_entry(m, menu_entry_new("more shit",
-                                     action_from_string("restart")));
-    menu_add_entry(m, menu_entry_new("",
-                                     action_from_string("restart")));
-    menu_add_entry(m, menu_entry_new("and yet more",
-                                     action_from_string("restart")));
+    a = action_from_string("execute");
+    a->data.execute.path = g_strdup("xterm");
+    menu_add_entry(m, menu_entry_new("xterm", a));
+    a = action_from_string("restart");
+    menu_add_entry(m, menu_entry_new("restart", a));
+    menu_add_entry(m, menu_entry_new("--", NULL));
+    a = action_from_string("exit");
+    menu_add_entry(m, menu_entry_new("exit", a));
 }
 
 void menu_shutdown()
@@ -104,7 +107,8 @@ Menu *menu_new(char *label, char *name, Menu *parent)
     /* default controllers? */
 
     attrib.override_redirect = TRUE;
-    self->frame = createWindow(ob_root, CWOverrideRedirect, &attrib);
+    attrib.event_mask = FRAME_EVENTMASK;
+    self->frame = createWindow(ob_root, CWOverrideRedirect|CWEventMask, &attrib);
     attrib.event_mask = TITLE_EVENTMASK;
     self->title = createWindow(self->frame, CWEventMask, &attrib);
     self->items = createWindow(self->frame, 0, &attrib);
@@ -196,6 +200,8 @@ void menu_show(char *name, int x, int y, Client *client)
         return;
     }
 
+    self->client = client;
+
     self->width = 1;
     self->item_h = 0;
 
@@ -254,8 +260,19 @@ void menu_show(char *name, int x, int y, Client *client)
         item_y += self->item_h;
     }
 
-    stacking_raise_internal(self->frame);
-    XMapWindow(ob_display, self->frame);
+    if (!self->shown) {
+        stacking_raise_internal(self->frame);
+        XMapWindow(ob_display, self->frame);
+/*        grab_pointer_window(TRUE, None, self->frame);*/
+        self->shown = TRUE;
+    }
+}
+
+void menu_hide(Menu *self) {
+    if (self->shown) {
+        XUnmapWindow(ob_display, self->frame);
+        self->shown = FALSE;
+    }
 }
 
 MenuEntry *menu_find_entry(Menu *menu, Window win)
@@ -276,7 +293,7 @@ void menu_entry_render(MenuEntry *self)
     Appearance *a;
 
     a = !self->enabled ? self->a_disabled :
-        (self->hilite ? self->a_hilite : self->a_item);
+        (self->hilite && self->action ? self->a_hilite : self->a_item);
 
     RECT_SET(a->area, 0, 0, menu->width,
              menu->item_h);
@@ -292,3 +309,18 @@ void menu_entry_render(MenuEntry *self)
 
     paint(self->item, a);
 }
+
+void menu_entry_fire(MenuEntry *self)
+{
+    Menu *m;
+
+    if (self->action) {
+        self->action->data.any.c = self->parent->client;
+        self->action->func(&self->action->data);
+
+        /* hide the whole thing */
+        m = self->parent;
+        while (m->parent) m = m->parent;
+        menu_hide(m);
+    }
+}
index 2371dee011d01ad8f2ea3552a24f1e62e4b95d56..32944b79a763d4fc54613e10bffbfaf3de1ba81d 100644 (file)
@@ -30,6 +30,7 @@ typedef struct Menu {
 
 
     /* render stuff */
+    Client *client;
     Window frame;
     Window title;
     Appearance *a_title;
@@ -79,6 +80,7 @@ Menu *menu_new(char *label, char *name, Menu *parent);
 void menu_free(char *name);
 
 void menu_show(char *name, int x, int y, Client *client);
+void menu_hide(Menu *self);
 
 MenuEntry *menu_entry_new_full(char *label, Action *action,
                                MenuEntryRenderType render_type,
@@ -97,4 +99,6 @@ MenuEntry *menu_find_entry(Menu *menu, Window win);
 
 void menu_entry_render(MenuEntry *self);
 
+void menu_entry_fire(MenuEntry *self);
+
 #endif
This page took 0.034175 seconds and 4 git commands to generate.