diff options
-rw-r--r-- | lib/egg/egg-editable-toolbar.c | 296 | ||||
-rw-r--r-- | lib/egg/egg-toolbar-editor.c | 55 | ||||
-rw-r--r-- | lib/egg/egg-toolbars-model.c | 68 | ||||
-rw-r--r-- | lib/egg/egg-toolbars-model.h | 9 |
4 files changed, 186 insertions, 242 deletions
diff --git a/lib/egg/egg-editable-toolbar.c b/lib/egg/egg-editable-toolbar.c index adcab7f4a..0320c250d 100644 --- a/lib/egg/egg-editable-toolbar.c +++ b/lib/egg/egg-editable-toolbar.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * - * $Id: egg-editable-toolbar.c 925 2009-01-23 17:58:16Z xan $ + * $Id$ */ #include "config.h" @@ -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; @@ -176,8 +176,8 @@ drag_data_delete_cb (GtkWidget *widget, GdkDragContext *context, EggEditableToolbar *etoolbar) { - GtkWidget *parent; int pos, toolbar_pos; + GtkWidget *parent; widget = gtk_widget_get_ancestor (widget, GTK_TYPE_TOOL_ITEM); g_return_if_fail (widget != NULL); @@ -199,7 +199,7 @@ drag_begin_cb (GtkWidget *widget, { GtkAction *action; gint flags; - + gtk_widget_hide (widget); #if GTK_CHECK_VERSION (2, 16, 0) @@ -209,7 +209,7 @@ drag_begin_cb (GtkWidget *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)) @@ -228,7 +228,7 @@ drag_end_cb (GtkWidget *widget, { GtkAction *action; gint flags; - + if (gtk_widget_get_parent (widget) != NULL) { gtk_widget_show (widget); @@ -240,7 +240,7 @@ drag_end_cb (GtkWidget *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)) @@ -262,13 +262,13 @@ drag_data_get_cb (GtkWidget *widget, EggEditableToolbar *etoolbar) { EggToolbarsModel *model; - GdkAtom target; 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) { @@ -302,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); } @@ -312,10 +312,9 @@ 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; + GtkWidget *parent = gtk_widget_get_parent (toolitem); int pos, toolbar_pos; - parent = gtk_widget_get_parent (toolitem); toolbar_pos = get_toolbar_position (etoolbar, parent); pos = gtk_toolbar_get_item_index (GTK_TOOLBAR (parent), GTK_TOOL_ITEM (toolitem)); @@ -359,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 ()); @@ -381,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; } @@ -404,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 @@ -425,9 +424,8 @@ configure_item_cursor (GtkToolItem *item, { EggEditableToolbarPrivate *priv = etoolbar->priv; GtkWidget *widget = GTK_WIDGET (item); - GdkWindow *window; + GdkWindow *window = gtk_widget_get_window (widget); - window = gtk_widget_get_window (widget); if (window != NULL) { if (priv->edit_mode > 0) @@ -437,7 +435,7 @@ 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 (window, cursor); @@ -488,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); } @@ -506,7 +504,7 @@ configure_item_cursor (GtkToolItem *item, } else { - gdk_window_set_cursor (gtk_widget_get_window (GTK_WIDGET(item)), NULL); + gdk_window_set_cursor (window, NULL); } } } @@ -517,11 +515,11 @@ configure_item_tooltip (GtkToolItem *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 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) { @@ -543,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", @@ -565,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) { @@ -585,16 +583,17 @@ 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 (); + gtk_widget_show (GTK_WIDGET (item)); } else { 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 @@ -602,16 +601,14 @@ 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); } - 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; } @@ -651,16 +648,14 @@ toolbar_drag_data_received_cb (GtkToolbar *toolbar, */ GdkAtom type = gtk_selection_data_get_data_type (selection_data); - const char *data = (char *) gtk_selection_data_get_data (selection_data); - + const char *data = (char *)gtk_selection_data_get_data (selection_data); + int ipos = -1; - gint selection_data_length; char *name = NULL; gboolean used = FALSE; - selection_data_length = gtk_selection_data_get_length (selection_data); /* 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); @@ -674,7 +669,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); @@ -687,13 +682,13 @@ 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)); @@ -701,11 +696,11 @@ toolbar_drag_data_received_cb (GtkToolbar *toolbar, gtk_drag_finish (context, TRUE, gdk_drag_context_get_selected_action (context) == GDK_ACTION_MOVE, time); } else - { + { gtk_drag_finish (context, FALSE, gdk_drag_context_get_selected_action (context) == GDK_ACTION_MOVE, time); } } - + g_free (name); } @@ -725,7 +720,7 @@ toolbar_drag_drop_cb (GtkToolbar *toolbar, gtk_drag_get_data (GTK_WIDGET (toolbar), context, target, time); return TRUE; } - + return FALSE; } @@ -752,7 +747,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) { @@ -794,7 +789,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); @@ -816,15 +811,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); @@ -833,11 +828,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); @@ -846,7 +841,7 @@ toggled_visibility_cb (GtkToggleAction *action, { flags |= (EGG_TB_MODEL_HIDDEN); } - + egg_toolbars_model_set_flags (priv->model, i, flags); } } @@ -862,8 +857,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) { @@ -874,16 +869,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++) { @@ -925,7 +924,7 @@ toolbar_visibility_refresh (EggEditableToolbar *etoolbar) { g_string_append (string, " ..."); } - + tmp = g_string_free (string, FALSE); for (j = 0, k = 0; tmp[j]; j++) { @@ -943,9 +942,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); @@ -961,24 +960,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); - gtk_toggle_action_set_active (action, - gtk_widget_get_visible (get_dock_nth (etoolbar, i))); - +#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); @@ -1001,7 +1005,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", @@ -1013,7 +1017,7 @@ create_dock (EggEditableToolbar *etoolbar) G_CALLBACK (popup_context_menu_cb), etoolbar); configure_drag_dest (etoolbar, GTK_TOOLBAR (toolbar)); - + return hbox; } @@ -1088,7 +1092,7 @@ unparent_fixed (EggEditableToolbar *etoolbar) toolbar = etoolbar->priv->fixed_toolbar; dock = get_dock_nth (etoolbar, 0); - if (dock && (gtk_widget_get_parent (toolbar) != NULL)) + if (dock && gtk_widget_get_parent (toolbar) != NULL) { gtk_container_remove (GTK_CONTAINER (dock), toolbar); } @@ -1103,12 +1107,12 @@ update_fixed (EggEditableToolbar *etoolbar) toolbar = etoolbar->priv->fixed_toolbar; dock = get_dock_nth (etoolbar, 0); - if (dock && toolbar && (gtk_widget_get_parent (toolbar) == 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); } @@ -1132,7 +1136,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); @@ -1154,7 +1158,7 @@ toolbar_removed_cb (EggToolbarsModel *model, gtk_widget_destroy (dock); update_fixed (etoolbar); - + toolbar_visibility_refresh (etoolbar); } @@ -1171,14 +1175,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); @@ -1193,7 +1197,7 @@ item_removed_cb (EggToolbarsModel *model, EggEditableToolbar *etoolbar) { EggEditableToolbarPrivate *priv = etoolbar->priv; - + GtkWidget *toolbar; GtkWidget *item; @@ -1242,7 +1246,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); @@ -1348,7 +1352,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); } @@ -1411,7 +1415,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"); @@ -1437,10 +1441,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); @@ -1450,7 +1454,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); @@ -1474,13 +1478,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)); @@ -1489,13 +1493,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); } @@ -1735,27 +1739,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; - gtk_widget_get_allocation (widget, &event.area); - event.region = NULL; - event.count = 0; - - tmp_window = gtk_widget_get_window (widget); - gtk_widget_set_window (widget, pixmap); - gtk_widget_send_expose (widget, (GdkEvent *) &event); - gtk_widget_set_window (widget, tmp_window); -} /* We should probably experiment some more with this. * Right now the rendered icon is pretty good for most @@ -1767,68 +1750,29 @@ new_pixbuf_from_widget (GtkWidget *widget) { GtkWidget *window; GdkPixbuf *pixbuf; - GtkRequisition requisition; - GtkAllocation allocation; - GtkStyle *style; - 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, gdk_visual_get_depth (visual)); - gdk_drawable_set_colormap (GDK_DRAWABLE (pixmap), gtk_widget_get_colormap (window)); - - /* Draw the window */ - gtk_widget_ensure_style (window); - style = gtk_widget_get_style (window); - g_assert (style); - g_assert (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; diff --git a/lib/egg/egg-toolbar-editor.c b/lib/egg/egg-toolbar-editor.c index 04810d7ad..9763342c4 100644 --- a/lib/egg/egg-toolbar-editor.c +++ b/lib/egg/egg-toolbar-editor.c @@ -84,7 +84,7 @@ compare_items (gconstpointer a, "egg-collate-key"); char *key2 = g_object_get_data (G_OBJECT (item2), "egg-collate-key"); - + return strcmp (key1, key2); } @@ -178,14 +178,14 @@ egg_toolbar_editor_set_model (EggToolbarEditor *t, if (G_UNLIKELY (priv->model == model)) return; egg_toolbar_editor_disconnect_model (t); - g_object_unref (priv->model); + g_object_unref (priv->model); } priv->model = g_object_ref (model); update_editor_sheet (t); - - priv->sig_handlers[SIGNAL_HANDLER_ITEM_ADDED] = + + 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] = @@ -321,9 +321,8 @@ drag_data_get_cb (GtkWidget *widget, target = g_object_get_data (G_OBJECT (widget), "egg-item-name"); g_return_if_fail (target != NULL); - - gtk_selection_data_set (selection_data, - gtk_selection_data_get_target (selection_data), 8, + + gtk_selection_data_set (selection_data, gtk_selection_data_get_target (selection_data), 8, (const guchar *) target, strlen (target)); } @@ -358,9 +357,9 @@ set_drag_cursor (GtkWidget *widget) { GdkCursor *cursor; GdkScreen *screen; - + screen = gtk_widget_get_screen (widget); - + cursor = gdk_cursor_new_for_display (gdk_screen_get_display (screen), GDK_HAND2); gdk_window_set_cursor (gtk_widget_get_window (widget), cursor); @@ -477,16 +476,16 @@ editor_create_item_from_name (EggToolbarEditor *editor, const char *item_name; char *short_label; const char *collate_key; - + if (strcmp (name, "_separator") == 0) { GtkWidget *icon; - + icon = _egg_editable_toolbar_new_separator_image (); short_label = _("Separator"); item_name = g_strdup (name); collate_key = g_utf8_collate_key (short_label, -1); - item = editor_create_item (editor, GTK_IMAGE (icon), + item = editor_create_item (editor, GTK_IMAGE (icon), short_label, drag_action); } else @@ -494,7 +493,7 @@ editor_create_item_from_name (EggToolbarEditor *editor, GtkAction *action; GtkWidget *icon; char *stock_id, *icon_name = NULL; - + action = find_action (editor, name); g_return_val_if_fail (action != NULL, NULL); @@ -521,12 +520,12 @@ editor_create_item_from_name (EggToolbarEditor *editor, g_free (stock_id); g_free (icon_name); } - + g_object_set_data_full (G_OBJECT (item), "egg-collate-key", (gpointer) collate_key, g_free); g_object_set_data_full (G_OBJECT (item), "egg-item-name", (gpointer) item_name, g_free); - + return item; } @@ -538,10 +537,10 @@ append_table (GtkTable *table, GList *items, gint y, gint width) gint x = 0, height; GtkWidget *alignment; GtkWidget *item; - + height = g_list_length (items) / width + 1; gtk_table_resize (table, height, width); - + if (y > 0) { item = gtk_hseparator_new (); @@ -549,10 +548,10 @@ append_table (GtkTable *table, GList *items, gint y, gint width) gtk_container_add (GTK_CONTAINER (alignment), item); gtk_widget_show (alignment); gtk_widget_show (item); - + gtk_table_attach_defaults (table, alignment, 0, width, y-1, y+1); } - + for (; items != NULL; items = items->next) { item = items->data; @@ -560,7 +559,7 @@ append_table (GtkTable *table, GList *items, gint y, gint width) gtk_container_add (GTK_CONTAINER (alignment), item); gtk_widget_show (alignment); gtk_widget_show (item); - + if (x >= width) { x = 0; @@ -569,7 +568,7 @@ append_table (GtkTable *table, GList *items, gint y, gint width) gtk_table_attach_defaults (table, alignment, x, x+1, y, y+1); x++; } - + y++; } return y; @@ -585,7 +584,7 @@ update_editor_sheet (EggToolbarEditor *editor) GtkWidget *viewport; g_return_if_fail (EGG_IS_TOOLBAR_EDITOR (editor)); - + /* Create new table. */ table = gtk_table_new (0, 0, TRUE); editor->priv->table = table; @@ -595,7 +594,7 @@ update_editor_sheet (EggToolbarEditor *editor) gtk_drag_dest_set (table, GTK_DEST_DEFAULT_ALL, dest_drag_types, G_N_ELEMENTS (dest_drag_types), GDK_ACTION_MOVE | GDK_ACTION_COPY); - + /* Build two lists of items (one for copying, one for moving). */ items = egg_toolbars_model_get_name_avail (editor->priv->model); while (items->len > 0) @@ -603,10 +602,10 @@ update_editor_sheet (EggToolbarEditor *editor) GtkWidget *item; const char *name; gint flags; - + name = g_ptr_array_index (items, 0); g_ptr_array_remove_index_fast (items, 0); - + flags = egg_toolbars_model_get_name_flags (editor->priv->model, name); if ((flags & EGG_TB_MODEL_NAME_INFINITE) == 0) { @@ -626,11 +625,11 @@ update_editor_sheet (EggToolbarEditor *editor) y = 0; y = append_table (GTK_TABLE (table), to_move, y, 4); y = append_table (GTK_TABLE (table), to_copy, y, 4); - + g_list_free (to_move); g_list_free (to_copy); g_ptr_array_free (items, TRUE); - + /* Delete old table. */ viewport = gtk_bin_get_child (GTK_BIN (editor->priv->scrolled_window)); if (viewport) @@ -638,7 +637,7 @@ update_editor_sheet (EggToolbarEditor *editor) gtk_container_remove (GTK_CONTAINER (viewport), gtk_bin_get_child (GTK_BIN (viewport))); } - + /* Add table to window. */ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (editor->priv->scrolled_window), table); diff --git a/lib/egg/egg-toolbars-model.c b/lib/egg/egg-toolbars-model.c index fa19ec2a0..b9a5f4439 100644 --- a/lib/egg/egg-toolbars-model.c +++ b/lib/egg/egg-toolbars-model.c @@ -103,7 +103,7 @@ egg_toolbars_model_to_xml (EggToolbarsModel *model) node = xmlNewChild (tnode, NULL, (const xmlChar*) "separator", NULL); continue; } - + node = xmlNewChild (tnode, NULL, (const xmlChar*) "toolitem", NULL); xmlSetProp (node, (const xmlChar*) "name", (const xmlChar*) item->name); @@ -116,13 +116,13 @@ egg_toolbars_model_to_xml (EggToolbarsModel *model) { xmlNodePtr dnode; char *tmp; - + tmp = type->get_data (type, item->name); if (tmp != NULL) { dnode = xmlNewTextChild (node, NULL, (const xmlChar*) "data", (const xmlChar*) tmp); g_free (tmp); - + tmp = gdk_atom_name (type->type); xmlSetProp (dnode, (const xmlChar*) "type", (const xmlChar*) tmp); g_free (tmp); @@ -214,8 +214,8 @@ is_unique (EggToolbarsModel *model, { EggToolbarsItem *idata2; GNode *toolbar, *item; - - + + for(toolbar = g_node_first_child (model->priv->toolbars); toolbar != NULL; toolbar = g_node_next_sibling (toolbar)) { @@ -223,14 +223,14 @@ is_unique (EggToolbarsModel *model, item != NULL; item = g_node_next_sibling (item)) { idata2 = item->data; - + if (idata != idata2 && strcmp (idata->name, idata2->name) == 0) { return FALSE; } } } - + return TRUE; } @@ -291,7 +291,7 @@ toolbar_node_free (GNode *toolbar_node, EggToolbarsModel *model) g_node_children_foreach (toolbar_node, G_TRAVERSE_ALL, (GNodeForeachFunc) item_node_free, model); - + g_free (toolbar->name); g_free (toolbar); @@ -341,14 +341,14 @@ egg_toolbars_model_get_data (EggToolbarsModel *model, EggToolbarsItemType *t; char *data = NULL; GList *l; - + if (type == GDK_NONE || type == gdk_atom_intern (EGG_TOOLBAR_ITEM_TYPE, FALSE)) { g_return_val_if_fail (name != NULL, NULL); g_return_val_if_fail (*name != 0, NULL); return strdup (name); } - + for (l = model->priv->types; l != NULL; l = l->next) { t = l->data; @@ -358,7 +358,7 @@ egg_toolbars_model_get_data (EggToolbarsModel *model, if (data != NULL) break; } } - + return data; } @@ -371,14 +371,14 @@ egg_toolbars_model_get_name (EggToolbarsModel *model, EggToolbarsItemType *t; char *name = NULL; GList *l; - + if (type == GDK_NONE || type == gdk_atom_intern (EGG_TOOLBAR_ITEM_TYPE, FALSE)) { g_return_val_if_fail (data, NULL); g_return_val_if_fail (*data, NULL); return strdup (data); } - + if (create) { for (l = model->priv->types; name == NULL && l != NULL; l = l->next) @@ -387,7 +387,7 @@ egg_toolbars_model_get_name (EggToolbarsModel *model, if (t->type == type && t->new_name != NULL) name = t->new_name (t, data); } - + return name; } else @@ -398,9 +398,9 @@ egg_toolbars_model_get_name (EggToolbarsModel *model, if (t->type == type && t->get_name != NULL) name = t->get_name (t, data); } - + return name; - } + } } static gboolean @@ -471,20 +471,20 @@ parse_data_list (EggToolbarsModel *model, { xmlChar *type = xmlGetProp (child, (const xmlChar*) "type"); xmlChar *data = xmlNodeGetContent (child); - + if (type != NULL) { GdkAtom atom = gdk_atom_intern ((const char*) type, TRUE); name = egg_toolbars_model_get_name (model, atom, (const char*) data, create); } - + xmlFree (type); xmlFree (data); } - + child = child->next; } - + return name; } @@ -506,25 +506,25 @@ parse_item_list (EggToolbarsModel *model, { name = parse_data_list (model, child->children, TRUE); } - + /* If that fails, try to use the name. */ if (name == NULL) { xmlChar *type = xmlGetProp (child, (const xmlChar*) "type"); xmlChar *data = xmlGetProp (child, (const xmlChar*) "name"); GdkAtom atom = type ? gdk_atom_intern ((const char*) type, TRUE) : GDK_NONE; - + /* If an old format, try to use it. */ name = egg_toolbars_model_get_name (model, atom, (const char*) data, FALSE); if (name == NULL) { name = egg_toolbars_model_get_name (model, atom, (const char*) data, TRUE); } - + xmlFree (type); xmlFree (data); } - + if (name != NULL) { egg_toolbars_model_add_item (model, position, -1, name); @@ -573,7 +573,7 @@ parse_toolbars (EggToolbarsModel *model, xmlFree (string); egg_toolbars_model_set_flags (model, position, flags); - + parse_item_list (model, child->children, position); } @@ -612,7 +612,7 @@ parse_available_list (EggToolbarsModel *model, xmlNodePtr child) { gint flags; - + while (child) { if (xmlStrEqual (child->name, (const xmlChar*) "toolitem")) @@ -730,7 +730,7 @@ egg_toolbars_model_init (EggToolbarsModel *model) model->priv->toolbars = g_node_new (NULL); model->priv->flags = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); - egg_toolbars_model_set_name_flags (model, "_separator", + egg_toolbars_model_set_name_flags (model, "_separator", EGG_TB_MODEL_NAME_KNOWN | EGG_TB_MODEL_NAME_INFINITE); } @@ -839,22 +839,22 @@ egg_toolbars_model_delete_item (EggToolbarsModel *model, int tpos, ipos; g_return_if_fail (EGG_IS_TOOLBARS_MODEL (model)); - + toolbar = g_node_first_child (model->priv->toolbars); tpos = 0; - + while (toolbar != NULL) { item = g_node_first_child (toolbar); ipos = 0; - + /* Don't delete toolbars that were already empty */ if (item == NULL) { toolbar = g_node_next_sibling (toolbar); continue; } - + while (item != NULL) { next = g_node_next_sibling (item); @@ -870,10 +870,10 @@ egg_toolbars_model_delete_item (EggToolbarsModel *model, { ipos++; } - + item = next; } - + next = g_node_next_sibling (toolbar); tdata = toolbar->data; if (!(tdata->flags & EGG_TB_MODEL_NOT_REMOVABLE) && @@ -889,7 +889,7 @@ egg_toolbars_model_delete_item (EggToolbarsModel *model, { tpos++; } - + toolbar = next; } } diff --git a/lib/egg/egg-toolbars-model.h b/lib/egg/egg-toolbars-model.h index b93e7c1f7..baca4862c 100644 --- a/lib/egg/egg-toolbars-model.h +++ b/lib/egg/egg-toolbars-model.h @@ -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. - * + * * $Id$ */ @@ -22,6 +22,7 @@ #define EGG_TOOLBARS_MODEL_H #include <glib.h> +#include <glib-object.h> #include <gdk/gdk.h> G_BEGIN_DECLS @@ -97,19 +98,19 @@ typedef struct EggToolbarsItemType EggToolbarsItemType; struct EggToolbarsItemType { GdkAtom type; - + gboolean (* has_data) (EggToolbarsItemType *type, const char *name); char * (* get_data) (EggToolbarsItemType *type, const char *name); - + char * (* new_name) (EggToolbarsItemType *type, const char *data); char * (* get_name) (EggToolbarsItemType *type, const char *data); }; -GType egg_tb_model_flags_get_type (void); +GType egg_tb_model_flags_get_type (void); GType egg_toolbars_model_get_type (void); EggToolbarsModel *egg_toolbars_model_new (void); gboolean egg_toolbars_model_load_names (EggToolbarsModel *model, |