gboolean menu_popup (Menu * menu, int root_x, int root_y, int button, guint32 timestamp) { GdkPoint *pt; TRACE ("entering menu_popup"); g_return_val_if_fail (menu != NULL, FALSE); g_return_val_if_fail (GTK_IS_MENU (menu->menu), FALSE); pt = g_new (GdkPoint, 1); pt->x = root_x; pt->y = root_y; if (!menu_check_and_close ()) { if (!grab_available (gdk_screen_get_root_window (menu->screen), timestamp)) { g_free (pt); TRACE ("Cannot get grab on pointer/keyboard, cancel."); return FALSE; } TRACE ("opening new menu"); menu_open = menu->menu; eventFilterPush (menu->filter_setup, menu_filter, NULL); gtk_menu_popup (GTK_MENU (menu->menu), NULL, NULL, popup_position_func, pt, 0, timestamp); if (!GTK_MENU_SHELL (GTK_MENU (menu->menu))->have_xgrab) { gdk_beep (); g_message (_("%s: GtkMenu failed to grab the pointer\n"), g_get_prgname ()); gtk_menu_popdown (GTK_MENU (menu->menu)); menu_open = NULL; eventFilterPop (menu->filter_setup); return FALSE; } } return TRUE; }
void clientCycle (Client * c, XfwmEventKey *event) { ScreenInfo *screen_info; DisplayInfo *display_info; ClientCycleData passdata; GList *client_list, *selected; int key, modifier; g_return_if_fail (c != NULL); TRACE ("client \"%s\" (0x%lx)", c->name, c->window); screen_info = c->screen_info; display_info = screen_info->display_info; client_list = clientCycleCreateList (c); if (!client_list) { return; } modifier = 0; key = myScreenGetKeyPressed (screen_info, event); if (key == KEY_CYCLE_REVERSE_WINDOWS) { selected = g_list_last (client_list); modifier = screen_info->params->keys[KEY_CYCLE_REVERSE_WINDOWS].modifier; } else { selected = g_list_next (client_list); modifier = screen_info->params->keys[KEY_CYCLE_WINDOWS].modifier; } if (!selected) { /* Only one element in list */ selected = client_list; } if (!modifier) { /* * The shortcut has no modifier so there's no point in entering * the cycle loop, just select the next or previous window and * that's it... */ clientCycleActivate ((Client *) selected->data); g_list_free (client_list); return; } myScreenGrabPointer (screen_info, TRUE, EnterWindowMask | LeaveWindowMask, None, event->time); /* Grabbing the pointer may fail e.g. if the user is doing a drag'n drop */ if (!myScreenGrabKeyboard (screen_info, KeyPressMask | KeyReleaseMask, event->time)) { TRACE ("grab failed in clientCycle"); myDisplayBeep (display_info); myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info)); myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info)); g_list_free (client_list); return; } passdata.wireframe = NULL; passdata.inside = FALSE; TRACE ("entering cycle loop"); if (screen_info->params->cycle_raise) { clientRaise ((Client *) selected->data, None); } if (screen_info->params->cycle_draw_frame) { passdata.wireframe = wireframeCreate ((Client *) selected->data); } passdata.tabwin = tabwinCreate (&client_list, selected, screen_info->params->cycle_workspaces); eventFilterPush (display_info->xfilter, clientCycleEventFilter, &passdata); gtk_main (); eventFilterPop (display_info->xfilter); TRACE ("leaving cycle loop"); if (passdata.wireframe) { wireframeDelete (passdata.wireframe); } updateXserverTime (display_info); c = tabwinGetSelected (passdata.tabwin); if (c) { clientCycleActivate (c); } tabwinDestroy (passdata.tabwin); g_free (passdata.tabwin); g_list_free (client_list); if (passdata.inside) { /* A bit of a hack, flush EnterNotify if the pointer is inside * the tabwin to defeat focus-follow-mouse tracking */ eventFilterPush (display_info->xfilter, clientCycleFlushEventFilter, display_info); gtk_main (); eventFilterPop (display_info->xfilter); } myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info)); myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info)); }
void clientCycle (Client * c, XKeyEvent * ev) { ScreenInfo *screen_info; DisplayInfo *display_info; ClientCycleData passdata; GList *client_list, *selected; gboolean g1, g2; int key, modifier; Client *c2; g_return_if_fail (c != NULL); TRACE ("entering clientCycle"); screen_info = c->screen_info; display_info = screen_info->display_info; client_list = clientCycleCreateList (c); if (!client_list) { return; } modifier = 0; key = myScreenGetKeyPressed (screen_info, ev); if (key == KEY_CYCLE_REVERSE_WINDOWS) { selected = g_list_last (client_list); modifier = screen_info->params->keys[KEY_CYCLE_REVERSE_WINDOWS].modifier; } else { selected = g_list_next (client_list); modifier = screen_info->params->keys[KEY_CYCLE_WINDOWS].modifier; } if (!selected) { /* Only one element in list */ selected = client_list; } if (!modifier) { /* * The shortcut has no modifier so there's no point in entering * the cycle loop, just select the next or previous window and * that's it... */ clientCycleActivate ((Client *) selected->data); g_list_free (client_list); return; } g1 = myScreenGrabKeyboard (screen_info, ev->time); g2 = myScreenGrabPointer (screen_info, TRUE, LeaveWindowMask, None, ev->time); if (!g1 || !g2) { TRACE ("grab failed in clientCycle"); gdk_beep (); myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info)); myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info)); g_list_free (client_list); return; } passdata.wireframe = None; TRACE ("entering cycle loop"); if (screen_info->params->cycle_draw_frame) { passdata.wireframe = wireframeCreate ((Client *) selected->data); } passdata.tabwin = tabwinCreate (&client_list, selected, screen_info->params->cycle_workspaces); eventFilterPush (display_info->xfilter, clientCycleEventFilter, &passdata); c2 = myScreenGetClientFromWindow (screen_info, GDK_WINDOW_XID (gtk_widget_get_window ( passdata.tabwin->tabwin_list->data)), SEARCH_FRAME); g_message ("%p", c2); clientSetFocus (screen_info, c2, ev->time, NO_FOCUS_FLAG); gtk_main (); eventFilterPop (display_info->xfilter); TRACE ("leaving cycle loop"); if (passdata.wireframe) { wireframeDelete (screen_info, passdata.wireframe); } updateXserverTime (display_info); c = tabwinGetSelected (passdata.tabwin); if (c) { clientCycleActivate (c); } tabwinDestroy (passdata.tabwin); g_free (passdata.tabwin); g_list_free (client_list); myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info)); myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info)); }