diff options
-rw-r--r-- | ChangeLog | 29 | ||||
-rw-r--r-- | lib/ephy-gui.c | 36 | ||||
-rw-r--r-- | lib/ephy-gui.h | 4 | ||||
-rw-r--r-- | lib/widgets/ephy-location-entry.c | 6 | ||||
-rw-r--r-- | src/ephy-go-action.c | 2 | ||||
-rw-r--r-- | src/ephy-go-action.h | 6 | ||||
-rw-r--r-- | src/ephy-home-action.c | 2 | ||||
-rw-r--r-- | src/ephy-link.c | 36 | ||||
-rw-r--r-- | src/ephy-link.h | 2 | ||||
-rw-r--r-- | src/ephy-location-action.c | 17 | ||||
-rw-r--r-- | src/ephy-session.c | 2 | ||||
-rw-r--r-- | src/ephy-tab.c | 48 | ||||
-rw-r--r-- | src/window-commands.c | 5 |
13 files changed, 147 insertions, 48 deletions
@@ -1,5 +1,34 @@ 2006-01-29 Christian Persch <chpe@cvs.gnome.org> + * lib/ephy-gui.c: (ephy_gui_get_current_event): + * lib/ephy-gui.h: + + Add a convenience function to get current event data. + + * src/ephy-link.c: (ephy_link_open), + (ephy_link_flags_from_current_event): + * src/ephy-link.h: + + Add a convenience function to translate the current event + into EphyLinkFlags. + + * src/ephy-go-action.c: (ephy_go_action_get_type): + * src/ephy-go-action.h: + + Make this an EphyLinkAction. + + * lib/widgets/ephy-location-entry.c: (entry_key_press_cb): + * src/ephy-home-action.c: (ephy_home_action_activate): + * src/ephy-location-action.c: (entry_activate_cb): + * src/ephy-tab.c: (open_link_in_new), + (ephy_tab_dom_mouse_click_cb): + * src/window-commands.c: (window_cmd_load_location): + + Fix link activation to respect ctrl and shift modifiers. + Part of bug #310814. + +2006-01-29 Christian Persch <chpe@cvs.gnome.org> + * embed/mozilla/mozilla-embed-single.cpp: If GetPassword failed, break instead of continue. diff --git a/lib/ephy-gui.c b/lib/ephy-gui.c index 99e68bc2b..7ed8b36ef 100644 --- a/lib/ephy-gui.c +++ b/lib/ephy-gui.c @@ -416,6 +416,42 @@ ephy_gui_help (GtkWindow *parent, } } +void +ephy_gui_get_current_event (GdkEventType *otype, + guint *ostate, + guint *obutton) +{ + GdkEvent *event; + GdkEventType type = GDK_NOTHING; + guint state = 0, button = (guint) -1; + + event = gtk_get_current_event (); + if (event != NULL) + { + type = event->type; + + if (type == GDK_KEY_PRESS || + type == GDK_KEY_RELEASE) + { + state = event->key.state; + } + else if (type == GDK_BUTTON_PRESS || + type == GDK_BUTTON_RELEASE || + type == GDK_2BUTTON_PRESS || + type == GDK_3BUTTON_PRESS) + { + button = event->button.button; + state = event->button.state; + } + + gdk_event_free (event); + } + + if (otype) *otype = type; + if (ostate) *ostate = state & gtk_accelerator_get_default_mod_mask (); + if (obutton) *obutton = button; +} + gboolean ephy_gui_is_middle_click (void) { diff --git a/lib/ephy-gui.h b/lib/ephy-gui.h index 3dc1eb18d..c46efe746 100644 --- a/lib/ephy-gui.h +++ b/lib/ephy-gui.h @@ -61,6 +61,10 @@ void ephy_gui_menu_position_on_panel (GtkMenu *menu, GtkWindowGroup *ephy_gui_ensure_window_group (GtkWindow *window); +void ephy_gui_get_current_event (GdkEventType *type, + guint *state, + guint *button); + gboolean ephy_gui_is_middle_click (void); gboolean ephy_gui_check_location_writable (GtkWidget *parent, diff --git a/lib/widgets/ephy-location-entry.c b/lib/widgets/ephy-location-entry.c index a77797a40..f38742d03 100644 --- a/lib/widgets/ephy-location-entry.c +++ b/lib/widgets/ephy-location-entry.c @@ -380,7 +380,8 @@ entry_key_press_cb (GtkEntry *entry, if ((event->keyval == GDK_Return || event->keyval == GDK_KP_Enter || event->keyval == GDK_ISO_Enter) && - state == GDK_CONTROL_MASK) + (state == GDK_CONTROL_MASK || + state == (GDK_CONTROL_MASK | GDK_SHIFT_MASK))) { gtk_im_context_reset (entry->im_context); @@ -388,7 +389,8 @@ entry_key_press_cb (GtkEntry *entry, return TRUE; } - else if (event->keyval == GDK_Escape && state == 0) + + if (event->keyval == GDK_Escape && state == 0) { ephy_location_entry_reset (lentry); /* don't return TRUE since we want to cancel the autocompletion popup too */ diff --git a/src/ephy-go-action.c b/src/ephy-go-action.c index e84860c23..347398183 100644 --- a/src/ephy-go-action.c +++ b/src/ephy-go-action.c @@ -52,7 +52,7 @@ ephy_go_action_get_type (void) (GInstanceInitFunc) NULL, }; - type = g_type_register_static (GTK_TYPE_ACTION, + type = g_type_register_static (EPHY_TYPE_LINK_ACTION, "EphyGoAction", &type_info, 0); } diff --git a/src/ephy-go-action.h b/src/ephy-go-action.h index a3a74784c..063014825 100644 --- a/src/ephy-go-action.h +++ b/src/ephy-go-action.h @@ -21,7 +21,7 @@ #ifndef EPHY_GO_ACTION_H #define EPHY_GO_ACTION_H -#include <gtk/gtkaction.h> +#include "ephy-link-action.h" #define EPHY_TYPE_GO_ACTION (ephy_go_action_get_type ()) #define EPHY_GO_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EPHY_TYPE_GO_ACTION, EphyGoAction)) @@ -35,12 +35,12 @@ typedef struct _EphyGoActionClass EphyGoActionClass; struct _EphyGoAction { - GtkAction parent; + EphyLinkAction parent; }; struct _EphyGoActionClass { - GtkActionClass parent_class; + EphyLinkActionClass parent_class; }; GType ephy_go_action_get_type (void); diff --git a/src/ephy-home-action.c b/src/ephy-home-action.c index 52e86ef83..7d2357bd3 100644 --- a/src/ephy-home-action.c +++ b/src/ephy-home-action.c @@ -36,7 +36,7 @@ ephy_home_action_activate (GtkAction *action) ephy_link_open (EPHY_LINK (action), address != NULL && address[0] != '\0' ? address : "about:blank", NULL, - ephy_gui_is_middle_click () ? EPHY_LINK_NEW_TAB : 0); + ephy_link_flags_from_current_event ()); g_free (address); } diff --git a/src/ephy-link.c b/src/ephy-link.c index e48758e8c..67be0e221 100644 --- a/src/ephy-link.c +++ b/src/ephy-link.c @@ -25,6 +25,7 @@ #include "ephy-type-builtins.h"
#include "ephy-marshal.h"
#include "ephy-signal-accumulator.h"
+#include "ephy-gui.h"
#include "ephy-debug.h"
enum
@@ -97,3 +98,38 @@ ephy_link_open (EphyLink *link, return new_tab;
}
+
+EphyLinkFlags
+ephy_link_flags_from_current_event (void)
+{
+ GdkEventType type = GDK_NOTHING;
+ guint state = 0, button = (guint) -1;
+ EphyLinkFlags flags = 0;
+
+ ephy_gui_get_current_event (&type, &state, &button);
+
+ if (button == 2 && type == GDK_BUTTON_PRESS)
+ {
+ if (state == GDK_SHIFT_MASK)
+ {
+ flags = EPHY_LINK_NEW_WINDOW;
+ }
+ else
+ {
+ flags = EPHY_LINK_NEW_TAB;
+ }
+ }
+ else
+ {
+ if (state == (GDK_CONTROL_MASK | GDK_SHIFT_MASK))
+ {
+ flags = EPHY_LINK_NEW_WINDOW;
+ }
+ else if (state == GDK_CONTROL_MASK)
+ {
+ flags = EPHY_LINK_NEW_TAB;
+ }
+ }
+
+ return flags;
+}
diff --git a/src/ephy-link.h b/src/ephy-link.h index a1e80cf03..4287ba174 100644 --- a/src/ephy-link.h +++ b/src/ephy-link.h @@ -64,6 +64,8 @@ EphyTab *ephy_link_open (EphyLink *link, EphyTab *tab,
EphyLinkFlags flags);
+EphyLinkFlags ephy_link_flags_from_current_event (void);
+
G_END_DECLS
#endif /* EPHY_LINK_H */
diff --git a/src/ephy-location-action.c b/src/ephy-location-action.c index a15bd41d7..922f14298 100644 --- a/src/ephy-location-action.c +++ b/src/ephy-location-action.c @@ -149,8 +149,6 @@ entry_activate_cb (GtkEntry *entry, EphyLocationAction *action) { EphyBookmarks *bookmarks; - GdkEvent *event; - gboolean control = FALSE; const char *content; char *address; @@ -162,21 +160,8 @@ entry_activate_cb (GtkEntry *entry, address = ephy_bookmarks_resolve_address (bookmarks, content, NULL); g_return_if_fail (address != NULL); - event = gtk_get_current_event (); - if (event) - { - if (event->type == GDK_KEY_PRESS || - event->type == GDK_KEY_RELEASE) - { - control = (event->key.state & gtk_accelerator_get_default_mod_mask ()) == GDK_CONTROL_MASK; - } - - gdk_event_free (event); - } - - /* FIXME use ephy_bookmarks_resolve_address here too? */ ephy_link_open (EPHY_LINK (action), address, NULL, - control ? EPHY_LINK_NEW_TAB : 0); + ephy_link_flags_from_current_event ()); g_free (address); } diff --git a/src/ephy-session.c b/src/ephy-session.c index 6f10554a4..ffa81bbe6 100644 --- a/src/ephy-session.c +++ b/src/ephy-session.c @@ -1,7 +1,7 @@ /* * Copyright (C) 2002 Jorn Baayen * Copyright (C) 2003, 2004 Marco Pesenti Gritti - * Copyright (C) 2003, 2004, 2005 Christian Persch + * Copyright (C) 2003, 2004, 2005, 2006 Christian Persch * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/src/ephy-tab.c b/src/ephy-tab.c index 3d91ded53..8a95ff477 100644 --- a/src/ephy-tab.c +++ b/src/ephy-tab.c @@ -1833,28 +1833,26 @@ ephy_tab_visibility_cb (EphyEmbed *embed, gboolean visibility, } static gboolean -open_link_in_new_tab (EphyTab *tab, - const char *link_address) +open_link_in_new (EphyTab *tab, + const char *link_address, + guint state) { - gboolean new_tab; + EphyTab *dest; - new_tab = address_has_web_scheme (link_address); + if (!address_has_web_scheme (link_address)) return FALSE; - if (new_tab) - { - EphyTab *dest; - dest = ephy_link_open (EPHY_LINK (tab), link_address, - tab, EPHY_LINK_NEW_TAB); + dest = ephy_link_open (EPHY_LINK (tab), link_address, tab, + state & GDK_SHIFT_MASK ? EPHY_LINK_NEW_WINDOW + : EPHY_LINK_NEW_TAB); - if (dest) - { - ephy_embed_shistory_copy (ephy_tab_get_embed (tab), - ephy_tab_get_embed (dest), - TRUE, /* back history */ - FALSE, /* forward history */ - FALSE); /* current index */ - return TRUE; - } + if (dest) + { + ephy_embed_shistory_copy (ephy_tab_get_embed (tab), + ephy_tab_get_embed (dest), + TRUE, /* back history */ + FALSE, /* forward history */ + FALSE); /* current index */ + return TRUE; } return FALSE; @@ -1915,7 +1913,8 @@ ephy_tab_dom_mouse_click_cb (EphyEmbed *embed, EphyEmbedEventContext context; guint button, modifier; gboolean handled = TRUE; - gboolean with_control, with_shift, is_left_click, is_middle_click; + gboolean with_control, with_shift, with_shift_control; + gboolean is_left_click, is_middle_click; gboolean is_link, is_image, is_middle_clickable; gboolean middle_click_opens; gboolean is_input; @@ -1929,8 +1928,9 @@ ephy_tab_dom_mouse_click_cb (EphyEmbed *embed, LOG ("ephy_tab_dom_mouse_click_cb: button %d, context %x, modifier %x", button, context, modifier); - with_control = (modifier & GDK_CONTROL_MASK) != 0; - with_shift = (modifier & GDK_SHIFT_MASK) != 0; + with_control = (modifier & GDK_CONTROL_MASK) == GDK_CONTROL_MASK; + with_shift = (modifier & GDK_SHIFT_MASK) == GDK_SHIFT_MASK; + with_shift_control = (modifier & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) == (GDK_SHIFT_MASK | GDK_CONTROL_MASK); is_left_click = (button == 1); is_middle_click = (button == 2); @@ -1946,14 +1946,16 @@ ephy_tab_dom_mouse_click_cb (EphyEmbed *embed, is_input = (context & EPHY_EMBED_CONTEXT_INPUT) != 0; /* ctrl+click or middle click opens the link in new tab */ - if (is_link && ((is_left_click && with_control) || is_middle_click)) + if (is_link && + ((is_left_click && (with_control || with_shift_control)) || + is_middle_click)) { const GValue *value; const char *link_address; value = ephy_embed_event_get_property (event, "link"); link_address = g_value_get_string (value); - handled = open_link_in_new_tab (tab, link_address); + handled = open_link_in_new (tab, link_address, modifier); } /* shift+click saves the link target */ else if (is_link && is_left_click && with_shift) diff --git a/src/window-commands.c b/src/window-commands.c index fffcedfe1..96321d08b 100644 --- a/src/window-commands.c +++ b/src/window-commands.c @@ -45,6 +45,7 @@ #include "ephy-find-toolbar.h" #include "ephy-location-entry.h" #include "ephy-bookmarks-ui.h" +#include "ephy-link.h" #include "pdm-dialog.h" #include <string.h> @@ -884,7 +885,9 @@ window_cmd_load_location (GtkAction *action, if (location) { - ephy_window_load_url (window, location); + ephy_link_open (EPHY_LINK (window), location, + ephy_window_get_active_tab (window), + ephy_link_flags_from_current_event ()); } } |