menus works on some level. add a built-in root menu
Dana Jansens danakj@orodu.net
5 files changed,
115 insertions(+),
29 deletions(-)
M
openbox/event.c
→
openbox/event.c
@@ -79,6 +79,7 @@ fd_set selset;
XEvent e; int x_fd; struct timeval *wait; + gboolean had_event = FALSE; while (TRUE) { /*@@ -105,13 +106,16 @@ }
XNextEvent(ob_display, &e); event_process(&e); + had_event = TRUE; } - - 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); + + 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); + } } 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");
M
openbox/grab.c
→
openbox/grab.c
@@ -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 @@ } else if (kgrabs > 0) {
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,13 +69,12 @@ XUngrabServer(ob_display);
XFlush(ob_display); } } + return sgrabs; } void grab_startup() { guint i = 0; - - kgrabs = pgrabs = sgrabs = 0; mask_list[i++] = 0; mask_list[i++] = LockMask;@@ -70,9 +89,10 @@ }
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,
M
openbox/grab.h
→
openbox/grab.h
@@ -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,