X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=52747d3fb8adffd0461c611255f4bf0ca2afa552;hb=069e9607fa433190307bb8242294a109e88165de;hp=a4e512808145ed0fac675537ae2c40ecb31c0db8;hpb=3669da9cdd6e17cf588976d42896f83d216f36f9;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index a4e51280..52747d3f 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -28,6 +28,13 @@ #ifdef HAVE_SYS_SELECT_H # include #endif +#ifdef HAVE_SIGNAL_H +# include +#endif + +#ifdef USE_SM +#include +#endif static void event_process(XEvent *e); static void event_handle_root(XEvent *e); @@ -35,8 +42,15 @@ 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(Menu *menu, Client *c, XEvent *e); +static void fd_event_handle(); +#ifdef USE_SM +static void ice_watch(IceConn conn, IcePointer data, Bool opening, + IcePointer *watch_data); +#endif +static void find_max_fd(); #define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \ + (e)->xfocus.detail == NotifyAncestor || \ (e)->xfocus.detail > NotifyNonlinearVirtual) #define INVALID_FOCUSOUT(e) ((e)->xfocus.mode == NotifyGrab || \ (e)->xfocus.detail == NotifyInferior || \ @@ -59,10 +73,30 @@ static const int mask_table[] = { static int mask_table_size; static fd_set selset, allset; +#ifdef USE_SM +static IceConn ice_conn; +static int ice_fd; +#endif static int max_fd, x_fd; static GData *fd_handler_list; -void fd_event_handle(); + +#ifdef USE_SM +static void ice_watch(IceConn conn, IcePointer data, Bool opening, + IcePointer *watch_data) +{ + if (opening) { + g_assert (ice_fd < 0); + ice_conn = conn; + ice_fd = IceConnectionNumber(conn); + FD_SET(ice_fd, &allset); + } else { + FD_CLR(ice_fd, &allset); + ice_fd = -1; + } + find_max_fd(); +} +#endif void event_startup() { @@ -94,6 +128,12 @@ void event_startup() FD_ZERO(&allset); max_fd = x_fd = ConnectionNumber(ob_display); FD_SET(x_fd, &allset); + +#ifdef USE_SM + ice_fd = -1; + IceAddConnectionWatch(ice_watch, NULL); +#endif + g_datalist_init(&fd_handler_list); } @@ -150,6 +190,13 @@ void event_loop() if (FD_ISSET(x_fd, &selset)) return; +#ifdef USE_SM + if (ice_fd >= 0 && FD_ISSET(ice_fd, &selset)) { + Bool b; + IceProcessMessages(ice_conn, NULL, &b); + } +#endif + fd_event_handle(); } } @@ -340,14 +387,33 @@ static gboolean event_ignore(XEvent *e, Client *client) g_message("found pending FocusIn"); #endif /* is the focused window getting a FocusOut/In back to - itself? */ + itself? + */ if (fe.xfocus.window == e->xfocus.window && !event_ignore(&fe, client)) { + /* + if focus_client is not set, then we can't do + this. we need the FocusIn. This happens in the + case when the set_focus_client(NULL) in the + focus_fallback function fires and then + focus_fallback picks the currently focused + window (such as on a SendToDesktop-esque action. + */ + if (focus_client) { +#ifdef DEBUG_FOCUS + g_message("focused window got an Out/In back to " + "itself IGNORED both"); +#endif + return TRUE; + } else { + event_process(&fe); #ifdef DEBUG_FOCUS - g_message("focused window got an Out/In back to " - "itself IGNORED both"); + g_message("focused window got an Out/In back to " + "itself but focus_client was null " + "IGNORED just the Out"); #endif - return TRUE; + return TRUE; + } } /* once all the FocusOut's have been dealt with, if there @@ -580,8 +646,10 @@ static void event_handle_client(Client *client, XEvent *e) #ifdef DEBUG_FOCUS g_message("FocusIn on client for %lx", client->window); #endif - focus_set_client(client); - frame_adjust_focus(client->frame, TRUE); + if (client != focus_client) { + focus_set_client(client); + frame_adjust_focus(client->frame, TRUE); + } break; case FocusOut: #ifdef DEBUG_FOCUS @@ -677,7 +745,7 @@ static void event_handle_client(Client *client, XEvent *e) corner = Corner_TopLeft; } - client_configure(client, corner, x, y, w, h, FALSE, FALSE); + client_configure(client, corner, x, y, w, h, FALSE, TRUE); } if (e->xconfigurerequest.value_mask & CWStackMode) { @@ -848,7 +916,7 @@ 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, TRUE, TRUE); + client_configure(client, Corner_TopLeft, x, y, w, h, FALSE, TRUE); client->gravity = oldg; } break; @@ -931,18 +999,20 @@ static void event_handle_menu(Menu *menu, Client *client, XEvent *e) /* 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); + if (e->xbutton.button == 1) { + 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); + } } } @@ -969,21 +1039,29 @@ void event_add_fd_handler(event_fd_handler *h) { max_fd = MAX(max_fd, h->fd); } -void find_max_fd_foreach(GQuark n, gpointer data, gpointer max) +static void find_max_fd_foreach(GQuark n, gpointer data, gpointer max) { *((unsigned int *)max) = MAX(*((unsigned int *)max), n); } +static void find_max_fd() +{ + int tmpmax = -1; + g_datalist_foreach(&fd_handler_list, find_max_fd_foreach, (gpointer)&tmpmax); + max_fd = MAX(x_fd, tmpmax); +#ifdef USE_SM + max_fd = MAX(ice_fd, tmpmax); +#endif +} + void event_remove_fd(int n) { - int tmpmax = 0; FD_CLR(n, &allset); g_datalist_id_remove_data(&fd_handler_list, (GQuark)n); - g_datalist_foreach(&fd_handler_list, find_max_fd_foreach, (gpointer)&tmpmax); - max_fd = MAX(x_fd, tmpmax); + find_max_fd(); } -void fd_event_handle_foreach(GQuark n, gpointer data, gpointer user_data) +static void fd_event_handle_foreach(GQuark n, gpointer data, gpointer user_data) { if (FD_ISSET( (int)n, &selset)) { event_fd_handler *h = (event_fd_handler *)data; @@ -992,7 +1070,7 @@ void fd_event_handle_foreach(GQuark n, gpointer data, gpointer user_data) } } -void fd_event_handle() +static void fd_event_handle() { g_datalist_foreach(&fd_handler_list, fd_event_handle_foreach, NULL); }