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-editable-toolbar.c;h=9193120ad220288fda00cc5a1241373ef50b3240;hb=212d9a536bc60e711b779feb5e8aa33db654997d;hp=d65b7eb97086a6e2dd6c4cbbd9ea288b094620ef;hpb=ee149b4e364bd98778084dd3fe24b4ca7abed7ae;p=evince.git diff --git a/cut-n-paste/toolbar-editor/egg-editable-toolbar.c b/cut-n-paste/toolbar-editor/egg-editable-toolbar.c index d65b7eb9..9193120a 100644 --- a/cut-n-paste/toolbar-editor/egg-editable-toolbar.c +++ b/cut-n-paste/toolbar-editor/egg-editable-toolbar.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * $Id$ */ @@ -25,26 +25,7 @@ #include "egg-toolbars-model.h" #include "egg-toolbar-editor.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include #include #include @@ -85,10 +66,10 @@ struct _EggEditableToolbarPrivate guint edit_mode; gboolean save_hidden; GtkWidget *fixed_toolbar; - + GtkWidget *selected; GtkActionGroup *actions; - + guint visibility_id; GList *visibility_paths; GPtrArray *visibility_actions; @@ -119,7 +100,7 @@ get_dock_position (EggEditableToolbar *etoolbar, static int get_toolbar_position (EggEditableToolbar *etoolbar, GtkWidget *toolbar) { - return get_dock_position (etoolbar, toolbar->parent); + return get_dock_position (etoolbar, gtk_widget_get_parent (toolbar)); } static int @@ -196,14 +177,16 @@ drag_data_delete_cb (GtkWidget *widget, EggEditableToolbar *etoolbar) { int pos, toolbar_pos; + GtkWidget *parent; widget = gtk_widget_get_ancestor (widget, GTK_TYPE_TOOL_ITEM); g_return_if_fail (widget != NULL); g_return_if_fail (EGG_IS_EDITABLE_TOOLBAR (etoolbar)); - pos = gtk_toolbar_get_item_index (GTK_TOOLBAR (widget->parent), + parent = gtk_widget_get_parent (widget); + pos = gtk_toolbar_get_item_index (GTK_TOOLBAR (parent), GTK_TOOL_ITEM (widget)); - toolbar_pos = get_toolbar_position (etoolbar, widget->parent); + toolbar_pos = get_toolbar_position (etoolbar, parent); egg_toolbars_model_remove_item (etoolbar->priv->model, toolbar_pos, pos); @@ -216,12 +199,17 @@ drag_begin_cb (GtkWidget *widget, { GtkAction *action; gint flags; - + gtk_widget_hide (widget); - action = g_object_get_data (G_OBJECT (widget), "gtk-action"); +#if GTK_CHECK_VERSION (2, 16, 0) + action = gtk_activatable_get_related_action (GTK_ACTIVATABLE (widget)); +#else + action = gtk_widget_get_action (widget); +#endif + if (action == NULL) return; - + flags = egg_toolbars_model_get_name_flags (etoolbar->priv->model, gtk_action_get_name (action)); if (!(flags & EGG_TB_MODEL_NAME_INFINITE)) @@ -240,14 +228,19 @@ drag_end_cb (GtkWidget *widget, { GtkAction *action; gint flags; - + if (gtk_widget_get_parent (widget) != NULL) { gtk_widget_show (widget); - action = g_object_get_data (G_OBJECT (widget), "gtk-action"); +#if GTK_CHECK_VERSION (2, 16, 0) + action = gtk_activatable_get_related_action (GTK_ACTIVATABLE (widget)); +#else + action = gtk_widget_get_action (widget); +#endif + if (action == NULL) return; - + flags = egg_toolbars_model_get_name_flags (etoolbar->priv->model, gtk_action_get_name (action)); if (!(flags & EGG_TB_MODEL_NAME_INFINITE)) @@ -271,21 +264,23 @@ drag_data_get_cb (GtkWidget *widget, EggToolbarsModel *model; const char *name; char *data; + GdkAtom target; g_return_if_fail (EGG_IS_EDITABLE_TOOLBAR (etoolbar)); model = egg_editable_toolbar_get_model (etoolbar); - + name = g_object_get_data (G_OBJECT (widget), EGG_ITEM_NAME); if (name == NULL) { name = g_object_get_data (G_OBJECT (gtk_widget_get_parent (widget)), EGG_ITEM_NAME); g_return_if_fail (name != NULL); } - - data = egg_toolbars_model_get_data (model, selection_data->target, name); + + target = gtk_selection_data_get_target (selection_data); + data = egg_toolbars_model_get_data (model, target, name); if (data != NULL) { - gtk_selection_data_set (selection_data, selection_data->target, 8, (unsigned char *)data, strlen (data)); + gtk_selection_data_set (selection_data, target, 8, (unsigned char *)data, strlen (data)); g_free (data); } } @@ -307,7 +302,7 @@ move_item_cb (GtkAction *action, gdk_event_get_state (realevent, &event.state); gdk_event_get_coords (realevent, &event.x, &event.y); gdk_event_get_root_coords (realevent, &event.x_root, &event.y_root); - + gtk_drag_begin (toolitem, list, GDK_ACTION_MOVE, 1, (GdkEvent *)&event); gtk_target_list_unref (list); } @@ -317,10 +312,11 @@ remove_item_cb (GtkAction *action, EggEditableToolbar *etoolbar) { GtkWidget *toolitem = gtk_widget_get_ancestor (egg_editable_toolbar_get_selected (etoolbar), GTK_TYPE_TOOL_ITEM); + GtkWidget *parent = gtk_widget_get_parent (toolitem); int pos, toolbar_pos; - - toolbar_pos = get_toolbar_position (etoolbar, toolitem->parent); - pos = gtk_toolbar_get_item_index (GTK_TOOLBAR (toolitem->parent), + + toolbar_pos = get_toolbar_position (etoolbar, parent); + pos = gtk_toolbar_get_item_index (GTK_TOOLBAR (parent), GTK_TOOL_ITEM (toolitem)); egg_toolbars_model_remove_item (etoolbar->priv->model, @@ -362,11 +358,11 @@ popup_context_menu_cb (GtkWidget *toolbar, if (etoolbar->priv->popup_path != NULL) { GtkMenu *menu; - + egg_editable_toolbar_set_selected (etoolbar, toolbar); g_object_notify (G_OBJECT (etoolbar), "selected"); - - menu = GTK_MENU (gtk_ui_manager_get_widget (etoolbar->priv->manager, + + menu = GTK_MENU (gtk_ui_manager_get_widget (etoolbar->priv->manager, etoolbar->priv->popup_path)); g_return_if_fail (menu != NULL); gtk_menu_popup (menu, NULL, NULL, NULL, NULL, button_number, gtk_get_current_event_time ()); @@ -384,21 +380,21 @@ button_press_event_cb (GtkWidget *widget, if (event->button == 3 && etoolbar->priv->popup_path != NULL) { GtkMenu *menu; - + egg_editable_toolbar_set_selected (etoolbar, widget); g_object_notify (G_OBJECT (etoolbar), "selected"); - - menu = GTK_MENU (gtk_ui_manager_get_widget (etoolbar->priv->manager, + + menu = GTK_MENU (gtk_ui_manager_get_widget (etoolbar->priv->manager, etoolbar->priv->popup_path)); g_return_val_if_fail (menu != NULL, FALSE); gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event->button, event->time); g_signal_connect_object (menu, "selection-done", G_CALLBACK (popup_context_deactivate), etoolbar, 0); - + return TRUE; } - + return FALSE; } @@ -407,19 +403,19 @@ configure_item_sensitivity (GtkToolItem *item, EggEditableToolbar *etoolbar) { GtkAction *action; char *name; - + name = g_object_get_data (G_OBJECT (item), EGG_ITEM_NAME); action = name ? find_action (etoolbar, name) : NULL; - + if (action) { g_object_notify (G_OBJECT (action), "sensitive"); } gtk_tool_item_set_use_drag_window (item, - (etoolbar->priv->edit_mode > 0) || + (etoolbar->priv->edit_mode > 0) || GTK_IS_SEPARATOR_TOOL_ITEM (item)); - + } static void @@ -428,8 +424,9 @@ configure_item_cursor (GtkToolItem *item, { EggEditableToolbarPrivate *priv = etoolbar->priv; GtkWidget *widget = GTK_WIDGET (item); + GdkWindow *window = gtk_widget_get_window (widget); - if (widget->window != NULL) + if (window != NULL) { if (priv->edit_mode > 0) { @@ -438,10 +435,10 @@ configure_item_cursor (GtkToolItem *item, GdkPixbuf *pixbuf = NULL; screen = gtk_widget_get_screen (GTK_WIDGET (etoolbar)); - + cursor = gdk_cursor_new_for_display (gdk_screen_get_display (screen), GDK_HAND2); - gdk_window_set_cursor (widget->window, cursor); + gdk_window_set_cursor (window, cursor); gdk_cursor_unref (cursor); gtk_drag_source_set (widget, GDK_BUTTON1_MASK, dest_drag_types, @@ -489,7 +486,7 @@ configure_item_cursor (GtkToolItem *item, MIN (width, height), 0, NULL); } else if (stock_id) - { + { pixbuf = gtk_widget_render_icon (widget, stock_id, GTK_ICON_SIZE_LARGE_TOOLBAR, NULL); } @@ -507,7 +504,7 @@ configure_item_cursor (GtkToolItem *item, } else { - gdk_window_set_cursor (GTK_WIDGET(item)->window, NULL); + gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET(item)), NULL); } } } @@ -516,9 +513,14 @@ configure_item_cursor (GtkToolItem *item, static void configure_item_tooltip (GtkToolItem *item) { - GtkAction *action = g_object_get_data (G_OBJECT (item), - "gtk-action"); - + GtkAction *action; + +#if GTK_CHECK_VERSION (2, 16, 0) + action = gtk_activatable_get_related_action (GTK_ACTIVATABLE (item)); +#else + action = gtk_widget_get_action (GTK_WIDGET (item)); +#endif + if (action != NULL) { g_object_notify (G_OBJECT (action), "tooltip"); @@ -539,19 +541,19 @@ connect_widget_signals (GtkWidget *proxy, EggEditableToolbar *etoolbar) if (GTK_IS_TOOL_ITEM (proxy)) { g_signal_connect_object (proxy, "drag_begin", - G_CALLBACK (drag_begin_cb), + G_CALLBACK (drag_begin_cb), etoolbar, 0); g_signal_connect_object (proxy, "drag_end", G_CALLBACK (drag_end_cb), etoolbar, 0); g_signal_connect_object (proxy, "drag_data_get", - G_CALLBACK (drag_data_get_cb), + G_CALLBACK (drag_data_get_cb), etoolbar, 0); g_signal_connect_object (proxy, "drag_data_delete", G_CALLBACK (drag_data_delete_cb), etoolbar, 0); } - + if (GTK_IS_BUTTON (proxy) || GTK_IS_TOOL_ITEM (proxy)) { g_signal_connect_object (proxy, "button-press-event", @@ -561,7 +563,7 @@ connect_widget_signals (GtkWidget *proxy, EggEditableToolbar *etoolbar) } static void -action_sensitive_cb (GtkAction *action, +action_sensitive_cb (GtkAction *action, GParamSpec *pspec, GtkToolItem *item) { @@ -581,7 +583,7 @@ create_item_from_action (EggEditableToolbar *etoolbar, GtkToolItem *item; g_return_val_if_fail (name != NULL, NULL); - + if (strcmp (name, "_separator") == 0) { item = gtk_separator_tool_item_new (); @@ -590,7 +592,7 @@ create_item_from_action (EggEditableToolbar *etoolbar, { GtkAction *action = find_action (etoolbar, name); if (action == NULL) return NULL; - + item = GTK_TOOL_ITEM (gtk_action_create_tool_item (action)); /* Normally done on-demand by the GtkUIManager, but no @@ -598,7 +600,7 @@ create_item_from_action (EggEditableToolbar *etoolbar, */ gtk_action_set_accel_group (action, gtk_ui_manager_get_accel_group(etoolbar->priv->manager)); - + g_signal_connect_object (action, "notify::sensitive", G_CALLBACK (action_sensitive_cb), item, 0); } @@ -606,8 +608,8 @@ create_item_from_action (EggEditableToolbar *etoolbar, gtk_widget_show (GTK_WIDGET (item)); g_object_set_data_full (G_OBJECT (item), EGG_ITEM_NAME, - g_strdup (name), g_free); - + g_strdup (name), g_free); + return item; } @@ -646,15 +648,15 @@ toolbar_drag_data_received_cb (GtkToolbar *toolbar, * actually add a new item to the toolbar. */ - GdkAtom type = selection_data->type; - const char *data = (char *)selection_data->data; - + GdkAtom type = gtk_selection_data_get_data_type (selection_data); + const char *data = (char *)gtk_selection_data_get_data (selection_data); + int ipos = -1; char *name = NULL; gboolean used = FALSE; - + /* Find out where the drop is occuring, and the name of what is being dropped. */ - if (selection_data->length >= 0) + if (gtk_selection_data_get_length (selection_data) >= 0) { ipos = gtk_toolbar_get_drop_index (toolbar, x, y); name = egg_toolbars_model_get_name (etoolbar->priv->model, type, data, FALSE); @@ -668,7 +670,7 @@ toolbar_drag_data_received_cb (GtkToolbar *toolbar, if (etoolbar->priv->dnd_pending > 0) { etoolbar->priv->dnd_pending--; - + if (name != NULL && etoolbar->priv->dnd_toolbar == toolbar && !used) { etoolbar->priv->dnd_toolitem = create_item_from_action (etoolbar, name); @@ -681,25 +683,27 @@ toolbar_drag_data_received_cb (GtkToolbar *toolbar, gtk_toolbar_set_drop_highlight_item (toolbar, NULL, 0); etoolbar->priv->dnd_toolbar = NULL; etoolbar->priv->dnd_toolitem = NULL; - + /* If we don't have a name to use yet, try to create one. */ - if (name == NULL && selection_data->length >= 0) + if (name == NULL && gtk_selection_data_get_length (selection_data) >= 0) { name = egg_toolbars_model_get_name (etoolbar->priv->model, type, data, TRUE); } - + if (name != NULL && !used) { gint tpos = get_toolbar_position (etoolbar, GTK_WIDGET (toolbar)); egg_toolbars_model_add_item (etoolbar->priv->model, tpos, ipos, name); - gtk_drag_finish (context, TRUE, context->action == GDK_ACTION_MOVE, time); + gtk_drag_finish (context, TRUE, + gdk_drag_context_get_selected_action (context) == GDK_ACTION_MOVE, time); } else - { - gtk_drag_finish (context, FALSE, context->action == GDK_ACTION_MOVE, time); + { + gtk_drag_finish (context, FALSE, + gdk_drag_context_get_selected_action (context) == GDK_ACTION_MOVE, time); } } - + g_free (name); } @@ -719,7 +723,7 @@ toolbar_drag_drop_cb (GtkToolbar *toolbar, gtk_drag_get_data (GTK_WIDGET (toolbar), context, target, time); return TRUE; } - + return FALSE; } @@ -746,7 +750,7 @@ toolbar_drag_motion_cb (GtkToolbar *toolbar, etoolbar->priv->dnd_pending++; gtk_drag_get_data (GTK_WIDGET (toolbar), context, target, time); } - + /* If a highlight item is available, use it. */ else if (etoolbar->priv->dnd_toolitem) { @@ -755,7 +759,7 @@ toolbar_drag_motion_cb (GtkToolbar *toolbar, etoolbar->priv->dnd_toolitem, ipos); } - gdk_drag_status (context, context->suggested_action, time); + gdk_drag_status (context, gdk_drag_context_get_suggested_action (context), time); return TRUE; } @@ -788,7 +792,7 @@ configure_drag_dest (EggEditableToolbar *etoolbar, gtk_drag_dest_set (GTK_WIDGET (toolbar), 0, dest_drag_types, G_N_ELEMENTS (dest_drag_types), GDK_ACTION_MOVE | GDK_ACTION_COPY); - + /* Add any specialist drag-drop abilities. */ targets = gtk_drag_dest_get_target_list (GTK_WIDGET (toolbar)); list = egg_toolbars_model_get_types (etoolbar->priv->model); @@ -810,15 +814,15 @@ toggled_visibility_cb (GtkToggleAction *action, EggTbModelFlags flags; gboolean visible; gint i; - + visible = gtk_toggle_action_get_active (action); for (i = 0; i < priv->visibility_actions->len; i++) if (g_ptr_array_index (priv->visibility_actions, i) == action) break; - + g_return_if_fail (i < priv->visibility_actions->len); - - dock = get_dock_nth (etoolbar, i); + + dock = get_dock_nth (etoolbar, i); if (visible) { gtk_widget_show (dock); @@ -827,11 +831,11 @@ toggled_visibility_cb (GtkToggleAction *action, { gtk_widget_hide (dock); } - + if (priv->save_hidden) - { + { flags = egg_toolbars_model_get_flags (priv->model, i); - + if (visible) { flags &= ~(EGG_TB_MODEL_HIDDEN); @@ -840,7 +844,7 @@ toggled_visibility_cb (GtkToggleAction *action, { flags |= (EGG_TB_MODEL_HIDDEN); } - + egg_toolbars_model_set_flags (priv->model, i, flags); } } @@ -856,8 +860,8 @@ toolbar_visibility_refresh (EggEditableToolbar *etoolbar) gboolean showing; char action_name[40]; char *action_label; - char *tmp; - + char *tmp; + if (priv == NULL || priv->model == NULL || priv->manager == NULL || priv->visibility_paths == NULL || priv->actions == NULL) { @@ -868,16 +872,20 @@ toolbar_visibility_refresh (EggEditableToolbar *etoolbar) { priv->visibility_actions = g_ptr_array_new (); } - + if (priv->visibility_id != 0) { gtk_ui_manager_remove_ui (priv->manager, priv->visibility_id); - } - + } + priv->visibility_id = gtk_ui_manager_new_merge_id (priv->manager); - + +#if GTK_CHECK_VERSION(2,20,0) + showing = gtk_widget_get_visible (GTK_WIDGET (etoolbar)); +#else showing = GTK_WIDGET_VISIBLE (etoolbar); - +#endif + n_toolbars = egg_toolbars_model_n_toolbars (priv->model); for (i = 0; i < n_toolbars; i++) { @@ -919,7 +927,7 @@ toolbar_visibility_refresh (EggEditableToolbar *etoolbar) { g_string_append (string, " ..."); } - + tmp = g_string_free (string, FALSE); for (j = 0, k = 0; tmp[j]; j++) { @@ -937,9 +945,9 @@ toolbar_visibility_refresh (EggEditableToolbar *etoolbar) * please remove. */ action_label = g_strdup_printf (_("Show “_%s”"), tmp); g_free (tmp); - + sprintf(action_name, "ToolbarToggle%d", i); - + if (i >= priv->visibility_actions->len) { action = gtk_toggle_action_new (action_name, action_label, NULL, NULL); @@ -955,24 +963,29 @@ toolbar_visibility_refresh (EggEditableToolbar *etoolbar) g_object_set (action, "label", action_label, NULL); } - gtk_action_set_visible (GTK_ACTION (action), (egg_toolbars_model_get_flags (priv->model, i) + gtk_action_set_visible (GTK_ACTION (action), (egg_toolbars_model_get_flags (priv->model, i) & EGG_TB_MODEL_NOT_REMOVABLE) == 0); gtk_action_set_sensitive (GTK_ACTION (action), showing); +#if GTK_CHECK_VERSION(2,20,0) + gtk_toggle_action_set_active (action, gtk_widget_get_visible + (get_dock_nth (etoolbar, i))); +#else gtk_toggle_action_set_active (action, GTK_WIDGET_VISIBLE (get_dock_nth (etoolbar, i))); - +#endif + for (list = priv->visibility_paths; list != NULL; list = g_list_next (list)) { gtk_ui_manager_add_ui (priv->manager, priv->visibility_id, (const char *)list->data, action_name, action_name, GTK_UI_MANAGER_MENUITEM, FALSE); } - + g_free (action_label); } - + gtk_ui_manager_ensure_update (priv->manager); - + while (i < priv->visibility_actions->len) { action = g_ptr_array_index (priv->visibility_actions, i); @@ -995,7 +1008,7 @@ create_dock (EggEditableToolbar *etoolbar) gtk_box_pack_start (GTK_BOX (hbox), toolbar, TRUE, TRUE, 0); g_signal_connect (toolbar, "drag_drop", - G_CALLBACK (toolbar_drag_drop_cb), etoolbar); + G_CALLBACK (toolbar_drag_drop_cb), etoolbar); g_signal_connect (toolbar, "drag_motion", G_CALLBACK (toolbar_drag_motion_cb), etoolbar); g_signal_connect (toolbar, "drag_leave", @@ -1007,7 +1020,7 @@ create_dock (EggEditableToolbar *etoolbar) G_CALLBACK (popup_context_menu_cb), etoolbar); configure_drag_dest (etoolbar, GTK_TOOLBAR (toolbar)); - + return hbox; } @@ -1082,7 +1095,7 @@ unparent_fixed (EggEditableToolbar *etoolbar) toolbar = etoolbar->priv->fixed_toolbar; dock = get_dock_nth (etoolbar, 0); - if (dock && toolbar->parent != NULL) + if (dock && gtk_widget_get_parent (toolbar) != NULL) { gtk_container_remove (GTK_CONTAINER (dock), toolbar); } @@ -1097,12 +1110,12 @@ update_fixed (EggEditableToolbar *etoolbar) toolbar = etoolbar->priv->fixed_toolbar; dock = get_dock_nth (etoolbar, 0); - if (dock && toolbar && toolbar->parent == NULL) + if (dock && toolbar && gtk_widget_get_parent (toolbar) == NULL) { gtk_box_pack_end (GTK_BOX (dock), toolbar, FALSE, TRUE, 0); gtk_widget_show (toolbar); - + gtk_widget_set_size_request (dock, -1, -1); gtk_widget_queue_resize_no_redraw (dock); } @@ -1126,7 +1139,7 @@ toolbar_added_cb (EggToolbarsModel *model, gtk_box_reorder_child (GTK_BOX (etoolbar), dock, position); gtk_widget_show_all (dock); - + update_fixed (etoolbar); toolbar_visibility_refresh (etoolbar); @@ -1148,7 +1161,7 @@ toolbar_removed_cb (EggToolbarsModel *model, gtk_widget_destroy (dock); update_fixed (etoolbar); - + toolbar_visibility_refresh (etoolbar); } @@ -1165,14 +1178,14 @@ item_added_cb (EggToolbarsModel *model, toolbar = get_toolbar_nth (etoolbar, tpos); item = create_item_from_position (etoolbar, tpos, ipos); if (item == NULL) return; - + gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, ipos); - + connect_widget_signals (GTK_WIDGET (item), etoolbar); configure_item_tooltip (item); configure_item_cursor (item, etoolbar); configure_item_sensitivity (item, etoolbar); - + dock = get_dock_nth (etoolbar, tpos); gtk_widget_set_size_request (dock, -1, -1); gtk_widget_queue_resize_no_redraw (dock); @@ -1187,7 +1200,7 @@ item_removed_cb (EggToolbarsModel *model, EggEditableToolbar *etoolbar) { EggEditableToolbarPrivate *priv = etoolbar->priv; - + GtkWidget *toolbar; GtkWidget *item; @@ -1236,7 +1249,7 @@ egg_editable_toolbar_build (EggEditableToolbar *etoolbar) if (item) { gtk_toolbar_insert (GTK_TOOLBAR (toolbar), item, l); - + connect_widget_signals (GTK_WIDGET (item), etoolbar); configure_item_tooltip (item); configure_item_sensitivity (item, etoolbar); @@ -1342,7 +1355,7 @@ egg_editable_toolbar_init (EggEditableToolbar *etoolbar) priv = etoolbar->priv = EGG_EDITABLE_TOOLBAR_GET_PRIVATE (etoolbar); priv->save_hidden = TRUE; - + g_signal_connect (etoolbar, "notify::visible", G_CALLBACK (toolbar_visibility_refresh), NULL); } @@ -1405,7 +1418,7 @@ egg_editable_toolbar_set_ui_manager (EggEditableToolbar *etoolbar, { "RemoveToolbar", GTK_STOCK_DELETE, N_("_Delete Toolbar"), NULL, N_("Remove the selected toolbar"), G_CALLBACK (remove_toolbar_cb) }, }; - + etoolbar->priv->manager = g_object_ref (manager); etoolbar->priv->actions = gtk_action_group_new ("ToolbarActions"); @@ -1431,10 +1444,10 @@ egg_editable_toolbar_set_selected (EggEditableToolbar *etoolbar, gboolean editable; etoolbar->priv->selected = widget; - + toolbar = (widget != NULL) ? gtk_widget_get_ancestor (widget, GTK_TYPE_TOOLBAR) : NULL; toolitem = (widget != NULL) ? gtk_widget_get_ancestor (widget, GTK_TYPE_TOOL_ITEM) : NULL; - + if(toolbar != NULL) { gint tpos = get_toolbar_position (etoolbar, toolbar); @@ -1444,7 +1457,7 @@ egg_editable_toolbar_set_selected (EggEditableToolbar *etoolbar, { editable = FALSE; } - + gtk_action_set_visible (find_action (etoolbar, "RemoveToolbar"), (toolbar != NULL) && (etoolbar->priv->edit_mode > 0)); gtk_action_set_visible (find_action (etoolbar, "RemoveToolItem"), (toolitem != NULL) && editable); gtk_action_set_visible (find_action (etoolbar, "MoveToolItem"), (toolitem != NULL) && editable); @@ -1468,13 +1481,13 @@ set_edit_mode (EggEditableToolbar *etoolbar, priv->edit_mode--; } i *= priv->edit_mode; - + if (i == 0) { for (i = get_n_toolbars (etoolbar)-1; i >= 0; i--) { GtkWidget *toolbar; - + toolbar = get_toolbar_nth (etoolbar, i); n_items = gtk_toolbar_get_n_items (GTK_TOOLBAR (toolbar)); @@ -1483,13 +1496,13 @@ set_edit_mode (EggEditableToolbar *etoolbar, egg_toolbars_model_remove_toolbar (priv->model, i); } else - { + { for (l = 0; l < n_items; l++) { GtkToolItem *item; - + item = gtk_toolbar_get_nth_item (GTK_TOOLBAR (toolbar), l); - + configure_item_cursor (item, etoolbar); configure_item_sensitivity (item, etoolbar); } @@ -1729,27 +1742,6 @@ egg_editable_toolbar_set_fixed (EggEditableToolbar *etoolbar, } #define DEFAULT_ICON_HEIGHT 20 -#define DEFAULT_ICON_WIDTH 0 - -static void -fake_expose_widget (GtkWidget *widget, - GdkPixmap *pixmap) -{ - GdkWindow *tmp_window; - GdkEventExpose event; - - event.type = GDK_EXPOSE; - event.window = pixmap; - event.send_event = FALSE; - event.area = widget->allocation; - event.region = NULL; - event.count = 0; - - tmp_window = widget->window; - widget->window = pixmap; - gtk_widget_send_expose (widget, (GdkEvent *) &event); - widget->window = tmp_window; -} /* We should probably experiment some more with this. * Right now the rendered icon is pretty good for most @@ -1761,73 +1753,36 @@ new_pixbuf_from_widget (GtkWidget *widget) { GtkWidget *window; GdkPixbuf *pixbuf; - GtkRequisition requisition; - GtkAllocation allocation; - GdkPixmap *pixmap; - GdkVisual *visual; - gint icon_width; gint icon_height; GdkScreen *screen; - icon_width = DEFAULT_ICON_WIDTH; - screen = gtk_widget_get_screen (widget); if (!gtk_icon_size_lookup_for_settings (gtk_settings_get_for_screen (screen), GTK_ICON_SIZE_LARGE_TOOLBAR, - NULL, + NULL, &icon_height)) { icon_height = DEFAULT_ICON_HEIGHT; } - window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - + window = gtk_offscreen_window_new (); + /* Set the width to -1 as we want the separator to be as thin as possible. */ + gtk_widget_set_size_request (widget, -1, icon_height); + gtk_container_add (GTK_CONTAINER (window), widget); - gtk_widget_realize (window); - gtk_widget_show (widget); - gtk_widget_realize (widget); - gtk_widget_map (widget); - - /* Gtk will never set the width or height of a window to 0. So setting the width to - * 0 and than getting it will provide us with the minimum width needed to render - * the icon correctly, without any additional window background noise. - * This is needed mostly for pixmap based themes. - */ - gtk_window_set_default_size (GTK_WINDOW (window), icon_width, icon_height); - gtk_window_get_size (GTK_WINDOW (window),&icon_width, &icon_height); - - gtk_widget_size_request (window, &requisition); - allocation.x = 0; - allocation.y = 0; - allocation.width = icon_width; - allocation.height = icon_height; - gtk_widget_size_allocate (window, &allocation); - gtk_widget_size_request (window, &requisition); - - /* Create a pixmap */ - visual = gtk_widget_get_visual (window); - pixmap = gdk_pixmap_new (NULL, icon_width, icon_height, visual->depth); - gdk_drawable_set_colormap (GDK_DRAWABLE (pixmap), gtk_widget_get_colormap (window)); - - /* Draw the window */ - gtk_widget_ensure_style (window); - g_assert (window->style); - g_assert (window->style->font_desc); - - fake_expose_widget (window, pixmap); - fake_expose_widget (widget, pixmap); - - pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, icon_width, icon_height); - gdk_pixbuf_get_from_drawable (pixbuf, pixmap, NULL, 0, 0, 0, 0, icon_width, icon_height); + gtk_widget_show_all (window); + /* Process the waiting events to have the widget actually drawn */ + gdk_window_process_updates (gtk_widget_get_window (window), TRUE); + pixbuf = gtk_offscreen_window_get_pixbuf (GTK_OFFSCREEN_WINDOW (window)); gtk_widget_destroy (window); return pixbuf; } static GdkPixbuf * -new_separator_pixbuf () +new_separator_pixbuf (void) { GtkWidget *separator; GdkPixbuf *pixbuf;