aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog16
-rw-r--r--embed/downloader-view.c36
-rw-r--r--lib/egg/eggstatusicon.c63
-rw-r--r--lib/egg/eggstatusicon.h7
-rw-r--r--lib/ephy-gui.c42
-rw-r--r--lib/ephy-gui.h6
6 files changed, 129 insertions, 41 deletions
diff --git a/ChangeLog b/ChangeLog
index f357eb75e..2e7a32444 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@
2004-12-16 Christian Persch <chpe@cvs.gnome.org>
+ * embed/downloader-view.c: (show_downloader_cb),
+ (status_icon_popup_menu_cb), (show_status_icon):
+ * lib/egg/eggstatusicon.c: (egg_status_icon_class_init),
+ (egg_status_icon_init), (egg_status_icon_finalize),
+ (emit_activate_signal), (emit_popup_menu_signal),
+ (egg_status_icon_size_allocate), (egg_status_icon_button_press),
+ (egg_status_icon_set_tooltip):
+ * lib/egg/eggstatusicon.h:
+ * lib/ephy-gui.c: (ephy_gui_menu_position_under_widget),
+ (ephy_gui_menu_position_on_panel):
+ * lib/ephy-gui.h:
+
+ Implement context menu on tray icon, as per HIG. Fixes bug #152903.
+
+2004-12-16 Christian Persch <chpe@cvs.gnome.org>
+
* src/ephy-history-window.c: (confirmation_dialog_construct):
Add stock icon to the "Clear" button.
diff --git a/embed/downloader-view.c b/embed/downloader-view.c
index e2b7e8edd..f8e1f2400 100644
--- a/embed/downloader-view.c
+++ b/embed/downloader-view.c
@@ -25,6 +25,8 @@
#include "ephy-file-helpers.h"
#include "ephy-embed-shell.h"
#include "ephy-stock-icons.h"
+#include "ephy-gui.h"
+#include "ephy-debug.h"
#include <libgnomevfs/gnome-vfs-utils.h>
#include <eggstatusicon.h>
@@ -39,6 +41,10 @@
#include <gtk/gtktreeviewcolumn.h>
#include <gtk/gtkicontheme.h>
#include <gtk/gtkiconfactory.h>
+#include <gtk/gtkmenuitem.h>
+#include <gtk/gtkmenushell.h>
+#include <gtk/gtkmenu.h>
+#include <gtk/gtkmain.h>
#include <libgnomeui/gnome-icon-lookup.h>
#include <glib/gi18n.h>
@@ -157,11 +163,33 @@ downloader_view_class_init (DownloaderViewClass *klass)
}
static void
-status_icon_activated (EggStatusIcon *icon, DownloaderView *dv)
+show_downloader_cb (DownloaderView *dv)
{
gtk_window_present (GTK_WINDOW (dv->priv->window));
}
+static gboolean
+status_icon_popup_menu_cb (EggStatusIcon *icon,
+ DownloaderView *dv)
+{
+ GtkWidget *menu, *item;
+ guint button = 0;
+
+ menu = gtk_menu_new ();
+
+ item = gtk_menu_item_new_with_mnemonic (_("_Show Downloader..."));
+ g_signal_connect_swapped (item, "activate",
+ G_CALLBACK (show_downloader_cb), dv);
+ gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+ gtk_widget_show_all (menu);
+
+ gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
+ ephy_gui_menu_position_on_panel, icon->tray_icon,
+ button, gtk_get_current_event_time ());
+
+ return TRUE;
+}
+
static void
show_status_icon (DownloaderView *dv)
{
@@ -171,8 +199,10 @@ show_status_icon (DownloaderView *dv)
dv->priv->status_icon = egg_status_icon_new_from_pixbuf (pixbuf);
g_object_unref (pixbuf);
- g_signal_connect (dv->priv->status_icon, "activate",
- G_CALLBACK (status_icon_activated), dv);
+ g_signal_connect_swapped (dv->priv->status_icon, "activate",
+ G_CALLBACK (show_downloader_cb), dv);
+ g_signal_connect (dv->priv->status_icon, "popup-menu",
+ G_CALLBACK(status_icon_popup_menu_cb), dv);
}
static void
diff --git a/lib/egg/eggstatusicon.c b/lib/egg/eggstatusicon.c
index 1893d4459..350bc3c11 100644
--- a/lib/egg/eggstatusicon.c
+++ b/lib/egg/eggstatusicon.c
@@ -101,7 +101,7 @@ static gboolean egg_status_icon_button_press (EggStatusIcon *status_icon,
GdkEventButton *event);
static void egg_status_icon_disable_blinking (EggStatusIcon *status_icon);
static void egg_status_icon_reset_image_data (EggStatusIcon *status_icon);
-
+static gboolean emit_popup_menu_signal (EggStatusIcon *status_icon);
static GObjectClass *parent_class = NULL;
static guint status_icon_signals [LAST_SIGNAL] = { 0 };
@@ -218,15 +218,13 @@ egg_status_icon_class_init (EggStatusIconClass *klass)
status_icon_signals [POPUP_MENU_SIGNAL] =
g_signal_new ("popup-menu",
G_TYPE_FROM_CLASS (gobject_class),
- G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+ G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (EggStatusIconClass, popup_menu),
+ g_signal_accumulator_true_handled,
NULL,
- NULL,
- _egg_marshal_VOID__UINT_UINT,
- G_TYPE_NONE,
- 2,
- G_TYPE_UINT,
- G_TYPE_UINT);
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_BOOLEAN,
+ 0);
status_icon_signals [SIZE_CHANGED_SIGNAL] =
g_signal_new ("size-changed",
@@ -249,23 +247,24 @@ egg_status_icon_init (EggStatusIcon *status_icon)
status_icon->priv->image_type = GTK_IMAGE_EMPTY;
status_icon->priv->size = G_MAXINT;
- status_icon->priv->tray_icon = GTK_WIDGET (egg_tray_icon_new (NULL));
+ status_icon->tray_icon = GTK_WIDGET (egg_tray_icon_new (NULL));
- gtk_widget_add_events (GTK_WIDGET (status_icon->priv->tray_icon),
+ gtk_widget_add_events (GTK_WIDGET (status_icon->tray_icon),
GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
- g_signal_connect_swapped (status_icon->priv->tray_icon, "button-press-event",
+ g_signal_connect_swapped (status_icon->tray_icon, "button-press-event",
G_CALLBACK (egg_status_icon_button_press), status_icon);
-
+ g_signal_connect_swapped (status_icon->tray_icon, "popup-menu",
+ G_CALLBACK (emit_popup_menu_signal), status_icon);
status_icon->priv->image = gtk_image_new ();
- gtk_container_add (GTK_CONTAINER (status_icon->priv->tray_icon),
+ gtk_container_add (GTK_CONTAINER (status_icon->tray_icon),
status_icon->priv->image);
g_signal_connect_swapped (status_icon->priv->image, "size-allocate",
G_CALLBACK (egg_status_icon_size_allocate), status_icon);
gtk_widget_show (status_icon->priv->image);
- gtk_widget_show (status_icon->priv->tray_icon);
+ gtk_widget_show (status_icon->tray_icon);
status_icon->priv->tooltips = gtk_tooltips_new ();
g_object_ref (status_icon->priv->tooltips);
@@ -289,7 +288,7 @@ egg_status_icon_finalize (GObject *object)
g_object_unref (status_icon->priv->tooltips);
status_icon->priv->tooltips = NULL;
- gtk_widget_destroy (status_icon->priv->tray_icon);
+ gtk_widget_destroy (status_icon->tray_icon);
g_free (status_icon->priv);
@@ -402,22 +401,19 @@ egg_status_icon_new_from_animation (GdkPixbufAnimation *animation)
static void
emit_activate_signal (EggStatusIcon *status_icon)
{
- g_signal_emit (status_icon,
- status_icon_signals [ACTIVATE_SIGNAL], 0);
+ g_signal_emit (status_icon, status_icon_signals [ACTIVATE_SIGNAL], 0);
}
-#ifdef UNUSED
-static void
-emit_popup_menu_signal (EggStatusIcon *status_icon,
- guint button,
- guint32 activate_time)
+static gboolean
+emit_popup_menu_signal (EggStatusIcon *status_icon)
{
- g_signal_emit (status_icon,
- status_icon_signals [POPUP_MENU_SIGNAL], 0,
- button,
- activate_time);
+ gboolean retval = FALSE;
+
+ g_signal_emit (status_icon, status_icon_signals [POPUP_MENU_SIGNAL], 0,
+ &retval);
+
+ return retval;
}
-#endif
static gboolean
emit_size_changed_signal (EggStatusIcon *status_icon,
@@ -534,7 +530,7 @@ egg_status_icon_size_allocate (EggStatusIcon *status_icon,
GtkOrientation orientation;
gint size;
- orientation = egg_tray_icon_get_orientation (EGG_TRAY_ICON (status_icon->priv->tray_icon));
+ orientation = egg_tray_icon_get_orientation (EGG_TRAY_ICON (status_icon->tray_icon));
if (orientation == GTK_ORIENTATION_HORIZONTAL)
size = allocation->height;
@@ -558,13 +554,18 @@ static gboolean
egg_status_icon_button_press (EggStatusIcon *status_icon,
GdkEventButton *event)
{
+ gboolean handled = FALSE;
if (event->button == 1 && event->type == GDK_2BUTTON_PRESS)
{
emit_activate_signal (status_icon);
- return TRUE;
+ handled = TRUE;
+ }
+ else if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
+ {
+ handled = emit_popup_menu_signal (status_icon);
}
- return FALSE;
+ return handled;
}
static void
@@ -692,7 +693,7 @@ egg_status_icon_set_tooltip (EggStatusIcon *status_icon,
g_return_if_fail (EGG_IS_STATUS_ICON (status_icon));
gtk_tooltips_set_tip (status_icon->priv->tooltips,
- status_icon->priv->tray_icon,
+ status_icon->tray_icon,
tooltip_text,
tooltip_private);
}
diff --git a/lib/egg/eggstatusicon.h b/lib/egg/eggstatusicon.h
index cde7ae9df..58bb59319 100644
--- a/lib/egg/eggstatusicon.h
+++ b/lib/egg/eggstatusicon.h
@@ -44,6 +44,9 @@ struct _EggStatusIcon
{
GObject parent_instance;
+ /*< public >*/
+ GtkWidget *tray_icon;
+ /*< private >*/
EggStatusIconPrivate *priv;
};
@@ -52,9 +55,7 @@ struct _EggStatusIconClass
GObjectClass parent_class;
void (* activate) (EggStatusIcon *status_icon);
- void (* popup_menu) (EggStatusIcon *status_icon,
- guint buttton,
- guint32 activate_time);
+ gboolean (* popup_menu) (EggStatusIcon *status_icon);
gboolean (* size_changed) (EggStatusIcon *status_icon,
gint size);
};
diff --git a/lib/ephy-gui.c b/lib/ephy-gui.c
index ae389b01f..cd8f09e02 100644
--- a/lib/ephy-gui.c
+++ b/lib/ephy-gui.c
@@ -113,14 +113,11 @@ ephy_gui_menu_position_under_widget (GtkMenu *menu,
{
GtkWidget *w = GTK_WIDGET (user_data);
GtkRequisition requisition;
- gboolean rtl;
-
- rtl = (gtk_widget_get_direction (w) == GTK_TEXT_DIR_RTL);
gdk_window_get_origin (w->window, x, y);
gtk_widget_size_request (GTK_WIDGET (menu), &requisition);
- if (rtl)
+ if (gtk_widget_get_direction (w) == GTK_TEXT_DIR_RTL)
{
*x += w->allocation.x + w->allocation.width - requisition.width;
}
@@ -134,6 +131,43 @@ ephy_gui_menu_position_under_widget (GtkMenu *menu,
ephy_gui_sanitise_popup_position (menu, w, x, y);
}
+void
+ephy_gui_menu_position_on_panel (GtkMenu *menu,
+ gint *x,
+ gint *y,
+ gboolean *push_in,
+ gpointer user_data)
+{
+ GtkWidget *widget = GTK_WIDGET (user_data);
+ GtkRequisition requisition;
+ GdkScreen *screen;
+
+ screen = gtk_widget_get_screen (widget);
+
+ gdk_window_get_origin (widget->window, x, y);
+ gtk_widget_size_request (GTK_WIDGET (menu), &requisition);
+
+ if (GTK_WIDGET_NO_WINDOW (widget))
+ {g_print ("NOT WINDOW!\n");
+ *x += widget->allocation.x;
+ *y += widget->allocation.y;
+ }
+
+ /* FIXME: Adapt to vertical panels, but egg_tray_icon_get_orientation doesn't seem to work */
+ if (*y > gdk_screen_get_height (screen) / 2)
+ {
+ *y -= requisition.height;
+ }
+ else
+ {
+ *y += widget->allocation.height;
+ }
+
+ *push_in = FALSE;
+
+ ephy_gui_sanitise_popup_position (menu, widget, x, y);
+}
+
gboolean
ephy_gui_confirm_overwrite_file (GtkWidget *parent, const char *filename)
{
diff --git a/lib/ephy-gui.h b/lib/ephy-gui.h
index caa4035d8..73f2e5bce 100644
--- a/lib/ephy-gui.h
+++ b/lib/ephy-gui.h
@@ -47,6 +47,12 @@ void ephy_gui_menu_position_under_widget (GtkMenu *menu,
gboolean *push_in,
gpointer user_data);
+void ephy_gui_menu_position_on_panel (GtkMenu *menu,
+ gint *x,
+ gint *y,
+ gboolean *push_in,
+ gpointer user_data);
+
gboolean ephy_gui_is_middle_click (void);
gboolean ephy_gui_select_row_by_key (GtkTreeView *treeview,