diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | lib/egg/Makefile.am | 2 | ||||
-rw-r--r-- | lib/egg/eggdropdowntoolbutton.c | 411 | ||||
-rw-r--r-- | lib/egg/eggdropdowntoolbutton.h | 73 | ||||
-rw-r--r-- | src/ephy-navigation-action.c | 18 |
6 files changed, 24 insertions, 493 deletions
@@ -1,5 +1,16 @@ 2004-10-05 Christian Persch <chpe@cvs.gnome.org> + * configure.ac: + * lib/egg/Makefile.am: + R lib/egg/eggdropdowntoolbutton.c: + R lib/egg/eggdropdowntoolbutton.h: + * src/ephy-navigation-action.c: (menu_activated_cb), + (connect_proxy), (ephy_navigation_action_class_init): + + Port to GtkMenuToolButton. + +2004-10-05 Christian Persch <chpe@cvs.gnome.org> + * embed/mozilla/GtkNSSClientAuthDialogs.cpp: * embed/mozilla/GtkNSSDialogs.cpp: * embed/mozilla/GtkNSSKeyPairDialogs.cpp: diff --git a/configure.ac b/configure.ac index 5f0b2a580..ae8463421 100644 --- a/configure.ac +++ b/configure.ac @@ -36,7 +36,7 @@ AC_PROG_INTLTOOL([0.29]) GLIB_REQUIRED=2.5.3 PANGO_REQUIRED=1.5.1 -GTK_REQUIRED=2.5.3 +GTK_REQUIRED=2.5.4 LIBXML_REQUIRED=2.6.6 LIBGNOMEVFS_REQUIRED=2.3.1 LIBGLADE_REQUIRED=2.3.1 diff --git a/lib/egg/Makefile.am b/lib/egg/Makefile.am index 7d2471e68..77b7c0eaa 100644 --- a/lib/egg/Makefile.am +++ b/lib/egg/Makefile.am @@ -8,7 +8,6 @@ INCLUDES = \ noinst_LTLIBRARIES = libegg.la EGGSOURCES = \ - eggdropdowntoolbutton.c \ eggtreemultidnd.c \ egg-editable-toolbar.c \ egg-toolbars-model.c \ @@ -22,7 +21,6 @@ libegg_la_SOURCES = \ eggmarshalers.c EGGHEADERS = \ - eggdropdowntoolbutton.h \ eggtreemultidnd.h \ egg-editable-toolbar.h \ egg-toolbars-model.h \ diff --git a/lib/egg/eggdropdowntoolbutton.c b/lib/egg/eggdropdowntoolbutton.c deleted file mode 100644 index 0ffe2f588..000000000 --- a/lib/egg/eggdropdowntoolbutton.c +++ /dev/null @@ -1,411 +0,0 @@ -/* GTK - The GIMP Toolkit - * - * Copyright (C) 2003 Ricardo Fernandez Pascual - * Copyright (C) 2004 Paolo Borelli - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - - -#include "config.h" - -#include "eggdropdowntoolbutton.h" - -#include <gtk/gtktogglebutton.h> -#include <gtk/gtkarrow.h> -#include <gtk/gtkhbox.h> -#include <gtk/gtkmenu.h> -#include <gtk/gtkmain.h> -#include <gdk/gdkkeysyms.h> - - -#define EGG_DROPDOWN_TOOL_BUTTON_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EGG_TYPE_DROPDOWN_TOOL_BUTTON, EggDropdownToolButtonPrivate)) - -struct _EggDropdownToolButtonPrivate -{ - GtkWidget *button; - GtkWidget *arrow_button; - GtkMenu *menu; -}; - -static void egg_dropdown_tool_button_init (EggDropdownToolButton *button); -static void egg_dropdown_tool_button_class_init (EggDropdownToolButtonClass *klass); -static void egg_dropdown_tool_button_finalize (GObject *object); - -enum { - MENU_ACTIVATED, - LAST_SIGNAL -}; - -static gint signals[LAST_SIGNAL]; - -static GObjectClass *parent_class = NULL; - -GType -egg_dropdown_tool_button_get_type (void) -{ - static GType type = 0; - - if (type == 0) - { - static const GTypeInfo info = - { - sizeof (EggDropdownToolButtonClass), - (GBaseInitFunc) 0, - (GBaseFinalizeFunc) 0, - (GClassInitFunc) egg_dropdown_tool_button_class_init, - (GClassFinalizeFunc) 0, - NULL, - sizeof (EggDropdownToolButton), - 0, /* n_preallocs */ - (GInstanceInitFunc) egg_dropdown_tool_button_init - }; - - type = g_type_register_static (GTK_TYPE_TOOL_BUTTON, - "EggDropdownToolButton", - &info, 0); - } - - return type; -} - -static gboolean -egg_dropdown_tool_button_set_tooltip (GtkToolItem *tool_item, - GtkTooltips *tooltips, - const char *tip_text, - const char *tip_private) -{ - EggDropdownToolButton *button; - - g_return_val_if_fail (EGG_IS_DROPDOWN_TOOL_BUTTON (tool_item), FALSE); - - button = EGG_DROPDOWN_TOOL_BUTTON (tool_item); - gtk_tooltips_set_tip (tooltips, button->priv->button, tip_text, tip_private); - - return TRUE; -} - -static void -egg_dropdown_tool_button_class_init (EggDropdownToolButtonClass *klass) -{ - GObjectClass *object_class; - GtkToolItemClass *toolitem_class; - GtkToolButtonClass *toolbutton_class; - - parent_class = g_type_class_peek_parent (klass); - - object_class = (GObjectClass *)klass; - toolitem_class = (GtkToolItemClass *)klass; - toolbutton_class = (GtkToolButtonClass *)klass; - - object_class->finalize = egg_dropdown_tool_button_finalize; - toolitem_class->set_tooltip = egg_dropdown_tool_button_set_tooltip; - - signals[MENU_ACTIVATED] = - g_signal_new ("menu-activated", - G_OBJECT_CLASS_TYPE (klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (EggDropdownToolButtonClass, menu_activated), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - g_type_class_add_private (object_class, sizeof (EggDropdownToolButtonPrivate)); -} - -static void -button_state_changed_cb (GtkWidget *widget, - GtkStateType previous_state, - EggDropdownToolButton *button) -{ - EggDropdownToolButtonPrivate *priv = button->priv; - GtkWidget *b; - GtkStateType state = GTK_WIDGET_STATE (widget); - - b = (widget == priv->arrow_button) ? priv->button : priv->arrow_button; - - g_signal_handlers_block_by_func (G_OBJECT (b), - G_CALLBACK (button_state_changed_cb), - button); - - if (state == GTK_STATE_PRELIGHT && - previous_state != GTK_STATE_ACTIVE) - { - gtk_widget_set_state (b, state); - } - else if (state == GTK_STATE_NORMAL) - { - gtk_widget_set_state (b, state); - } - else if (state == GTK_STATE_ACTIVE) - { - gtk_widget_set_state (b, GTK_STATE_NORMAL); - } - - g_signal_handlers_unblock_by_func (G_OBJECT (b), - G_CALLBACK (button_state_changed_cb), - button); -} - -static void -menu_position_func (GtkMenu *menu, - int *x, - int *y, - gboolean *push_in, - EggDropdownToolButton *button) -{ - EggDropdownToolButtonPrivate *priv; - GtkWidget *widget; - GtkRequisition menu_requisition; - int max_x, max_y; - - priv = button->priv; - widget = GTK_WIDGET (button); - - gdk_window_get_origin (widget->window, x, y); - gtk_widget_size_request (GTK_WIDGET (priv->menu), &menu_requisition); - - if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL) - *x += widget->allocation.x + - widget->allocation.width - - menu_requisition.width; - else - *x += widget->allocation.x; - - *y += widget->allocation.y + widget->allocation.height; - - /* Make sure we are on the screen. */ - max_x = MAX (0, gdk_screen_width () - menu_requisition.width); - max_y = MAX (0, gdk_screen_height () - menu_requisition.height); - - *x = CLAMP (*x, 0, max_x); - *y = CLAMP (*y, 0, max_y); -} - -static void -popup_menu_under_arrow (EggDropdownToolButton *button, - GdkEventButton *event) -{ - EggDropdownToolButtonPrivate *priv = button->priv; - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->arrow_button), TRUE); - - g_signal_emit (button, signals[MENU_ACTIVATED], 0); - - if (!priv->menu) - return; - - gtk_menu_popup (priv->menu, NULL, NULL, - (GtkMenuPositionFunc) menu_position_func, - button, - event ? event->button : 0, - event ? event->time : gtk_get_current_event_time ()); -} - -static gboolean -arrow_button_press_event_cb (GtkWidget *widget, - GdkEventButton *event, - EggDropdownToolButton *button) -{ - popup_menu_under_arrow (button, event); - - return TRUE; -} - -static gboolean -arrow_key_press_event_cb (GtkWidget *widget, - GdkEventKey *event, - EggDropdownToolButton *button) -{ - if (event->keyval == GDK_space || - event->keyval == GDK_KP_Space || - event->keyval == GDK_Return || - event->keyval == GDK_KP_Enter || - event->keyval == GDK_Menu) - { - popup_menu_under_arrow (button, NULL); - } - - return FALSE; -} - -/* right click on the button shows the menu */ -static gboolean -button_button_press_event_cb (GtkWidget *widget, - GdkEventButton *event, - EggDropdownToolButton *button) -{ - if (event->button == 3) - { - popup_menu_under_arrow (button, event); - - return TRUE; - } - - return FALSE; -} - -static void -button_popup_menu_cb (GtkWidget *widget, - EggDropdownToolButton *button) -{ - popup_menu_under_arrow (button, NULL); -} - -static void -egg_dropdown_tool_button_init (EggDropdownToolButton *button) -{ - GtkWidget *hbox; - GtkWidget *arrow; - GtkWidget *arrow_button; - GtkWidget *real_button; - - button->priv = EGG_DROPDOWN_TOOL_BUTTON_GET_PRIVATE (button); - - gtk_tool_item_set_homogeneous (GTK_TOOL_ITEM (button), FALSE); - - hbox = gtk_hbox_new (FALSE, 0); - - real_button = GTK_BIN (button)->child; - g_object_ref (real_button); - gtk_container_remove (GTK_CONTAINER (button), real_button); - gtk_container_add (GTK_CONTAINER (hbox), real_button); - g_object_unref (real_button); - - arrow_button = gtk_toggle_button_new (); - arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_OUT); - gtk_button_set_relief (GTK_BUTTON (arrow_button), GTK_RELIEF_NONE); - gtk_container_add (GTK_CONTAINER (arrow_button), arrow); - - gtk_box_pack_end (GTK_BOX (hbox), arrow_button, - FALSE, FALSE, 0); - gtk_widget_show_all (hbox); - - gtk_container_add (GTK_CONTAINER (button), hbox); - - button->priv->button = real_button; - button->priv->arrow_button = arrow_button; - - g_signal_connect (real_button, "state_changed", - G_CALLBACK (button_state_changed_cb), button); - g_signal_connect (real_button, "button_press_event", - G_CALLBACK (button_button_press_event_cb), button); - g_signal_connect (real_button, "popup_menu", - G_CALLBACK (button_popup_menu_cb), button); - g_signal_connect (arrow_button, "state_changed", - G_CALLBACK (button_state_changed_cb), button); - g_signal_connect (arrow_button, "key_press_event", - G_CALLBACK (arrow_key_press_event_cb), button); - g_signal_connect (arrow_button, "button_press_event", - G_CALLBACK (arrow_button_press_event_cb), button); -} - -static void -egg_dropdown_tool_button_finalize (GObject *object) -{ - EggDropdownToolButton *button; - - button = EGG_DROPDOWN_TOOL_BUTTON (object); - - if (button->priv->menu) - g_object_unref (button->priv->menu); - - G_OBJECT_CLASS (parent_class)->finalize (object); -} - -GtkToolItem * -egg_dropdown_tool_button_new (void) -{ - EggDropdownToolButton *button; - - button = g_object_new (EGG_TYPE_DROPDOWN_TOOL_BUTTON, - NULL); - - return GTK_TOOL_ITEM (button); -} - -GtkToolItem * -egg_dropdown_tool_button_new_from_stock (const gchar *stock_id) -{ - EggDropdownToolButton *button; - - g_return_val_if_fail (stock_id != NULL, NULL); - - button = g_object_new (EGG_TYPE_DROPDOWN_TOOL_BUTTON, - "stock_id", stock_id, - NULL); - - return GTK_TOOL_ITEM (button); -} - -/* Callback for the "deactivate" signal on the pop-up menu. - * This is used so that we unset the state of the toggle button - * when the pop-up menu disappears. - */ -static int -menu_deactivate_cb (GtkMenuShell *menu_shell, - EggDropdownToolButton *button) -{ - EggDropdownToolButtonPrivate *priv = button->priv; - - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->arrow_button), FALSE); - - return TRUE; -} - -void -egg_dropdown_tool_button_set_menu (EggDropdownToolButton *button, - GtkMenuShell *menu) -{ - EggDropdownToolButtonPrivate *priv; - - g_return_if_fail (EGG_IS_DROPDOWN_TOOL_BUTTON (button)); - g_return_if_fail (GTK_IS_MENU (menu)); - - priv = button->priv; - - if (priv->menu != GTK_MENU (menu)) - { - if (priv->menu) - g_object_unref (priv->menu); - - priv->menu = GTK_MENU (menu); - - g_object_ref (priv->menu); - gtk_object_sink (GTK_OBJECT (priv->menu)); - - g_signal_connect (button->priv->menu, "deactivate", - G_CALLBACK (menu_deactivate_cb), button); - } -} - -GtkMenuShell * -egg_dropdown_tool_button_get_menu (EggDropdownToolButton *button) -{ - return GTK_MENU_SHELL (button->priv->menu); -} - -void -egg_dropdown_tool_button_set_arrow_tooltip (EggDropdownToolButton *button, - GtkTooltips *tooltips, - const gchar *tip_text, - const gchar *tip_private) -{ - g_return_if_fail (EGG_IS_DROPDOWN_TOOL_BUTTON (button)); - - gtk_tooltips_set_tip (tooltips, button->priv->arrow_button, tip_text, tip_private); -} - diff --git a/lib/egg/eggdropdowntoolbutton.h b/lib/egg/eggdropdowntoolbutton.h deleted file mode 100644 index 2cf26e013..000000000 --- a/lib/egg/eggdropdowntoolbutton.h +++ /dev/null @@ -1,73 +0,0 @@ -/* GTK - The GIMP Toolkit - * - * Copyright (C) 2003 Ricardo Fernandez Pascual - * Copyright (C) 2004 Paolo Borelli - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef __EGG_DROPDOWN_TOOL_BUTTON_H__ -#define __EGG_DROPDOWN_TOOL_BUTTON_H__ - -#include <glib.h> -#include <gtk/gtkmenushell.h> -#include <gtk/gtktoolbutton.h> - -G_BEGIN_DECLS - -#define EGG_TYPE_DROPDOWN_TOOL_BUTTON (egg_dropdown_tool_button_get_type ()) -#define EGG_DROPDOWN_TOOL_BUTTON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EGG_TYPE_DROPDOWN_TOOL_BUTTON, EggDropdownToolButton)) -#define EGG_DROPDOWN_TOOL_BUTTON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EGG_TYPE_DROPDOWN_TOOL_BUTTON, EggDropdownToolButtonClass)) -#define EGG_IS_DROPDOWN_TOOL_BUTTON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EGG_TYPE_DROPDOWN_TOOL_BUTTON)) -#define EGG_IS_DROPDOWN_TOOL_BUTTON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EGG_TYPE_DROPDOWN_TOOL_BUTTON)) -#define EGG_DROPDOWN_TOOL_BUTTON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EGG_TYPE_DROPDOWN_TOOL_BUTTON, EggDropdownToolButtonClass)) - -typedef struct _EggDropdownToolButtonClass EggDropdownToolButtonClass; -typedef struct _EggDropdownToolButton EggDropdownToolButton; -typedef struct _EggDropdownToolButtonPrivate EggDropdownToolButtonPrivate; - -struct _EggDropdownToolButton -{ - GtkToolButton parent; - - /*< private >*/ - EggDropdownToolButtonPrivate *priv; -}; - -struct _EggDropdownToolButtonClass -{ - GtkToolButtonClass parent_class; - - void (*menu_activated) (EggDropdownToolButton *button); -}; - -GType egg_dropdown_tool_button_get_type (void); -GtkToolItem *egg_dropdown_tool_button_new (void); -GtkToolItem *egg_dropdown_tool_button_new_from_stock (const gchar *stock_id); - -void egg_dropdown_tool_button_set_menu (EggDropdownToolButton *button, - GtkMenuShell *menu); -GtkMenuShell *egg_dropdown_tool_button_get_menu (EggDropdownToolButton *button); - -void egg_dropdown_tool_button_set_arrow_tooltip (EggDropdownToolButton *button, - GtkTooltips *tooltips, - const gchar *tip_text, - const gchar *tip_private); - - -G_END_DECLS; - -#endif /* __EGG_DROPDOWN_TOOL_BUTTON_H__ */ diff --git a/src/ephy-navigation-action.c b/src/ephy-navigation-action.c index b186d3caa..8c1588621 100644 --- a/src/ephy-navigation-action.c +++ b/src/ephy-navigation-action.c @@ -28,7 +28,6 @@ #include "ephy-favicon-cache.h" #include "ephy-history.h" #include "ephy-embed-shell.h" -#include "eggdropdowntoolbutton.h" #include "ephy-debug.h" #include <gtk/gtkimage.h> @@ -36,6 +35,7 @@ #include <gtk/gtkimagemenuitem.h> #include <gtk/gtkmenushell.h> #include <gtk/gtkmenu.h> +#include <gtk/gtkmenutoolbutton.h> #define NTH_DATA_KEY "GoNTh" #define URL_DATA_KEY "GoURL" @@ -267,7 +267,7 @@ build_up_menu (EphyNavigationAction *action) } static void -menu_activated_cb (EggDropdownToolButton *button, +menu_activated_cb (GtkMenuToolButton *button, EphyNavigationAction *action) { GtkMenuShell *menu = NULL; @@ -288,7 +288,7 @@ menu_activated_cb (EggDropdownToolButton *button, break; } - egg_dropdown_tool_button_set_menu (button, menu); + gtk_menu_tool_button_set_menu (button, menu); } static void @@ -296,9 +296,15 @@ connect_proxy (GtkAction *action, GtkWidget *proxy) { LOG ("Connect navigation action proxy") - if (EGG_IS_DROPDOWN_TOOL_BUTTON (proxy)) + if (GTK_IS_MENU_TOOL_BUTTON (proxy)) { - g_signal_connect (proxy, "menu-activated", + GtkWidget *menu; + + /* set dummy menu so the arrow gets sensitive */ + menu = gtk_menu_new (); + gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (proxy), menu); + + g_signal_connect (proxy, "show-menu", G_CALLBACK (menu_activated_cb), action); } @@ -364,7 +370,7 @@ ephy_navigation_action_class_init (EphyNavigationActionClass *class) parent_class = g_type_class_peek_parent (class); - action_class->toolbar_item_type = EGG_TYPE_DROPDOWN_TOOL_BUTTON; + action_class->toolbar_item_type = GTK_TYPE_MENU_TOOL_BUTTON; action_class->connect_proxy = connect_proxy; g_object_class_install_property (object_class, |