X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fevent.c;h=018218fcef61dbf08951187127add37559385b27;hb=845833226b7d65019d41eb3afce6fad7ae3d30a2;hp=bb76f2fdc0331d5a2a385816b152fb4a43a296f2;hpb=19df0324a6f9083e6a8b3fd70a5ce14627bd4f6d;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index bb76f2fd..018218fc 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -38,10 +38,10 @@ static void event_process(XEvent *e); static void event_handle_root(XEvent *e); -static void event_handle_dock(Dock *s, XEvent *e); -static void event_handle_dockapp(DockApp *app, XEvent *e); -static void event_handle_client(Client *c, XEvent *e); -static void event_handle_menu(Client *c, XEvent *e); +static void event_handle_dock(ObDock *s, XEvent *e); +static void event_handle_dockapp(ObDockApp *app, XEvent *e); +static void event_handle_client(ObClient *c, XEvent *e); +static void event_handle_menu(ObClient *c, XEvent *e); static void fd_event_handle(); #ifdef USE_SM static void ice_watch(IceConn conn, IcePointer data, Bool opening, @@ -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; @@ -320,7 +302,7 @@ static void event_hack_mods(XEvent *e) } } -static gboolean event_ignore(XEvent *e, Client *client) +static gboolean event_ignore(XEvent *e, ObClient *client) { switch(e->type) { case FocusIn: @@ -432,7 +414,7 @@ static gboolean event_ignore(XEvent *e, Client *client) g_message("no valid FocusIn and no FocusOut events found, " "falling back"); #endif - focus_fallback(Fallback_NoFocus); + focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); } } break; @@ -467,10 +449,10 @@ static gboolean event_ignore(XEvent *e, Client *client) static void event_process(XEvent *e) { Window window; - Client *client = NULL; - Dock *dock = NULL; - DockApp *dockapp = NULL; - Menu *menu = NULL; + ObClient *client = NULL; + ObDock *dock = NULL; + ObDockApp *dockapp = 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; @@ -595,9 +582,7 @@ static void event_handle_root(XEvent *e) #ifdef XRANDR XRRUpdateConfiguration(e); #endif - if (e->xconfigure.width != screen_physical_size.width || - e->xconfigure.height != screen_physical_size.height) - screen_resize(e->xconfigure.width, e->xconfigure.height); + screen_resize(); break; default: ; @@ -609,7 +594,7 @@ static void event_handle_root(XEvent *e) } } -static void event_handle_client(Client *client, XEvent *e) +static void event_handle_client(ObClient *client, XEvent *e) { XEvent ce; Atom msgtype; @@ -622,23 +607,23 @@ static void event_handle_client(Client *client, XEvent *e) is a waste of resources to go drawing it. */ if (!(e->xbutton.button == 4 || e->xbutton.button == 5)) { switch (frame_context(client, e->xbutton.window)) { - case Context_Maximize: + case OB_FRAME_CONTEXT_MAXIMIZE: client->frame->max_press = (e->type == ButtonPress); framerender_frame(client->frame); break; - case Context_Close: + case OB_FRAME_CONTEXT_CLOSE: client->frame->close_press = (e->type == ButtonPress); framerender_frame(client->frame); break; - case Context_Iconify: + case OB_FRAME_CONTEXT_ICONIFY: client->frame->iconify_press = (e->type == ButtonPress); framerender_frame(client->frame); break; - case Context_AllDesktops: + case OB_FRAME_CONTEXT_ALLDESKTOPS: client->frame->desk_press = (e->type == ButtonPress); framerender_frame(client->frame); break; - case Context_Shade: + case OB_FRAME_CONTEXT_SHADE: client->frame->shade_press = (e->type == ButtonPress); framerender_frame(client->frame); break; @@ -664,7 +649,7 @@ static void event_handle_client(Client *client, XEvent *e) /* are we a fullscreen window or a transient of one? (checks layer) if we are then we need to be iconified since we are losing focus */ - if (client->layer == Layer_Fullscreen && !client->iconic && + if (client->layer == OB_STACKING_LAYER_FULLSCREEN && !client->iconic && !client_search_focus_tree_full(client)) /* iconify fullscreen windows when they and their transients aren't focused */ @@ -673,7 +658,7 @@ static void event_handle_client(Client *client, XEvent *e) break; case EnterNotify: if (client_normal(client)) { - if (ob_state == 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; @@ -724,7 +709,7 @@ static void event_handle_client(Client *client, XEvent *e) if (e->xconfigurerequest.value_mask & (CWWidth | CWHeight | CWX | CWY)) { int x, y, w, h; - Corner corner; + ObCorner corner; x = (e->xconfigurerequest.value_mask & CWX) ? e->xconfigurerequest.x : client->area.x; @@ -738,17 +723,17 @@ static void event_handle_client(Client *client, XEvent *e) switch (client->gravity) { case NorthEastGravity: case EastGravity: - corner = Corner_TopRight; + corner = OB_CORNER_TOPRIGHT; break; case SouthWestGravity: case SouthGravity: - corner = Corner_BottomLeft; + corner = OB_CORNER_BOTTOMLEFT; break; case SouthEastGravity: - corner = Corner_BottomRight; + corner = OB_CORNER_BOTTOMRIGHT; break; default: /* NorthWest, Static, etc */ - corner = Corner_TopLeft; + corner = OB_CORNER_TOPLEFT; } client_configure(client, corner, x, y, w, h, FALSE, TRUE); @@ -922,7 +907,8 @@ static void event_handle_client(Client *client, XEvent *e) else h = client->area.y; client->gravity = tmpg; - client_configure(client, Corner_TopLeft, x, y, w, h, FALSE, TRUE); + client_configure(client, OB_CORNER_TOPLEFT, + x, y, w, h, FALSE, TRUE); client->gravity = oldg; } break; @@ -983,32 +969,42 @@ static void event_handle_client(Client *client, XEvent *e) } } -static void event_handle_menu(Client *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; @@ -1020,8 +1016,8 @@ static void event_handle_menu(Client *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 + @@ -1067,8 +1063,8 @@ static void event_handle_menu(Client *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, @@ -1146,7 +1142,7 @@ static void fd_event_handle() g_datalist_foreach(&fd_handler_list, fd_event_handle_foreach, NULL); } -static void event_handle_dock(Dock *s, XEvent *e) +static void event_handle_dock(ObDock *s, XEvent *e) { switch (e->type) { case ButtonPress: @@ -1161,7 +1157,7 @@ static void event_handle_dock(Dock *s, XEvent *e) } } -static void event_handle_dockapp(DockApp *app, XEvent *e) +static void event_handle_dockapp(ObDockApp *app, XEvent *e) { switch (e->type) { case MotionNotify: