X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=018218fcef61dbf08951187127add37559385b27;hb=845833226b7d65019d41eb3afce6fad7ae3d30a2;hp=b6899a8ba89f1731ce214581ead5fb0730900a43;hpb=122d55fbadea0409fbc902a1740e1c8ff3aecd88;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index b6899a8b..018218fc 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -149,28 +149,7 @@ void event_loop() struct timeval *wait; gboolean had_event = FALSE; - while (TRUE) { - /* - There are slightly different event retrieval semantics here for - local (or high bandwidth) versus remote (or low bandwidth) - connections to the display/Xserver. - */ - if (ob_remote) { - if (!XPending(ob_display)) - break; - } else { - /* - This XSync allows for far more compression of events, which - makes things like Motion events perform far far better. Since - it also means network traffic for every event instead of every - X events (where X is the number retrieved at a time), it - probably should not be used for setups where Openbox is - running on a remote/low bandwidth display/Xserver. - */ - XSync(ob_display, FALSE); - if (!XEventsQueued(ob_display, QueuedAlready)) - break; - } + while (XPending(ob_display)) { XNextEvent(ob_display, &e); #ifdef USE_LIBSN @@ -207,6 +186,9 @@ static Window event_get_window(XEvent *e) /* pick a window */ switch (e->type) { + case SelectionClear: + window = RootWindow(ob_display, ob_screen); + break; case MapRequest: window = e->xmap.window; break; @@ -470,7 +452,7 @@ static void event_process(XEvent *e) ObClient *client = NULL; ObDock *dock = NULL; ObDockApp *dockapp = NULL; - Menu *menu = NULL; + ObMenu *menu = NULL; ObWindow *obwin = NULL; window = event_get_window(e); @@ -507,7 +489,7 @@ static void event_process(XEvent *e) event_handle_dockapp(dockapp, e); else if (dock) event_handle_dock(dock, e); - else if (window == ob_root) + else if (window == RootWindow(ob_display, ob_screen)) event_handle_root(e); else if (e->type == MapRequest) client_manage(window); @@ -569,6 +551,11 @@ static void event_handle_root(XEvent *e) Atom msgtype; switch(e->type) { + case SelectionClear: + g_message("Another WM has requested to replace us. Exiting."); + ob_exit(); + break; + case ClientMessage: if (e->xclient.format != 32) break; @@ -671,7 +658,7 @@ static void event_handle_client(ObClient *client, XEvent *e) break; case EnterNotify: if (client_normal(client)) { - if (ob_state == OB_STATE_STARTING) { + if (ob_state() == OB_STATE_STARTING) { /* move it to the top of the focus order */ guint desktop = client->desktop; if (desktop == DESKTOP_ALL) desktop = screen_desktop; @@ -984,30 +971,40 @@ static void event_handle_client(ObClient *client, XEvent *e) static void event_handle_menu(ObClient *client, XEvent *e) { - static MenuEntry *over = NULL; - MenuEntry *entry; - Menu *top; - GSList *it; + static ObMenuEntry *over = NULL; + ObMenuEntry *entry; + ObMenu *top; + GList *it = NULL; - top = g_slist_nth_data(menu_visible, 0); + top = g_list_nth_data(menu_visible, 0); g_message("EVENT %d", e->type); switch (e->type) { case KeyPress: - if (over) { - if (over->parent->mouseover) - over->parent->mouseover(over, FALSE); - else - menu_control_mouseover(over, FALSE); - menu_entry_render(over); - over = NULL; - } + if (e->xkey.keycode == ob_keycode(OB_KEY_DOWN)) + over = menu_control_keyboard_nav(over, OB_KEY_DOWN); + else if (e->xkey.keycode == ob_keycode(OB_KEY_UP)) + over = menu_control_keyboard_nav(over, OB_KEY_UP); + else if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN)) + over = menu_control_keyboard_nav(over, OB_KEY_RETURN); + else if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE)) + over = menu_control_keyboard_nav(over, OB_KEY_ESCAPE); + else { + if (over) { + if (over->parent->mouseover) + over->parent->mouseover(over, FALSE); + else + menu_control_mouseover(over, FALSE); + menu_entry_render(over); + over = NULL; + } /* - if (top->hide) - top->hide(top); - else + if (top->hide) + top->hide(top); + else */ menu_hide(top); + } break; case ButtonPress: if (e->xbutton.button > 3) break; @@ -1019,8 +1016,8 @@ static void event_handle_menu(ObClient *client, XEvent *e) g_message("BUTTON RELEASED"); - for (it = menu_visible; it; it = g_slist_next(it)) { - Menu *m = it->data; + for (it = menu_visible; it; it = g_list_next(it)) { + ObMenu *m = it->data; if (e->xbutton.x_root >= m->location.x - ob_rr_theme->bwidth && e->xbutton.y_root >= m->location.y - ob_rr_theme->bwidth && e->xbutton.x_root < m->location.x + m->size.width + @@ -1066,8 +1063,8 @@ static void event_handle_menu(ObClient *client, XEvent *e) break; case MotionNotify: g_message("motion"); - for (it = menu_visible; it; it = g_slist_next(it)) { - Menu *m = it->data; + for (it = menu_visible; it; it = g_list_next(it)) { + ObMenu *m = it->data; if ((entry = menu_find_entry_by_pos(it->data, e->xmotion.x_root - m->location.x,