void _exo_gtk_widget_send_focus_change (GtkWidget *widget, gboolean in) { GdkEvent *fevent; #if !GTK_CHECK_VERSION(2, 22, 0) g_object_ref (G_OBJECT (widget)); #endif gtk_widget_set_can_focus (widget, in); fevent = gdk_event_new (GDK_FOCUS_CHANGE); fevent->focus_change.type = GDK_FOCUS_CHANGE; fevent->focus_change.window = g_object_ref (gtk_widget_get_window (widget)); fevent->focus_change.in = in; #if GTK_CHECK_VERSION(2, 22, 0) gtk_widget_send_focus_change (widget, fevent); #else if (in) GTK_OBJECT_FLAGS (widget) |= GTK_HAS_FOCUS; else GTK_OBJECT_FLAGS (widget) &= ~(GTK_HAS_FOCUS); gtk_widget_event (widget, fevent); g_object_notify (G_OBJECT (widget), "has-focus"); g_object_unref (G_OBJECT (widget)); #endif gdk_event_free (fevent); }
/* Cut and paste from gtkwindow.c */ static void send_focus_change (GtkWidget *widget, gboolean in) { GdkEvent *fevent = gdk_event_new (GDK_FOCUS_CHANGE); #if !GTK_CHECK_VERSION (2,21,0) g_object_ref (widget); if (in) GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS); else GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS); #endif fevent->focus_change.type = GDK_FOCUS_CHANGE; fevent->focus_change.window = g_object_ref (gtk_widget_get_window (widget)); fevent->focus_change.in = in; #if !GTK_CHECK_VERSION (2,21,0) gtk_widget_event (widget, fevent); g_object_notify (G_OBJECT (widget), "has-focus"); g_object_unref (widget); #else gtk_widget_send_focus_change (widget, fevent); #endif gdk_event_free (fevent); }
/* Cut and paste from gtkwindow.c */ static void do_focus_change (GtkWidget *widget, gboolean in) { GdkEventFocus fevent; fevent.type = GDK_FOCUS_CHANGE; fevent.window = gtk_widget_get_window (widget); fevent.in = in; gtk_widget_send_focus_change (widget, (GdkEvent*)&fevent); }
static void show_search () { GtkWidget *w, *f, *a, *e; GdkEvent *fev; w = gtk_window_new (GTK_WINDOW_POPUP); gtk_window_set_transient_for (GTK_WINDOW (w), GTK_WINDOW (gtk_widget_get_toplevel (text_view))); gtk_window_set_position (GTK_WINDOW (w), GTK_WIN_POS_CENTER_ON_PARENT); /* next two lines needs for get focus to search window */ gtk_window_set_type_hint (GTK_WINDOW (w), GDK_WINDOW_TYPE_HINT_UTILITY); gtk_window_set_modal (GTK_WINDOW (w), TRUE); g_signal_connect (G_OBJECT (w), "key-press-event", G_CALLBACK (search_key_cb), w); f = gtk_frame_new (NULL); gtk_frame_set_shadow_type (GTK_FRAME (f), GTK_SHADOW_ETCHED_IN); gtk_container_add (GTK_CONTAINER (w), f); a = gtk_alignment_new (0.5, 0.5, 1.0, 1.0); gtk_alignment_set_padding (GTK_ALIGNMENT (a), 2, 2, 2, 2); gtk_container_add (GTK_CONTAINER (f), a); e = gtk_entry_new (); if (pattern) gtk_entry_set_text (GTK_ENTRY (e), pattern); gtk_container_add (GTK_CONTAINER (a), e); g_signal_connect (G_OBJECT (e), "activate", G_CALLBACK (do_search), w); g_signal_connect (G_OBJECT (e), "changed", G_CALLBACK (search_changed), NULL); g_signal_connect (G_OBJECT (e), "key-press-event", G_CALLBACK (search_key_cb), w); gtk_widget_show_all (w); /* send focus event to search entry (so complex due to popup window) */ fev = gdk_event_new (GDK_FOCUS_CHANGE); fev->focus_change.type = GDK_FOCUS_CHANGE; fev->focus_change.in = TRUE; fev->focus_change.window = gtk_widget_get_window (e); if (fev->focus_change.window != NULL) g_object_ref (fev->focus_change.window); #if GTK_CHECK_VERSION(2,22,0) gtk_widget_send_focus_change (e, fev); #else g_object_ref (e); GTK_OBJECT_FLAGS (e) |= GTK_HAS_FOCUS; gtk_widget_event (e, fev); g_object_notify (G_OBJECT (e), "has-focus"); g_object_unref (e); #endif gdk_event_free (fev); }
/* taken from gtk/gtktreeview.c */ static void send_focus_change (GtkWidget *widget, GdkDevice *device, gboolean in) { GdkDeviceManager *device_manager; GList *devices, *d; device_manager = gdk_display_get_device_manager (gtk_widget_get_display (widget)); devices = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER); devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_SLAVE)); devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_FLOATING)); for (d = devices; d; d = d->next) { GdkDevice *dev = d->data; GdkEvent *fevent; GdkWindow *window; if (gdk_device_get_source (dev) != GDK_SOURCE_KEYBOARD) continue; window = gtk_widget_get_window (widget); /* Skip non-master keyboards that haven't * selected for events from this window */ if (gdk_device_get_device_type (dev) != GDK_DEVICE_TYPE_MASTER && !gdk_window_get_device_events (window, dev)) continue; fevent = gdk_event_new (GDK_FOCUS_CHANGE); fevent->focus_change.type = GDK_FOCUS_CHANGE; fevent->focus_change.window = g_object_ref (window); fevent->focus_change.in = in; gdk_event_set_device (fevent, device); gtk_widget_send_focus_change (widget, fevent); gdk_event_free (fevent); } g_list_free (devices); }