From 04dc7fe855d41f9f299ac6ed37968645517e04a7 Mon Sep 17 00:00:00 2001 From: Christian Dywan Date: Sun, 16 Aug 2009 23:35:29 +0200 Subject: [PATCH] Pass news feed icon clicks to the feed panel The secondary-icon-released signal of the location action returns a boolean now so a callback can indicate that it handled it. So if the feed panel is active, it adds feeds to the panel and suppresses the default action. A possible crash when disabling the panel and clicking the icon afterwards is fixed by adding a missing signal disconnection. --- extensions/feed-panel/main.c | 40 ++++++++++++++++++++++++++-------- midori/midori-browser.c | 7 ++++-- midori/midori-locationaction.c | 15 ++++++++++--- 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/extensions/feed-panel/main.c b/extensions/feed-panel/main.c index 7e6c90bd..7966a81d 100644 --- a/extensions/feed-panel/main.c +++ b/extensions/feed-panel/main.c @@ -66,6 +66,11 @@ feed_app_add_browser_cb (MidoriApp* app, MidoriBrowser* browser, MidoriExtension* extension); +static gboolean +secondary_icon_released_cb (GtkAction* action, + GtkWidget* widget, + FeedPrivate* priv); + static void feed_deactivate_cb (MidoriExtension* extension, FeedPrivate* priv) @@ -73,6 +78,13 @@ feed_deactivate_cb (MidoriExtension* extension, if (priv) { MidoriApp* app = midori_extension_get_app (extension); + GtkActionGroup* action_group; + GtkAction* action; + + action_group = midori_browser_get_action_group (priv->browser); + action = gtk_action_group_get_action (action_group, "Location"); + g_signal_handlers_disconnect_by_func (action, + secondary_icon_released_cb, priv); g_signal_handlers_disconnect_by_func (app, feed_app_add_browser_cb, extension); @@ -292,28 +304,38 @@ update_feeds (FeedPrivate* priv) return TRUE; } -static void +static gboolean secondary_icon_released_cb (GtkAction* action, GtkWidget* widget, FeedPrivate* priv) { - const gchar* uri; + GtkWidget* view; g_assert (KATZE_IS_ARRAY (priv->feeds)); - uri = midori_location_action_get_uri (MIDORI_LOCATION_ACTION (action)); + if (gtk_window_get_focus (GTK_WINDOW (priv->browser)) == widget) + return FALSE; - if (uri && *uri) + if ((view = midori_browser_get_current_tab (priv->browser))) { - KatzeArray* feed; + const gchar* uri; - feed = feed_add_item (priv->feeds, uri); - if (feed) + uri = g_object_get_data (G_OBJECT (view), "news-feeds"); + if (uri && *uri) { - feed_save_items (priv->extension, priv->feeds); - update_feed (priv, KATZE_ITEM (feed)); + KatzeArray* feed; + + if ((feed = feed_add_item (priv->feeds, uri))) + { + /* FIXME: Let the user know that a feed was added */ + feed_save_items (priv->extension, priv->feeds); + update_feed (priv, KATZE_ITEM (feed)); + return TRUE; + } } } + + return FALSE; } static void diff --git a/midori/midori-browser.c b/midori/midori-browser.c index 56736771..09fb1f13 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -3215,7 +3215,7 @@ _action_location_submit_uri (GtkAction* action, gtk_widget_grab_focus (midori_browser_get_current_tab (browser)); } -static void +static gboolean _action_location_secondary_icon_released (GtkAction* action, GtkWidget* widget, MidoriBrowser* browser) @@ -3245,7 +3245,10 @@ _action_location_secondary_icon_released (GtkAction* action, } else _action_location_submit_uri (action, uri, FALSE, browser); + return TRUE; } + + return FALSE; } static void @@ -4887,7 +4890,7 @@ midori_browser_init (MidoriBrowser* browser) _action_location_reset_uri, browser, "signal::submit-uri", _action_location_submit_uri, browser, - "signal::secondary-icon-released", + "signal-after::secondary-icon-released", _action_location_secondary_icon_released, browser, NULL); gtk_action_group_add_action_with_accel (browser->action_group, diff --git a/midori/midori-locationaction.c b/midori/midori-locationaction.c index a55f252c..6c34e3af 100644 --- a/midori/midori-locationaction.c +++ b/midori/midori-locationaction.c @@ -153,14 +153,23 @@ midori_location_action_class_init (MidoriLocationActionClass* class) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + /** + * MidoriLocationAction:secondary-icon-released: + * + * The secondary-icon-released signal is emitted when the mouse button + * is released above the secondary icon. + * + * Since 0.1.10 a signal handler can return %TRUE to stop signal + * emission, for instance to suppress default behavior. + */ signals[SECONDARY_ICON_RELEASED] = g_signal_new ("secondary-icon-released", G_TYPE_FROM_CLASS (class), (GSignalFlags) (G_SIGNAL_RUN_LAST), 0, - 0, + g_signal_accumulator_true_handled, NULL, - g_cclosure_marshal_VOID__OBJECT, - G_TYPE_NONE, 1, + midori_cclosure_marshal_BOOLEAN__OBJECT, + G_TYPE_BOOLEAN, 1, GTK_TYPE_WIDGET); signals[RESET_URI] = g_signal_new ("reset-uri", -- 2.39.5