]> www.fi.muni.cz Git - evince.git/blobdiff - cut-n-paste/toolbar-editor/egg-editable-toolbar.c
toolbar-editor: Use gtk_widget_render_icon_pixbuf()
[evince.git] / cut-n-paste / toolbar-editor / egg-editable-toolbar.c
index 9ad940a27f890f1934809a4a95be8a95104d159a..fadfed8d66ce15e8e7718aba7e514606cb6216ed 100644 (file)
@@ -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$
  */
@@ -66,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;
@@ -100,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
@@ -177,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);
@@ -197,12 +199,17 @@ drag_begin_cb (GtkWidget          *widget,
 {
   GtkAction *action;
   gint flags;
-  
+
   gtk_widget_hide (widget);
 
+#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))
@@ -221,14 +228,19 @@ drag_end_cb (GtkWidget          *widget,
 {
   GtkAction *action;
   gint flags;
+
   if (gtk_widget_get_parent (widget) != NULL)
     {
       gtk_widget_show (widget);
 
+#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))
@@ -252,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);
     }
 }
@@ -288,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);
 }
@@ -298,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,
@@ -343,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 ());
@@ -365,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;
 }
 
@@ -388,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
@@ -409,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)
         {
@@ -419,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,
@@ -470,9 +486,9 @@ 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);
+                {
+                  pixbuf = gtk_widget_render_icon_pixbuf (widget, stock_id,
+                                                          GTK_ICON_SIZE_LARGE_TOOLBAR);
                 }
               g_free (icon_name);
               g_free (stock_id);
@@ -488,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);
         }
     }
 }
@@ -497,8 +513,14 @@ configure_item_cursor (GtkToolItem *item,
 static void
 configure_item_tooltip (GtkToolItem *item)
 {
-  GtkAction *action = gtk_widget_get_action (GTK_WIDGET (item));
-  
+  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");
@@ -519,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",
@@ -541,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)
 {
@@ -561,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 ();
@@ -570,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
@@ -578,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);
     }
@@ -586,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;
 }
 
@@ -626,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);
@@ -648,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);
@@ -661,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);
 }
 
@@ -699,7 +723,7 @@ toolbar_drag_drop_cb (GtkToolbar         *toolbar,
       gtk_drag_get_data (GTK_WIDGET (toolbar), context, target, time);
       return TRUE;
     }
-  
+
   return FALSE;
 }
 
@@ -726,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)
     {
@@ -735,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;
 }
@@ -768,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);
@@ -790,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);
@@ -807,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);
@@ -820,7 +844,7 @@ toggled_visibility_cb (GtkToggleAction *action,
        {
          flags |=  (EGG_TB_MODEL_HIDDEN);
        }
-      
+
       egg_toolbars_model_set_flags (priv->model, i, flags);
     }
 }
@@ -836,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)
     {
@@ -848,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++)
     {
@@ -899,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++)
       {
@@ -917,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);
@@ -935,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);
@@ -975,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",
@@ -987,7 +1020,7 @@ create_dock (EggEditableToolbar *etoolbar)
                    G_CALLBACK (popup_context_menu_cb), etoolbar);
 
   configure_drag_dest (etoolbar, GTK_TOOLBAR (toolbar));
-  
+
   return hbox;
 }
 
@@ -1062,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);
     }
@@ -1077,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);
     }
@@ -1106,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);
@@ -1128,7 +1161,7 @@ toolbar_removed_cb (EggToolbarsModel   *model,
   gtk_widget_destroy (dock);
 
   update_fixed (etoolbar);
-  
+
   toolbar_visibility_refresh (etoolbar);
 }
 
@@ -1145,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);
@@ -1167,7 +1200,7 @@ item_removed_cb (EggToolbarsModel   *model,
                 EggEditableToolbar *etoolbar)
 {
   EggEditableToolbarPrivate *priv = etoolbar->priv;
-  
+
   GtkWidget *toolbar;
   GtkWidget *item;
 
@@ -1216,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);
@@ -1322,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);
 }
@@ -1385,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");
@@ -1411,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);
@@ -1424,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);
@@ -1448,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));
 
@@ -1463,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);
                 }
@@ -1709,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
@@ -1741,66 +1753,29 @@ 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;