X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktoolbar.c;h=e4dbfa45eb2aa79e5cf54a8f223a9e3161b264ef;hb=e09957a47da9425cc26d1b33cb4e9cc3e92e9ac7;hp=5692b60bd52ad8c0d96a527fa24863d4b56754ae;hpb=5445b3d7eceef2b0c1a98f3bc5dbbaa51575ee27;p=~andy%2Fgtk diff --git a/gtk/gtktoolbar.c b/gtk/gtktoolbar.c index 5692b60bd..e4dbfa45e 100644 --- a/gtk/gtktoolbar.c +++ b/gtk/gtktoolbar.c @@ -17,9 +17,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ /* @@ -39,12 +37,14 @@ #include "gtkarrow.h" #include "gtkbindings.h" +#include "gtkcontainerprivate.h" #include "gtkimage.h" #include "gtklabel.h" -#include "gtkmainprivate.h" +#include "gtkmain.h" #include "gtkmarshalers.h" #include "gtkmenu.h" #include "gtkorientable.h" +#include "gtkorientableprivate.h" #include "gtkradiobutton.h" #include "gtkradiotoolbutton.h" #include "gtkseparatormenuitem.h" @@ -55,6 +55,8 @@ #include "gtkprivate.h" #include "gtkintl.h" #include "gtktypebuiltins.h" +#include "gtkwidgetpath.h" +#include "gtkwidgetprivate.h" /** @@ -82,8 +84,6 @@ typedef struct _ToolbarContent ToolbarContent; -#define DEFAULT_IPADDING 0 - #define DEFAULT_SPACE_SIZE 12 #define DEFAULT_SPACE_STYLE GTK_TOOLBAR_SPACE_LINE #define SPACE_LINE_DIVISION 10.0 @@ -120,8 +120,6 @@ struct _GtkToolbarPrivate GTimer *timer; - GtkWidgetPath *sibling_path; - gulong settings_connection; gint idle_id; @@ -233,6 +231,8 @@ static GtkWidgetPath * gtk_toolbar_get_path_for_child GtkWidget *child); static void gtk_toolbar_invalidate_order (GtkToolbar *toolbar); +static void gtk_toolbar_direction_changed (GtkWidget *widget, + GtkTextDirection previous_direction); static void gtk_toolbar_orientation_changed (GtkToolbar *toolbar, GtkOrientation orientation); static void gtk_toolbar_real_style_changed (GtkToolbar *toolbar, @@ -251,9 +251,7 @@ static gboolean gtk_toolbar_popup_menu (GtkWidget *toolbar static void gtk_toolbar_reconfigured (GtkToolbar *toolbar); static GtkReliefStyle get_button_relief (GtkToolbar *toolbar); -static gint get_internal_padding (GtkToolbar *toolbar); static gint get_max_child_expand (GtkToolbar *toolbar); -static GtkShadowType get_shadow_type (GtkToolbar *toolbar); /* methods on ToolbarContent 'class' */ static ToolbarContent *toolbar_content_new_tool_item (GtkToolbar *toolbar, @@ -398,6 +396,7 @@ gtk_toolbar_class_init (GtkToolbarClass *klass) widget_class->unmap = gtk_toolbar_unmap; widget_class->popup_menu = gtk_toolbar_popup_menu; widget_class->show_all = gtk_toolbar_show_all; + widget_class->direction_changed = gtk_toolbar_direction_changed; container_class->add = gtk_toolbar_add; container_class->remove = gtk_toolbar_remove; @@ -576,13 +575,22 @@ gtk_toolbar_class_init (GtkToolbarClass *klass) DEFAULT_SPACE_SIZE, GTK_PARAM_READABLE)); + /** + * GtkToolbar:internal-padding: + * + * Amount of border space between the toolbar shadow and the buttons. + * + * Deprecated: 3.6: Use the standard padding CSS property + * (through objects like #GtkStyleContext and #GtkCssProvider); the value + * of this style property is ignored. + */ gtk_widget_class_install_style_property (widget_class, g_param_spec_int ("internal-padding", P_("Internal padding"), P_("Amount of border space between the toolbar shadow and the buttons"), 0, G_MAXINT, - DEFAULT_IPADDING, + 0, GTK_PARAM_READABLE)); gtk_widget_class_install_style_property (widget_class, @@ -609,6 +617,15 @@ gtk_toolbar_class_init (GtkToolbarClass *klass) GTK_TYPE_RELIEF_STYLE, GTK_RELIEF_NONE, GTK_PARAM_READABLE)); + /** + * GtkToolbar:shadow-type: + * + * Style of bevel around the toolbar. + * + * Deprecated: 3.6: Use the standard border CSS property + * (through objects like #GtkStyleContext and #GtkCssProvider); the value + * of this style property is ignored. + */ gtk_widget_class_install_style_property (widget_class, g_param_spec_enum ("shadow-type", P_("Shadow type"), @@ -830,7 +847,7 @@ gtk_toolbar_realize (GtkWidget *widget) priv->event_window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); - gdk_window_set_user_data (priv->event_window, toolbar); + gtk_widget_register_window (widget, priv->event_window); } static void @@ -841,7 +858,7 @@ gtk_toolbar_unrealize (GtkWidget *widget) if (priv->event_window) { - gdk_window_set_user_data (priv->event_window, NULL); + gtk_widget_unregister_window (widget, priv->event_window); gdk_window_destroy (priv->event_window); priv->event_window = NULL; } @@ -856,16 +873,11 @@ gtk_toolbar_draw (GtkWidget *widget, GtkToolbar *toolbar = GTK_TOOLBAR (widget); GtkToolbarPrivate *priv = toolbar->priv; GtkStyleContext *context; - GtkStateFlags state; GList *list; guint border_width; border_width = gtk_container_get_border_width (GTK_CONTAINER (widget)); context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - - gtk_style_context_save (context); - gtk_style_context_set_state (context, state); gtk_render_background (context, cr, border_width, border_width, gtk_widget_get_allocated_width (widget) - 2 * border_width, @@ -885,11 +897,29 @@ gtk_toolbar_draw (GtkWidget *widget, priv->arrow_button, cr); - gtk_style_context_restore (context); - return FALSE; } +static void +get_widget_padding_and_border (GtkWidget *widget, + GtkBorder *padding) +{ + GtkStyleContext *context; + GtkStateFlags state; + GtkBorder tmp; + + context = gtk_widget_get_style_context (widget); + state = gtk_style_context_get_state (context); + + gtk_style_context_get_padding (context, state, padding); + gtk_style_context_get_border (context, state, &tmp); + + padding->top += tmp.top; + padding->right += tmp.right; + padding->bottom += tmp.bottom; + padding->left += tmp.left; +} + static void gtk_toolbar_size_request (GtkWidget *widget, GtkRequisition *requisition) @@ -904,7 +934,7 @@ gtk_toolbar_size_request (GtkWidget *widget, gint homogeneous_size; gint long_req; gint pack_front_size; - gint ipadding; + GtkBorder padding; guint border_width; GtkRequisition arrow_requisition; @@ -998,27 +1028,13 @@ gtk_toolbar_size_request (GtkWidget *widget, requisition->height = long_req; requisition->width = MAX (max_child_width, arrow_requisition.width); } - - /* Extra spacing */ - ipadding = get_internal_padding (toolbar); + /* Extra spacing */ border_width = gtk_container_get_border_width (GTK_CONTAINER (toolbar)); - requisition->width += 2 * (ipadding + border_width); - requisition->height += 2 * (ipadding + border_width); - - if (get_shadow_type (toolbar) != GTK_SHADOW_NONE) - { - GtkStyleContext *context; - GtkStateFlags state; - GtkBorder padding; + get_widget_padding_and_border (widget, &padding); - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - gtk_style_context_get_padding (context, state, &padding); - - requisition->width += padding.left + padding.right; - requisition->height += padding.top + padding.bottom; - } + requisition->width += 2 * border_width + padding.left + padding.right; + requisition->height += 2 * border_width + padding.top + padding.bottom; priv->button_maxw = max_homogeneous_child_width; priv->button_maxh = max_homogeneous_child_height; @@ -1246,13 +1262,11 @@ gtk_toolbar_begin_sliding (GtkToolbar *toolbar) GtkAllocation allocation; GtkWidget *widget = GTK_WIDGET (toolbar); GtkToolbarPrivate *priv = toolbar->priv; - GtkStyleContext *context; - GtkStateFlags state; - GtkBorder padding; GList *list; gint cur_x; gint cur_y; gint border_width; + GtkBorder padding; gboolean rtl; gboolean vertical; @@ -1270,14 +1284,13 @@ gtk_toolbar_begin_sliding (GtkToolbar *toolbar) priv->idle_id = gdk_threads_add_idle (slide_idle_handler, toolbar); gtk_widget_get_allocation (widget, &allocation); - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - gtk_style_context_get_padding (context, state, &padding); rtl = (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL); vertical = (priv->orientation == GTK_ORIENTATION_VERTICAL); - border_width = get_internal_padding (toolbar) + gtk_container_get_border_width (GTK_CONTAINER (toolbar)); - + + border_width = gtk_container_get_border_width (GTK_CONTAINER (toolbar)); + get_widget_padding_and_border (GTK_WIDGET (toolbar), &padding); + if (rtl) { cur_x = allocation.width - border_width - padding.right; @@ -1484,8 +1497,6 @@ gtk_toolbar_size_allocate (GtkWidget *widget, GtkAllocation *allocations; ItemState *new_states; GtkAllocation arrow_allocation; - GtkStyleContext *context; - GtkStateFlags state; GtkBorder padding; gint arrow_size; gint size, pos, short_size; @@ -1501,11 +1512,6 @@ gtk_toolbar_size_allocate (GtkWidget *widget, gboolean overflowing; gboolean size_changed; GtkAllocation item_area; - GtkShadowType shadow_type; - - context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - gtk_style_context_get_padding (context, state, &padding); gtk_widget_get_allocation (widget, &widget_allocation); size_changed = FALSE; @@ -1531,36 +1537,22 @@ gtk_toolbar_size_allocate (GtkWidget *widget, allocation->width - border_width * 2, allocation->height - border_width * 2); - border_width += get_internal_padding (toolbar); gtk_widget_get_preferred_size (priv->arrow_button, &arrow_requisition, NULL); - - shadow_type = get_shadow_type (toolbar); + get_widget_padding_and_border (widget, &padding); if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) { - available_size = size = allocation->width - 2 * border_width; - short_size = allocation->height - 2 * border_width; + available_size = size = allocation->width - 2 * border_width - padding.left - padding.right; + short_size = allocation->height - 2 * border_width - padding.top - padding.bottom; arrow_size = arrow_requisition.width; - - if (shadow_type != GTK_SHADOW_NONE) - { - available_size -= padding.left + padding.right; - short_size -= padding.top + padding.bottom; - } } else { - available_size = size = allocation->height - 2 * border_width; - short_size = allocation->width - 2 * border_width; + available_size = size = allocation->height - 2 * border_width - padding.top - padding.bottom; + short_size = allocation->width - 2 * border_width - padding.left - padding.right; arrow_size = arrow_requisition.height; - - if (shadow_type != GTK_SHADOW_NONE) - { - available_size -= padding.top + padding.bottom; - short_size -= padding.left + padding.right; - } } n_items = g_list_length (priv->content); @@ -1730,35 +1722,18 @@ gtk_toolbar_size_allocate (GtkWidget *widget, /* translate the items by allocation->(x,y) */ for (i = 0; i < n_items; ++i) { - allocations[i].x += allocation->x; - allocations[i].y += allocation->y; - - if (shadow_type != GTK_SHADOW_NONE) - { - allocations[i].x += padding.left; - allocations[i].y += padding.top; - } + allocations[i].x += allocation->x + padding.left; + allocations[i].y += allocation->y + padding.top; } if (need_arrow) { - arrow_allocation.x += allocation->x; - arrow_allocation.y += allocation->y; - - if (shadow_type != GTK_SHADOW_NONE) - { - arrow_allocation.x += padding.left; - arrow_allocation.y += padding.top; - } + arrow_allocation.x += allocation->x + padding.left; + arrow_allocation.y += allocation->y + padding.top; } - item_area.x += allocation->x; - item_area.y += allocation->y; - if (shadow_type != GTK_SHADOW_NONE) - { - item_area.x += padding.left; - item_area.y += padding.top; - } + item_area.x += allocation->x + padding.left; + item_area.y += allocation->y + padding.top; /* did anything change? */ for (list = priv->content, i = 0; list != NULL; list = list->next, i++) @@ -1884,11 +1859,6 @@ gtk_toolbar_style_updated (GtkWidget *widget) GTK_WIDGET_CLASS (gtk_toolbar_parent_class)->style_updated (widget); priv->max_homogeneous_pixels = -1; - - if (gtk_widget_get_realized (widget)) - gtk_style_context_set_background (gtk_widget_get_style_context (widget), - gtk_widget_get_window (widget)); - gtk_toolbar_update_button_relief (GTK_TOOLBAR (widget)); } @@ -2122,7 +2092,7 @@ gtk_toolbar_screen_changed (GtkWidget *widget, if (old_settings) { g_signal_handler_disconnect (old_settings, priv->settings_connection); - + priv->settings_connection = 0; g_object_unref (old_settings); } @@ -2609,6 +2579,7 @@ gtk_toolbar_orientation_changed (GtkToolbar *toolbar, gtk_toolbar_reconfigured (toolbar); + _gtk_orientable_set_style_classes (GTK_ORIENTABLE (toolbar)); gtk_widget_queue_resize (GTK_WIDGET (toolbar)); g_object_notify (G_OBJECT (toolbar), "orientation"); } @@ -2657,7 +2628,7 @@ menu_position_func (GtkMenu *menu, gtk_widget_get_window (priv->arrow_button)); if (monitor_num < 0) monitor_num = 0; - gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor); + gdk_screen_get_monitor_workarea (screen, monitor_num, &monitor); gtk_widget_get_allocation (priv->arrow_button, &allocation); @@ -2744,7 +2715,7 @@ gtk_toolbar_button_press (GtkWidget *toolbar, { GtkWidget *window; - if (event->button == 3) + if (gdk_event_triggers_context_menu ((GdkEvent *) event)) { gboolean return_value; @@ -2755,6 +2726,9 @@ gtk_toolbar_button_press (GtkWidget *toolbar, return return_value; } + if (event->type != GDK_BUTTON_PRESS) + return FALSE; + window = gtk_widget_get_toplevel (toolbar); if (window) @@ -3150,6 +3124,14 @@ gtk_toolbar_dispose (GObject *object) priv->menu = NULL; } + if (priv->settings_connection > 0) + { + g_signal_handler_disconnect (priv->settings, priv->settings_connection); + priv->settings_connection = 0; + } + + g_clear_object (&priv->settings); + G_OBJECT_CLASS (gtk_toolbar_parent_class)->dispose (object); } @@ -3159,9 +3141,6 @@ gtk_toolbar_finalize (GObject *object) GtkToolbar *toolbar = GTK_TOOLBAR (object); GtkToolbarPrivate *priv = toolbar->priv; - if (priv->sibling_path != NULL) - gtk_widget_path_unref (priv->sibling_path); - g_list_free_full (priv->content, (GDestroyNotify)toolbar_content_free); g_timer_destroy (priv->timer); @@ -3304,7 +3283,7 @@ toolbar_content_new_tool_item (GtkToolbar *toolbar, content->is_placeholder = is_placeholder; priv->content = g_list_insert (priv->content, content, pos); - + gtk_widget_set_parent (GTK_WIDGET (item), GTK_WIDGET (toolbar)); gtk_toolbar_invalidate_order (toolbar); @@ -3357,18 +3336,12 @@ calculate_max_homogeneous_pixels (GtkWidget *widget) { PangoContext *context; PangoFontMetrics *metrics; - const PangoFontDescription *font_desc; - GtkStyleContext *style_context; - GtkStateFlags state; gint char_width; context = gtk_widget_get_pango_context (widget); - style_context = gtk_widget_get_style_context (widget); - state = gtk_widget_get_state_flags (widget); - font_desc = gtk_style_context_get_font (style_context, state); - - metrics = pango_context_get_metrics (context, font_desc, + metrics = pango_context_get_metrics (context, + pango_context_get_font_description (context), pango_context_get_language (context)); char_width = pango_font_metrics_get_approximate_char_width (metrics); pango_font_metrics_unref (metrics); @@ -3659,18 +3632,6 @@ get_button_relief (GtkToolbar *toolbar) return button_relief; } -static gint -get_internal_padding (GtkToolbar *toolbar) -{ - gint ipadding = 0; - - gtk_widget_style_get (GTK_WIDGET (toolbar), - "internal-padding", &ipadding, - NULL); - - return ipadding; -} - static gint get_max_child_expand (GtkToolbar *toolbar) { @@ -3682,18 +3643,6 @@ get_max_child_expand (GtkToolbar *toolbar) return mexpand; } -static GtkShadowType -get_shadow_type (GtkToolbar *toolbar) -{ - GtkShadowType shadow_type; - - gtk_widget_style_get (GTK_WIDGET (toolbar), - "shadow-type", &shadow_type, - NULL); - - return shadow_type; -} - /* GTK+ internal methods */ gint @@ -3934,37 +3883,34 @@ gtk_toolbar_get_path_for_child (GtkContainer *container, GtkWidgetPath *path; GtkToolbar *toolbar; GtkToolbarPrivate *priv; + GtkWidgetPath *sibling_path; gint vis_index; + GList *children; toolbar = GTK_TOOLBAR (container); priv = toolbar->priv; - if (priv->sibling_path == NULL) - { - GList *children; - - /* build a path for all the visible children; - * get_children works in visible order - */ - priv->sibling_path = gtk_widget_path_new (); - children = gtk_container_get_children (container); + /* build a path for all the visible children; + * get_children works in visible order + */ + sibling_path = gtk_widget_path_new (); + children = _gtk_container_get_all_children (container); - if (priv->orientation == GTK_ORIENTATION_HORIZONTAL && - gtk_widget_get_direction (GTK_WIDGET (toolbar)) == GTK_TEXT_DIR_RTL) - children = g_list_reverse (children); + if (priv->orientation != GTK_ORIENTATION_HORIZONTAL || + gtk_widget_get_direction (GTK_WIDGET (toolbar)) != GTK_TEXT_DIR_RTL) + children = g_list_reverse (children); - g_list_foreach (children, add_widget_to_path, priv->sibling_path); - g_list_free (children); - } + g_list_foreach (children, add_widget_to_path, sibling_path); + g_list_free (children); - path = gtk_widget_path_copy (gtk_widget_get_path (GTK_WIDGET (container))); + path = _gtk_widget_create_path (GTK_WIDGET (container)); if (gtk_widget_get_visible (child)) { vis_index = gtk_toolbar_get_visible_position (toolbar, child); - if (vis_index < gtk_widget_path_length (priv->sibling_path)) + if (vis_index < gtk_widget_path_length (sibling_path)) gtk_widget_path_append_with_siblings (path, - priv->sibling_path, + sibling_path, vis_index); else gtk_widget_path_append_for_widget (path, child); @@ -3972,22 +3918,30 @@ gtk_toolbar_get_path_for_child (GtkContainer *container, else gtk_widget_path_append_for_widget (path, child); + gtk_widget_path_unref (sibling_path); return path; } +static void +gtk_toolbar_invalidate_order_foreach (GtkWidget *widget) +{ + _gtk_widget_invalidate_style_context (widget, GTK_CSS_CHANGE_POSITION | GTK_CSS_CHANGE_SIBLING_POSITION); +} + static void gtk_toolbar_invalidate_order (GtkToolbar *toolbar) { - GtkToolbarPrivate *priv = toolbar->priv; + gtk_container_forall (GTK_CONTAINER (toolbar), + (GtkCallback) gtk_toolbar_invalidate_order_foreach, + NULL); +} - if (priv->sibling_path != NULL) - { - gtk_widget_path_unref (priv->sibling_path); - priv->sibling_path = NULL; +static void +gtk_toolbar_direction_changed (GtkWidget *widget, + GtkTextDirection previous_direction) +{ + GTK_WIDGET_CLASS (gtk_toolbar_parent_class)->direction_changed (widget, previous_direction); - gtk_container_foreach (GTK_CONTAINER (toolbar), - (GtkCallback) gtk_widget_reset_style, - NULL); - } + gtk_toolbar_invalidate_order (GTK_TOOLBAR (widget)); }