diff options
author | Alexander Mikhaylenko <alexm@gnome.org> | 2022-02-25 17:58:20 +0500 |
---|---|---|
committer | Marge Bot <marge-bot@gnome.org> | 2022-02-25 15:18:54 +0000 |
commit | 4892f434cc0b465830ef183922a5846a4dd5b3a7 (patch) | |
tree | ab637aab1af8d62833fd5dbffad4088b46fd1933 /src | |
parent | b871d38b1d7ac8c1c47f2d8d9c89154a77112849 (diff) | |
download | epiphany-4892f434cc0b465830ef183922a5846a4dd5b3a7.tar.gz |
location-entry: Rework activation
Introduce ephy_link_flags_from_modifiers() - unlike
ephy_link_flags_from_current_event(), it's portable to GTK4.
Instead of connecting to the activate signal of the entry inside
EphyLocationEntry, expose this signal on EphyLocationEntry itself.
Add a modifiers parameter to it, and use ephy_link_flags_from_modifiers()
with it.
While we're still using ephy_gui_get_current_event() inside location entry,
at this point it's encapsulated and can be reimplemented in GTK4 relatively
easily.
Part-of: <https://gitlab.gnome.org/GNOME/epiphany/-/merge_requests/1081>
Diffstat (limited to 'src')
-rw-r--r-- | src/ephy-link.c | 46 | ||||
-rw-r--r-- | src/ephy-link.h | 3 | ||||
-rw-r--r-- | src/ephy-location-controller.c | 11 |
3 files changed, 36 insertions, 24 deletions
diff --git a/src/ephy-link.c b/src/ephy-link.c index cc7f69386..61dbb3735 100644 --- a/src/ephy-link.c +++ b/src/ephy-link.c @@ -95,30 +95,36 @@ ephy_link_open (EphyLink *link, } EphyLinkFlags -ephy_link_flags_from_current_event (void) +ephy_link_flags_from_modifiers (GdkModifierType modifiers, + gboolean middle_click) { - GdkEventType type = GDK_NOTHING; - guint state = 0, button = (guint) - 1, keyval = (guint) - 1; - EphyLinkFlags flags = 0; - - ephy_gui_get_current_event (&type, &state, &button, &keyval); - - if (button == GDK_BUTTON_MIDDLE && (type == GDK_BUTTON_PRESS || type == GDK_BUTTON_RELEASE)) { - if (state == GDK_SHIFT_MASK) { - flags = EPHY_LINK_NEW_WINDOW; - } else if (state == 0 || state == GDK_CONTROL_MASK) { - flags = EPHY_LINK_NEW_TAB | EPHY_LINK_NEW_TAB_APPEND_AFTER; + if (middle_click) { + if (modifiers == GDK_SHIFT_MASK) { + return EPHY_LINK_NEW_WINDOW; + } else if (modifiers == 0 || modifiers == GDK_CONTROL_MASK) { + return EPHY_LINK_NEW_TAB | EPHY_LINK_NEW_TAB_APPEND_AFTER; } } else { - gboolean navigation_keys = (keyval == GDK_KEY_Left) || (keyval == GDK_KEY_Right); - - if (((state == (GDK_MOD1_MASK | GDK_SHIFT_MASK)) && !navigation_keys) || - (state == (GDK_CONTROL_MASK | GDK_SHIFT_MASK))) { - flags = EPHY_LINK_NEW_WINDOW; - } else if (((state == GDK_MOD1_MASK) && !navigation_keys) || (state == GDK_CONTROL_MASK)) { - flags = EPHY_LINK_NEW_TAB | EPHY_LINK_NEW_TAB_APPEND_AFTER | EPHY_LINK_JUMP_TO; + if ((modifiers == (GDK_MOD1_MASK | GDK_SHIFT_MASK)) || + (modifiers == (GDK_CONTROL_MASK | GDK_SHIFT_MASK))) { + return EPHY_LINK_NEW_WINDOW; + } else if ((modifiers == GDK_MOD1_MASK) || (modifiers == GDK_CONTROL_MASK)) { + return EPHY_LINK_NEW_TAB | EPHY_LINK_NEW_TAB_APPEND_AFTER | EPHY_LINK_JUMP_TO; } } - return flags; + return 0; +} + +EphyLinkFlags +ephy_link_flags_from_current_event (void) +{ + GdkEventType type = GDK_NOTHING; + guint state = 0, button = (guint) - 1; + + ephy_gui_get_current_event (&type, &state, &button, NULL); + + return ephy_link_flags_from_modifiers (state, button == GDK_BUTTON_MIDDLE && + (type == GDK_BUTTON_PRESS || + type == GDK_BUTTON_RELEASE)); } diff --git a/src/ephy-link.h b/src/ephy-link.h index 762e7ff2a..ab3667538 100644 --- a/src/ephy-link.h +++ b/src/ephy-link.h @@ -58,6 +58,9 @@ EphyEmbed *ephy_link_open (EphyLink *link, EphyEmbed *embed, EphyLinkFlags flags); +EphyLinkFlags ephy_link_flags_from_modifiers (GdkModifierType modifiers, + gboolean middle_click); + EphyLinkFlags ephy_link_flags_from_current_event (void); G_END_DECLS diff --git a/src/ephy-location-controller.c b/src/ephy-location-controller.c index e9bfc27ff..7d39a16b4 100644 --- a/src/ephy-location-controller.c +++ b/src/ephy-location-controller.c @@ -79,19 +79,22 @@ G_DEFINE_TYPE_WITH_CODE (EphyLocationController, ephy_location_controller, G_TYP NULL)) static void -entry_activate_cb (GtkEntry *entry, +entry_activate_cb (EphyLocationEntry *entry, + GdkModifierType modifiers, EphyLocationController *controller) { const char *content; char *address; char *effective_address; + GtkEntry *inner_entry; if (controller->sync_address_is_blocked) { controller->sync_address_is_blocked = FALSE; g_signal_handlers_unblock_by_func (controller, G_CALLBACK (sync_address), entry); } - content = gtk_entry_get_text (entry); + inner_entry = ephy_location_entry_get_entry (entry); + content = gtk_entry_get_text (inner_entry); if (content == NULL || content[0] == '\0') return; @@ -151,7 +154,7 @@ entry_activate_cb (GtkEntry *entry, #endif ephy_link_open (EPHY_LINK (controller), effective_address, NULL, - ephy_link_flags_from_current_event () | EPHY_LINK_TYPED); + ephy_link_flags_from_modifiers (modifiers, FALSE) | EPHY_LINK_TYPED); g_free (effective_address); } @@ -321,7 +324,7 @@ ephy_location_controller_constructed (GObject *object) entry, "editable", G_BINDING_SYNC_CREATE); - g_signal_connect_object (entry, "activate", + g_signal_connect_object (widget, "activate", G_CALLBACK (entry_activate_cb), controller, 0); g_signal_connect_object (widget, "get-location", |