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