gboolean on_entry_key_press_event(GtkEntry *entry, GdkEvent *event) { guint k = GDK_KEY_VoidSymbol; gdk_event_get_keyval(event, &k); GdkModifierType s; gdk_event_get_state(event, &s); #define KEY(S) (k == S) #define CTRL(S) (KEY(S) && s & GDK_CONTROL_MASK) #define SHIFT(S) (KEY(S) && s & GDK_SHIFT_MASK) if (KEY(GDK_KEY_Escape) || CTRL(GDK_KEY_c)) gtk_main_quit(); else if (KEY(GDK_KEY_Tab) || CTRL(GDK_KEY_i)) gtk_entry_set_text(entry, row_text(selected_row())); else if (KEY(GDK_KEY_Down) || CTRL(GDK_KEY_f)) select_row(selected_row() + 1); else if (KEY(GDK_KEY_Up) || CTRL(GDK_KEY_b)) select_row(selected_row() - 1); else if (KEY(GDK_KEY_Return) || CTRL(GDK_KEY_j)) output(row_text(selected_row())); else if (SHIFT(GDK_KEY_Return) || CTRL(GDK_KEY_J)) output(entry_text()); return FALSE; }
static gboolean key_event (GtkWidget *listbox, GdkEvent *event, GsShellCategory *shell) { GsShellCategoryPrivate *priv = shell->priv; guint keyval; gboolean handled; if (!gdk_event_get_keyval (event, &keyval)) return FALSE; if (keyval == GDK_KEY_Page_Up || keyval == GDK_KEY_KP_Page_Up) g_signal_emit_by_name (priv->scrolledwindow_category, "scroll-child", GTK_SCROLL_PAGE_UP, FALSE, &handled); else if (keyval == GDK_KEY_Page_Down || keyval == GDK_KEY_KP_Page_Down) g_signal_emit_by_name (priv->scrolledwindow_category, "scroll-child", GTK_SCROLL_PAGE_DOWN, FALSE, &handled); else if (keyval == GDK_KEY_Tab || keyval == GDK_KEY_KP_Tab) gtk_widget_child_focus (priv->category_detail_grid, GTK_DIR_TAB_FORWARD); else return FALSE; return TRUE; }
guint ada_gdk_event_get_keyval (GdkEvent * event) { guint keyval; if (!gdk_event_get_keyval(event, &keyval)) { return ada_gdk_invalid_gint_value; } return keyval; }
/** * gtk_search_bar_handle_event: * @bar: a #GtkSearchBar * @event: a #GdkEvent containing key press events * * This function should be called when the top-level * window which contains the search bar received a key event. * * If the key event is handled by the search bar, the bar will * be shown, the entry populated with the entered text and %GDK_EVENT_STOP * will be returned. The caller should ensure that events are * not propagated further. * * If no entry has been connected to the search bar, using * gtk_search_bar_connect_entry(), this function will return * immediately with a warning. * * ## Showing the search bar on key presses * * |[<!-- language="C" --> * static gboolean * on_key_press_event (GtkWidget *widget, * GdkEvent *event, * gpointer user_data) * { * GtkSearchBar *bar = GTK_SEARCH_BAR (user_data); * return gtk_search_bar_handle_event (bar, event); * } * * g_signal_connect (window, * "key-press-event", * G_CALLBACK (on_key_press_event), * search_bar); * ]| * * Returns: %GDK_EVENT_STOP if the key press event resulted * in text being entered in the search entry (and revealing * the search bar if necessary), %GDK_EVENT_PROPAGATE otherwise. * * Since: 3.10 */ gboolean gtk_search_bar_handle_event (GtkSearchBar *bar, GdkEvent *event) { GtkSearchBarPrivate *priv = gtk_search_bar_get_instance_private (bar); guint keyval; gboolean handled; gboolean preedit_changed; guint preedit_change_id; gboolean res; char *old_text, *new_text; if (priv->entry == NULL) { g_warning ("The search bar does not have an entry connected to it. Call gtk_search_bar_connect_entry() to connect one."); return GDK_EVENT_PROPAGATE; } /* Exit early if the search bar is already shown, * the event doesn't contain a key press, * or the event is a navigation or space bar key press */ if (priv->reveal_child || !gdk_event_get_keyval (event, &keyval) || is_keynav_event (event, keyval) || keyval == GDK_KEY_space || keyval == GDK_KEY_Menu) return GDK_EVENT_PROPAGATE; if (!gtk_widget_get_realized (priv->entry)) gtk_widget_realize (priv->entry); handled = GDK_EVENT_PROPAGATE; preedit_changed = FALSE; preedit_change_id = g_signal_connect (priv->entry, "preedit-changed", G_CALLBACK (preedit_changed_cb), &preedit_changed); old_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->entry))); res = gtk_widget_event (priv->entry, event); new_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (priv->entry))); g_signal_handler_disconnect (priv->entry, preedit_change_id); if ((res && g_strcmp0 (new_text, old_text) != 0) || preedit_changed) { handled = GDK_EVENT_STOP; gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), TRUE); } g_free (old_text); g_free (new_text); return handled; }
static gboolean entry_keypress_handler (GtkWidget *widget, GdkEvent *event, GsShell *shell) { GsShellPrivate *priv = gs_shell_get_instance_private (shell); guint keyval; GtkWidget *entry; if (!gdk_event_get_keyval (event, &keyval) || keyval != GDK_KEY_Escape) return GDK_EVENT_PROPAGATE; entry = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search")); gtk_entry_set_text (GTK_ENTRY (entry), ""); return GDK_EVENT_STOP; }
static gboolean entry_key_pressed_event_cb (GtkWidget *widget, GdkEvent *event, GtkSearchBar *bar) { GtkSearchBarPrivate *priv = gtk_search_bar_get_instance_private (bar); guint keyval; if (!gdk_event_get_keyval (event, &keyval) || keyval != GDK_KEY_Escape) return GDK_EVENT_PROPAGATE; gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), FALSE); return GDK_EVENT_STOP; }
static gboolean window_keypress_handler (GtkWidget *window, GdkEvent *event, GsShell *shell) { GsShellPrivate *priv = gs_shell_get_instance_private (shell); GtkWidget *entry; guint keyval; gboolean handled; gboolean preedit_changed; guint preedit_change_id; gboolean res; g_autofree gchar *old_text = NULL; g_autofree gchar *new_text = NULL; if (gs_shell_get_mode (shell) != GS_SHELL_MODE_OVERVIEW && gs_shell_get_mode (shell) != GS_SHELL_MODE_SEARCH) return GDK_EVENT_PROPAGATE; if (!gdk_event_get_keyval (event, &keyval) || is_keynav_event (event, keyval) || keyval == GDK_KEY_space || keyval == GDK_KEY_Menu) return GDK_EVENT_PROPAGATE; entry = GTK_WIDGET (gtk_builder_get_object (priv->builder, "entry_search")); handled = GDK_EVENT_PROPAGATE; preedit_changed = FALSE; preedit_change_id = g_signal_connect (entry, "preedit-changed", G_CALLBACK (preedit_changed_cb), &preedit_changed); old_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); res = gtk_widget_event (entry, event); new_text = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); g_signal_handler_disconnect (entry, preedit_change_id); if ((res && g_strcmp0 (new_text, old_text) != 0) || preedit_changed) { gtk_entry_grab_focus_without_selecting (GTK_ENTRY (entry)); handled = GDK_EVENT_STOP; } return handled; }
/* Links can also be activated by clicking. */ static gboolean textview_event_after (GtkTextView *textview, GdkEvent *event) { GtkTextIter start, end, iter; GtkTextBuffer *buffer; gint x, y; GdkModifierType mt = 0; guint event_button = 0; gdouble event_x_win = 0; gdouble event_y_win = 0; g_return_val_if_fail (GTK_IS_TEXT_VIEW (textview), FALSE); if (event->type == GDK_KEY_PRESS || event->type == GDK_KEY_RELEASE) { guint event_keyval = 0; gdk_event_get_keyval (event, &event_keyval); switch (event_keyval) { case GDK_KEY_Control_L: case GDK_KEY_Control_R: update_ctrl_state ( textview, event->type == GDK_KEY_PRESS); break; } return FALSE; } if (!gdk_event_get_state (event, &mt)) { GdkWindow *window; GdkDisplay *display; GdkDeviceManager *device_manager; GdkDevice *device; window = gtk_widget_get_parent_window (GTK_WIDGET (textview)); display = gdk_window_get_display (window); device_manager = gdk_display_get_device_manager (display); device = gdk_device_manager_get_client_pointer (device_manager); gdk_window_get_device_position (window, device, NULL, NULL, &mt); } update_ctrl_state (textview, (mt & GDK_CONTROL_MASK) != 0); if (event->type != GDK_BUTTON_RELEASE) return FALSE; gdk_event_get_button (event, &event_button); gdk_event_get_coords (event, &event_x_win, &event_y_win); if (event_button != 1 || (mt & GDK_CONTROL_MASK) == 0) return FALSE; buffer = gtk_text_view_get_buffer (textview); /* we shouldn't follow a link if the user has selected something */ gtk_text_buffer_get_selection_bounds (buffer, &start, &end); if (gtk_text_iter_get_offset (&start) != gtk_text_iter_get_offset (&end)) return FALSE; gtk_text_view_window_to_buffer_coords ( textview, GTK_TEXT_WINDOW_WIDGET, event_x_win, event_y_win, &x, &y); gtk_text_view_get_iter_at_location (textview, &iter, x, y); invoke_link_if_present (buffer, &iter); update_mouse_cursor (textview, x, y); return FALSE; }