Make Cmd/Ctrl/Shift+click/Enter open new windows
All checks were successful
Alpine 3.22 Success
Arch Linux Success
Arch Linux AUR Success
Debian Bookworm Success
Fedora 39 Success
OpenBSD 7.8 Success
openSUSE 15.5 Success

This commit is contained in:
2025-11-07 22:44:22 +01:00
parent 2234fd008d
commit a7ff9f220d

View File

@@ -1307,6 +1307,15 @@ fiv_browser_button_press_event(GtkWidget *widget, GdkEventButton *event)
return GDK_EVENT_PROPAGATE; return GDK_EVENT_PROPAGATE;
} }
static gboolean
modifier_state_opens_new_window(GtkWidget *widget, guint state)
{
GdkModifierType primary = gdk_keymap_get_modifier_mask(
gdk_keymap_get_for_display(gtk_widget_get_display(widget)),
GDK_MODIFIER_INTENT_PRIMARY_ACCELERATOR);
return state == primary || state == GDK_SHIFT_MASK;
}
static gboolean static gboolean
fiv_browser_button_release_event(GtkWidget *widget, GdkEventButton *event) fiv_browser_button_release_event(GtkWidget *widget, GdkEventButton *event)
{ {
@@ -1323,15 +1332,13 @@ fiv_browser_button_release_event(GtkWidget *widget, GdkEventButton *event)
if (!entry || entry != entry_at(self, event->x, event->y)) if (!entry || entry != entry_at(self, event->x, event->y))
return GDK_EVENT_PROPAGATE; return GDK_EVENT_PROPAGATE;
GdkModifierType primary = gdk_keymap_get_modifier_mask(
gdk_keymap_get_for_display(gtk_widget_get_display(widget)),
GDK_MODIFIER_INTENT_PRIMARY_ACCELERATOR);
guint state = event->state & gtk_accelerator_get_default_mod_mask(); guint state = event->state & gtk_accelerator_get_default_mod_mask();
if ((event->button == GDK_BUTTON_PRIMARY && state == 0)) if ((event->button == GDK_BUTTON_PRIMARY && state == 0))
return open_entry(widget, entry, FALSE); return open_entry(widget, entry, FALSE);
if ((event->button == GDK_BUTTON_PRIMARY && state == primary) || if ((event->button == GDK_BUTTON_MIDDLE && state == 0) ||
(event->button == GDK_BUTTON_MIDDLE && state == 0)) (event->button == GDK_BUTTON_PRIMARY &&
modifier_state_opens_new_window(widget, state)))
return open_entry(widget, entry, TRUE); return open_entry(widget, entry, TRUE);
return GDK_EVENT_PROPAGATE; return GDK_EVENT_PROPAGATE;
} }
@@ -1582,7 +1589,8 @@ static gboolean
fiv_browser_key_press_event(GtkWidget *widget, GdkEventKey *event) fiv_browser_key_press_event(GtkWidget *widget, GdkEventKey *event)
{ {
FivBrowser *self = FIV_BROWSER(widget); FivBrowser *self = FIV_BROWSER(widget);
switch ((event->state & gtk_accelerator_get_default_mod_mask())) { guint state = event->state & gtk_accelerator_get_default_mod_mask();
switch (state) {
case 0: case 0:
switch (event->keyval) { switch (event->keyval) {
case GDK_KEY_Delete: case GDK_KEY_Delete:
@@ -1639,6 +1647,15 @@ fiv_browser_key_press_event(GtkWidget *widget, GdkEventKey *event)
} }
} }
if (modifier_state_opens_new_window(widget, state)) {
switch (event->keyval) {
case GDK_KEY_Return:
if (self->selected)
return open_entry(widget, self->selected, TRUE);
return GDK_EVENT_STOP;
}
}
return GTK_WIDGET_CLASS(fiv_browser_parent_class) return GTK_WIDGET_CLASS(fiv_browser_parent_class)
->key_press_event(widget, event); ->key_press_event(widget, event);
} }