diff options
Diffstat (limited to 'src/ephy-home-action.c')
-rw-r--r-- | src/ephy-home-action.c | 100 |
1 files changed, 96 insertions, 4 deletions
diff --git a/src/ephy-home-action.c b/src/ephy-home-action.c index d00315586..672a55f80 100644 --- a/src/ephy-home-action.c +++ b/src/ephy-home-action.c @@ -26,17 +26,109 @@ #include "ephy-gui.h" #include "eel-gconf-extensions.h" +#include <string.h> + +#include <gtk/gtkclipboard.h> + +typedef struct +{ + GObject *weak_ptr; + EphyLinkFlags flags; +} ClipboardCtx; + +static void +clipboard_text_received_cb (GtkClipboard *clipboard, + const char *text, + ClipboardCtx *ctx) +{ + if (ctx->weak_ptr != NULL && text != NULL) + { + ephy_link_open (EPHY_LINK (ctx->weak_ptr), text, NULL, ctx->flags); + } + + if (ctx->weak_ptr != NULL) + { + GObject **object = &(ctx->weak_ptr); + g_object_remove_weak_pointer (G_OBJECT (ctx->weak_ptr), + (gpointer *)object); + } + + g_free (ctx); +} + +static void +ephy_home_action_with_clipboard (GtkAction *action, + EphyLinkFlags flags) +{ + ClipboardCtx *ctx; + GObject **object; + + ctx = g_new (ClipboardCtx, 1); + ctx->flags = flags; + + /* We need to make sure we know if the action is destroyed between + * requesting the clipboard contents, and receiving them. + */ + ctx->weak_ptr = G_OBJECT (action); + object = &(ctx->weak_ptr); + g_object_add_weak_pointer (ctx->weak_ptr, (gpointer *)object); + + gtk_clipboard_request_text + (gtk_clipboard_get_for_display (gdk_display_get_default(), + GDK_SELECTION_PRIMARY), + (GtkClipboardTextReceivedFunc) clipboard_text_received_cb, + ctx); + +} + +static void +ephy_home_action_open (GtkAction *action, + const char *address, + EphyLinkFlags flags) +{ + if (ephy_gui_is_middle_click ()) + { + ephy_home_action_with_clipboard (action, flags); + } + else /* Left button */ + { + ephy_link_open (EPHY_LINK (action), + address != NULL && address[0] != '\0' ? address : "about:blank", + NULL, + flags); + } +} + static void ephy_home_action_activate (GtkAction *action) { + char *action_name; char *address; + g_object_get (G_OBJECT (action), "name", &action_name, NULL); + address = eel_gconf_get_string (CONF_GENERAL_HOMEPAGE); - ephy_link_open (EPHY_LINK (action), - address != NULL && address[0] != '\0' ? address : "about:blank", - NULL, - ephy_link_flags_from_current_event ()); + if (strcmp (action_name, "GoHome") == 0) + { + + ephy_link_open (EPHY_LINK (action), + address != NULL && address[0] != '\0' ? address : "about:blank", + NULL, + ephy_link_flags_from_current_event ()); + } + else if (strcmp (action_name, "FileNewTab") == 0) + { + ephy_home_action_open (action, + address, + EPHY_LINK_NEW_TAB | EPHY_LINK_JUMP_TO); + } + else if (strcmp (action_name, "FileNewWindow") == 0) + { + ephy_home_action_open (action, + address, + EPHY_LINK_NEW_WINDOW); + } g_free (address); } |