Bug Summary

File:_build/../libvnck/pager.c
Warning:line 2075, column 13
This statement is never executed

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 pager.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 -fhalf-no-semantic-interposition -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/_build -fcoverage-compilation-dir=/rootdir/_build -resource-dir /usr/lib/llvm-19/lib/clang/19 -I libvnck/libvnck-3.so.0.3.0.p -I libvnck -I ../libvnck -I . -I .. -I /usr/include/cairo -I /usr/include/libpng16 -I /usr/include/freetype2 -I /usr/include/pixman-1 -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/ctk-3.0 -I /usr/include/pango-1.0 -I /usr/include/harfbuzz -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -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/startup-notification-1.0 -D _FILE_OFFSET_BITS=64 -D G_LOG_DOMAIN="Vnck" -D VNCK_I_KNOW_THIS_IS_UNSTABLE -D VNCK_LOCALEDIR="/usr/local/share/locale" -D VNCK_COMPILATION -D SN_API_NOT_YET_FROZEN=1 -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 -O0 -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcolor-diagnostics -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-08-10-112340-9461-1 -x c ../libvnck/pager.c
1/* pager object */
2
3/*
4 * Copyright (C) 2001 Havoc Pennington
5 * Copyright (C) 2003 Kim Woelders
6 * Copyright (C) 2003 Red Hat, Inc.
7 * Copyright (C) 2003, 2005-2007 Vincent Untz
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public
11 * License as published by the Free Software Foundation; either
12 * version 2 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Library General Public License for more details.
18 *
19 * You should have received a copy of the GNU Library General Public
20 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
21 */
22
23#include <config.h>
24
25#include <math.h>
26#include <glib/gi18n-lib.h>
27
28#include "pager.h"
29#include "workspace.h"
30#include "window.h"
31#include "xutils.h"
32#include "pager-accessible-factory.h"
33#include "workspace-accessible-factory.h"
34#include "private.h"
35
36/**
37 * SECTION:pager
38 * @short_description: a pager widget, showing the content of workspaces.
39 * @see_also: #VnckScreen
40 * @stability: Unstable
41 *
42 * A #VnckPager shows a miniature view of the workspaces, representing managed
43 * windows by small rectangles, and allows the user to initiate various window
44 * manager actions by manipulating these representations. The #VnckPager offers
45 * ways to move windows between workspaces and to change the current workspace.
46 *
47 * Alternatively, a #VnckPager can be configured to only show the names of the
48 * workspace instead of their contents.
49 *
50 * The #VnckPager is also responsible for setting the layout of the workspaces.
51 * Since only one application can be responsible for setting the layout on a
52 * screen, the #VnckPager automatically tries to obtain the manager selection
53 * for the screen and only sets the layout if it owns the manager selection.
54 * See vnck_pager_set_orientation() and vnck_pager_set_n_rows() to change the
55 * layout.
56 */
57
58#define N_SCREEN_CONNECTIONS11 11
59
60struct _VnckPagerPrivate
61{
62 VnckScreen *screen;
63
64 int n_rows; /* really columns for vertical orientation */
65 VnckPagerDisplayMode display_mode;
66 VnckPagerScrollMode scroll_mode;
67 gboolean show_all_workspaces;
68 CtkShadowType shadow_type;
69 gboolean wrap_on_scroll;
70
71 CtkOrientation orientation;
72 int workspace_size;
73 guint screen_connections[N_SCREEN_CONNECTIONS11];
74 int prelight; /* workspace mouse is hovering over */
75 gboolean prelight_dnd; /* is dnd happening? */
76
77 guint dragging :1;
78 int drag_start_x;
79 int drag_start_y;
80 VnckWindow *drag_window;
81
82 GdkPixbuf *bg_cache;
83
84 int layout_manager_token;
85
86 guint dnd_activate; /* GSource that triggers switching to this workspace during dnd */
87 guint dnd_time; /* time of last event during dnd (for delayed workspace activation) */
88};
89
90G_DEFINE_TYPE_WITH_PRIVATE (VnckPager, vnck_pager, CTK_TYPE_WIDGET)static void vnck_pager_init (VnckPager *self); static void vnck_pager_class_init
(VnckPagerClass *klass); static GType vnck_pager_get_type_once
(void); static gpointer vnck_pager_parent_class = ((void*)0)
; static gint VnckPager_private_offset; static void vnck_pager_class_intern_init
(gpointer klass) { vnck_pager_parent_class = g_type_class_peek_parent
(klass); if (VnckPager_private_offset != 0) g_type_class_adjust_private_offset
(klass, &VnckPager_private_offset); vnck_pager_class_init
((VnckPagerClass*) klass); } __attribute__ ((__unused__)) static
inline gpointer vnck_pager_get_instance_private (VnckPager *
self) { return (((gpointer) ((guint8*) (self) + (glong) (VnckPager_private_offset
)))); } GType vnck_pager_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
= vnck_pager_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 vnck_pager_get_type_once (void) {
GType g_define_type_id = g_type_register_static_simple ((ctk_widget_get_type
()), g_intern_static_string ("VnckPager"), sizeof (VnckPagerClass
), (GClassInitFunc)(void (*)(void)) vnck_pager_class_intern_init
, sizeof (VnckPager), (GInstanceInitFunc)(void (*)(void)) vnck_pager_init
, (GTypeFlags) 0); { {{ VnckPager_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (VnckPagerPrivate)); };} } return g_define_type_id
; }
;
91
92enum
93{
94 dummy, /* remove this when you add more signals */
95 LAST_SIGNAL
96};
97
98#define POINT_IN_RECT(xcoord, ycoord, rect)((xcoord) >= (rect).x && (xcoord) < ((rect).x +
(rect).width) && (ycoord) >= (rect).y && (
ycoord) < ((rect).y + (rect).height))
\
99 ((xcoord) >= (rect).x && \
100 (xcoord) < ((rect).x + (rect).width) && \
101 (ycoord) >= (rect).y && \
102 (ycoord) < ((rect).y + (rect).height))
103
104static void vnck_pager_finalize (GObject *object);
105
106static void vnck_pager_realize (CtkWidget *widget);
107static void vnck_pager_unrealize (CtkWidget *widget);
108static CtkSizeRequestMode vnck_pager_get_request_mode (CtkWidget *widget);
109static void vnck_pager_get_preferred_width (CtkWidget *widget,
110 int *minimum_width,
111 int *natural_width);
112static void vnck_pager_get_preferred_width_for_height (CtkWidget *widget,
113 int height,
114 int *minimum_width,
115 int *natural_width);
116static void vnck_pager_get_preferred_height (CtkWidget *widget,
117 int *minimum_height,
118 int *natural_height);
119static void vnck_pager_get_preferred_height_for_width (CtkWidget *widget,
120 int width,
121 int *minimum_height,
122 int *natural_height);
123static void vnck_pager_size_allocate (CtkWidget *widget,
124 CtkAllocation *allocation);
125static gboolean vnck_pager_draw (CtkWidget *widget,
126 cairo_t *cr);
127static gboolean vnck_pager_button_press (CtkWidget *widget,
128 CdkEventButton *event);
129static gboolean vnck_pager_drag_motion (CtkWidget *widget,
130 CdkDragContext *context,
131 gint x,
132 gint y,
133 guint time);
134static void vnck_pager_drag_motion_leave (CtkWidget *widget,
135 CdkDragContext *context,
136 guint time);
137static gboolean vnck_pager_drag_drop (CtkWidget *widget,
138 CdkDragContext *context,
139 gint x,
140 gint y,
141 guint time);
142static void vnck_pager_drag_data_received (CtkWidget *widget,
143 CdkDragContext *context,
144 gint x,
145 gint y,
146 CtkSelectionData *selection_data,
147 guint info,
148 guint time_);
149static void vnck_pager_drag_data_get (CtkWidget *widget,
150 CdkDragContext *context,
151 CtkSelectionData *selection_data,
152 guint info,
153 guint time);
154static void vnck_pager_drag_end (CtkWidget *widget,
155 CdkDragContext *context);
156static gboolean vnck_pager_motion (CtkWidget *widget,
157 CdkEventMotion *event);
158static gboolean vnck_pager_leave_notify (CtkWidget *widget,
159 CdkEventCrossing *event);
160static gboolean vnck_pager_button_release (CtkWidget *widget,
161 CdkEventButton *event);
162static gboolean vnck_pager_scroll_event (CtkWidget *widget,
163 CdkEventScroll *event);
164static gboolean vnck_pager_query_tooltip (CtkWidget *widget,
165 gint x,
166 gint y,
167 gboolean keyboard_tip,
168 CtkTooltip *tooltip);
169static void workspace_name_changed_callback (VnckWorkspace *workspace,
170 gpointer data);
171
172static gboolean vnck_pager_window_state_is_relevant (int state);
173static gint vnck_pager_window_get_workspace (VnckWindow *window,
174 gboolean is_state_relevant);
175static void vnck_pager_queue_draw_workspace (VnckPager *pager,
176 gint i);
177static void vnck_pager_queue_draw_window (VnckPager *pager,
178 VnckWindow *window);
179
180static void vnck_pager_connect_screen (VnckPager *pager);
181static void vnck_pager_connect_window (VnckPager *pager,
182 VnckWindow *window);
183static void vnck_pager_disconnect_screen (VnckPager *pager);
184static void vnck_pager_disconnect_window (VnckPager *pager,
185 VnckWindow *window);
186
187static gboolean vnck_pager_set_layout_hint (VnckPager *pager);
188
189static void vnck_pager_clear_drag (VnckPager *pager);
190static void vnck_pager_check_prelight (VnckPager *pager,
191 gint x,
192 gint y,
193 gboolean dnd);
194
195static GdkPixbuf* vnck_pager_get_background (VnckPager *pager,
196 int width,
197 int height);
198
199static AtkObject* vnck_pager_get_accessible (CtkWidget *widget);
200
201
202static void
203vnck_pager_init (VnckPager *pager)
204{
205 int i;
206 static const CtkTargetEntry targets[] = {
207 { (gchar *) "application/x-vnck-window-id", 0, 0}
208 };
209
210 pager->priv = vnck_pager_get_instance_private (pager);
211
212 pager->priv->n_rows = 1;
213 pager->priv->display_mode = VNCK_PAGER_DISPLAY_CONTENT;
214 pager->priv->scroll_mode = VNCK_PAGER_SCROLL_2D;
215 pager->priv->show_all_workspaces = TRUE(!(0));
216 pager->priv->shadow_type = CTK_SHADOW_NONE;
217 pager->priv->wrap_on_scroll = FALSE(0);
218
219 pager->priv->orientation = CTK_ORIENTATION_HORIZONTAL;
220 pager->priv->workspace_size = 48;
221
222 for (i = 0; i < N_SCREEN_CONNECTIONS11; i++)
223 pager->priv->screen_connections[i] = 0;
224
225 pager->priv->prelight = -1;
226
227 pager->priv->layout_manager_token = VNCK_NO_MANAGER_TOKEN0;
228
229 g_object_set (pager, "has-tooltip", TRUE(!(0)), NULL((void*)0));
230
231 ctk_drag_dest_set (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
, 0, targets, G_N_ELEMENTS (targets)(sizeof (targets) / sizeof ((targets)[0])), CDK_ACTION_MOVE);
232 ctk_widget_set_can_focus (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
, TRUE(!(0)));
233}
234
235static void
236vnck_pager_class_init (VnckPagerClass *klass)
237{
238 GObjectClass *object_class = G_OBJECT_CLASS (klass)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((klass)), (((GType) ((20) << (2))))))))
;
239 CtkWidgetClass *widget_class = CTK_WIDGET_CLASS (klass)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((klass)), ((ctk_widget_get_type ()))))))
;
240
241 object_class->finalize = vnck_pager_finalize;
242
243 widget_class->realize = vnck_pager_realize;
244 widget_class->unrealize = vnck_pager_unrealize;
245 widget_class->get_request_mode = vnck_pager_get_request_mode;
246 widget_class->get_preferred_width = vnck_pager_get_preferred_width;
247 widget_class->get_preferred_width_for_height = vnck_pager_get_preferred_width_for_height;
248 widget_class->get_preferred_height = vnck_pager_get_preferred_height;
249 widget_class->get_preferred_height_for_width = vnck_pager_get_preferred_height_for_width;
250 widget_class->size_allocate = vnck_pager_size_allocate;
251 widget_class->draw = vnck_pager_draw;
252 widget_class->button_press_event = vnck_pager_button_press;
253 widget_class->button_release_event = vnck_pager_button_release;
254 widget_class->scroll_event = vnck_pager_scroll_event;
255 widget_class->motion_notify_event = vnck_pager_motion;
256 widget_class->leave_notify_event = vnck_pager_leave_notify;
257 widget_class->get_accessible = vnck_pager_get_accessible;
258 widget_class->drag_leave = vnck_pager_drag_motion_leave;
259 widget_class->drag_motion = vnck_pager_drag_motion;
260 widget_class->drag_drop = vnck_pager_drag_drop;
261 widget_class->drag_data_received = vnck_pager_drag_data_received;
262 widget_class->drag_data_get = vnck_pager_drag_data_get;
263 widget_class->drag_end = vnck_pager_drag_end;
264 widget_class->query_tooltip = vnck_pager_query_tooltip;
265
266 ctk_widget_class_set_css_name (widget_class, "vnck-pager");
267}
268
269static void
270vnck_pager_finalize (GObject *object)
271{
272 VnckPager *pager;
273
274 pager = VNCK_PAGER (object)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((object)), ((vnck_pager_get_type ()))))))
;
275
276 if (pager->priv->bg_cache)
277 {
278 g_object_unref (G_OBJECT (pager->priv->bg_cache)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager->priv->bg_cache)), (((GType) ((20) << (
2))))))))
);
279 pager->priv->bg_cache = NULL((void*)0);
280 }
281
282 if (pager->priv->dnd_activate != 0)
283 {
284 g_source_remove (pager->priv->dnd_activate);
285 pager->priv->dnd_activate = 0;
286 }
287
288 G_OBJECT_CLASS (vnck_pager_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((vnck_pager_parent_class)), (((GType) ((20) << (2))
))))))
->finalize (object);
289}
290
291static void
292_vnck_pager_set_screen (VnckPager *pager)
293{
294 CdkScreen *cdkscreen;
295
296 if (!ctk_widget_has_screen (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
))
297 return;
298
299 cdkscreen = ctk_widget_get_screen (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
300 pager->priv->screen = vnck_screen_get (cdk_x11_screen_get_screen_number (cdkscreen));
301
302 if (!vnck_pager_set_layout_hint (pager))
303 {
304 _VnckLayoutOrientation orientation;
305
306 /* we couldn't set the layout on the screen. This means someone else owns
307 * it. Let's at least show the correct layout. */
308 _vnck_screen_get_workspace_layout (pager->priv->screen,
309 &orientation,
310 &pager->priv->n_rows,
311 NULL((void*)0), NULL((void*)0));
312
313 /* test in this order to default to horizontal in case there was in issue
314 * when fetching the layout */
315 if (orientation == VNCK_LAYOUT_ORIENTATION_VERTICAL)
316 pager->priv->orientation = CTK_ORIENTATION_VERTICAL;
317 else
318 pager->priv->orientation = CTK_ORIENTATION_HORIZONTAL;
319
320 ctk_widget_queue_resize (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
321 }
322
323 vnck_pager_connect_screen (pager);
324}
325
326static void
327vnck_pager_realize (CtkWidget *widget)
328{
329
330 CdkWindowAttr attributes;
331 gint attributes_mask;
332 VnckPager *pager;
333 CtkAllocation allocation;
334 CdkWindow *window;
335
336 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
337
338 /* do not call the parent class realize since we're doing things a bit
339 * differently here */
340 ctk_widget_set_realized (widget, TRUE(!(0)));
341
342 ctk_widget_get_allocation (widget, &allocation);
343
344 attributes.window_type = CDK_WINDOW_CHILD;
345 attributes.x = allocation.x;
346 attributes.y = allocation.y;
347 attributes.width = allocation.width;
348 attributes.height = allocation.height;
349 attributes.wclass = CDK_INPUT_OUTPUT;
350 attributes.visual = ctk_widget_get_visual (widget);
351 attributes.event_mask = ctk_widget_get_events (widget) | CDK_EXPOSURE_MASK |
352 CDK_BUTTON_PRESS_MASK | CDK_BUTTON_RELEASE_MASK |
353 CDK_SCROLL_MASK |
354 CDK_LEAVE_NOTIFY_MASK | CDK_POINTER_MOTION_MASK |
355 CDK_POINTER_MOTION_HINT_MASK;
356
357 attributes_mask = CDK_WA_X | CDK_WA_Y | CDK_WA_VISUAL;
358
359 window = cdk_window_new (ctk_widget_get_parent_window (widget), &attributes, attributes_mask);
360 ctk_widget_set_window (widget, window);
361 cdk_window_set_user_data (window, widget);
362
363 /* connect to the screen of this pager. In theory, this will already have
364 * been done in vnck_pager_size_request() */
365 if (pager->priv->screen == NULL((void*)0))
366 _vnck_pager_set_screen (pager);
367 g_assert (pager->priv->screen != NULL)do { if (pager->priv->screen != ((void*)0)) ; else g_assertion_message_expr
("Vnck", "../libvnck/pager.c", 367, ((const char*) (__func__
)), "pager->priv->screen != NULL"); } while (0)
;
368}
369
370static void
371vnck_pager_unrealize (CtkWidget *widget)
372{
373 VnckPager *pager;
374
375 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
376
377 vnck_pager_clear_drag (pager);
378 pager->priv->prelight = -1;
379 pager->priv->prelight_dnd = FALSE(0);
380
381 vnck_screen_release_workspace_layout (pager->priv->screen,
382 pager->priv->layout_manager_token);
383 pager->priv->layout_manager_token = VNCK_NO_MANAGER_TOKEN0;
384
385 vnck_pager_disconnect_screen (pager);
386 pager->priv->screen = NULL((void*)0);
387
388 CTK_WIDGET_CLASS (vnck_pager_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((vnck_pager_parent_class)), ((ctk_widget_get_type ())))))
)
->unrealize (widget);
389}
390
391static void
392_vnck_pager_get_padding (VnckPager *pager,
393 CtkBorder *padding)
394{
395 if (pager->priv->shadow_type != CTK_SHADOW_NONE)
396 {
397 CtkWidget *widget;
398 CtkStyleContext *context;
399 CtkStateFlags state;
400
401 widget = CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
;
402 context = ctk_widget_get_style_context (widget);
403 state = ctk_style_context_get_state (context);
404 ctk_style_context_get_padding (context, state, padding);
405 }
406 else
407 {
408 CtkBorder empty_padding = { 0, 0, 0, 0 };
409 *padding = empty_padding;
410 }
411}
412
413static int
414_vnck_pager_get_workspace_width_for_height (VnckPager *pager,
415 int workspace_height)
416{
417 int workspace_width = 0;
418
419 if (pager->priv->display_mode == VNCK_PAGER_DISPLAY_CONTENT)
420 {
421 VnckWorkspace *space;
422 double screen_aspect;
423
424 space = vnck_screen_get_workspace (pager->priv->screen, 0);
425
426 if (space) {
427 screen_aspect =
428 (double) vnck_workspace_get_width (space) /
429 (double) vnck_workspace_get_height (space);
430 } else {
431 screen_aspect =
432 (double) vnck_screen_get_width (pager->priv->screen) /
433 (double) vnck_screen_get_height (pager->priv->screen);
434 }
435
436 workspace_width = screen_aspect * workspace_height;
437 }
438 else
439 {
440 PangoLayout *layout;
441 VnckScreen *screen;
442 int n_spaces;
443 int i, w;
444
445 layout = ctk_widget_create_pango_layout (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
, NULL((void*)0));
446 screen = pager->priv->screen;
447 n_spaces = vnck_screen_get_workspace_count (pager->priv->screen);
448 workspace_width = 1;
449
450 for (i = 0; i < n_spaces; i++)
451 {
452 pango_layout_set_text (layout,
453 vnck_workspace_get_name (vnck_screen_get_workspace (screen, i)),
454 -1);
455 pango_layout_get_pixel_size (layout, &w, NULL((void*)0));
456 workspace_width = MAX (workspace_width, w)(((workspace_width) > (w)) ? (workspace_width) : (w));
457 }
458
459 g_object_unref (layout);
460
461 workspace_width += 2;
462 }
463
464 return workspace_width;
465}
466
467static int
468_vnck_pager_get_workspace_height_for_width (VnckPager *pager,
469 int workspace_width)
470{
471 int workspace_height = 0;
472 VnckWorkspace *space;
473 double screen_aspect;
474
475 /* TODO: Handle VNCK_PAGER_DISPLAY_NAME for this case */
476
477 space = vnck_screen_get_workspace (pager->priv->screen, 0);
478
479 if (space) {
480 screen_aspect =
481 (double) vnck_workspace_get_height (space) /
482 (double) vnck_workspace_get_width (space);
483 } else {
484 screen_aspect =
485 (double) vnck_screen_get_height (pager->priv->screen) /
486 (double) vnck_screen_get_width (pager->priv->screen);
487 }
488
489 workspace_height = screen_aspect * workspace_width;
490
491 return workspace_height;
492}
493
494static void
495vnck_pager_size_request (CtkWidget *widget,
496 CtkRequisition *requisition)
497{
498 VnckPager *pager;
499 int n_spaces;
500 int spaces_per_row;
501 int workspace_width, workspace_height;
502 int n_rows;
503 CtkBorder padding;
504
505 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
506
507 /* if we're not realized, we don't know about our screen yet */
508 if (pager->priv->screen == NULL((void*)0))
509 _vnck_pager_set_screen (pager);
510 g_assert (pager->priv->screen != NULL)do { if (pager->priv->screen != ((void*)0)) ; else g_assertion_message_expr
("Vnck", "../libvnck/pager.c", 510, ((const char*) (__func__
)), "pager->priv->screen != NULL"); } while (0)
;
511
512 g_assert (pager->priv->n_rows > 0)do { if (pager->priv->n_rows > 0) ; else g_assertion_message_expr
("Vnck", "../libvnck/pager.c", 512, ((const char*) (__func__
)), "pager->priv->n_rows > 0"); } while (0)
;
513
514 n_spaces = vnck_screen_get_workspace_count (pager->priv->screen);
515
516 if (pager->priv->show_all_workspaces)
517 {
518 n_rows = pager->priv->n_rows;
519 spaces_per_row = (n_spaces + n_rows - 1) / n_rows;
520 }
521 else
522 {
523 n_rows = 1;
524 spaces_per_row = 1;
525 }
526
527 if (pager->priv->orientation == CTK_ORIENTATION_VERTICAL)
528 {
529 workspace_width = pager->priv->workspace_size;
530 workspace_height = _vnck_pager_get_workspace_height_for_width (pager,
531 workspace_width);
532
533 requisition->width = workspace_width * n_rows + (n_rows - 1);
534 requisition->height = workspace_height * spaces_per_row + (spaces_per_row - 1);
535 }
536 else
537 {
538 workspace_height = pager->priv->workspace_size;
539 workspace_width = _vnck_pager_get_workspace_width_for_height (pager,
540 workspace_height);
541
542 requisition->width = workspace_width * spaces_per_row + (spaces_per_row - 1);
543 requisition->height = workspace_height * n_rows + (n_rows - 1);
544 }
545
546 _vnck_pager_get_padding (pager, &padding);
547 requisition->width += padding.left + padding.right;
548 requisition->height += padding.top + padding.bottom;
549}
550
551static CtkSizeRequestMode
552vnck_pager_get_request_mode (CtkWidget *widget)
553{
554 VnckPager *pager;
555
556 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
557
558 if (pager->priv->orientation == CTK_ORIENTATION_VERTICAL)
559 return CTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH;
560 else
561 return CTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT;
562}
563
564static void
565vnck_pager_get_preferred_width (CtkWidget *widget,
566 int *minimum_width,
567 int *natural_width)
568{
569 CtkRequisition req;
570
571 vnck_pager_size_request (widget, &req);
572
573 *minimum_width = *natural_width = req.width;
574}
575
576static void
577vnck_pager_get_preferred_width_for_height (CtkWidget *widget,
578 int height,
579 int *minimum_width,
580 int *natural_width)
581{
582 VnckPager *pager;
583 int n_spaces;
584 int n_rows;
585 int spaces_per_row;
586 int workspace_width, workspace_height;
587 CtkBorder padding;
588 int width = 0;
589
590 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
591
592 /* if we're not realized, we don't know about our screen yet */
593 if (pager->priv->screen == NULL((void*)0))
594 _vnck_pager_set_screen (pager);
595 g_assert (pager->priv->screen != NULL)do { if (pager->priv->screen != ((void*)0)) ; else g_assertion_message_expr
("Vnck", "../libvnck/pager.c", 595, ((const char*) (__func__
)), "pager->priv->screen != NULL"); } while (0)
;
596
597 g_assert (pager->priv->n_rows > 0)do { if (pager->priv->n_rows > 0) ; else g_assertion_message_expr
("Vnck", "../libvnck/pager.c", 597, ((const char*) (__func__
)), "pager->priv->n_rows > 0"); } while (0)
;
598
599 n_spaces = vnck_screen_get_workspace_count (pager->priv->screen);
600
601 if (pager->priv->show_all_workspaces)
602 {
603 n_rows = pager->priv->n_rows;
604 spaces_per_row = (n_spaces + n_rows - 1) / n_rows;
605 }
606 else
607 {
608 n_rows = 1;
609 spaces_per_row = 1;
610 }
611
612 _vnck_pager_get_padding (pager, &padding);
613 height -= padding.top + padding.bottom;
614 width += padding.left + padding.right;
615
616 height -= (n_rows - 1);
617 workspace_height = height / n_rows;
618
619 workspace_width = _vnck_pager_get_workspace_width_for_height (pager,
620 workspace_height);
621
622 width += workspace_width * spaces_per_row + (spaces_per_row - 1);
623 *natural_width = *minimum_width = width;
624}
625
626static void
627vnck_pager_get_preferred_height (CtkWidget *widget,
628 int *minimum_height,
629 int *natural_height)
630{
631 CtkRequisition req;
632
633 vnck_pager_size_request (widget, &req);
634
635 *minimum_height = *natural_height = req.height;
636}
637
638static void
639vnck_pager_get_preferred_height_for_width (CtkWidget *widget,
640 int width,
641 int *minimum_height,
642 int *natural_height)
643{
644 VnckPager *pager;
645 int n_spaces;
646 int n_rows;
647 int spaces_per_row;
648 int workspace_width, workspace_height;
649 CtkBorder padding;
650 int height = 0;
651
652 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
653
654 /* if we're not realized, we don't know about our screen yet */
655 if (pager->priv->screen == NULL((void*)0))
656 _vnck_pager_set_screen (pager);
657 g_assert (pager->priv->screen != NULL)do { if (pager->priv->screen != ((void*)0)) ; else g_assertion_message_expr
("Vnck", "../libvnck/pager.c", 657, ((const char*) (__func__
)), "pager->priv->screen != NULL"); } while (0)
;
658
659 g_assert (pager->priv->n_rows > 0)do { if (pager->priv->n_rows > 0) ; else g_assertion_message_expr
("Vnck", "../libvnck/pager.c", 659, ((const char*) (__func__
)), "pager->priv->n_rows > 0"); } while (0)
;
660
661 n_spaces = vnck_screen_get_workspace_count (pager->priv->screen);
662
663 if (pager->priv->show_all_workspaces)
664 {
665 n_rows = pager->priv->n_rows;
666 spaces_per_row = (n_spaces + n_rows - 1) / n_rows;
667 }
668 else
669 {
670 n_rows = 1;
671 spaces_per_row = 1;
672 }
673
674 _vnck_pager_get_padding (pager, &padding);
675 width -= padding.left + padding.right;
676 height += padding.top + padding.bottom;
677
678 width -= (n_rows - 1);
679 workspace_width = width / n_rows;
680
681 workspace_height = _vnck_pager_get_workspace_height_for_width (pager,
682 workspace_width);
683
684 height += workspace_height * spaces_per_row + (spaces_per_row - 1);
685 *natural_height = *minimum_height = height;
686}
687
688static gboolean
689_vnck_pager_queue_resize (gpointer data)
690{
691 ctk_widget_queue_resize (CTK_WIDGET (data)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((ctk_widget_get_type ()))))))
);
692 return FALSE(0);
693}
694
695static void
696vnck_pager_size_allocate (CtkWidget *widget,
697 CtkAllocation *allocation)
698{
699 VnckPager *pager;
700 int workspace_size;
701 CtkBorder padding;
702 int width;
703 int height;
704
705 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
706
707 width = allocation->width;
708 height = allocation->height;
709
710 _vnck_pager_get_padding (pager, &padding);
711 width -= padding.left + padding.right;
712 height -= padding.top + padding.bottom;
713
714 g_assert (pager->priv->n_rows > 0)do { if (pager->priv->n_rows > 0) ; else g_assertion_message_expr
("Vnck", "../libvnck/pager.c", 714, ((const char*) (__func__
)), "pager->priv->n_rows > 0"); } while (0)
;
715
716 if (pager->priv->orientation == CTK_ORIENTATION_VERTICAL)
717 {
718 if (pager->priv->show_all_workspaces)
719 workspace_size = (width - (pager->priv->n_rows - 1)) / pager->priv->n_rows;
720 else
721 workspace_size = width;
722 }
723 else
724 {
725 if (pager->priv->show_all_workspaces)
726 workspace_size = (height - (pager->priv->n_rows - 1))/ pager->priv->n_rows;
727 else
728 workspace_size = height;
729 }
730
731 workspace_size = MAX (workspace_size, 1)(((workspace_size) > (1)) ? (workspace_size) : (1));
732
733 if (workspace_size != pager->priv->workspace_size)
734 {
735 pager->priv->workspace_size = workspace_size;
736 g_idle_add (_vnck_pager_queue_resize, pager);
737 return;
738 }
739
740 CTK_WIDGET_CLASS (vnck_pager_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((vnck_pager_parent_class)), ((ctk_widget_get_type ())))))
)
->size_allocate (widget,
741 allocation);
742}
743
744static void
745get_workspace_rect (VnckPager *pager,
746 int space,
747 CdkRectangle *rect)
748{
749 int hsize, vsize;
750 int n_spaces;
751 int spaces_per_row;
752 CtkWidget *widget;
753 int col, row;
754 CtkAllocation allocation;
755 CtkBorder padding;
756
757 widget = CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
;
758
759 ctk_widget_get_allocation (widget, &allocation);
760
761 if (allocation.x < 0 || allocation.y < 0 ||
762 allocation.width < 0 || allocation.height < 0)
763 {
764 rect->x = 0;
765 rect->y = 0;
766 rect->width = 0;
767 rect->height = 0;
768
769 return;
770 }
771
772 _vnck_pager_get_padding (pager, &padding);
773
774 if (!pager->priv->show_all_workspaces)
775 {
776 VnckWorkspace *active_space;
777
778 active_space = vnck_screen_get_active_workspace (pager->priv->screen);
779
780 if (active_space && space == vnck_workspace_get_number (active_space))
781 {
782 rect->x = padding.left;
783 rect->y = padding.top;
784 rect->width = allocation.width - padding.left - padding.right;
785 rect->height = allocation.height - padding.top - padding.bottom;
786 }
787 else
788 {
789 rect->x = 0;
790 rect->y = 0;
791 rect->width = 0;
792 rect->height = 0;
793 }
794
795 return;
796 }
797
798 hsize = allocation.width;
799 vsize = allocation.height;
800
801 if (pager->priv->shadow_type != CTK_SHADOW_NONE)
802 {
803 hsize -= padding.left + padding.right;
804 vsize -= padding.top + padding.bottom;
805 }
806
807 n_spaces = vnck_screen_get_workspace_count (pager->priv->screen);
808
809 g_assert (pager->priv->n_rows > 0)do { if (pager->priv->n_rows > 0) ; else g_assertion_message_expr
("Vnck", "../libvnck/pager.c", 809, ((const char*) (__func__
)), "pager->priv->n_rows > 0"); } while (0)
;
810 spaces_per_row = (n_spaces + pager->priv->n_rows - 1) / pager->priv->n_rows;
811
812 if (pager->priv->orientation == CTK_ORIENTATION_VERTICAL)
813 {
814 rect->width = (hsize - (pager->priv->n_rows - 1)) / pager->priv->n_rows;
815 rect->height = (vsize - (spaces_per_row - 1)) / spaces_per_row;
816
817 col = space / spaces_per_row;
818 row = space % spaces_per_row;
819
820 if (ctk_widget_get_direction (widget) == CTK_TEXT_DIR_RTL)
821 col = pager->priv->n_rows - col - 1;
822
823 rect->x = (rect->width + 1) * col;
824 rect->y = (rect->height + 1) * row;
825
826 if (col == pager->priv->n_rows - 1)
827 rect->width = hsize - rect->x;
828
829 if (row == spaces_per_row - 1)
830 rect->height = vsize - rect->y;
831 }
832 else
833 {
834 rect->width = (hsize - (spaces_per_row - 1)) / spaces_per_row;
835 rect->height = (vsize - (pager->priv->n_rows - 1)) / pager->priv->n_rows;
836
837 col = space % spaces_per_row;
838 row = space / spaces_per_row;
839
840 if (ctk_widget_get_direction (widget) == CTK_TEXT_DIR_RTL)
841 col = spaces_per_row - col - 1;
842
843 rect->x = (rect->width + 1) * col;
844 rect->y = (rect->height + 1) * row;
845
846 if (col == spaces_per_row - 1)
847 rect->width = hsize - rect->x;
848
849 if (row == pager->priv->n_rows - 1)
850 rect->height = vsize - rect->y;
851 }
852
853 if (pager->priv->shadow_type != CTK_SHADOW_NONE)
854 {
855 rect->x += padding.left;
856 rect->y += padding.top;
857 }
858}
859
860static gboolean
861vnck_pager_window_state_is_relevant (int state)
862{
863 return (state & (VNCK_WINDOW_STATE_HIDDEN | VNCK_WINDOW_STATE_SKIP_PAGER)) ? FALSE(0) : TRUE(!(0));
864}
865
866static gint
867vnck_pager_window_get_workspace (VnckWindow *window,
868 gboolean is_state_relevant)
869{
870 gint state;
871 VnckWorkspace *workspace;
872
873 state = vnck_window_get_state (window);
874 if (is_state_relevant && !vnck_pager_window_state_is_relevant (state))
875 return -1;
876 workspace = vnck_window_get_workspace (window);
877 if (workspace == NULL((void*)0) && vnck_window_is_pinned (window))
878 workspace = vnck_screen_get_active_workspace (vnck_window_get_screen (window));
879
880 return workspace ? vnck_workspace_get_number (workspace) : -1;
881}
882
883static GList*
884get_windows_for_workspace_in_bottom_to_top (VnckScreen *screen,
885 VnckWorkspace *workspace)
886{
887 GList *result;
888 GList *windows;
889 GList *tmp;
890 int workspace_num;
891
892 result = NULL((void*)0);
893 workspace_num = vnck_workspace_get_number (workspace);
894
895 windows = vnck_screen_get_windows_stacked (screen);
896 for (tmp = windows; tmp != NULL((void*)0); tmp = tmp->next)
897 {
898 VnckWindow *win = VNCK_WINDOW (tmp->data)((((VnckWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((tmp->data)), ((vnck_window_get_type ()))))))
;
899 if (vnck_pager_window_get_workspace (win, TRUE(!(0))) == workspace_num)
900 result = g_list_prepend (result, win);
901 }
902
903 result = g_list_reverse (result);
904
905 return result;
906}
907
908static void
909get_window_rect (VnckWindow *window,
910 const CdkRectangle *workspace_rect,
911 CdkRectangle *rect)
912{
913 double width_ratio, height_ratio;
914 int x, y, width, height;
915 VnckWorkspace *workspace;
916 CdkRectangle unclipped_win_rect;
917
918 workspace = vnck_window_get_workspace (window);
919 if (workspace == NULL((void*)0))
920 workspace = vnck_screen_get_active_workspace (vnck_window_get_screen (window));
921
922 /* scale window down by same ratio we scaled workspace down */
923 width_ratio = (double) workspace_rect->width / (double) vnck_workspace_get_width (workspace);
924 height_ratio = (double) workspace_rect->height / (double) vnck_workspace_get_height (workspace);
925
926 vnck_window_get_geometry (window, &x, &y, &width, &height);
927
928 x += vnck_workspace_get_viewport_x (workspace);
929 y += vnck_workspace_get_viewport_y (workspace);
930 x = x * width_ratio + 0.5;
931 y = y * height_ratio + 0.5;
932 width = width * width_ratio + 0.5;
933 height = height * height_ratio + 0.5;
934
935 x += workspace_rect->x;
936 y += workspace_rect->y;
937
938 if (width < 3)
939 width = 3;
940 if (height < 3)
941 height = 3;
942
943 unclipped_win_rect.x = x;
944 unclipped_win_rect.y = y;
945 unclipped_win_rect.width = width;
946 unclipped_win_rect.height = height;
947
948 cdk_rectangle_intersect ((CdkRectangle *) workspace_rect, &unclipped_win_rect, rect);
949}
950
951static void
952draw_window (cairo_t *cr,
953 CtkWidget *widget,
954 VnckWindow *win,
955 const CdkRectangle *winrect,
956 CtkStateFlags state,
957 gboolean translucent)
958{
959 CtkStyleContext *context;
960 GdkPixbuf *icon;
961 int icon_w;
962 int icon_h;
963 gboolean is_active;
964 CdkRGBA fg;
965 gdouble translucency;
966
967 context = ctk_widget_get_style_context (widget);
968
969 is_active = vnck_window_is_active (win);
970 translucency = translucent ? 0.4 : 1.0;
971
972 ctk_style_context_save (context);
973 ctk_style_context_set_state (context, state);
974
975 cairo_push_group (cr);
976
977 ctk_render_background (context, cr, winrect->x + 1, winrect->y + 1,
978 MAX (0, winrect->width - 2)(((0) > (winrect->width - 2)) ? (0) : (winrect->width
- 2))
, MAX (0, winrect->height - 2)(((0) > (winrect->height - 2)) ? (0) : (winrect->height
- 2))
);
979
980 if (is_active)
981 {
982 /* Sharpen the foreground color */
983 cairo_set_source_rgba (cr, 1.0f, 1.0f, 1.0f, 0.3f);
984 cairo_rectangle (cr, winrect->x + 1, winrect->y + 1,
985 MAX (0, winrect->width - 2)(((0) > (winrect->width - 2)) ? (0) : (winrect->width
- 2))
, MAX (0, winrect->height - 2)(((0) > (winrect->height - 2)) ? (0) : (winrect->height
- 2))
);
986 cairo_fill (cr);
987 }
988
989 cairo_pop_group_to_source (cr);
990 cairo_paint_with_alpha (cr, translucency);
991
992 icon = vnck_window_get_icon (win);
993
994 icon_w = icon_h = 0;
995
996 if (icon)
997 {
998 icon_w = gdk_pixbuf_get_width (icon);
999 icon_h = gdk_pixbuf_get_height (icon);
1000
1001 /* If the icon is too big, fall back to mini icon.
1002 * We don't arbitrarily scale the icon, because it's
1003 * just too slow on my Athlon 850.
1004 */
1005 if (icon_w > (winrect->width - 2) ||
1006 icon_h > (winrect->height - 2))
1007 {
1008 icon = vnck_window_get_mini_icon (win);
1009 if (icon)
1010 {
1011 icon_w = gdk_pixbuf_get_width (icon);
1012 icon_h = gdk_pixbuf_get_height (icon);
1013
1014 /* Give up. */
1015 if (icon_w > (winrect->width - 2) ||
1016 icon_h > (winrect->height - 2))
1017 icon = NULL((void*)0);
1018 }
1019 }
1020 }
1021
1022 if (icon)
1023 {
1024 int icon_x;
1025 int icon_y;
1026
1027 icon_x = winrect->x + (winrect->width - icon_w) / 2;
1028 icon_y = winrect->y + (winrect->height - icon_h) / 2;
1029
1030 cairo_push_group (cr);
1031 ctk_render_icon (context, cr, icon, icon_x, icon_y);
1032 cairo_pop_group_to_source (cr);
1033 cairo_paint_with_alpha (cr, translucency);
1034 }
1035
1036 cairo_push_group (cr);
1037 ctk_render_frame (context, cr, winrect->x + 0.5, winrect->y + 0.5,
1038 MAX (0, winrect->width - 1)(((0) > (winrect->width - 1)) ? (0) : (winrect->width
- 1))
, MAX (0, winrect->height - 1)(((0) > (winrect->height - 1)) ? (0) : (winrect->height
- 1))
);
1039 cairo_pop_group_to_source (cr);
1040 cairo_paint_with_alpha (cr, translucency);
1041
1042 ctk_style_context_get_color (context, state, &fg);
1043 fg.alpha = translucency;
1044 cdk_cairo_set_source_rgba (cr, &fg);
1045 cairo_set_line_width (cr, 1.0);
1046 cairo_rectangle (cr,
1047 winrect->x + 0.5, winrect->y + 0.5,
1048 MAX (0, winrect->width - 1)(((0) > (winrect->width - 1)) ? (0) : (winrect->width
- 1))
, MAX (0, winrect->height - 1)(((0) > (winrect->height - 1)) ? (0) : (winrect->height
- 1))
);
1049 cairo_stroke (cr);
1050
1051 ctk_style_context_restore (context);
1052}
1053
1054static VnckWindow *
1055window_at_point (VnckPager *pager,
1056 VnckWorkspace *space,
1057 CdkRectangle *space_rect,
1058 int x,
1059 int y)
1060{
1061 VnckWindow *window;
1062 GList *windows;
1063 GList *tmp;
1064
1065 window = NULL((void*)0);
1066
1067 windows = get_windows_for_workspace_in_bottom_to_top (pager->priv->screen,
1068 space);
1069
1070 /* clicks on top windows first */
1071 windows = g_list_reverse (windows);
1072
1073 for (tmp = windows; tmp != NULL((void*)0); tmp = tmp->next)
1074 {
1075 VnckWindow *win = VNCK_WINDOW (tmp->data)((((VnckWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((tmp->data)), ((vnck_window_get_type ()))))))
;
1076 CdkRectangle winrect;
1077
1078 get_window_rect (win, space_rect, &winrect);
1079
1080 if (POINT_IN_RECT (x, y, winrect)((x) >= (winrect).x && (x) < ((winrect).x + (winrect
).width) && (y) >= (winrect).y && (y) <
((winrect).y + (winrect).height))
)
1081 {
1082 /* vnck_window_activate (win); */
1083 window = win;
1084 break;
1085 }
1086 }
1087
1088 g_list_free (windows);
1089
1090 return window;
1091}
1092
1093static int
1094workspace_at_point (VnckPager *pager,
1095 int x,
1096 int y,
1097 int *viewport_x,
1098 int *viewport_y)
1099{
1100 CtkWidget *widget;
1101 int i;
1102 int n_spaces;
1103 CtkAllocation allocation;
1104 CtkBorder padding;
1105
1106 widget = CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
;
1107
1108 ctk_widget_get_allocation (widget, &allocation);
1109
1110 _vnck_pager_get_padding (pager, &padding);
1111
1112 n_spaces = vnck_screen_get_workspace_count (pager->priv->screen);
1113
1114 i = 0;
1115 while (i < n_spaces)
1116 {
1117 CdkRectangle rect;
1118
1119 get_workspace_rect (pager, i, &rect);
1120
1121 /* If workspace is on the edge, pretend points on the frame belong to the
1122 * workspace.
1123 * Else, pretend the right/bottom line separating two workspaces belong
1124 * to the workspace.
1125 */
1126
1127 if (rect.x == padding.left)
1128 {
1129 rect.x = 0;
1130 rect.width += padding.left;
1131 }
1132 if (rect.y == padding.top)
1133 {
1134 rect.y = 0;
1135 rect.height += padding.top;
1136 }
1137 if (rect.y + rect.height == allocation.height - padding.bottom)
1138 {
1139 rect.height += padding.bottom;
1140 }
1141 else
1142 {
1143 rect.height += 1;
1144 }
1145 if (rect.x + rect.width == allocation.width - padding.right)
1146 {
1147 rect.width += padding.right;
1148 }
1149 else
1150 {
1151 rect.width += 1;
1152 }
1153
1154 if (POINT_IN_RECT (x, y, rect)((x) >= (rect).x && (x) < ((rect).x + (rect).width
) && (y) >= (rect).y && (y) < ((rect).y
+ (rect).height))
)
1155 {
1156 double width_ratio, height_ratio;
1157 VnckWorkspace *space;
1158
1159 space = vnck_screen_get_workspace (pager->priv->screen, i);
1160 g_assert (space != NULL)do { if (space != ((void*)0)) ; else g_assertion_message_expr
("Vnck", "../libvnck/pager.c", 1160, ((const char*) (__func__
)), "space != NULL"); } while (0)
;
1161
1162 /* Scale x, y mouse coords to corresponding screenwide viewport coords */
1163
1164 width_ratio = (double) vnck_workspace_get_width (space) / (double) rect.width;
1165 height_ratio = (double) vnck_workspace_get_height (space) / (double) rect.height;
1166
1167 if (viewport_x)
1168 *viewport_x = width_ratio * (x - rect.x);
1169 if (viewport_y)
1170 *viewport_y = height_ratio * (y - rect.y);
1171
1172 return i;
1173 }
1174
1175 ++i;
1176 }
1177
1178 return -1;
1179}
1180
1181static void
1182draw_dark_rectangle (CtkStyleContext *context,
1183 cairo_t *cr,
1184 CtkStateFlags state,
1185 int rx, int ry, int rw, int rh)
1186{
1187 ctk_style_context_save (context);
1188
1189 ctk_style_context_set_state (context, state);
1190
1191 cairo_push_group (cr);
1192
1193 ctk_render_background (context, cr, rx, ry, rw, rh);
1194 cairo_set_source_rgba (cr, 0.0f, 0.0f, 0.0f, 0.3f);
1195 cairo_rectangle (cr, rx, ry, rw, rh);
1196 cairo_fill (cr);
1197
1198 cairo_pop_group_to_source (cr);
1199 cairo_paint (cr);
1200
1201 ctk_style_context_restore (context);
1202}
1203
1204static void
1205vnck_pager_draw_workspace (VnckPager *pager,
1206 cairo_t *cr,
1207 int workspace,
1208 CdkRectangle *rect,
1209 GdkPixbuf *bg_pixbuf)
1210{
1211 GList *windows;
1212 GList *tmp;
1213 gboolean is_current;
1214 VnckWorkspace *space;
1215 CtkWidget *widget;
1216 CtkStateFlags state;
1217 CtkStyleContext *context;
1218
1219 space = vnck_screen_get_workspace (pager->priv->screen, workspace);
1220 if (!space)
1221 return;
1222
1223 widget = CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
;
1224 is_current = (space == vnck_screen_get_active_workspace (pager->priv->screen));
1225
1226 state = CTK_STATE_FLAG_NORMAL;
1227 if (is_current)
1228 state |= CTK_STATE_FLAG_SELECTED;
1229 else if (workspace == pager->priv->prelight)
1230 state |= CTK_STATE_FLAG_PRELIGHT;
1231
1232 context = ctk_widget_get_style_context (widget);
1233
1234 /* FIXME in names mode, should probably draw things like a button.
1235 */
1236
1237 if (bg_pixbuf)
1238 {
1239 cdk_cairo_set_source_pixbuf (cr, bg_pixbuf, rect->x, rect->y);
1240 cairo_paint (cr);
1241 }
1242 else
1243 {
1244 if (!vnck_workspace_is_virtual (space))
1245 {
1246 draw_dark_rectangle (context, cr, state,
1247 rect->x, rect->y, rect->width, rect->height);
1248 }
1249 else
1250 {
1251 //FIXME prelight for dnd in the viewport?
1252 int workspace_width, workspace_height;
1253 int screen_width, screen_height;
1254 double width_ratio, height_ratio;
1255 double vx, vy, vw, vh; /* viewport */
1256
1257 workspace_width = vnck_workspace_get_width (space);
1258 workspace_height = vnck_workspace_get_height (space);
1259 screen_width = vnck_screen_get_width (pager->priv->screen);
1260 screen_height = vnck_screen_get_height (pager->priv->screen);
1261
1262 if ((workspace_width % screen_width == 0) &&
1263 (workspace_height % screen_height == 0))
1264 {
1265 int i, j;
1266 int active_i, active_j;
1267 int horiz_views;
1268 int verti_views;
1269
1270 horiz_views = workspace_width / screen_width;
1271 verti_views = workspace_height / screen_height;
1272
1273 /* do not forget thin lines to delimit "workspaces" */
1274 width_ratio = (rect->width - (horiz_views - 1)) /
1275 (double) workspace_width;
1276 height_ratio = (rect->height - (verti_views - 1)) /
1277 (double) workspace_height;
1278
1279 if (is_current)
1280 {
1281 active_i =
1282 vnck_workspace_get_viewport_x (space) / screen_width;
1283 active_j =
1284 vnck_workspace_get_viewport_y (space) / screen_height;
1285 }
1286 else
1287 {
1288 active_i = -1;
1289 active_j = -1;
1290 }
1291
1292 for (i = 0; i < horiz_views; i++)
1293 {
1294 /* "+ i" is for the thin lines */
1295 vx = rect->x + (width_ratio * screen_width) * i + i;
1296
1297 if (i == horiz_views - 1)
1298 vw = rect->width + rect->x - vx;
1299 else
1300 vw = width_ratio * screen_width;
1301
1302 vh = height_ratio * screen_height;
1303
1304 for (j = 0; j < verti_views; j++)
1305 {
1306 CtkStateFlags rec_state = CTK_STATE_FLAG_NORMAL;
1307
1308 /* "+ j" is for the thin lines */
1309 vy = rect->y + (height_ratio * screen_height) * j + j;
1310
1311 if (j == verti_views - 1)
1312 vh = rect->height + rect->y - vy;
1313
1314 if (active_i == i && active_j == j)
1315 rec_state = CTK_STATE_FLAG_SELECTED;
1316
1317 draw_dark_rectangle (context, cr, rec_state, vx, vy, vw, vh);
1318 }
1319 }
1320 }
1321 else
1322 {
1323 width_ratio = rect->width / (double) workspace_width;
1324 height_ratio = rect->height / (double) workspace_height;
1325
1326 /* first draw non-active part of the viewport */
1327 draw_dark_rectangle (context, cr, CTK_STATE_FLAG_NORMAL,
1328 rect->x, rect->y, rect->width, rect->height);
1329
1330 if (is_current)
1331 {
1332 /* draw the active part of the viewport */
1333 vx = rect->x +
1334 width_ratio * vnck_workspace_get_viewport_x (space);
1335 vy = rect->y +
1336 height_ratio * vnck_workspace_get_viewport_y (space);
1337 vw = width_ratio * screen_width;
1338 vh = height_ratio * screen_height;
1339
1340 draw_dark_rectangle (context, cr, CTK_STATE_FLAG_SELECTED,
1341 vx, vy, vw, vh);
1342 }
1343 }
1344 }
1345 }
1346
1347 if (pager->priv->display_mode == VNCK_PAGER_DISPLAY_CONTENT)
1348 {
1349 windows = get_windows_for_workspace_in_bottom_to_top (pager->priv->screen,
1350 vnck_screen_get_workspace (pager->priv->screen,
1351 workspace));
1352
1353 tmp = windows;
1354 while (tmp != NULL((void*)0))
1355 {
1356 VnckWindow *win = tmp->data;
1357 CdkRectangle winrect;
1358 gboolean translucent;
1359
1360 get_window_rect (win, rect, &winrect);
1361
1362 translucent = (win == pager->priv->drag_window) && pager->priv->dragging;
1363 draw_window (cr, widget, win, &winrect, state, translucent);
1364
1365 tmp = tmp->next;
1366 }
1367
1368 g_list_free (windows);
1369 }
1370 else
1371 {
1372 /* Workspace name mode */
1373 CtkStateFlags layout_state;
1374 const char *workspace_name;
1375 PangoLayout *layout;
1376 VnckWorkspace *ws;
1377 int w, h;
1378
1379 ws = vnck_screen_get_workspace (pager->priv->screen, workspace);
1380 workspace_name = vnck_workspace_get_name (ws);
1381 layout = ctk_widget_create_pango_layout (widget, workspace_name);
1382
1383 pango_layout_get_pixel_size (layout, &w, &h);
1384
1385 layout_state = (is_current) ? CTK_STATE_FLAG_SELECTED : CTK_STATE_FLAG_NORMAL;
1386 ctk_style_context_save (context);
1387 ctk_style_context_set_state (context, layout_state);
1388 ctk_render_layout (context, cr, rect->x + (rect->width - w) / 2,
1389 rect->y + (rect->height - h) / 2, layout);
1390
1391 ctk_style_context_restore (context);
1392 g_object_unref (layout);
1393 }
1394
1395 if (workspace == pager->priv->prelight && pager->priv->prelight_dnd)
1396 {
1397 ctk_style_context_save (context);
1398 ctk_style_context_set_state (context, CTK_STATE_FLAG_NORMAL);
1399 ctk_render_frame (context, cr, rect->x, rect->y, rect->width, rect->height);
1400 ctk_style_context_restore (context);
1401
1402 cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); /* black */
1403 cairo_set_line_width (cr, 1.0);
1404 cairo_rectangle (cr, rect->x + 0.5, rect->y + 0.5,
1405 MAX (0, rect->width - 1)(((0) > (rect->width - 1)) ? (0) : (rect->width - 1)
)
, MAX (0, rect->height - 1)(((0) > (rect->height - 1)) ? (0) : (rect->height - 1
))
);
1406 cairo_stroke (cr);
1407 }
1408}
1409
1410static gboolean
1411vnck_pager_draw (CtkWidget *widget,
1412 cairo_t *cr)
1413{
1414 VnckPager *pager;
1415 int i;
1416 int n_spaces;
1417 VnckWorkspace *active_space;
1418 GdkPixbuf *bg_pixbuf;
1419 gboolean first;
1420 CtkStyleContext *context;
1421 CtkStateFlags state;
1422
1423 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
1424
1425 n_spaces = vnck_screen_get_workspace_count (pager->priv->screen);
1426 active_space = vnck_screen_get_active_workspace (pager->priv->screen);
1427 bg_pixbuf = NULL((void*)0);
1428 first = TRUE(!(0));
1429
1430 state = ctk_widget_get_state_flags (widget);
1431 context = ctk_widget_get_style_context (widget);
1432
1433 ctk_render_background (context, cr, 0, 0,
1434 ctk_widget_get_allocated_width (widget),
1435 ctk_widget_get_allocated_height (widget));
1436
1437 ctk_style_context_save (context);
1438 ctk_style_context_set_state (context, state);
1439
1440 if (ctk_widget_has_focus (widget))
1441 {
1442 cairo_save (cr);
1443 ctk_render_focus (context, cr,
1444 0, 0,
1445 ctk_widget_get_allocated_width (widget),
1446 ctk_widget_get_allocated_height (widget));
1447 cairo_restore (cr);
1448 }
1449
1450 if (pager->priv->shadow_type != CTK_SHADOW_NONE)
1451 {
1452 cairo_save (cr);
1453 ctk_render_frame (context, cr, 0, 0,
1454 ctk_widget_get_allocated_width (widget),
1455 ctk_widget_get_allocated_height (widget));
1456 cairo_restore (cr);
1457 }
1458
1459 ctk_style_context_restore (context);
1460
1461 i = 0;
1462 while (i < n_spaces)
1463 {
1464 CdkRectangle rect;
1465
1466 if (pager->priv->show_all_workspaces ||
1467 (active_space && i == vnck_workspace_get_number (active_space)))
1468 {
1469 get_workspace_rect (pager, i, &rect);
1470
1471 /* We only want to do this once, even if w/h change,
1472 * for efficiency. width/height will only change by
1473 * one pixel at most.
1474 */
1475 if (first &&
1476 pager->priv->display_mode == VNCK_PAGER_DISPLAY_CONTENT)
1477 {
1478 bg_pixbuf = vnck_pager_get_background (pager,
1479 rect.width,
1480 rect.height);
1481 first = FALSE(0);
1482 }
1483
1484 vnck_pager_draw_workspace (pager, cr, i, &rect, bg_pixbuf);
1485 }
1486
1487 ++i;
1488 }
1489
1490 return FALSE(0);
1491}
1492
1493static gboolean
1494vnck_pager_button_press (CtkWidget *widget,
1495 CdkEventButton *event)
1496{
1497 VnckPager *pager;
1498 int space_number;
1499 VnckWorkspace *space = NULL((void*)0);
1500 CdkRectangle workspace_rect;
1501
1502 if (event->button != 1)
1503 return FALSE(0);
1504
1505 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
1506
1507 space_number = workspace_at_point (pager, event->x, event->y, NULL((void*)0), NULL((void*)0));
1508
1509 if (space_number != -1)
1510 {
1511 get_workspace_rect (pager, space_number, &workspace_rect);
1512 space = vnck_screen_get_workspace (pager->priv->screen, space_number);
1513 }
1514
1515 if (space)
1516 {
1517 /* always save the start coordinates so we can know if we need to change
1518 * workspace when the button is released (ie, start and end coordinates
1519 * should be in the same workspace) */
1520 pager->priv->drag_start_x = event->x;
1521 pager->priv->drag_start_y = event->y;
1522 }
1523
1524 if (space && (pager->priv->display_mode != VNCK_PAGER_DISPLAY_NAME))
1525 {
1526 pager->priv->drag_window = window_at_point (pager, space,
1527 &workspace_rect,
1528 event->x, event->y);
1529 }
1530
1531 return TRUE(!(0));
1532}
1533
1534static gboolean
1535vnck_pager_drag_motion_timeout (gpointer data)
1536{
1537 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
1538 VnckWorkspace *active_workspace, *dnd_workspace;
1539
1540 pager->priv->dnd_activate = 0;
1541 active_workspace = vnck_screen_get_active_workspace (pager->priv->screen);
1542 dnd_workspace = vnck_screen_get_workspace (pager->priv->screen,
1543 pager->priv->prelight);
1544
1545 if (dnd_workspace &&
1546 (pager->priv->prelight != vnck_workspace_get_number (active_workspace)))
1547 vnck_workspace_activate (dnd_workspace, pager->priv->dnd_time);
1548
1549 return FALSE(0);
1550}
1551
1552static void
1553vnck_pager_queue_draw_workspace (VnckPager *pager,
1554 gint i)
1555{
1556 CdkRectangle rect;
1557
1558 if (i < 0)
1559 return;
1560
1561 get_workspace_rect (pager, i, &rect);
1562 ctk_widget_queue_draw_area (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
,
1563 rect.x, rect.y,
1564 rect.width, rect.height);
1565}
1566
1567static void
1568vnck_pager_queue_draw_window (VnckPager *pager,
1569 VnckWindow *window)
1570{
1571 gint workspace;
1572
1573 workspace = vnck_pager_window_get_workspace (window, TRUE(!(0)));
1574 if (workspace == -1)
1575 return;
1576
1577 vnck_pager_queue_draw_workspace (pager, workspace);
1578}
1579
1580static void
1581vnck_pager_check_prelight (VnckPager *pager,
1582 gint x,
1583 gint y,
1584 gboolean prelight_dnd)
1585{
1586 gint id;
1587
1588 if (x < 0 || y < 0)
1589 id = -1;
1590 else
1591 id = workspace_at_point (pager, x, y, NULL((void*)0), NULL((void*)0));
1592
1593 if (id != pager->priv->prelight)
1594 {
1595 vnck_pager_queue_draw_workspace (pager, pager->priv->prelight);
1596 vnck_pager_queue_draw_workspace (pager, id);
1597 pager->priv->prelight = id;
1598 pager->priv->prelight_dnd = prelight_dnd;
1599 }
1600 else if (prelight_dnd != pager->priv->prelight_dnd)
1601 {
1602 vnck_pager_queue_draw_workspace (pager, pager->priv->prelight);
1603 pager->priv->prelight_dnd = prelight_dnd;
1604 }
1605}
1606
1607static gboolean
1608vnck_pager_drag_motion (CtkWidget *widget,
1609 CdkDragContext *context,
1610 gint x,
1611 gint y,
1612 guint time)
1613{
1614 VnckPager *pager;
1615 gint previous_workspace;
1616
1617 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
1618
1619 previous_workspace = pager->priv->prelight;
1620 vnck_pager_check_prelight (pager, x, y, TRUE(!(0)));
1621
1622 if (ctk_drag_dest_find_target (widget, context, NULL((void*)0)))
1623 {
1624 cdk_drag_status (context, cdk_drag_context_get_suggested_action (context), time);
1625 }
1626 else
1627 {
1628 cdk_drag_status (context, 0, time);
1629
1630 if (pager->priv->prelight != previous_workspace &&
1631 pager->priv->dnd_activate != 0)
1632 {
1633 /* remove timeout, the window we hover over changed */
1634 g_source_remove (pager->priv->dnd_activate);
1635 pager->priv->dnd_activate = 0;
1636 pager->priv->dnd_time = 0;
1637 }
1638
1639 if (pager->priv->dnd_activate == 0 && pager->priv->prelight > -1)
1640 {
1641 pager->priv->dnd_activate = g_timeout_add_seconds (VNCK_ACTIVATE_TIMEOUT1,
1642 vnck_pager_drag_motion_timeout,
1643 pager);
1644 pager->priv->dnd_time = time;
1645 }
1646 }
1647
1648 return (pager->priv->prelight != -1);
1649}
1650
1651static gboolean
1652vnck_pager_drag_drop (CtkWidget *widget,
1653 CdkDragContext *context,
1654 gint x,
1655 gint y,
1656 guint time)
1657{
1658 VnckPager *pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
1659 CdkAtom target;
1660
1661 target = ctk_drag_dest_find_target (widget, context, NULL((void*)0));
1662
1663 if (target != CDK_NONE((CdkAtom)((gpointer) (gulong) (0))))
1664 ctk_drag_get_data (widget, context, target, time);
1665 else
1666 ctk_drag_finish (context, FALSE(0), FALSE(0), time);
1667
1668 vnck_pager_clear_drag (pager);
1669 vnck_pager_check_prelight (pager, x, y, FALSE(0));
1670
1671 return TRUE(!(0));
1672}
1673
1674static void
1675vnck_pager_drag_data_received (CtkWidget *widget,
1676 CdkDragContext *context,
1677 gint x,
1678 gint y,
1679 CtkSelectionData *selection_data,
1680 guint info G_GNUC_UNUSED__attribute__ ((__unused__)),
1681 guint time)
1682{
1683 VnckPager *pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
1684 VnckWorkspace *space;
1685 GList *tmp;
1686 gint i;
1687 gulong xid;
1688
1689 if ((ctk_selection_data_get_length (selection_data) != sizeof (gulong)) ||
1690 (ctk_selection_data_get_format (selection_data) != 8))
1691 {
1692 ctk_drag_finish (context, FALSE(0), FALSE(0), time);
1693 return;
1694 }
1695
1696 i = workspace_at_point (pager, x, y, NULL((void*)0), NULL((void*)0));
1697 space = vnck_screen_get_workspace (pager->priv->screen, i);
1698 if (!space)
1699 {
1700 ctk_drag_finish (context, FALSE(0), FALSE(0), time);
1701 return;
1702 }
1703
1704 xid = *((gulong *) ctk_selection_data_get_data (selection_data));
1705
1706 for (tmp = vnck_screen_get_windows_stacked (pager->priv->screen); tmp != NULL((void*)0); tmp = tmp->next)
1707 {
1708 if (vnck_window_get_xid (tmp->data) == xid)
1709 {
1710 VnckWindow *win = tmp->data;
1711 vnck_window_move_to_workspace (win, space);
1712 if (space == vnck_screen_get_active_workspace (pager->priv->screen))
1713 vnck_window_activate (win, time);
1714 ctk_drag_finish (context, TRUE(!(0)), FALSE(0), time);
1715 return;
1716 }
1717 }
1718
1719 ctk_drag_finish (context, FALSE(0), FALSE(0), time);
1720}
1721
1722static void
1723vnck_pager_drag_data_get (CtkWidget *widget,
1724 CdkDragContext *context G_GNUC_UNUSED__attribute__ ((__unused__)),
1725 CtkSelectionData *selection_data,
1726 guint info G_GNUC_UNUSED__attribute__ ((__unused__)),
1727 guint time G_GNUC_UNUSED__attribute__ ((__unused__)))
1728{
1729 VnckPager *pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
1730 gulong xid;
1731
1732 if (pager->priv->drag_window == NULL((void*)0))
1733 return;
1734
1735 xid = vnck_window_get_xid (pager->priv->drag_window);
1736 ctk_selection_data_set (selection_data,
1737 ctk_selection_data_get_target (selection_data),
1738 8, (guchar *)&xid, sizeof (gulong));
1739}
1740
1741static void
1742vnck_pager_drag_end (CtkWidget *widget,
1743 CdkDragContext *context G_GNUC_UNUSED__attribute__ ((__unused__)))
1744{
1745 VnckPager *pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
1746
1747 vnck_pager_clear_drag (pager);
1748}
1749
1750static void
1751vnck_pager_drag_motion_leave (CtkWidget *widget,
1752 CdkDragContext *context G_GNUC_UNUSED__attribute__ ((__unused__)),
1753 guint time G_GNUC_UNUSED__attribute__ ((__unused__)))
1754{
1755 VnckPager *pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
1756
1757 if (pager->priv->dnd_activate != 0)
1758 {
1759 g_source_remove (pager->priv->dnd_activate);
1760 pager->priv->dnd_activate = 0;
1761 }
1762 pager->priv->dnd_time = 0;
1763 vnck_pager_check_prelight (pager, -1, -1, FALSE(0));
1764}
1765
1766static void
1767vnck_drag_clean_up (VnckWindow *window,
1768 CdkDragContext *context,
1769 gboolean clean_up_for_context_destroy,
1770 gboolean clean_up_for_window_destroy);
1771
1772static void
1773vnck_drag_context_destroyed (gpointer windowp,
1774 GObject *context)
1775{
1776 vnck_drag_clean_up (windowp, (CdkDragContext *) context, TRUE(!(0)), FALSE(0));
1777}
1778
1779static void
1780vnck_update_drag_icon (VnckWindow *window,
1781 CdkDragContext *context)
1782{
1783 gint org_w, org_h, dnd_w, dnd_h;
1784 VnckWorkspace *workspace;
1785 CdkRectangle rect;
1786 cairo_surface_t *surface;
1787 CtkWidget *widget;
1788 cairo_t *cr;
1789
1790 widget = g_object_get_data (G_OBJECT (context)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((context)), (((GType) ((20) << (2))))))))
, "vnck-drag-source-widget");
1791 if (!widget)
1792 return;
1793
1794 if (!ctk_icon_size_lookup (CTK_ICON_SIZE_DND, &dnd_w, &dnd_h))
1795 dnd_w = dnd_h = 32;
1796 /* windows are huge, so let's make this huge */
1797 dnd_w *= 3;
1798
1799 workspace = vnck_window_get_workspace (window);
1800 if (workspace == NULL((void*)0))
1801 workspace = vnck_screen_get_active_workspace (vnck_window_get_screen (window));
1802 if (workspace == NULL((void*)0))
1803 return;
1804
1805 vnck_window_get_geometry (window, NULL((void*)0), NULL((void*)0), &org_w, &org_h);
1806
1807 rect.x = rect.y = 0;
1808 rect.width = 0.5 + ((double) (dnd_w * org_w) / (double) vnck_workspace_get_width (workspace));
1809 rect.width = MIN (org_w, rect.width)(((org_w) < (rect.width)) ? (org_w) : (rect.width));
1810 rect.height = 0.5 + ((double) (rect.width * org_h) / (double) org_w);
1811
1812 /* we need at least three pixels to draw the smallest window */
1813 rect.width = MAX (rect.width, 3)(((rect.width) > (3)) ? (rect.width) : (3));
1814 rect.height = MAX (rect.height, 3)(((rect.height) > (3)) ? (rect.height) : (3));
1815
1816 surface = cdk_window_create_similar_surface (ctk_widget_get_window (widget),
1817 CAIRO_CONTENT_COLOR,
1818 rect.width, rect.height);
1819 cr = cairo_create (surface);
1820 draw_window (cr, widget, window, &rect, CTK_STATE_FLAG_NORMAL, FALSE(0));
1821 cairo_destroy (cr);
1822 cairo_surface_set_device_offset (surface, 2, 2);
1823
1824 ctk_drag_set_icon_surface (context, surface);
1825
1826 cairo_surface_destroy (surface);
1827}
1828
1829static void
1830vnck_drag_window_destroyed (gpointer contextp,
1831 GObject *window)
1832{
1833 vnck_drag_clean_up ((VnckWindow *) window, CDK_DRAG_CONTEXT (contextp)((((CdkDragContext*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((contextp)), ((cdk_drag_context_get_type ()))))))
,
1834 FALSE(0), TRUE(!(0)));
1835}
1836
1837static void
1838vnck_drag_source_destroyed (gpointer contextp,
1839 GObject *drag_source G_GNUC_UNUSED__attribute__ ((__unused__)))
1840{
1841 g_object_steal_data (G_OBJECT (contextp)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((contextp)), (((GType) ((20) << (2))))))))
, "vnck-drag-source-widget");
1842}
1843
1844/* CAREFUL: This function is a bit brittle, because the pointers given may be
1845 * finalized already */
1846static void
1847vnck_drag_clean_up (VnckWindow *window,
1848 CdkDragContext *context,
1849 gboolean clean_up_for_context_destroy,
1850 gboolean clean_up_for_window_destroy)
1851{
1852 if (clean_up_for_context_destroy)
1853 {
1854 CtkWidget *drag_source;
1855
1856 drag_source = g_object_get_data (G_OBJECT (context)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((context)), (((GType) ((20) << (2))))))))
,
1857 "vnck-drag-source-widget");
1858 if (drag_source)
1859 g_object_weak_unref (G_OBJECT (drag_source)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((drag_source)), (((GType) ((20) << (2))))))))
,
1860 vnck_drag_source_destroyed, context);
1861
1862 g_object_weak_unref (G_OBJECT (window)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((window)), (((GType) ((20) << (2))))))))
,
1863 vnck_drag_window_destroyed, context);
1864 if (g_signal_handlers_disconnect_by_func (window,g_signal_handlers_disconnect_matched ((window), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (vnck_update_drag_icon), (context))
1865 vnck_update_drag_icon, context)g_signal_handlers_disconnect_matched ((window), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (vnck_update_drag_icon), (context))
!= 2)
1866 g_assert_not_reached ()do { g_assertion_message_expr ("Vnck", "../libvnck/pager.c", 1866
, ((const char*) (__func__)), ((void*)0)); } while (0)
;
1867 }
1868
1869 if (clean_up_for_window_destroy)
1870 {
1871 g_object_steal_data (G_OBJECT (context)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((context)), (((GType) ((20) << (2))))))))
, "vnck-drag-source-widget");
1872 g_object_weak_unref (G_OBJECT (context)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((context)), (((GType) ((20) << (2))))))))
,
1873 vnck_drag_context_destroyed, window);
1874 }
1875}
1876
1877/**
1878 * vnck_window_set_as_drag_icon:
1879 * @window: #VnckWindow to use as drag icon
1880 * @context: #CdkDragContext to set the icon on
1881 * @drag_source: #CtkWidget that started the drag, or one of its parent. This
1882 * widget needs to stay alive as long as possible during the drag.
1883 *
1884 * Sets the given @window as the drag icon for @context.
1885 **/
1886void
1887_vnck_window_set_as_drag_icon (VnckWindow *window,
1888 CdkDragContext *context,
1889 CtkWidget *drag_source)
1890{
1891 g_return_if_fail (VNCK_IS_WINDOW (window))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((window)); GType __t = ((vnck_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; })))))) { }
else { g_return_if_fail_warning ("Vnck", ((const char*) (__func__
)), "VNCK_IS_WINDOW (window)"); return; } } while (0)
;
1892 g_return_if_fail (CDK_IS_DRAG_CONTEXT (context))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((context)); GType __t = ((cdk_drag_context_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 ("Vnck", ((const char
*) (__func__)), "CDK_IS_DRAG_CONTEXT (context)"); return; } }
while (0)
;
1893
1894 g_object_weak_ref (G_OBJECT (window)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((window)), (((GType) ((20) << (2))))))))
, vnck_drag_window_destroyed, context);
1895 g_signal_connect (window, "geometry_changed",g_signal_connect_data ((window), ("geometry_changed"), (((GCallback
) (vnck_update_drag_icon))), (context), ((void*)0), (GConnectFlags
) 0)
1896 G_CALLBACK (vnck_update_drag_icon), context)g_signal_connect_data ((window), ("geometry_changed"), (((GCallback
) (vnck_update_drag_icon))), (context), ((void*)0), (GConnectFlags
) 0)
;
1897 g_signal_connect (window, "icon_changed",g_signal_connect_data ((window), ("icon_changed"), (((GCallback
) (vnck_update_drag_icon))), (context), ((void*)0), (GConnectFlags
) 0)
1898 G_CALLBACK (vnck_update_drag_icon), context)g_signal_connect_data ((window), ("icon_changed"), (((GCallback
) (vnck_update_drag_icon))), (context), ((void*)0), (GConnectFlags
) 0)
;
1899
1900 g_object_set_data (G_OBJECT (context)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((context)), (((GType) ((20) << (2))))))))
, "vnck-drag-source-widget", drag_source);
1901 g_object_weak_ref (G_OBJECT (drag_source)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((drag_source)), (((GType) ((20) << (2))))))))
, vnck_drag_source_destroyed, context);
1902
1903 g_object_weak_ref (G_OBJECT (context)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((context)), (((GType) ((20) << (2))))))))
, vnck_drag_context_destroyed, window);
1904
1905 vnck_update_drag_icon (window, context);
1906}
1907
1908static gboolean
1909vnck_pager_motion (CtkWidget *widget,
1910 CdkEventMotion *event)
1911{
1912 VnckPager *pager;
1913 CdkWindow *window;
1914 CdkSeat *seat;
1915 CdkDevice *pointer;
1916 int x, y;
1917
1918 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
1919
1920 seat = cdk_display_get_default_seat (ctk_widget_get_display (widget));
1921 window = ctk_widget_get_window (widget);
1922 pointer = cdk_seat_get_pointer (seat);
1923 cdk_window_get_device_position (window, pointer, &x, &y, NULL((void*)0));
1924
1925 if (!pager->priv->dragging &&
1926 pager->priv->drag_window != NULL((void*)0) &&
1927 ctk_drag_check_threshold (widget,
1928 pager->priv->drag_start_x,
1929 pager->priv->drag_start_y,
1930 x, y))
1931 {
1932 CtkTargetList *target_list;
1933 CdkDragContext *context;
1934
1935 target_list = ctk_drag_dest_get_target_list (widget);
1936 context = ctk_drag_begin_with_coordinates (widget, target_list,
1937 CDK_ACTION_MOVE,
1938 1, (CdkEvent *) event,
1939 -1, -1);
1940
1941 pager->priv->dragging = TRUE(!(0));
1942 pager->priv->prelight_dnd = TRUE(!(0));
1943 _vnck_window_set_as_drag_icon (pager->priv->drag_window,
1944 context,
1945 CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
1946 }
1947
1948 vnck_pager_check_prelight (pager, x, y, pager->priv->prelight_dnd);
1949
1950 return TRUE(!(0));
1951}
1952
1953static gboolean
1954vnck_pager_leave_notify (CtkWidget *widget,
1955 CdkEventCrossing *event G_GNUC_UNUSED__attribute__ ((__unused__)))
1956{
1957 VnckPager *pager;
1958
1959 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
1960
1961 vnck_pager_check_prelight (pager, -1, -1, FALSE(0));
1962
1963 return FALSE(0);
1964}
1965
1966static gboolean
1967vnck_pager_button_release (CtkWidget *widget,
1968 CdkEventButton *event)
1969{
1970 VnckPager *pager;
1971 int viewport_x;
1972 int viewport_y;
1973
1974 if (event->button != 1)
1975 return FALSE(0);
1976
1977 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
1978
1979 if (!pager->priv->dragging)
1980 {
1981 VnckWorkspace *space;
1982 int i;
1983 int j;
1984
1985 i = workspace_at_point (pager,
1986 event->x, event->y,
1987 &viewport_x, &viewport_y);
1988 j = workspace_at_point (pager,
1989 pager->priv->drag_start_x,
1990 pager->priv->drag_start_y,
1991 NULL((void*)0), NULL((void*)0));
1992
1993 if (i == j && i >= 0 &&
1994 (space = vnck_screen_get_workspace (pager->priv->screen, i)))
1995 {
1996 int screen_width, screen_height;
1997
1998 /* Don't switch the desktop if we're already there */
1999 if (space != vnck_screen_get_active_workspace (pager->priv->screen))
2000 vnck_workspace_activate (space, event->time);
2001
2002 /* EWMH only lets us move the viewport for the active workspace,
2003 * but we just go ahead and hackily assume that the activate
2004 * just above takes effect prior to moving the viewport
2005 */
2006
2007 /* Transform the pointer location to viewport origin, assuming
2008 * that we want the nearest "regular" viewport containing the
2009 * pointer.
2010 */
2011 screen_width = vnck_screen_get_width (pager->priv->screen);
2012 screen_height = vnck_screen_get_height (pager->priv->screen);
2013 viewport_x = (viewport_x / screen_width) * screen_width;
2014 viewport_y = (viewport_y / screen_height) * screen_height;
2015
2016 if (vnck_workspace_get_viewport_x (space) != viewport_x ||
2017 vnck_workspace_get_viewport_y (space) != viewport_y)
2018 vnck_screen_move_viewport (pager->priv->screen, viewport_x, viewport_y);
2019 }
2020
2021 vnck_pager_clear_drag (pager);
2022 }
2023
2024 return FALSE(0);
2025}
2026
2027static gboolean
2028vnck_pager_scroll_event (CtkWidget *widget,
2029 CdkEventScroll *event)
2030{
2031 VnckPager *pager;
2032 VnckWorkspace *space;
2033 CdkScrollDirection absolute_direction;
2034 int index;
2035 int n_workspaces;
2036 int n_columns;
2037 int in_last_row;
2038 gboolean wrap_workspaces;
2039 gdouble smooth_x;
2040 gdouble smooth_y;
2041
2042 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
2043
2044 if (event->type != CDK_SCROLL)
2045 return FALSE(0);
2046 if (event->direction == CDK_SCROLL_SMOOTH)
2047 return FALSE(0);
2048
2049 absolute_direction = event->direction;
2050
2051 space = vnck_screen_get_active_workspace (pager->priv->screen);
2052 index = vnck_workspace_get_number (space);
2053
2054 n_workspaces = vnck_screen_get_workspace_count (pager->priv->screen);
2055 n_columns = n_workspaces / pager->priv->n_rows;
2056 if (n_workspaces % pager->priv->n_rows != 0)
2057 n_columns++;
2058 in_last_row = n_workspaces % n_columns;
2059 wrap_workspaces = pager->priv->wrap_on_scroll;
2060
2061 if (ctk_widget_get_direction (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
) == CTK_TEXT_DIR_RTL)
2062 {
2063 switch (event->direction)
2064 {
2065 case CDK_SCROLL_DOWN:
2066 case CDK_SCROLL_UP:
2067 break;
2068 case CDK_SCROLL_RIGHT:
2069 absolute_direction = CDK_SCROLL_LEFT;
2070 break;
2071 case CDK_SCROLL_LEFT:
2072 absolute_direction = CDK_SCROLL_RIGHT;
2073 break;
2074 case CDK_SCROLL_SMOOTH:
2075 cdk_event_get_scroll_deltas ((CdkEvent*)event, &smooth_x, &smooth_y);
This statement is never executed
2076 if (smooth_x > 5)
2077 absolute_direction = CDK_SCROLL_RIGHT;
2078 else if (smooth_x < -5)
2079 absolute_direction = CDK_SCROLL_LEFT;
2080 break;
2081 default:
2082 break;
2083 }
2084 }
2085
2086 if (pager->priv->scroll_mode == VNCK_PAGER_SCROLL_2D)
2087 {
2088 switch (absolute_direction)
2089 {
2090 case CDK_SCROLL_DOWN:
2091 if (index + n_columns < n_workspaces)
2092 {
2093 index += n_columns;
2094 }
2095 else if (wrap_workspaces && index == n_workspaces - 1)
2096 {
2097 index = 0;
2098 }
2099 else if ((index < n_workspaces - 1 &&
2100 index + in_last_row != n_workspaces - 1) ||
2101 (index == n_workspaces - 1 &&
2102 in_last_row != 0))
2103 {
2104 index = (index % n_columns) + 1;
2105 }
2106 break;
2107 case CDK_SCROLL_RIGHT:
2108 if (index < n_workspaces - 1)
2109 {
2110 index++;
2111 }
2112 else if (wrap_workspaces)
2113 {
2114 index = 0;
2115 }
2116 break;
2117 case CDK_SCROLL_UP:
2118 if (index - n_columns >= 0)
2119 {
2120 index -= n_columns;
2121 }
2122 else if (index > 0)
2123 {
2124 index = ((pager->priv->n_rows - 1) * n_columns) + (index % n_columns) - 1;
2125 }
2126 else if (wrap_workspaces)
2127 {
2128 index = n_workspaces - 1;
2129 }
2130 if (index >= n_workspaces)
2131 {
2132 index -= n_columns;
2133 }
2134 break;
2135 case CDK_SCROLL_LEFT:
2136 if (index > 0)
2137 {
2138 index--;
2139 }
2140 else if (wrap_workspaces)
2141 {
2142 index = n_workspaces - 1;
2143 }
2144 break;
2145 case CDK_SCROLL_SMOOTH:
2146 default:
2147 g_assert_not_reached ()do { g_assertion_message_expr ("Vnck", "../libvnck/pager.c", 2147
, ((const char*) (__func__)), ((void*)0)); } while (0)
;
2148 break;
2149 }
2150 }
2151 else
2152 {
2153 switch (absolute_direction)
2154 {
2155 case CDK_SCROLL_UP:
2156 case CDK_SCROLL_LEFT:
2157 if (index > 0)
2158 {
2159 index--;
2160 }
2161 else if (wrap_workspaces)
2162 {
2163 index = n_workspaces - 1;
2164 }
2165 break;
2166 case CDK_SCROLL_DOWN:
2167 case CDK_SCROLL_RIGHT:
2168 if (index < n_workspaces - 1)
2169 {
2170 index++;
2171 }
2172 else if (wrap_workspaces)
2173 {
2174 index = 0;
2175 }
2176 break;
2177 case CDK_SCROLL_SMOOTH:
2178 default:
2179 g_assert_not_reached ()do { g_assertion_message_expr ("Vnck", "../libvnck/pager.c", 2179
, ((const char*) (__func__)), ((void*)0)); } while (0)
;
2180 break;
2181 }
2182 }
2183
2184 space = vnck_screen_get_workspace (pager->priv->screen, index);
2185 vnck_workspace_activate (space, event->time);
2186
2187 return TRUE(!(0));
2188}
2189
2190static gboolean
2191vnck_pager_query_tooltip (CtkWidget *widget,
2192 gint x,
2193 gint y,
2194 gboolean keyboard_tip,
2195 CtkTooltip *tooltip)
2196{
2197 int i;
2198 VnckPager *pager;
2199 VnckScreen *screen;
2200 VnckWorkspace *space;
2201 char *name;
2202
2203 pager = VNCK_PAGER (widget)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((vnck_pager_get_type ()))))))
;
2204 screen = pager->priv->screen;
2205
2206 i = workspace_at_point (pager, x, y, NULL((void*)0), NULL((void*)0));
2207 space = vnck_screen_get_workspace (screen, i);
2208 if (!space)
2209 return CTK_WIDGET_CLASS (vnck_pager_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((vnck_pager_parent_class)), ((ctk_widget_get_type ())))))
)
->query_tooltip (widget,
2210 x, y,
2211 keyboard_tip,
2212 tooltip);
2213
2214 if (vnck_screen_get_active_workspace (screen) == space)
2215 {
2216 VnckWindow *window;
2217 CdkRectangle workspace_rect;
2218
2219 get_workspace_rect (pager, i, &workspace_rect);
2220
2221 window = window_at_point (pager, space, &workspace_rect, x, y);
2222
2223 if (window)
2224 name = g_strdup_printf (_("Click to start dragging \"%s\"")((char *) g_dgettext ("libvnck-3.0", "Click to start dragging \"%s\""
))
,
2225 vnck_window_get_name (window));
2226 else
2227 name = g_strdup_printf (_("Current workspace: \"%s\"")((char *) g_dgettext ("libvnck-3.0", "Current workspace: \"%s\""
))
,
2228 vnck_workspace_get_name (space));
2229 }
2230 else
2231 {
2232 name = g_strdup_printf (_("Click to switch to \"%s\"")((char *) g_dgettext ("libvnck-3.0", "Click to switch to \"%s\""
))
,
2233 vnck_workspace_get_name (space));
2234 }
2235
2236 ctk_tooltip_set_text (tooltip, name);
2237
2238 g_free (name);
2239
2240 return TRUE(!(0));
2241}
2242
2243/**
2244 * vnck_pager_new:
2245 *
2246 * Creates a new #VnckPager. The #VnckPager will show the #VnckWorkspace of the
2247 * #VnckScreen it is on.
2248 *
2249 * Return value: a newly created #VnckPager.
2250 */
2251CtkWidget*
2252vnck_pager_new (void)
2253{
2254 VnckPager *pager;
2255
2256 pager = g_object_new (VNCK_TYPE_PAGER(vnck_pager_get_type ()), NULL((void*)0));
2257
2258 return CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
;
2259}
2260
2261static gboolean
2262vnck_pager_set_layout_hint (VnckPager *pager)
2263{
2264 int layout_rows;
2265 int layout_cols;
2266
2267 /* if we're not realized, we don't know about our screen yet */
2268 if (pager->priv->screen == NULL((void*)0))
2269 _vnck_pager_set_screen (pager);
2270 /* can still happen if the pager was not added to a widget hierarchy */
2271 if (pager->priv->screen == NULL((void*)0))
2272 return FALSE(0);
2273
2274 /* The visual representation of the pager doesn't
2275 * correspond to the layout of the workspaces
2276 * here. i.e. the user will not pay any attention
2277 * to the n_rows setting on this pager.
2278 */
2279 if (!pager->priv->show_all_workspaces)
2280 return FALSE(0);
2281
2282 if (pager->priv->orientation == CTK_ORIENTATION_HORIZONTAL)
2283 {
2284 layout_rows = pager->priv->n_rows;
2285 layout_cols = 0;
2286 }
2287 else
2288 {
2289 layout_rows = 0;
2290 layout_cols = pager->priv->n_rows;
2291 }
2292
2293 pager->priv->layout_manager_token =
2294 vnck_screen_try_set_workspace_layout (pager->priv->screen,
2295 pager->priv->layout_manager_token,
2296 layout_rows,
2297 layout_cols);
2298
2299 return (pager->priv->layout_manager_token != VNCK_NO_MANAGER_TOKEN0);
2300}
2301
2302/**
2303 * vnck_pager_set_orientation:
2304 * @pager: a #VnckPager.
2305 * @orientation: orientation to use for the layout of #VnckWorkspace on the
2306 * #VnckScreen @pager is watching.
2307 *
2308 * Tries to change the orientation of the layout of #VnckWorkspace on the
2309 * #VnckScreen @pager is watching. Since no more than one application should
2310 * set this property of a #VnckScreen at a time, setting the layout is not
2311 * guaranteed to work.
2312 *
2313 * If @orientation is %CTK_ORIENTATION_HORIZONTAL, the #VnckWorkspace will be
2314 * laid out in rows, with the first #VnckWorkspace in the top left corner.
2315 *
2316 * If @orientation is %CTK_ORIENTATION_VERTICAL, the #VnckWorkspace will be
2317 * laid out in columns, with the first #VnckWorkspace in the top left corner.
2318 *
2319 * For example, if the layout contains one row, but the orientation of the
2320 * layout is vertical, the #VnckPager will display a column of #VnckWorkspace.
2321 *
2322 * Note that setting the orientation will have an effect on the geometry
2323 * management: if @orientation is %CTK_ORIENTATION_HORIZONTAL,
2324 * %CTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT will be used as request mode; if
2325 * @orientation is %CTK_ORIENTATION_VERTICAL, CTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH
2326 * will be used instead.
2327 *
2328 * If @pager has not been added to a widget hierarchy, the call will fail
2329 * because @pager can't know the screen on which to modify the orientation.
2330 *
2331 * Return value: %TRUE if the layout of #VnckWorkspace has been successfully
2332 * changed or did not need to be changed, %FALSE otherwise.
2333 */
2334gboolean
2335vnck_pager_set_orientation (VnckPager *pager,
2336 CtkOrientation orientation)
2337{
2338 CtkOrientation old_orientation;
2339 gboolean old_orientation_is_valid;
2340
2341 g_return_val_if_fail (VNCK_IS_PAGER (pager), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((pager)); GType __t = ((vnck_pager_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 ("Vnck", ((const char*) (__func__
)), "VNCK_IS_PAGER (pager)"); return ((0)); } } while (0)
;
2342
2343 if (pager->priv->orientation == orientation)
2344 return TRUE(!(0));
2345
2346 old_orientation = pager->priv->orientation;
2347 old_orientation_is_valid = pager->priv->screen != NULL((void*)0);
2348
2349 pager->priv->orientation = orientation;
2350
2351 if (vnck_pager_set_layout_hint (pager))
2352 {
2353 ctk_widget_queue_resize (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
2354 return TRUE(!(0));
2355 }
2356 else
2357 {
2358 if (old_orientation_is_valid)
2359 pager->priv->orientation = old_orientation;
2360 return FALSE(0);
2361 }
2362}
2363
2364/**
2365 * vnck_pager_set_n_rows:
2366 * @pager: a #VnckPager.
2367 * @n_rows: the number of rows to use for the layout of #VnckWorkspace on the
2368 * #VnckScreen @pager is watching.
2369 *
2370 * Tries to change the number of rows in the layout of #VnckWorkspace on the
2371 * #VnckScreen @pager is watching. Since no more than one application should
2372 * set this property of a #VnckScreen at a time, setting the layout is not
2373 * guaranteed to work.
2374 *
2375 * If @pager has not been added to a widget hierarchy, the call will fail
2376 * because @pager can't know the screen on which to modify the layout.
2377 *
2378 * Return value: %TRUE if the layout of #VnckWorkspace has been successfully
2379 * changed or did not need to be changed, %FALSE otherwise.
2380 */
2381gboolean
2382vnck_pager_set_n_rows (VnckPager *pager,
2383 int n_rows)
2384{
2385 int old_n_rows;
2386 gboolean old_n_rows_is_valid;
2387
2388 g_return_val_if_fail (VNCK_IS_PAGER (pager), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((pager)); GType __t = ((vnck_pager_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 ("Vnck", ((const char*) (__func__
)), "VNCK_IS_PAGER (pager)"); return ((0)); } } while (0)
;
2389 g_return_val_if_fail (n_rows > 0, FALSE)do { if ((n_rows > 0)) { } else { g_return_if_fail_warning
("Vnck", ((const char*) (__func__)), "n_rows > 0"); return
((0)); } } while (0)
;
2390
2391 if (pager->priv->n_rows == n_rows)
2392 return TRUE(!(0));
2393
2394 old_n_rows = pager->priv->n_rows;
2395 old_n_rows_is_valid = pager->priv->screen != NULL((void*)0);
2396
2397 pager->priv->n_rows = n_rows;
2398
2399 if (vnck_pager_set_layout_hint (pager))
2400 {
2401 ctk_widget_queue_resize (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
2402 return TRUE(!(0));
2403 }
2404 else
2405 {
2406 if (old_n_rows_is_valid)
2407 pager->priv->n_rows = old_n_rows;
2408 return FALSE(0);
2409 }
2410}
2411
2412/**
2413 * vnck_pager_set_display_mode:
2414 * @pager: a #VnckPager.
2415 * @mode: a display mode.
2416 *
2417 * Sets the display mode for @pager to @mode.
2418 */
2419void
2420vnck_pager_set_display_mode (VnckPager *pager,
2421 VnckPagerDisplayMode mode)
2422{
2423 g_return_if_fail (VNCK_IS_PAGER (pager))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((pager)); GType __t = ((vnck_pager_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 ("Vnck", ((const char*) (__func__
)), "VNCK_IS_PAGER (pager)"); return; } } while (0)
;
2424
2425 if (pager->priv->display_mode == mode)
2426 return;
2427
2428 g_object_set (pager, "has-tooltip", mode != VNCK_PAGER_DISPLAY_NAME, NULL((void*)0));
2429
2430 pager->priv->display_mode = mode;
2431 ctk_widget_queue_resize (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
2432}
2433
2434/**
2435 * vnck_pager_set_scroll_mode:
2436 * @pager: a #VnckPager.
2437 * @scroll_mode: a scroll mode.
2438 *
2439 * Sets @pager to react to input device scrolling in one of the
2440 * available scroll modes.
2441 */
2442void
2443vnck_pager_set_scroll_mode (VnckPager *pager,
2444 VnckPagerScrollMode scroll_mode)
2445{
2446 g_return_if_fail (VNCK_IS_PAGER (pager))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((pager)); GType __t = ((vnck_pager_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 ("Vnck", ((const char*) (__func__
)), "VNCK_IS_PAGER (pager)"); return; } } while (0)
;
2447
2448 if (pager->priv->scroll_mode == scroll_mode)
2449 return;
2450
2451 pager->priv->scroll_mode = scroll_mode;
2452}
2453
2454/**
2455 * vnck_pager_set_show_all:
2456 * @pager: a #VnckPager.
2457 * @show_all_workspaces: whether to display all #VnckWorkspace in @pager.
2458 *
2459 * Sets @pager to display all #VnckWorkspace or not, according to
2460 * @show_all_workspaces.
2461 */
2462void
2463vnck_pager_set_show_all (VnckPager *pager,
2464 gboolean show_all_workspaces)
2465{
2466 g_return_if_fail (VNCK_IS_PAGER (pager))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((pager)); GType __t = ((vnck_pager_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 ("Vnck", ((const char*) (__func__
)), "VNCK_IS_PAGER (pager)"); return; } } while (0)
;
2467
2468 show_all_workspaces = (show_all_workspaces != 0);
2469
2470 if (pager->priv->show_all_workspaces == show_all_workspaces)
2471 return;
2472
2473 pager->priv->show_all_workspaces = show_all_workspaces;
2474 ctk_widget_queue_resize (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
2475}
2476
2477/**
2478 * vnck_pager_set_shadow_type:
2479 * @pager: a #VnckPager.
2480 * @shadow_type: a shadow type.
2481 *
2482 * Sets the shadow type for @pager to @shadow_type. The main use of this
2483 * function is proper integration of #VnckPager in panels with non-system
2484 * backgrounds.
2485 *
2486 * Since: 2.2
2487 */
2488void
2489vnck_pager_set_shadow_type (VnckPager * pager,
2490 CtkShadowType shadow_type)
2491{
2492 g_return_if_fail (VNCK_IS_PAGER (pager))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((pager)); GType __t = ((vnck_pager_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 ("Vnck", ((const char*) (__func__
)), "VNCK_IS_PAGER (pager)"); return; } } while (0)
;
2493
2494 if (pager->priv->shadow_type == shadow_type)
2495 return;
2496
2497 pager->priv->shadow_type = shadow_type;
2498 ctk_widget_queue_resize (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
2499}
2500
2501/**
2502 * vnck_pager_set_wrap_on_scroll:
2503 * @pager: a #VnckPager.
2504 * @wrap_on_scroll: a boolean.
2505 *
2506 * Sets the wrapping behavior of the @pager. Setting it to %TRUE will
2507 * wrap arround to the start when scrolling over the end and vice
2508 * versa. By default it is set to %FALSE.
2509 *
2510 * Since: 3.24.0
2511 */
2512void
2513vnck_pager_set_wrap_on_scroll (VnckPager *pager,
2514 gboolean wrap_on_scroll)
2515{
2516 g_return_if_fail (VNCK_IS_PAGER (pager))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((pager)); GType __t = ((vnck_pager_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 ("Vnck", ((const char*) (__func__
)), "VNCK_IS_PAGER (pager)"); return; } } while (0)
;
2517
2518 pager->priv->wrap_on_scroll = wrap_on_scroll;
2519}
2520
2521/**
2522 * vnck_pager_get_wrap_on_scroll:
2523 * @pager: a #VnckPager.
2524 *
2525 * Return value: %TRUE if the @pager wraps workspaces on a scroll event that
2526 * hits a border, %FALSE otherwise.
2527 *
2528 * Since: 3.24.0
2529 */
2530gboolean
2531vnck_pager_get_wrap_on_scroll (VnckPager *pager)
2532{
2533 g_return_val_if_fail (VNCK_IS_PAGER (pager), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((pager)); GType __t = ((vnck_pager_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 ("Vnck", ((const char*) (__func__
)), "VNCK_IS_PAGER (pager)"); return ((0)); } } while (0)
;
2534
2535 return pager->priv->wrap_on_scroll;
2536}
2537
2538static void
2539active_window_changed_callback (VnckScreen *screen G_GNUC_UNUSED__attribute__ ((__unused__)),
2540 VnckWindow *previous_window G_GNUC_UNUSED__attribute__ ((__unused__)),
2541 gpointer data)
2542{
2543 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2544 ctk_widget_queue_draw (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
2545}
2546
2547static void
2548active_workspace_changed_callback (VnckScreen *screen G_GNUC_UNUSED__attribute__ ((__unused__)),
2549 VnckWorkspace *previous_workspace G_GNUC_UNUSED__attribute__ ((__unused__)),
2550 gpointer data)
2551{
2552 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2553 ctk_widget_queue_draw (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
2554}
2555
2556static void
2557window_stacking_changed_callback (VnckScreen *screen G_GNUC_UNUSED__attribute__ ((__unused__)),
2558 gpointer data)
2559{
2560 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2561 ctk_widget_queue_draw (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
2562}
2563
2564static void
2565window_opened_callback (VnckScreen *screen G_GNUC_UNUSED__attribute__ ((__unused__)),
2566 VnckWindow *window,
2567 gpointer data)
2568{
2569 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2570
2571 vnck_pager_connect_window (pager, window);
2572 vnck_pager_queue_draw_window (pager, window);
2573}
2574
2575static void
2576window_closed_callback (VnckScreen *screen G_GNUC_UNUSED__attribute__ ((__unused__)),
2577 VnckWindow *window,
2578 gpointer data)
2579{
2580 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2581
2582 if (pager->priv->drag_window == window)
2583 vnck_pager_clear_drag (pager);
2584
2585 vnck_pager_queue_draw_window (pager, window);
2586}
2587
2588static void
2589workspace_created_callback (VnckScreen *screen G_GNUC_UNUSED__attribute__ ((__unused__)),
2590 VnckWorkspace *space,
2591 gpointer data)
2592{
2593 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2594 g_signal_connect (space, "name_changed",g_signal_connect_data ((space), ("name_changed"), (((GCallback
) (workspace_name_changed_callback))), (pager), ((void*)0), (
GConnectFlags) 0)
2595 G_CALLBACK (workspace_name_changed_callback), pager)g_signal_connect_data ((space), ("name_changed"), (((GCallback
) (workspace_name_changed_callback))), (pager), ((void*)0), (
GConnectFlags) 0)
;
2596 ctk_widget_queue_resize (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
2597}
2598
2599static void
2600workspace_destroyed_callback (VnckScreen *screen G_GNUC_UNUSED__attribute__ ((__unused__)),
2601 VnckWorkspace *space,
2602 gpointer data)
2603{
2604 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2605 g_signal_handlers_disconnect_by_func (space, G_CALLBACK (workspace_name_changed_callback), pager)g_signal_handlers_disconnect_matched ((space), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (((GCallback) (workspace_name_changed_callback))), (pager
))
;
2606 ctk_widget_queue_resize (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
2607}
2608
2609static void
2610application_opened_callback (VnckScreen *screen G_GNUC_UNUSED__attribute__ ((__unused__)),
2611 VnckApplication *app G_GNUC_UNUSED__attribute__ ((__unused__)),
2612 gpointer data G_GNUC_UNUSED__attribute__ ((__unused__)))
2613{
2614 /* VnckPager *pager = VNCK_PAGER (data); */
2615}
2616
2617static void
2618application_closed_callback (VnckScreen *screen G_GNUC_UNUSED__attribute__ ((__unused__)),
2619 VnckApplication *app G_GNUC_UNUSED__attribute__ ((__unused__)),
2620 gpointer data G_GNUC_UNUSED__attribute__ ((__unused__)))
2621{
2622 /* VnckPager *pager = VNCK_PAGER (data); */
2623}
2624
2625static void
2626window_name_changed_callback (VnckWindow *window,
2627 gpointer data)
2628{
2629 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2630 vnck_pager_queue_draw_window (pager, window);
2631}
2632
2633static void
2634window_state_changed_callback (VnckWindow *window,
2635 VnckWindowState changed,
2636 VnckWindowState new G_GNUC_UNUSED__attribute__ ((__unused__)),
2637 gpointer data)
2638{
2639 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2640
2641 /* if the changed state changes the visibility in the pager, we need to
2642 * redraw the whole workspace. vnck_pager_queue_draw_window() might not be
2643 * enough */
2644 if (!vnck_pager_window_state_is_relevant (changed))
2645 vnck_pager_queue_draw_workspace (pager,
2646 vnck_pager_window_get_workspace (window,
2647 FALSE(0)));
2648 else
2649 vnck_pager_queue_draw_window (pager, window);
2650}
2651
2652static void
2653window_workspace_changed_callback (VnckWindow *window G_GNUC_UNUSED__attribute__ ((__unused__)),
2654 gpointer data)
2655{
2656 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2657 ctk_widget_queue_draw (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
2658}
2659
2660static void
2661window_icon_changed_callback (VnckWindow *window,
2662 gpointer data)
2663{
2664 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2665 vnck_pager_queue_draw_window (pager, window);
2666}
2667
2668static void
2669window_geometry_changed_callback (VnckWindow *window,
2670 gpointer data)
2671{
2672 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2673
2674 vnck_pager_queue_draw_window (pager, window);
2675}
2676
2677static void
2678background_changed_callback (VnckWindow *window G_GNUC_UNUSED__attribute__ ((__unused__)),
2679 gpointer data)
2680{
2681 VnckPager *pager = VNCK_PAGER (data)((((VnckPager*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((vnck_pager_get_type ()))))))
;
2682
2683 if (pager->priv->bg_cache)
2684 {
2685 g_object_unref (G_OBJECT (pager->priv->bg_cache)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager->priv->bg_cache)), (((GType) ((20) << (
2))))))))
);
2686 pager->priv->bg_cache = NULL((void*)0);
2687 }
2688
2689 ctk_widget_queue_draw (CTK_WIDGET (pager)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager)), ((ctk_widget_get_type ()))))))
);
2690}
2691
2692static void
2693workspace_name_changed_callback (VnckWorkspace *space G_GNUC_UNUSED__attribute__ ((__unused__)),
2694 gpointer data)
2695{
2696 ctk_widget_queue_resize (CTK_WIDGET (data)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((ctk_widget_get_type ()))))))
);
2697}
2698
2699static void
2700viewports_changed_callback (VnckWorkspace *space G_GNUC_UNUSED__attribute__ ((__unused__)),
2701 gpointer data)
2702{
2703 ctk_widget_queue_resize (CTK_WIDGET (data)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((data)), ((ctk_widget_get_type ()))))))
);
2704}
2705
2706static void
2707vnck_pager_connect_screen (VnckPager *pager)
2708{
2709 int i;
2710 guint *c;
2711 GList *tmp;
2712 VnckScreen *screen;
2713
2714 g_return_if_fail (pager->priv->screen != NULL)do { if ((pager->priv->screen != ((void*)0))) { } else {
g_return_if_fail_warning ("Vnck", ((const char*) (__func__))
, "pager->priv->screen != NULL"); return; } } while (0)
;
2715
2716 screen = pager->priv->screen;
2717
2718 for (tmp = vnck_screen_get_windows (screen); tmp; tmp = tmp->next)
2719 {
2720 vnck_pager_connect_window (pager, VNCK_WINDOW (tmp->data)((((VnckWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((tmp->data)), ((vnck_window_get_type ()))))))
);
2721 }
2722
2723 i = 0;
2724 c = pager->priv->screen_connections;
2725
2726 c[i] = g_signal_connect (G_OBJECT (screen), "active_window_changed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("active_window_changed"), (((GCallback) (active_window_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2727 G_CALLBACK (active_window_changed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("active_window_changed"), (((GCallback) (active_window_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2728 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("active_window_changed"), (((GCallback) (active_window_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2729 ++i;
2730
2731 c[i] = g_signal_connect (G_OBJECT (screen), "active_workspace_changed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("active_workspace_changed"), (((GCallback) (active_workspace_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2732 G_CALLBACK (active_workspace_changed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("active_workspace_changed"), (((GCallback) (active_workspace_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2733 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("active_workspace_changed"), (((GCallback) (active_workspace_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2734 ++i;
2735
2736 c[i] = g_signal_connect (G_OBJECT (screen), "window_stacking_changed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("window_stacking_changed"), (((GCallback) (window_stacking_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2737 G_CALLBACK (window_stacking_changed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("window_stacking_changed"), (((GCallback) (window_stacking_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2738 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("window_stacking_changed"), (((GCallback) (window_stacking_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2739 ++i;
2740
2741 c[i] = g_signal_connect (G_OBJECT (screen), "window_opened",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("window_opened"), (((GCallback) (window_opened_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2742 G_CALLBACK (window_opened_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("window_opened"), (((GCallback) (window_opened_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2743 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("window_opened"), (((GCallback) (window_opened_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2744 ++i;
2745
2746 c[i] = g_signal_connect (G_OBJECT (screen), "window_closed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("window_closed"), (((GCallback) (window_closed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2747 G_CALLBACK (window_closed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("window_closed"), (((GCallback) (window_closed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2748 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("window_closed"), (((GCallback) (window_closed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2749 ++i;
2750
2751 c[i] = g_signal_connect (G_OBJECT (screen), "workspace_created",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("workspace_created"), (((GCallback) (workspace_created_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2752 G_CALLBACK (workspace_created_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("workspace_created"), (((GCallback) (workspace_created_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2753 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("workspace_created"), (((GCallback) (workspace_created_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2754 ++i;
2755
2756 c[i] = g_signal_connect (G_OBJECT (screen), "workspace_destroyed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("workspace_destroyed"), (((GCallback) (workspace_destroyed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2757 G_CALLBACK (workspace_destroyed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("workspace_destroyed"), (((GCallback) (workspace_destroyed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2758 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("workspace_destroyed"), (((GCallback) (workspace_destroyed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2759 ++i;
2760
2761 c[i] = g_signal_connect (G_OBJECT (screen), "application_opened",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("application_opened"), (((GCallback) (application_opened_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2762 G_CALLBACK (application_opened_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("application_opened"), (((GCallback) (application_opened_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2763 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("application_opened"), (((GCallback) (application_opened_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2764 ++i;
2765
2766 c[i] = g_signal_connect (G_OBJECT (screen), "application_closed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("application_closed"), (((GCallback) (application_closed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2767 G_CALLBACK (application_closed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("application_closed"), (((GCallback) (application_closed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2768 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("application_closed"), (((GCallback) (application_closed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2769 ++i;
2770
2771 c[i] = g_signal_connect (G_OBJECT (screen), "background_changed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("background_changed"), (((GCallback) (background_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2772 G_CALLBACK (background_changed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("background_changed"), (((GCallback) (background_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2773 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("background_changed"), (((GCallback) (background_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2774 ++i;
2775
2776 c[i] = g_signal_connect (G_OBJECT (screen), "viewports_changed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("viewports_changed"), (((GCallback) (viewports_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2777 G_CALLBACK (viewports_changed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("viewports_changed"), (((GCallback) (viewports_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2778 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((screen)), (((GType) ((20) << (2)))
)))))), ("viewports_changed"), (((GCallback) (viewports_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2779 ++i;
2780
2781 g_assert (i == N_SCREEN_CONNECTIONS)do { if (i == 11) ; else g_assertion_message_expr ("Vnck", "../libvnck/pager.c"
, 2781, ((const char*) (__func__)), "i == N_SCREEN_CONNECTIONS"
); } while (0)
;
2782
2783 /* connect to name_changed on each workspace */
2784 for (i = 0; i < vnck_screen_get_workspace_count (pager->priv->screen); i++)
2785 {
2786 VnckWorkspace *space;
2787 space = vnck_screen_get_workspace (pager->priv->screen, i);
2788 g_signal_connect (space, "name_changed",g_signal_connect_data ((space), ("name_changed"), (((GCallback
) (workspace_name_changed_callback))), (pager), ((void*)0), (
GConnectFlags) 0)
2789 G_CALLBACK (workspace_name_changed_callback), pager)g_signal_connect_data ((space), ("name_changed"), (((GCallback
) (workspace_name_changed_callback))), (pager), ((void*)0), (
GConnectFlags) 0)
;
2790 }
2791}
2792
2793static void
2794vnck_pager_connect_window (VnckPager *pager,
2795 VnckWindow *window)
2796{
2797 g_signal_connect (G_OBJECT (window), "name_changed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("name_changed"), (((GCallback) (window_name_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2798 G_CALLBACK (window_name_changed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("name_changed"), (((GCallback) (window_name_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2799 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("name_changed"), (((GCallback) (window_name_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2800 g_signal_connect (G_OBJECT (window), "state_changed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("state_changed"), (((GCallback) (window_state_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2801 G_CALLBACK (window_state_changed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("state_changed"), (((GCallback) (window_state_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2802 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("state_changed"), (((GCallback) (window_state_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2803 g_signal_connect (G_OBJECT (window), "workspace_changed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("workspace_changed"), (((GCallback) (window_workspace_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2804 G_CALLBACK (window_workspace_changed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("workspace_changed"), (((GCallback) (window_workspace_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2805 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("workspace_changed"), (((GCallback) (window_workspace_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2806 g_signal_connect (G_OBJECT (window), "icon_changed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("icon_changed"), (((GCallback) (window_icon_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2807 G_CALLBACK (window_icon_changed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("icon_changed"), (((GCallback) (window_icon_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2808 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("icon_changed"), (((GCallback) (window_icon_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2809 g_signal_connect (G_OBJECT (window), "geometry_changed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("geometry_changed"), (((GCallback) (window_geometry_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2810 G_CALLBACK (window_geometry_changed_callback),g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("geometry_changed"), (((GCallback) (window_geometry_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
2811 pager)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((window)), (((GType) ((20) << (2)))
)))))), ("geometry_changed"), (((GCallback) (window_geometry_changed_callback
))), (pager), ((void*)0), (GConnectFlags) 0)
;
2812}
2813
2814static void
2815vnck_pager_disconnect_screen (VnckPager *pager)
2816{
2817 int i;
2818 GList *tmp;
2819
2820 if (pager->priv->screen == NULL((void*)0))
2821 return;
2822
2823 i = 0;
2824 while (i < N_SCREEN_CONNECTIONS11)
2825 {
2826 if (pager->priv->screen_connections[i] != 0)
2827 g_signal_handler_disconnect (G_OBJECT (pager->priv->screen)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager->priv->screen)), (((GType) ((20) << (2
))))))))
,
2828 pager->priv->screen_connections[i]);
2829
2830 pager->priv->screen_connections[i] = 0;
2831
2832 ++i;
2833 }
2834
2835 for (i = 0; i < vnck_screen_get_workspace_count (pager->priv->screen); i++)
2836 {
2837 VnckWorkspace *space;
2838 space = vnck_screen_get_workspace (pager->priv->screen, i);
2839 g_signal_handlers_disconnect_by_func (space, G_CALLBACK (workspace_name_changed_callback), pager)g_signal_handlers_disconnect_matched ((space), (GSignalMatchType
) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA), 0, 0, ((void*)
0), (((GCallback) (workspace_name_changed_callback))), (pager
))
;
2840 }
2841
2842 for (tmp = vnck_screen_get_windows (pager->priv->screen); tmp; tmp = tmp->next)
2843 {
2844 vnck_pager_disconnect_window (pager, VNCK_WINDOW (tmp->data)((((VnckWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((tmp->data)), ((vnck_window_get_type ()))))))
);
2845 }
2846}
2847
2848static void
2849vnck_pager_disconnect_window (VnckPager *pager,
2850 VnckWindow *window)
2851{
2852 g_signal_handlers_disconnect_by_func (G_OBJECT (window),g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_name_changed_callback
))), (pager))
2853 G_CALLBACK (window_name_changed_callback),g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_name_changed_callback
))), (pager))
2854 pager)g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_name_changed_callback
))), (pager))
;
2855 g_signal_handlers_disconnect_by_func (G_OBJECT (window),g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_state_changed_callback
))), (pager))
2856 G_CALLBACK (window_state_changed_callback),g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_state_changed_callback
))), (pager))
2857 pager)g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_state_changed_callback
))), (pager))
;
2858 g_signal_handlers_disconnect_by_func (G_OBJECT (window),g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_workspace_changed_callback
))), (pager))
2859 G_CALLBACK (window_workspace_changed_callback),g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_workspace_changed_callback
))), (pager))
2860 pager)g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_workspace_changed_callback
))), (pager))
;
2861 g_signal_handlers_disconnect_by_func (G_OBJECT (window),g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_icon_changed_callback
))), (pager))
2862 G_CALLBACK (window_icon_changed_callback),g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_icon_changed_callback
))), (pager))
2863 pager)g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_icon_changed_callback
))), (pager))
;
2864 g_signal_handlers_disconnect_by_func (G_OBJECT (window),g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_geometry_changed_callback
))), (pager))
2865 G_CALLBACK (window_geometry_changed_callback),g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_geometry_changed_callback
))), (pager))
2866 pager)g_signal_handlers_disconnect_matched ((((((GObject*) (void *)
g_type_check_instance_cast ((GTypeInstance*) ((window)), (((
GType) ((20) << (2))))))))), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC
| G_SIGNAL_MATCH_DATA), 0, 0, ((void*)0), (((GCallback) (window_geometry_changed_callback
))), (pager))
;
2867}
2868
2869static void
2870vnck_pager_clear_drag (VnckPager *pager)
2871{
2872 if (pager->priv->dragging)
2873 vnck_pager_queue_draw_window (pager, pager->priv->drag_window);
2874
2875 pager->priv->dragging = FALSE(0);
2876 pager->priv->drag_window = NULL((void*)0);
2877 pager->priv->drag_start_x = -1;
2878 pager->priv->drag_start_y = -1;
2879}
2880
2881static GdkPixbuf*
2882vnck_pager_get_background (VnckPager *pager,
2883 int width,
2884 int height)
2885{
2886 Pixmap p;
2887 GdkPixbuf *pix = NULL((void*)0);
2888
2889 /* We have to be careful not to keep alternating between
2890 * width/height values, otherwise this would get really slow.
2891 */
2892 if (pager->priv->bg_cache &&
2893 gdk_pixbuf_get_width (pager->priv->bg_cache) == width &&
2894 gdk_pixbuf_get_height (pager->priv->bg_cache) == height)
2895 return pager->priv->bg_cache;
2896
2897 if (pager->priv->bg_cache)
2898 {
2899 g_object_unref (G_OBJECT (pager->priv->bg_cache)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pager->priv->bg_cache)), (((GType) ((20) << (
2))))))))
);
2900 pager->priv->bg_cache = NULL((void*)0);
2901 }
2902
2903 if (pager->priv->screen == NULL((void*)0))
2904 return NULL((void*)0);
2905
2906 /* FIXME this just globally disables the thumbnailing feature */
2907 return NULL((void*)0);
2908
2909#define MIN_BG_SIZE10 10
2910
2911 if (width < MIN_BG_SIZE10 || height < MIN_BG_SIZE10)
2912 return NULL((void*)0);
2913
2914 p = vnck_screen_get_background_pixmap (pager->priv->screen);
2915
2916 if (p != None0L)
2917 {
2918 Screen *xscreen;
2919
2920 xscreen = VNCK_SCREEN_XSCREEN (pager->priv->screen)(_vnck_screen_get_xscreen (pager->priv->screen));
2921 pix = _vnck_gdk_pixbuf_get_from_pixmap (xscreen, p);
2922 }
2923
2924 if (pix)
2925 {
2926 pager->priv->bg_cache = gdk_pixbuf_scale_simple (pix,
2927 width,
2928 height,
2929 GDK_INTERP_BILINEAR);
2930
2931 g_object_unref (G_OBJECT (pix)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((pix)), (((GType) ((20) << (2))))))))
);
2932 }
2933
2934 return pager->priv->bg_cache;
2935}
2936
2937/*
2938 *This will return aobj_pager whose parent is vnck's atk object -Gail Container
2939 */
2940static AtkObject *
2941vnck_pager_get_accessible (CtkWidget *widget)
2942{
2943 static gboolean first_time = TRUE(!(0));
2944
2945 if (first_time)
2946 {
2947 AtkObjectFactory *factory;
2948 AtkRegistry *registry;
2949 GType derived_type;
2950 GType derived_atk_type;
2951
2952 /*
2953 * Figure out whether accessibility is enabled by looking at the
2954 * type of the accessible object which would be created for
2955 * the parent type VnckPager.
2956 */
2957 derived_type = g_type_parent (VNCK_TYPE_PAGER(vnck_pager_get_type ()));
2958
2959 registry = atk_get_default_registry ();
2960 factory = atk_registry_get_factory (registry,
2961 derived_type);
2962 derived_atk_type = atk_object_factory_get_accessible_type (factory);
2963
2964 if (g_type_is_a (derived_atk_type, CTK_TYPE_ACCESSIBLE)((derived_atk_type) == ((ctk_accessible_get_type ())) || (g_type_is_a
) ((derived_atk_type), ((ctk_accessible_get_type ()))))
)
2965 {
2966 /*
2967 * Specify what factory to use to create accessible
2968 * objects
2969 */
2970 atk_registry_set_factory_type (registry,
2971 VNCK_TYPE_PAGER(vnck_pager_get_type ()),
2972 VNCK_TYPE_PAGER_ACCESSIBLE_FACTORY(vnck_pager_accessible_factory_get_type()));
2973
2974 atk_registry_set_factory_type (registry,
2975 VNCK_TYPE_WORKSPACE(vnck_workspace_get_type ()),
2976 VNCK_TYPE_WORKSPACE_ACCESSIBLE_FACTORY(vnck_workspace_accessible_factory_get_type()));
2977 }
2978 first_time = FALSE(0);
2979 }
2980 return CTK_WIDGET_CLASS (vnck_pager_parent_class)((((CtkWidgetClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((vnck_pager_parent_class)), ((ctk_widget_get_type ())))))
)
->get_accessible (widget);
2981}
2982
2983int
2984_vnck_pager_get_n_workspaces (VnckPager *pager)
2985{
2986 return vnck_screen_get_workspace_count (pager->priv->screen);
2987}
2988
2989const char*
2990_vnck_pager_get_workspace_name (VnckPager *pager,
2991 int i)
2992{
2993 VnckWorkspace *space;
2994
2995 space = vnck_screen_get_workspace (pager->priv->screen, i);
2996 if (space)
2997 return vnck_workspace_get_name (space);
2998 else
2999 return NULL((void*)0);
3000}
3001
3002VnckWorkspace*
3003_vnck_pager_get_active_workspace (VnckPager *pager)
3004{
3005 return vnck_screen_get_active_workspace (pager->priv->screen);
3006}
3007
3008VnckWorkspace*
3009_vnck_pager_get_workspace (VnckPager *pager,
3010 int i)
3011{
3012 return vnck_screen_get_workspace (pager->priv->screen, i);
3013}
3014
3015void
3016_vnck_pager_activate_workspace (VnckWorkspace *wspace,
3017 guint32 timestamp)
3018{
3019 vnck_workspace_activate (wspace, timestamp);
3020}
3021
3022void
3023_vnck_pager_get_workspace_rect (VnckPager *pager,
3024 int i,
3025 CdkRectangle *rect)
3026{
3027 get_workspace_rect (pager, i, rect);
3028}