Bug Summary

File:cafe-panel/panel-toplevel.c
Warning:line 2081, column 2
Value stored to 'y' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name panel-toplevel.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/rootdir/cafe-panel -fcoverage-compilation-dir=/rootdir/cafe-panel -resource-dir /usr/lib/llvm-19/lib/clang/19 -D HAVE_CONFIG_H -I . -I .. -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/libpng16 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/pango-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/ctk-3.0 -I /usr/include/gio-unix-2.0 -I /usr/include/atk-1.0 -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -I /usr/include/cafe-desktop-2.0 -I /usr/include/startup-notification-1.0 -I /usr/include/dconf -I /usr/include/cafe-menus -I /usr/include/dconf -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/libmount -I /usr/include/blkid -I . -I . -I ../cafe-panel -I ../cafe-panel/libpanel-util -D CAFELOCALEDIR="/usr/share/locale" -D PANELDATADIR="/usr/share/cafe-panel" -D PANEL_MODULES_DIR="/usr/lib/cafe-panel/modules" -D CAFEMENU_I_KNOW_THIS_IS_UNSTABLE -internal-isystem /usr/lib/llvm-19/lib/clang/19/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2025-04-06-095046-54450-1 -x c panel-toplevel.c
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
2 *
3 * panel-toplevel.c: The panel's toplevel window object.
4 *
5 * Copyright (C) 2003 Sun Microsystems, Inc.
6 * Copyright (C) 2004 Rob Adams
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
21 * 02110-1301, USA.
22 *
23 * Authors:
24 * Mark McLoughlin <mark@skynet.ie>
25 */
26
27#include <config.h>
28
29#include "panel-toplevel.h"
30
31#include <stdlib.h>
32#include <string.h>
33
34#include <ctk/ctk.h>
35#include <cdk/cdkkeysyms.h>
36#include <glib/gi18n.h>
37
38#ifdef HAVE_X111
39#include <cdk/cdkx.h>
40#endif
41
42#include "panel-util.h"
43#include "panel-profile.h"
44#include "panel-frame.h"
45#include "panel-multimonitor.h"
46#include "panel-a11y.h"
47#include "panel-typebuiltins.h"
48#include "panel-marshal.h"
49#include "panel-widget.h"
50#include "panel-bindings.h"
51#include "panel-config-global.h"
52#include "panel-lockdown.h"
53#include "panel-schemas.h"
54
55#ifdef HAVE_X111
56#include "xstuff.h"
57#include "panel-xutils.h"
58#include "panel-struts.h"
59#endif
60#ifdef HAVE_WAYLAND
61#include "wayland-backend.h"
62#endif
63
64#define DEFAULT_SIZE48 48
65#define DEFAULT_AUTO_HIDE_SIZE1 1
66#define DEFAULT_HIDE_DELAY300 300
67#define DEFAULT_UNHIDE_DELAY100 100
68#define DEFAULT_DND_THRESHOLD8 8
69#define MINIMUM_WIDTH100 100
70#define MAXIMUM_SIZE_SCREEN_RATIO5 5
71#define SNAP_TOLERANCE_FACTOR6 6
72#define DEFAULT_ARROW_SIZE20 20
73#define HANDLE_SIZE10 10
74#define N_ATTACH_TOPLEVEL_SIGNALS5 5
75#define N_ATTACH_WIDGET_SIGNALS5 5
76
77typedef enum {
78 PANEL_GRAB_OP_NONE,
79 PANEL_GRAB_OP_MOVE,
80 PANEL_GRAB_OP_RESIZE,
81 PANEL_GRAB_OP_RESIZE_UP,
82 PANEL_GRAB_OP_RESIZE_DOWN,
83 PANEL_GRAB_OP_RESIZE_LEFT,
84 PANEL_GRAB_OP_RESIZE_RIGHT
85} PanelGrabOpType;
86
87struct _PanelToplevelPrivate {
88 gchar *settings_path;
89
90 gboolean expand;
91 PanelOrientation orientation;
92 int size;
93 gint scale;
94
95 /* relative to the monitor origin */
96 int x;
97 int y;
98 /* relative to the bottom right corner, -1 to ignore and use x, y*/
99 int x_right;
100 int y_bottom;
101
102 int monitor;
103 /* this is used when the configured monitor is missing. We keep it so
104 * we can move the toplevel to the right monitor when it becomes
105 * available */
106 int configured_monitor;
107
108 int hide_delay;
109 int unhide_delay;
110 int auto_hide_size;
111 PanelAnimationSpeed animation_speed;
112
113 int snap_tolerance;
114 CtkSettings *ctk_settings;
115
116 PanelState state;
117
118 char *name;
119 char *description;
120
121 guint hide_timeout;
122 guint unhide_timeout;
123
124 CdkRectangle geometry;
125 PanelFrameEdge edges;
126
127 int original_width;
128 int original_height;
129
130 PanelGrabOpType grab_op;
131
132 /* The offset within the panel from which the panel
133 * drag was initiated relative to the screen origin.
134 */
135 int drag_offset_x;
136 int drag_offset_y;
137
138 /* Saved state before for cancelled grab op */
139 int orig_monitor;
140 int orig_x;
141 int orig_y;
142 int orig_x_right;
143 int orig_y_bottom;
144 int orig_size;
145 int orig_orientation;
146
147 /* relative to the monitor origin */
148 int animation_end_x;
149 int animation_end_y;
150 int animation_end_width;
151 int animation_end_height;
152 GDateTime *animation_start_time;
153 GDateTime *animation_end_time;
154 guint animation_timeout;
155
156 PanelWidget *panel_widget;
157 PanelFrame *inner_frame;
158 CtkWidget *grid;
159 CtkWidget *hide_button_top;
160 CtkWidget *hide_button_bottom;
161 CtkWidget *hide_button_left;
162 CtkWidget *hide_button_right;
163
164 PanelToplevel *attach_toplevel;
165 gulong attach_toplevel_signals [N_ATTACH_TOPLEVEL_SIGNALS5];
166 CtkWidget *attach_widget;
167 gulong attach_widget_signals [N_ATTACH_WIDGET_SIGNALS5];
168 gint n_autohide_disablers;
169
170 guint auto_hide : 1;
171 guint animate : 1;
172 guint buttons_enabled : 1;
173 guint arrows_enabled : 1;
174
175 /* The co-ordinates are relative to center screen */
176 guint x_centered : 1;
177 guint y_centered : 1;
178
179 /* The panel is not lined up with th screen edge */
180 guint floating : 1;
181
182 /* We are currently animating a hide/show */
183 guint animating : 1;
184
185 /* This is a keyboard initiated grab operation */
186 guint grab_is_keyboard : 1;
187
188 /* The x-y co-ordinates temporarily specify the panel center.
189 * This is used when the panel is rotating, because the width/height
190 * of the toplevel might change, so we need to compute new values for
191 * those. */
192 guint position_centered : 1;
193
194 /* The toplevel is "attached" to another widget */
195 guint attached : 1;
196
197 /* Hidden temporarily because the attach_toplevel was hidden */
198 guint attach_hidden : 1;
199
200 /* More saved grab op state */
201 guint orig_x_centered : 1;
202 guint orig_y_centered : 1;
203
204 /* flag to see if we have already done geometry updating,
205 if not then we're still loading and can ignore many things */
206 guint updated_geometry_initial : 1;
207 /* flag to see if we have done the initial animation */
208 guint initial_animation_done : 1;
209};
210
211enum {
212 HIDE_SIGNAL,
213 UNHIDE_SIGNAL,
214 POPUP_PANEL_MENU_SIGNAL,
215 TOGGLE_EXPAND_SIGNAL,
216 EXPAND_SIGNAL,
217 UNEXPAND_SIGNAL,
218 TOGGLE_HIDDEN_SIGNAL,
219 BEGIN_MOVE_SIGNAL,
220 BEGIN_RESIZE_SIGNAL,
221 LAST_SIGNAL
222};
223
224enum {
225 PROP_0,
226 PROP_NAME,
227 PROP_SETTINGS_PATH,
228 PROP_EXPAND,
229 PROP_ORIENTATION,
230 PROP_SIZE,
231 PROP_X,
232 PROP_X_RIGHT,
233 PROP_X_CENTERED,
234 PROP_Y,
235 PROP_Y_BOTTOM,
236 PROP_Y_CENTERED,
237 PROP_MONITOR,
238 PROP_AUTOHIDE,
239 PROP_HIDE_DELAY,
240 PROP_UNHIDE_DELAY,
241 PROP_AUTOHIDE_SIZE,
242 PROP_ANIMATE,
243 PROP_ANIMATION_SPEED,
244 PROP_BUTTONS_ENABLED,
245 PROP_ARROWS_ENABLED
246};
247
248G_DEFINE_TYPE_WITH_PRIVATE (PanelToplevel, panel_toplevel, CTK_TYPE_WINDOW)static void panel_toplevel_init (PanelToplevel *self); static
void panel_toplevel_class_init (PanelToplevelClass *klass); static
GType panel_toplevel_get_type_once (void); static gpointer panel_toplevel_parent_class
= ((void*)0); static gint PanelToplevel_private_offset; static
void panel_toplevel_class_intern_init (gpointer klass) { panel_toplevel_parent_class
= g_type_class_peek_parent (klass); if (PanelToplevel_private_offset
!= 0) g_type_class_adjust_private_offset (klass, &PanelToplevel_private_offset
); panel_toplevel_class_init ((PanelToplevelClass*) klass); }
__attribute__ ((__unused__)) static inline gpointer panel_toplevel_get_instance_private
(PanelToplevel *self) { return (((gpointer) ((guint8*) (self
) + (glong) (PanelToplevel_private_offset)))); } GType panel_toplevel_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
= panel_toplevel_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 panel_toplevel_get_type_once (void
) { GType g_define_type_id = g_type_register_static_simple ((
ctk_window_get_type ()), g_intern_static_string ("PanelToplevel"
), sizeof (PanelToplevelClass), (GClassInitFunc)(void (*)(void
)) panel_toplevel_class_intern_init, sizeof (PanelToplevel), (
GInstanceInitFunc)(void (*)(void)) panel_toplevel_init, (GTypeFlags
) 0); { {{ PanelToplevel_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (PanelToplevelPrivate)); };} } return
g_define_type_id; }
249
250static guint toplevel_signals[LAST_SIGNAL] = {0};
251static GSList* toplevel_list = NULL((void*)0);
252
253static void panel_toplevel_calculate_animation_end_geometry(PanelToplevel *toplevel);
254
255static void panel_toplevel_update_monitor(PanelToplevel* toplevel);
256static void panel_toplevel_set_monitor_internal(PanelToplevel* toplevel, int monitor, gboolean force_resize);
257
258static void panel_toplevel_drag_threshold_changed (PanelToplevel *toplevel);
259
260static void
261update_style_classes (PanelToplevel *toplevel)
262{
263 CtkStyleContext *context;
264
265 context = ctk_widget_get_style_context (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
266
267 /*ensure the panel BG can always be themed*/
268 /*Without this ctk3.19/20 cannot set the BG color and resetting the bg to system is not immediately applied*/
269 ctk_style_context_add_class(context,"gnome-panel-menu-bar");
270 ctk_style_context_add_class(context,"cafe-panel-menu-bar");
271
272 ctk_style_context_remove_class (context, CTK_STYLE_CLASS_HORIZONTAL"horizontal");
273 ctk_style_context_remove_class (context, CTK_STYLE_CLASS_VERTICAL"vertical");
274 ctk_style_context_remove_class (context, CTK_STYLE_CLASS_RIGHT"right");
275 ctk_style_context_remove_class (context, CTK_STYLE_CLASS_LEFT"left");
276 ctk_style_context_remove_class (context, CTK_STYLE_CLASS_TOP"top");
277 ctk_style_context_remove_class (context, CTK_STYLE_CLASS_BOTTOM"bottom");
278
279 switch (toplevel->priv->orientation) {
280 case PANEL_ORIENTATION_TOP:
281 ctk_style_context_add_class (context, CTK_STYLE_CLASS_HORIZONTAL"horizontal");
282 ctk_style_context_add_class (context, CTK_STYLE_CLASS_TOP"top");
283 break;
284
285 case PANEL_ORIENTATION_LEFT:
286 ctk_style_context_add_class (context, CTK_STYLE_CLASS_VERTICAL"vertical");
287 ctk_style_context_add_class (context, CTK_STYLE_CLASS_LEFT"left");
288 break;
289
290 case PANEL_ORIENTATION_BOTTOM:
291 ctk_style_context_add_class (context, CTK_STYLE_CLASS_HORIZONTAL"horizontal");
292 ctk_style_context_add_class (context, CTK_STYLE_CLASS_BOTTOM"bottom");
293 break;
294
295 case PANEL_ORIENTATION_RIGHT:
296 ctk_style_context_add_class (context, CTK_STYLE_CLASS_VERTICAL"vertical");
297 ctk_style_context_add_class (context, CTK_STYLE_CLASS_RIGHT"right");
298 break;
299
300 default:
301 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 301, ((const char*) (__func__)), ((void*)0)); } while (0)
;
302 break;
303 }
304}
305
306GSList* panel_toplevel_list_toplevels(void)
307{
308 return toplevel_list;
309}
310
311/* Is this the last un-attached toplevel? */
312gboolean panel_toplevel_is_last_unattached(PanelToplevel* toplevel)
313{
314 GSList* l;
315
316 if (panel_toplevel_get_is_attached(toplevel))
317 {
318 return FALSE(0);
319 }
320
321 for (l = toplevel_list; l; l = l->next)
322 {
323 PanelToplevel* t = l->data;
324
325 if (t != toplevel && !panel_toplevel_get_is_attached(t))
326 {
327 return FALSE(0);
328 }
329 }
330
331 return TRUE(!(0));
332}
333
334static void panel_toplevel_get_monitor_geometry(PanelToplevel* toplevel, CdkRectangle *geom)
335{
336 g_return_if_fail(PANEL_IS_TOPLEVEL(toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL(toplevel)"); return; } } while
(0)
;
337 g_return_if_fail(geom)do { if ((geom)) { } else { g_return_if_fail_warning (((gchar
*) 0), ((const char*) (__func__)), "geom"); return; } } while
(0)
;
338
339 geom->x = panel_multimonitor_x(toplevel->priv->monitor);
340 geom->y = panel_multimonitor_y(toplevel->priv->monitor);
341 geom->width = panel_multimonitor_width(toplevel->priv->monitor);
342 geom->height = panel_multimonitor_height(toplevel->priv->monitor);
343}
344
345static CdkCursorType panel_toplevel_grab_op_cursor(PanelToplevel* toplevel, PanelGrabOpType grab_op)
346{
347 CdkCursorType retval = -1;
348
349 switch (grab_op) {
350 case PANEL_GRAB_OP_MOVE:
351 case PANEL_GRAB_OP_RESIZE:
352 if (toplevel->priv->grab_is_keyboard)
353 retval = CDK_CROSS;
354 else
355 retval = CDK_FLEUR;
356 break;
357 case PANEL_GRAB_OP_RESIZE_UP:
358 retval = CDK_TOP_SIDE;
359 break;
360 case PANEL_GRAB_OP_RESIZE_DOWN:
361 retval = CDK_BOTTOM_SIDE;
362 break;
363 case PANEL_GRAB_OP_RESIZE_LEFT:
364 retval = CDK_LEFT_SIDE;
365 break;
366 case PANEL_GRAB_OP_RESIZE_RIGHT:
367 retval = CDK_RIGHT_SIDE;
368 break;
369 default:
370 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 370, ((const char*) (__func__)), ((void*)0)); } while (0)
;
371 break;
372 }
373
374 return retval;
375}
376
377#ifdef HAVE_X111
378static void panel_toplevel_init_resize_drag_offsets(PanelToplevel* toplevel, PanelGrabOpType grab_op)
379{
380 g_assert (CDK_IS_X11_DISPLAY (ctk_widget_get_display (CTK_WIDGET (toplevel))))do { if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((ctk_widget_get_display (((((CtkWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel)), ((ctk_widget_get_type ()))))
))))); GType __t = ((cdk_x11_display_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_assertion_message_expr (((gchar*) 0), "panel-toplevel.c", 380
, ((const char*) (__func__)), "CDK_IS_X11_DISPLAY (ctk_widget_get_display (CTK_WIDGET (toplevel)))"
); } while (0)
;
381
382 toplevel->priv->drag_offset_x = 0;
383 toplevel->priv->drag_offset_y = 0;
384
385 switch (grab_op) {
386 case PANEL_GRAB_OP_RESIZE_DOWN:
387 toplevel->priv->drag_offset_y = toplevel->priv->geometry.y;
388 break;
389 case PANEL_GRAB_OP_RESIZE_UP:
390 toplevel->priv->drag_offset_y =
391 toplevel->priv->geometry.y + toplevel->priv->geometry.height;
392 break;
393 case PANEL_GRAB_OP_RESIZE_RIGHT:
394 toplevel->priv->drag_offset_x = toplevel->priv->geometry.x;
395 break;
396 case PANEL_GRAB_OP_RESIZE_LEFT:
397 toplevel->priv->drag_offset_x =
398 toplevel->priv->geometry.x + toplevel->priv->geometry.width;
399 break;
400 default:
401 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 401, ((const char*) (__func__)), ((void*)0)); } while (0)
;
402 break;
403 }
404}
405
406static void panel_toplevel_warp_pointer(PanelToplevel* toplevel)
407{
408 CtkWidget *widget;
409 CdkRectangle geometry;
410 int x, y;
411
412 widget = CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
;
413 g_return_if_fail (CDK_IS_X11_DISPLAY (ctk_widget_get_display (widget)))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((ctk_widget_get_display (widget))); GType __t = ((cdk_x11_display_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 (((gchar*) 0
), ((const char*) (__func__)), "CDK_IS_X11_DISPLAY (ctk_widget_get_display (widget))"
); return; } } while (0)
;
414
415 geometry = toplevel->priv->geometry;
416
417 x = y = 0;
418
419 switch (toplevel->priv->grab_op) {
420 case PANEL_GRAB_OP_MOVE:
421 case PANEL_GRAB_OP_RESIZE:
422 x = (geometry.width / 2);
423 y = (geometry.height / 2);
424 break;
425 case PANEL_GRAB_OP_RESIZE_UP:
426 x = (geometry.width / 2);
427 break;
428 case PANEL_GRAB_OP_RESIZE_DOWN:
429 x = (geometry.width / 2);
430 y = geometry.height;
431 break;
432 case PANEL_GRAB_OP_RESIZE_LEFT:
433 y = (geometry.height / 2);
434 break;
435 case PANEL_GRAB_OP_RESIZE_RIGHT:
436 x = geometry.width;
437 y = (geometry.height / 2);
438 break;
439 default:
440 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 440, ((const char*) (__func__)), ((void*)0)); } while (0)
;
441 break;
442 }
443
444 if (toplevel->priv->grab_op == PANEL_GRAB_OP_MOVE ||
445 toplevel->priv->grab_op == PANEL_GRAB_OP_RESIZE) {
446 toplevel->priv->drag_offset_x = x;
447 toplevel->priv->drag_offset_y = y;
448 } else
449 panel_toplevel_init_resize_drag_offsets (toplevel, toplevel->priv->grab_op);
450
451 panel_warp_pointer (ctk_widget_get_window (widget), x, y);
452}
453#endif // HAVE_X11
454
455static void panel_toplevel_begin_attached_move(PanelToplevel* toplevel, gboolean is_keyboard, guint32 time_)
456{
457 PanelWidget *attached_panel_widget;
458
459 attached_panel_widget = panel_toplevel_get_panel_widget (toplevel->priv->attach_toplevel);
460
461 panel_widget_applet_drag_start (attached_panel_widget,
462 toplevel->priv->attach_widget,
463 is_keyboard ? PW_DRAG_OFF_CENTER-2 : PW_DRAG_OFF_CURSOR-1,
464 time_);
465}
466
467static void panel_toplevel_begin_grab_op(PanelToplevel* toplevel, PanelGrabOpType op_type, gboolean grab_keyboard, guint32 time_)
468{
469 CtkWidget *widget;
470 CdkWindow *window;
471 CdkCursorType cursor_type;
472 CdkCursor *cursor;
473 CdkDisplay *display;
474 CdkSeat *seat;
475 CdkSeatCapabilities capabilities;
476
477 if (toplevel->priv->state != PANEL_STATE_NORMAL ||
478 toplevel->priv->grab_op != PANEL_GRAB_OP_NONE)
479 return;
480
481 if (panel_lockdown_get_locked_down ())
482 return;
483
484 /* If any of the position/orientation are not writable,
485 then we can't really move freely */
486 if (op_type == PANEL_GRAB_OP_MOVE &&
487 ! panel_profile_can_be_moved_freely (toplevel))
488 return;
489
490 /* If size is not writable, then we can't resize */
491 if ((op_type == PANEL_GRAB_OP_RESIZE ||
492 op_type == PANEL_GRAB_OP_RESIZE_UP ||
493 op_type == PANEL_GRAB_OP_RESIZE_DOWN ||
494 op_type == PANEL_GRAB_OP_RESIZE_LEFT ||
495 op_type == PANEL_GRAB_OP_RESIZE_RIGHT) &&
496 ! panel_profile_key_is_writable (toplevel, PANEL_TOPLEVEL_SIZE_KEY"size"))
497 return;
498
499 if (toplevel->priv->attached && op_type == PANEL_GRAB_OP_MOVE) {
500 panel_toplevel_begin_attached_move (toplevel, grab_keyboard, time_);
501 return;
502 }
503
504 widget = CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
;
505 window = ctk_widget_get_window (widget);
506
507 toplevel->priv->grab_op = op_type;
508 toplevel->priv->grab_is_keyboard = grab_keyboard;
509
510 toplevel->priv->orig_monitor = toplevel->priv->monitor;
511 toplevel->priv->orig_x = toplevel->priv->x;
512 toplevel->priv->orig_x_right = toplevel->priv->x_right;
513 toplevel->priv->orig_x_centered = toplevel->priv->x_centered;
514 toplevel->priv->orig_y = toplevel->priv->y;
515 toplevel->priv->orig_y_bottom = toplevel->priv->y_bottom;
516 toplevel->priv->orig_y_centered = toplevel->priv->y_centered;
517 toplevel->priv->orig_size = toplevel->priv->size;
518 toplevel->priv->orig_orientation = toplevel->priv->orientation;
519
520 ctk_grab_add (widget);
521
522#ifdef HAVE_X111
523 if (CDK_IS_X11_DISPLAY (ctk_widget_get_display (widget))(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(ctk_widget_get_display (widget))); GType __t = ((cdk_x11_display_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; }))))
&&
524 toplevel->priv->grab_is_keyboard) {
525 panel_toplevel_warp_pointer (toplevel);
526 }
527#endif // HAVE_X11
528
529 cursor_type = panel_toplevel_grab_op_cursor (
530 toplevel, toplevel->priv->grab_op);
531
532
533 cursor = cdk_cursor_new_for_display (cdk_display_get_default (),
534 cursor_type);
535 display = cdk_window_get_display (window);
536 seat = cdk_display_get_default_seat (display);
537 capabilities = CDK_SEAT_CAPABILITY_POINTER;
538 if (grab_keyboard)
539 capabilities |= CDK_SEAT_CAPABILITY_KEYBOARD;
540
541 cdk_seat_grab (seat, window, capabilities, FALSE(0), cursor,
542 NULL((void*)0), NULL((void*)0), NULL((void*)0));
543
544 g_object_unref (cursor);
545}
546
547static void panel_toplevel_end_grab_op (PanelToplevel *toplevel,
548 guint32 time_ G_GNUC_UNUSED__attribute__ ((__unused__)))
549{
550 CtkWidget *widget;
551 CdkDisplay *display;
552 CdkSeat *seat;
553
554 g_return_if_fail (toplevel->priv->grab_op != PANEL_GRAB_OP_NONE)do { if ((toplevel->priv->grab_op != PANEL_GRAB_OP_NONE
)) { } else { g_return_if_fail_warning (((gchar*) 0), ((const
char*) (__func__)), "toplevel->priv->grab_op != PANEL_GRAB_OP_NONE"
); return; } } while (0)
;
555
556 widget = CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
;
557
558 toplevel->priv->grab_op = PANEL_GRAB_OP_NONE;
559 toplevel->priv->grab_is_keyboard = FALSE(0);
560
561 ctk_grab_remove (widget);
562
563 display = ctk_widget_get_display (widget);
564 seat = cdk_display_get_default_seat (display);
565
566 cdk_seat_ungrab (seat);
567}
568
569static void panel_toplevel_cancel_grab_op (PanelToplevel *toplevel,
570 guint32 time_ G_GNUC_UNUSED__attribute__ ((__unused__)))
571{
572 panel_toplevel_set_orientation (toplevel, toplevel->priv->orig_orientation);
573 panel_toplevel_set_monitor (toplevel, toplevel->priv->orig_monitor);
574 panel_toplevel_set_size (toplevel, toplevel->priv->orig_size);
575 panel_toplevel_set_x (toplevel,
576 toplevel->priv->orig_x,
577 toplevel->priv->orig_x_right,
578 toplevel->priv->orig_x_centered);
579 panel_toplevel_set_y (toplevel,
580 toplevel->priv->orig_y,
581 toplevel->priv->orig_y_bottom,
582 toplevel->priv->orig_y_centered);
583}
584
585static void panel_toplevel_resize_to_pointer(PanelToplevel* toplevel, int x, int y)
586{
587 int new_size;
588 int new_x, new_y;
589 int new_x_right, new_y_bottom;
590 int new_x_centered, new_y_centered;
591 CdkRectangle monitor_geom;
592
593 new_size = toplevel->priv->size;
594 new_x = toplevel->priv->x;
595 new_y = toplevel->priv->y;
596 new_x_right = toplevel->priv->x_right;
597 new_y_bottom = toplevel->priv->y_bottom;
598 new_x_centered = toplevel->priv->x_centered;
599 new_y_centered = toplevel->priv->y_centered;
600
601 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
602
603 switch (toplevel->priv->grab_op) {
604 case PANEL_GRAB_OP_RESIZE_UP:
605 new_size = toplevel->priv->drag_offset_y - y;
606 new_size = CLAMP (new_size, 0, monitor_geom.height / 4)(((new_size) > (monitor_geom.height / 4)) ? (monitor_geom.
height / 4) : (((new_size) < (0)) ? (0) : (new_size)))
;
607 new_y -= (new_size - toplevel->priv->size);
608 if (!toplevel->priv->y_centered && (new_y + new_size / 2) > monitor_geom.height / 2)
609 new_y_bottom = monitor_geom.height - (new_y + new_size);
610 else
611 new_y_bottom = -1;
612 break;
613 case PANEL_GRAB_OP_RESIZE_DOWN:
614 new_size = y - toplevel->priv->drag_offset_y;
615 new_size = CLAMP (new_size, 0, monitor_geom.height / 4)(((new_size) > (monitor_geom.height / 4)) ? (monitor_geom.
height / 4) : (((new_size) < (0)) ? (0) : (new_size)))
;
616 if (!toplevel->priv->y_centered && (new_y + new_size / 2) > monitor_geom.height / 2)
617 new_y_bottom = monitor_geom.height - (new_y + new_size);
618 else
619 new_y_bottom = -1;
620 break;
621 case PANEL_GRAB_OP_RESIZE_LEFT:
622 new_size = toplevel->priv->drag_offset_x - x;
623 new_size = CLAMP (new_size, 0, monitor_geom.width / 4)(((new_size) > (monitor_geom.width / 4)) ? (monitor_geom.width
/ 4) : (((new_size) < (0)) ? (0) : (new_size)))
;
624 new_x -= (new_size - toplevel->priv->size);
625 if (!toplevel->priv->x_centered && (new_x + new_size / 2) > monitor_geom.width / 2)
626 new_x_right = monitor_geom.width - (new_x + new_size);
627 else
628 new_x_right = -1;
629 break;
630 case PANEL_GRAB_OP_RESIZE_RIGHT:
631 new_size = x - toplevel->priv->drag_offset_x;
632 new_size = CLAMP (new_size, 0, monitor_geom.width / 4)(((new_size) > (monitor_geom.width / 4)) ? (monitor_geom.width
/ 4) : (((new_size) < (0)) ? (0) : (new_size)))
;
633 if (!toplevel->priv->x_centered && (new_x + new_size / 2) > monitor_geom.width / 2)
634 new_x_right = monitor_geom.width - (new_x + new_size);
635 else
636 new_x_right = -1;
637 break;
638 default:
639 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 639, ((const char*) (__func__)), ((void*)0)); } while (0)
;
640 break;
641 }
642
643 if (new_size == 0)
644 return;
645
646 panel_toplevel_set_x (toplevel, new_x, new_x_right, new_x_centered);
647 panel_toplevel_set_y (toplevel, new_y, new_y_bottom, new_y_centered);
648 panel_toplevel_set_size (toplevel, new_size);
649}
650
651/* this is called for expanded panels that are dragged around */
652static void panel_toplevel_calc_new_orientation(PanelToplevel* toplevel, int pointer_x, int pointer_y)
653{
654 PanelOrientation new_orientation;
655 int hborder, vborder;
656 int monitor;
657 int monitor_width, monitor_height;
658 int new_x, new_y;
659
660 monitor = panel_multimonitor_get_monitor_at_point (pointer_x, pointer_y);
661
662 if (toplevel->priv->geometry.height < toplevel->priv->geometry.width)
663 vborder = hborder = (3 * toplevel->priv->geometry.height) >> 1;
664 else
665 vborder = hborder = (3 * toplevel->priv->geometry.width) >> 1;
666
667 new_x = pointer_x - panel_multimonitor_x (monitor);
668 new_y = pointer_y - panel_multimonitor_y (monitor);
669 monitor_width = panel_multimonitor_width (monitor);
670 monitor_height = panel_multimonitor_height (monitor);
671
672 new_orientation = toplevel->priv->orientation;
673
674 switch (toplevel->priv->orientation) {
675 case PANEL_ORIENTATION_TOP:
676 if (new_y > (monitor_height - hborder))
677 new_orientation = PANEL_ORIENTATION_BOTTOM;
678
679 else if (new_y > hborder) {
680 if (new_x > (monitor_width - vborder))
681 new_orientation = PANEL_ORIENTATION_RIGHT;
682 else if (new_x < vborder)
683 new_orientation = PANEL_ORIENTATION_LEFT;
684 }
685 break;
686 case PANEL_ORIENTATION_BOTTOM:
687 if (new_y < hborder)
688 new_orientation = PANEL_ORIENTATION_TOP;
689
690 else if (new_y < (monitor_height - hborder)) {
691 if (new_x > (monitor_width - vborder))
692 new_orientation = PANEL_ORIENTATION_RIGHT;
693 else if (new_x < vborder)
694 new_orientation = PANEL_ORIENTATION_LEFT;
695 }
696 break;
697 case PANEL_ORIENTATION_LEFT:
698 if (new_x > (monitor_width - vborder))
699 new_orientation = PANEL_ORIENTATION_RIGHT;
700
701 else if (new_x > vborder) {
702 if (new_y > (monitor_height - hborder))
703 new_orientation = PANEL_ORIENTATION_BOTTOM;
704 else if (new_y < hborder)
705 new_orientation = PANEL_ORIENTATION_TOP;
706 }
707 break;
708 case PANEL_ORIENTATION_RIGHT:
709 if (new_x < vborder)
710 new_orientation = PANEL_ORIENTATION_LEFT;
711
712 else if (new_x < (monitor_width - vborder)) {
713 if (new_y > (monitor_height - hborder))
714 new_orientation = PANEL_ORIENTATION_BOTTOM;
715 else if (new_y < hborder)
716 new_orientation = PANEL_ORIENTATION_TOP;
717 }
718 break;
719 default:
720 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 720, ((const char*) (__func__)), ((void*)0)); } while (0)
;
721 break;
722 }
723
724 panel_toplevel_set_monitor (toplevel, monitor);
725 panel_toplevel_set_orientation (toplevel, new_orientation);
726}
727
728static void panel_toplevel_move_to(PanelToplevel* toplevel, int new_x, int new_y)
729{
730 PanelOrientation new_orientation;
731 gboolean x_centered, y_centered;
732 CdkPoint display_min, display_max;
733 CdkRectangle monitor_geom;
734 int width, height;
735 int new_monitor;
736 int x, y, x_right, y_bottom;
737 int snap_tolerance;
738
739 panel_multimonitor_get_bounds (&display_min, &display_max);
740
741 width = toplevel->priv->geometry.width;
742 height = toplevel->priv->geometry.height;
743
744 snap_tolerance = toplevel->priv->snap_tolerance;
745
746 new_x = CLAMP (new_x, 0, display_max.x - width)(((new_x) > (display_max.x - width)) ? (display_max.x - width
) : (((new_x) < (0)) ? (0) : (new_x)))
;
747 new_y = CLAMP (new_y, 0, display_max.y - height)(((new_y) > (display_max.y - height)) ? (display_max.y - height
) : (((new_y) < (0)) ? (0) : (new_y)))
;
748
749 new_orientation = toplevel->priv->orientation;
750
751 if (new_x <= (display_min.x + snap_tolerance) &&
752 toplevel->priv->orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT))
753 new_orientation = PANEL_ORIENTATION_LEFT;
754
755 else if ((new_x + width) >= (display_max.x - snap_tolerance) &&
756 toplevel->priv->orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT))
757 new_orientation = PANEL_ORIENTATION_RIGHT;
758
759 if (new_y <= (display_min.y + snap_tolerance) &&
760 toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM))
761 new_orientation = PANEL_ORIENTATION_TOP;
762
763 else if ((new_y + height) >= (display_max.y - snap_tolerance) &&
764 toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM))
765 new_orientation = PANEL_ORIENTATION_BOTTOM;
766
767 new_monitor = panel_multimonitor_get_monitor_at_point (new_x, new_y);
768
769 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
770
771 x_centered = toplevel->priv->x_centered;
772 y_centered = toplevel->priv->y_centered;
773
774 x = new_x - panel_multimonitor_x (new_monitor);
775 y = new_y - panel_multimonitor_y (new_monitor);
776
777 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)) {
778 y_centered = FALSE(0);
779 if (new_y <= display_min.y + snap_tolerance ||
780 new_y + height >= display_max.y - snap_tolerance)
781 x_centered = abs (x - ((monitor_geom.width - width) / 2))
782 <= snap_tolerance;
783 else
784 x_centered = FALSE(0);
785 } else {
786 x_centered = FALSE(0);
787 if (new_x <= display_min.x + snap_tolerance ||
788 new_x + width >= display_max.x - snap_tolerance)
789 y_centered = abs (y - ((monitor_geom.height - height) / 2))
790 <= snap_tolerance;
791 else
792 y_centered = FALSE(0);
793 }
794
795 if (x_centered)
796 x = (monitor_geom.width - width) / 2;
797 if (y_centered)
798 y = (monitor_geom.height - height) / 2;
799
800 if (!x_centered && (x + width / 2) > monitor_geom.width / 2)
801 x_right = monitor_geom.width - (x + width);
802 else
803 x_right = -1;
804
805 if (!y_centered && (y + height / 2) > monitor_geom.height / 2)
806 y_bottom = monitor_geom.height - (y + height);
807 else
808 y_bottom = -1;
809
810 panel_toplevel_set_monitor (toplevel, new_monitor);
811 panel_toplevel_set_orientation (toplevel, new_orientation);
812 panel_toplevel_set_x (toplevel, x, x_right, x_centered);
813 panel_toplevel_set_y (toplevel, y, y_bottom, y_centered);
814}
815
816static void panel_toplevel_move_to_pointer(PanelToplevel* toplevel, int pointer_x, int pointer_y)
817{
818 int new_x, new_y;
819
820 new_x = pointer_x - toplevel->priv->drag_offset_x;
821 new_y = pointer_y - toplevel->priv->drag_offset_y;
822
823 panel_toplevel_move_to (toplevel, new_x, new_y);
824}
825
826static void panel_toplevel_rotate_to_pointer(PanelToplevel* toplevel, int pointer_x, int pointer_y)
827{
828 int x_diff, y_diff;
829 int x, y;
830 int snap_tolerance;
831
832 x = toplevel->priv->geometry.x;
833 y = toplevel->priv->geometry.y;
834 snap_tolerance = toplevel->priv->snap_tolerance;
835
836 x_diff = pointer_x - (x + toplevel->priv->geometry.width / 2);
837 y_diff = pointer_y - (y + toplevel->priv->geometry.height / 2);
838
839 if (((-y_diff > x_diff + snap_tolerance) && x_diff > 0 && y_diff < 0) ||
840 (( y_diff < x_diff + snap_tolerance) && x_diff < 0 && y_diff < 0))
841 panel_toplevel_set_orientation (toplevel, PANEL_ORIENTATION_RIGHT);
842
843 else if (((-x_diff < y_diff - snap_tolerance) && x_diff > 0 && y_diff < 0) ||
844 (( x_diff > y_diff - snap_tolerance) && x_diff > 0 && y_diff > 0))
845 panel_toplevel_set_orientation (toplevel, PANEL_ORIENTATION_BOTTOM);
846
847 else if ((( y_diff > x_diff + snap_tolerance) && x_diff > 0 && y_diff > 0) ||
848 ((-y_diff < x_diff + snap_tolerance) && x_diff < 0 && y_diff > 0))
849 panel_toplevel_set_orientation (toplevel, PANEL_ORIENTATION_LEFT);
850
851 else if (((-x_diff > y_diff - snap_tolerance) && x_diff < 0 && y_diff > 0) ||
852 (( x_diff < y_diff - snap_tolerance) && x_diff < 0 && y_diff < 0))
853 panel_toplevel_set_orientation (toplevel, PANEL_ORIENTATION_TOP);
854}
855
856#ifdef HAVE_X111
857static gboolean panel_toplevel_warp_pointer_increment(PanelToplevel* toplevel, int keyval, int increment)
858{
859 CdkScreen *screen;
860 CdkWindow *root_window;
861 CdkDevice *device;
862 int new_x, new_y;
863
864 screen = ctk_window_get_screen (CTK_WINDOW (toplevel)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_window_get_type ()))))))
);
865 g_return_val_if_fail (CDK_IS_X11_SCREEN (screen), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((screen)); GType __t = ((cdk_x11_screen_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 (((gchar*) 0), ((const char*
) (__func__)), "CDK_IS_X11_SCREEN (screen)"); return ((0)); }
} while (0)
;
866 root_window = cdk_screen_get_root_window (screen);
867 device = cdk_seat_get_pointer (cdk_display_get_default_seat (ctk_widget_get_display (CTK_WIDGET(root_window)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((root_window)), ((ctk_widget_get_type ()))))))
)));
868 cdk_window_get_device_position (ctk_widget_get_window (CTK_WIDGET (root_window)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((root_window)), ((ctk_widget_get_type ()))))))
), device, &new_x, &new_y, NULL((void*)0));
869
870 switch (keyval) {
871 case CDK_KEY_Up0xff52:
872 case CDK_KEY_KP_Up0xff97:
873 new_y -= increment;
874 break;
875 case CDK_KEY_Left0xff51:
876 case CDK_KEY_KP_Left0xff96:
877 new_x -= increment;
878 break;
879 case CDK_KEY_Down0xff54:
880 case CDK_KEY_KP_Down0xff99:
881 new_y += increment;
882 break;
883 case CDK_KEY_Right0xff53:
884 case CDK_KEY_KP_Right0xff98:
885 new_x += increment;
886 break;
887 default:
888 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 888, ((const char*) (__func__)), ((void*)0)); } while (0)
;
889 return FALSE(0);
890 }
891
892 panel_warp_pointer (root_window, new_x, new_y);
893
894 return TRUE(!(0));
895}
896
897static gboolean panel_toplevel_move_keyboard_floating(PanelToplevel* toplevel, CdkEventKey* event)
898{
899#define SMALL_INCREMENT 1
900#define NORMAL_INCREMENT 10
901
902 int increment = NORMAL_INCREMENT;
903
904 if ((event->state & ctk_accelerator_get_default_mod_mask ()) == CDK_SHIFT_MASK)
905 increment = SMALL_INCREMENT;
906
907 return panel_toplevel_warp_pointer_increment (
908 toplevel, event->keyval, increment);
909
910#undef SMALL_INCREMENT
911#undef NORMAL_INCREMENT
912}
913
914#endif // HAVE_X11
915
916static gboolean panel_toplevel_move_keyboard_expanded(PanelToplevel* toplevel, CdkEventKey* event)
917{
918 PanelOrientation new_orientation;
919
920 switch (event->keyval) {
921 case CDK_KEY_Up0xff52:
922 case CDK_KEY_KP_Up0xff97:
923 new_orientation = PANEL_ORIENTATION_TOP;
924 break;
925 case CDK_KEY_Left0xff51:
926 case CDK_KEY_KP_Left0xff96:
927 new_orientation = PANEL_ORIENTATION_LEFT;
928 break;
929 case CDK_KEY_Down0xff54:
930 case CDK_KEY_KP_Down0xff99:
931 new_orientation = PANEL_ORIENTATION_BOTTOM;
932 break;
933 case CDK_KEY_Right0xff53:
934 case CDK_KEY_KP_Right0xff98:
935 new_orientation = PANEL_ORIENTATION_RIGHT;
936 break;
937 default:
938 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 938, ((const char*) (__func__)), ((void*)0)); } while (0)
;
939 return FALSE(0);
940 }
941
942 panel_toplevel_set_orientation (toplevel, new_orientation);
943
944 return TRUE(!(0));
945}
946
947static gboolean panel_toplevel_initial_resize_keypress(PanelToplevel* toplevel, CdkEventKey* event)
948{
949 PanelGrabOpType grab_op;
950
951 switch (event->keyval) {
952 case CDK_KEY_Up0xff52:
953 case CDK_KEY_KP_Up0xff97:
954 if (!(toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)))
955 return FALSE(0);
956 grab_op = PANEL_GRAB_OP_RESIZE_UP;
957 break;
958 case CDK_KEY_Left0xff51:
959 case CDK_KEY_KP_Left0xff96:
960 if (!(toplevel->priv->orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT)))
961 return FALSE(0);
962 grab_op = PANEL_GRAB_OP_RESIZE_LEFT;
963 break;
964 case CDK_KEY_Down0xff54:
965 case CDK_KEY_KP_Down0xff99:
966 if (!(toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)))
967 return FALSE(0);
968 grab_op = PANEL_GRAB_OP_RESIZE_DOWN;
969 break;
970 case CDK_KEY_Right0xff53:
971 case CDK_KEY_KP_Right0xff98:
972 if (!(toplevel->priv->orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT)))
973 return FALSE(0);
974 grab_op = PANEL_GRAB_OP_RESIZE_RIGHT;
975 break;
976 default:
977 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 977, ((const char*) (__func__)), ((void*)0)); } while (0)
;
978 return FALSE(0);
979 }
980
981 panel_toplevel_end_grab_op (toplevel, event->time);
982 panel_toplevel_begin_grab_op (toplevel, grab_op, TRUE(!(0)), event->time);
983
984 return TRUE(!(0));
985}
986
987static gboolean panel_toplevel_handle_grab_op_key_event(PanelToplevel* toplevel, CdkEventKey* event)
988{
989 gboolean retval = FALSE(0);
990
991 switch (event->keyval) {
992 case CDK_KEY_Up0xff52:
993 case CDK_KEY_KP_Up0xff97:
994 case CDK_KEY_Left0xff51:
995 case CDK_KEY_KP_Left0xff96:
996 case CDK_KEY_Down0xff54:
997 case CDK_KEY_KP_Down0xff99:
998 case CDK_KEY_Right0xff53:
999 case CDK_KEY_KP_Right0xff98:
1000 switch (toplevel->priv->grab_op) {
1001 case PANEL_GRAB_OP_MOVE:
1002 if (toplevel->priv->expand) {
1003 retval = panel_toplevel_move_keyboard_expanded (
1004 toplevel, event);
1005 }
1006#ifdef HAVE_X111
1007 else if (CDK_IS_X11_DISPLAY (ctk_widget_get_display (CTK_WIDGET (toplevel)))(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(ctk_widget_get_display (((((CtkWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel)), ((ctk_widget_get_type ()))))
))))); GType __t = ((cdk_x11_display_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; }))))
) {
1008 retval = panel_toplevel_move_keyboard_floating (
1009 toplevel, event);
1010 }
1011#endif // HAVE_X11
1012 break;
1013 case PANEL_GRAB_OP_RESIZE:
1014 retval = panel_toplevel_initial_resize_keypress (toplevel, event);
1015 break;
1016 case PANEL_GRAB_OP_RESIZE_UP:
1017 case PANEL_GRAB_OP_RESIZE_DOWN:
1018 case PANEL_GRAB_OP_RESIZE_LEFT:
1019 case PANEL_GRAB_OP_RESIZE_RIGHT:
1020#ifdef HAVE_X111
1021 if (CDK_IS_X11_DISPLAY (ctk_widget_get_display (CTK_WIDGET (toplevel)))(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(ctk_widget_get_display (((((CtkWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel)), ((ctk_widget_get_type ()))))
))))); GType __t = ((cdk_x11_display_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; }))))
)
1022 retval = panel_toplevel_warp_pointer_increment (toplevel, event->keyval, 1);
1023#endif // HAVE_X11
1024 break;
1025 default:
1026 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 1026, ((const char*) (__func__)), ((void*)0)); } while (0)
;
1027 break;
1028 }
1029 break;
1030 case CDK_KEY_Escape0xff1b:
1031 panel_toplevel_cancel_grab_op (toplevel, event->time);
1032 case CDK_KEY_Return0xff0d: /* drop through*/
1033 case CDK_KEY_KP_Enter0xff8d:
1034 case CDK_KEY_space0x020:
1035 case CDK_KEY_KP_Space0xff80:
1036 panel_toplevel_end_grab_op (toplevel, event->time);
1037 retval = TRUE(!(0));
1038 default: /* drop through*/
1039 break;
1040 }
1041
1042 return retval;
1043}
1044
1045static gboolean panel_toplevel_handle_grab_op_motion_event(PanelToplevel* toplevel, CdkEventMotion* event)
1046{
1047 switch (toplevel->priv->grab_op) {
1048 case PANEL_GRAB_OP_MOVE:
1049 if (toplevel->priv->expand)
1050 panel_toplevel_calc_new_orientation (
1051 toplevel, event->x_root, event->y_root);
1052
1053 else if ((event->state & ctk_accelerator_get_default_mod_mask ()) == CDK_CONTROL_MASK)
1054 panel_toplevel_rotate_to_pointer (
1055 toplevel, event->x_root, event->y_root);
1056
1057 else
1058 panel_toplevel_move_to_pointer (
1059 toplevel, event->x_root, event->y_root);
1060 return TRUE(!(0));
1061 case PANEL_GRAB_OP_RESIZE_UP:
1062 case PANEL_GRAB_OP_RESIZE_DOWN:
1063 case PANEL_GRAB_OP_RESIZE_LEFT:
1064 case PANEL_GRAB_OP_RESIZE_RIGHT:
1065 panel_toplevel_resize_to_pointer (toplevel, event->x_root, event->y_root);
1066 return TRUE(!(0));
1067 default:
1068 break;
1069 }
1070
1071 return FALSE(0);
1072}
1073
1074static void panel_toplevel_calc_floating(PanelToplevel* toplevel)
1075{
1076 CdkRectangle monitor_geom;
1077 CdkPoint position_on_monitor;
1078 int snap_tolerance;
1079
1080 if (toplevel->priv->expand) {
1081 toplevel->priv->floating = FALSE(0);
1082 return;
1083 }
1084
1085 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
1086
1087 if (toplevel->priv->x_right == -1)
1088 position_on_monitor.x = toplevel->priv->x;
1089 else
1090 position_on_monitor.x = monitor_geom.width - (toplevel->priv->x_right + toplevel->priv->geometry.width);
1091 if (toplevel->priv->y_bottom == -1)
1092 position_on_monitor.y = toplevel->priv->y;
1093 else
1094 position_on_monitor.y = monitor_geom.height - (toplevel->priv->y_bottom + toplevel->priv->geometry.height);
1095
1096 snap_tolerance = toplevel->priv->snap_tolerance;
1097
1098 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM))
1099 toplevel->priv->floating =
1100 (position_on_monitor.y > snap_tolerance) &&
1101 (position_on_monitor.y < (monitor_geom.height - toplevel->priv->geometry.height - snap_tolerance));
1102 else
1103 toplevel->priv->floating =
1104 (position_on_monitor.x > snap_tolerance) &&
1105 (position_on_monitor.x < (monitor_geom.width - toplevel->priv->geometry.width - snap_tolerance));
1106}
1107
1108void panel_toplevel_push_autohide_disabler(PanelToplevel* toplevel)
1109{
1110 g_return_if_fail (toplevel != NULL)do { if ((toplevel != ((void*)0))) { } else { g_return_if_fail_warning
(((gchar*) 0), ((const char*) (__func__)), "toplevel != NULL"
); return; } } while (0)
;
1111
1112 if (!toplevel->priv->n_autohide_disablers++)
1113 panel_toplevel_queue_auto_hide (toplevel);
1114}
1115
1116void panel_toplevel_pop_autohide_disabler(PanelToplevel* toplevel)
1117{
1118 g_return_if_fail (toplevel != NULL)do { if ((toplevel != ((void*)0))) { } else { g_return_if_fail_warning
(((gchar*) 0), ((const char*) (__func__)), "toplevel != NULL"
); return; } } while (0)
;
1119 g_return_if_fail (toplevel->priv->n_autohide_disablers > 0)do { if ((toplevel->priv->n_autohide_disablers > 0))
{ } else { g_return_if_fail_warning (((gchar*) 0), ((const char
*) (__func__)), "toplevel->priv->n_autohide_disablers > 0"
); return; } } while (0)
;
1120
1121 if (!--toplevel->priv->n_autohide_disablers)
1122 panel_toplevel_queue_auto_hide (toplevel);
1123}
1124
1125static gboolean panel_toplevel_get_autohide_disabled(PanelToplevel* toplevel)
1126{
1127 return toplevel->priv->n_autohide_disablers > 0 ? TRUE(!(0)) : FALSE(0);
1128}
1129
1130static gboolean panel_toplevel_hide_button_event (PanelToplevel *toplevel,
1131 CdkEventButton *event,
1132 CtkButton *button G_GNUC_UNUSED__attribute__ ((__unused__)))
1133{
1134 if (event->button == 1)
1135 return FALSE(0);
1136
1137 return ctk_widget_event (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
, (CdkEvent *) event);
1138}
1139
1140static void panel_toplevel_hide_button_clicked(PanelToplevel* toplevel, CtkButton* button)
1141{
1142 CtkArrowType arrow_type;
1143 gboolean ltr;
1144
1145 if (toplevel->priv->animating ||
1146 toplevel->priv->state == PANEL_STATE_AUTO_HIDDEN)
1147 return;
1148
1149 ltr = ctk_widget_get_direction (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
) == CTK_TEXT_DIR_LTR;
1150 arrow_type = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button), "arrow-type"))((gint) (glong) (g_object_get_data (((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((button)), (((GType) ((20) << (2)))
))))), "arrow-type")))
;
1151
1152 if (toplevel->priv->state == PANEL_STATE_NORMAL) {
1153 CtkDirectionType direction = -1;
1154
1155 switch (arrow_type) {
1156 case CTK_ARROW_UP:
1157 direction = CTK_DIR_UP;
1158 break;
1159 case CTK_ARROW_DOWN:
1160 direction = CTK_DIR_DOWN;
1161 break;
1162 case CTK_ARROW_LEFT:
1163 direction = ltr ? CTK_DIR_LEFT : CTK_DIR_RIGHT;
1164 break;
1165 case CTK_ARROW_RIGHT:
1166 direction = ltr ? CTK_DIR_RIGHT : CTK_DIR_LEFT;
1167 break;
1168 default:
1169 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 1169, ((const char*) (__func__)), ((void*)0)); } while (0)
;
1170 break;
1171 }
1172
1173 panel_toplevel_hide (toplevel, FALSE(0), direction);
1174 } else
1175 panel_toplevel_unhide (toplevel);
1176}
1177
1178static void
1179set_arrow_type (CtkImage *image,
1180 CtkArrowType arrow_type)
1181{
1182 switch (arrow_type)
1183 {
1184 case CTK_ARROW_NONE:
1185 case CTK_ARROW_DOWN:
1186 ctk_image_set_from_icon_name (image, "pan-down-symbolic", CTK_ICON_SIZE_BUTTON);
1187 break;
1188 case CTK_ARROW_UP:
1189 ctk_image_set_from_icon_name (image, "pan-up-symbolic", CTK_ICON_SIZE_BUTTON);
1190 break;
1191 case CTK_ARROW_LEFT:
1192 ctk_image_set_from_icon_name (image, "pan-start-symbolic", CTK_ICON_SIZE_BUTTON);
1193 break;
1194 case CTK_ARROW_RIGHT:
1195 ctk_image_set_from_icon_name (image, "pan-end-symbolic", CTK_ICON_SIZE_BUTTON);
1196 break;
1197 }
1198}
1199
1200static CtkWidget *
1201panel_toplevel_add_hide_button (PanelToplevel *toplevel,
1202 CtkArrowType arrow_type,
1203 int left,
1204 int top)
1205{
1206
1207 CtkWidget *button;
1208 AtkObject *obj;
1209 CtkWidget *arrow;
1210
1211 button = ctk_button_new ();
1212 obj = ctk_widget_get_accessible (button);
1213 atk_object_set_name (obj, _("Hide Panel")gettext ("Hide Panel"));
1214 ctk_widget_set_can_default (button, FALSE(0));
1215
1216 arrow = ctk_image_new ();
1217 set_arrow_type (CTK_IMAGE (arrow)((((CtkImage*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((arrow)), ((ctk_image_get_type ()))))))
, arrow_type);
1218 ctk_container_add (CTK_CONTAINER (button)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((button)), ((ctk_container_get_type ()))))))
, arrow);
1219 ctk_widget_show (arrow);
1220
1221 g_object_set_data (G_OBJECT (button)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((button)), (((GType) ((20) << (2))))))))
,
1222 "arrow-type",
1223 GINT_TO_POINTER (arrow_type)((gpointer) (glong) (arrow_type)));
1224
1225 g_signal_connect_swapped (button, "clicked",g_signal_connect_data ((button), ("clicked"), (((GCallback) (
panel_toplevel_hide_button_clicked))), (toplevel), ((void*)0)
, G_CONNECT_SWAPPED)
1226 G_CALLBACK (panel_toplevel_hide_button_clicked), toplevel)g_signal_connect_data ((button), ("clicked"), (((GCallback) (
panel_toplevel_hide_button_clicked))), (toplevel), ((void*)0)
, G_CONNECT_SWAPPED)
;
1227 g_signal_connect_swapped (button, "button_press_event",g_signal_connect_data ((button), ("button_press_event"), (((GCallback
) (panel_toplevel_hide_button_event))), (toplevel), ((void*)0
), G_CONNECT_SWAPPED)
1228 G_CALLBACK (panel_toplevel_hide_button_event), toplevel)g_signal_connect_data ((button), ("button_press_event"), (((GCallback
) (panel_toplevel_hide_button_event))), (toplevel), ((void*)0
), G_CONNECT_SWAPPED)
;
1229 g_signal_connect_swapped (button, "button_release_event",g_signal_connect_data ((button), ("button_release_event"), ((
(GCallback) (panel_toplevel_hide_button_event))), (toplevel),
((void*)0), G_CONNECT_SWAPPED)
1230 G_CALLBACK (panel_toplevel_hide_button_event), toplevel)g_signal_connect_data ((button), ("button_release_event"), ((
(GCallback) (panel_toplevel_hide_button_event))), (toplevel),
((void*)0), G_CONNECT_SWAPPED)
;
1231
1232 ctk_grid_attach (CTK_GRID (toplevel->priv->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->grid)), ((ctk_grid_get_type ()))))
))
, button, left, top, 1, 1);
1233
1234 return button;
1235}
1236
1237static void panel_toplevel_update_buttons_showing(PanelToplevel* toplevel)
1238{
1239 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)) {
1240 ctk_widget_hide (toplevel->priv->hide_button_top);
1241 ctk_widget_hide (toplevel->priv->hide_button_bottom);
1242 ctk_widget_show (toplevel->priv->hide_button_left);
1243 ctk_widget_show (toplevel->priv->hide_button_right);
1244 } else {
1245 ctk_widget_show (toplevel->priv->hide_button_top);
1246 ctk_widget_show (toplevel->priv->hide_button_bottom);
1247 ctk_widget_hide (toplevel->priv->hide_button_left);
1248 ctk_widget_hide (toplevel->priv->hide_button_right);
1249 }
1250
1251 if (toplevel->priv->attached) {
1252 switch (panel_toplevel_get_orientation (toplevel->priv->attach_toplevel)) {
1253 case PANEL_ORIENTATION_TOP:
1254 ctk_widget_hide (toplevel->priv->hide_button_top);
1255 break;
1256 case PANEL_ORIENTATION_BOTTOM:
1257 ctk_widget_hide (toplevel->priv->hide_button_bottom);
1258 break;
1259 case PANEL_ORIENTATION_LEFT:
1260 ctk_widget_hide (toplevel->priv->hide_button_left);
1261 break;
1262 case PANEL_ORIENTATION_RIGHT:
1263 ctk_widget_hide (toplevel->priv->hide_button_right);
1264 break;
1265 default:
1266 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 1266, ((const char*) (__func__)), ((void*)0)); } while (0)
;
1267 break;
1268 }
1269 }
1270}
1271
1272/* force set hide button size on panel size < 30px */
1273static void panel_toplevel_update_hide_buttons_size (CtkWidget *button, int panel_size)
1274{
1275 CtkCssProvider *css_provider;
1276 CtkStyleContext *context;
1277 CtkWidget *arrow;
1278 CtkSettings *settings;
1279 gchar *ctk_theme_name = NULL((void*)0);
1280
1281 context = ctk_widget_get_style_context (button);
1282 ctk_style_context_add_class (context, "panel-button");
1283
1284 /* get defaults from theme */
1285 settings = ctk_settings_get_default ();
1286 g_object_get (settings, "ctk-theme-name", &ctk_theme_name, NULL((void*)0));
1287 css_provider = ctk_css_provider_get_named (ctk_theme_name, NULL((void*)0));
1288 g_free (ctk_theme_name);
1289
1290 /* set custom css by adding our custom code to the default theme css
1291 *
1292 * NOTE that contriary to the documentation:
1293 * https://developer.gnome.org/ctk3/stable/CtkCssProvider.html#ctk-css-provider-load-from-data
1294 * the previously loaded theme is NOT cleared from the css_provider. (reason unknown)
1295 * In other words, this works exactly, how we need it here.
1296 * ALSO NOTE that using ctk_css_provider_to_string () to convert the theme css data into a string
1297 * and then adding the custom css, then adding this updated css to a css_provider
1298 * with the ctk_css_provider_load_from_data () also works,
1299 * however some themes can't be easily converted to strings, beacuse of the binary data
1300 * they contain. This causes a delay of minutes in loading the cafe-panel,
1301 * and so this approach is not viable. */
1302 if (panel_size < 30) {
1303 ctk_css_provider_load_from_data (css_provider, ".panel-button {min-height: 13px; min-width: 13px; padding: 0px;}", -1, NULL((void*)0));
1304 }
1305
1306 ctk_style_context_add_provider (context, CTK_STYLE_PROVIDER (css_provider)((((CtkStyleProvider*) (void *) g_type_check_instance_cast ((
GTypeInstance*) ((css_provider)), ((ctk_style_provider_get_type
()))))))
, CTK_STYLE_PROVIDER_PRIORITY_APPLICATION600);
1307
1308 /* get arrow image */
1309 arrow = ctk_bin_get_child (CTK_BIN (button)((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((button)), ((ctk_bin_get_type ()))))))
);
1310
1311 /* set image size */
1312 if (panel_size < 20) {
1313 ctk_image_set_pixel_size (CTK_IMAGE (arrow)((((CtkImage*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((arrow)), ((ctk_image_get_type ()))))))
, 12);
1314 } else if (panel_size < 40) {
1315 ctk_image_set_pixel_size (CTK_IMAGE (arrow)((((CtkImage*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((arrow)), ((ctk_image_get_type ()))))))
, 16);
1316 } else if (panel_size < 60) {
1317 ctk_image_set_pixel_size (CTK_IMAGE (arrow)((((CtkImage*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((arrow)), ((ctk_image_get_type ()))))))
, 22);
1318 } else {
1319 ctk_image_set_pixel_size (CTK_IMAGE (arrow)((((CtkImage*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((arrow)), ((ctk_image_get_type ()))))))
, 24);
1320 }
1321}
1322
1323static void panel_toplevel_update_hide_buttons(PanelToplevel* toplevel)
1324{
1325
1326 int panel_size = toplevel->priv->size;
1327 int hb_size = 0;
1328
1329 if (toplevel->priv->buttons_enabled) {
1330 panel_toplevel_update_buttons_showing (toplevel);
1331
1332 panel_toplevel_update_hide_buttons_size (toplevel->priv->hide_button_top, panel_size);
1333 panel_toplevel_update_hide_buttons_size (toplevel->priv->hide_button_bottom, panel_size);
1334 panel_toplevel_update_hide_buttons_size (toplevel->priv->hide_button_left, panel_size);
1335 panel_toplevel_update_hide_buttons_size (toplevel->priv->hide_button_right, panel_size);
1336
1337 } else {
1338 g_object_set (
1339 G_OBJECT (toplevel->priv->hide_button_top)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->hide_button_top)), (((GType) ((20)
<< (2))))))))
,
1340 "visible", toplevel->priv->state == PANEL_STATE_HIDDEN_DOWN,
1341 NULL((void*)0));
1342 g_object_set (
1343 G_OBJECT (toplevel->priv->hide_button_bottom)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->hide_button_bottom)), (((GType) ((
20) << (2))))))))
,
1344 "visible", toplevel->priv->state == PANEL_STATE_HIDDEN_UP,
1345 NULL((void*)0));
1346 g_object_set (
1347 G_OBJECT (toplevel->priv->hide_button_left)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->hide_button_left)), (((GType) ((20
) << (2))))))))
,
1348 "visible", toplevel->priv->state == PANEL_STATE_HIDDEN_RIGHT,
1349 NULL((void*)0));
1350 g_object_set (
1351 G_OBJECT (toplevel->priv->hide_button_right)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->hide_button_right)), (((GType) ((20
) << (2))))))))
,
1352 "visible", toplevel->priv->state == PANEL_STATE_HIDDEN_LEFT,
1353 NULL((void*)0));
1354 }
1355
1356 if (toplevel->priv->arrows_enabled) {
1357
1358 ctk_widget_show (ctk_bin_get_child (CTK_BIN (toplevel->priv->hide_button_top)((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->hide_button_top)), ((ctk_bin_get_type
()))))))
));
1359 ctk_widget_show (ctk_bin_get_child (CTK_BIN (toplevel->priv->hide_button_bottom)((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->hide_button_bottom)), ((ctk_bin_get_type
()))))))
));
1360 ctk_widget_show (ctk_bin_get_child (CTK_BIN (toplevel->priv->hide_button_left)((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->hide_button_left)), ((ctk_bin_get_type
()))))))
));
1361 ctk_widget_show (ctk_bin_get_child (CTK_BIN (toplevel->priv->hide_button_right)((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->hide_button_right)), ((ctk_bin_get_type
()))))))
));
1362
1363 } else {
1364
1365 ctk_widget_hide (ctk_bin_get_child (CTK_BIN (toplevel->priv->hide_button_top)((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->hide_button_top)), ((ctk_bin_get_type
()))))))
));
1366 ctk_widget_hide (ctk_bin_get_child (CTK_BIN (toplevel->priv->hide_button_bottom)((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->hide_button_bottom)), ((ctk_bin_get_type
()))))))
));
1367 ctk_widget_hide (ctk_bin_get_child (CTK_BIN (toplevel->priv->hide_button_left)((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->hide_button_left)), ((ctk_bin_get_type
()))))))
));
1368 ctk_widget_hide (ctk_bin_get_child (CTK_BIN (toplevel->priv->hide_button_right)((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->hide_button_right)), ((ctk_bin_get_type
()))))))
));
1369 }
1370
1371 /* set size after setting the arrow */
1372 if (toplevel->priv->buttons_enabled) {
1373
1374 if ( panel_size < 20) { hb_size = 16; }
1375 else if ( panel_size < 40) { hb_size = 20; }
1376 else if ( panel_size < 60) { hb_size = 26; }
1377 else { hb_size = 30; }
1378
1379 ctk_widget_set_size_request (toplevel->priv->hide_button_top, panel_size, hb_size);
1380 ctk_widget_set_size_request (toplevel->priv->hide_button_bottom, panel_size, hb_size);
1381 ctk_widget_set_size_request (toplevel->priv->hide_button_left, hb_size, panel_size);
1382 ctk_widget_set_size_request (toplevel->priv->hide_button_right, hb_size, panel_size);
1383 }
1384}
1385
1386static gboolean panel_toplevel_contains_pointer(PanelToplevel* toplevel)
1387{
1388 CdkDisplay *display;
1389 CdkScreen *screen;
1390 CtkWidget *widget;
1391 CdkSeat *seat;
1392 CdkDevice *pointer;
1393 int x, y;
1394
1395 display = cdk_display_get_default ();
1396 seat = cdk_display_get_default_seat (display);
1397 pointer = cdk_seat_get_pointer (seat);
1398 widget = CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
;
1399
1400 if (!ctk_widget_get_realized (widget))
1401 return FALSE(0);
1402
1403 screen = NULL((void*)0);
1404 x = y = -1;
1405 cdk_device_get_position (pointer, &screen, &x, &y);
1406
1407 if (screen != ctk_window_get_screen (CTK_WINDOW (toplevel)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_window_get_type ()))))))
))
1408 return FALSE(0);
1409
1410 if (x == -1 || y == -1)
1411 return FALSE(0);
1412
1413 if (x < toplevel->priv->geometry.x || x >= (toplevel->priv->geometry.x + toplevel->priv->geometry.width) ||
1414 y < toplevel->priv->geometry.y || y >= (toplevel->priv->geometry.y + toplevel->priv->geometry.height))
1415 return FALSE(0);
1416
1417 return TRUE(!(0));
1418}
1419
1420static inline int panel_toplevel_get_effective_auto_hide_size(PanelToplevel* toplevel)
1421{
1422 int size;
1423
1424 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM))
1425 size = CLAMP (toplevel->priv->auto_hide_size,(((toplevel->priv->auto_hide_size) > (toplevel->priv
->original_height / 2)) ? (toplevel->priv->original_height
/ 2) : (((toplevel->priv->auto_hide_size) < (1)) ? (
1) : (toplevel->priv->auto_hide_size)))
1426 1, toplevel->priv->original_height / 2)(((toplevel->priv->auto_hide_size) > (toplevel->priv
->original_height / 2)) ? (toplevel->priv->original_height
/ 2) : (((toplevel->priv->auto_hide_size) < (1)) ? (
1) : (toplevel->priv->auto_hide_size)))
;
1427 else
1428 size = CLAMP (toplevel->priv->auto_hide_size,(((toplevel->priv->auto_hide_size) > (toplevel->priv
->original_width / 2)) ? (toplevel->priv->original_width
/ 2) : (((toplevel->priv->auto_hide_size) < (1)) ? (
1) : (toplevel->priv->auto_hide_size)))
1429 1, toplevel->priv->original_width / 2)(((toplevel->priv->auto_hide_size) > (toplevel->priv
->original_width / 2)) ? (toplevel->priv->original_width
/ 2) : (((toplevel->priv->auto_hide_size) < (1)) ? (
1) : (toplevel->priv->auto_hide_size)))
;
1430
1431 /* paranoia */
1432 return (size <= 0) ? DEFAULT_AUTO_HIDE_SIZE1 : size;
1433}
1434
1435static gboolean panel_toplevel_update_struts(PanelToplevel* toplevel, gboolean end_of_animation)
1436{
1437 PanelOrientation orientation;
1438 gboolean geometry_changed = FALSE(0);
1439 int strut, strut_start, strut_end;
1440 int x, y, width, height;
1441 CdkRectangle monitor_geom;
1442
1443 if (!toplevel->priv->updated_geometry_initial)
1444 return FALSE(0);
1445
1446#ifdef HAVE_X111
1447 if (CDK_IS_X11_DISPLAY (ctk_widget_get_display (CTK_WIDGET (toplevel)))(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(ctk_widget_get_display (((((CtkWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel)), ((ctk_widget_get_type ()))))
))))); GType __t = ((cdk_x11_display_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; }))))
&& toplevel->priv->attached) {
1448 panel_struts_unregister_strut (toplevel);
1449 panel_struts_set_window_hint (toplevel);
1450 return FALSE(0);
1451 }
1452#endif // HAVE_X11
1453
1454 /* In the case of the initial animation, we really want the struts to
1455 * represent what is at the end of the animation, to avoid desktop
1456 * icons jumping around. */
1457 if (!toplevel->priv->initial_animation_done) {
1458 end_of_animation = TRUE(!(0));
1459
1460 /* We've not started the animation yet, so we have to compute
1461 * where we want to end. Note that we don't want to compute
1462 * this everytime, since the struts conflict resolution will be
1463 * overridden if we do so */
1464 if (!toplevel->priv->animating)
1465 panel_toplevel_calculate_animation_end_geometry (toplevel);
1466 }
1467
1468 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
1469
1470 if (end_of_animation) {
1471 x = toplevel->priv->animation_end_x;
1472 y = toplevel->priv->animation_end_y;
1473 x += panel_multimonitor_x (toplevel->priv->monitor);
1474 y += panel_multimonitor_y (toplevel->priv->monitor);
1475 if (toplevel->priv->animation_end_width != -1)
1476 width = toplevel->priv->animation_end_width;
1477 else
1478 width = toplevel->priv->geometry.width;
1479 if (toplevel->priv->animation_end_height != -1)
1480 height = toplevel->priv->animation_end_height;
1481 else
1482 height = toplevel->priv->geometry.height;
1483 } else {
1484 x = toplevel->priv->geometry.x;
1485 y = toplevel->priv->geometry.y;
1486 width = toplevel->priv->geometry.width;
1487 height = toplevel->priv->geometry.height;
1488 }
1489
1490 orientation = toplevel->priv->orientation;
1491
1492 strut = strut_start = strut_end = 0;
1493
1494 if (orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)) {
1495 if (y <= monitor_geom.y) {
1496 orientation = PANEL_ORIENTATION_TOP;
1497 strut = y + height - monitor_geom.y;
1498 } else if (y >= monitor_geom.y + monitor_geom.height - height) {
1499 orientation = PANEL_ORIENTATION_BOTTOM;
1500 strut = monitor_geom.y + monitor_geom.height - y;
1501 }
1502
1503 if (strut > 0) {
1504 strut_start = MAX (x, monitor_geom.x)(((x) > (monitor_geom.x)) ? (x) : (monitor_geom.x));
1505 strut_end = MIN (x + width, monitor_geom.x + monitor_geom.width)(((x + width) < (monitor_geom.x + monitor_geom.width)) ? (
x + width) : (monitor_geom.x + monitor_geom.width))
- 1;
1506 }
1507 } else {
1508 if (x <= monitor_geom.x) {
1509 orientation = PANEL_ORIENTATION_LEFT;
1510 strut = x + width - monitor_geom.x;
1511 } else if (x >= monitor_geom.x + monitor_geom.width - width) {
1512 orientation = PANEL_ORIENTATION_RIGHT;
1513 strut = monitor_geom.x + monitor_geom.width - x;
1514 }
1515
1516 if (strut > 0) {
1517 strut_start = MAX (y, monitor_geom.y)(((y) > (monitor_geom.y)) ? (y) : (monitor_geom.y));
1518 strut_end = MIN (y + height, monitor_geom.y + monitor_geom.height)(((y + height) < (monitor_geom.y + monitor_geom.height)) ?
(y + height) : (monitor_geom.y + monitor_geom.height))
- 1;
1519 }
1520 }
1521
1522 /* Adjust strut size based on scale factor */
1523 if (strut > 0)
1524 strut += toplevel->priv->size * (toplevel->priv->scale - 1);
1525
1526 if (orientation != toplevel->priv->orientation) {
1527 toplevel->priv->orientation = orientation;
1528 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "orientation");
1529 }
1530
1531 if (toplevel->priv->auto_hide && strut > 0)
1532 strut = panel_toplevel_get_effective_auto_hide_size (toplevel);
1533
1534#ifdef HAVE_X111
1535 if (CDK_IS_X11_DISPLAY (ctk_widget_get_display (CTK_WIDGET (toplevel)))(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(ctk_widget_get_display (((((CtkWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel)), ((ctk_widget_get_type ()))))
))))); GType __t = ((cdk_x11_display_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; }))))
) {
1536 if (strut > 0) {
1537 CdkScreen *screen;
1538 screen = ctk_widget_get_screen (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
1539 geometry_changed = panel_struts_register_strut (toplevel,
1540 screen,
1541 toplevel->priv->monitor,
1542 orientation,
1543 strut,
1544 strut_start,
1545 strut_end,
1546 toplevel->priv->scale);
1547 }
1548 else {
1549 panel_struts_unregister_strut (toplevel);
1550 }
1551
1552 if (toplevel->priv->state == PANEL_STATE_NORMAL ||
1553 toplevel->priv->state == PANEL_STATE_AUTO_HIDDEN ||
1554 toplevel->priv->animating)
1555 panel_struts_set_window_hint (toplevel);
1556 else
1557 panel_struts_unset_window_hint (toplevel);
1558 }
1559#endif // HAVE_X11
1560
1561#ifdef HAVE_WAYLAND
1562 if (CDK_IS_WAYLAND_DISPLAY (ctk_widget_get_display (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
))) {
1563 wayland_panel_toplevel_update_placement (toplevel);
1564 }
1565#endif // HAVE_WAYLAND
1566 return geometry_changed;
1567}
1568
1569void panel_toplevel_update_edges(PanelToplevel* toplevel)
1570{
1571 CtkWidget *widget;
1572 PanelFrameEdge edges;
1573 PanelFrameEdge inner_edges;
1574 PanelFrameEdge outer_edges;
1575 CdkRectangle monitor_geom;
1576 int width, height;
1577 gboolean inner_frame = FALSE(0);
1578
1579 widget = CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
;
1580
1581 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
1582
1583 width = toplevel->priv->geometry.width;
1584 height = toplevel->priv->geometry.height;
1585
1586 edges = PANEL_EDGE_NONE;
1587
1588 /* We don't want any bevels with a color/image background */
1589 if (toplevel->priv->geometry.y > 0)
1590 edges |= PANEL_EDGE_TOP;
1591
1592 if (toplevel->priv->geometry.x > 0)
1593 edges |= PANEL_EDGE_LEFT;
1594
1595 if (toplevel->priv->geometry.y < (monitor_geom.height - height))
1596 edges |= PANEL_EDGE_BOTTOM;
1597
1598 if (toplevel->priv->geometry.x < (monitor_geom.width - width))
1599 edges |= PANEL_EDGE_RIGHT;
1600
1601 /* There is a conflict in the position algorithm when a
1602 * non-expanded centered panel is nearly the size of the
1603 * screen. This is similar to the one we have in
1604 * panel_toplevel_update_position(). A simple solution is
1605 * to keep the bevels in this case. */
1606 if (!toplevel->priv->expand &&
1607 toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM) &&
1608 toplevel->priv->x_centered)
1609 edges |= PANEL_EDGE_LEFT | PANEL_EDGE_RIGHT;
1610
1611 if (!toplevel->priv->expand &&
1612 toplevel->priv->orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT) &&
1613 toplevel->priv->y_centered)
1614 edges |= PANEL_EDGE_TOP | PANEL_EDGE_BOTTOM;
1615
1616 if (ctk_widget_get_visible (toplevel->priv->hide_button_left) ||
1617 ctk_widget_get_visible (toplevel->priv->hide_button_right)) {
1618 inner_frame = TRUE(!(0));
1619 edges |= PANEL_EDGE_LEFT | PANEL_EDGE_RIGHT;
1620 }
1621
1622 if (ctk_widget_get_visible (toplevel->priv->hide_button_top) ||
1623 ctk_widget_get_visible (toplevel->priv->hide_button_bottom)) {
1624 inner_frame = TRUE(!(0));
1625 edges |= PANEL_EDGE_TOP | PANEL_EDGE_BOTTOM;
1626 }
1627
1628 if (!inner_frame) {
1629 inner_edges = PANEL_EDGE_NONE;
1630 outer_edges = edges;
1631 } else {
1632 inner_edges = edges;
1633 outer_edges = PANEL_EDGE_NONE;
1634 }
1635
1636 panel_frame_set_edges (toplevel->priv->inner_frame, inner_edges);
1637
1638 if (toplevel->priv->edges != outer_edges) {
1639 toplevel->priv->edges = outer_edges;
1640 ctk_widget_queue_resize (widget);
1641 }
1642}
1643
1644static const char* panel_toplevel_construct_description(PanelToplevel *toplevel)
1645{
1646 if (toplevel->priv->attached)
1647 return _("Drawer")gettext ("Drawer");
1648
1649 switch (toplevel->priv->orientation) {
1650 case PANEL_ORIENTATION_TOP:
1651 /* translators: these string will be shown in MetaCity's switch window
1652 * popup when you pass the focus to a panel */
1653 return _("Top Panel")gettext ("Top Panel");
1654 case PANEL_ORIENTATION_BOTTOM:
1655 return _("Bottom Panel")gettext ("Bottom Panel");
1656 case PANEL_ORIENTATION_LEFT:
1657 return _("Left Panel")gettext ("Left Panel");
1658 case PANEL_ORIENTATION_RIGHT:
1659 return _("Right Panel")gettext ("Right Panel");
1660 }
1661
1662 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 1662, ((const char*) (__func__)), ((void*)0)); } while (0)
;
1663 return _("Top Panel")gettext ("Top Panel");
1664}
1665
1666static void panel_toplevel_update_description(PanelToplevel* toplevel)
1667{
1668 const char *description;
1669
1670 description = panel_toplevel_construct_description (toplevel);
1671
1672 if (toplevel->priv->description &&
1673 !strcmp (toplevel->priv->description, description))
1674 return;
1675
1676 if (toplevel->priv->description)
1677 g_free (toplevel->priv->description);
1678 toplevel->priv->description = g_strdup (description)g_strdup_inline (description);
1679
1680 if (!toplevel->priv->name)
1681 ctk_window_set_title (CTK_WINDOW (toplevel)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_window_get_type ()))))))
,
1682 toplevel->priv->description);
1683
1684 panel_a11y_set_atk_name_desc (
1685 CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
,
1686 toplevel->priv->name ? toplevel->priv->name :
1687 toplevel->priv->description,
1688 toplevel->priv->description);
1689}
1690
1691static void panel_toplevel_update_attached_position(PanelToplevel* toplevel, gboolean hidden, int* x, int* y, int* w, int* h)
1692{
1693 CtkAllocation attach_allocation;
1694 PanelOrientation attach_orientation;
1695 CdkRectangle toplevel_box;
1696 CdkRectangle parent_box;
1697 CdkRectangle attach_box;
1698 int x_origin = 0, y_origin = 0;
1699 CdkRectangle monitor_geom;
1700
1701 if (!ctk_widget_get_realized (CTK_WIDGET (toplevel->priv->attach_toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->attach_toplevel)), ((ctk_widget_get_type
()))))))
) ||
1702 !ctk_widget_get_realized (toplevel->priv->attach_widget))
1703 return;
1704
1705 ctk_widget_get_allocation (CTK_WIDGET (toplevel->priv->attach_widget)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->attach_widget)), ((ctk_widget_get_type
()))))))
, &attach_allocation);
1706
1707 toplevel_box = toplevel->priv->geometry;
1708 parent_box = toplevel->priv->attach_toplevel->priv->geometry;
1709 attach_box = attach_allocation;
1710
1711 if (attach_box.x != -1) {
1712 cdk_window_get_origin (ctk_widget_get_window (CTK_WIDGET (toplevel->priv->attach_widget)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->attach_widget)), ((ctk_widget_get_type
()))))))
),
1713 &x_origin, &y_origin);
1714
1715 attach_box.x += x_origin;
1716 attach_box.y += y_origin;
1717 } else {
1718 /* attach_widget isn't allocated. Put the toplevel
1719 * off screen.
1720 */
1721 attach_box.x = -toplevel_box.width;
1722 attach_box.y = -toplevel_box.height;
1723 }
1724
1725 attach_orientation = panel_toplevel_get_orientation (
1726 toplevel->priv->attach_toplevel);
1727
1728 if (attach_orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM))
1729 *x = attach_box.x + attach_box.width / 2 - toplevel_box.width / 2;
1730 else
1731 *y = attach_box.y + attach_box.height / 2 - toplevel_box.height / 2;
1732
1733 switch (attach_orientation) {
1734 case PANEL_ORIENTATION_TOP:
1735 *y = parent_box.y;
1736 if (!hidden)
1737 *y += parent_box.height;
1738 else
1739 *h = parent_box.height;
1740 break;
1741 case PANEL_ORIENTATION_BOTTOM:
1742 *y = parent_box.y;
1743 if (!hidden)
1744 *y -= toplevel_box.height;
1745 else
1746 *h = parent_box.height;
1747 break;
1748 case PANEL_ORIENTATION_LEFT:
1749 *x = parent_box.x;
1750 if (!hidden)
1751 *x += parent_box.width;
1752 else
1753 *w = parent_box.width;
1754 break;
1755 case PANEL_ORIENTATION_RIGHT:
1756 *x = parent_box.x;
1757 if (!hidden)
1758 *x -= toplevel_box.width;
1759 else
1760 *w = parent_box.width;
1761 break;
1762 default:
1763 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 1763, ((const char*) (__func__)), ((void*)0)); } while (0)
;
1764 break;
1765 }
1766
1767 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
1768
1769 *x -= monitor_geom.x;
1770 *y -= monitor_geom.y;
1771
1772 if (toplevel->priv->orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT))
1773 *x = CLAMP (*x, 0, monitor_geom.width - toplevel->priv->original_width)(((*x) > (monitor_geom.width - toplevel->priv->original_width
)) ? (monitor_geom.width - toplevel->priv->original_width
) : (((*x) < (0)) ? (0) : (*x)))
;
1774 else
1775 *y = CLAMP (*y, 0, monitor_geom.height - toplevel->priv->original_height)(((*y) > (monitor_geom.height - toplevel->priv->original_height
)) ? (monitor_geom.height - toplevel->priv->original_height
) : (((*y) < (0)) ? (0) : (*y)))
;
1776}
1777
1778static void panel_toplevel_update_normal_position(PanelToplevel* toplevel, int* x, int* y, int* w, int* h)
1779{
1780 CdkRectangle monitor_geom;
1781 int width, height;
1782 int snap_tolerance;
1783
1784 g_assert (x != NULL && y != NULL)do { if (x != ((void*)0) && y != ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "panel-toplevel.c", 1784, ((const char*) (__func__
)), "x != NULL && y != NULL"); } while (0)
;
1785
1786 if (toplevel->priv->attached) {
1787 panel_toplevel_update_attached_position (toplevel, FALSE(0), x, y, w, h);
1788 return;
1789 }
1790
1791 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
1792
1793 width = toplevel->priv->original_width;
1794 height = toplevel->priv->original_height;
1795 snap_tolerance = toplevel->priv->snap_tolerance;
1796
1797 *x = CLAMP (*x, 0, monitor_geom.width - width)(((*x) > (monitor_geom.width - width)) ? (monitor_geom.width
- width) : (((*x) < (0)) ? (0) : (*x)))
;
1798 *y = CLAMP (*y, 0, monitor_geom.height - height)(((*y) > (monitor_geom.height - height)) ? (monitor_geom.height
- height) : (((*y) < (0)) ? (0) : (*y)))
;
1799
1800 if (toplevel->priv->x <= snap_tolerance &&
1801 toplevel->priv->x_right == -1 &&
1802 !toplevel->priv->x_centered)
1803 *x = 0;
1804 else if (toplevel->priv->x_right != -1 &&
1805 toplevel->priv->x_right <= snap_tolerance &&
1806 !toplevel->priv->x_centered)
1807 *x = monitor_geom.width - width;
1808
1809 if (toplevel->priv->y <= snap_tolerance &&
1810 toplevel->priv->y_bottom == -1 &&
1811 !toplevel->priv->y_centered)
1812 *y = 0;
1813 else if (toplevel->priv->y_bottom != -1 &&
1814 toplevel->priv->y_bottom <= snap_tolerance &&
1815 !toplevel->priv->y_centered)
1816 *y = monitor_geom.height - height;
1817}
1818
1819static void
1820panel_toplevel_update_auto_hide_position (PanelToplevel *toplevel,
1821 int *x,
1822 int *y,
1823 int *w,
1824 int *h,
1825 gboolean for_end_position)
1826{
1827 int width, height;
1828 CdkRectangle monitor_geom;
1829 int auto_hide_size;
1830 int snap_tolerance;
1831
1832 g_assert (x != NULL && y != NULL)do { if (x != ((void*)0) && y != ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "panel-toplevel.c", 1832, ((const char*) (__func__
)), "x != NULL && y != NULL"); } while (0)
;
1833
1834 if (toplevel->priv->floating) {
1835 panel_toplevel_update_normal_position (toplevel, x, y, w, h);
1836 return;
1837 }
1838
1839 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
1840
1841 width = toplevel->priv->original_width;
1842 height = toplevel->priv->original_height;
1843 snap_tolerance = toplevel->priv->snap_tolerance;
1844
1845 /* For the initial animation, we animate from outside the screen, and
1846 * so we don't want the toplevel to be visible at all. But when the
1847 * request is for the end position, then we give the real result (it's
1848 * useful for struts) */
1849 if (for_end_position || toplevel->priv->initial_animation_done) {
1850 auto_hide_size = panel_toplevel_get_effective_auto_hide_size (toplevel);
1851 } else {
1852 auto_hide_size = 0;
1853 }
1854
1855 switch (toplevel->priv->orientation) {
1856 case PANEL_ORIENTATION_TOP:
1857 *y = - (height - auto_hide_size);
1858 break;
1859 case PANEL_ORIENTATION_BOTTOM:
1860 *y = monitor_geom.height - auto_hide_size;
1861 break;
1862 case PANEL_ORIENTATION_LEFT:
1863 *x = - (width - auto_hide_size);
1864 break;
1865 case PANEL_ORIENTATION_RIGHT:
1866 *x = monitor_geom.width - auto_hide_size;
1867 break;
1868 default:
1869 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 1869, ((const char*) (__func__)), ((void*)0)); } while (0)
;
1870 break;
1871 }
1872
1873 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)) {
1874 if (toplevel->priv->x <= snap_tolerance &&
1875 toplevel->priv->x_right == -1 &&
1876 !toplevel->priv->x_centered)
1877 *x = 0;
1878 else if (toplevel->priv->x_right != -1 &&
1879 toplevel->priv->x_right <= snap_tolerance &&
1880 !toplevel->priv->x_centered)
1881 *x = monitor_geom.width - width;
1882 } else /* if (toplevel->priv->orientation & PANEL_VERTICAL_MASK) */ {
1883 if (toplevel->priv->y <= snap_tolerance &&
1884 toplevel->priv->y_bottom == -1 &&
1885 !toplevel->priv->y_centered)
1886 *y = 0;
1887 else if (toplevel->priv->y_bottom != -1 &&
1888 toplevel->priv->y_bottom <= snap_tolerance &&
1889 !toplevel->priv->y_centered)
1890 *y = monitor_geom.height - height;
1891 }
1892}
1893
1894/* FIXME: this is wrong for Xinerama. In the Xinerama case
1895 * I think if hiding it requires it to go onto the
1896 * next monitor then it should just move it on to
1897 * the next monitor and set its state back to normal
1898 */
1899static void
1900panel_toplevel_update_hidden_position (PanelToplevel *toplevel,
1901 int *x,
1902 int *y,
1903 int *w,
1904 int *h)
1905{
1906 int width, height;
1907 int min_hide_size;
1908 CdkRectangle monitor_geom;
1909 CtkAllocation hide_allocation;
1910
1911 g_assert (x != NULL && y != NULL)do { if (x != ((void*)0) && y != ((void*)0)) ; else g_assertion_message_expr
(((gchar*) 0), "panel-toplevel.c", 1911, ((const char*) (__func__
)), "x != NULL && y != NULL"); } while (0)
;
1912
1913 g_assert (toplevel->priv->state == PANEL_STATE_HIDDEN_UP ||do { if (toplevel->priv->state == PANEL_STATE_HIDDEN_UP
|| toplevel->priv->state == PANEL_STATE_HIDDEN_DOWN ||
toplevel->priv->state == PANEL_STATE_HIDDEN_LEFT || toplevel
->priv->state == PANEL_STATE_HIDDEN_RIGHT) ; else g_assertion_message_expr
(((gchar*) 0), "panel-toplevel.c", 1916, ((const char*) (__func__
)), "toplevel->priv->state == PANEL_STATE_HIDDEN_UP || toplevel->priv->state == PANEL_STATE_HIDDEN_DOWN || toplevel->priv->state == PANEL_STATE_HIDDEN_LEFT || toplevel->priv->state == PANEL_STATE_HIDDEN_RIGHT"
); } while (0)
1914 toplevel->priv->state == PANEL_STATE_HIDDEN_DOWN ||do { if (toplevel->priv->state == PANEL_STATE_HIDDEN_UP
|| toplevel->priv->state == PANEL_STATE_HIDDEN_DOWN ||
toplevel->priv->state == PANEL_STATE_HIDDEN_LEFT || toplevel
->priv->state == PANEL_STATE_HIDDEN_RIGHT) ; else g_assertion_message_expr
(((gchar*) 0), "panel-toplevel.c", 1916, ((const char*) (__func__
)), "toplevel->priv->state == PANEL_STATE_HIDDEN_UP || toplevel->priv->state == PANEL_STATE_HIDDEN_DOWN || toplevel->priv->state == PANEL_STATE_HIDDEN_LEFT || toplevel->priv->state == PANEL_STATE_HIDDEN_RIGHT"
); } while (0)
1915 toplevel->priv->state == PANEL_STATE_HIDDEN_LEFT ||do { if (toplevel->priv->state == PANEL_STATE_HIDDEN_UP
|| toplevel->priv->state == PANEL_STATE_HIDDEN_DOWN ||
toplevel->priv->state == PANEL_STATE_HIDDEN_LEFT || toplevel
->priv->state == PANEL_STATE_HIDDEN_RIGHT) ; else g_assertion_message_expr
(((gchar*) 0), "panel-toplevel.c", 1916, ((const char*) (__func__
)), "toplevel->priv->state == PANEL_STATE_HIDDEN_UP || toplevel->priv->state == PANEL_STATE_HIDDEN_DOWN || toplevel->priv->state == PANEL_STATE_HIDDEN_LEFT || toplevel->priv->state == PANEL_STATE_HIDDEN_RIGHT"
); } while (0)
1916 toplevel->priv->state == PANEL_STATE_HIDDEN_RIGHT)do { if (toplevel->priv->state == PANEL_STATE_HIDDEN_UP
|| toplevel->priv->state == PANEL_STATE_HIDDEN_DOWN ||
toplevel->priv->state == PANEL_STATE_HIDDEN_LEFT || toplevel
->priv->state == PANEL_STATE_HIDDEN_RIGHT) ; else g_assertion_message_expr
(((gchar*) 0), "panel-toplevel.c", 1916, ((const char*) (__func__
)), "toplevel->priv->state == PANEL_STATE_HIDDEN_UP || toplevel->priv->state == PANEL_STATE_HIDDEN_DOWN || toplevel->priv->state == PANEL_STATE_HIDDEN_LEFT || toplevel->priv->state == PANEL_STATE_HIDDEN_RIGHT"
); } while (0)
;
1917
1918 if (toplevel->priv->attached) {
1919 panel_toplevel_update_attached_position (toplevel, TRUE(!(0)), x, y, w, h);
1920 return;
1921 }
1922
1923 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
1924
1925 width = toplevel->priv->original_width;
1926 height = toplevel->priv->original_height;
1927
1928 //FIXME should find a better default
1929 min_hide_size = DEFAULT_AUTO_HIDE_SIZE1;
1930
1931 switch (toplevel->priv->state) {
1932 case PANEL_STATE_HIDDEN_UP:
1933 ctk_widget_get_allocation (toplevel->priv->hide_button_bottom,
1934 &hide_allocation);
1935 *y = - (height - MAX (hide_allocation.height, min_hide_size)(((hide_allocation.height) > (min_hide_size)) ? (hide_allocation
.height) : (min_hide_size))
);
1936 break;
1937 case PANEL_STATE_HIDDEN_DOWN:
1938 ctk_widget_get_allocation (toplevel->priv->hide_button_top,
1939 &hide_allocation);
1940 *y = monitor_geom.height - MAX (hide_allocation.height, min_hide_size)(((hide_allocation.height) > (min_hide_size)) ? (hide_allocation
.height) : (min_hide_size))
;
1941 break;
1942 case PANEL_STATE_HIDDEN_LEFT:
1943 ctk_widget_get_allocation (toplevel->priv->hide_button_right,
1944 &hide_allocation);
1945 *x = - (width - MAX (hide_allocation.width, min_hide_size)(((hide_allocation.width) > (min_hide_size)) ? (hide_allocation
.width) : (min_hide_size))
);
1946 break;
1947 case PANEL_STATE_HIDDEN_RIGHT:
1948 ctk_widget_get_allocation (toplevel->priv->hide_button_left,
1949 &hide_allocation);
1950 *x = monitor_geom.width - MAX (hide_allocation.width, min_hide_size)(((hide_allocation.width) > (min_hide_size)) ? (hide_allocation
.width) : (min_hide_size))
;
1951 break;
1952 default:
1953 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 1953, ((const char*) (__func__)), ((void*)0)); } while (0)
;
1954 break;
1955 }
1956}
1957
1958/*
1959 * This is "almost" like the double sine movement
1960 * from the original panel except that it uses
1961 * a cubic (twice again). I suppose it looks less
1962 * mathematical now :) -- _v_
1963 */
1964static int
1965get_delta (int src,
1966 int dest,
1967 GDateTime *start_time,
1968 GDateTime *end_time,
1969 GDateTime *cur_time)
1970{
1971 double x, percentage;
1972 GTimeSpan n, d;
1973
1974 n = g_date_time_difference (cur_time, start_time);
1975 d = g_date_time_difference (end_time, start_time);
1976
1977 if (abs (dest - src) <= 1 || n >= d)
1978 return dest - src;
1979
1980 /* The cubic is: p(x) = (-2) x^2 (x-1.5) */
1981 /* running p(p(x)) to make it more "pronounced",
1982 * effectively making it a ninth-degree polynomial */
1983
1984 x = (double)n/d;
1985 x = -2 * (x*x) * (x-1.5);
1986 /* run it again */
1987 percentage = -2 * (x*x) * (x-1.5);
1988
1989 percentage = CLAMP (percentage, 0.0, 1.0)(((percentage) > (1.0)) ? (1.0) : (((percentage) < (0.0
)) ? (0.0) : (percentage)))
;
1990
1991 return ((dest - src) * percentage);
1992}
1993
1994static void
1995panel_toplevel_update_animating_position (PanelToplevel *toplevel)
1996{
1997 GDateTime *now;
1998 int deltax, deltay, deltaw = 0, deltah = 0;
1999 int monitor_offset_x, monitor_offset_y;
2000
2001 if ((toplevel->priv->animation_start_time == NULL((void*)0)) ||
2002 (toplevel->priv->animation_end_time == NULL((void*)0)))
2003 return;
2004
2005 now = g_date_time_new_now_local ();
2006
2007 monitor_offset_x = panel_multimonitor_x (toplevel->priv->monitor);
2008 monitor_offset_y = panel_multimonitor_y (toplevel->priv->monitor);
2009
2010 if (toplevel->priv->animation_end_width != -1)
2011 deltaw = get_delta (toplevel->priv->geometry.width,
2012 toplevel->priv->animation_end_width,
2013 toplevel->priv->animation_start_time,
2014 toplevel->priv->animation_end_time,
2015 now);
2016
2017 if (toplevel->priv->animation_end_height != -1)
2018 deltah = get_delta (toplevel->priv->geometry.height,
2019 toplevel->priv->animation_end_height,
2020 toplevel->priv->animation_start_time,
2021 toplevel->priv->animation_end_time,
2022 now);
2023
2024 deltax = get_delta (toplevel->priv->geometry.x - monitor_offset_x,
2025 toplevel->priv->animation_end_x,
2026 toplevel->priv->animation_start_time,
2027 toplevel->priv->animation_end_time,
2028 now);
2029
2030 deltay = get_delta (toplevel->priv->geometry.y - monitor_offset_y,
2031 toplevel->priv->animation_end_y,
2032 toplevel->priv->animation_start_time,
2033 toplevel->priv->animation_end_time,
2034 now);
2035
2036 if (deltaw != 0 && abs (deltaw) > abs (deltax))
2037 deltax = deltaw;
2038 if (deltah != 0 && abs (deltah) > abs (deltay))
2039 deltay = deltah;
2040
2041 toplevel->priv->geometry.x += deltax;
2042 toplevel->priv->geometry.y += deltay;
2043
2044 toplevel->priv->geometry.width += deltaw;
2045 toplevel->priv->geometry.height += deltah;
2046
2047 if (toplevel->priv->geometry.x - monitor_offset_x == toplevel->priv->animation_end_x &&
2048 toplevel->priv->geometry.y - monitor_offset_y == toplevel->priv->animation_end_y) {
2049 toplevel->priv->animating = FALSE(0);
2050 /* Note: it's important to set initial_animation_done to TRUE
2051 * as soon as possible (hence, here) since we don't want to
2052 * have a wrong value in a size request event */
2053 toplevel->priv->initial_animation_done = TRUE(!(0));
2054
2055 if (toplevel->priv->attached && panel_toplevel_get_is_hidden (toplevel))
2056 ctk_widget_unmap (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
2057 else
2058 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
2059
2060 if (toplevel->priv->state == PANEL_STATE_NORMAL)
2061 g_signal_emit (toplevel, toplevel_signals [UNHIDE_SIGNAL], 0);
2062 }
2063
2064 g_date_time_unref (now);
2065}
2066
2067static void
2068panel_toplevel_update_expanded_position (PanelToplevel *toplevel)
2069{
2070 CdkRectangle monitor_geom;
2071 int x, y;
2072 int x_right, y_bottom;
2073 int monitor;
2074
2075 if (!toplevel->priv->expand)
2076 return;
2077
2078 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
2079
2080 x = -1;
2081 y = -1;
Value stored to 'y' is never read
2082 x_right = -1;
2083 y_bottom = -1;
2084
2085 switch (toplevel->priv->orientation) {
2086 case PANEL_ORIENTATION_TOP:
2087 x = monitor_geom.x;
2088 y = monitor_geom.y;
2089 break;
2090 case PANEL_ORIENTATION_LEFT:
2091 x = monitor_geom.x;
2092 y = monitor_geom.y;
2093 break;
2094 case PANEL_ORIENTATION_BOTTOM:
2095 x = monitor_geom.x;
2096 y = monitor_geom.y + monitor_geom.height - toplevel->priv->geometry.height;
2097 y_bottom = 0;
2098 break;
2099 case PANEL_ORIENTATION_RIGHT:
2100 x = monitor_geom.x + monitor_geom.width - toplevel->priv->geometry.width;
2101 y = monitor_geom.y;
2102 x_right = 0;
2103 break;
2104 default:
2105 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 2105, ((const char*) (__func__)), ((void*)0)); } while (0)
;
2106 break;
2107 }
2108
2109 monitor = panel_multimonitor_get_monitor_at_point (x, y);
2110
2111 panel_toplevel_set_monitor_internal (toplevel, monitor, TRUE(!(0)));
2112
2113 x -= panel_multimonitor_x (monitor);
2114 y -= panel_multimonitor_y (monitor);
2115
2116 g_object_freeze_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
);
2117
2118 if (toplevel->priv->x != x) {
2119 toplevel->priv->x = x;
2120 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "x");
2121 }
2122
2123 if (toplevel->priv->y != y) {
2124 toplevel->priv->y = y;
2125 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "y");
2126 }
2127
2128 if (toplevel->priv->x_right != x_right) {
2129 toplevel->priv->x_right = x_right;
2130 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "x_right");
2131 }
2132
2133 if (toplevel->priv->y_bottom != y_bottom) {
2134 toplevel->priv->y_bottom = y_bottom;
2135 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "y_bottom");
2136 }
2137
2138 g_object_thaw_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
);
2139}
2140
2141static void
2142panel_toplevel_update_position (PanelToplevel *toplevel)
2143{
2144 PanelBackground *background;
2145 int x, y;
2146 int w, h;
2147 CdkRectangle monitor_geom;
2148
2149 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
2150
2151 if (toplevel->priv->animating) {
2152 panel_toplevel_update_animating_position (toplevel);
2153 return;
2154 }
2155
2156 if (toplevel->priv->position_centered) {
2157 toplevel->priv->position_centered = FALSE(0);
2158
2159 g_object_freeze_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
);
2160
2161 if (!toplevel->priv->x_centered) {
2162 int x_right;
2163
2164 toplevel->priv->x -= toplevel->priv->geometry.width / 2;
2165 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "x");
2166
2167 if ((toplevel->priv->x + toplevel->priv->geometry.width / 2) > monitor_geom.width / 2)
2168 x_right = monitor_geom.width - (toplevel->priv->x + toplevel->priv->geometry.width);
2169 else
2170 x_right = -1;
2171 if (toplevel->priv->x_right != x_right) {
2172 toplevel->priv->x_right = x_right;
2173 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
,
2174 "x-right");
2175 }
2176 }
2177
2178 if (!toplevel->priv->y_centered) {
2179 int y_bottom;
2180
2181 toplevel->priv->y -= toplevel->priv->geometry.height / 2;
2182 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "y");
2183
2184 if ((toplevel->priv->y + toplevel->priv->geometry.height / 2) > monitor_geom.height / 2)
2185 y_bottom = monitor_geom.height - (toplevel->priv->y + toplevel->priv->geometry.height);
2186 else
2187 y_bottom = -1;
2188 if (toplevel->priv->y_bottom != y_bottom) {
2189 toplevel->priv->y_bottom = y_bottom;
2190 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
,
2191 "y-bottom");
2192 }
2193 }
2194
2195 g_object_thaw_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
);
2196 }
2197
2198 panel_toplevel_update_expanded_position (toplevel);
2199 panel_toplevel_calc_floating (toplevel); //FIXME should probably be done after panel_toplevel_update_normal_position() too
2200
2201 if (toplevel->priv->x_right == -1)
2202 x = toplevel->priv->x;
2203 else
2204 x = monitor_geom.width - (toplevel->priv->x_right + toplevel->priv->geometry.width);
2205 if (toplevel->priv->y_bottom == -1)
2206 y = toplevel->priv->y;
2207 else
2208 y = monitor_geom.height - (toplevel->priv->y_bottom + toplevel->priv->geometry.height);
2209
2210 if (!toplevel->priv->expand) {
2211 if (toplevel->priv->x_centered)
2212 x = (monitor_geom.width - toplevel->priv->geometry.width) / 2;
2213 if (toplevel->priv->y_centered)
2214 y = (monitor_geom.height - toplevel->priv->geometry.height) / 2;
2215 }
2216
2217 w = h = -1;
2218
2219 if (toplevel->priv->state == PANEL_STATE_NORMAL)
2220 panel_toplevel_update_normal_position (toplevel, &x, &y, &w, &h);
2221
2222 else if (toplevel->priv->state == PANEL_STATE_AUTO_HIDDEN)
2223 panel_toplevel_update_auto_hide_position (toplevel, &x, &y, &w, &h, FALSE(0));
2224
2225 else
2226 panel_toplevel_update_hidden_position (toplevel, &x, &y, &w, &h);
2227
2228 if (w != -1)
2229 toplevel->priv->geometry.width = w;
2230 if (h != -1)
2231 toplevel->priv->geometry.height = h;
2232
2233 /* This is some kind of snap: there's a possibility of an infinite loop
2234 * because of the bevels of the frame that are set in
2235 * panel_toplevel_update_edges(). The bevels change the width/height of
2236 * the toplevel. The typical loop is:
2237 * x = 1 => outer bevel => x = 0 => no outer bevel = > x = 1 => ...
2238 * FIXME: maybe the real bug is that we enter into this loop (see bug
2239 * #160748 to learn how to reproduce.) */
2240 background = &toplevel->background;
2241
2242 /* There's no bevels with a color/image background */
2243 if (panel_background_effective_type (background) == PANEL_BACK_NONE) {
2244 CtkStyleContext *context;
2245 CtkStateFlags state;
2246 CdkRectangle *geometry;
2247 CtkBorder padding;
2248 int max_size;
2249
2250 state = ctk_widget_get_state_flags (CTK_WIDGET (toplevel->priv->inner_frame)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->inner_frame)), ((ctk_widget_get_type
()))))))
);
2251 context = ctk_widget_get_style_context (CTK_WIDGET (toplevel->priv->inner_frame)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->inner_frame)), ((ctk_widget_get_type
()))))))
);
2252 ctk_style_context_get_padding (context, state, &padding);
2253 geometry = &toplevel->priv->geometry;
2254
2255 if (x <= padding.left && x > 0 &&
2256 !toplevel->priv->x_centered)
2257 x = 0;
2258
2259 if (y <= padding.top && y > 0 &&
2260 !toplevel->priv->y_centered)
2261 y = 0;
2262
2263 max_size = monitor_geom.width - geometry->width - padding.right;
2264 if (x + padding.left >= max_size && x < max_size &&
2265 !toplevel->priv->x_centered)
2266 x = max_size;
2267
2268 max_size = monitor_geom.height - geometry->height - padding.bottom;
2269 if (y + padding.top >= max_size && y < max_size &&
2270 !toplevel->priv->y_centered)
2271 y = max_size;
2272 }
2273
2274 x += panel_multimonitor_x (toplevel->priv->monitor);
2275 y += panel_multimonitor_y (toplevel->priv->monitor);
2276
2277 toplevel->priv->geometry.x = x;
2278 toplevel->priv->geometry.y = y;
2279}
2280
2281static int
2282calculate_minimum_height (CtkWidget *widget,
2283 PanelOrientation orientation)
2284{
2285 CtkStateFlags state;
2286 CtkStyleContext *style_context;
2287 PangoFontDescription *font_desc;
2288 CtkBorder padding;
2289 PangoContext *pango_context;
2290 PangoFontMetrics *metrics;
2291 int ascent;
2292 int descent;
2293 int thickness;
2294
2295 state = ctk_widget_get_state_flags (widget);
2296 style_context = ctk_widget_get_style_context (widget);
2297 ctk_style_context_get(style_context, state, CTK_STYLE_PROPERTY_FONT"font", &font_desc, NULL((void*)0));
2298
2299 pango_context = ctk_widget_get_pango_context (widget);
2300 metrics = pango_context_get_metrics (pango_context,
2301 font_desc,
2302 pango_context_get_language (pango_context));
2303 ctk_style_context_get_padding (style_context, state, &padding);
2304
2305 ascent = pango_font_metrics_get_ascent (metrics);
2306 descent = pango_font_metrics_get_descent (metrics);
2307
2308 pango_font_description_free (font_desc);
2309 pango_font_metrics_unref (metrics);
2310
2311 thickness = (orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)) ?
2312 padding.top + padding.bottom :
2313 padding.left + padding.right;
2314
2315 return PANGO_PIXELS (ascent + descent)(((int)(ascent + descent) + 512) >> 10) + thickness;
2316}
2317
2318static int
2319panel_toplevel_update_size_from_hints (PanelToplevel *toplevel,
2320 int requisition_size,
2321 int monitor_size,
2322 int non_panel_widget_size)
2323{
2324 int nb_size_hints;
2325 AppletSizeHints *applets_hints;
2326 AppletSizeHintsAlloc *using_hint;
2327
2328 int i;
2329 int total_size;
2330 int full_hints;
2331
2332 /* Scale down the size so that the panel only takes what it needs for the applets it has. */
2333 total_size = non_panel_widget_size + (requisition_size / toplevel->priv->scale);
2334
2335 nb_size_hints = toplevel->priv->panel_widget->nb_applets_size_hints;
2336 if (nb_size_hints <= 0)
2337 return total_size;
2338
2339 applets_hints = toplevel->priv->panel_widget->applets_hints;
2340 using_hint = toplevel->priv->panel_widget->applets_using_hint;
2341
2342 for (i = 0; i < nb_size_hints; i++) {
2343 using_hint[i].index = applets_hints[i].len - 2;
2344 using_hint[i].size = applets_hints[i].hints[applets_hints[i].len - 1];
2345 total_size += using_hint[i].size;
2346 }
2347
2348 if (total_size > monitor_size)
2349 return monitor_size;
2350
2351 full_hints = 0;
2352 while (full_hints != nb_size_hints && total_size < monitor_size) {
2353 int bonus;
2354 int extra_bonus;
2355
2356 bonus = (monitor_size - total_size)
2357 / (nb_size_hints - full_hints);
2358 extra_bonus = (monitor_size - total_size)
2359 % (nb_size_hints - full_hints);
2360 full_hints = 0;
2361
2362 for (i = 0; i < nb_size_hints; i++) {
2363 int new_size;
2364 int current_bonus;
2365
2366 current_bonus = bonus;
2367
2368 while (using_hint[i].index > 0 && applets_hints[i].hints[using_hint[i].index - 1] < using_hint[i].size + current_bonus) {
2369 new_size = applets_hints[i].hints[using_hint[i].index - 1];
2370 current_bonus = using_hint[i].size
2371 + current_bonus - new_size;
2372 total_size = total_size - using_hint[i].size
2373 + new_size;
2374
2375 using_hint[i].index -= 2;
2376 using_hint[i].size = new_size;
2377 }
2378
2379 new_size = MIN (applets_hints[i].hints[using_hint[i].index],(((applets_hints[i].hints[using_hint[i].index]) < (using_hint
[i].size + current_bonus)) ? (applets_hints[i].hints[using_hint
[i].index]) : (using_hint[i].size + current_bonus))
2380 using_hint[i].size + current_bonus)(((applets_hints[i].hints[using_hint[i].index]) < (using_hint
[i].size + current_bonus)) ? (applets_hints[i].hints[using_hint
[i].index]) : (using_hint[i].size + current_bonus))
;
2381 if (new_size > using_hint[i].size) {
2382 total_size += (new_size - using_hint[i].size);
2383 using_hint[i].size = new_size;
2384 }
2385
2386 if (extra_bonus > 0) {
2387 new_size = MIN (applets_hints[i].hints[using_hint[i].index],(((applets_hints[i].hints[using_hint[i].index]) < (using_hint
[i].size + extra_bonus)) ? (applets_hints[i].hints[using_hint
[i].index]) : (using_hint[i].size + extra_bonus))
2388 using_hint[i].size + extra_bonus)(((applets_hints[i].hints[using_hint[i].index]) < (using_hint
[i].size + extra_bonus)) ? (applets_hints[i].hints[using_hint
[i].index]) : (using_hint[i].size + extra_bonus))
;
2389 if (new_size > using_hint[i].size) {
2390 total_size += (new_size
2391 - using_hint[i].size);
2392 extra_bonus -= (new_size
2393 - using_hint[i].size);
2394 using_hint[i].size = new_size;
2395 }
2396 }
2397
2398 if (using_hint[i].size == applets_hints[i].hints[using_hint[i].index])
2399 full_hints++;
2400 }
2401 }
2402
2403 return total_size;
2404}
2405
2406static void
2407panel_toplevel_update_size (PanelToplevel *toplevel,
2408 CtkRequisition *requisition)
2409{
2410 CtkWidget *widget;
2411 CtkStyleContext *context;
2412 CtkStateFlags state;
2413 CtkBorder padding;
2414 CdkRectangle monitor_geom;
2415 int width, height;
2416 int minimum_height;
2417 int non_panel_widget_size;
2418
2419 if (toplevel->priv->animating)
2420 return;
2421
2422 widget = CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
;
2423 context = ctk_widget_get_style_context (widget);
2424 state = ctk_widget_get_state_flags (widget);
2425 ctk_style_context_get_padding (context, state, &padding);
2426
2427 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
2428
2429 width = requisition->width;
2430 height = requisition->height;
2431
2432 if (!toplevel->priv->expand &&
2433 !toplevel->priv->buttons_enabled && !toplevel->priv->attached)
2434 non_panel_widget_size = 2 * HANDLE_SIZE10;
2435 else
2436 non_panel_widget_size = 0;
2437
2438 minimum_height = calculate_minimum_height (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
,
2439 toplevel->priv->orientation);
2440
2441 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)) {
2442
2443 height = MAX (MIN (MAX (height, toplevel->priv->size),(((((((((height) > (toplevel->priv->size)) ? (height
) : (toplevel->priv->size))) < (panel_toplevel_get_maximum_size
(toplevel))) ? ((((height) > (toplevel->priv->size)
) ? (height) : (toplevel->priv->size))) : (panel_toplevel_get_maximum_size
(toplevel)))) > (minimum_height)) ? (((((((height) > (
toplevel->priv->size)) ? (height) : (toplevel->priv->
size))) < (panel_toplevel_get_maximum_size (toplevel))) ? (
(((height) > (toplevel->priv->size)) ? (height) : (toplevel
->priv->size))) : (panel_toplevel_get_maximum_size (toplevel
)))) : (minimum_height))
2444 panel_toplevel_get_maximum_size (toplevel)),(((((((((height) > (toplevel->priv->size)) ? (height
) : (toplevel->priv->size))) < (panel_toplevel_get_maximum_size
(toplevel))) ? ((((height) > (toplevel->priv->size)
) ? (height) : (toplevel->priv->size))) : (panel_toplevel_get_maximum_size
(toplevel)))) > (minimum_height)) ? (((((((height) > (
toplevel->priv->size)) ? (height) : (toplevel->priv->
size))) < (panel_toplevel_get_maximum_size (toplevel))) ? (
(((height) > (toplevel->priv->size)) ? (height) : (toplevel
->priv->size))) : (panel_toplevel_get_maximum_size (toplevel
)))) : (minimum_height))
2445 minimum_height)(((((((((height) > (toplevel->priv->size)) ? (height
) : (toplevel->priv->size))) < (panel_toplevel_get_maximum_size
(toplevel))) ? ((((height) > (toplevel->priv->size)
) ? (height) : (toplevel->priv->size))) : (panel_toplevel_get_maximum_size
(toplevel)))) > (minimum_height)) ? (((((((height) > (
toplevel->priv->size)) ? (height) : (toplevel->priv->
size))) < (panel_toplevel_get_maximum_size (toplevel))) ? (
(((height) > (toplevel->priv->size)) ? (height) : (toplevel
->priv->size))) : (panel_toplevel_get_maximum_size (toplevel
)))) : (minimum_height))
;
2446
2447 if (toplevel->priv->expand)
2448 width = monitor_geom.width;
2449 else {
2450 int max_width;
2451
2452 if (!toplevel->priv->attached)
2453 max_width = monitor_geom.width;
2454 else {
2455 if (panel_toplevel_get_orientation (toplevel->priv->attach_toplevel) == PANEL_ORIENTATION_LEFT)
2456 max_width = monitor_geom.width
2457 - toplevel->priv->geometry.x;
2458 else
2459 max_width = toplevel->priv->geometry.x +
2460 toplevel->priv->geometry.width;
2461 }
2462
2463 width = panel_toplevel_update_size_from_hints (
2464 toplevel,
2465 requisition->width,
2466 max_width,
2467 non_panel_widget_size);
2468 }
2469
2470 width = MAX (MINIMUM_WIDTH, width)(((100) > (width)) ? (100) : (width));
2471 } else {
2472 width = MAX (MIN (MAX (width, toplevel->priv->size),(((((((((width) > (toplevel->priv->size)) ? (width) :
(toplevel->priv->size))) < (panel_toplevel_get_maximum_size
(toplevel))) ? ((((width) > (toplevel->priv->size))
? (width) : (toplevel->priv->size))) : (panel_toplevel_get_maximum_size
(toplevel)))) > (minimum_height)) ? (((((((width) > (toplevel
->priv->size)) ? (width) : (toplevel->priv->size)
)) < (panel_toplevel_get_maximum_size (toplevel))) ? ((((width
) > (toplevel->priv->size)) ? (width) : (toplevel->
priv->size))) : (panel_toplevel_get_maximum_size (toplevel
)))) : (minimum_height))
2473 panel_toplevel_get_maximum_size (toplevel)),(((((((((width) > (toplevel->priv->size)) ? (width) :
(toplevel->priv->size))) < (panel_toplevel_get_maximum_size
(toplevel))) ? ((((width) > (toplevel->priv->size))
? (width) : (toplevel->priv->size))) : (panel_toplevel_get_maximum_size
(toplevel)))) > (minimum_height)) ? (((((((width) > (toplevel
->priv->size)) ? (width) : (toplevel->priv->size)
)) < (panel_toplevel_get_maximum_size (toplevel))) ? ((((width
) > (toplevel->priv->size)) ? (width) : (toplevel->
priv->size))) : (panel_toplevel_get_maximum_size (toplevel
)))) : (minimum_height))
2474 minimum_height)(((((((((width) > (toplevel->priv->size)) ? (width) :
(toplevel->priv->size))) < (panel_toplevel_get_maximum_size
(toplevel))) ? ((((width) > (toplevel->priv->size))
? (width) : (toplevel->priv->size))) : (panel_toplevel_get_maximum_size
(toplevel)))) > (minimum_height)) ? (((((((width) > (toplevel
->priv->size)) ? (width) : (toplevel->priv->size)
)) < (panel_toplevel_get_maximum_size (toplevel))) ? ((((width
) > (toplevel->priv->size)) ? (width) : (toplevel->
priv->size))) : (panel_toplevel_get_maximum_size (toplevel
)))) : (minimum_height))
;
2475
2476 if (toplevel->priv->expand)
2477 height = monitor_geom.height;
2478 else {
2479 int max_height;
2480
2481 if (!toplevel->priv->attached)
2482 max_height = monitor_geom.height;
2483 else {
2484 if (panel_toplevel_get_orientation (toplevel->priv->attach_toplevel) == PANEL_ORIENTATION_TOP)
2485 max_height = monitor_geom.height
2486 - toplevel->priv->geometry.y;
2487 else
2488 max_height = toplevel->priv->geometry.y +
2489 toplevel->priv->geometry.height;
2490 }
2491
2492 height = panel_toplevel_update_size_from_hints (
2493 toplevel,
2494 requisition->height,
2495 max_height,
2496 non_panel_widget_size);
2497 }
2498
2499 height = MAX (MINIMUM_WIDTH, height)(((100) > (height)) ? (100) : (height));
2500 }
2501
2502 if (toplevel->priv->edges & PANEL_EDGE_TOP)
2503 height += padding.top;
2504 if (toplevel->priv->edges & PANEL_EDGE_BOTTOM)
2505 height += padding.bottom;
2506 if (toplevel->priv->edges & PANEL_EDGE_LEFT)
2507 width += padding.left;
2508 if (toplevel->priv->edges & PANEL_EDGE_RIGHT)
2509 width += padding.right;
2510
2511 toplevel->priv->geometry.width = CLAMP (width, 0, monitor_geom.width)(((width) > (monitor_geom.width)) ? (monitor_geom.width) :
(((width) < (0)) ? (0) : (width)))
;
2512 toplevel->priv->geometry.height = CLAMP (height, 0, monitor_geom.height)(((height) > (monitor_geom.height)) ? (monitor_geom.height
) : (((height) < (0)) ? (0) : (height)))
;
2513 toplevel->priv->original_width = toplevel->priv->geometry.width;
2514 toplevel->priv->original_height = toplevel->priv->geometry.height;
2515}
2516
2517static void
2518panel_toplevel_update_geometry (PanelToplevel *toplevel,
2519 CtkRequisition *requisition)
2520{
2521 toplevel->priv->updated_geometry_initial = TRUE(!(0));
2522 panel_toplevel_update_size (toplevel, requisition);
2523 panel_toplevel_update_position (toplevel);
2524
2525 panel_toplevel_update_struts (toplevel, FALSE(0));
2526
2527#ifdef HAVE_X111
2528 if (CDK_IS_X11_DISPLAY (ctk_widget_get_display (CTK_WIDGET (toplevel)))(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(ctk_widget_get_display (((((CtkWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel)), ((ctk_widget_get_type ()))))
))))); GType __t = ((cdk_x11_display_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; }))))
) {
2529 if (toplevel->priv->state == PANEL_STATE_NORMAL ||
2530 toplevel->priv->state == PANEL_STATE_AUTO_HIDDEN) {
2531 panel_struts_update_toplevel_geometry (toplevel,
2532 &toplevel->priv->geometry.x,
2533 &toplevel->priv->geometry.y,
2534 &toplevel->priv->geometry.width,
2535 &toplevel->priv->geometry.height);
2536 } else {
2537 panel_struts_update_toplevel_geometry (toplevel,
2538 &toplevel->priv->geometry.x,
2539 &toplevel->priv->geometry.y,
2540 NULL((void*)0), NULL((void*)0));
2541 }
2542 }
2543#endif // HAVE_X11
2544
2545 panel_toplevel_update_edges (toplevel);
2546 panel_toplevel_update_description (toplevel);
2547}
2548
2549static void
2550panel_toplevel_attach_widget_destroyed (PanelToplevel *toplevel)
2551{
2552 panel_toplevel_detach (toplevel);
2553}
2554
2555static gboolean
2556panel_toplevel_attach_widget_configure (PanelToplevel *toplevel)
2557{
2558 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
2559
2560 return FALSE(0);
2561}
2562
2563static void
2564panel_toplevel_update_attach_orientation (PanelToplevel *toplevel)
2565{
2566 PanelOrientation attach_orientation;
2567 PanelOrientation orientation;
2568
2569 attach_orientation =
2570 panel_toplevel_get_orientation (toplevel->priv->attach_toplevel);
2571
2572 orientation = toplevel->priv->orientation;
2573
2574 switch (attach_orientation) {
2575 case PANEL_ORIENTATION_TOP:
2576 orientation = PANEL_ORIENTATION_LEFT;
2577 break;
2578 case PANEL_ORIENTATION_BOTTOM:
2579 orientation = PANEL_ORIENTATION_RIGHT;
2580 break;
2581 case PANEL_ORIENTATION_LEFT:
2582 orientation = PANEL_ORIENTATION_TOP;
2583 break;
2584 case PANEL_ORIENTATION_RIGHT:
2585 orientation = PANEL_ORIENTATION_BOTTOM;
2586 break;
2587 default:
2588 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 2588, ((const char*) (__func__)), ((void*)0)); } while (0)
;
2589 break;
2590 }
2591
2592 panel_toplevel_set_orientation (toplevel, orientation);
2593}
2594
2595static void
2596panel_toplevel_attach_widget_parent_set (PanelToplevel *toplevel,
2597 CtkWidget *previous_parent G_GNUC_UNUSED__attribute__ ((__unused__)),
2598 CtkWidget *attach_widget)
2599{
2600 CtkWidget *panel_widget;
2601
2602 panel_widget = ctk_widget_get_parent (CTK_WIDGET (attach_widget)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((attach_widget)), ((ctk_widget_get_type ()))))))
);
2603 if (!panel_widget)
2604 return;
2605
2606 g_assert (PANEL_IS_WIDGET (panel_widget))do { if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((panel_widget)); GType __t = ((panel_widget_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_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 2606, ((const char*) (__func__)), "PANEL_IS_WIDGET (panel_widget)"
); } while (0)
;
2607
2608 toplevel->priv->attach_toplevel = PANEL_WIDGET (panel_widget)((((PanelWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((panel_widget)), ((panel_widget_get_type()))))))
->toplevel;
2609 panel_toplevel_update_attach_orientation (toplevel);
2610 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
2611}
2612
2613static void
2614panel_toplevel_attach_toplevel_hiding (PanelToplevel *toplevel)
2615{
2616 if (!panel_toplevel_get_is_hidden (toplevel)) {
2617 panel_toplevel_hide (toplevel, FALSE(0), -1);
2618
2619 toplevel->priv->attach_hidden = TRUE(!(0));
2620 }
2621}
2622
2623static void
2624panel_toplevel_attach_toplevel_unhiding (PanelToplevel *toplevel)
2625{
2626 if (!toplevel->priv->attach_hidden)
2627 return;
2628
2629 toplevel->priv->attach_hidden = FALSE(0);
2630
2631 panel_toplevel_unhide (toplevel);
2632}
2633
2634static void
2635panel_toplevel_reverse_arrow (PanelToplevel *toplevel G_GNUC_UNUSED__attribute__ ((__unused__)),
2636 CtkWidget *button)
2637{
2638 CtkArrowType arrow_type;
2639
2640 arrow_type = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (button), "arrow-type"))((gint) (glong) (g_object_get_data (((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((button)), (((GType) ((20) << (2)))
))))), "arrow-type")))
;
2641
2642 switch (arrow_type) {
2643 case CTK_ARROW_UP:
2644 arrow_type = CTK_ARROW_DOWN;
2645 break;
2646 case CTK_ARROW_DOWN:
2647 arrow_type = CTK_ARROW_UP;
2648 break;
2649 case CTK_ARROW_LEFT:
2650 arrow_type = CTK_ARROW_RIGHT;
2651 break;
2652 case CTK_ARROW_RIGHT:
2653 arrow_type = CTK_ARROW_LEFT;
2654 break;
2655 default:
2656 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 2656, ((const char*) (__func__)), ((void*)0)); } while (0)
;
2657 break;
2658 }
2659
2660 g_object_set_data (G_OBJECT (button)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((button)), (((GType) ((20) << (2))))))))
, "arrow-type", GINT_TO_POINTER (arrow_type)((gpointer) (glong) (arrow_type)));
2661
2662 set_arrow_type (CTK_IMAGE (ctk_bin_get_child (CTK_BIN (button)))((((CtkImage*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_bin_get_child (((((CtkBin*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((button)), ((ctk_bin_get_type ())))))))))
, ((ctk_image_get_type ()))))))
, arrow_type);
2663}
2664
2665static void
2666panel_toplevel_reverse_arrows (PanelToplevel *toplevel)
2667{
2668 panel_toplevel_reverse_arrow (toplevel, toplevel->priv->hide_button_top);
2669 panel_toplevel_reverse_arrow (toplevel, toplevel->priv->hide_button_bottom);
2670 panel_toplevel_reverse_arrow (toplevel, toplevel->priv->hide_button_left);
2671 panel_toplevel_reverse_arrow (toplevel, toplevel->priv->hide_button_right);
2672}
2673
2674static void
2675panel_toplevel_disconnect_attached (PanelToplevel *toplevel)
2676{
2677 int i;
2678
2679 for (i = 0; i < N_ATTACH_TOPLEVEL_SIGNALS5; i++) {
2680 if (!toplevel->priv->attach_toplevel_signals [i])
2681 continue;
2682
2683 g_signal_handler_disconnect (
2684 toplevel->priv->attach_toplevel,
2685 toplevel->priv->attach_toplevel_signals [i]);
2686 toplevel->priv->attach_toplevel_signals [i] = 0;
2687 }
2688
2689 for (i = 0; i < N_ATTACH_WIDGET_SIGNALS5; i++) {
2690 if (!toplevel->priv->attach_widget_signals [i])
2691 continue;
2692
2693 g_signal_handler_disconnect (
2694 toplevel->priv->attach_widget,
2695 toplevel->priv->attach_widget_signals [i]);
2696 toplevel->priv->attach_widget_signals [i] = 0;
2697 }
2698}
2699
2700static void
2701panel_toplevel_connect_attached (PanelToplevel *toplevel)
2702{
2703 gulong *signals;
2704 int i = 0;
2705
2706 signals = toplevel->priv->attach_toplevel_signals;
2707
2708 signals [i++] = g_signal_connect_swapped (g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("destroy"), (((GCallback) (panel_toplevel_attach_widget_destroyed
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2709 toplevel->priv->attach_toplevel, "destroy",g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("destroy"), (((GCallback) (panel_toplevel_attach_widget_destroyed
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2710 G_CALLBACK (panel_toplevel_attach_widget_destroyed), toplevel)g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("destroy"), (((GCallback) (panel_toplevel_attach_widget_destroyed
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
;
2711 signals [i++] = g_signal_connect_swapped (g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("notify::orientation"), (((GCallback) (panel_toplevel_update_attach_orientation
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2712 toplevel->priv->attach_toplevel, "notify::orientation",g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("notify::orientation"), (((GCallback) (panel_toplevel_update_attach_orientation
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2713 G_CALLBACK (panel_toplevel_update_attach_orientation), toplevel)g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("notify::orientation"), (((GCallback) (panel_toplevel_update_attach_orientation
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
;
2714 signals [i++] = g_signal_connect_swapped (g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("configure-event"), (((GCallback) (panel_toplevel_attach_widget_configure
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2715 toplevel->priv->attach_toplevel, "configure-event",g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("configure-event"), (((GCallback) (panel_toplevel_attach_widget_configure
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2716 G_CALLBACK (panel_toplevel_attach_widget_configure), toplevel)g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("configure-event"), (((GCallback) (panel_toplevel_attach_widget_configure
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
;
2717 signals [i++] = g_signal_connect_swapped (g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("hiding"), (((GCallback) (panel_toplevel_attach_toplevel_hiding
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2718 toplevel->priv->attach_toplevel, "hiding",g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("hiding"), (((GCallback) (panel_toplevel_attach_toplevel_hiding
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2719 G_CALLBACK (panel_toplevel_attach_toplevel_hiding), toplevel)g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("hiding"), (((GCallback) (panel_toplevel_attach_toplevel_hiding
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
;
2720 signals [i++] = g_signal_connect_swapped (g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("unhiding"), (((GCallback) (panel_toplevel_attach_toplevel_unhiding
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2721 toplevel->priv->attach_toplevel, "unhiding",g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("unhiding"), (((GCallback) (panel_toplevel_attach_toplevel_unhiding
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2722 G_CALLBACK (panel_toplevel_attach_toplevel_unhiding), toplevel)g_signal_connect_data ((toplevel->priv->attach_toplevel
), ("unhiding"), (((GCallback) (panel_toplevel_attach_toplevel_unhiding
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
;
2723
2724 g_assert (i == N_ATTACH_TOPLEVEL_SIGNALS)do { if (i == 5) ; else g_assertion_message_expr (((gchar*) 0
), "panel-toplevel.c", 2724, ((const char*) (__func__)), "i == N_ATTACH_TOPLEVEL_SIGNALS"
); } while (0)
;
2725
2726 signals = toplevel->priv->attach_widget_signals;
2727 i = 0;
2728
2729 signals [i++] = g_signal_connect_swapped (g_signal_connect_data ((toplevel->priv->attach_widget),
("destroy"), (((GCallback) (panel_toplevel_attach_widget_destroyed
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2730 toplevel->priv->attach_widget, "destroy",g_signal_connect_data ((toplevel->priv->attach_widget),
("destroy"), (((GCallback) (panel_toplevel_attach_widget_destroyed
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2731 G_CALLBACK (panel_toplevel_attach_widget_destroyed), toplevel)g_signal_connect_data ((toplevel->priv->attach_widget),
("destroy"), (((GCallback) (panel_toplevel_attach_widget_destroyed
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
;
2732 signals [i++] = g_signal_connect_swapped (g_signal_connect_data ((toplevel->priv->attach_widget),
("configure-event"), (((GCallback) (panel_toplevel_attach_widget_configure
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2733 toplevel->priv->attach_widget, "configure-event",g_signal_connect_data ((toplevel->priv->attach_widget),
("configure-event"), (((GCallback) (panel_toplevel_attach_widget_configure
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2734 G_CALLBACK (panel_toplevel_attach_widget_configure), toplevel)g_signal_connect_data ((toplevel->priv->attach_widget),
("configure-event"), (((GCallback) (panel_toplevel_attach_widget_configure
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
;
2735 signals [i++] = g_signal_connect_swapped (g_signal_connect_data ((toplevel->priv->attach_widget),
("parent-set"), (((GCallback) (panel_toplevel_attach_widget_parent_set
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2736 toplevel->priv->attach_widget, "parent-set",g_signal_connect_data ((toplevel->priv->attach_widget),
("parent-set"), (((GCallback) (panel_toplevel_attach_widget_parent_set
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
2737 G_CALLBACK (panel_toplevel_attach_widget_parent_set), toplevel)g_signal_connect_data ((toplevel->priv->attach_widget),
("parent-set"), (((GCallback) (panel_toplevel_attach_widget_parent_set
))), (toplevel), ((void*)0), G_CONNECT_SWAPPED)
;
2738 signals [i++] = g_signal_connect_swapped (g_signal_connect_data ((toplevel->priv->attach_widget),
("show"), (((GCallback) (ctk_widget_show))), (toplevel), ((void
*)0), G_CONNECT_SWAPPED)
2739 toplevel->priv->attach_widget, "show",g_signal_connect_data ((toplevel->priv->attach_widget),
("show"), (((GCallback) (ctk_widget_show))), (toplevel), ((void
*)0), G_CONNECT_SWAPPED)
2740 G_CALLBACK (ctk_widget_show), toplevel)g_signal_connect_data ((toplevel->priv->attach_widget),
("show"), (((GCallback) (ctk_widget_show))), (toplevel), ((void
*)0), G_CONNECT_SWAPPED)
;
2741 signals [i++] = g_signal_connect_swapped (g_signal_connect_data ((toplevel->priv->attach_widget),
("hide"), (((GCallback) (ctk_widget_hide))), (toplevel), ((void
*)0), G_CONNECT_SWAPPED)
2742 toplevel->priv->attach_widget, "hide",g_signal_connect_data ((toplevel->priv->attach_widget),
("hide"), (((GCallback) (ctk_widget_hide))), (toplevel), ((void
*)0), G_CONNECT_SWAPPED)
2743 G_CALLBACK (ctk_widget_hide), toplevel)g_signal_connect_data ((toplevel->priv->attach_widget),
("hide"), (((GCallback) (ctk_widget_hide))), (toplevel), ((void
*)0), G_CONNECT_SWAPPED)
;
2744
2745 g_assert (i == N_ATTACH_WIDGET_SIGNALS)do { if (i == 5) ; else g_assertion_message_expr (((gchar*) 0
), "panel-toplevel.c", 2745, ((const char*) (__func__)), "i == N_ATTACH_WIDGET_SIGNALS"
); } while (0)
;
2746}
2747
2748void
2749panel_toplevel_attach_to_widget (PanelToplevel *toplevel,
2750 PanelToplevel *attach_toplevel,
2751 CtkWidget *attach_widget)
2752{
2753 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
2754 g_return_if_fail (PANEL_IS_TOPLEVEL (attach_toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((attach_toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0
), ((const char*) (__func__)), "PANEL_IS_TOPLEVEL (attach_toplevel)"
); return; } } while (0)
;
2755 g_return_if_fail (CTK_IS_WIDGET (attach_widget))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((attach_widget)); GType __t = ((ctk_widget_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 (((gchar*) 0), ((const
char*) (__func__)), "CTK_IS_WIDGET (attach_widget)"); return
; } } while (0)
;
2756
2757 if (toplevel->priv->attached)
2758 panel_toplevel_disconnect_attached (toplevel);
2759
2760 toplevel->priv->attached = TRUE(!(0));
2761
2762 /* Cancelling the initial animation for drawers in
2763 * panel_toplevel_initially_hide() is not enough, since this will
2764 * happen only when the toplevel is realized, which might be too late
2765 * for drawers (since it's realized when the drawer is clicked) */
2766 toplevel->priv->initial_animation_done = TRUE(!(0));
2767
2768 toplevel->priv->attach_toplevel = attach_toplevel;
2769 toplevel->priv->attach_widget = attach_widget;
2770
2771 panel_toplevel_connect_attached (toplevel);
2772
2773 panel_toplevel_reverse_arrows (toplevel);
2774 panel_toplevel_set_expand (toplevel, FALSE(0));
2775 panel_toplevel_update_attach_orientation (toplevel);
2776 panel_toplevel_update_hide_buttons (toplevel);
2777
2778 ctk_window_set_screen (CTK_WINDOW (toplevel)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_window_get_type ()))))))
,
2779 ctk_widget_get_screen (CTK_WIDGET (attach_toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((attach_toplevel)), ((ctk_widget_get_type ()))))))
));
2780 panel_toplevel_set_monitor (toplevel,
2781 panel_toplevel_get_monitor (attach_toplevel));
2782 if (toplevel->priv->state == PANEL_STATE_NORMAL)
2783 panel_toplevel_push_autohide_disabler (toplevel->priv->attach_toplevel);
2784
2785 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
2786}
2787
2788void
2789panel_toplevel_detach (PanelToplevel *toplevel)
2790{
2791 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
2792
2793 if (!toplevel->priv->attached)
2794 return;
2795
2796 if (toplevel->priv->state == PANEL_STATE_NORMAL)
2797 panel_toplevel_pop_autohide_disabler (toplevel->priv->attach_toplevel);
2798
2799 panel_toplevel_disconnect_attached (toplevel);
2800
2801 panel_toplevel_reverse_arrows (toplevel);
2802
2803 toplevel->priv->attached = FALSE(0);
2804
2805 toplevel->priv->attach_toplevel = NULL((void*)0);
2806 toplevel->priv->attach_widget = NULL((void*)0);
2807
2808 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
2809}
2810
2811gboolean
2812panel_toplevel_get_is_attached (PanelToplevel *toplevel)
2813{
2814 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return ((0));
} } while (0)
;
2815
2816 return toplevel->priv->attached;
2817}
2818
2819PanelToplevel *
2820panel_toplevel_get_attach_toplevel (PanelToplevel *toplevel)
2821{
2822 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return (((void
*)0)); } } while (0)
;
2823
2824 return toplevel->priv->attach_toplevel;
2825}
2826
2827CtkWidget *
2828panel_toplevel_get_attach_widget (PanelToplevel *toplevel)
2829{
2830 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return (((void
*)0)); } } while (0)
;
2831
2832 return toplevel->priv->attach_widget;
2833}
2834
2835static gboolean
2836panel_toplevel_popup_panel_menu (PanelToplevel *toplevel)
2837{
2838 gboolean retval = FALSE(0);
2839
2840 g_signal_emit_by_name (toplevel, "popup_menu", &retval);
2841
2842 return retval;
2843}
2844
2845static gboolean
2846panel_toplevel_toggle_expand (PanelToplevel *toplevel)
2847{
2848 panel_toplevel_set_expand (toplevel, !toplevel->priv->expand);
2849
2850 return TRUE(!(0));
2851}
2852
2853static gboolean
2854panel_toplevel_expand (PanelToplevel *toplevel)
2855{
2856 panel_toplevel_set_expand (toplevel, TRUE(!(0)));
2857
2858 return TRUE(!(0));
2859}
2860
2861static gboolean
2862panel_toplevel_unexpand (PanelToplevel *toplevel)
2863{
2864 panel_toplevel_set_expand (toplevel, FALSE(0));
2865
2866 return TRUE(!(0));
2867}
2868
2869static gboolean
2870panel_toplevel_toggle_hidden (PanelToplevel *toplevel)
2871{
2872 if (toplevel->priv->state == PANEL_STATE_NORMAL)
2873 panel_toplevel_hide (toplevel, toplevel->priv->auto_hide, -1);
2874 else
2875 panel_toplevel_unhide (toplevel);
2876
2877 return FALSE(0);
2878}
2879
2880static gboolean
2881panel_toplevel_begin_move (PanelToplevel *toplevel)
2882{
2883 if (toplevel->priv->grab_op != PANEL_GRAB_OP_NONE)
2884 return FALSE(0);
2885
2886 panel_toplevel_begin_grab_op (
2887 toplevel, PANEL_GRAB_OP_MOVE, TRUE(!(0)), CDK_CURRENT_TIME0L);
2888
2889 return TRUE(!(0));
2890}
2891
2892static gboolean
2893panel_toplevel_begin_resize (PanelToplevel *toplevel)
2894{
2895 if (toplevel->priv->grab_op != PANEL_GRAB_OP_NONE)
2896 return FALSE(0);
2897
2898 panel_toplevel_begin_grab_op (
2899 toplevel, PANEL_GRAB_OP_RESIZE, TRUE(!(0)), CDK_CURRENT_TIME0L);
2900
2901 return TRUE(!(0));
2902}
2903
2904static void
2905panel_toplevel_move_resize_window (PanelToplevel *toplevel,
2906 gboolean move,
2907 gboolean resize)
2908{
2909 CtkWidget *widget;
2910
2911 GList *list;
2912 const char *id;
2913 int position;
2914 gboolean stick;
2915
2916 widget = CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
;
2917
2918 g_assert (ctk_widget_get_realized (widget))do { if (ctk_widget_get_realized (widget)) ; else g_assertion_message_expr
(((gchar*) 0), "panel-toplevel.c", 2918, ((const char*) (__func__
)), "ctk_widget_get_realized (widget)"); } while (0)
;
2919
2920 if (move && resize)
2921 cdk_window_move_resize (ctk_widget_get_window (widget),
2922 toplevel->priv->geometry.x,
2923 toplevel->priv->geometry.y,
2924 toplevel->priv->geometry.width,
2925 toplevel->priv->geometry.height);
2926 else if (move)
2927 cdk_window_move (ctk_widget_get_window (widget),
2928 toplevel->priv->geometry.x,
2929 toplevel->priv->geometry.y);
2930 else if (resize)
2931 cdk_window_resize (ctk_widget_get_window (widget),
2932 toplevel->priv->geometry.width,
2933 toplevel->priv->geometry.height);
2934
2935 if (resize || move) {
2936 for (list = toplevel->priv->panel_widget->applet_list; list != NULL((void*)0); list = g_list_next (list)((list) ? (((GList *)(list))->next) : ((void*)0))) {
2937 AppletData *ad = list->data;
2938 id = cafe_panel_applet_get_id_by_widget (ad->applet);
2939
2940 if (!id)
2941 return;
2942
2943 AppletInfo *info;
2944 info = cafe_panel_applet_get_by_id (id);
2945
2946 stick = g_settings_get_boolean (info->settings, PANEL_OBJECT_PANEL_RIGHT_STICK_KEY"panel-right-stick");
2947
2948 if (stick) {
2949 position = g_settings_get_int (info->settings, PANEL_OBJECT_POSITION_KEY"position");
2950 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)) {
2951 ad->pos = toplevel->priv->geometry.width - position;
2952 } else {
2953 ad->pos = toplevel->priv->geometry.height - position;
2954 }
2955 }
2956 }
2957 }
2958}
2959
2960static void
2961panel_toplevel_initially_hide (PanelToplevel *toplevel)
2962{
2963 if (!toplevel->priv->attached) {
2964 toplevel->priv->initial_animation_done = FALSE(0);
2965
2966 /* We start the panel off hidden until all the applets are
2967 * loaded, and then finally slide it down when it's ready to be
2968 * used */
2969 toplevel->priv->state = PANEL_STATE_AUTO_HIDDEN;
2970 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
2971 } else
2972 toplevel->priv->initial_animation_done = TRUE(!(0));
2973}
2974
2975static void
2976set_background_default_style (CtkWidget *widget)
2977{
2978 PanelToplevel *toplevel;
2979 CtkStyleContext *context;
2980 CtkStateFlags state;
2981 CdkRGBA *bg_color;
2982 cairo_pattern_t *bg_image;
2983
2984 if (!ctk_widget_get_realized (widget))
2985 return;
2986
2987 toplevel = PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
;
2988
2989 context = ctk_widget_get_style_context (widget);
2990 state = ctk_style_context_get_state (context);
2991
2992 ctk_style_context_get (context, state,
2993 "background-color", &bg_color,
2994 "background-image", &bg_image,
2995 NULL((void*)0));
2996
2997 panel_background_set_default_style (&toplevel->background,
2998 bg_color, bg_image);
2999
3000 if (bg_color)
3001 cdk_rgba_free (bg_color);
3002
3003 if (bg_image)
3004 cairo_pattern_destroy (bg_image);
3005}
3006
3007static void
3008panel_toplevel_realize (CtkWidget *widget)
3009{
3010 PanelToplevel *toplevel;
3011 CdkScreen *screen;
3012 CdkVisual *visual;
3013 CdkWindow *window;
3014
3015 toplevel = PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
;
3016
3017 screen = ctk_widget_get_screen (widget);
3018 visual = cdk_screen_get_rgba_visual (screen);
3019
3020 if (visual == NULL((void*)0))
3021 visual = cdk_screen_get_system_visual (screen);
3022
3023 ctk_widget_set_visual (widget, visual);
3024 ctk_window_stick (CTK_WINDOW (widget)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((ctk_window_get_type ()))))))
);
3025 ctk_window_set_decorated (CTK_WINDOW (widget)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((ctk_window_get_type ()))))))
, FALSE(0));
3026 ctk_window_stick (CTK_WINDOW (widget)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((ctk_window_get_type ()))))))
);
3027 ctk_window_set_type_hint (CTK_WINDOW (widget)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((ctk_window_get_type ()))))))
, CDK_WINDOW_TYPE_HINT_DOCK);
3028
3029 CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->realize (widget);
3030
3031 window = ctk_widget_get_window (widget);
3032 set_background_default_style (widget);
3033 panel_background_realized (&toplevel->background, window);
3034
3035#ifdef HAVE_X111
3036 if (CDK_IS_X11_WINDOW (window)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(window)); GType __t = ((cdk_x11_window_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; }))))
) {
3037 panel_struts_set_window_hint (toplevel);
3038 cdk_window_set_geometry_hints (window, NULL((void*)0), 0);
3039 }
3040#endif // HAVE_X11
3041
3042 cdk_window_set_group (window, window);
3043 panel_toplevel_initially_hide (toplevel);
3044
3045 panel_toplevel_move_resize_window (toplevel, TRUE(!(0)), TRUE(!(0)));
3046}
3047
3048static void
3049panel_toplevel_disconnect_timeouts (PanelToplevel *toplevel)
3050{
3051 if (toplevel->priv->hide_timeout)
3052 g_source_remove (toplevel->priv->hide_timeout);
3053 toplevel->priv->hide_timeout = 0;
3054
3055 if (toplevel->priv->unhide_timeout)
3056 g_source_remove (toplevel->priv->unhide_timeout);
3057 toplevel->priv->unhide_timeout = 0;
3058
3059 if (toplevel->priv->animation_timeout)
3060 g_source_remove (toplevel->priv->animation_timeout);
3061 toplevel->priv->animation_timeout = 0;
3062}
3063
3064static void
3065panel_toplevel_unrealize (CtkWidget *widget)
3066{
3067 PanelToplevel *toplevel;
3068 toplevel = PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
;
3069 panel_toplevel_disconnect_timeouts (toplevel);
3070 panel_background_unrealized (&toplevel->background);
3071 CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->unrealize (widget);
3072}
3073
3074static void
3075panel_toplevel_dispose (GObject *widget)
3076{
3077 PanelToplevel *toplevel = (PanelToplevel *) widget;
3078
3079 if (toplevel->priv->settings_path) {
3080 g_free (toplevel->priv->settings_path);
3081 toplevel->priv->settings_path = NULL((void*)0);
3082 }
3083
3084 if (toplevel->settings) {
3085 g_signal_handlers_disconnect_by_data (toplevel->settings, toplevel)g_signal_handlers_disconnect_matched ((toplevel->settings)
, G_SIGNAL_MATCH_DATA, 0, 0, ((void*)0), ((void*)0), (toplevel
))
;
3086 g_object_unref (toplevel->settings);
3087 toplevel->settings = NULL((void*)0);
3088 }
3089
3090 if (toplevel->queued_settings) {
3091 g_object_unref (toplevel->queued_settings);
3092 toplevel->queued_settings = NULL((void*)0);
3093 }
3094
3095 if (toplevel->background_settings) {
3096 g_signal_handlers_disconnect_by_data (toplevel->background_settings, toplevel)g_signal_handlers_disconnect_matched ((toplevel->background_settings
), G_SIGNAL_MATCH_DATA, 0, 0, ((void*)0), ((void*)0), (toplevel
))
;
3097 g_object_unref (toplevel->background_settings);
3098 toplevel->background_settings = NULL((void*)0);
3099 }
3100
3101 if (toplevel->priv->ctk_settings) {
3102 g_signal_handlers_disconnect_by_func (toplevel->priv->ctk_settings,g_signal_handlers_disconnect_matched ((toplevel->priv->
ctk_settings), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA
), 0, 0, ((void*)0), (((GCallback) (panel_toplevel_drag_threshold_changed
))), (toplevel))
3103 G_CALLBACK (panel_toplevel_drag_threshold_changed),g_signal_handlers_disconnect_matched ((toplevel->priv->
ctk_settings), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA
), 0, 0, ((void*)0), (((GCallback) (panel_toplevel_drag_threshold_changed
))), (toplevel))
3104 toplevel)g_signal_handlers_disconnect_matched ((toplevel->priv->
ctk_settings), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA
), 0, 0, ((void*)0), (((GCallback) (panel_toplevel_drag_threshold_changed
))), (toplevel))
;
3105 toplevel->priv->ctk_settings = NULL((void*)0);
3106
3107 panel_background_free (&toplevel->background);
3108 }
3109
3110 if (toplevel->priv->attached) {
3111 panel_toplevel_disconnect_attached (toplevel);
3112 toplevel->priv->attached = FALSE(0);
3113
3114 toplevel->priv->attach_toplevel = NULL((void*)0);
3115 toplevel->priv->attach_widget = NULL((void*)0);
3116 }
3117
3118 if (toplevel->priv->description) {
3119 g_free (toplevel->priv->description);
3120 toplevel->priv->description = NULL((void*)0);
3121 }
3122
3123 if (toplevel->priv->name) {
3124 g_free (toplevel->priv->name);
3125 toplevel->priv->name = NULL((void*)0);
3126 }
3127
3128 if (toplevel->priv->animation_start_time) {
3129 g_date_time_unref (toplevel->priv->animation_start_time);
3130 toplevel->priv->animation_start_time = NULL((void*)0);
3131 }
3132
3133 if (toplevel->priv->animation_end_time) {
3134 g_date_time_unref (toplevel->priv->animation_end_time);
3135 toplevel->priv->animation_end_time = NULL((void*)0);
3136 }
3137
3138 panel_toplevel_disconnect_timeouts (toplevel);
3139
3140 G_OBJECT_CLASS (panel_toplevel_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), (((GType) ((20) << (
2))))))))
->dispose (widget);
3141}
3142
3143static void
3144panel_toplevel_check_resize (CtkContainer *container)
3145{
3146 CtkAllocation allocation;
3147 CtkRequisition requisition;
3148 CtkWidget *widget;
3149
3150 widget = CTK_WIDGET (container)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((container)), ((ctk_widget_get_type ()))))))
;
3151
3152 if (!ctk_widget_get_visible (widget))
3153 return;
3154
3155 requisition.width = -1;
3156 requisition.height = -1;
3157
3158 ctk_widget_get_preferred_size (widget, &requisition, NULL((void*)0));
3159 ctk_widget_get_allocation (widget, &allocation);
3160
3161 allocation.width = requisition.width;
3162 allocation.height = requisition.height;
3163
3164 ctk_widget_size_allocate (widget, &allocation);
3165}
3166
3167static void
3168panel_toplevel_size_request (CtkWidget *widget,
3169 CtkRequisition *requisition)
3170{
3171 PanelToplevel *toplevel;
3172 CtkBin *bin;
3173 CtkWidget *child;
3174 CdkRectangle old_geometry;
3175 int position_changed = FALSE(0);
3176 int size_changed = FALSE(0);
3177
3178 toplevel = PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
;
3179 bin = CTK_BIN (widget)((((CtkBin*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((ctk_bin_get_type ()))))))
;
3180
3181 /* we get a size request when there are new monitors, so first try to
3182 * see if we need to move to a new monitor */
3183 panel_toplevel_update_monitor (toplevel);
3184
3185 child = ctk_bin_get_child (bin);
3186 if (child && ctk_widget_get_visible (child))
3187 ctk_widget_get_preferred_size (child, requisition, NULL((void*)0));
3188
3189 old_geometry = toplevel->priv->geometry;
3190
3191 panel_toplevel_update_geometry (toplevel, requisition);
3192
3193 requisition->width = toplevel->priv->geometry.width;
3194 requisition->height = toplevel->priv->geometry.height;
3195
3196 if (!ctk_widget_get_realized (widget))
3197 return;
3198
3199 if (old_geometry.width != toplevel->priv->geometry.width ||
3200 old_geometry.height != toplevel->priv->geometry.height)
3201 size_changed = TRUE(!(0));
3202
3203 if (old_geometry.x != toplevel->priv->geometry.x ||
3204 old_geometry.y != toplevel->priv->geometry.y)
3205 position_changed = TRUE(!(0));
3206
3207 panel_toplevel_move_resize_window (toplevel, position_changed, size_changed);
3208}
3209
3210static void
3211panel_toplevel_get_preferred_width (CtkWidget *widget,
3212 gint *minimum_width,
3213 gint *natural_width)
3214{
3215 CtkRequisition req;
3216 panel_toplevel_size_request (widget, &req);
3217 *minimum_width = *natural_width = req.width;
3218}
3219
3220static void
3221panel_toplevel_get_preferred_height (CtkWidget *widget,
3222 gint *minimum_height,
3223 gint *natural_height)
3224{
3225 CtkRequisition req;
3226 panel_toplevel_size_request (widget, &req);
3227 *minimum_height = *natural_height = req.height;
3228}
3229
3230static void
3231set_background_region (PanelToplevel *toplevel)
3232{
3233 CtkWidget *widget;
3234 CdkWindow *window;
3235 gint origin_x;
3236 gint origin_y;
3237 CtkAllocation allocation;
3238 CtkOrientation orientation;
3239
3240 widget = CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
;
3241
3242 if (!ctk_widget_get_realized (widget))
3243 return;
3244
3245 window = ctk_widget_get_window (widget);
3246 origin_x = -1;
3247 origin_y = -1;
3248
3249 cdk_window_get_origin (window, &origin_x, &origin_y);
3250 ctk_widget_get_allocation (widget, &allocation);
3251
3252 orientation = CTK_ORIENTATION_HORIZONTAL;
3253 if (toplevel->priv->orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT))
3254 orientation = CTK_ORIENTATION_VERTICAL;
3255
3256 panel_background_change_region (&toplevel->background, orientation,
3257 origin_x, origin_y,
3258 allocation.width, allocation.height);
3259}
3260
3261static void
3262panel_toplevel_size_allocate (CtkWidget *widget,
3263 CtkAllocation *allocation)
3264{
3265 PanelToplevel *toplevel = (PanelToplevel *) widget;
3266 CtkBin *bin = (CtkBin *) widget;
3267 CtkStyleContext *context;
3268 CtkStateFlags state;
3269 CtkBorder padding;
3270 CtkWidget *child;
3271 CtkAllocation challoc;
3272 CtkAllocation child_allocation;
3273
3274 ctk_widget_set_allocation (widget, allocation);
3275
3276 if (toplevel->priv->expand ||
3277 toplevel->priv->buttons_enabled ||
3278 toplevel->priv->attached)
3279 challoc = *allocation;
3280 else {
3281 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)) {
3282 challoc.x = HANDLE_SIZE10;
3283 challoc.y = 0;
3284 challoc.width = allocation->width - 2 * HANDLE_SIZE10;
3285 challoc.height = allocation->height;
3286 } else {
3287 challoc.x = 0;
3288 challoc.y = HANDLE_SIZE10;
3289 challoc.width = allocation->width;
3290 challoc.height = allocation->height - 2 * HANDLE_SIZE10;
3291 }
3292 }
3293
3294 state = ctk_widget_get_state_flags (widget);
3295 context = ctk_widget_get_style_context (widget);
3296 ctk_style_context_get_padding (context, state, &padding);
3297
3298 if (toplevel->priv->edges & PANEL_EDGE_TOP) {
3299 challoc.y += padding.top;
3300 challoc.height -= padding.top;
3301 }
3302
3303 if (toplevel->priv->edges & PANEL_EDGE_LEFT) {
3304 challoc.x += padding.left;
3305 challoc.width -= padding.left;
3306 }
3307
3308 if (toplevel->priv->edges & PANEL_EDGE_BOTTOM)
3309 challoc.height -= padding.bottom;
3310
3311 if (toplevel->priv->edges & PANEL_EDGE_RIGHT)
3312 challoc.width -= padding.right;
3313
3314 challoc.width = MAX (1, challoc.width)(((1) > (challoc.width)) ? (1) : (challoc.width));
3315 challoc.height = MAX (1, challoc.height)(((1) > (challoc.height)) ? (1) : (challoc.height));
3316
3317 child = ctk_bin_get_child (bin);
3318 ctk_widget_get_allocation (child, &child_allocation);
3319
3320 if (ctk_widget_get_mapped (widget) &&
3321 (challoc.x != child_allocation.x ||
3322 challoc.y != child_allocation.y ||
3323 challoc.width != child_allocation.width ||
3324 challoc.height != child_allocation.height)) {
3325 CtkAllocation allocation;
3326
3327 ctk_widget_get_allocation (widget, &allocation);
3328 cdk_window_invalidate_rect (ctk_widget_get_window (widget), &allocation, FALSE(0));
3329 }
3330
3331 if (child && ctk_widget_get_visible (child))
3332 ctk_widget_size_allocate (child, &challoc);
3333
3334 set_background_region (toplevel);
3335}
3336
3337static gboolean panel_toplevel_draw(CtkWidget* widget, cairo_t* cr)
3338{
3339 PanelToplevel* toplevel = (PanelToplevel*) widget;
3340 PanelFrameEdge edges;
3341 gboolean retval = FALSE(0);
3342 int awidth;
3343 int aheight;
3344 CtkStyleContext *context;
3345 CtkStateFlags state;
3346 CtkBorder padding;
3347
3348 if (!ctk_widget_is_drawable (widget))
3349 return retval;
3350
3351 if (CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->draw)
3352 retval = CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->draw (widget, cr);
3353
3354 edges = toplevel->priv->edges;
3355 panel_frame_draw (widget, cr, edges);
3356
3357 if (toplevel->priv->expand ||
3358 toplevel->priv->buttons_enabled ||
3359 toplevel->priv->attached)
3360 return retval;
3361
3362 state = ctk_widget_get_state_flags (widget);
3363 awidth = ctk_widget_get_allocated_width (widget);
3364 aheight = ctk_widget_get_allocated_height (widget);
3365
3366 context = ctk_widget_get_style_context (widget);
3367 ctk_style_context_get_padding (context, state, &padding);
3368
3369 ctk_style_context_save (context);
3370 ctk_style_context_set_state (context, state);
3371
3372 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)) {
3373 int x, y, width, height;
3374
3375 x = 0;
3376 y = 0;
3377 height = aheight;
3378 width = HANDLE_SIZE10;
3379
3380 if (edges & PANEL_EDGE_TOP) {
3381 y += padding.top;
3382 height -= padding.top;
3383 }
3384 if (edges & PANEL_EDGE_BOTTOM)
3385 height -= padding.bottom;
3386 if (edges & PANEL_EDGE_LEFT)
3387 x += padding.left;
3388
3389 cairo_save (cr);
3390 ctk_render_handle (context, cr, x, y, width, height);
3391 cairo_restore (cr);
3392
3393 x = awidth - HANDLE_SIZE10;
3394 if (edges & PANEL_EDGE_RIGHT)
3395 x -= padding.right;
3396
3397 cairo_save (cr);
3398 ctk_render_handle (context, cr, x, y, width, height);
3399 cairo_restore (cr);
3400 } else {
3401 int x, y, width, height;
3402
3403 x = 0;
3404 y = 0;
3405 width = awidth;
3406 height = HANDLE_SIZE10;
3407
3408 if (edges & PANEL_EDGE_LEFT) {
3409 x += padding.left;
3410 width -= padding.left;
3411 }
3412 if (edges & PANEL_EDGE_RIGHT)
3413 width -= padding.right;
3414 if (edges & PANEL_EDGE_TOP)
3415 y += padding.top;
3416
3417 cairo_save (cr);
3418 ctk_render_handle (context, cr, x, y, width, height);
3419 cairo_restore (cr);
3420
3421 y = aheight - HANDLE_SIZE10;
3422 if (edges & PANEL_EDGE_BOTTOM)
3423 y -= padding.bottom;
3424
3425 cairo_save (cr);
3426 ctk_render_handle (context, cr, x, y, width, height);
3427 cairo_restore (cr);
3428 }
3429
3430 ctk_style_context_restore (context);
3431
3432 return retval;
3433}
3434
3435static gboolean
3436panel_toplevel_button_press_event (CtkWidget *widget,
3437 CdkEventButton *event)
3438{
3439 PanelToplevel *toplevel;
3440 CtkWidget *event_widget;
3441
3442 g_return_val_if_fail (PANEL_IS_TOPLEVEL (widget), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((widget)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (widget)"); return ((0)); }
} while (0)
;
3443
3444 toplevel = PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
;
3445
3446 if (event->button != 1 && event->button != 2)
3447 return FALSE(0);
3448
3449 if (toplevel->priv->animating)
3450 return FALSE(0);
3451
3452 /* Get the mouse-button modifier from croma so that only intentional
3453 * moves are considered. We don't this for non-expanded panels since we
3454 * only have the handles that the user can grab. */
3455 if ((toplevel->priv->expand || toplevel->priv->attached) &&
3456 (event->state & CDK_MODIFIER_MASK) != panel_bindings_get_mouse_button_modifier_keymask ())
3457 return FALSE(0);
3458
3459 cdk_window_get_user_data (event->window, (gpointer)&event_widget);
3460 g_assert (CTK_IS_WIDGET (event_widget))do { if ((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((event_widget)); GType __t = ((ctk_widget_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_assertion_message_expr (((gchar*) 0), "panel-toplevel.c", 3460
, ((const char*) (__func__)), "CTK_IS_WIDGET (event_widget)")
; } while (0)
;
3461 ctk_widget_translate_coordinates (event_widget,
3462 widget,
3463 event->x,
3464 event->y,
3465 &toplevel->priv->drag_offset_x,
3466 &toplevel->priv->drag_offset_y);
3467
3468 panel_toplevel_begin_grab_op (toplevel, PANEL_GRAB_OP_MOVE, FALSE(0), event->time);
3469
3470 return TRUE(!(0));
3471}
3472
3473static gboolean
3474panel_toplevel_button_release_event (CtkWidget *widget,
3475 CdkEventButton *event)
3476{
3477 PanelToplevel *toplevel;
3478
3479 if (event->button != 1 && event->button != 2)
3480 return FALSE(0);
3481
3482 toplevel = PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
;
3483
3484 if (toplevel->priv->grab_op == PANEL_GRAB_OP_NONE)
3485 return FALSE(0);
3486
3487 if (toplevel->priv->grab_is_keyboard)
3488 return FALSE(0);
3489
3490 panel_toplevel_end_grab_op (toplevel, event->time);
3491
3492 return TRUE(!(0));
3493}
3494
3495static gboolean
3496panel_toplevel_configure_event (CtkWidget *widget,
3497 CdkEventConfigure *event G_GNUC_UNUSED__attribute__ ((__unused__)))
3498{
3499 PanelToplevel *toplevel;
3500
3501 toplevel = PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
;
3502
3503 set_background_region (toplevel);
3504
3505 return TRUE(!(0));
3506}
3507
3508static gboolean
3509panel_toplevel_key_press_event (CtkWidget *widget,
3510 CdkEventKey *event)
3511{
3512 PanelToplevel *toplevel = (PanelToplevel *) widget;
3513
3514 if (toplevel->priv->grab_op != PANEL_GRAB_OP_NONE &&
3515 panel_toplevel_handle_grab_op_key_event (toplevel, event))
3516 return TRUE(!(0));
3517
3518 if (CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->key_press_event)
3519 return CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->key_press_event (widget, event);
3520
3521 return FALSE(0);
3522}
3523
3524static void
3525panel_toplevel_state_flags_changed (CtkWidget *widget,
3526 CtkStateFlags previous_state)
3527{
3528 CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->state_flags_changed (widget,
3529 previous_state);
3530
3531 set_background_default_style (widget);
3532}
3533
3534static gboolean
3535panel_toplevel_motion_notify_event (CtkWidget *widget,
3536 CdkEventMotion *event)
3537{
3538 if (cdk_event_get_screen ((CdkEvent *)event) ==
3539 ctk_window_get_screen (CTK_WINDOW (widget)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((ctk_window_get_type ()))))))
))
3540 return panel_toplevel_handle_grab_op_motion_event (
3541 PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
, event);
3542 else
3543 return FALSE(0);
3544}
3545
3546static gboolean
3547panel_toplevel_animation_timeout (PanelToplevel *toplevel)
3548{
3549 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
3550
3551 if (!toplevel->priv->animating) {
3552 toplevel->priv->animation_end_x = 0xdead;
3553 toplevel->priv->animation_end_y = 0xdead;
3554 toplevel->priv->animation_end_width = 0xdead;
3555 toplevel->priv->animation_end_height = 0xdead;
3556 if (toplevel->priv->animation_start_time) {
3557 g_date_time_unref (toplevel->priv->animation_start_time);
3558 toplevel->priv->animation_start_time = NULL((void*)0);
3559 }
3560 if (toplevel->priv->animation_end_time) {
3561 g_date_time_unref (toplevel->priv->animation_end_time);
3562 toplevel->priv->animation_end_time = NULL((void*)0);
3563 }
3564 toplevel->priv->animation_timeout = 0;
3565 toplevel->priv->initial_animation_done = TRUE(!(0));
3566 }
3567
3568 return toplevel->priv->animating;
3569}
3570
3571static GTimeSpan
3572panel_toplevel_get_animation_time (PanelToplevel *toplevel)
3573{
3574 /* The number of milliseconds to complete the animation.
3575 */
3576#define ANIMATION_TIME_FAST 400
3577#define ANIMATION_TIME_MEDIUM 1200
3578#define ANIMATION_TIME_SLOW 2000
3579
3580 GTimeSpan t;
3581
3582 switch (toplevel->priv->animation_speed) {
3583 case PANEL_ANIMATION_SLOW:
3584 t = ANIMATION_TIME_SLOW * G_TIME_SPAN_MILLISECOND((1000L));
3585 break;
3586 case PANEL_ANIMATION_MEDIUM:
3587 t = ANIMATION_TIME_MEDIUM * G_TIME_SPAN_MILLISECOND((1000L));
3588 break;
3589 case PANEL_ANIMATION_FAST:
3590 t = ANIMATION_TIME_FAST * G_TIME_SPAN_MILLISECOND((1000L));
3591 break;
3592 default:
3593 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 3593, ((const char*) (__func__)), ((void*)0)); } while (0)
;
3594 break;
3595 }
3596
3597 return t;
3598
3599#undef ANIMATION_TIME_FAST
3600#undef ANIMATION_TIME_MEDIUM
3601#undef ANIMATION_TIME_SLOW
3602}
3603
3604static void
3605panel_toplevel_calculate_animation_end_geometry (PanelToplevel *toplevel)
3606{
3607 CdkRectangle monitor_geom;
3608
3609 toplevel->priv->animation_end_x = toplevel->priv->x;
3610 toplevel->priv->animation_end_y = toplevel->priv->y;
3611 toplevel->priv->animation_end_width = -1;
3612 toplevel->priv->animation_end_height = -1;
3613
3614 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
3615
3616 if (!toplevel->priv->expand) {
3617
3618 if (toplevel->priv->x_centered)
3619 toplevel->priv->animation_end_x =
3620 (monitor_geom.width - toplevel->priv->geometry.width) / 2;
3621 if (toplevel->priv->y_centered)
3622 toplevel->priv->animation_end_y =
3623 (monitor_geom.height - toplevel->priv->geometry.height) / 2;
3624 }
3625
3626 /* we consider the toplevels which are in the initial animation stage
3627 * as in a normal state */
3628 if (toplevel->priv->state == PANEL_STATE_NORMAL ||
3629 (!toplevel->priv->initial_animation_done &&
3630 !toplevel->priv->auto_hide))
3631 panel_toplevel_update_normal_position (toplevel,
3632 &toplevel->priv->animation_end_x,
3633 &toplevel->priv->animation_end_y,
3634 &toplevel->priv->animation_end_width,
3635 &toplevel->priv->animation_end_height);
3636
3637 else if (toplevel->priv->state == PANEL_STATE_AUTO_HIDDEN)
3638 panel_toplevel_update_auto_hide_position (toplevel,
3639 &toplevel->priv->animation_end_x,
3640 &toplevel->priv->animation_end_y,
3641 &toplevel->priv->animation_end_width,
3642 &toplevel->priv->animation_end_height,
3643 TRUE(!(0)));
3644 else
3645 panel_toplevel_update_hidden_position (toplevel,
3646 &toplevel->priv->animation_end_x,
3647 &toplevel->priv->animation_end_y,
3648 &toplevel->priv->animation_end_width,
3649 &toplevel->priv->animation_end_height);
3650}
3651
3652static void
3653panel_toplevel_start_animation (PanelToplevel *toplevel)
3654{
3655 CtkRequisition requisition;
3656 int deltax, deltay, deltaw = 0, deltah = 0;
3657 int cur_x = -1, cur_y = -1;
3658
3659 panel_toplevel_calculate_animation_end_geometry (toplevel);
3660
3661 toplevel->priv->animating = TRUE(!(0));
3662
3663 panel_toplevel_update_struts (toplevel, TRUE(!(0)));
3664#ifdef HAVE_X111
3665 if (CDK_IS_X11_DISPLAY (ctk_widget_get_display (CTK_WIDGET (toplevel)))(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(ctk_widget_get_display (((((CtkWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel)), ((ctk_widget_get_type ()))))
))))); GType __t = ((cdk_x11_display_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; }))))
) {
3666 panel_struts_update_toplevel_geometry (toplevel,
3667 &toplevel->priv->animation_end_x,
3668 &toplevel->priv->animation_end_y,
3669 &toplevel->priv->animation_end_width,
3670 &toplevel->priv->animation_end_height);
3671 }
3672#endif // HAVE_X11
3673 panel_toplevel_update_struts (toplevel, FALSE(0));
3674
3675 cdk_window_get_origin (ctk_widget_get_window (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
), &cur_x, &cur_y);
3676
3677 cur_x -= panel_multimonitor_x (toplevel->priv->monitor);
3678 cur_y -= panel_multimonitor_y (toplevel->priv->monitor);
3679
3680 deltax = toplevel->priv->animation_end_x - cur_x;
3681 deltay = toplevel->priv->animation_end_y - cur_y;
3682
3683 ctk_widget_get_preferred_size (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
, &requisition, NULL((void*)0));
3684
3685 if (toplevel->priv->animation_end_width != -1)
3686 deltaw = toplevel->priv->animation_end_width - requisition.width;
3687
3688 if (toplevel->priv->animation_end_height != -1)
3689 deltah = toplevel->priv->animation_end_height - requisition.height;
3690
3691 if (deltax == 0 && deltay == 0 && deltaw == 0 && deltah == 0) {
3692 toplevel->priv->animation_end_x = -1;
3693 toplevel->priv->animation_end_y = -1;
3694 toplevel->priv->animation_end_width = -1;
3695 toplevel->priv->animation_end_height = -1;
3696 toplevel->priv->animating = FALSE(0);
3697 return;
3698 }
3699
3700 if (toplevel->priv->attached) {
3701 /* Re-map unmapped attached toplevels */
3702 if (!ctk_widget_get_visible (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
))
3703 ctk_widget_set_visible (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
, TRUE(!(0)));
3704
3705 if (!ctk_widget_get_mapped (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
))
3706 ctk_widget_map (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
3707
3708 ctk_window_present (CTK_WINDOW (toplevel->priv->attach_toplevel)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->attach_toplevel)), ((ctk_window_get_type
()))))))
);
3709 }
3710
3711 if (toplevel->priv->animation_start_time)
3712 g_date_time_unref (toplevel->priv->animation_start_time);
3713 toplevel->priv->animation_start_time = g_date_time_new_now_local ();
3714
3715 if (toplevel->priv->animation_end_time)
3716 g_date_time_unref (toplevel->priv->animation_end_time);
3717 toplevel->priv->animation_end_time = g_date_time_add (toplevel->priv->animation_start_time,
3718 panel_toplevel_get_animation_time (toplevel));
3719
3720 if (!toplevel->priv->animation_timeout)
3721 toplevel->priv->animation_timeout =
3722 g_timeout_add (20, (GSourceFunc) panel_toplevel_animation_timeout, toplevel);
3723}
3724
3725void
3726panel_toplevel_hide (PanelToplevel *toplevel,
3727 gboolean auto_hide,
3728 CtkDirectionType direction)
3729{
3730 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
3731
3732 if (toplevel->priv->state != PANEL_STATE_NORMAL)
3733 return;
3734
3735 g_signal_emit (toplevel, toplevel_signals [HIDE_SIGNAL], 0);
3736
3737 if (toplevel->priv->attach_toplevel)
3738 panel_toplevel_pop_autohide_disabler (toplevel->priv->attach_toplevel);
3739
3740 if (auto_hide)
3741 toplevel->priv->state = PANEL_STATE_AUTO_HIDDEN;
3742 else {
3743 if (direction == -1) {
3744 if (toplevel->priv->orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT))
3745 direction = CTK_DIR_UP;
3746 else
3747 direction = CTK_DIR_LEFT;
3748 }
3749
3750 switch (direction) {
3751 case CTK_DIR_UP:
3752 g_return_if_fail (toplevel->priv->orientation & PANEL_VERTICAL_MASK)do { if ((toplevel->priv->orientation & (PANEL_ORIENTATION_LEFT
| PANEL_ORIENTATION_RIGHT))) { } else { g_return_if_fail_warning
(((gchar*) 0), ((const char*) (__func__)), "toplevel->priv->orientation & PANEL_VERTICAL_MASK"
); return; } } while (0)
;
3753 toplevel->priv->state = PANEL_STATE_HIDDEN_UP;
3754 break;
3755 case CTK_DIR_DOWN:
3756 g_return_if_fail (toplevel->priv->orientation & PANEL_VERTICAL_MASK)do { if ((toplevel->priv->orientation & (PANEL_ORIENTATION_LEFT
| PANEL_ORIENTATION_RIGHT))) { } else { g_return_if_fail_warning
(((gchar*) 0), ((const char*) (__func__)), "toplevel->priv->orientation & PANEL_VERTICAL_MASK"
); return; } } while (0)
;
3757 toplevel->priv->state = PANEL_STATE_HIDDEN_DOWN;
3758 break;
3759 case CTK_DIR_LEFT:
3760 g_return_if_fail (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK)do { if ((toplevel->priv->orientation & (PANEL_ORIENTATION_TOP
| PANEL_ORIENTATION_BOTTOM))) { } else { g_return_if_fail_warning
(((gchar*) 0), ((const char*) (__func__)), "toplevel->priv->orientation & PANEL_HORIZONTAL_MASK"
); return; } } while (0)
;
3761 toplevel->priv->state = PANEL_STATE_HIDDEN_LEFT;
3762 break;
3763 case CTK_DIR_RIGHT:
3764 g_return_if_fail (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK)do { if ((toplevel->priv->orientation & (PANEL_ORIENTATION_TOP
| PANEL_ORIENTATION_BOTTOM))) { } else { g_return_if_fail_warning
(((gchar*) 0), ((const char*) (__func__)), "toplevel->priv->orientation & PANEL_HORIZONTAL_MASK"
); return; } } while (0)
;
3765 toplevel->priv->state = PANEL_STATE_HIDDEN_RIGHT;
3766 break;
3767 default:
3768 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 3768, ((const char*) (__func__)), ((void*)0)); } while (0)
;
3769 break;
3770 }
3771
3772 panel_toplevel_update_hide_buttons (toplevel);
3773 }
3774
3775 if (toplevel->priv->animate && ctk_widget_get_realized (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
)) {
3776 panel_toplevel_start_animation (toplevel);
3777 }
3778
3779 /* if the toplevel is attached (-> drawer), hide it after the animation
3780 * this hides the hide button properly as well */
3781 if (toplevel->priv->attached) {
3782 ctk_widget_hide (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
3783 }
3784
3785 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
3786}
3787
3788static gboolean
3789panel_toplevel_auto_hide_timeout_handler (PanelToplevel *toplevel)
3790{
3791 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return ((0));
} } while (0)
;
3792
3793 if (panel_toplevel_get_autohide_disabled (toplevel)) {
3794 toplevel->priv->hide_timeout = 0;
3795 return FALSE(0);
3796 }
3797
3798 /* keep coming back until the animation has finished.
3799 * FIXME: we should really remove the timeout/idle
3800 * completely and re-instate it when the
3801 * animation has finished.
3802 */
3803 if (toplevel->priv->animating)
3804 return TRUE(!(0));
3805
3806 panel_toplevel_hide (toplevel, TRUE(!(0)), -1);
3807
3808 toplevel->priv->hide_timeout = 0;
3809
3810 return FALSE(0);
3811}
3812
3813void
3814panel_toplevel_unhide (PanelToplevel *toplevel)
3815{
3816 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
3817
3818 if (toplevel->priv->state == PANEL_STATE_NORMAL)
3819 return;
3820
3821 toplevel->priv->state = PANEL_STATE_NORMAL;
3822
3823 panel_toplevel_update_hide_buttons (toplevel);
3824
3825 if (toplevel->priv->attach_toplevel)
3826 panel_toplevel_push_autohide_disabler (toplevel->priv->attach_toplevel);
3827
3828 if (toplevel->priv->animate && ctk_widget_get_realized (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
)) {
3829 panel_toplevel_start_animation (toplevel);
3830 }
3831
3832 /* if the toplevel is attached (-> drawer), unhide it after the animation
3833 * (same as for hide) */
3834 if (toplevel->priv->attached) {
3835 ctk_widget_show (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
3836 }
3837
3838 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
3839
3840 if (!toplevel->priv->animate)
3841 g_signal_emit (toplevel, toplevel_signals [UNHIDE_SIGNAL], 0);
3842}
3843
3844static gboolean
3845panel_toplevel_auto_unhide_timeout_handler (PanelToplevel *toplevel)
3846{
3847 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return ((0));
} } while (0)
;
3848
3849 /* keep coming back until the animation has finished.
3850 * FIXME: we should really remove the timeout/idle
3851 * completely and re-instate it when the
3852 * animation has finished.
3853 */
3854 if (toplevel->priv->animating)
3855 return TRUE(!(0));
3856
3857 if (!toplevel->priv->animate)
3858 toplevel->priv->initial_animation_done = TRUE(!(0));
3859
3860 /* initial animation for auto-hidden panels: we need to unhide and hide
3861 * again to get at the right size */
3862 if (!toplevel->priv->initial_animation_done &&
3863 toplevel->priv->auto_hide) {
3864 toplevel->priv->unhide_timeout = 0;
3865 panel_toplevel_unhide (toplevel);
3866 panel_toplevel_hide (toplevel, TRUE(!(0)), -1);
3867 return FALSE(0);
3868 }
3869
3870 if (!panel_toplevel_contains_pointer (toplevel) &&
3871 toplevel->priv->auto_hide) {
3872 toplevel->priv->unhide_timeout = 0;
3873 return FALSE(0);
3874 }
3875
3876 panel_toplevel_unhide (toplevel);
3877
3878 toplevel->priv->unhide_timeout = 0;
3879
3880 return FALSE(0);
3881}
3882
3883void
3884panel_toplevel_queue_auto_hide (PanelToplevel *toplevel)
3885{
3886 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
3887
3888 if (!toplevel->priv->auto_hide ||
3889 panel_toplevel_contains_pointer (toplevel) ||
3890 panel_toplevel_get_autohide_disabled (toplevel))
3891 return;
3892
3893 if (toplevel->priv->unhide_timeout)
3894 g_source_remove (toplevel->priv->unhide_timeout);
3895 toplevel->priv->unhide_timeout = 0;
3896
3897 if (toplevel->priv->hide_timeout ||
3898 toplevel->priv->state != PANEL_STATE_NORMAL)
3899 return;
3900
3901 if (toplevel->priv->hide_delay > 0)
3902 toplevel->priv->hide_timeout =
3903 g_timeout_add (toplevel->priv->hide_delay,
3904 (GSourceFunc) panel_toplevel_auto_hide_timeout_handler,
3905 toplevel);
3906 else
3907 toplevel->priv->hide_timeout =
3908 g_idle_add ((GSourceFunc) panel_toplevel_auto_hide_timeout_handler,
3909 toplevel);
3910}
3911
3912void
3913panel_toplevel_queue_auto_unhide (PanelToplevel *toplevel)
3914{
3915 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
3916
3917 if (toplevel->priv->unhide_timeout)
3918 return;
3919
3920 if (toplevel->priv->hide_timeout)
3921 g_source_remove (toplevel->priv->hide_timeout);
3922 toplevel->priv->hide_timeout = 0;
3923
3924 if (toplevel->priv->state != PANEL_STATE_AUTO_HIDDEN)
3925 return;
3926
3927 if (toplevel->priv->unhide_delay > 0)
3928 toplevel->priv->unhide_timeout =
3929 g_timeout_add (toplevel->priv->unhide_delay,
3930 (GSourceFunc) panel_toplevel_auto_unhide_timeout_handler,
3931 toplevel);
3932 else
3933 toplevel->priv->unhide_timeout =
3934 g_idle_add ((GSourceFunc) panel_toplevel_auto_unhide_timeout_handler,
3935 toplevel);
3936}
3937
3938void
3939panel_toplevel_queue_initial_unhide (PanelToplevel *toplevel)
3940{
3941 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
3942
3943 if (toplevel->priv->initial_animation_done)
3944 return;
3945
3946 if (toplevel->priv->unhide_timeout)
3947 return;
3948
3949 toplevel->priv->unhide_timeout =
3950 g_idle_add ((GSourceFunc) panel_toplevel_auto_unhide_timeout_handler,
3951 toplevel);
3952}
3953
3954static gboolean
3955panel_toplevel_enter_notify_event (CtkWidget *widget,
3956 CdkEventCrossing *event)
3957{
3958 PanelToplevel *toplevel;
3959
3960 g_return_val_if_fail (PANEL_IS_TOPLEVEL (widget), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((widget)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (widget)"); return ((0)); }
} while (0)
;
3961
3962 toplevel = PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
;
3963
3964 if (toplevel->priv->auto_hide && event->detail != CDK_NOTIFY_INFERIOR)
3965 panel_toplevel_queue_auto_unhide (toplevel);
3966
3967 if (CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->enter_notify_event)
3968 return CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->enter_notify_event (widget, event);
3969
3970 return FALSE(0);
3971}
3972
3973static gboolean
3974panel_toplevel_leave_notify_event (CtkWidget *widget,
3975 CdkEventCrossing *event)
3976{
3977 PanelToplevel *toplevel;
3978
3979 g_return_val_if_fail (PANEL_IS_TOPLEVEL (widget), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((widget)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (widget)"); return ((0)); }
} while (0)
;
3980
3981 toplevel = PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
;
3982
3983 if (toplevel->priv->auto_hide && event->detail != CDK_NOTIFY_INFERIOR)
3984 panel_toplevel_queue_auto_hide (toplevel);
3985
3986 if (CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->leave_notify_event)
3987 return CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->leave_notify_event (widget, event);
3988
3989 return FALSE(0);
3990}
3991
3992static gboolean
3993panel_toplevel_focus_in_event (CtkWidget *widget,
3994 CdkEventFocus *event)
3995{
3996 PanelToplevel *toplevel = PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
;
3997
3998 if (toplevel->priv->state == PANEL_STATE_AUTO_HIDDEN)
3999 panel_toplevel_unhide (toplevel);
4000
4001 if (CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->focus_in_event)
4002 return CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->focus_in_event (widget, event);
4003
4004 return FALSE(0);
4005}
4006
4007static gboolean
4008panel_toplevel_focus_out_event (CtkWidget *widget,
4009 CdkEventFocus *event)
4010{
4011 PanelToplevel *toplevel = PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
;
4012
4013 /* It appears that sometimes we don't get a leave notify event,
4014 but just a focus in/out, so queue the autohide in that case.
4015 If the pointer is inside the panel then obviously we won't hide */
4016 if (toplevel->priv->auto_hide)
4017 panel_toplevel_queue_auto_hide (toplevel);
4018
4019 if (CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->focus_out_event)
4020 return CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->focus_out_event (widget, event);
4021
4022 return FALSE(0);
4023}
4024
4025static void
4026panel_toplevel_style_updated (CtkWidget *widget)
4027{
4028 panel_toplevel_update_hide_buttons (PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
);
4029
4030 if (CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->style_updated)
4031 CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->style_updated (widget);
4032
4033 set_background_default_style (widget);
4034}
4035
4036static void
4037panel_toplevel_drag_threshold_changed (PanelToplevel *toplevel)
4038{
4039 int threshold;
4040
4041 threshold = 0;
4042 g_object_get (G_OBJECT (toplevel->priv->ctk_settings)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->ctk_settings)), (((GType) ((20) <<
(2))))))))
,
4043 "ctk-dnd-drag-threshold", &threshold,
4044 NULL((void*)0));
4045
4046 if (threshold)
4047 toplevel->priv->snap_tolerance = threshold * SNAP_TOLERANCE_FACTOR6;
4048}
4049
4050static void
4051panel_toplevel_update_ctk_settings (PanelToplevel *toplevel)
4052{
4053 if (toplevel->priv->ctk_settings)
4054 g_signal_handlers_disconnect_by_func (toplevel->priv->ctk_settings,g_signal_handlers_disconnect_matched ((toplevel->priv->
ctk_settings), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA
), 0, 0, ((void*)0), (((GCallback) (panel_toplevel_drag_threshold_changed
))), (toplevel))
4055 G_CALLBACK (panel_toplevel_drag_threshold_changed),g_signal_handlers_disconnect_matched ((toplevel->priv->
ctk_settings), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA
), 0, 0, ((void*)0), (((GCallback) (panel_toplevel_drag_threshold_changed
))), (toplevel))
4056 toplevel)g_signal_handlers_disconnect_matched ((toplevel->priv->
ctk_settings), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA
), 0, 0, ((void*)0), (((GCallback) (panel_toplevel_drag_threshold_changed
))), (toplevel))
;
4057
4058 toplevel->priv->ctk_settings = ctk_widget_get_settings (CTK_WIDGET (toplevel->priv->panel_widget)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->panel_widget)), ((ctk_widget_get_type
()))))))
);
4059
4060 g_signal_connect_swapped (G_OBJECT (toplevel->priv->ctk_settings),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel->priv->ctk_settings)), ((
(GType) ((20) << (2))))))))), ("notify::ctk-dnd-drag-threshold"
), (((GCallback) (panel_toplevel_drag_threshold_changed))), (
toplevel), ((void*)0), G_CONNECT_SWAPPED)
4061 "notify::ctk-dnd-drag-threshold",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel->priv->ctk_settings)), ((
(GType) ((20) << (2))))))))), ("notify::ctk-dnd-drag-threshold"
), (((GCallback) (panel_toplevel_drag_threshold_changed))), (
toplevel), ((void*)0), G_CONNECT_SWAPPED)
4062 G_CALLBACK (panel_toplevel_drag_threshold_changed),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel->priv->ctk_settings)), ((
(GType) ((20) << (2))))))))), ("notify::ctk-dnd-drag-threshold"
), (((GCallback) (panel_toplevel_drag_threshold_changed))), (
toplevel), ((void*)0), G_CONNECT_SWAPPED)
4063 toplevel)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel->priv->ctk_settings)), ((
(GType) ((20) << (2))))))))), ("notify::ctk-dnd-drag-threshold"
), (((GCallback) (panel_toplevel_drag_threshold_changed))), (
toplevel), ((void*)0), G_CONNECT_SWAPPED)
;
4064
4065 panel_toplevel_drag_threshold_changed (toplevel);
4066}
4067
4068static void
4069panel_toplevel_screen_changed (CtkWidget *widget,
4070 CdkScreen *previous_screen)
4071{
4072 panel_toplevel_update_ctk_settings (PANEL_TOPLEVEL (widget)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((panel_toplevel_get_type ()))))))
);
4073
4074 if (CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->screen_changed)
4075 CTK_WIDGET_CLASS (panel_toplevel_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), ((ctk_widget_get_type ())
)))))
->screen_changed (widget, previous_screen);
4076
4077 ctk_widget_queue_resize (widget);
4078}
4079
4080static void
4081panel_toplevel_set_property (GObject *object,
4082 guint prop_id,
4083 const GValue *value,
4084 GParamSpec *pspec)
4085{
4086 PanelToplevel *toplevel;
4087
4088 g_return_if_fail (PANEL_IS_TOPLEVEL (object))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((object)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (object)"); return; } } while
(0)
;
4089
4090 toplevel = PANEL_TOPLEVEL (object)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((object)), ((panel_toplevel_get_type ()))))))
;
4091
4092 switch (prop_id) {
4093 case PROP_NAME:
4094 panel_toplevel_set_name (toplevel, g_value_get_string (value));
4095 break;
4096 case PROP_SETTINGS_PATH:
4097 panel_toplevel_set_settings_path (toplevel, g_value_get_string (value));
4098 break;
4099 case PROP_EXPAND:
4100 panel_toplevel_set_expand (toplevel, g_value_get_boolean (value));
4101 break;
4102 case PROP_ORIENTATION:
4103 panel_toplevel_set_orientation (toplevel, g_value_get_enum (value));
4104 break;
4105 case PROP_SIZE:
4106 panel_toplevel_set_size (toplevel, g_value_get_int (value));
4107 break;
4108 case PROP_X:
4109 panel_toplevel_set_x (toplevel,
4110 g_value_get_int (value),
4111 toplevel->priv->x_right,
4112 toplevel->priv->x_centered);
4113 break;
4114 case PROP_X_RIGHT:
4115 panel_toplevel_set_x (toplevel,
4116 toplevel->priv->x,
4117 g_value_get_int (value),
4118 toplevel->priv->x_centered);
4119 break;
4120 case PROP_X_CENTERED:
4121 panel_toplevel_set_x (toplevel,
4122 toplevel->priv->x,
4123 toplevel->priv->x_right,
4124 g_value_get_boolean (value));
4125 break;
4126 case PROP_Y:
4127 panel_toplevel_set_y (toplevel,
4128 g_value_get_int (value),
4129 toplevel->priv->y_bottom,
4130 toplevel->priv->y_centered);
4131 break;
4132 case PROP_Y_BOTTOM:
4133 panel_toplevel_set_y (toplevel,
4134 toplevel->priv->y,
4135 g_value_get_int (value),
4136 toplevel->priv->y_centered);
4137 break;
4138 case PROP_Y_CENTERED:
4139 panel_toplevel_set_y (toplevel,
4140 toplevel->priv->y,
4141 toplevel->priv->y_bottom,
4142 g_value_get_boolean (value));
4143 break;
4144 case PROP_MONITOR:
4145 panel_toplevel_set_monitor (toplevel, g_value_get_int (value));
4146 break;
4147 case PROP_AUTOHIDE:
4148 panel_toplevel_set_auto_hide (toplevel, g_value_get_boolean (value));
4149 break;
4150 case PROP_HIDE_DELAY:
4151 panel_toplevel_set_hide_delay (toplevel, g_value_get_int (value));
4152 break;
4153 case PROP_UNHIDE_DELAY:
4154 panel_toplevel_set_unhide_delay (toplevel, g_value_get_int (value));
4155 break;
4156 case PROP_AUTOHIDE_SIZE:
4157 panel_toplevel_set_auto_hide_size (toplevel, g_value_get_int (value));
4158 break;
4159 case PROP_ANIMATE:
4160 panel_toplevel_set_animate (toplevel, g_value_get_boolean (value));
4161 break;
4162 case PROP_ANIMATION_SPEED:
4163 panel_toplevel_set_animation_speed (toplevel, g_value_get_enum (value));
4164 break;
4165 case PROP_BUTTONS_ENABLED:
4166 panel_toplevel_set_enable_buttons (toplevel, g_value_get_boolean (value));
4167 break;
4168 case PROP_ARROWS_ENABLED:
4169 panel_toplevel_set_enable_arrows (toplevel, g_value_get_boolean (value));
4170 break;
4171 default:
4172 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'"
, "panel-toplevel.c", 4172, ("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)
;
4173 break;
4174 }
4175}
4176
4177static void
4178panel_toplevel_get_property (GObject *object,
4179 guint prop_id,
4180 GValue *value,
4181 GParamSpec *pspec)
4182{
4183 PanelToplevel *toplevel;
4184
4185 g_return_if_fail (PANEL_IS_TOPLEVEL (object))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((object)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (object)"); return; } } while
(0)
;
4186
4187 toplevel = PANEL_TOPLEVEL (object)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((object)), ((panel_toplevel_get_type ()))))))
;
4188
4189 switch (prop_id) {
4190 case PROP_NAME:
4191 g_value_set_string (value, panel_toplevel_get_name (toplevel));
4192 break;
4193 case PROP_SETTINGS_PATH:
4194 g_value_set_string (value, toplevel->priv->settings_path);
4195 break;
4196 case PROP_EXPAND:
4197 g_value_set_boolean (value, toplevel->priv->expand);
4198 break;
4199 case PROP_ORIENTATION:
4200 g_value_set_enum (value, toplevel->priv->orientation);
4201 break;
4202 case PROP_SIZE:
4203 g_value_set_int (value, toplevel->priv->size);
4204 break;
4205 case PROP_X:
4206 g_value_set_int (value, toplevel->priv->x);
4207 break;
4208 case PROP_X_RIGHT:
4209 g_value_set_int (value, toplevel->priv->x_right);
4210 break;
4211 case PROP_X_CENTERED:
4212 g_value_set_boolean (value, toplevel->priv->x_centered);
4213 break;
4214 case PROP_Y:
4215 g_value_set_int (value, toplevel->priv->y);
4216 break;
4217 case PROP_Y_BOTTOM:
4218 g_value_set_int (value, toplevel->priv->y_bottom);
4219 break;
4220 case PROP_Y_CENTERED:
4221 g_value_set_boolean (value, toplevel->priv->y_centered);
4222 break;
4223 case PROP_MONITOR:
4224 g_value_set_int (value, toplevel->priv->monitor);
4225 break;
4226 case PROP_AUTOHIDE:
4227 g_value_set_boolean (value, toplevel->priv->auto_hide);
4228 break;
4229 case PROP_HIDE_DELAY:
4230 g_value_set_int (value, toplevel->priv->hide_delay);
4231 break;
4232 case PROP_UNHIDE_DELAY:
4233 g_value_set_int (value, toplevel->priv->unhide_delay);
4234 break;
4235 case PROP_AUTOHIDE_SIZE:
4236 g_value_set_int (value, toplevel->priv->auto_hide_size);
4237 break;
4238 case PROP_ANIMATE:
4239 g_value_set_boolean (value, toplevel->priv->animate);
4240 break;
4241 case PROP_ANIMATION_SPEED:
4242 g_value_set_enum (value, toplevel->priv->animation_speed);
4243 break;
4244 case PROP_BUTTONS_ENABLED:
4245 g_value_set_boolean (value, toplevel->priv->buttons_enabled);
4246 break;
4247 case PROP_ARROWS_ENABLED:
4248 g_value_set_boolean (value, toplevel->priv->arrows_enabled);
4249 break;
4250 default:
4251 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'"
, "panel-toplevel.c", 4251, ("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)
;
4252 break;
4253 }
4254}
4255
4256static GObject*
4257panel_toplevel_constructor (GType type,
4258 guint n_construct_properties,
4259 GObjectConstructParam *construct_properties)
4260{
4261 GObject *object;
4262
4263 object = G_OBJECT_CLASS (panel_toplevel_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), (((GType) ((20) << (
2))))))))
->constructor (type,
4264 n_construct_properties,
4265 construct_properties);
4266 PanelToplevel *toplevel = PANEL_TOPLEVEL(object)((((PanelToplevel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((object)), ((panel_toplevel_get_type ()))))))
;
4267 CdkScreen *screen = ctk_widget_get_screen(CTK_WIDGET(toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
4268 CdkVisual *visual = cdk_screen_get_rgba_visual(screen);
4269 ctk_widget_set_visual(CTK_WIDGET(toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
, visual);
4270
4271 return object;
4272}
4273
4274static void
4275panel_toplevel_finalize (GObject *object)
4276{
4277 PanelToplevel *toplevel = (PanelToplevel *) object;
4278
4279#ifdef HAVE_X111
4280 if (CDK_IS_X11_DISPLAY (ctk_widget_get_display (CTK_WIDGET (toplevel)))(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(ctk_widget_get_display (((((CtkWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel)), ((ctk_widget_get_type ()))))
))))); GType __t = ((cdk_x11_display_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; }))))
)
4281 panel_struts_unregister_strut (toplevel);
4282#endif // HAVE_X11
4283
4284 toplevel_list = g_slist_remove (toplevel_list, toplevel);
4285
4286 G_OBJECT_CLASS (panel_toplevel_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((panel_toplevel_parent_class)), (((GType) ((20) << (
2))))))))
->finalize (object);
4287}
4288
4289static void
4290panel_toplevel_class_init (PanelToplevelClass *klass)
4291{
4292 GObjectClass *gobject_class = (GObjectClass *) klass;
4293 CtkWidgetClass *widget_class = (CtkWidgetClass *) klass;
4294 CtkContainerClass *container_class = (CtkContainerClass *) klass;
4295 CtkBindingSet *binding_set;
4296
4297 binding_set = ctk_binding_set_by_class (klass);
4298
4299 gobject_class->constructor = panel_toplevel_constructor;
4300 gobject_class->set_property = panel_toplevel_set_property;
4301 gobject_class->get_property = panel_toplevel_get_property;
4302 gobject_class->finalize = panel_toplevel_finalize;
4303
4304 gobject_class->dispose = panel_toplevel_dispose;
4305
4306 widget_class->realize = panel_toplevel_realize;
4307 widget_class->unrealize = panel_toplevel_unrealize;
4308 widget_class->state_flags_changed = panel_toplevel_state_flags_changed;
4309 widget_class->draw = panel_toplevel_draw;
4310 widget_class->get_preferred_width = panel_toplevel_get_preferred_width;
4311 widget_class->get_preferred_height = panel_toplevel_get_preferred_height;
4312 widget_class->style_updated = panel_toplevel_style_updated;
4313 widget_class->size_allocate = panel_toplevel_size_allocate;
4314 widget_class->button_press_event = panel_toplevel_button_press_event;
4315 widget_class->button_release_event = panel_toplevel_button_release_event;
4316 widget_class->configure_event = panel_toplevel_configure_event;
4317 widget_class->key_press_event = panel_toplevel_key_press_event;
4318 widget_class->motion_notify_event = panel_toplevel_motion_notify_event;
4319 widget_class->enter_notify_event = panel_toplevel_enter_notify_event;
4320 widget_class->leave_notify_event = panel_toplevel_leave_notify_event;
4321 widget_class->screen_changed = panel_toplevel_screen_changed;
4322 widget_class->focus_in_event = panel_toplevel_focus_in_event;
4323 widget_class->focus_out_event = panel_toplevel_focus_out_event;
4324
4325 ctk_widget_class_set_css_name (widget_class, "PanelToplevel");
4326
4327 container_class->check_resize = panel_toplevel_check_resize;
4328
4329 klass->hiding = NULL((void*)0);
4330 klass->unhiding = NULL((void*)0);
4331 klass->popup_panel_menu = panel_toplevel_popup_panel_menu;
4332 klass->toggle_expand = panel_toplevel_toggle_expand;
4333 klass->expand = panel_toplevel_expand;
4334 klass->unexpand = panel_toplevel_unexpand;
4335 klass->toggle_hidden = panel_toplevel_toggle_hidden;
4336 klass->begin_move = panel_toplevel_begin_move;
4337 klass->begin_resize = panel_toplevel_begin_resize;
4338
4339 g_object_class_install_property (
4340 gobject_class,
4341 PROP_NAME,
4342 g_param_spec_string (
4343 "name",
4344 "Name",
4345 "The name of this panel",
4346 NULL((void*)0),
4347 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4348
4349 g_object_class_install_property (
4350 gobject_class,
4351 PROP_SETTINGS_PATH,
4352 g_param_spec_string (
4353 "settings-path",
4354 "GSettings path",
4355 "The GSettings path used for this panel",
4356 NULL((void*)0),
4357 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4358
4359 g_object_class_install_property (
4360 gobject_class,
4361 PROP_EXPAND,
4362 g_param_spec_boolean (
4363 "expand",
4364 "Expand",
4365 "Expand to take up the full monitor width/height",
4366 TRUE(!(0)),
4367 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4368
4369 g_object_class_install_property (
4370 gobject_class,
4371 PROP_ORIENTATION,
4372 g_param_spec_enum (
4373 "orientation",
4374 "Orientation",
4375 "The orientation of the panel",
4376 PANEL_TYPE_ORIENTATIONpanel_orientation_get_type(),
4377 PANEL_ORIENTATION_TOP,
4378 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4379
4380 g_object_class_install_property (
4381 gobject_class,
4382 PROP_SIZE,
4383 g_param_spec_int (
4384 "size",
4385 "Size",
4386 "The height (or width when vertical) of the panel",
4387 0,
4388 G_MAXINT2147483647,
4389 DEFAULT_SIZE48,
4390 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4391
4392
4393 g_object_class_install_property (
4394 gobject_class,
4395 PROP_X,
4396 g_param_spec_int (
4397 "x",
4398 "X position",
4399 "The X position of the panel",
4400 0,
4401 G_MAXINT2147483647,
4402 0,
4403 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4404
4405 g_object_class_install_property (
4406 gobject_class,
4407 PROP_X_RIGHT,
4408 g_param_spec_int (
4409 "x-right",
4410 "X position, from the right",
4411 "The X position of the panel, starting from the right of the screen",
4412 -1,
4413 G_MAXINT2147483647,
4414 -1,
4415 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4416
4417 g_object_class_install_property (
4418 gobject_class,
4419 PROP_X_CENTERED,
4420 g_param_spec_boolean (
4421 "x-centered",
4422 "X centered",
4423 "The x co-ordinate is relative to center screen",
4424 FALSE(0),
4425 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4426
4427 g_object_class_install_property (
4428 gobject_class,
4429 PROP_Y,
4430 g_param_spec_int (
4431 "y",
4432 "Y position",
4433 "The Y position of the panel",
4434 0,
4435 G_MAXINT2147483647,
4436 0,
4437 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4438
4439 g_object_class_install_property (
4440 gobject_class,
4441 PROP_Y_BOTTOM,
4442 g_param_spec_int (
4443 "y_bottom",
4444 "Y position, from the bottom",
4445 "The Y position of the panel, starting from the bottom of the screen",
4446 -1,
4447 G_MAXINT2147483647,
4448 -1,
4449 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4450
4451 g_object_class_install_property (
4452 gobject_class,
4453 PROP_Y_CENTERED,
4454 g_param_spec_boolean (
4455 "y-centered",
4456 "Y centered",
4457 "The y co-ordinate is relative to center screen",
4458 FALSE(0),
4459 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4460
4461 g_object_class_install_property (
4462 gobject_class,
4463 PROP_MONITOR,
4464 g_param_spec_int (
4465 "monitor",
4466 "Xinerama monitor",
4467 "The monitor (in terms of Xinerama) which the panel is on",
4468 0,
4469 G_MAXINT2147483647,
4470 0,
4471 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4472
4473 g_object_class_install_property (
4474 gobject_class,
4475 PROP_AUTOHIDE,
4476 g_param_spec_boolean (
4477 "auto-hide",
4478 "Auto hide",
4479 "Automatically hide the panel when the mouse leaves the panel",
4480 FALSE(0),
4481 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4482
4483 g_object_class_install_property (
4484 gobject_class,
4485 PROP_HIDE_DELAY,
4486 g_param_spec_int (
4487 "hide-delay",
4488 "Hide delay",
4489 "The number of milliseconds to delay before automatically hiding",
4490 0,
4491 G_MAXINT2147483647,
4492 DEFAULT_HIDE_DELAY300,
4493 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4494
4495 g_object_class_install_property (
4496 gobject_class,
4497 PROP_UNHIDE_DELAY,
4498 g_param_spec_int (
4499 "unhide-delay",
4500 "Un-hide delay",
4501 "The number of milliseconds to delay before automatically un-hiding",
4502 0,
4503 G_MAXINT2147483647,
4504 DEFAULT_UNHIDE_DELAY100,
4505 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4506
4507 g_object_class_install_property (
4508 gobject_class,
4509 PROP_AUTOHIDE_SIZE,
4510 g_param_spec_int (
4511 "auto-hide-size",
4512 "Auto-hide size",
4513 "The number of pixels visible when the panel has been automatically hidden",
4514 1,
4515 G_MAXINT2147483647,
4516 DEFAULT_AUTO_HIDE_SIZE1,
4517 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4518
4519 g_object_class_install_property (
4520 gobject_class,
4521 PROP_ANIMATE,
4522 g_param_spec_boolean (
4523 "animate",
4524 "Animate",
4525 "Enable hiding/showing animations",
4526 TRUE(!(0)),
4527 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4528
4529 g_object_class_install_property (
4530 gobject_class,
4531 PROP_ANIMATION_SPEED,
4532 g_param_spec_enum (
4533 "animation-speed",
4534 "Animation Speed",
4535 "The speed at which to animate panel hiding/showing",
4536 PANEL_TYPE_ANIMATION_SPEEDpanel_animation_speed_get_type(),
4537 PANEL_ANIMATION_MEDIUM,
4538 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4539
4540 g_object_class_install_property (
4541 gobject_class,
4542 PROP_BUTTONS_ENABLED,
4543 g_param_spec_boolean (
4544 "buttons-enabled",
4545 "Buttons Enabled",
4546 "Enable hide/show buttons",
4547 TRUE(!(0)),
4548 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4549
4550 g_object_class_install_property (
4551 gobject_class,
4552 PROP_ARROWS_ENABLED,
4553 g_param_spec_boolean (
4554 "arrows-enabled",
4555 "Arrows Enabled",
4556 "Enable arrows on hide/show buttons",
4557 TRUE(!(0)),
4558 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
4559
4560 ctk_widget_class_install_style_property (
4561 widget_class,
4562 g_param_spec_int (
4563 "arrow-size",
4564 "Arrow Size",
4565 "The size of the arrows on the hide/show buttons",
4566 0,
4567 G_MAXINT2147483647,
4568 DEFAULT_ARROW_SIZE20,
4569 G_PARAM_READABLE));
4570
4571 toplevel_signals [HIDE_SIGNAL] =
4572 g_signal_new ("hiding",
4573 G_TYPE_FROM_CLASS (gobject_class)(((GTypeClass*) (gobject_class))->g_type),
4574 G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
4575 G_STRUCT_OFFSET (PanelToplevelClass, hiding)((glong) __builtin_offsetof(PanelToplevelClass, hiding)),
4576 NULL((void*)0),
4577 NULL((void*)0),
4578 g_cclosure_marshal_VOID__VOID,
4579 G_TYPE_NONE((GType) ((1) << (2))),
4580 0);
4581
4582 toplevel_signals [UNHIDE_SIGNAL] =
4583 g_signal_new ("unhiding",
4584 G_TYPE_FROM_CLASS (gobject_class)(((GTypeClass*) (gobject_class))->g_type),
4585 G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
4586 G_STRUCT_OFFSET (PanelToplevelClass, unhiding)((glong) __builtin_offsetof(PanelToplevelClass, unhiding)),
4587 NULL((void*)0),
4588 NULL((void*)0),
4589 g_cclosure_marshal_VOID__VOID,
4590 G_TYPE_NONE((GType) ((1) << (2))),
4591 0);
4592
4593 toplevel_signals [POPUP_PANEL_MENU_SIGNAL] =
4594 g_signal_new ("popup-panel-menu",
4595 G_TYPE_FROM_CLASS (gobject_class)(((GTypeClass*) (gobject_class))->g_type),
4596 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
4597 G_STRUCT_OFFSET (PanelToplevelClass, popup_panel_menu)((glong) __builtin_offsetof(PanelToplevelClass, popup_panel_menu
))
,
4598 NULL((void*)0),
4599 NULL((void*)0),
4600 panel_marshal_BOOLEAN__VOID,
4601 G_TYPE_BOOLEAN((GType) ((5) << (2))),
4602 0);
4603
4604 toplevel_signals [TOGGLE_EXPAND_SIGNAL] =
4605 g_signal_new ("toggle-expand",
4606 G_TYPE_FROM_CLASS (gobject_class)(((GTypeClass*) (gobject_class))->g_type),
4607 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
4608 G_STRUCT_OFFSET (PanelToplevelClass, toggle_expand)((glong) __builtin_offsetof(PanelToplevelClass, toggle_expand
))
,
4609 NULL((void*)0),
4610 NULL((void*)0),
4611 panel_marshal_BOOLEAN__VOID,
4612 G_TYPE_BOOLEAN((GType) ((5) << (2))),
4613 0);
4614
4615 toplevel_signals [EXPAND_SIGNAL] =
4616 g_signal_new ("expand",
4617 G_TYPE_FROM_CLASS (gobject_class)(((GTypeClass*) (gobject_class))->g_type),
4618 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
4619 G_STRUCT_OFFSET (PanelToplevelClass, expand)((glong) __builtin_offsetof(PanelToplevelClass, expand)),
4620 NULL((void*)0),
4621 NULL((void*)0),
4622 panel_marshal_BOOLEAN__VOID,
4623 G_TYPE_BOOLEAN((GType) ((5) << (2))),
4624 0);
4625
4626 toplevel_signals [UNEXPAND_SIGNAL] =
4627 g_signal_new ("unexpand",
4628 G_TYPE_FROM_CLASS (gobject_class)(((GTypeClass*) (gobject_class))->g_type),
4629 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
4630 G_STRUCT_OFFSET (PanelToplevelClass, unexpand)((glong) __builtin_offsetof(PanelToplevelClass, unexpand)),
4631 NULL((void*)0),
4632 NULL((void*)0),
4633 panel_marshal_BOOLEAN__VOID,
4634 G_TYPE_BOOLEAN((GType) ((5) << (2))),
4635 0);
4636
4637 toplevel_signals [TOGGLE_HIDDEN_SIGNAL] =
4638 g_signal_new ("toggle-hidden",
4639 G_TYPE_FROM_CLASS (gobject_class)(((GTypeClass*) (gobject_class))->g_type),
4640 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
4641 G_STRUCT_OFFSET (PanelToplevelClass, toggle_hidden)((glong) __builtin_offsetof(PanelToplevelClass, toggle_hidden
))
,
4642 NULL((void*)0),
4643 NULL((void*)0),
4644 panel_marshal_BOOLEAN__VOID,
4645 G_TYPE_BOOLEAN((GType) ((5) << (2))),
4646 0);
4647
4648 toplevel_signals [BEGIN_MOVE_SIGNAL] =
4649 g_signal_new ("begin-move",
4650 G_TYPE_FROM_CLASS (gobject_class)(((GTypeClass*) (gobject_class))->g_type),
4651 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
4652 G_STRUCT_OFFSET (PanelToplevelClass, begin_move)((glong) __builtin_offsetof(PanelToplevelClass, begin_move)),
4653 NULL((void*)0),
4654 NULL((void*)0),
4655 panel_marshal_BOOLEAN__VOID,
4656 G_TYPE_BOOLEAN((GType) ((5) << (2))),
4657 0);
4658
4659 toplevel_signals [BEGIN_RESIZE_SIGNAL] =
4660 g_signal_new ("begin-resize",
4661 G_TYPE_FROM_CLASS (gobject_class)(((GTypeClass*) (gobject_class))->g_type),
4662 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
4663 G_STRUCT_OFFSET (PanelToplevelClass, begin_resize)((glong) __builtin_offsetof(PanelToplevelClass, begin_resize)
)
,
4664 NULL((void*)0),
4665 NULL((void*)0),
4666 panel_marshal_BOOLEAN__VOID,
4667 G_TYPE_BOOLEAN((GType) ((5) << (2))),
4668 0);
4669
4670 ctk_binding_entry_add_signal (binding_set, CDK_KEY_F100xffc7, CDK_CONTROL_MASK,
4671 "popup_panel_menu", 0);
4672
4673 panel_bindings_set_entries (binding_set);
4674}
4675
4676static void
4677panel_toplevel_setup_widgets (PanelToplevel *toplevel)
4678{
4679 CtkWidget* container;
4680
4681 toplevel->priv->grid = ctk_grid_new ();
4682
4683 toplevel->priv->hide_button_top = panel_toplevel_add_hide_button (toplevel, CTK_ARROW_UP, 1, 0);
4684 toplevel->priv->hide_button_bottom = panel_toplevel_add_hide_button (toplevel, CTK_ARROW_DOWN, 1, 2);
4685 toplevel->priv->hide_button_left = panel_toplevel_add_hide_button (toplevel, CTK_ARROW_LEFT, 0, 1);
4686 toplevel->priv->hide_button_right = panel_toplevel_add_hide_button (toplevel, CTK_ARROW_RIGHT, 2, 1);
4687
4688 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM))
4689 {
4690 ctk_widget_show(toplevel->priv->hide_button_left);
4691 ctk_widget_show(toplevel->priv->hide_button_right);
4692 }
4693 else
4694 {
4695 ctk_widget_show(toplevel->priv->hide_button_top);
4696 ctk_widget_show(toplevel->priv->hide_button_bottom);
4697 }
4698
4699 toplevel->priv->inner_frame = g_object_new(PANEL_TYPE_FRAME(panel_frame_get_type ()), NULL((void*)0));
4700
4701 ctk_widget_set_hexpand (CTK_WIDGET (toplevel->priv->inner_frame)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->inner_frame)), ((ctk_widget_get_type
()))))))
, TRUE(!(0)));
4702 ctk_widget_set_vexpand (CTK_WIDGET (toplevel->priv->inner_frame)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->inner_frame)), ((ctk_widget_get_type
()))))))
, TRUE(!(0)));
4703
4704 ctk_grid_attach (CTK_GRID (toplevel->priv->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->grid)), ((ctk_grid_get_type ()))))
))
, CTK_WIDGET (toplevel->priv->inner_frame)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->inner_frame)), ((ctk_widget_get_type
()))))))
, 1, 1, 1, 1);
4705 ctk_widget_show (CTK_WIDGET (toplevel->priv->inner_frame)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->inner_frame)), ((ctk_widget_get_type
()))))))
);
4706
4707 container = panel_widget_new (toplevel,
4708 !toplevel->priv->expand,
4709 (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)) ?
4710 CTK_ORIENTATION_HORIZONTAL :
4711 CTK_ORIENTATION_VERTICAL,
4712 toplevel->priv->size);
4713
4714 toplevel->priv->panel_widget = PANEL_WIDGET(container)((((PanelWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((container)), ((panel_widget_get_type()))))))
;
4715
4716 ctk_container_add(CTK_CONTAINER(toplevel->priv->inner_frame)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel->priv->inner_frame)), ((ctk_container_get_type
()))))))
, container);
4717 ctk_widget_show(container);
4718
4719 ctk_container_add (CTK_CONTAINER (toplevel)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_container_get_type ()))))))
, toplevel->priv->grid);
4720 ctk_widget_show (toplevel->priv->grid);
4721}
4722
4723static void
4724background_changed (PanelBackground *background G_GNUC_UNUSED__attribute__ ((__unused__)),
4725 PanelToplevel *toplevel)
4726{
4727 panel_toplevel_update_edges (toplevel);
4728 panel_widget_emit_background_changed (toplevel->priv->panel_widget);
4729}
4730
4731static void
4732panel_toplevel_init (PanelToplevel *toplevel)
4733{
4734 CtkWidget *widget;
4735 int i;
4736
4737 toplevel->priv = panel_toplevel_get_instance_private (toplevel);
4738
4739 toplevel->priv->expand = TRUE(!(0));
4740 toplevel->priv->orientation = PANEL_ORIENTATION_BOTTOM;
4741 toplevel->priv->size = DEFAULT_SIZE48;
4742 toplevel->priv->scale = ctk_widget_get_scale_factor (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
4743 toplevel->priv->x = 0;
4744 toplevel->priv->y = 0;
4745 toplevel->priv->x_right = -1;
4746 toplevel->priv->y_bottom = -1;
4747 toplevel->priv->monitor = 0;
4748 toplevel->priv->configured_monitor = -1;
4749 toplevel->priv->hide_delay = DEFAULT_HIDE_DELAY300;
4750 toplevel->priv->unhide_delay = DEFAULT_UNHIDE_DELAY100;
4751 toplevel->priv->auto_hide_size = DEFAULT_AUTO_HIDE_SIZE1;
4752 toplevel->priv->animation_speed = PANEL_ANIMATION_FAST;
4753
4754 toplevel->priv->snap_tolerance = DEFAULT_DND_THRESHOLD8 * SNAP_TOLERANCE_FACTOR6;
4755 toplevel->priv->ctk_settings = NULL((void*)0);
4756
4757 toplevel->priv->state = PANEL_STATE_NORMAL;
4758
4759 toplevel->priv->name = NULL((void*)0);
4760 toplevel->priv->description = NULL((void*)0);
4761
4762 toplevel->priv->hide_timeout = 0;
4763 toplevel->priv->unhide_timeout = 0;
4764
4765 toplevel->priv->geometry.x = -1;
4766 toplevel->priv->geometry.y = -1;
4767 toplevel->priv->geometry.width = -1;
4768 toplevel->priv->geometry.height = -1;
4769
4770 toplevel->priv->original_width = -1;
4771 toplevel->priv->original_height = -1;
4772
4773 toplevel->priv->grab_op = PANEL_GRAB_OP_NONE;
4774
4775 toplevel->priv->drag_offset_x = 0;
4776 toplevel->priv->drag_offset_y = 0;
4777
4778 toplevel->priv->animation_end_x = 0;
4779 toplevel->priv->animation_end_y = 0;
4780 toplevel->priv->animation_end_width = 0;
4781 toplevel->priv->animation_end_height = 0;
4782 toplevel->priv->animation_start_time = NULL((void*)0);
4783 toplevel->priv->animation_end_time = NULL((void*)0);
4784 toplevel->priv->animation_timeout = 0;
4785
4786 toplevel->priv->panel_widget = NULL((void*)0);
4787 toplevel->priv->inner_frame = NULL((void*)0);
4788 toplevel->priv->grid = NULL((void*)0);
4789 toplevel->priv->hide_button_top = NULL((void*)0);
4790 toplevel->priv->hide_button_bottom = NULL((void*)0);
4791 toplevel->priv->hide_button_left = NULL((void*)0);
4792 toplevel->priv->hide_button_right = NULL((void*)0);
4793
4794 toplevel->priv->attach_toplevel = NULL((void*)0);
4795 toplevel->priv->attach_widget = NULL((void*)0);
4796 toplevel->priv->n_autohide_disablers = 0;
4797
4798 for (i = 0; i < N_ATTACH_TOPLEVEL_SIGNALS5; i++)
4799 toplevel->priv->attach_toplevel_signals [i] = 0;
4800 for (i = 0; i < N_ATTACH_WIDGET_SIGNALS5; i++)
4801 toplevel->priv->attach_widget_signals [i] = 0;
4802
4803 toplevel->priv->auto_hide = FALSE(0);
4804 toplevel->priv->buttons_enabled = TRUE(!(0));
4805 toplevel->priv->arrows_enabled = TRUE(!(0));
4806 toplevel->priv->x_centered = FALSE(0);
4807 toplevel->priv->y_centered = FALSE(0);
4808 toplevel->priv->animating = FALSE(0);
4809 toplevel->priv->grab_is_keyboard = FALSE(0);
4810 toplevel->priv->position_centered = FALSE(0);
4811 toplevel->priv->attached = FALSE(0);
4812 toplevel->priv->attach_hidden = FALSE(0);
4813 toplevel->priv->updated_geometry_initial = FALSE(0);
4814 toplevel->priv->initial_animation_done = FALSE(0);
4815
4816 widget = CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
;
4817 ctk_widget_add_events (widget,
4818 CDK_BUTTON_PRESS_MASK |
4819 CDK_BUTTON_RELEASE_MASK |
4820 CDK_POINTER_MOTION_MASK |
4821 CDK_ENTER_NOTIFY_MASK |
4822 CDK_LEAVE_NOTIFY_MASK);
4823
4824 ctk_widget_set_app_paintable (widget, TRUE(!(0)));
4825
4826 panel_toplevel_setup_widgets (toplevel);
4827 panel_toplevel_update_description (toplevel);
4828 panel_toplevel_update_ctk_settings (toplevel);
4829
4830 toplevel_list = g_slist_prepend (toplevel_list, toplevel);
4831
4832 /* Prevent the window from being deleted via Alt+F4 by accident. This
4833 * happens with "alternative" window managers such as Sawfish or XFWM4.
4834 */
4835 g_signal_connect(CTK_WIDGET(toplevel), "delete-event", G_CALLBACK(ctk_true), NULL)g_signal_connect_data ((((((CtkWidget*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((toplevel)), ((ctk_widget_get_type ()))))
))), ("delete-event"), (((GCallback) (ctk_true))), (((void*)0
)), ((void*)0), (GConnectFlags) 0)
;
4836
4837 panel_background_init (&toplevel->background,
4838 (PanelBackgroundChangedNotify) background_changed,
4839 toplevel);
4840
4841 update_style_classes (toplevel);
4842
4843#ifdef HAVE_WAYLAND
4844 if (CDK_IS_WAYLAND_DISPLAY (cdk_display_get_default ())) {
4845 wayland_panel_toplevel_init (toplevel);
4846 }
4847#endif // HAVE_WAYLAND
4848}
4849
4850PanelWidget *
4851panel_toplevel_get_panel_widget (PanelToplevel *toplevel)
4852{
4853
4854 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return (((void
*)0)); } } while (0)
;
4855
4856 return toplevel->priv->panel_widget;
4857}
4858
4859static void
4860panel_toplevel_update_name (PanelToplevel *toplevel)
4861{
4862 char *title;
4863
4864 g_assert (toplevel->priv->description != NULL)do { if (toplevel->priv->description != ((void*)0)) ; else
g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c", 4864
, ((const char*) (__func__)), "toplevel->priv->description != NULL"
); } while (0)
;
4865
4866 title = toplevel->priv->name ? toplevel->priv->name : toplevel->priv->description;
4867
4868 ctk_window_set_title (CTK_WINDOW (toplevel)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_window_get_type ()))))))
, title);
4869
4870 panel_a11y_set_atk_name_desc (
4871 CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
,
4872 title, toplevel->priv->description);
4873}
4874
4875void
4876panel_toplevel_set_name (PanelToplevel *toplevel,
4877 const char *name)
4878{
4879 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
4880
4881 if (!toplevel->priv->name && (!name || !name [0]))
4882 return;
4883
4884 if (toplevel->priv->name && name && name [0] &&
4885 !strcmp (toplevel->priv->name, name))
4886 return;
4887
4888 if (toplevel->priv->name)
4889 g_free (toplevel->priv->name);
4890 toplevel->priv->name = NULL((void*)0);
4891
4892 if (name && name [0])
4893 toplevel->priv->name = g_strdup (name)g_strdup_inline (name);
4894
4895 panel_toplevel_update_name (toplevel);
4896
4897 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "name");
4898}
4899
4900void
4901panel_toplevel_set_settings_path (PanelToplevel *toplevel,
4902 const char *settings_path)
4903{
4904 toplevel->priv->settings_path = g_strdup (settings_path)g_strdup_inline (settings_path);
4905}
4906
4907const char* panel_toplevel_get_name(PanelToplevel* toplevel)
4908{
4909 g_return_val_if_fail(PANEL_IS_TOPLEVEL(toplevel), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL(toplevel)"); return (((void
*)0)); } } while (0)
;
4910
4911 return toplevel->priv->name;
4912}
4913
4914const char* panel_toplevel_get_description(PanelToplevel* toplevel)
4915{
4916 g_return_val_if_fail(PANEL_IS_TOPLEVEL(toplevel), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL(toplevel)"); return (((void
*)0)); } } while (0)
;
4917
4918 return toplevel->priv->description;
4919}
4920
4921void
4922panel_toplevel_set_expand (PanelToplevel *toplevel,
4923 gboolean expand)
4924{
4925 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
4926
4927 if (toplevel->priv->attached && expand) {
4928 g_warning ("attempt to expand attached toplevel; ignoring");
4929 return;
4930 }
4931
4932 expand = expand != FALSE(0);
4933
4934 if (toplevel->priv->expand == expand)
4935 return;
4936
4937 toplevel->priv->expand = expand;
4938
4939 if (!toplevel->priv->expand && toplevel->priv->updated_geometry_initial) {
4940 switch (toplevel->priv->orientation) {
4941 case PANEL_ORIENTATION_TOP:
4942 panel_toplevel_set_x (toplevel, 0, -1, TRUE(!(0)));
4943 break;
4944 case PANEL_ORIENTATION_BOTTOM:
4945 panel_toplevel_set_x (toplevel, 0, 0, TRUE(!(0)));
4946 break;
4947 case PANEL_ORIENTATION_LEFT:
4948 panel_toplevel_set_y (toplevel, 0, -1, TRUE(!(0)));
4949 break;
4950 case PANEL_ORIENTATION_RIGHT:
4951 panel_toplevel_set_y (toplevel, 0, 0, TRUE(!(0)));
4952 break;
4953 default:
4954 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "panel-toplevel.c"
, 4954, ((const char*) (__func__)), ((void*)0)); } while (0)
;
4955 break;
4956 }
4957 }
4958
4959 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
4960
4961 panel_widget_set_packed (toplevel->priv->panel_widget, !toplevel->priv->expand);
4962
4963 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "expand");
4964}
4965
4966gboolean
4967panel_toplevel_get_expand (PanelToplevel *toplevel)
4968{
4969 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), TRUE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return ((!(0)
)); } } while (0)
;
4970
4971 return toplevel->priv->expand;
4972}
4973
4974gboolean
4975panel_toplevel_get_is_floating (PanelToplevel *toplevel)
4976{
4977 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), TRUE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return ((!(0)
)); } } while (0)
;
4978
4979 return toplevel->priv->floating;
4980}
4981
4982void
4983panel_toplevel_set_orientation (PanelToplevel *toplevel,
4984 PanelOrientation orientation)
4985{
4986 gboolean rotate;
4987 CdkRectangle monitor_geom;
4988
4989 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
4990
4991 if (toplevel->priv->orientation == orientation)
4992 return;
4993
4994 g_object_freeze_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
);
4995
4996 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
4997
4998 /* Un-snap from center if no longer along screen edge */
4999 if (toplevel->priv->x_centered &&
5000 (orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT))) {
5001 toplevel->priv->x_centered = FALSE(0);
5002 toplevel->priv->x = (monitor_geom.width - toplevel->priv->geometry.width) / 2;
5003 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "x");
5004 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "x-centered");
5005
5006 if (toplevel->priv->x_right != -1) {
5007 toplevel->priv->x_right = -1;
5008 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "x-right");
5009 }
5010 }
5011
5012 if (toplevel->priv->y_centered &&
5013 (orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM))) {
5014 toplevel->priv->y_centered = FALSE(0);
5015 toplevel->priv->y = (monitor_geom.height - toplevel->priv->geometry.height) / 2;
5016 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "y");
5017 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "y-centered");
5018
5019 if (toplevel->priv->y_bottom != -1) {
5020 toplevel->priv->y_bottom = -1;
5021 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "y-bottom");
5022 }
5023 }
5024
5025 rotate = FALSE(0);
5026 if ((orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)) &&
5027 (toplevel->priv->orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT)))
5028 rotate = TRUE(!(0));
5029 else if ((orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT)) &&
5030 (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)))
5031 rotate = TRUE(!(0));
5032
5033 /* rotate around the center */
5034 if (rotate && !toplevel->priv->position_centered && !toplevel->priv->expand &&
5035 toplevel->priv->updated_geometry_initial) {
5036 toplevel->priv->position_centered = TRUE(!(0));
5037
5038 /* x, y temporary refer to the panel center, so we don't care
5039 * about x_right, y_bottom. Those will get updated in
5040 * panel_toplevel_update_position() accordingly. */
5041 if (!toplevel->priv->x_centered) {
5042 toplevel->priv->x += toplevel->priv->geometry.width / 2;
5043 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "x");
5044 }
5045
5046 if (!toplevel->priv->y_centered) {
5047 toplevel->priv->y += toplevel->priv->geometry.height / 2;
5048 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "y");
5049 }
5050
5051 }
5052
5053 toplevel->priv->orientation = orientation;
5054 update_style_classes (toplevel);
5055
5056 ctk_widget_reset_style (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
5057
5058 panel_toplevel_update_hide_buttons (toplevel);
5059
5060 panel_widget_set_orientation (
5061 toplevel->priv->panel_widget,
5062 (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM)) ?
5063 CTK_ORIENTATION_HORIZONTAL :
5064 CTK_ORIENTATION_VERTICAL);
5065
5066 switch (toplevel->priv->state) {
5067 case PANEL_STATE_HIDDEN_UP:
5068 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM))
5069 toplevel->priv->state = PANEL_STATE_HIDDEN_LEFT;
5070 break;
5071 case PANEL_STATE_HIDDEN_DOWN:
5072 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM))
5073 toplevel->priv->state = PANEL_STATE_HIDDEN_RIGHT;
5074 break;
5075 case PANEL_STATE_HIDDEN_LEFT:
5076 if (toplevel->priv->orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT))
5077 toplevel->priv->state = PANEL_STATE_HIDDEN_UP;
5078 break;
5079 case PANEL_STATE_HIDDEN_RIGHT:
5080 if (toplevel->priv->orientation & PANEL_VERTICAL_MASK(PANEL_ORIENTATION_LEFT | PANEL_ORIENTATION_RIGHT))
5081 toplevel->priv->state = PANEL_STATE_HIDDEN_DOWN;
5082 break;
5083 default:
5084 break;
5085 }
5086
5087 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
5088
5089 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "orientation");
5090
5091 g_object_thaw_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
);
5092
5093#ifdef HAVE_WAYLAND
5094 if (CDK_IS_WAYLAND_DISPLAY (ctk_widget_get_display (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
))) {
5095 wayland_panel_toplevel_update_placement (toplevel);
5096 }
5097#endif // HAVE_WAYLAND
5098}
5099
5100PanelOrientation
5101panel_toplevel_get_orientation (PanelToplevel *toplevel)
5102{
5103 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), CTK_ORIENTATION_HORIZONTAL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return (CTK_ORIENTATION_HORIZONTAL
); } } while (0)
;
5104
5105 return toplevel->priv->orientation;
5106}
5107
5108void
5109panel_toplevel_set_size (PanelToplevel *toplevel,
5110 int size)
5111{
5112 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
5113 g_return_if_fail (size >= 0)do { if ((size >= 0)) { } else { g_return_if_fail_warning (
((gchar*) 0), ((const char*) (__func__)), "size >= 0"); return
; } } while (0)
;
5114
5115 if (toplevel->priv->size == size)
5116 return;
5117
5118 toplevel->priv->size = size;
5119
5120 panel_widget_set_size (toplevel->priv->panel_widget, toplevel->priv->size);
5121
5122 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
5123
5124 panel_toplevel_update_hide_buttons (toplevel);
5125
5126 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "size");
5127}
5128
5129int
5130panel_toplevel_get_size (PanelToplevel *toplevel)
5131{
5132 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), DEFAULT_SIZE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return (48); }
} while (0)
;
5133
5134 return toplevel->priv->size;
5135}
5136
5137void
5138panel_toplevel_set_auto_hide_size (PanelToplevel *toplevel,
5139 int auto_hide_size)
5140{
5141 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
5142
5143 if (toplevel->priv->auto_hide_size == auto_hide_size)
5144 return;
5145
5146 toplevel->priv->auto_hide_size = auto_hide_size;
5147
5148 if (toplevel->priv->state == PANEL_STATE_AUTO_HIDDEN) {
5149 if (panel_toplevel_update_struts (toplevel, FALSE(0))) {
5150 if (toplevel->priv->animate) {
5151 panel_toplevel_unhide (toplevel);
5152 panel_toplevel_hide (toplevel, TRUE(!(0)), -1);
5153 } else
5154 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
5155 }
5156 }
5157
5158 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "auto-hide-size");
5159}
5160
5161int
5162panel_toplevel_get_auto_hide_size (PanelToplevel *toplevel)
5163{
5164 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), DEFAULT_AUTO_HIDE_SIZE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return (1); }
} while (0)
;
5165
5166 return toplevel->priv->auto_hide_size;
5167}
5168
5169void
5170panel_toplevel_set_x (PanelToplevel *toplevel,
5171 int x,
5172 int x_right,
5173 gboolean x_centered)
5174{
5175 gboolean changed = FALSE(0);
5176
5177 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
5178
5179 x_centered = x_centered != FALSE(0);
5180
5181 g_object_freeze_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
);
5182
5183 if (toplevel->priv->x != x) {
5184 toplevel->priv->x = x;
5185 changed = TRUE(!(0));
5186 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "x");
5187 }
5188
5189 if (toplevel->priv->x_right != x_right) {
5190 toplevel->priv->x_right = x_right;
5191 changed = TRUE(!(0));
5192 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "x-right");
5193 }
5194
5195 if (toplevel->priv->x_centered != x_centered) {
5196 toplevel->priv->x_centered = x_centered;
5197 changed = TRUE(!(0));
5198 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "x-centered");
5199 }
5200
5201 if (changed)
5202 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
5203
5204 g_object_thaw_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
);
5205}
5206
5207void
5208panel_toplevel_set_y (PanelToplevel *toplevel,
5209 int y,
5210 int y_bottom,
5211 gboolean y_centered)
5212{
5213 gboolean changed = FALSE(0);
5214
5215 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
5216
5217 y_centered = y_centered != FALSE(0);
5218
5219 g_object_freeze_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
);
5220
5221 if (toplevel->priv->y != y) {
5222 toplevel->priv->y = y;
5223 changed = TRUE(!(0));
5224 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "y");
5225 }
5226
5227 if (toplevel->priv->y_bottom != y_bottom) {
5228 toplevel->priv->y_bottom = y_bottom;
5229 changed = TRUE(!(0));
5230 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "y-bottom");
5231 }
5232
5233 if (toplevel->priv->y_centered != y_centered) {
5234 toplevel->priv->y_centered = y_centered;
5235 changed = TRUE(!(0));
5236 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "y-centered");
5237 }
5238
5239 if (changed)
5240 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
5241
5242 g_object_thaw_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
);
5243}
5244
5245void
5246panel_toplevel_get_position (PanelToplevel *toplevel,
5247 int *x,
5248 int *x_right,
5249 int *y,
5250 int *y_bottom)
5251{
5252 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
5253
5254 if (x)
5255 *x = toplevel->priv->x;
5256
5257 if (y)
5258 *y = toplevel->priv->y;
5259
5260 if (x_right)
5261 *x_right = toplevel->priv->x_right;
5262
5263 if (y_bottom)
5264 *y_bottom = toplevel->priv->y_bottom;
5265}
5266
5267gboolean
5268panel_toplevel_get_x_centered (PanelToplevel *toplevel)
5269{
5270 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return ((0));
} } while (0)
;
5271
5272 return toplevel->priv->x_centered;
5273}
5274
5275gboolean
5276panel_toplevel_get_y_centered (PanelToplevel *toplevel)
5277{
5278 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return ((0));
} } while (0)
;
5279
5280 return toplevel->priv->y_centered;
5281}
5282
5283/**
5284 * panel_toplevel_set_monitor_internal:
5285 *
5286 * Sets the monitor of the toplevel, but only the internal state. We need to
5287 * make the difference between the internal state and the configuration of the
5288 * user because internal constraints might affect the monitor of the toplevel.
5289 *
5290 * panel_toplevel_set_monitor_internal() won't update the configuration of the
5291 * user.
5292 **/
5293static void
5294panel_toplevel_set_monitor_internal (PanelToplevel *toplevel,
5295 int monitor,
5296 gboolean force_resize)
5297{
5298 if (toplevel->priv->monitor == monitor)
5299 return;
5300
5301 toplevel->priv->monitor = monitor;
5302
5303 if (force_resize)
5304 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
5305}
5306
5307/**
5308 * panel_toplevel_update_monitor:
5309 *
5310 * Moves the toplevel to its configured monitor or the first one, if needed.
5311 * This generally happens when the configured monitor was non-existing before,
5312 * and it appeared at runtime, or if it was existing and disappeared.
5313 *
5314 * This must only be called at the beginning of the size request of the
5315 * toplevel because it doesn't queue a size request.
5316 **/
5317static void
5318panel_toplevel_update_monitor (PanelToplevel *toplevel)
5319{
5320 /* If we were not using the configured monitor, can we use it now? */
5321 if ((toplevel->priv->configured_monitor != -1) &&
5322 (toplevel->priv->configured_monitor != toplevel->priv->monitor) &&
5323 toplevel->priv->configured_monitor < panel_multimonitor_monitors ()) {
5324 panel_toplevel_set_monitor_internal (toplevel,
5325 toplevel->priv->configured_monitor,
5326 FALSE(0));
5327
5328 /* else, can we still use the monitor we were using? */
5329 } else if (toplevel->priv->monitor >= panel_multimonitor_monitors ()) {
5330 panel_toplevel_set_monitor_internal (toplevel,
5331 0,
5332 FALSE(0));
5333 }
5334}
5335
5336void
5337panel_toplevel_set_monitor (PanelToplevel *toplevel,
5338 int monitor)
5339{
5340 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
5341
5342 if (toplevel->priv->configured_monitor == monitor)
5343 return;
5344
5345 toplevel->priv->configured_monitor = monitor;
5346
5347 /* Only use the configured monitor if it's existing. Else, we ignore
5348 * the non-existing monitor, and keep the old one. The main use case is
5349 * when logging in after having used a multimonitor environment.
5350 * We will put the panel on the monitor 0 for this session, and it will
5351 * move back to the right monitor next time. */
5352 if (monitor < panel_multimonitor_monitors ())
5353 panel_toplevel_set_monitor_internal (toplevel, monitor, TRUE(!(0)));
5354
5355 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "monitor");
5356}
5357
5358int
5359panel_toplevel_get_monitor (PanelToplevel *toplevel)
5360{
5361 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), -1)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return (-1); }
} while (0)
;
5362
5363 return toplevel->priv->monitor;
5364}
5365
5366void
5367panel_toplevel_set_auto_hide (PanelToplevel *toplevel,
5368 gboolean auto_hide)
5369{
5370 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
5371
5372 auto_hide = auto_hide != FALSE(0);
5373
5374 if (toplevel->priv->auto_hide == auto_hide)
5375 return;
5376
5377 toplevel->priv->auto_hide = auto_hide;
5378
5379 if (toplevel->priv->auto_hide)
5380 panel_toplevel_queue_auto_hide (toplevel);
5381 else
5382 panel_toplevel_queue_auto_unhide (toplevel);
5383
5384 if (panel_toplevel_update_struts (toplevel, FALSE(0)))
5385 ctk_widget_queue_resize (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
);
5386
5387 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "auto-hide");
5388}
5389
5390gboolean
5391panel_toplevel_get_auto_hide (PanelToplevel *toplevel)
5392{
5393 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return ((0));
} } while (0)
;
5394
5395 return toplevel->priv->auto_hide;
5396}
5397
5398void
5399panel_toplevel_set_hide_delay (PanelToplevel *toplevel,
5400 int hide_delay)
5401{
5402 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
5403
5404 if (toplevel->priv->hide_delay == hide_delay)
5405 return;
5406
5407 toplevel->priv->hide_delay = hide_delay;
5408
5409 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "hide-delay");
5410}
5411
5412int
5413panel_toplevel_get_hide_delay (PanelToplevel *toplevel)
5414{
5415 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), -1)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return (-1); }
} while (0)
;
5416
5417 return toplevel->priv->hide_delay;
5418}
5419
5420void
5421panel_toplevel_set_unhide_delay (PanelToplevel *toplevel,
5422 int unhide_delay)
5423{
5424 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
5425
5426 if (toplevel->priv->unhide_delay == unhide_delay)
5427 return;
5428
5429 toplevel->priv->unhide_delay = unhide_delay;
5430
5431 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "unhide-delay");
5432}
5433
5434int
5435panel_toplevel_get_unhide_delay (PanelToplevel *toplevel)
5436{
5437 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), -1)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return (-1); }
} while (0)
;
5438
5439 return toplevel->priv->unhide_delay;
5440}
5441
5442void
5443panel_toplevel_set_animate (PanelToplevel *toplevel,
5444 gboolean animate)
5445{
5446 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
5447
5448 animate = animate != FALSE(0);
5449
5450 if (toplevel->priv->animate == animate)
5451 return;
5452
5453 toplevel->priv->animate = animate;
5454
5455 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "animate");
5456}
5457
5458gboolean
5459panel_toplevel_get_animate (PanelToplevel *toplevel)
5460{
5461 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return ((0));
} } while (0)
;
5462
5463 return toplevel->priv->animate;
5464}
5465
5466void
5467panel_toplevel_set_animation_speed (PanelToplevel *toplevel,
5468 PanelAnimationSpeed animation_speed)
5469{
5470 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
5471
5472 if (toplevel->priv->animation_speed == animation_speed)
5473 return;
5474
5475 toplevel->priv->animation_speed = animation_speed;
5476
5477 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "animation-speed");
5478}
5479
5480PanelAnimationSpeed
5481panel_toplevel_get_animation_speed (PanelToplevel *toplevel)
5482{
5483 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), 0)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return (0); }
} while (0)
;
5484
5485 return toplevel->priv->animation_speed;
5486}
5487
5488void
5489panel_toplevel_set_enable_buttons (PanelToplevel *toplevel,
5490 gboolean enable_buttons)
5491{
5492 enable_buttons = enable_buttons != FALSE(0);
5493
5494 if (toplevel->priv->buttons_enabled == enable_buttons)
5495 return;
5496
5497 toplevel->priv->buttons_enabled = enable_buttons;
5498
5499 panel_toplevel_update_hide_buttons (toplevel);
5500
5501 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "buttons-enabled");
5502}
5503
5504gboolean
5505panel_toplevel_get_enable_buttons (PanelToplevel *toplevel)
5506{
5507 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return ((0));
} } while (0)
;
5508
5509 return toplevel->priv->buttons_enabled;
5510}
5511
5512void
5513panel_toplevel_set_enable_arrows (PanelToplevel *toplevel,
5514 gboolean enable_arrows)
5515{
5516 g_return_if_fail (PANEL_IS_TOPLEVEL (toplevel))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return; } } while
(0)
;
5517
5518 enable_arrows = enable_arrows != FALSE(0);
5519
5520 if (toplevel->priv->arrows_enabled == enable_arrows)
5521 return;
5522
5523 toplevel->priv->arrows_enabled = enable_arrows;
5524
5525 panel_toplevel_update_hide_buttons (toplevel);
5526
5527 g_object_notify (G_OBJECT (toplevel)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), (((GType) ((20) << (2))))))))
, "arrows-enabled");
5528}
5529
5530gboolean
5531panel_toplevel_get_enable_arrows (PanelToplevel *toplevel)
5532{
5533 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return ((0));
} } while (0)
;
5534
5535 return toplevel->priv->arrows_enabled;
5536}
5537
5538void
5539panel_toplevel_rotate (PanelToplevel *toplevel,
5540 gboolean clockwise)
5541{
5542 PanelOrientation orientation;
5543
5544 /* Relies on PanelOrientation definition:
5545 *
5546 * typedef enum {
5547 * PANEL_ORIENTATION_TOP = 1 << 0,
5548 * PANEL_ORIENTATION_RIGHT = 1 << 1,
5549 * PANEL_ORIENTATION_BOTTOM = 1 << 2,
5550 * PANEL_ORIENTATION_LEFT = 1 << 3
5551 * } PanelOrientation;
5552 */
5553
5554 orientation = toplevel->priv->orientation;
5555
5556 if (clockwise)
5557 orientation <<= 1;
5558 else
5559 orientation >>= 1;
5560
5561 if (orientation == 0)
5562 orientation = PANEL_ORIENTATION_LEFT;
5563
5564 else if (orientation > PANEL_ORIENTATION_LEFT)
5565 orientation = PANEL_ORIENTATION_TOP;
5566
5567 panel_toplevel_set_orientation (toplevel, orientation);
5568}
5569
5570PanelState
5571panel_toplevel_get_state (PanelToplevel *toplevel)
5572{
5573 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), 0)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return (0); }
} while (0)
;
5574
5575 return toplevel->priv->state;
5576}
5577
5578gboolean
5579panel_toplevel_get_is_hidden (PanelToplevel *toplevel)
5580{
5581 g_return_val_if_fail (PANEL_IS_TOPLEVEL (toplevel), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((toplevel)); GType __t = ((panel_toplevel_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 (((gchar*) 0), ((const char*
) (__func__)), "PANEL_IS_TOPLEVEL (toplevel)"); return ((0));
} } while (0)
;
5582
5583 if (toplevel->priv->state == PANEL_STATE_HIDDEN_UP ||
5584 toplevel->priv->state == PANEL_STATE_HIDDEN_DOWN ||
5585 toplevel->priv->state == PANEL_STATE_HIDDEN_LEFT ||
5586 toplevel->priv->state == PANEL_STATE_HIDDEN_RIGHT)
5587 return TRUE(!(0));
5588
5589 return FALSE(0);
5590}
5591
5592int
5593panel_toplevel_get_minimum_size (PanelToplevel *toplevel)
5594{
5595 return calculate_minimum_height (CTK_WIDGET (toplevel)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((toplevel)), ((ctk_widget_get_type ()))))))
,
5596 toplevel->priv->orientation);
5597}
5598
5599int
5600panel_toplevel_get_maximum_size (PanelToplevel *toplevel)
5601{
5602 CdkRectangle monitor_geom;
5603
5604 panel_toplevel_get_monitor_geometry (toplevel, &monitor_geom);
5605
5606 if (toplevel->priv->orientation & PANEL_HORIZONTAL_MASK(PANEL_ORIENTATION_TOP | PANEL_ORIENTATION_BOTTOM))
5607 return monitor_geom.height / MAXIMUM_SIZE_SCREEN_RATIO5;
5608 else
5609 return monitor_geom.width / MAXIMUM_SIZE_SCREEN_RATIO5;
5610}