X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=cut-n-paste%2Ftoolbar-editor%2Fegg-toolbar-editor.c;h=39c00710373b4508a7a2e58e5d763beeaa861919;hb=7c6d1cac2fbb30b0dfc324cfffd515e086dce67a;hp=0564c6fe704a7e6f7c5f9edffb6124c86ef10b04;hpb=184fd329e9a52df566130c7526f8612eb0a399ee;p=evince.git diff --git a/cut-n-paste/toolbar-editor/egg-toolbar-editor.c b/cut-n-paste/toolbar-editor/egg-toolbar-editor.c index 0564c6fe..39c00710 100644 --- a/cut-n-paste/toolbar-editor/egg-toolbar-editor.c +++ b/cut-n-paste/toolbar-editor/egg-toolbar-editor.c @@ -25,14 +25,6 @@ #include #include -#include -#include -#include -#include -#include -#include -#include -#include #include #include @@ -44,8 +36,7 @@ static const GtkTargetEntry source_drag_types[] = { {EGG_TOOLBAR_ITEM_TYPE, GTK_TARGET_SAME_APP, 0}, }; -static void egg_toolbar_editor_class_init (EggToolbarEditorClass *klass); -static void egg_toolbar_editor_init (EggToolbarEditor *t); + static void egg_toolbar_editor_finalize (GObject *object); static void update_editor_sheet (EggToolbarEditor *editor); @@ -56,7 +47,13 @@ enum PROP_TOOLBARS_MODEL }; -static GObjectClass *parent_class = NULL; +enum +{ + SIGNAL_HANDLER_ITEM_ADDED, + SIGNAL_HANDLER_ITEM_REMOVED, + SIGNAL_HANDLER_TOOLBAR_REMOVED, + SIGNAL_HANDLER_LIST_SIZE /* Array size */ +}; #define EGG_TOOLBAR_EDITOR_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EGG_TYPE_TOOLBAR_EDITOR, EggToolbarEditorPrivate)) @@ -69,34 +66,12 @@ struct EggToolbarEditorPrivate GtkWidget *scrolled_window; GList *actions_list; GList *factory_list; -}; - -GType -egg_toolbar_editor_get_type (void) -{ - static GType type = 0; - if (G_UNLIKELY (type == 0)) - { - static const GTypeInfo our_info = { - sizeof (EggToolbarEditorClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) egg_toolbar_editor_class_init, - NULL, - NULL, /* class_data */ - sizeof (EggToolbarEditor), - 0, /* n_preallocs */ - (GInstanceInitFunc) egg_toolbar_editor_init - }; - - type = g_type_register_static (GTK_TYPE_VBOX, - "EggToolbarEditor", - &our_info, 0); - } + /* These handlers need to be sanely disconnected when switching models */ + gulong sig_handlers[SIGNAL_HANDLER_LIST_SIZE]; +}; - return type; -} +G_DEFINE_TYPE (EggToolbarEditor, egg_toolbar_editor, GTK_TYPE_VBOX); static gint compare_items (gconstpointer a, @@ -164,21 +139,61 @@ toolbar_removed_cb (EggToolbarsModel *model, } static void +egg_toolbar_editor_disconnect_model (EggToolbarEditor *t) +{ + EggToolbarEditorPrivate *priv = t->priv; + EggToolbarsModel *model = priv->model; + gulong handler; + int i; + + for (i = 0; i < SIGNAL_HANDLER_LIST_SIZE; i++) + { + handler = priv->sig_handlers[i]; + + if (handler != 0) + { + if (g_signal_handler_is_connected (model, handler)) + { + g_signal_handler_disconnect (model, handler); + } + + priv->sig_handlers[i] = 0; + } + } +} + +void egg_toolbar_editor_set_model (EggToolbarEditor *t, EggToolbarsModel *model) { + EggToolbarEditorPrivate *priv; + g_return_if_fail (EGG_IS_TOOLBAR_EDITOR (t)); + g_return_if_fail (model != NULL); - t->priv->model = g_object_ref (model); - - update_editor_sheet (t); + priv = t->priv; + + if (priv->model) + { + if (G_UNLIKELY (priv->model == model)) return; - g_signal_connect_object (model, "item_added", - G_CALLBACK (item_added_or_removed_cb), t, 0); - g_signal_connect_object (model, "item_removed", - G_CALLBACK (item_added_or_removed_cb), t, 0); - g_signal_connect_object (model, "toolbar_removed", - G_CALLBACK (toolbar_removed_cb), t, 0); + egg_toolbar_editor_disconnect_model (t); + g_object_unref (priv->model); + } + + priv->model = g_object_ref (model); + + update_editor_sheet (t); + + priv->sig_handlers[SIGNAL_HANDLER_ITEM_ADDED] = + g_signal_connect_object (model, "item_added", + G_CALLBACK (item_added_or_removed_cb), t, 0); + priv->sig_handlers[SIGNAL_HANDLER_ITEM_REMOVED] = + g_signal_connect_object (model, "item_removed", + G_CALLBACK (item_added_or_removed_cb), t, 0); + priv->sig_handlers[SIGNAL_HANDLER_TOOLBAR_REMOVED] = + g_signal_connect_object (model, "toolbar_removed", + G_CALLBACK (toolbar_removed_cb), t, 0); } static void @@ -224,8 +239,6 @@ egg_toolbar_editor_class_init (EggToolbarEditorClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - parent_class = g_type_class_peek_parent (klass); - object_class->finalize = egg_toolbar_editor_finalize; object_class->set_property = egg_toolbar_editor_set_property; object_class->get_property = egg_toolbar_editor_get_property; @@ -245,7 +258,7 @@ egg_toolbar_editor_class_init (EggToolbarEditorClass *klass) "Toolbars Model", EGG_TYPE_TOOLBARS_MODEL, G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | - G_PARAM_CONSTRUCT_ONLY)); + G_PARAM_CONSTRUCT)); g_type_class_add_private (object_class, sizeof (EggToolbarEditorPrivate)); } @@ -262,13 +275,14 @@ egg_toolbar_editor_finalize (GObject *object) if (editor->priv->model) { + egg_toolbar_editor_disconnect_model (editor); g_object_unref (editor->priv->model); } g_list_free (editor->priv->actions_list); g_list_free (editor->priv->factory_list); - G_OBJECT_CLASS (parent_class)->finalize (object); + G_OBJECT_CLASS (egg_toolbar_editor_parent_class)->finalize (object); } GtkWidget * @@ -342,10 +356,12 @@ static void set_drag_cursor (GtkWidget *widget) { GdkCursor *cursor; + GdkScreen *screen; - /* FIXME multihead */ - cursor = gdk_cursor_new (GDK_HAND2); - + screen = gtk_widget_get_screen (widget); + + cursor = gdk_cursor_new_for_display (gdk_screen_get_display (screen), + GDK_HAND2); gdk_window_set_cursor (widget->window, cursor); gdk_cursor_unref (cursor); } @@ -362,12 +378,43 @@ event_box_realize_cb (GtkWidget *widget, GtkImage *icon) { gchar *stock_id; GdkPixbuf *pixbuf; + gtk_image_get_stock (icon, &stock_id, NULL); pixbuf = gtk_widget_render_icon (widget, stock_id, GTK_ICON_SIZE_LARGE_TOOLBAR, NULL); gtk_drag_source_set_icon_pixbuf (widget, pixbuf); g_object_unref (pixbuf); } + else if (type == GTK_IMAGE_ICON_NAME) + { + const gchar *icon_name; + GdkScreen *screen; + GtkIconTheme *icon_theme; + GtkSettings *settings; + gint width, height; + GdkPixbuf *pixbuf; + + gtk_image_get_icon_name (icon, &icon_name, NULL); + screen = gtk_widget_get_screen (widget); + icon_theme = gtk_icon_theme_get_for_screen (screen); + settings = gtk_settings_get_for_screen (screen); + + if (!gtk_icon_size_lookup_for_settings (settings, + GTK_ICON_SIZE_LARGE_TOOLBAR, + &width, &height)) + { + width = height = 24; + } + + pixbuf = gtk_icon_theme_load_icon (icon_theme, icon_name, + MIN (width, height), 0, NULL); + if (G_UNLIKELY (!pixbuf)) + return; + + gtk_drag_source_set_icon_pixbuf (widget, pixbuf); + g_object_unref (pixbuf); + + } else if (type == GTK_IMAGE_PIXBUF) { GdkPixbuf *pixbuf = gtk_image_get_pixbuf (icon); @@ -427,8 +474,7 @@ editor_create_item_from_name (EggToolbarEditor *editor, { GtkWidget *item; const char *item_name; - const char *stock_id; - const char *short_label; + char *short_label; const char *collate_key; if (strcmp (name, "_separator") == 0) @@ -437,36 +483,42 @@ editor_create_item_from_name (EggToolbarEditor *editor, icon = _egg_editable_toolbar_new_separator_image (); short_label = _("Separator"); - item_name = strdup (name); + item_name = g_strdup (name); collate_key = g_utf8_collate_key (short_label, -1); item = editor_create_item (editor, GTK_IMAGE (icon), short_label, drag_action); } else { - GValue value = { 0, }; GtkAction *action; GtkWidget *icon; + char *stock_id, *icon_name = NULL; action = find_action (editor, name); g_return_val_if_fail (action != NULL, NULL); - g_value_init (&value, G_TYPE_STRING); - g_object_get_property (G_OBJECT (action), "stock_id", &value); - stock_id = g_value_get_string (&value); - icon = gtk_image_new_from_stock (stock_id ? stock_id : GTK_STOCK_DND, - GTK_ICON_SIZE_LARGE_TOOLBAR); - g_value_unset (&value); - - g_value_init (&value, G_TYPE_STRING); - g_object_get_property (G_OBJECT (action), "short_label", &value); - short_label = g_value_get_string (&value); + g_object_get (action, + "icon-name", &icon_name, + "stock-id", &stock_id, + "short-label", &short_label, + NULL); - item_name = strdup (name); + /* This is a workaround to catch named icons. */ + if (icon_name) + icon = gtk_image_new_from_icon_name (icon_name, + GTK_ICON_SIZE_LARGE_TOOLBAR); + else + icon = gtk_image_new_from_stock (stock_id ? stock_id : GTK_STOCK_DND, + GTK_ICON_SIZE_LARGE_TOOLBAR); + + item_name = g_strdup (name); collate_key = g_utf8_collate_key (short_label, -1); item = editor_create_item (editor, GTK_IMAGE (icon), short_label, drag_action); - g_value_unset (&value); + + g_free (short_label); + g_free (stock_id); + g_free (icon_name); } g_object_set_data_full (G_OBJECT (item), "egg-collate-key",