Example #1
0
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;
}
Example #3
0
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;
}
Example #4
0
/**
 * 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;
}
Example #5
0
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;
}
Example #6
0
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;
}
Example #7
0
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;
}
Example #8
0
/* 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;
}