1 /*
2 * This file is a part of the Cairo-Dock project
3 *
4 * Copyright : (C) see the 'copyright' file.
5 * E-mail    : see the 'copyright' file.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 3
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #ifndef __GLDI_WINDOWS_MANAGER__
21 #define  __GLDI_WINDOWS_MANAGER__
22 
23 #include "cairo-dock-struct.h"
24 #include "cairo-dock-manager.h"
25 G_BEGIN_DECLS
26 
27 /**
28 *@file cairo-dock-windows-manager.h This class manages the windows actors and notifies for any change on them.
29 */
30 
31 // manager
32 typedef struct _GldiWindowsManager GldiWindowsManager;
33 
34 #ifndef _MANAGER_DEF_
35 extern GldiObjectManager myWindowObjectMgr;
36 #endif
37 
38 /// signals
39 typedef enum {
40 	NOTIFICATION_WINDOW_CREATED = NB_NOTIFICATIONS_OBJECT,
41 	NOTIFICATION_WINDOW_DESTROYED,
42 	NOTIFICATION_WINDOW_NAME_CHANGED,
43 	NOTIFICATION_WINDOW_ICON_CHANGED,
44 	NOTIFICATION_WINDOW_ATTENTION_CHANGED,
45 	NOTIFICATION_WINDOW_SIZE_POSITION_CHANGED,
46 	NOTIFICATION_WINDOW_STATE_CHANGED,
47 	NOTIFICATION_WINDOW_CLASS_CHANGED,
48 	NOTIFICATION_WINDOW_Z_ORDER_CHANGED,
49 	NOTIFICATION_WINDOW_ACTIVATED,
50 	NOTIFICATION_WINDOW_DESKTOP_CHANGED,
51 	NB_NOTIFICATIONS_WINDOWS
52 	} GldiWindowNotifications;
53 
54 // data
55 
56 /// Definition of the Windows Manager backend.
57 struct _GldiWindowManagerBackend {
58 	GldiWindowActor* (*get_active_window) (void);
59 	void (*move_to_nth_desktop) (GldiWindowActor *actor, int iNumDesktop, int iDeltaViewportX, int iDeltaViewportY);
60 	void (*show) (GldiWindowActor *actor);
61 	void (*close) (GldiWindowActor *actor);
62 	void (*kill) (GldiWindowActor *actor);
63 	void (*minimize) (GldiWindowActor *actor);
64 	void (*lower) (GldiWindowActor *actor);
65 	void (*maximize) (GldiWindowActor *actor, gboolean bMaximize);
66 	void (*set_fullscreen) (GldiWindowActor *actor, gboolean bFullScreen);
67 	void (*set_above) (GldiWindowActor *actor, gboolean bAbove);
68 	void (*set_minimize_position) (GldiWindowActor *actor, int x, int y);
69 	void (*set_thumbnail_area) (GldiWindowActor *actor, int x, int y, int w, int h);
70 	void (*set_window_border) (GldiWindowActor *actor, gboolean bWithBorder);
71 	cairo_surface_t* (*get_icon_surface) (GldiWindowActor *actor, int iWidth, int iHeight);
72 	cairo_surface_t* (*get_thumbnail_surface) (GldiWindowActor *actor, int iWidth, int iHeight);
73 	GLuint (*get_texture) (GldiWindowActor *actor);
74 	GldiWindowActor* (*get_transient_for) (GldiWindowActor *actor);
75 	void (*is_above_or_below) (GldiWindowActor *actor, gboolean *bIsAbove, gboolean *bIsBelow);
76 	gboolean (*is_sticky) (GldiWindowActor *actor);
77 	void (*set_sticky) (GldiWindowActor *actor, gboolean bSticky);
78 	void (*can_minimize_maximize_close) (GldiWindowActor *actor, gboolean *bCanMinimize, gboolean *bCanMaximize, gboolean *bCanClose);
79 	guint (*get_id) (GldiWindowActor *actor);
80 	GldiWindowActor* (*pick_window) (void);  // grab the mouse, wait for a click, then get the clicked window and returns its actor
81 	} ;
82 
83 /// Definition of a window actor.
84 struct _GldiWindowActor {
85 	GldiObject object;
86 	gboolean bDisplayed;  /// not used yet...
87 	gboolean bIsHidden;
88 	gboolean bIsFullScreen;
89 	gboolean bIsMaximized;
90 	gboolean bDemandsAttention;
91 	GtkAllocation windowGeometry;
92 	gint iNumDesktop;  // can be -1
93 	gint iViewPortX, iViewPortY;
94 	gint iStackOrder;
95 	gchar *cClass;
96 	gchar *cWmClass;
97 	gchar *cName;
98 	gchar *cLastAttentionDemand;
99 	gint iAge;  // age of the window (a mere growing integer).
100 	gboolean bIsTransientFor;  // TRUE if the window is transient (for a parent window).
101 	};
102 
103 
104 /** Register a Window Manager backend. NULL functions are simply ignored.
105 *@param pBackend a Window Manager backend
106 */
107 void gldi_windows_manager_register_backend (GldiWindowManagerBackend *pBackend);
108 
109 /** Run a function on each window actor.
110 *@param bOrderedByZ TRUE to sort by z-order, FALSE to sort by age
111 *@param callback the callback
112 *@param data user data
113 */
114 void gldi_windows_foreach (gboolean bOrderedByZ, GFunc callback, gpointer data);
115 
116 /** Run a function on each window actor.
117 *@param callback the callback (takes the actor and the data, returns TRUE to stop)
118 *@param data user data
119 *@return the found actor, or NULL
120 */
121 GldiWindowActor *gldi_windows_find (gboolean (*callback) (GldiWindowActor*, gpointer), gpointer data);
122 
123 /** Get the current active window actor.
124 *@return the actor, or NULL if no window is currently active
125 */
126 GldiWindowActor* gldi_windows_get_active (void);
127 
128 
129 void gldi_window_move_to_desktop (GldiWindowActor *actor, int iNumDesktop, int iNumViewportX, int iNumViewportY);
130 
131 void gldi_window_show (GldiWindowActor *actor);
132 void gldi_window_close (GldiWindowActor *actor);
133 void gldi_window_kill (GldiWindowActor *actor);
134 void gldi_window_minimize (GldiWindowActor *actor);
135 void gldi_window_lower (GldiWindowActor *actor);
136 void gldi_window_maximize (GldiWindowActor *actor, gboolean bMaximize);
137 void gldi_window_set_fullscreen (GldiWindowActor *actor, gboolean bFullScreen);
138 void gldi_window_set_above (GldiWindowActor *actor, gboolean bAbove);
139 
140 void gldi_window_set_minimize_position (GldiWindowActor *actor, int x, int y);
141 
142 void gldi_window_set_thumbnail_area (GldiWindowActor *actor, int x, int y, int w, int h);
143 
144 void gldi_window_set_border (GldiWindowActor *actor, gboolean bWithBorder);
145 
146 cairo_surface_t* gldi_window_get_icon_surface (GldiWindowActor *actor, int iWidth, int iHeight);
147 
148 cairo_surface_t* gldi_window_get_thumbnail_surface (GldiWindowActor *actor, int iWidth, int iHeight);
149 
150 GLuint gldi_window_get_texture (GldiWindowActor *actor);
151 
152 GldiWindowActor* gldi_window_get_transient_for (GldiWindowActor *actor);
153 
154 void gldi_window_is_above_or_below (GldiWindowActor *actor, gboolean *bIsAbove, gboolean *bIsBelow);
155 
156 gboolean gldi_window_is_sticky (GldiWindowActor *actor);
157 
158 void gldi_window_set_sticky (GldiWindowActor *actor, gboolean bSticky);
159 
160 void gldi_window_can_minimize_maximize_close (GldiWindowActor *actor, gboolean *bCanMinimize, gboolean *bCanMaximize, gboolean *bCanClose);
161 
162 
163 gboolean gldi_window_is_on_current_desktop (GldiWindowActor *actor);
164 
165 gboolean gldi_window_is_on_desktop (GldiWindowActor *pAppli, int iNumDesktop, int iNumViewportX, int iNumViewportY);
166 
167 void gldi_window_move_to_current_desktop (GldiWindowActor *pAppli);
168 
169 guint gldi_window_get_id (GldiWindowActor *pAppli);
170 
171 GldiWindowActor *gldi_window_pick (void);
172 
173 
174 void gldi_register_windows_manager (void);
175 
176 G_END_DECLS
177 #endif
178