You likely want to ask on gtk-devel-l...@gnome.org and/or on the #gtk+ IRC channel on irc.gnome.org.
Ciao, Emmanuele. On 11 May 2017 at 13:15, Takao Fujiwara <tfuji...@redhat.com> wrote: > On 05/11/17 20:55, Takao Fujiwara-san wrote: >> >> I have a focus problem with the attached program. >> 1. When press Ctrl-Alt-v, my window is launched with the keyboard focus. >> 2. Click [x] button and close the window. >> 3. When press Ctrl-Alt-v again, my window is launched but the focus status >> is different by desktop. >> >> XFCE4 desktop can get the keyboard focus correctly. >> But MATE or Plasma desktop cannot get the keyboard focus in the second >> Ctrl-Alt-v. > > > I also observe this problem in GNOME desktop. > > >> >> How should I investigate it? >> The current workaround is to close the second window and launch the third >> window by the program but not XI shortcut key. >> >> Thanks, >> Fujiwara >> >> --------- >> // gcc -o a a.c `pkg-config --cflags --libs gtk+-3.0 x11 xi` >> #include <gtk/gtk.h> >> #include <gdk/gdkx.h> >> #include <X11/extensions/XInput2.h> >> #include <string.h> >> >> guint shortcut_keysym = 0; >> guint shortcut_modifiers = 0; >> >> static void >> loop_quit (GtkWindow *window, >> gpointer data) >> { >> GMainLoop *loop = data; >> g_return_if_fail (loop != NULL); >> gtk_widget_hide (GTK_WIDGET (window)); >> while (gtk_events_pending ()) { >> gtk_main_iteration (); >> } >> g_main_loop_quit (loop); >> } >> >> GtkWidget * >> my_window_new (GMainLoop *loop) { >> GtkWidget *window=gtk_window_new (GTK_WINDOW_TOPLEVEL); >> gtk_window_set_default_size(GTK_WINDOW(window), 200, 200); >> gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); >> g_signal_connect(window, "destroy", G_CALLBACK(loop_quit), loop); >> >> GtkWidget *entry = gtk_entry_new (); >> >> GtkWidget *grid=gtk_grid_new(); >> gtk_grid_attach(GTK_GRID(grid), entry, 0, 0, 1, 1); >> >> gtk_container_add(GTK_CONTAINER(window), grid); >> >> return window; >> } >> >> static XIGrabModifiers * >> get_grab_modifiers (guint modifiers, >> int *result_length) >> { >> XIGrabModifiers *ximodifiers = g_new0 (XIGrabModifiers, 1); >> XIGrabModifiers ximodifier = { 0, }; >> memset (&ximodifier, 0, sizeof (XIGrabModifiers)); >> ximodifier.modifiers = modifiers; >> ximodifier.status = 0; >> ximodifiers[0] = ximodifier; >> if (result_length) >> *result_length = 1; >> return ximodifiers; >> } >> >> static void >> grab_keycode (guint keysym, >> guint modifiers) >> { >> GdkDisplay *display = gdk_display_get_default (); >> Display *xdisplay = gdk_x11_display_get_xdisplay (display); >> guint keycode = 0; >> XIEventMask evmask = { 0, }; >> int length = 0; >> XIGrabModifiers *ximodifiers; >> >> keycode = XKeysymToKeycode (xdisplay, keysym); >> memset (&evmask, 0, sizeof (XIEventMask)); >> evmask.deviceid = XIAllMasterDevices; >> evmask.mask = g_new0 (guchar, (XI_LASTEVENT + 7) / 8); >> evmask.mask_len = (XI_LASTEVENT + 7) / 8; >> XISetMask (evmask.mask, XI_KeyPress); >> XISetMask (evmask.mask, XI_KeyRelease); >> ximodifiers = get_grab_modifiers (modifiers, &length); >> XIGrabKeycode (xdisplay, >> XIAllMasterDevices, >> keycode, >> DefaultRootWindow (xdisplay), >> GrabModeAsync, >> GrabModeAsync, >> TRUE, >> &evmask, >> length, >> ximodifiers); >> g_free (ximodifiers); >> } >> >> static void >> ungrab_keycode (guint keysym, >> guint modifiers) >> { >> GdkDisplay *display = gdk_display_get_default (); >> Display *xdisplay = gdk_x11_display_get_xdisplay (display); >> guint keycode = 0; >> int length = 0; >> XIGrabModifiers *ximodifiers; >> >> keycode = XKeysymToKeycode (xdisplay, keysym); >> ximodifiers = get_grab_modifiers (modifiers, &length); >> XIUngrabKeycode (xdisplay, >> XIAllMasterDevices, >> keycode, >> DefaultRootWindow (xdisplay), >> length, >> ximodifiers); >> g_free (ximodifiers); >> } >> >> static void >> run_window () >> { >> GtkWidget *window; >> GMainLoop *loop; >> >> loop = g_main_loop_new (NULL, FALSE); >> window = my_window_new (loop); >> gtk_widget_show_all(window); >> >> g_main_loop_run (loop); >> } >> >> static void >> event_handler (GdkEvent *event, >> gpointer data) >> { >> static int times = 0; >> if (((GdkEventAny*)event)->window == gdk_get_default_root_window() && >> event->type == GDK_KEY_PRESS) { >> guint keyval = ((GdkEventKey*)event)->keyval; >> guint modifiers = ((GdkEventKey*)event)->state; >> if (keyval >= GDK_KEY_A && keyval <= GDK_KEY_Z && >> (modifiers & GDK_SHIFT_MASK) != 0) { >> keyval = keyval - GDK_KEY_A + GDK_KEY_a; >> } >> if (keyval == shortcut_keysym && >> modifiers == shortcut_modifiers) { >> run_window (); >> times++; >> if (times > 1) { >> ungrab_keycode (keyval, modifiers); >> gtk_main_quit(); >> } >> } >> } >> gtk_main_do_event (event); >> } >> >> int >> main (int argc, char *argv[]) >> { >> >> GtkWidget *window; >> GMainLoop *loop; >> gtk_init (&argc, &argv); >> >> gdk_event_handler_set (event_handler, NULL, NULL); >> >> gtk_accelerator_parse ("<Control><Alt>v", >> &shortcut_keysym, >> &shortcut_modifiers); >> grab_keycode (shortcut_keysym, shortcut_modifiers); >> >> gtk_main(); >> return 0; >> } >> > > _______________________________________________ > gtk-app-devel-list mailing list > gtk-app-devel-list@gnome.org > https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list -- https://www.bassi.io [@] ebassi [@gmail.com] _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list