1 /*
2 * window-tracker-window: A window tracked by window tracker.
3 *
4 * Copyright 2012-2016 Stephan Haller <nomad@froevel.de>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 * MA 02110-1301, USA.
20 *
21 *
22 */
23
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27
28 #include <libxfdashboard/window-tracker-window.h>
29
30 #include <glib/gi18n-lib.h>
31
32 #include <libxfdashboard/window-tracker-backend.h>
33 #include <libxfdashboard/enums.h>
34 #include <libxfdashboard/marshal.h>
35 #include <libxfdashboard/compat.h>
36
37
38 /* Define this class in GObject system */
39 G_DEFINE_INTERFACE(XfdashboardWindowTrackerWindow,
40 xfdashboard_window_tracker_window,
41 G_TYPE_OBJECT)
42
43
44 /* Signals */
45 enum
46 {
47 SIGNAL_NAME_CHANGED,
48 SIGNAL_STATE_CHANGED,
49 SIGNAL_ACTIONS_CHANGED,
50 SIGNAL_ICON_CHANGED,
51 SIGNAL_WORKSPACE_CHANGED,
52 SIGNAL_MONITOR_CHANGED,
53 SIGNAL_GEOMETRY_CHANGED,
54 SIGNAL_CLOSED,
55
56 SIGNAL_LAST
57 };
58
59 static guint XfdashboardWindowTrackerWindowSignals[SIGNAL_LAST]={ 0, };
60
61
62 /* IMPLEMENTATION: Private variables and methods */
63 #define XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, vfunc)\
64 g_warning("Object of type %s does not implement required virtual function XfdashboardWindowTrackerWindow::%s",\
65 G_OBJECT_TYPE_NAME(self), \
66 vfunc);
67
68
69 /* Default implementation of virtual function "is_equal" */
_xfdashboard_window_tracker_window_real_is_equal(XfdashboardWindowTrackerWindow * inLeft,XfdashboardWindowTrackerWindow * inRight)70 static gboolean _xfdashboard_window_tracker_window_real_is_equal(XfdashboardWindowTrackerWindow *inLeft,
71 XfdashboardWindowTrackerWindow *inRight)
72 {
73 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(inLeft), FALSE);
74 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(inRight), FALSE);
75
76 /* Check if both are the same window */
77 if(inLeft==inRight) return(TRUE);
78
79 /* If we get here then they cannot be considered equal */
80 return(FALSE);
81 }
82
83 /* Default implementation of virtual function "get_monitor" */
_xfdashboard_window_tracker_window_real_get_monitor(XfdashboardWindowTrackerWindow * self)84 static XfdashboardWindowTrackerMonitor* _xfdashboard_window_tracker_window_real_get_monitor(XfdashboardWindowTrackerWindow *self)
85 {
86 XfdashboardWindowTracker *windowTracker;
87 GList *monitors;
88 XfdashboardWindowTrackerMonitor *monitor;
89 XfdashboardWindowTrackerMonitor *foundMonitor;
90
91 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), NULL);
92
93 /* Get window tracker to retrieve list of monitors */
94 windowTracker=xfdashboard_window_tracker_get_default();
95
96 /* Get list of monitors */
97 monitors=xfdashboard_window_tracker_get_monitors(windowTracker);
98
99 /* Iterate through list of monitors and return monitor where window fits in */
100 foundMonitor=NULL;
101 for(; monitors && !foundMonitor; monitors=g_list_next(monitors))
102 {
103 monitor=XFDASHBOARD_WINDOW_TRACKER_MONITOR(monitors->data);
104 if(xfdashboard_window_tracker_window_is_on_monitor(self, monitor))
105 {
106 foundMonitor=monitor;
107 }
108 }
109
110 /* Release allocated resources */
111 g_object_unref(windowTracker);
112
113 /* Return found monitor */
114 return(foundMonitor);
115 }
116
117 /* Default implementation of virtual function "is_on_monitor" */
_xfdashboard_window_tracker_window_real_is_on_monitor(XfdashboardWindowTrackerWindow * self,XfdashboardWindowTrackerMonitor * inMonitor)118 static gboolean _xfdashboard_window_tracker_window_real_is_on_monitor(XfdashboardWindowTrackerWindow *self,
119 XfdashboardWindowTrackerMonitor *inMonitor)
120 {
121 XfdashboardWindowTracker *windowTracker;
122 gint windowX, windowY, windowWidth, windowHeight;
123 gint monitorX, monitorY, monitorWidth, monitorHeight;
124 gint screenWidth, screenHeight;
125 gint windowMiddleX, windowMiddleY;
126
127 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), FALSE);
128 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_MONITOR(inMonitor), FALSE);
129
130 /* Get window geometry */
131 xfdashboard_window_tracker_window_get_geometry(self,
132 &windowX,
133 &windowY,
134 &windowWidth,
135 &windowHeight);
136
137 /* Get monitor geometry */
138 xfdashboard_window_tracker_monitor_get_geometry(inMonitor,
139 &monitorX,
140 &monitorY,
141 &monitorWidth,
142 &monitorHeight);
143
144 /* Get screen size */
145 windowTracker=xfdashboard_window_tracker_get_default();
146 xfdashboard_window_tracker_get_screen_size(windowTracker, &screenWidth, &screenHeight);
147 g_object_unref(windowTracker);
148
149 /* Check if mid-point of window (adjusted to screen size) is within monitor */
150 windowMiddleX=windowX+(windowWidth/2);
151 if(windowMiddleX>screenWidth) windowMiddleX=screenWidth-1;
152
153 windowMiddleY=windowY+(windowHeight/2);
154 if(windowMiddleY>screenHeight) windowMiddleY=screenHeight-1;
155
156 if(windowMiddleX>=monitorX && windowMiddleX<(monitorX+monitorWidth) &&
157 windowMiddleY>=monitorY && windowMiddleY<(monitorY+monitorHeight))
158 {
159 return(TRUE);
160 }
161
162 /* If we get here mid-point of window is out of range of requested monitor */
163 return(FALSE);
164 }
165
166
167 /* IMPLEMENTATION: GObject */
168
169 /* Interface initialization
170 * Set up default functions
171 */
xfdashboard_window_tracker_window_default_init(XfdashboardWindowTrackerWindowInterface * iface)172 static void xfdashboard_window_tracker_window_default_init(XfdashboardWindowTrackerWindowInterface *iface)
173 {
174 static gboolean initialized=FALSE;
175 GParamSpec *property;
176
177 /* The following virtual functions should be overriden if default
178 * implementation does not fit.
179 */
180 iface->is_equal=_xfdashboard_window_tracker_window_real_is_equal;
181 iface->get_monitor=_xfdashboard_window_tracker_window_real_get_monitor;
182 iface->is_on_monitor=_xfdashboard_window_tracker_window_real_is_on_monitor;
183
184 /* Define properties, signals and actions */
185 if(!initialized)
186 {
187 /* Define properties */
188 property=g_param_spec_flags("state",
189 "State",
190 "The state of window",
191 XFDASHBOARD_TYPE_WINDOW_TRACKER_WINDOW_STATE,
192 0,
193 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
194 g_object_interface_install_property(iface, property);
195
196 property=g_param_spec_flags("actions",
197 "Actions",
198 "The possible actions at window",
199 XFDASHBOARD_TYPE_WINDOW_TRACKER_WINDOW_ACTION,
200 0,
201 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
202 g_object_interface_install_property(iface, property);
203
204 /* Define signals */
205 XfdashboardWindowTrackerWindowSignals[SIGNAL_NAME_CHANGED]=
206 g_signal_new("name-changed",
207 G_TYPE_FROM_INTERFACE(iface),
208 G_SIGNAL_RUN_LAST,
209 G_STRUCT_OFFSET(XfdashboardWindowTrackerWindowInterface, name_changed),
210 NULL,
211 NULL,
212 g_cclosure_marshal_VOID__VOID,
213 G_TYPE_NONE,
214 0);
215
216 XfdashboardWindowTrackerWindowSignals[SIGNAL_STATE_CHANGED]=
217 g_signal_new("state-changed",
218 G_TYPE_FROM_INTERFACE(iface),
219 G_SIGNAL_RUN_LAST,
220 G_STRUCT_OFFSET(XfdashboardWindowTrackerWindowInterface, state_changed),
221 NULL,
222 NULL,
223 g_cclosure_marshal_VOID__FLAGS,
224 G_TYPE_NONE,
225 1,
226 XFDASHBOARD_TYPE_WINDOW_TRACKER_WINDOW_STATE);
227
228 XfdashboardWindowTrackerWindowSignals[SIGNAL_ACTIONS_CHANGED]=
229 g_signal_new("actions-changed",
230 G_TYPE_FROM_INTERFACE(iface),
231 G_SIGNAL_RUN_LAST,
232 G_STRUCT_OFFSET(XfdashboardWindowTrackerWindowInterface, actions_changed),
233 NULL,
234 NULL,
235 g_cclosure_marshal_VOID__FLAGS,
236 G_TYPE_NONE,
237 1,
238 XFDASHBOARD_TYPE_WINDOW_TRACKER_WINDOW_ACTION);
239
240 XfdashboardWindowTrackerWindowSignals[SIGNAL_ICON_CHANGED]=
241 g_signal_new("icon-changed",
242 G_TYPE_FROM_INTERFACE(iface),
243 G_SIGNAL_RUN_LAST,
244 G_STRUCT_OFFSET(XfdashboardWindowTrackerWindowInterface, icon_changed),
245 NULL,
246 NULL,
247 g_cclosure_marshal_VOID__VOID,
248 G_TYPE_NONE,
249 0);
250
251 XfdashboardWindowTrackerWindowSignals[SIGNAL_WORKSPACE_CHANGED]=
252 g_signal_new("workspace-changed",
253 G_TYPE_FROM_INTERFACE(iface),
254 G_SIGNAL_RUN_LAST,
255 G_STRUCT_OFFSET(XfdashboardWindowTrackerWindowInterface, workspace_changed),
256 NULL,
257 NULL,
258 g_cclosure_marshal_VOID__OBJECT,
259 G_TYPE_NONE,
260 1,
261 XFDASHBOARD_TYPE_WINDOW_TRACKER_WORKSPACE);
262
263 XfdashboardWindowTrackerWindowSignals[SIGNAL_MONITOR_CHANGED]=
264 g_signal_new("monitor-changed",
265 G_TYPE_FROM_INTERFACE(iface),
266 G_SIGNAL_RUN_LAST,
267 G_STRUCT_OFFSET(XfdashboardWindowTrackerWindowInterface, monitor_changed),
268 NULL,
269 NULL,
270 g_cclosure_marshal_VOID__OBJECT,
271 G_TYPE_NONE,
272 1,
273 XFDASHBOARD_TYPE_WINDOW_TRACKER_MONITOR);
274
275 XfdashboardWindowTrackerWindowSignals[SIGNAL_GEOMETRY_CHANGED]=
276 g_signal_new("geometry-changed",
277 G_TYPE_FROM_INTERFACE(iface),
278 G_SIGNAL_RUN_LAST,
279 G_STRUCT_OFFSET(XfdashboardWindowTrackerWindowInterface, geometry_changed),
280 NULL,
281 NULL,
282 g_cclosure_marshal_VOID__VOID,
283 G_TYPE_NONE,
284 0);
285
286 XfdashboardWindowTrackerWindowSignals[SIGNAL_CLOSED]=
287 g_signal_new("closed",
288 G_TYPE_FROM_INTERFACE(iface),
289 G_SIGNAL_RUN_LAST,
290 G_STRUCT_OFFSET(XfdashboardWindowTrackerWindowInterface, closed),
291 NULL,
292 NULL,
293 g_cclosure_marshal_VOID__VOID,
294 G_TYPE_NONE,
295 0);
296
297 /* Set flag that base initialization was done for this interface */
298 initialized=TRUE;
299 }
300 }
301
302
303 /* IMPLEMENTATION: Public API */
304
305 /* Check if both windows are the same */
xfdashboard_window_tracker_window_is_equal(XfdashboardWindowTrackerWindow * inLeft,XfdashboardWindowTrackerWindow * inRight)306 gboolean xfdashboard_window_tracker_window_is_equal(XfdashboardWindowTrackerWindow *inLeft,
307 XfdashboardWindowTrackerWindow *inRight)
308 {
309 XfdashboardWindowTrackerWindowInterface *iface;
310
311 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(inLeft), FALSE);
312 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(inRight), FALSE);
313
314 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(inLeft);
315
316 /* Call virtual function */
317 if(iface->is_equal)
318 {
319 return(iface->is_equal(inLeft, inRight));
320 }
321
322 /* If we get here the virtual function was not overridden */
323 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(inLeft, "is_equal");
324 return(FALSE);
325 }
326
327 /* Determine if window is visible at all */
xfdashboard_window_tracker_window_is_visible(XfdashboardWindowTrackerWindow * self)328 gboolean xfdashboard_window_tracker_window_is_visible(XfdashboardWindowTrackerWindow *self)
329 {
330 XfdashboardWindowTrackerWindowInterface *iface;
331
332 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), FALSE);
333
334 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
335
336 /* Call virtual function */
337 if(iface->is_visible)
338 {
339 return(iface->is_visible(self));
340 }
341
342 /* If we get here the virtual function was not overridden */
343 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "is_visible");
344 return(FALSE);
345 }
346
347 /* Determine if window is visible and placed on requested workspace */
xfdashboard_window_tracker_window_is_visible_on_workspace(XfdashboardWindowTrackerWindow * self,XfdashboardWindowTrackerWorkspace * inWorkspace)348 gboolean xfdashboard_window_tracker_window_is_visible_on_workspace(XfdashboardWindowTrackerWindow *self,
349 XfdashboardWindowTrackerWorkspace *inWorkspace)
350 {
351 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), FALSE);
352 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WORKSPACE(inWorkspace), FALSE);
353
354 /* Check if window is visible generally and if it is on requested workspace */
355 return(xfdashboard_window_tracker_window_is_visible(self) &&
356 xfdashboard_window_tracker_window_is_on_workspace(self, inWorkspace));
357 }
358
359 /* Determine if window is visible and placed on requested monitor */
xfdashboard_window_tracker_window_is_visible_on_monitor(XfdashboardWindowTrackerWindow * self,XfdashboardWindowTrackerMonitor * inMonitor)360 gboolean xfdashboard_window_tracker_window_is_visible_on_monitor(XfdashboardWindowTrackerWindow *self,
361 XfdashboardWindowTrackerMonitor *inMonitor)
362 {
363 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), FALSE);
364 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_MONITOR(inMonitor), FALSE);
365
366 /* Check if window is visible generally and if it is on requested monitor */
367 return(xfdashboard_window_tracker_window_is_visible(self) &&
368 xfdashboard_window_tracker_window_is_on_monitor(self, inMonitor));
369 }
370
371 /* Show window */
xfdashboard_window_tracker_window_show(XfdashboardWindowTrackerWindow * self)372 void xfdashboard_window_tracker_window_show(XfdashboardWindowTrackerWindow *self)
373 {
374 XfdashboardWindowTrackerWindowInterface *iface;
375
376 g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self));
377
378 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
379
380 /* Call virtual function */
381 if(iface->show)
382 {
383 iface->show(self);
384 return;
385 }
386
387 /* If we get here the virtual function was not overridden */
388 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "show");
389 }
390
391 /* Hide window */
xfdashboard_window_tracker_window_hide(XfdashboardWindowTrackerWindow * self)392 void xfdashboard_window_tracker_window_hide(XfdashboardWindowTrackerWindow *self)
393 {
394 XfdashboardWindowTrackerWindowInterface *iface;
395
396 g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self));
397
398 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
399
400 /* Call virtual function */
401 if(iface->hide)
402 {
403 iface->hide(self);
404 return;
405 }
406
407 /* If we get here the virtual function was not overridden */
408 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "hide");
409 }
410
411 /* Get parent window of this window */
xfdashboard_window_tracker_window_get_parent(XfdashboardWindowTrackerWindow * self)412 XfdashboardWindowTrackerWindow* xfdashboard_window_tracker_window_get_parent(XfdashboardWindowTrackerWindow *self)
413 {
414 XfdashboardWindowTrackerWindowInterface *iface;
415
416 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), NULL);
417
418 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
419
420 /* Call virtual function */
421 if(iface->get_parent)
422 {
423 return(iface->get_parent(self));
424 }
425
426 /* If we get here the virtual function was not overridden */
427 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "get_parent");
428 return(NULL);
429 }
430
431 /* Get state of window */
xfdashboard_window_tracker_window_get_state(XfdashboardWindowTrackerWindow * self)432 XfdashboardWindowTrackerWindowState xfdashboard_window_tracker_window_get_state(XfdashboardWindowTrackerWindow *self)
433 {
434 XfdashboardWindowTrackerWindowInterface *iface;
435
436 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), 0);
437
438 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
439
440 /* Call virtual function */
441 if(iface->get_state)
442 {
443 return(iface->get_state(self));
444 }
445
446 /* If we get here the virtual function was not overridden */
447 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "get_state");
448 return(0);
449 }
450
451 /* Get possible actions for requested window */
xfdashboard_window_tracker_window_get_actions(XfdashboardWindowTrackerWindow * self)452 XfdashboardWindowTrackerWindowAction xfdashboard_window_tracker_window_get_actions(XfdashboardWindowTrackerWindow *self)
453 {
454 XfdashboardWindowTrackerWindowInterface *iface;
455
456 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), 0);
457
458 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
459
460 /* Call virtual function */
461 if(iface->get_actions)
462 {
463 return(iface->get_actions(self));
464 }
465
466 /* If we get here the virtual function was not overridden */
467 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "get_actions");
468 return(0);
469 }
470
471 /* Get name (title) of window */
xfdashboard_window_tracker_window_get_name(XfdashboardWindowTrackerWindow * self)472 const gchar* xfdashboard_window_tracker_window_get_name(XfdashboardWindowTrackerWindow *self)
473 {
474 XfdashboardWindowTrackerWindowInterface *iface;
475
476 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), NULL);
477
478 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
479
480 /* Call virtual function */
481 if(iface->get_name)
482 {
483 return(iface->get_name(self));
484 }
485
486 /* If we get here the virtual function was not overridden */
487 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "get_name");
488 return(NULL);
489 }
490
491 /* Get icon of window */
xfdashboard_window_tracker_window_get_icon(XfdashboardWindowTrackerWindow * self)492 GdkPixbuf* xfdashboard_window_tracker_window_get_icon(XfdashboardWindowTrackerWindow *self)
493 {
494 XfdashboardWindowTrackerWindowInterface *iface;
495
496 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), NULL);
497
498 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
499
500 /* Call virtual function */
501 if(iface->get_icon)
502 {
503 return(iface->get_icon(self));
504 }
505
506 /* If we get here the virtual function was not overridden */
507 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "get_icon");
508 return(NULL);
509 }
510
xfdashboard_window_tracker_window_get_icon_name(XfdashboardWindowTrackerWindow * self)511 const gchar* xfdashboard_window_tracker_window_get_icon_name(XfdashboardWindowTrackerWindow *self)
512 {
513 XfdashboardWindowTrackerWindowInterface *iface;
514
515 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), NULL);
516
517 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
518
519 /* Call virtual function */
520 if(iface->get_icon_name)
521 {
522 return(iface->get_icon_name(self));
523 }
524
525 /* If we get here the virtual function was not overridden */
526 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "get_icon_name");
527 return(NULL);
528 }
529
530 /* Get workspace where window is on */
xfdashboard_window_tracker_window_get_workspace(XfdashboardWindowTrackerWindow * self)531 XfdashboardWindowTrackerWorkspace* xfdashboard_window_tracker_window_get_workspace(XfdashboardWindowTrackerWindow *self)
532 {
533 XfdashboardWindowTrackerWindowInterface *iface;
534
535 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), NULL);
536
537 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
538
539 /* Call virtual function */
540 if(iface->get_workspace)
541 {
542 return(iface->get_workspace(self));
543 }
544
545 /* If we get here the virtual function was not overridden */
546 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "get_workspace");
547 return(NULL);
548 }
549
550 /* Determine if window is on requested workspace */
xfdashboard_window_tracker_window_is_on_workspace(XfdashboardWindowTrackerWindow * self,XfdashboardWindowTrackerWorkspace * inWorkspace)551 gboolean xfdashboard_window_tracker_window_is_on_workspace(XfdashboardWindowTrackerWindow *self,
552 XfdashboardWindowTrackerWorkspace *inWorkspace)
553 {
554 XfdashboardWindowTrackerWindowInterface *iface;
555
556 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), FALSE);
557
558 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
559
560 /* Call virtual function */
561 if(iface->is_on_workspace)
562 {
563 return(iface->is_on_workspace(self, inWorkspace));
564 }
565
566 /* If we get here the virtual function was not overridden */
567 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "is_on_workspace");
568 return(FALSE);
569 }
570
571 /* Move a window to another workspace */
xfdashboard_window_tracker_window_move_to_workspace(XfdashboardWindowTrackerWindow * self,XfdashboardWindowTrackerWorkspace * inWorkspace)572 void xfdashboard_window_tracker_window_move_to_workspace(XfdashboardWindowTrackerWindow *self,
573 XfdashboardWindowTrackerWorkspace *inWorkspace)
574 {
575 XfdashboardWindowTrackerWindowInterface *iface;
576
577 g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self));
578 g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WORKSPACE(inWorkspace));
579
580 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
581
582 /* Call virtual function */
583 if(iface->move_to_workspace)
584 {
585 iface->move_to_workspace(self, inWorkspace);
586 return;
587 }
588
589 /* If we get here the virtual function was not overridden */
590 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "move_to_workspace");
591 }
592
593 /* Get monitor where window is on */
xfdashboard_window_tracker_window_get_monitor(XfdashboardWindowTrackerWindow * self)594 XfdashboardWindowTrackerMonitor* xfdashboard_window_tracker_window_get_monitor(XfdashboardWindowTrackerWindow *self)
595 {
596 XfdashboardWindowTrackerWindowInterface *iface;
597
598 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), NULL);
599
600 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
601
602 /* Call virtual function */
603 if(iface->get_monitor)
604 {
605 return(iface->get_monitor(self));
606 }
607
608 /* If we get here the virtual function was not overridden */
609 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "get_monitor");
610 return(NULL);
611 }
612
613 /* Determine if window is on requested monitor */
xfdashboard_window_tracker_window_is_on_monitor(XfdashboardWindowTrackerWindow * self,XfdashboardWindowTrackerMonitor * inMonitor)614 gboolean xfdashboard_window_tracker_window_is_on_monitor(XfdashboardWindowTrackerWindow *self,
615 XfdashboardWindowTrackerMonitor *inMonitor)
616 {
617 XfdashboardWindowTrackerWindowInterface *iface;
618
619 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), FALSE);
620
621 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
622
623 /* Call virtual function */
624 if(iface->is_on_monitor)
625 {
626 return(iface->is_on_monitor(self, inMonitor));
627 }
628
629 /* If we get here the virtual function was not overridden */
630 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "is_on_monitor");
631 return(FALSE);
632 }
633
634 /* Get geometry of window */
xfdashboard_window_tracker_window_get_geometry(XfdashboardWindowTrackerWindow * self,gint * outX,gint * outY,gint * outWidth,gint * outHeight)635 void xfdashboard_window_tracker_window_get_geometry(XfdashboardWindowTrackerWindow *self,
636 gint *outX,
637 gint *outY,
638 gint *outWidth,
639 gint *outHeight)
640 {
641 XfdashboardWindowTrackerWindowInterface *iface;
642 gint x, y, width, height;
643
644 g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self));
645
646 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
647
648 /* Get window geometry */
649 if(iface->get_geometry)
650 {
651 /* Get geometry */
652 iface->get_geometry(self, &x, &y, &width, &height);
653
654 /* Set result */
655 if(outX) *outX=x;
656 if(outX) *outY=y;
657 if(outWidth) *outWidth=width;
658 if(outHeight) *outHeight=height;
659
660 return;
661 }
662
663 /* If we get here the virtual function was not overridden */
664 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "get_geometry");
665 }
666
667 /* Set geometry of window */
xfdashboard_window_tracker_window_set_geometry(XfdashboardWindowTrackerWindow * self,gint inX,gint inY,gint inWidth,gint inHeight)668 void xfdashboard_window_tracker_window_set_geometry(XfdashboardWindowTrackerWindow *self,
669 gint inX,
670 gint inY,
671 gint inWidth,
672 gint inHeight)
673 {
674 XfdashboardWindowTrackerWindowInterface *iface;
675
676 g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self));
677
678 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
679
680 /* Call virtual function */
681 if(iface->set_geometry)
682 {
683 iface->set_geometry(self, inX, inY, inWidth, inHeight);
684 return;
685 }
686
687 /* If we get here the virtual function was not overridden */
688 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "set_geometry");
689 }
690
691 /* Move window */
xfdashboard_window_tracker_window_move(XfdashboardWindowTrackerWindow * inWindow,gint inX,gint inY)692 void xfdashboard_window_tracker_window_move(XfdashboardWindowTrackerWindow *inWindow,
693 gint inX,
694 gint inY)
695 {
696 xfdashboard_window_tracker_window_set_geometry(inWindow, inX, inY, -1, -1);
697 }
698
699 /* Resize window */
xfdashboard_window_tracker_window_resize(XfdashboardWindowTrackerWindow * inWindow,gint inWidth,gint inHeight)700 void xfdashboard_window_tracker_window_resize(XfdashboardWindowTrackerWindow *inWindow,
701 gint inWidth,
702 gint inHeight)
703 {
704 xfdashboard_window_tracker_window_set_geometry(inWindow, -1, -1, inWidth, inHeight);
705 }
706
707 /* Activate window with its transient windows */
xfdashboard_window_tracker_window_activate(XfdashboardWindowTrackerWindow * self)708 void xfdashboard_window_tracker_window_activate(XfdashboardWindowTrackerWindow *self)
709 {
710 XfdashboardWindowTrackerWindowInterface *iface;
711
712 g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self));
713
714 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
715
716 /* Call virtual function */
717 if(iface->activate)
718 {
719 iface->activate(self);
720 return;
721 }
722
723 /* If we get here the virtual function was not overridden */
724 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "activate");
725 }
726
727 /* Close window */
xfdashboard_window_tracker_window_close(XfdashboardWindowTrackerWindow * self)728 void xfdashboard_window_tracker_window_close(XfdashboardWindowTrackerWindow *self)
729 {
730 XfdashboardWindowTrackerWindowInterface *iface;
731
732 g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self));
733
734 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
735
736 /* Call virtual function */
737 if(iface->close)
738 {
739 iface->close(self);
740 return;
741 }
742
743 /* If we get here the virtual function was not overridden */
744 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "close");
745 }
746
747 /* Determine if window is a stage window */
xfdashboard_window_tracker_window_is_stage(XfdashboardWindowTrackerWindow * self)748 gboolean xfdashboard_window_tracker_window_is_stage(XfdashboardWindowTrackerWindow *self)
749 {
750 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), FALSE);
751
752 return(xfdashboard_window_tracker_window_get_stage(self)!=NULL);
753 }
754
755 /* Get stage for requested window */
756 /**
757 * xfdashboard_window_tracker_window_get_stage:
758 * @self: A #XfdashboardWindowTrackerWindow
759 *
760 * Get stage for requested stage window @self from default window tracker backend.
761 *
762 * This function is the logical equivalent of:
763 *
764 * |[<!-- language="C" -->
765 * XfdashboardWindowTrackerBackend *backend;
766 * ClutterStage *stage;
767 *
768 * backend=xfdashboard_window_tracker_backend_get_default();
769 * stage=xfdashboard_window_tracker_backend_get_stage_from_window(backend, self);
770 * g_object_unref(backend);
771 * ]|
772 *
773 * Return value: (transfer none): The #ClutterStage for stage window @self or
774 * %NULL if @self is not a stage window or stage could not be found.
775 */
xfdashboard_window_tracker_window_get_stage(XfdashboardWindowTrackerWindow * self)776 ClutterStage* xfdashboard_window_tracker_window_get_stage(XfdashboardWindowTrackerWindow *self)
777 {
778 XfdashboardWindowTrackerBackend *backend;
779 ClutterStage *stage;
780
781 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), NULL);
782
783 /* Get default window tracker backend */
784 backend=xfdashboard_window_tracker_backend_get_default();
785 if(!backend)
786 {
787 g_critical("Could not get default window tracker backend");
788 return(NULL);
789 }
790
791 /* Redirect function to window tracker backend */
792 stage=xfdashboard_window_tracker_backend_get_stage_from_window(backend, self);
793
794 /* Release allocated resources */
795 if(backend) g_object_unref(backend);
796
797 /* Return the stage found */
798 return(stage);
799 }
800
801 /**
802 * xfdashboard_window_tracker_window_show_stage:
803 * @self: A #XfdashboardWindowTrackerWindow
804 *
805 * Asks the default window tracker backend to set up and show the window @self
806 * for use as stage window.
807 *
808 * This function is the logical equivalent of:
809 *
810 * |[<!-- language="C" -->
811 * XfdashboardWindowTrackerBackend *backend;
812 *
813 * backend=xfdashboard_window_tracker_backend_get_default();
814 * xfdashboard_window_tracker_backend_show_stage_window(backend, self);
815 * g_object_unref(backend);
816 * ]|
817 */
xfdashboard_window_tracker_window_show_stage(XfdashboardWindowTrackerWindow * self)818 void xfdashboard_window_tracker_window_show_stage(XfdashboardWindowTrackerWindow *self)
819 {
820 XfdashboardWindowTrackerBackend *backend;
821
822 g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self));
823
824 /* Get default window tracker backend */
825 backend=xfdashboard_window_tracker_backend_get_default();
826 if(!backend)
827 {
828 g_critical("Could not get default window tracker backend");
829 return;
830 }
831
832 /* Redirect function to window tracker backend */
833 xfdashboard_window_tracker_backend_show_stage_window(backend, self);
834
835 /* Release allocated resources */
836 if(backend) g_object_unref(backend);
837 }
838
839 /**
840 * xfdashboard_window_tracker_window_hide_stage:
841 * @self: A #XfdashboardWindowTrackerWindow
842 *
843 * Asks the default window tracker backend to hide the stage window @self.
844 * This function is the logical equivalent of:
845 *
846 * |[<!-- language="C" -->
847 * XfdashboardWindowTrackerBackend *backend;
848 *
849 * backend=xfdashboard_window_tracker_backend_get_default();
850 * xfdashboard_window_tracker_backend_hide_stage_window(backend, self);
851 * g_object_unref(backend);
852 * ]|
853 */
xfdashboard_window_tracker_window_hide_stage(XfdashboardWindowTrackerWindow * self)854 void xfdashboard_window_tracker_window_hide_stage(XfdashboardWindowTrackerWindow *self)
855 {
856 XfdashboardWindowTrackerBackend *backend;
857
858 g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self));
859
860 /* Get default window tracker backend */
861 backend=xfdashboard_window_tracker_backend_get_default();
862 if(!backend)
863 {
864 g_critical("Could not get default window tracker backend");
865 return;
866 }
867
868 /* Redirect function to window tracker backend */
869 xfdashboard_window_tracker_backend_hide_stage_window(backend, self);
870
871 /* Release allocated resources */
872 if(backend) g_object_unref(backend);
873 }
874
875 /* Get process ID owning the requested window */
xfdashboard_window_tracker_window_get_pid(XfdashboardWindowTrackerWindow * self)876 gint xfdashboard_window_tracker_window_get_pid(XfdashboardWindowTrackerWindow *self)
877 {
878 XfdashboardWindowTrackerWindowInterface *iface;
879
880 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), -1);
881
882 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
883
884 /* Call virtual function */
885 if(iface->get_pid)
886 {
887 return(iface->get_pid(self));
888 }
889
890 /* If we get here the virtual function was not overridden */
891 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "get_pid");
892 return(-1);
893 }
894
895 /* Get all possible instance name for window, e.g. class name, instance name.
896 * Caller is responsible to free result with g_strfreev() if not NULL.
897 */
xfdashboard_window_tracker_window_get_instance_names(XfdashboardWindowTrackerWindow * self)898 gchar** xfdashboard_window_tracker_window_get_instance_names(XfdashboardWindowTrackerWindow *self)
899 {
900 XfdashboardWindowTrackerWindowInterface *iface;
901
902 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), NULL);
903
904 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
905
906 /* Call virtual function */
907 if(iface->get_instance_names)
908 {
909 return(iface->get_instance_names(self));
910 }
911
912 /* If we get here the virtual function was not overridden */
913 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "get_instance_names");
914 return(NULL);
915 }
916
917 /* Get content for this window for use in actors.
918 * Caller is responsible to remove reference with g_object_unref().
919 */
xfdashboard_window_tracker_window_get_content(XfdashboardWindowTrackerWindow * self)920 ClutterContent* xfdashboard_window_tracker_window_get_content(XfdashboardWindowTrackerWindow *self)
921 {
922 XfdashboardWindowTrackerWindowInterface *iface;
923
924 g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(self), NULL);
925
926 iface=XFDASHBOARD_WINDOW_TRACKER_WINDOW_GET_IFACE(self);
927
928 /* Call virtual function */
929 if(iface->get_content)
930 {
931 return(iface->get_content(self));
932 }
933
934 /* If we get here the virtual function was not overridden */
935 XFDASHBOARD_WINDOWS_TRACKER_WINDOW_WARN_NOT_IMPLEMENTED(self, "get_content");
936 return(NULL);
937 }
938