diff --git a/gtk/gtklistitem.c b/gtk/gtklistitem.c index 25e11a1c44..05b5fa1e8e 100644 --- a/gtk/gtklistitem.c +++ b/gtk/gtklistitem.c @@ -233,6 +233,25 @@ gtk_list_item_set_property (GObject *object, } } +static void +gtk_list_item_select_action (GtkWidget *widget, + const char *action_name, + GVariant *parameter) +{ + GtkListItem *self = GTK_LIST_ITEM (widget); + gboolean modify, extend; + + if (!self->selectable) + return; + + g_variant_get (parameter, "(bb)", &modify, &extend); + + gtk_widget_activate_action (GTK_WIDGET (self), + "list.select-item", + "(ubb)", + self->position, modify, extend); +} + static void gtk_list_item_class_init (GtkListItemClass *klass) { @@ -343,6 +362,24 @@ gtk_list_item_class_init (GtkListItemClass *klass) widget_class->activate_signal = signals[ACTIVATE_SIGNAL]; + /** + * GtkListItem|listitem.select: + * @modify: %TRUE to toggle the existing selection, %FALSE to select + * @extend: %TRUE to extend the selection + * + * Changes selection if the item is selectable. + * If the item is not selectable, nothing happens. + * + * This function will emit the list.select-item action and the resulting + * behavior, in particular the interpretation of @modify and @extend + * depends on the view containing this listitem. See for example + * GtkListView|list.select-item or GtkGridView|list.select-item. + */ + gtk_widget_class_install_action (widget_class, + "listitem.select", + "(bb)", + gtk_list_item_select_action); + gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_Return, 0, "activate-keybinding", 0); gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_ISO_Enter, 0, @@ -350,6 +387,25 @@ gtk_list_item_class_init (GtkListItemClass *klass) gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_KP_Enter, 0, "activate-keybinding", 0); + /* note that some of these may get overwritten by child widgets, + * such as GtkTreeExpander */ + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_space, 0, + "listitem.select", "(bb)", TRUE, FALSE); + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_space, GDK_CONTROL_MASK, + "listitem.select", "(bb)", TRUE, FALSE); + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_space, GDK_SHIFT_MASK, + "listitem.select", "(bb)", TRUE, FALSE); + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_space, GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "listitem.select", "(bb)", TRUE, FALSE); + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_KP_Space, 0, + "listitem.select", "(bb)", TRUE, FALSE); + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_KP_Space, GDK_CONTROL_MASK, + "listitem.select", "(bb)", TRUE, FALSE); + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_KP_Space, GDK_SHIFT_MASK, + "listitem.select", "(bb)", TRUE, FALSE); + gtk_widget_class_add_binding_action (widget_class, GDK_KEY_KP_Space, GDK_CONTROL_MASK | GDK_SHIFT_MASK, + "listitem.select", "(bb)", TRUE, FALSE); + /* This gets overwritten by gtk_list_item_new() but better safe than sorry */ gtk_widget_class_set_css_name (widget_class, I_("row")); gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT);