X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtktoolbar.c;h=e4dbfa45eb2aa79e5cf54a8f223a9e3161b264ef;hb=563eb60666d9f72c38d7542b0ab37841e6aac488;hp=2bd9be7d5d7adca8e4c817b8486f61b9fa136804;hpb=385b7a303112848c5e5fa7bdffd31cdd5af4b247;p=~andy%2Fgtk diff --git a/gtk/gtktoolbar.c b/gtk/gtktoolbar.c index 2bd9be7d5..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 . */ /* @@ -42,10 +40,11 @@ #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" @@ -56,6 +55,8 @@ #include "gtkprivate.h" #include "gtkintl.h" #include "gtktypebuiltins.h" +#include "gtkwidgetpath.h" +#include "gtkwidgetprivate.h" /** @@ -83,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 @@ -252,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, @@ -578,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, @@ -611,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"), @@ -832,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 @@ -843,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; } @@ -858,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, @@ -887,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) @@ -906,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; @@ -1000,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; @@ -1248,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; @@ -1272,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; @@ -1486,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; @@ -1503,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; @@ -1533,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); @@ -1732,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++) @@ -1886,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)); } @@ -2124,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); } @@ -2611,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"); } @@ -2659,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); @@ -2757,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) @@ -3152,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); } @@ -3356,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); @@ -3658,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) { @@ -3681,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 @@ -3953,7 +3903,7 @@ gtk_toolbar_get_path_for_child (GtkContainer *container, 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); @@ -3972,11 +3922,17 @@ gtk_toolbar_get_path_for_child (GtkContainer *container, 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) { gtk_container_forall (GTK_CONTAINER (toolbar), - (GtkCallback) gtk_widget_reset_style, + (GtkCallback) gtk_toolbar_invalidate_order_foreach, NULL); }