| File: | ctk/ctkmenubar.c |
| Warning: | line 551, column 7 Value stored to 'size' is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* CTK - The GIMP Toolkit |
| 2 | * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald |
| 3 | * |
| 4 | * This library is free software; you can redistribute it and/or |
| 5 | * modify it under the terms of the GNU Lesser General Public |
| 6 | * License as published by the Free Software Foundation; either |
| 7 | * version 2 of the License, or (at your option) any later version. |
| 8 | * |
| 9 | * This library is distributed in the hope that it will be useful, |
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 12 | * Lesser General Public License for more details. |
| 13 | * |
| 14 | * You should have received a copy of the GNU Lesser General Public |
| 15 | * License along with this library. If not, see <http://www.gnu.org/licenses/>. |
| 16 | */ |
| 17 | |
| 18 | /* |
| 19 | * Modified by the CTK+ Team and others 1997-2000. See the AUTHORS |
| 20 | * file for a list of people on the CTK+ Team. See the ChangeLog |
| 21 | * files for a list of changes. These files are distributed with |
| 22 | * CTK+ at ftp://ftp.ctk.org/pub/ctk/. |
| 23 | */ |
| 24 | |
| 25 | /** |
| 26 | * SECTION:ctkmenubar |
| 27 | * @Title: CtkMenuBar |
| 28 | * @Short_description: A subclass of CtkMenuShell which holds CtkMenuItem widgets |
| 29 | * @See_also: #CtkMenuShell, #CtkMenu, #CtkMenuItem |
| 30 | * |
| 31 | * The #CtkMenuBar is a subclass of #CtkMenuShell which contains one or |
| 32 | * more #CtkMenuItems. The result is a standard menu bar which can hold |
| 33 | * many menu items. |
| 34 | * |
| 35 | * # CSS nodes |
| 36 | * |
| 37 | * CtkMenuBar has a single CSS node with name menubar. |
| 38 | */ |
| 39 | |
| 40 | #include "config.h" |
| 41 | |
| 42 | #include "ctkmenubar.h" |
| 43 | |
| 44 | #include "ctkbindings.h" |
| 45 | #include "ctkcsscustomgadgetprivate.h" |
| 46 | #include "ctkmain.h" |
| 47 | #include "ctkmarshalers.h" |
| 48 | #include "ctkmenuitemprivate.h" |
| 49 | #include "ctkmenuprivate.h" |
| 50 | #include "ctkmenushellprivate.h" |
| 51 | #include "ctkrender.h" |
| 52 | #include "ctksettings.h" |
| 53 | #include "ctksizerequest.h" |
| 54 | #include "ctkwindow.h" |
| 55 | #include "ctkcontainerprivate.h" |
| 56 | #include "ctkintl.h" |
| 57 | #include "ctkprivate.h" |
| 58 | #include "ctktypebuiltins.h" |
| 59 | #include "ctkwidgetprivate.h" |
| 60 | |
| 61 | #define MENU_BAR_POPUP_DELAY0 0 |
| 62 | |
| 63 | /* Properties */ |
| 64 | enum { |
| 65 | PROP_0, |
| 66 | PROP_PACK_DIRECTION, |
| 67 | PROP_CHILD_PACK_DIRECTION |
| 68 | }; |
| 69 | |
| 70 | struct _CtkMenuBarPrivate |
| 71 | { |
| 72 | CtkPackDirection pack_direction; |
| 73 | CtkPackDirection child_pack_direction; |
| 74 | |
| 75 | CtkCssGadget *gadget; |
| 76 | }; |
| 77 | |
| 78 | |
| 79 | static void ctk_menu_bar_set_property (GObject *object, |
| 80 | guint prop_id, |
| 81 | const GValue *value, |
| 82 | GParamSpec *pspec); |
| 83 | static void ctk_menu_bar_get_property (GObject *object, |
| 84 | guint prop_id, |
| 85 | GValue *value, |
| 86 | GParamSpec *pspec); |
| 87 | static void ctk_menu_bar_finalize (GObject *object); |
| 88 | static void ctk_menu_bar_get_preferred_width (CtkWidget *widget, |
| 89 | gint *minimum, |
| 90 | gint *natural); |
| 91 | static void ctk_menu_bar_get_preferred_height (CtkWidget *widget, |
| 92 | gint *minimum, |
| 93 | gint *natural); |
| 94 | static void ctk_menu_bar_get_preferred_width_for_height (CtkWidget *widget, |
| 95 | gint height, |
| 96 | gint *minimum, |
| 97 | gint *natural); |
| 98 | static void ctk_menu_bar_get_preferred_height_for_width (CtkWidget *widget, |
| 99 | gint width, |
| 100 | gint *minimum, |
| 101 | gint *natural); |
| 102 | static void ctk_menu_bar_size_allocate (CtkWidget *widget, |
| 103 | CtkAllocation *allocation); |
| 104 | static gint ctk_menu_bar_draw (CtkWidget *widget, |
| 105 | cairo_t *cr); |
| 106 | static void ctk_menu_bar_hierarchy_changed (CtkWidget *widget, |
| 107 | CtkWidget *old_toplevel); |
| 108 | static gint ctk_menu_bar_get_popup_delay (CtkMenuShell *menu_shell); |
| 109 | static void ctk_menu_bar_move_current (CtkMenuShell *menu_shell, |
| 110 | CtkMenuDirectionType direction); |
| 111 | |
| 112 | static void ctk_menu_bar_measure (CtkCssGadget *gadget, |
| 113 | CtkOrientation orientation, |
| 114 | int for_size, |
| 115 | int *minimum, |
| 116 | int *natural, |
| 117 | int *minimum_baseline, |
| 118 | int *natural_baseline, |
| 119 | gpointer data); |
| 120 | static void ctk_menu_bar_allocate (CtkCssGadget *gadget, |
| 121 | const CtkAllocation *allocation, |
| 122 | int baseline, |
| 123 | CtkAllocation *out_clip, |
| 124 | gpointer data); |
| 125 | static gboolean ctk_menu_bar_render (CtkCssGadget *gadget, |
| 126 | cairo_t *cr, |
| 127 | int x, |
| 128 | int y, |
| 129 | int width, |
| 130 | int height, |
| 131 | gpointer data); |
| 132 | |
| 133 | G_DEFINE_TYPE_WITH_PRIVATE (CtkMenuBar, ctk_menu_bar, CTK_TYPE_MENU_SHELL)static void ctk_menu_bar_init (CtkMenuBar *self); static void ctk_menu_bar_class_init (CtkMenuBarClass *klass); static GType ctk_menu_bar_get_type_once (void); static gpointer ctk_menu_bar_parent_class = ((void*)0); static gint CtkMenuBar_private_offset; static void ctk_menu_bar_class_intern_init (gpointer klass) { ctk_menu_bar_parent_class = g_type_class_peek_parent (klass); if (CtkMenuBar_private_offset != 0) g_type_class_adjust_private_offset (klass, &CtkMenuBar_private_offset ); ctk_menu_bar_class_init ((CtkMenuBarClass*) klass); } __attribute__ ((__unused__)) static inline gpointer ctk_menu_bar_get_instance_private (CtkMenuBar *self) { return (((gpointer) ((guint8*) (self) + (glong) (CtkMenuBar_private_offset)))); } GType ctk_menu_bar_get_type (void) { static GType static_g_define_type_id = 0; if ((__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id) == sizeof (gpointer), "Expression evaluates to false"); (void) ( 0 ? (gpointer) * (&static_g_define_type_id) : ((void*)0)) ; (!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id ) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (*(&static_g_define_type_id)) gapg_temp_newval; __typeof__ ((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id ); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5) ; gapg_temp_newval; })) && g_once_init_enter_pointer ( &static_g_define_type_id)); })) ) { GType g_define_type_id = ctk_menu_bar_get_type_once (); (__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id) == sizeof (gpointer) , "Expression evaluates to false"); 0 ? (void) (*(&static_g_define_type_id ) = (g_define_type_id)) : (void) 0; g_once_init_leave_pointer ((&static_g_define_type_id), (gpointer) (guintptr) (g_define_type_id )); })) ; } return static_g_define_type_id; } __attribute__ ( (__noinline__)) static GType ctk_menu_bar_get_type_once (void ) { GType g_define_type_id = g_type_register_static_simple (( ctk_menu_shell_get_type ()), g_intern_static_string ("CtkMenuBar" ), sizeof (CtkMenuBarClass), (GClassInitFunc)(void (*)(void)) ctk_menu_bar_class_intern_init, sizeof (CtkMenuBar), (GInstanceInitFunc )(void (*)(void)) ctk_menu_bar_init, (GTypeFlags) 0); { {{ CtkMenuBar_private_offset = g_type_add_instance_private (g_define_type_id, sizeof (CtkMenuBarPrivate )); };} } return g_define_type_id; } |
| 134 | |
| 135 | static void |
| 136 | ctk_menu_bar_class_init (CtkMenuBarClass *class) |
| 137 | { |
| 138 | GObjectClass *gobject_class; |
| 139 | CtkWidgetClass *widget_class; |
| 140 | CtkMenuShellClass *menu_shell_class; |
| 141 | CtkContainerClass *container_class; |
| 142 | |
| 143 | CtkBindingSet *binding_set; |
| 144 | |
| 145 | gobject_class = (GObjectClass*) class; |
| 146 | widget_class = (CtkWidgetClass*) class; |
| 147 | menu_shell_class = (CtkMenuShellClass*) class; |
| 148 | container_class = (CtkContainerClass*) class; |
| 149 | |
| 150 | gobject_class->get_property = ctk_menu_bar_get_property; |
| 151 | gobject_class->set_property = ctk_menu_bar_set_property; |
| 152 | gobject_class->finalize = ctk_menu_bar_finalize; |
| 153 | |
| 154 | widget_class->get_preferred_width = ctk_menu_bar_get_preferred_width; |
| 155 | widget_class->get_preferred_height = ctk_menu_bar_get_preferred_height; |
| 156 | widget_class->get_preferred_width_for_height = ctk_menu_bar_get_preferred_width_for_height; |
| 157 | widget_class->get_preferred_height_for_width = ctk_menu_bar_get_preferred_height_for_width; |
| 158 | widget_class->size_allocate = ctk_menu_bar_size_allocate; |
| 159 | widget_class->draw = ctk_menu_bar_draw; |
| 160 | widget_class->hierarchy_changed = ctk_menu_bar_hierarchy_changed; |
| 161 | |
| 162 | menu_shell_class->submenu_placement = CTK_TOP_BOTTOM; |
| 163 | menu_shell_class->get_popup_delay = ctk_menu_bar_get_popup_delay; |
| 164 | menu_shell_class->move_current = ctk_menu_bar_move_current; |
| 165 | |
| 166 | binding_set = ctk_binding_set_by_class (class); |
| 167 | ctk_binding_entry_add_signal (binding_set, |
| 168 | CDK_KEY_Left0xff51, 0, |
| 169 | "move-current", 1, |
| 170 | CTK_TYPE_MENU_DIRECTION_TYPE(ctk_menu_direction_type_get_type ()), |
| 171 | CTK_MENU_DIR_PREV); |
| 172 | ctk_binding_entry_add_signal (binding_set, |
| 173 | CDK_KEY_KP_Left0xff96, 0, |
| 174 | "move-current", 1, |
| 175 | CTK_TYPE_MENU_DIRECTION_TYPE(ctk_menu_direction_type_get_type ()), |
| 176 | CTK_MENU_DIR_PREV); |
| 177 | ctk_binding_entry_add_signal (binding_set, |
| 178 | CDK_KEY_Right0xff53, 0, |
| 179 | "move-current", 1, |
| 180 | CTK_TYPE_MENU_DIRECTION_TYPE(ctk_menu_direction_type_get_type ()), |
| 181 | CTK_MENU_DIR_NEXT); |
| 182 | ctk_binding_entry_add_signal (binding_set, |
| 183 | CDK_KEY_KP_Right0xff98, 0, |
| 184 | "move-current", 1, |
| 185 | CTK_TYPE_MENU_DIRECTION_TYPE(ctk_menu_direction_type_get_type ()), |
| 186 | CTK_MENU_DIR_NEXT); |
| 187 | ctk_binding_entry_add_signal (binding_set, |
| 188 | CDK_KEY_Up0xff52, 0, |
| 189 | "move-current", 1, |
| 190 | CTK_TYPE_MENU_DIRECTION_TYPE(ctk_menu_direction_type_get_type ()), |
| 191 | CTK_MENU_DIR_PARENT); |
| 192 | ctk_binding_entry_add_signal (binding_set, |
| 193 | CDK_KEY_KP_Up0xff97, 0, |
| 194 | "move-current", 1, |
| 195 | CTK_TYPE_MENU_DIRECTION_TYPE(ctk_menu_direction_type_get_type ()), |
| 196 | CTK_MENU_DIR_PARENT); |
| 197 | ctk_binding_entry_add_signal (binding_set, |
| 198 | CDK_KEY_Down0xff54, 0, |
| 199 | "move-current", 1, |
| 200 | CTK_TYPE_MENU_DIRECTION_TYPE(ctk_menu_direction_type_get_type ()), |
| 201 | CTK_MENU_DIR_CHILD); |
| 202 | ctk_binding_entry_add_signal (binding_set, |
| 203 | CDK_KEY_KP_Down0xff99, 0, |
| 204 | "move-current", 1, |
| 205 | CTK_TYPE_MENU_DIRECTION_TYPE(ctk_menu_direction_type_get_type ()), |
| 206 | CTK_MENU_DIR_CHILD); |
| 207 | |
| 208 | /** |
| 209 | * CtkMenuBar:pack-direction: |
| 210 | * |
| 211 | * The pack direction of the menubar. It determines how |
| 212 | * menuitems are arranged in the menubar. |
| 213 | * |
| 214 | * Since: 2.8 |
| 215 | */ |
| 216 | g_object_class_install_property (gobject_class, |
| 217 | PROP_PACK_DIRECTION, |
| 218 | g_param_spec_enum ("pack-direction", |
| 219 | P_("Pack direction")g_dgettext("ctk30" "-properties","Pack direction"), |
| 220 | P_("The pack direction of the menubar")g_dgettext("ctk30" "-properties","The pack direction of the menubar" ), |
| 221 | CTK_TYPE_PACK_DIRECTION(ctk_pack_direction_get_type ()), |
| 222 | CTK_PACK_DIRECTION_LTR, |
| 223 | CTK_PARAM_READWRITEG_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB|G_PARAM_EXPLICIT_NOTIFY)); |
| 224 | |
| 225 | /** |
| 226 | * CtkMenuBar:child-pack-direction: |
| 227 | * |
| 228 | * The child pack direction of the menubar. It determines how |
| 229 | * the widgets contained in child menuitems are arranged. |
| 230 | * |
| 231 | * Since: 2.8 |
| 232 | */ |
| 233 | g_object_class_install_property (gobject_class, |
| 234 | PROP_CHILD_PACK_DIRECTION, |
| 235 | g_param_spec_enum ("child-pack-direction", |
| 236 | P_("Child Pack direction")g_dgettext("ctk30" "-properties","Child Pack direction"), |
| 237 | P_("The child pack direction of the menubar")g_dgettext("ctk30" "-properties","The child pack direction of the menubar" ), |
| 238 | CTK_TYPE_PACK_DIRECTION(ctk_pack_direction_get_type ()), |
| 239 | CTK_PACK_DIRECTION_LTR, |
| 240 | CTK_PARAM_READWRITEG_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB|G_PARAM_EXPLICIT_NOTIFY)); |
| 241 | |
| 242 | |
| 243 | /** |
| 244 | * CtkMenuBar:shadow-type: |
| 245 | * |
| 246 | * The style of the shadow around the menubar. |
| 247 | * |
| 248 | * Deprecated: 3.20: Use CSS to determine the shadow; the value of |
| 249 | * this style property is ignored. |
| 250 | */ |
| 251 | ctk_widget_class_install_style_property (widget_class, |
| 252 | g_param_spec_enum ("shadow-type", |
| 253 | P_("Shadow type")g_dgettext("ctk30" "-properties","Shadow type"), |
| 254 | P_("Style of bevel around the menubar")g_dgettext("ctk30" "-properties","Style of bevel around the menubar" ), |
| 255 | CTK_TYPE_SHADOW_TYPE(ctk_shadow_type_get_type ()), |
| 256 | CTK_SHADOW_OUT, |
| 257 | CTK_PARAM_READABLEG_PARAM_READABLE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB|G_PARAM_DEPRECATED)); |
| 258 | |
| 259 | /** |
| 260 | * CtkMenuBar:internal-padding: |
| 261 | * |
| 262 | * Amount of border space between the menubar shadow and the menu items |
| 263 | * |
| 264 | * Deprecated: 3.8: use the standard padding CSS property (through objects |
| 265 | * like #CtkStyleContext and #CtkCssProvider); the value of this style |
| 266 | * property is ignored. |
| 267 | */ |
| 268 | ctk_widget_class_install_style_property (widget_class, |
| 269 | g_param_spec_int ("internal-padding", |
| 270 | P_("Internal padding")g_dgettext("ctk30" "-properties","Internal padding"), |
| 271 | P_("Amount of border space between the menubar shadow and the menu items")g_dgettext("ctk30" "-properties","Amount of border space between the menubar shadow and the menu items" ), |
| 272 | 0, |
| 273 | G_MAXINT2147483647, |
| 274 | 0, |
| 275 | CTK_PARAM_READABLEG_PARAM_READABLE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB|G_PARAM_DEPRECATED)); |
| 276 | |
| 277 | ctk_container_class_handle_border_width (container_class); |
| 278 | ctk_widget_class_set_accessible_role (widget_class, ATK_ROLE_MENU_BAR); |
| 279 | ctk_widget_class_set_css_name (widget_class, "menubar"); |
| 280 | } |
| 281 | |
| 282 | static void |
| 283 | ctk_menu_bar_init (CtkMenuBar *menu_bar) |
| 284 | { |
| 285 | CtkMenuBarPrivate *priv; |
| 286 | CtkWidget *widget; |
| 287 | CtkCssNode *widget_node; |
| 288 | |
| 289 | priv = menu_bar->priv = ctk_menu_bar_get_instance_private (menu_bar); |
| 290 | |
| 291 | widget = CTK_WIDGET (menu_bar)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menu_bar)), ((ctk_widget_get_type ())))))); |
| 292 | widget_node = ctk_widget_get_css_node (widget); |
| 293 | priv->gadget = ctk_css_custom_gadget_new_for_node (widget_node, |
| 294 | widget, |
| 295 | ctk_menu_bar_measure, |
| 296 | ctk_menu_bar_allocate, |
| 297 | ctk_menu_bar_render, |
| 298 | NULL((void*)0), NULL((void*)0)); |
| 299 | } |
| 300 | |
| 301 | /** |
| 302 | * ctk_menu_bar_new: |
| 303 | * |
| 304 | * Creates a new #CtkMenuBar |
| 305 | * |
| 306 | * Returns: the new menu bar, as a #CtkWidget |
| 307 | */ |
| 308 | CtkWidget* |
| 309 | ctk_menu_bar_new (void) |
| 310 | { |
| 311 | return g_object_new (CTK_TYPE_MENU_BAR(ctk_menu_bar_get_type ()), NULL((void*)0)); |
| 312 | } |
| 313 | |
| 314 | static void |
| 315 | ctk_menu_bar_finalize (GObject *object) |
| 316 | { |
| 317 | CtkMenuBar *menu_bar = CTK_MENU_BAR (object)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((object)), ((ctk_menu_bar_get_type ())))))); |
| 318 | |
| 319 | g_clear_object (&menu_bar->priv->gadget)do { _Static_assert (sizeof *((&menu_bar->priv->gadget )) == sizeof (gpointer), "Expression evaluates to false"); __typeof__ (((&menu_bar->priv->gadget))) _pp = ((&menu_bar ->priv->gadget)); __typeof__ (*((&menu_bar->priv ->gadget))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref ) (_ptr); } while (0); |
| 320 | |
| 321 | G_OBJECT_CLASS (ctk_menu_bar_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((ctk_menu_bar_parent_class)), (((GType) ((20) << (2 ))))))))->finalize (object); |
| 322 | } |
| 323 | |
| 324 | static void |
| 325 | ctk_menu_bar_set_property (GObject *object, |
| 326 | guint prop_id, |
| 327 | const GValue *value, |
| 328 | GParamSpec *pspec) |
| 329 | { |
| 330 | CtkMenuBar *menubar = CTK_MENU_BAR (object)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((object)), ((ctk_menu_bar_get_type ())))))); |
| 331 | |
| 332 | switch (prop_id) |
| 333 | { |
| 334 | case PROP_PACK_DIRECTION: |
| 335 | ctk_menu_bar_set_pack_direction (menubar, g_value_get_enum (value)); |
| 336 | break; |
| 337 | case PROP_CHILD_PACK_DIRECTION: |
| 338 | ctk_menu_bar_set_child_pack_direction (menubar, g_value_get_enum (value)); |
| 339 | break; |
| 340 | default: |
| 341 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec *_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id = ((prop_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'" , "ctkmenubar.c", 341, ("property"), _glib__property_id, _glib__pspec ->name, g_type_name ((((((GTypeClass*) (((GTypeInstance*) ( _glib__pspec))->g_class))->g_type)))), (g_type_name ((( (((GTypeClass*) (((GTypeInstance*) (_glib__object))->g_class ))->g_type)))))); } while (0); |
| 342 | break; |
| 343 | } |
| 344 | } |
| 345 | |
| 346 | static void |
| 347 | ctk_menu_bar_get_property (GObject *object, |
| 348 | guint prop_id, |
| 349 | GValue *value, |
| 350 | GParamSpec *pspec) |
| 351 | { |
| 352 | CtkMenuBar *menubar = CTK_MENU_BAR (object)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((object)), ((ctk_menu_bar_get_type ())))))); |
| 353 | |
| 354 | switch (prop_id) |
| 355 | { |
| 356 | case PROP_PACK_DIRECTION: |
| 357 | g_value_set_enum (value, ctk_menu_bar_get_pack_direction (menubar)); |
| 358 | break; |
| 359 | case PROP_CHILD_PACK_DIRECTION: |
| 360 | g_value_set_enum (value, ctk_menu_bar_get_child_pack_direction (menubar)); |
| 361 | break; |
| 362 | default: |
| 363 | G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec *_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id = ((prop_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'" , "ctkmenubar.c", 363, ("property"), _glib__property_id, _glib__pspec ->name, g_type_name ((((((GTypeClass*) (((GTypeInstance*) ( _glib__pspec))->g_class))->g_type)))), (g_type_name ((( (((GTypeClass*) (((GTypeInstance*) (_glib__object))->g_class ))->g_type)))))); } while (0); |
| 364 | break; |
| 365 | } |
| 366 | } |
| 367 | |
| 368 | static void |
| 369 | ctk_menu_bar_measure (CtkCssGadget *gadget, |
| 370 | CtkOrientation orientation, |
| 371 | int size, |
| 372 | int *minimum, |
| 373 | int *natural, |
| 374 | int *minimum_baseline G_GNUC_UNUSED__attribute__ ((__unused__)), |
| 375 | int *natural_baseline G_GNUC_UNUSED__attribute__ ((__unused__)), |
| 376 | gpointer data G_GNUC_UNUSED__attribute__ ((__unused__))) |
| 377 | { |
| 378 | CtkWidget *widget = ctk_css_gadget_get_owner (gadget); |
| 379 | CtkMenuBar *menu_bar; |
| 380 | CtkMenuBarPrivate *priv; |
| 381 | CtkMenuShell *menu_shell; |
| 382 | CtkWidget *child; |
| 383 | GList *children; |
| 384 | gboolean use_toggle_size, use_maximize; |
| 385 | gint child_minimum, child_natural; |
| 386 | |
| 387 | *minimum = 0; |
| 388 | *natural = 0; |
| 389 | |
| 390 | menu_bar = CTK_MENU_BAR (widget)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((widget)), ((ctk_menu_bar_get_type ())))))); |
| 391 | menu_shell = CTK_MENU_SHELL (widget)((((CtkMenuShell*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((widget)), ((ctk_menu_shell_get_type ())))))); |
| 392 | priv = menu_bar->priv; |
| 393 | |
| 394 | children = menu_shell->priv->children; |
| 395 | |
| 396 | if (priv->child_pack_direction == CTK_PACK_DIRECTION_LTR || |
| 397 | priv->child_pack_direction == CTK_PACK_DIRECTION_RTL) |
| 398 | use_toggle_size = (orientation == CTK_ORIENTATION_HORIZONTAL); |
| 399 | else |
| 400 | use_toggle_size = (orientation == CTK_ORIENTATION_VERTICAL); |
| 401 | |
| 402 | if (priv->pack_direction == CTK_PACK_DIRECTION_LTR || |
| 403 | priv->pack_direction == CTK_PACK_DIRECTION_RTL) |
| 404 | use_maximize = (orientation == CTK_ORIENTATION_VERTICAL); |
| 405 | else |
| 406 | use_maximize = (orientation == CTK_ORIENTATION_HORIZONTAL); |
| 407 | |
| 408 | while (children) |
| 409 | { |
| 410 | child = children->data; |
| 411 | children = children->next; |
| 412 | |
| 413 | if (ctk_widget_get_visible (child)) |
| 414 | { |
| 415 | _ctk_widget_get_preferred_size_for_size (child, orientation, size, &child_minimum, &child_natural, NULL((void*)0), NULL((void*)0)); |
| 416 | |
| 417 | if (use_toggle_size) |
| 418 | { |
| 419 | gint toggle_size; |
| 420 | |
| 421 | ctk_menu_item_toggle_size_request (CTK_MENU_ITEM (child)((((CtkMenuItem*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((child)), ((ctk_menu_item_get_type ())))))), |
| 422 | &toggle_size); |
| 423 | |
| 424 | child_minimum += toggle_size; |
| 425 | child_natural += toggle_size; |
| 426 | } |
| 427 | |
| 428 | if (use_maximize) |
| 429 | { |
| 430 | *minimum = MAX (*minimum, child_minimum)(((*minimum) > (child_minimum)) ? (*minimum) : (child_minimum )); |
| 431 | *natural = MAX (*natural, child_natural)(((*natural) > (child_natural)) ? (*natural) : (child_natural )); |
| 432 | } |
| 433 | else |
| 434 | { |
| 435 | *minimum += child_minimum; |
| 436 | *natural += child_natural; |
| 437 | } |
| 438 | } |
| 439 | } |
| 440 | } |
| 441 | |
| 442 | static void |
| 443 | ctk_menu_bar_get_preferred_width (CtkWidget *widget, |
| 444 | gint *minimum, |
| 445 | gint *natural) |
| 446 | { |
| 447 | ctk_css_gadget_get_preferred_size (CTK_MENU_BAR (widget)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((widget)), ((ctk_menu_bar_get_type ()))))))->priv->gadget, |
| 448 | CTK_ORIENTATION_HORIZONTAL, |
| 449 | -1, |
| 450 | minimum, natural, |
| 451 | NULL((void*)0), NULL((void*)0)); |
| 452 | } |
| 453 | |
| 454 | static void |
| 455 | ctk_menu_bar_get_preferred_height (CtkWidget *widget, |
| 456 | gint *minimum, |
| 457 | gint *natural) |
| 458 | { |
| 459 | ctk_css_gadget_get_preferred_size (CTK_MENU_BAR (widget)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((widget)), ((ctk_menu_bar_get_type ()))))))->priv->gadget, |
| 460 | CTK_ORIENTATION_VERTICAL, |
| 461 | -1, |
| 462 | minimum, natural, |
| 463 | NULL((void*)0), NULL((void*)0)); |
| 464 | } |
| 465 | |
| 466 | static void |
| 467 | ctk_menu_bar_get_preferred_width_for_height (CtkWidget *widget, |
| 468 | gint height, |
| 469 | gint *minimum, |
| 470 | gint *natural) |
| 471 | { |
| 472 | ctk_css_gadget_get_preferred_size (CTK_MENU_BAR (widget)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((widget)), ((ctk_menu_bar_get_type ()))))))->priv->gadget, |
| 473 | CTK_ORIENTATION_HORIZONTAL, |
| 474 | height, |
| 475 | minimum, natural, |
| 476 | NULL((void*)0), NULL((void*)0)); |
| 477 | } |
| 478 | |
| 479 | static void |
| 480 | ctk_menu_bar_get_preferred_height_for_width (CtkWidget *widget, |
| 481 | gint width, |
| 482 | gint *minimum, |
| 483 | gint *natural) |
| 484 | { |
| 485 | ctk_css_gadget_get_preferred_size (CTK_MENU_BAR (widget)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((widget)), ((ctk_menu_bar_get_type ()))))))->priv->gadget, |
| 486 | CTK_ORIENTATION_VERTICAL, |
| 487 | width, |
| 488 | minimum, natural, |
| 489 | NULL((void*)0), NULL((void*)0)); |
| 490 | } |
| 491 | |
| 492 | static void |
| 493 | ctk_menu_bar_allocate (CtkCssGadget *gadget, |
| 494 | const CtkAllocation *allocation, |
| 495 | int baseline G_GNUC_UNUSED__attribute__ ((__unused__)), |
| 496 | CtkAllocation *out_clip G_GNUC_UNUSED__attribute__ ((__unused__)), |
| 497 | gpointer data G_GNUC_UNUSED__attribute__ ((__unused__))) |
| 498 | { |
| 499 | CtkWidget *widget = ctk_css_gadget_get_owner (gadget); |
| 500 | CtkMenuBar *menu_bar; |
| 501 | CtkMenuShell *menu_shell; |
| 502 | CtkMenuBarPrivate *priv; |
| 503 | CtkWidget *child; |
| 504 | GList *children; |
| 505 | CtkAllocation remaining_space; |
| 506 | GArray *requested_sizes; |
| 507 | gint toggle_size; |
| 508 | guint i; |
| 509 | |
| 510 | menu_bar = CTK_MENU_BAR (widget)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((widget)), ((ctk_menu_bar_get_type ())))))); |
| 511 | menu_shell = CTK_MENU_SHELL (widget)((((CtkMenuShell*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((widget)), ((ctk_menu_shell_get_type ())))))); |
| 512 | priv = menu_bar->priv; |
| 513 | |
| 514 | if (!menu_shell->priv->children) |
| 515 | return; |
| 516 | |
| 517 | remaining_space = *allocation; |
| 518 | requested_sizes = g_array_new (FALSE(0), FALSE(0), sizeof (CtkRequestedSize)); |
| 519 | |
| 520 | if (priv->pack_direction == CTK_PACK_DIRECTION_LTR || |
| 521 | priv->pack_direction == CTK_PACK_DIRECTION_RTL) |
| 522 | { |
| 523 | int size = remaining_space.width; |
| 524 | gboolean ltr = (ctk_widget_get_direction (widget) == CTK_TEXT_DIR_LTR) == (priv->pack_direction == CTK_PACK_DIRECTION_LTR); |
| 525 | |
| 526 | for (children = menu_shell->priv->children; children; children = children->next) |
| 527 | { |
| 528 | CtkRequestedSize request; |
| 529 | child = children->data; |
| 530 | |
| 531 | if (!ctk_widget_get_visible (child)) |
| 532 | continue; |
| 533 | |
| 534 | request.data = child; |
| 535 | ctk_widget_get_preferred_width_for_height (child, |
| 536 | remaining_space.height, |
| 537 | &request.minimum_size, |
| 538 | &request.natural_size); |
| 539 | ctk_menu_item_toggle_size_request (CTK_MENU_ITEM (child)((((CtkMenuItem*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((child)), ((ctk_menu_item_get_type ())))))), |
| 540 | &toggle_size); |
| 541 | request.minimum_size += toggle_size; |
| 542 | request.natural_size += toggle_size; |
| 543 | |
| 544 | ctk_menu_item_toggle_size_allocate (CTK_MENU_ITEM (child)((((CtkMenuItem*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((child)), ((ctk_menu_item_get_type ())))))), toggle_size); |
| 545 | |
| 546 | g_array_append_val (requested_sizes, request)g_array_append_vals (requested_sizes, &(request), 1); |
| 547 | |
| 548 | size -= request.minimum_size; |
| 549 | } |
| 550 | |
| 551 | size = ctk_distribute_natural_allocation (size, |
Value stored to 'size' is never read | |
| 552 | requested_sizes->len, |
| 553 | (CtkRequestedSize *) requested_sizes->data); |
| 554 | |
| 555 | for (i = 0; i < requested_sizes->len; i++) |
| 556 | { |
| 557 | CtkAllocation child_allocation = remaining_space; |
| 558 | CtkRequestedSize *request = &g_array_index (requested_sizes, CtkRequestedSize, i)(((CtkRequestedSize*) (void *) (requested_sizes)->data) [( i)]); |
| 559 | |
| 560 | child_allocation.width = request->minimum_size; |
| 561 | remaining_space.width -= request->minimum_size; |
| 562 | |
| 563 | if (i + 1 == requested_sizes->len && CTK_IS_MENU_ITEM (request->data)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (request->data)); GType __t = ((ctk_menu_item_get_type ()) ); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))) && |
| 564 | CTK_MENU_ITEM (request->data)((((CtkMenuItem*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((request->data)), ((ctk_menu_item_get_type ()))))))->priv->right_justify) |
| 565 | ltr = !ltr; |
| 566 | |
| 567 | if (ltr) |
| 568 | remaining_space.x += request->minimum_size; |
| 569 | else |
| 570 | child_allocation.x += remaining_space.width; |
| 571 | |
| 572 | ctk_widget_size_allocate (request->data, &child_allocation); |
| 573 | } |
| 574 | } |
| 575 | else |
| 576 | { |
| 577 | int size = remaining_space.height; |
| 578 | gboolean ttb = (priv->pack_direction == CTK_PACK_DIRECTION_TTB); |
| 579 | |
| 580 | for (children = menu_shell->priv->children; children; children = children->next) |
| 581 | { |
| 582 | CtkRequestedSize request; |
| 583 | child = children->data; |
| 584 | |
| 585 | if (!ctk_widget_get_visible (child)) |
| 586 | continue; |
| 587 | |
| 588 | request.data = child; |
| 589 | ctk_widget_get_preferred_height_for_width (child, |
| 590 | remaining_space.width, |
| 591 | &request.minimum_size, |
| 592 | &request.natural_size); |
| 593 | ctk_menu_item_toggle_size_request (CTK_MENU_ITEM (child)((((CtkMenuItem*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((child)), ((ctk_menu_item_get_type ())))))), |
| 594 | &toggle_size); |
| 595 | request.minimum_size += toggle_size; |
| 596 | request.natural_size += toggle_size; |
| 597 | |
| 598 | ctk_menu_item_toggle_size_allocate (CTK_MENU_ITEM (child)((((CtkMenuItem*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((child)), ((ctk_menu_item_get_type ())))))), toggle_size); |
| 599 | |
| 600 | g_array_append_val (requested_sizes, request)g_array_append_vals (requested_sizes, &(request), 1); |
| 601 | |
| 602 | size -= request.minimum_size; |
| 603 | } |
| 604 | |
| 605 | size = ctk_distribute_natural_allocation (size, |
| 606 | requested_sizes->len, |
| 607 | (CtkRequestedSize *) requested_sizes->data); |
| 608 | |
| 609 | for (i = 0; i < requested_sizes->len; i++) |
| 610 | { |
| 611 | CtkAllocation child_allocation = remaining_space; |
| 612 | CtkRequestedSize *request = &g_array_index (requested_sizes, CtkRequestedSize, i)(((CtkRequestedSize*) (void *) (requested_sizes)->data) [( i)]); |
| 613 | |
| 614 | child_allocation.height = request->minimum_size; |
| 615 | remaining_space.height -= request->minimum_size; |
| 616 | |
| 617 | if (i + 1 == requested_sizes->len && CTK_IS_MENU_ITEM (request->data)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) ( (request->data)); GType __t = ((ctk_menu_item_get_type ()) ); gboolean __r; if (!__inst) __r = (0); else if (__inst-> g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))) && |
| 618 | CTK_MENU_ITEM (request->data)((((CtkMenuItem*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((request->data)), ((ctk_menu_item_get_type ()))))))->priv->right_justify) |
| 619 | ttb = !ttb; |
| 620 | |
| 621 | if (ttb) |
| 622 | remaining_space.y += request->minimum_size; |
| 623 | else |
| 624 | child_allocation.y += remaining_space.height; |
| 625 | |
| 626 | ctk_widget_size_allocate (request->data, &child_allocation); |
| 627 | } |
| 628 | } |
| 629 | |
| 630 | g_array_free (requested_sizes, TRUE(!(0))); |
| 631 | } |
| 632 | |
| 633 | static void |
| 634 | ctk_menu_bar_size_allocate (CtkWidget *widget, |
| 635 | CtkAllocation *allocation) |
| 636 | { |
| 637 | CtkMenuBar *menu_bar; |
| 638 | CtkAllocation clip, content_allocation; |
| 639 | |
| 640 | menu_bar = CTK_MENU_BAR (widget)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((widget)), ((ctk_menu_bar_get_type ())))))); |
| 641 | ctk_widget_set_allocation (widget, allocation); |
| 642 | |
| 643 | if (ctk_widget_get_realized (widget)) |
| 644 | cdk_window_move_resize (ctk_widget_get_window (widget), |
| 645 | allocation->x, allocation->y, |
| 646 | allocation->width, allocation->height); |
| 647 | |
| 648 | content_allocation = *allocation; |
| 649 | content_allocation.x = content_allocation.y = 0; |
| 650 | ctk_css_gadget_allocate (menu_bar->priv->gadget, |
| 651 | &content_allocation, |
| 652 | ctk_widget_get_allocated_baseline (widget), |
| 653 | &clip); |
| 654 | |
| 655 | clip.x += allocation->x; |
| 656 | clip.y += allocation->y; |
| 657 | ctk_widget_set_clip (widget, &clip); |
| 658 | } |
| 659 | |
| 660 | static gboolean |
| 661 | ctk_menu_bar_render (CtkCssGadget *gadget, |
| 662 | cairo_t *cr, |
| 663 | int x G_GNUC_UNUSED__attribute__ ((__unused__)), |
| 664 | int y G_GNUC_UNUSED__attribute__ ((__unused__)), |
| 665 | int width G_GNUC_UNUSED__attribute__ ((__unused__)), |
| 666 | int height G_GNUC_UNUSED__attribute__ ((__unused__)), |
| 667 | gpointer data G_GNUC_UNUSED__attribute__ ((__unused__))) |
| 668 | { |
| 669 | CtkWidget *widget = ctk_css_gadget_get_owner (gadget); |
| 670 | |
| 671 | CTK_WIDGET_CLASS (ctk_menu_bar_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((ctk_menu_bar_parent_class)), ((ctk_widget_get_type ()))) )))->draw (widget, cr); |
| 672 | |
| 673 | return FALSE(0); |
| 674 | } |
| 675 | |
| 676 | static gboolean |
| 677 | ctk_menu_bar_draw (CtkWidget *widget, |
| 678 | cairo_t *cr) |
| 679 | { |
| 680 | ctk_css_gadget_draw (CTK_MENU_BAR (widget)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((widget)), ((ctk_menu_bar_get_type ()))))))->priv->gadget, cr); |
| 681 | |
| 682 | return FALSE(0); |
| 683 | } |
| 684 | |
| 685 | static GList * |
| 686 | get_menu_bars (CtkWindow *window) |
| 687 | { |
| 688 | return g_object_get_data (G_OBJECT (window)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), (((GType) ((20) << (2)))))))), "ctk-menu-bar-list"); |
| 689 | } |
| 690 | |
| 691 | GList * |
| 692 | _ctk_menu_bar_get_viewable_menu_bars (CtkWindow *window) |
| 693 | { |
| 694 | GList *menu_bars; |
| 695 | GList *viewable_menu_bars = NULL((void*)0); |
| 696 | |
| 697 | for (menu_bars = get_menu_bars (window); |
| 698 | menu_bars; |
| 699 | menu_bars = menu_bars->next) |
| 700 | { |
| 701 | CtkWidget *widget = menu_bars->data; |
| 702 | gboolean viewable = TRUE(!(0)); |
| 703 | |
| 704 | while (widget) |
| 705 | { |
| 706 | if (!ctk_widget_get_mapped (widget)) |
| 707 | viewable = FALSE(0); |
| 708 | |
| 709 | widget = ctk_widget_get_parent (widget); |
| 710 | } |
| 711 | |
| 712 | if (viewable) |
| 713 | viewable_menu_bars = g_list_prepend (viewable_menu_bars, menu_bars->data); |
| 714 | } |
| 715 | |
| 716 | return g_list_reverse (viewable_menu_bars); |
| 717 | } |
| 718 | |
| 719 | static void |
| 720 | set_menu_bars (CtkWindow *window, |
| 721 | GList *menubars) |
| 722 | { |
| 723 | g_object_set_data (G_OBJECT (window)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((window)), (((GType) ((20) << (2)))))))), I_("ctk-menu-bar-list")g_intern_static_string ("ctk-menu-bar-list"), menubars); |
| 724 | } |
| 725 | |
| 726 | static void |
| 727 | add_to_window (CtkWindow *window, |
| 728 | CtkMenuBar *menubar) |
| 729 | { |
| 730 | GList *menubars = get_menu_bars (window); |
| 731 | |
| 732 | set_menu_bars (window, g_list_prepend (menubars, menubar)); |
| 733 | } |
| 734 | |
| 735 | static void |
| 736 | remove_from_window (CtkWindow *window, |
| 737 | CtkMenuBar *menubar) |
| 738 | { |
| 739 | GList *menubars = get_menu_bars (window); |
| 740 | |
| 741 | menubars = g_list_remove (menubars, menubar); |
| 742 | set_menu_bars (window, menubars); |
| 743 | } |
| 744 | |
| 745 | static void |
| 746 | ctk_menu_bar_hierarchy_changed (CtkWidget *widget, |
| 747 | CtkWidget *old_toplevel) |
| 748 | { |
| 749 | CtkWidget *toplevel; |
| 750 | CtkMenuBar *menubar; |
| 751 | |
| 752 | menubar = CTK_MENU_BAR (widget)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((widget)), ((ctk_menu_bar_get_type ())))))); |
| 753 | |
| 754 | toplevel = ctk_widget_get_toplevel (widget); |
| 755 | |
| 756 | if (old_toplevel) |
| 757 | remove_from_window (CTK_WINDOW (old_toplevel)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((old_toplevel)), ((ctk_window_get_type ())))))), menubar); |
| 758 | |
| 759 | if (ctk_widget_is_toplevel (toplevel)) |
| 760 | add_to_window (CTK_WINDOW (toplevel)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((toplevel)), ((ctk_window_get_type ())))))), menubar); |
| 761 | } |
| 762 | |
| 763 | /** |
| 764 | * _ctk_menu_bar_cycle_focus: |
| 765 | * @menubar: a #CtkMenuBar |
| 766 | * @dir: direction in which to cycle the focus |
| 767 | * |
| 768 | * Move the focus between menubars in the toplevel. |
| 769 | **/ |
| 770 | void |
| 771 | _ctk_menu_bar_cycle_focus (CtkMenuBar *menubar, |
| 772 | CtkDirectionType dir) |
| 773 | { |
| 774 | CtkWidget *toplevel = ctk_widget_get_toplevel (CTK_WIDGET (menubar)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menubar)), ((ctk_widget_get_type ()))))))); |
| 775 | CtkMenuItem *to_activate = NULL((void*)0); |
| 776 | |
| 777 | if (ctk_widget_is_toplevel (toplevel)) |
| 778 | { |
| 779 | GList *tmp_menubars = _ctk_menu_bar_get_viewable_menu_bars (CTK_WINDOW (toplevel)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((toplevel)), ((ctk_window_get_type ()))))))); |
| 780 | GList *menubars; |
| 781 | GList *current; |
| 782 | |
| 783 | menubars = _ctk_container_focus_sort (CTK_CONTAINER (toplevel)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((toplevel)), ((ctk_container_get_type ())))))), tmp_menubars, |
| 784 | dir, CTK_WIDGET (menubar)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menubar)), ((ctk_widget_get_type ()))))))); |
| 785 | g_list_free (tmp_menubars); |
| 786 | |
| 787 | if (menubars) |
| 788 | { |
| 789 | current = g_list_find (menubars, menubar); |
| 790 | |
| 791 | if (current && current->next) |
| 792 | { |
| 793 | CtkMenuShell *new_menushell = CTK_MENU_SHELL (current->next->data)((((CtkMenuShell*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((current->next->data)), ((ctk_menu_shell_get_type ( ))))))); |
| 794 | if (new_menushell->priv->children) |
| 795 | to_activate = new_menushell->priv->children->data; |
| 796 | } |
| 797 | } |
| 798 | |
| 799 | g_list_free (menubars); |
| 800 | } |
| 801 | |
| 802 | ctk_menu_shell_cancel (CTK_MENU_SHELL (menubar)((((CtkMenuShell*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menubar)), ((ctk_menu_shell_get_type ()))))))); |
| 803 | |
| 804 | if (to_activate) |
| 805 | g_signal_emit_by_name (to_activate, "activate_item"); |
| 806 | } |
| 807 | |
| 808 | static gint |
| 809 | ctk_menu_bar_get_popup_delay (CtkMenuShell *menu_shell G_GNUC_UNUSED__attribute__ ((__unused__))) |
| 810 | { |
| 811 | return MENU_BAR_POPUP_DELAY0; |
| 812 | } |
| 813 | |
| 814 | static void |
| 815 | ctk_menu_bar_move_current (CtkMenuShell *menu_shell, |
| 816 | CtkMenuDirectionType direction) |
| 817 | { |
| 818 | CtkMenuBar *menubar = CTK_MENU_BAR (menu_shell)((((CtkMenuBar*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menu_shell)), ((ctk_menu_bar_get_type ())))))); |
| 819 | CtkTextDirection text_dir; |
| 820 | CtkPackDirection pack_dir; |
| 821 | |
| 822 | text_dir = ctk_widget_get_direction (CTK_WIDGET (menubar)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menubar)), ((ctk_widget_get_type ()))))))); |
| 823 | pack_dir = ctk_menu_bar_get_pack_direction (menubar); |
| 824 | |
| 825 | if (pack_dir == CTK_PACK_DIRECTION_LTR || pack_dir == CTK_PACK_DIRECTION_RTL) |
| 826 | { |
| 827 | if ((text_dir == CTK_TEXT_DIR_RTL) == (pack_dir == CTK_PACK_DIRECTION_LTR)) |
| 828 | { |
| 829 | switch (direction) |
| 830 | { |
| 831 | case CTK_MENU_DIR_PREV: |
| 832 | direction = CTK_MENU_DIR_NEXT; |
| 833 | break; |
| 834 | case CTK_MENU_DIR_NEXT: |
| 835 | direction = CTK_MENU_DIR_PREV; |
| 836 | break; |
| 837 | default: ; |
| 838 | } |
| 839 | } |
| 840 | } |
| 841 | else |
| 842 | { |
| 843 | switch (direction) |
| 844 | { |
| 845 | case CTK_MENU_DIR_PARENT: |
| 846 | if ((text_dir == CTK_TEXT_DIR_LTR) == (pack_dir == CTK_PACK_DIRECTION_TTB)) |
| 847 | direction = CTK_MENU_DIR_PREV; |
| 848 | else |
| 849 | direction = CTK_MENU_DIR_NEXT; |
| 850 | break; |
| 851 | case CTK_MENU_DIR_CHILD: |
| 852 | if ((text_dir == CTK_TEXT_DIR_LTR) == (pack_dir == CTK_PACK_DIRECTION_TTB)) |
| 853 | direction = CTK_MENU_DIR_NEXT; |
| 854 | else |
| 855 | direction = CTK_MENU_DIR_PREV; |
| 856 | break; |
| 857 | case CTK_MENU_DIR_PREV: |
| 858 | if (text_dir == CTK_TEXT_DIR_RTL) |
| 859 | direction = CTK_MENU_DIR_CHILD; |
| 860 | else |
| 861 | direction = CTK_MENU_DIR_PARENT; |
| 862 | break; |
| 863 | case CTK_MENU_DIR_NEXT: |
| 864 | if (text_dir == CTK_TEXT_DIR_RTL) |
| 865 | direction = CTK_MENU_DIR_PARENT; |
| 866 | else |
| 867 | direction = CTK_MENU_DIR_CHILD; |
| 868 | break; |
| 869 | default: ; |
| 870 | } |
| 871 | } |
| 872 | |
| 873 | CTK_MENU_SHELL_CLASS (ctk_menu_bar_parent_class)((((CtkMenuShellClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((ctk_menu_bar_parent_class)), ((ctk_menu_shell_get_type ( )))))))->move_current (menu_shell, direction); |
| 874 | } |
| 875 | |
| 876 | /** |
| 877 | * ctk_menu_bar_get_pack_direction: |
| 878 | * @menubar: a #CtkMenuBar |
| 879 | * |
| 880 | * Retrieves the current pack direction of the menubar. |
| 881 | * See ctk_menu_bar_set_pack_direction(). |
| 882 | * |
| 883 | * Returns: the pack direction |
| 884 | * |
| 885 | * Since: 2.8 |
| 886 | */ |
| 887 | CtkPackDirection |
| 888 | ctk_menu_bar_get_pack_direction (CtkMenuBar *menubar) |
| 889 | { |
| 890 | g_return_val_if_fail (CTK_IS_MENU_BAR (menubar),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((menubar)); GType __t = ((ctk_menu_bar_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__ )), "CTK_IS_MENU_BAR (menubar)"); return (CTK_PACK_DIRECTION_LTR ); } } while (0) |
| 891 | CTK_PACK_DIRECTION_LTR)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((menubar)); GType __t = ((ctk_menu_bar_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__ )), "CTK_IS_MENU_BAR (menubar)"); return (CTK_PACK_DIRECTION_LTR ); } } while (0); |
| 892 | |
| 893 | return menubar->priv->pack_direction; |
| 894 | } |
| 895 | |
| 896 | /** |
| 897 | * ctk_menu_bar_set_pack_direction: |
| 898 | * @menubar: a #CtkMenuBar |
| 899 | * @pack_dir: a new #CtkPackDirection |
| 900 | * |
| 901 | * Sets how items should be packed inside a menubar. |
| 902 | * |
| 903 | * Since: 2.8 |
| 904 | */ |
| 905 | void |
| 906 | ctk_menu_bar_set_pack_direction (CtkMenuBar *menubar, |
| 907 | CtkPackDirection pack_dir) |
| 908 | { |
| 909 | CtkMenuBarPrivate *priv; |
| 910 | GList *l; |
| 911 | |
| 912 | g_return_if_fail (CTK_IS_MENU_BAR (menubar))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((menubar)); GType __t = ((ctk_menu_bar_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__ )), "CTK_IS_MENU_BAR (menubar)"); return; } } while (0); |
| 913 | |
| 914 | priv = menubar->priv; |
| 915 | |
| 916 | if (priv->pack_direction != pack_dir) |
| 917 | { |
| 918 | priv->pack_direction = pack_dir; |
| 919 | |
| 920 | ctk_widget_queue_resize (CTK_WIDGET (menubar)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menubar)), ((ctk_widget_get_type ()))))))); |
| 921 | |
| 922 | for (l = CTK_MENU_SHELL (menubar)((((CtkMenuShell*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menubar)), ((ctk_menu_shell_get_type ()))))))->priv->children; l; l = l->next) |
| 923 | ctk_widget_queue_resize (CTK_WIDGET (l->data)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((l->data)), ((ctk_widget_get_type ()))))))); |
| 924 | |
| 925 | g_object_notify (G_OBJECT (menubar)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menubar)), (((GType) ((20) << (2)))))))), "pack-direction"); |
| 926 | } |
| 927 | } |
| 928 | |
| 929 | /** |
| 930 | * ctk_menu_bar_get_child_pack_direction: |
| 931 | * @menubar: a #CtkMenuBar |
| 932 | * |
| 933 | * Retrieves the current child pack direction of the menubar. |
| 934 | * See ctk_menu_bar_set_child_pack_direction(). |
| 935 | * |
| 936 | * Returns: the child pack direction |
| 937 | * |
| 938 | * Since: 2.8 |
| 939 | */ |
| 940 | CtkPackDirection |
| 941 | ctk_menu_bar_get_child_pack_direction (CtkMenuBar *menubar) |
| 942 | { |
| 943 | g_return_val_if_fail (CTK_IS_MENU_BAR (menubar),do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((menubar)); GType __t = ((ctk_menu_bar_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__ )), "CTK_IS_MENU_BAR (menubar)"); return (CTK_PACK_DIRECTION_LTR ); } } while (0) |
| 944 | CTK_PACK_DIRECTION_LTR)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((menubar)); GType __t = ((ctk_menu_bar_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__ )), "CTK_IS_MENU_BAR (menubar)"); return (CTK_PACK_DIRECTION_LTR ); } } while (0); |
| 945 | |
| 946 | return menubar->priv->child_pack_direction; |
| 947 | } |
| 948 | |
| 949 | /** |
| 950 | * ctk_menu_bar_set_child_pack_direction: |
| 951 | * @menubar: a #CtkMenuBar |
| 952 | * @child_pack_dir: a new #CtkPackDirection |
| 953 | * |
| 954 | * Sets how widgets should be packed inside the children of a menubar. |
| 955 | * |
| 956 | * Since: 2.8 |
| 957 | */ |
| 958 | void |
| 959 | ctk_menu_bar_set_child_pack_direction (CtkMenuBar *menubar, |
| 960 | CtkPackDirection child_pack_dir) |
| 961 | { |
| 962 | CtkMenuBarPrivate *priv; |
| 963 | GList *l; |
| 964 | |
| 965 | g_return_if_fail (CTK_IS_MENU_BAR (menubar))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((menubar)); GType __t = ((ctk_menu_bar_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__ )), "CTK_IS_MENU_BAR (menubar)"); return; } } while (0); |
| 966 | |
| 967 | priv = menubar->priv; |
| 968 | |
| 969 | if (priv->child_pack_direction != child_pack_dir) |
| 970 | { |
| 971 | priv->child_pack_direction = child_pack_dir; |
| 972 | |
| 973 | ctk_widget_queue_resize (CTK_WIDGET (menubar)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menubar)), ((ctk_widget_get_type ()))))))); |
| 974 | |
| 975 | for (l = CTK_MENU_SHELL (menubar)((((CtkMenuShell*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menubar)), ((ctk_menu_shell_get_type ()))))))->priv->children; l; l = l->next) |
| 976 | ctk_widget_queue_resize (CTK_WIDGET (l->data)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((l->data)), ((ctk_widget_get_type ()))))))); |
| 977 | |
| 978 | g_object_notify (G_OBJECT (menubar)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menubar)), (((GType) ((20) << (2)))))))), "child-pack-direction"); |
| 979 | } |
| 980 | } |
| 981 | |
| 982 | /** |
| 983 | * ctk_menu_bar_new_from_model: |
| 984 | * @model: a #GMenuModel |
| 985 | * |
| 986 | * Creates a new #CtkMenuBar and populates it with menu items |
| 987 | * and submenus according to @model. |
| 988 | * |
| 989 | * The created menu items are connected to actions found in the |
| 990 | * #CtkApplicationWindow to which the menu bar belongs - typically |
| 991 | * by means of being contained within the #CtkApplicationWindows |
| 992 | * widget hierarchy. |
| 993 | * |
| 994 | * Returns: a new #CtkMenuBar |
| 995 | * |
| 996 | * Since: 3.4 |
| 997 | */ |
| 998 | CtkWidget * |
| 999 | ctk_menu_bar_new_from_model (GMenuModel *model) |
| 1000 | { |
| 1001 | CtkWidget *menubar; |
| 1002 | |
| 1003 | g_return_val_if_fail (G_IS_MENU_MODEL (model), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((model)); GType __t = ((g_menu_model_get_type ())); gboolean __r; if (!__inst) __r = (0); else if (__inst->g_class && __inst->g_class->g_type == __t) __r = (!(0)); else __r = g_type_check_instance_is_a (__inst, __t); __r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__ )), "G_IS_MENU_MODEL (model)"); return (((void*)0)); } } while (0); |
| 1004 | |
| 1005 | menubar = ctk_menu_bar_new (); |
| 1006 | ctk_menu_shell_bind_model (CTK_MENU_SHELL (menubar)((((CtkMenuShell*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((menubar)), ((ctk_menu_shell_get_type ())))))), model, NULL((void*)0), FALSE(0)); |
| 1007 | |
| 1008 | return menubar; |
| 1009 | } |