source: trunk/third/gnome-core/panel/gwmh.h @ 15821

Revision 15821, 12.6 KB checked in by ghudson, 24 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r15820, which included commits to RCS files with non-trunk default branches.
Line 
1/* gwmh.h - GNOME WM interaction helper functions
2 * Copyright (C) 1999 Tim Janik
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public
15 * License along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
17 *
18 * this code is heavily based on the original gnomepager_applet
19 * implementation of The Rasterman (Carsten Haitzler) <raster@rasterman.com>
20 */
21#ifndef __GWMH_H__
22#define __GWMH_H__
23
24#include        <gnome.h>
25
26#ifdef __cplusplus
27extern "C" {
28#endif /* __cplusplus */
29
30/* FIXME: this works around old glib versions (pre 1.2.2) */
31#undef G_GNUC_FUNCTION
32#undef G_GNUC_PRETTY_FUNCTION
33#ifdef  __GNUC__
34#define G_GNUC_FUNCTION         __FUNCTION__
35#define G_GNUC_PRETTY_FUNCTION  __PRETTY_FUNCTION__
36#else   /* !__GNUC__ */
37#define G_GNUC_FUNCTION         ""
38#define G_GNUC_PRETTY_FUNCTION  ""
39#endif  /* !__GNUC__ */
40
41
42/* --- preinitialized Atoms --- */
43extern gulong GWMHA_WIN_SUPPORTING_WM_CHECK;
44extern gulong GWMHA_WIN_PROTOCOLS;
45extern gulong GWMHA_WIN_LAYER;
46extern gulong GWMHA_WIN_STATE;
47extern gulong GWMHA_WIN_HINTS;
48extern gulong GWMHA_WIN_APP_STATE;
49extern gulong GWMHA_WIN_EXPANDED_SIZE;
50extern gulong GWMHA_WIN_ICONS;
51extern gulong GWMHA_WIN_WORKSPACE;
52extern gulong GWMHA_WIN_WORKSPACE_COUNT;
53extern gulong GWMHA_WIN_WORKSPACE_NAMES;
54extern gulong GWMHA_WIN_CLIENT_LIST;
55extern gulong GWMHA_WIN_AREA;
56extern gulong GWMHA_WIN_AREA_COUNT;
57
58
59/* --- enum values --- */
60typedef enum
61{
62  GWMH_LAYER_DESKTOP     = 0,
63  GWMH_LAYER_BELOW       = 2,
64  GWMH_LAYER_NORMAL      = 4,
65  GWMH_LAYER_ONTOP       = 6,
66  GWMH_LAYER_DOCK        = 8,
67  GWMH_LAYER_ABOVE_DOCK  = 10
68} GwmhLayer;
69typedef enum
70{
71  GWMH_STATE_STICKY          = (1<<0), /* window appears on all desktops+areas */
72  GWMH_STATE_MINIMIZED       = (1<<1), /* ??? */
73  GWMH_STATE_MAXIMIZED_VERT  = (1<<2), /* window vertically maximized */
74  GWMH_STATE_MAXIMIZED_HORIZ = (1<<3), /* window horizontally maximized */
75  GWMH_STATE_HIDDEN          = (1<<4), /* ??? */
76  GWMH_STATE_SHADED          = (1<<5), /* only show window's wm decorations */
77  GWMH_STATE_HID_WORKSPACE   = (1<<6), /* ??? */
78  GWMH_STATE_HID_TRANSIENT   = (1<<7), /* owner of transient is hidden */
79  GWMH_STATE_FIXED_POSITION  = (1<<8), /* don't scroll with area */
80  GWMH_STATE_ARRANGE_IGNORE  = (1<<9)  /* ignore for auto arranging */
81} GwmhState;
82typedef enum
83{
84  GWMH_HINTS_SKIP_FOCUS      = (1<<0), /* no ALT+Tab focussing */
85  GWMH_HINTS_SKIP_WINLIST    = (1<<1), /* not in win list */
86  GWMH_HINTS_SKIP_TASKBAR    = (1<<2), /* not on taskbar */
87  GWMH_HINTS_GROUP_TRANSIENT = (1<<3), /* ??? */
88  GWMH_HINTS_FOCUS_ON_CLICK  = (1<<4), /* app only accepts focus when clicked */
89  GWMH_HINTS_DO_NOT_COVER    = (1<<5)  /* attempt to not cover this window */
90} GwmhHints;
91
92
93/* --- GMainLoop priority for update handler --- */
94#define GWMH_PRIORITY_UPDATE      (GTK_PRIORITY_RESIZE - 1)
95
96
97/* --- GwmhTask macros --- */
98#define GWMH_TASK(t)                 ((GwmhTask*) (t))
99#define GWMH_TASK_GSTATE(t)          (GWMH_TASK (t)->gstate /*GNOME*/)
100#define GWMH_TASK_GHINTS(t)          (GWMH_TASK (t)->ghints /*GNOME*/)
101#define GWMH_TASK_APP_STATE(t)       (GWMH_TASK (t)->app_state /*GNOME*/)
102#define GWMH_TASK_FOCUSED(t)         (GWMH_TASK (t)->focused)
103#define GWMH_TASK_ICONIFIED(t)       (GWMH_TASK (t)->iconified)
104#define GWMH_TASK_STICKY(t)          ((GWMH_TASK_GSTATE (t) & GWMH_STATE_STICKY) != 0)
105#define GWMH_TASK_MINIMIZED(t)       ((GWMH_TASK_GSTATE (t) & GWMH_STATE_MINIMIZED) != 0)
106#define GWMH_TASK_MAXIMIZED_VERT(t)  ((GWMH_TASK_GSTATE (t) & GWMH_STATE_MAXIMIZED_VERT) != 0)
107#define GWMH_TASK_MAXIMIZED_HORIZ(t) ((GWMH_TASK_GSTATE (t) & GWMH_STATE_MAXIMIZED_HORIZ) != 0)
108#define GWMH_TASK_HIDDEN(t)          ((GWMH_TASK_GSTATE (t) & GWMH_STATE_HIDDEN) != 0)
109#define GWMH_TASK_SHADED(t)          ((GWMH_TASK_GSTATE (t) & GWMH_STATE_SHADED) != 0)
110#define GWMH_TASK_HID_WORKSPACE(t)   ((GWMH_TASK_GSTATE (t) & GWMH_STATE_HID_WORKSPACE) != 0)
111#define GWMH_TASK_FIXED_POS(t)       ((GWMH_TASK_GSTATE (t) & GWMH_STATE_FIXED_POSITION) != 0)
112#define GWMH_TASK_SKIP_FOCUS(t)      ((GWMH_TASK_GHINTS (t) & GWMH_HINTS_SKIP_FOCUS) != 0)
113#define GWMH_TASK_SKIP_WINLIST(t)    ((GWMH_TASK_GHINTS (t) & GWMH_HINTS_SKIP_WINLIST) != 0)
114#define GWMH_TASK_SKIP_TASKBAR(t)    ((GWMH_TASK_GHINTS (t) & GWMH_HINTS_SKIP_TASKBAR) != 0)
115#define GWMH_TASK_GROUP_TRANSIENT(t) ((GWMH_TASK_GHINTS (t) & GWMH_HINTS_GROUP_TRANSIENT) != 0)
116#define GWMH_TASK_FOCUS_ON_CLICK(t)  ((GWMH_TASK_GHINTS (t) & GWMH_HINTS_FOCUS_ON_CLICK) != 0)
117#define GWMH_TASK_DO_NOT_COVER(t)    ((GWMH_TASK_GHINTS (t) & GWMH_HINTS_DO_NOT_COVER) != 0)
118#define GWMH_TASK_UPDATE_QUEUED(t)   ((GWMH_TASK (t)->imask_queued | \
119                                       GWMH_TASK (t)->imask_notify) != 0)
120
121
122/* --- typedefs --- */
123typedef struct _GwmhTask        GwmhTask;
124typedef struct _GwmhDesk        GwmhDesk;
125typedef struct _GwmhMiniIcon    GwmhMiniIcon;
126
127typedef enum
128{
129  GWMH_TASK_INFO_MISC        = 1 <<  0,
130  GWMH_TASK_INFO_GSTATE      = 1 <<  1,
131  GWMH_TASK_INFO_GHINTS      = 1 <<  2,
132  GWMH_TASK_INFO_APP_STATE   = 1 <<  3,
133  GWMH_TASK_INFO_FOCUSED     = 1 <<  4,
134  GWMH_TASK_INFO_ICONIFIED   = 1 <<  5,
135
136  /* should only be evaluated in notifiers */
137  GWMH_TASK_INFO_DESKTOP     = 1 <<  6,
138  GWMH_TASK_INFO_AREA        = 1 <<  7,
139  GWMH_TASK_INFO_LAYER       = 1 <<  8,
140  GWMH_TASK_INFO_FRAME_GEO   = 1 <<  9,
141  GWMH_TASK_INFO_WIN_GEO     = 1 << 10,
142  GWMH_TASK_INFO_ALLOCATION  = (GWMH_TASK_INFO_FRAME_GEO |
143                                GWMH_TASK_INFO_WIN_GEO),
144
145  /* use this for updates */
146  GWMH_TASK_INFO_GEOMETRY    = (GWMH_TASK_INFO_DESKTOP |
147                                GWMH_TASK_INFO_AREA |
148                                GWMH_TASK_INFO_ALLOCATION),
149
150  /* pure user notification flags (not used to update task structure) */
151  GWMH_TASK_INFO_WM_HINTS    = 1 <<  11,
152  GWMH_TASK_INFO_UNOTIFY     = (GWMH_TASK_INFO_WM_HINTS),
153
154  GWMH_TASK_INFO_ALL     = (GWMH_TASK_INFO_MISC |
155                            GWMH_TASK_INFO_GSTATE |
156                            GWMH_TASK_INFO_GHINTS |
157                            GWMH_TASK_INFO_APP_STATE |
158                            GWMH_TASK_INFO_FOCUSED |
159                            GWMH_TASK_INFO_ICONIFIED |
160                            GWMH_TASK_INFO_GEOMETRY |
161                            GWMH_TASK_INFO_LAYER |
162                            GWMH_TASK_INFO_UNOTIFY)
163} GwmhTaskInfoMask;
164
165
166/* --- structures --- */
167struct _GwmhDesk
168{
169  guint   n_desktops;
170  guint   n_hareas;
171  guint   n_vareas;
172
173  gchar **desktop_names;
174
175  guint   current_desktop;
176  guint   current_harea;
177  guint   current_varea;
178
179  GList  *client_list;
180
181  guint   detected_gnome_wm : 1;
182  guint   unified_area : 1;
183};
184struct _GwmhTask
185{
186  gchar     *name;
187  gchar     *icon_name;
188 
189  /* window's state and hints */
190  GwmhState        gstate;
191  GwmhHints        ghints;
192  GnomeWinAppState app_state;
193  guint            focused : 1;
194  guint            iconified : 1;
195 
196  /* frame geometry */
197  gint       frame_x, frame_y;
198  gint       frame_width, frame_height;
199  /* window geometry (within frame) */
200  gint       win_x, win_y;
201  gint       win_width, win_height;
202
203  /* desktop, desktop area, layer */
204  guint16    desktop;
205  guint16    harea, varea;
206  guint16    layer;
207  guint16    last_desktop;
208  guint16    last_harea, last_varea;
209  guint16    last_layer;
210
211  /* GdkWindow proxies */
212  GdkWindow *gdkwindow;
213  GdkWindow *gdkframe;
214
215  /* private */
216  GData           *datalist;
217  gulong           xwin;
218  gulong           xframe;
219  gpointer         sroot;
220  GwmhTaskInfoMask imask_queued;
221  GwmhTaskInfoMask imask_notify;
222};
223
224struct _GwmhMiniIcon
225{
226  GdkPixmap *pixmap;
227  GdkBitmap *mask;
228};
229
230/* --- notifications --- */
231typedef enum
232{
233  GWMH_DESK_INFO_DESKTOP_NAMES          = 1 << 0,
234  GWMH_DESK_INFO_N_DESKTOPS             = 1 << 1,
235  GWMH_DESK_INFO_N_AREAS                = 1 << 2,
236  GWMH_DESK_INFO_CURRENT_DESKTOP        = 1 << 3,
237  GWMH_DESK_INFO_CURRENT_AREA           = 1 << 4,
238  GWMH_DESK_INFO_CLIENT_LIST            = 1 << 5,
239  GWMH_DESK_INFO_ALL                    = (GWMH_DESK_INFO_DESKTOP_NAMES |
240                                           GWMH_DESK_INFO_N_DESKTOPS |
241                                           GWMH_DESK_INFO_N_AREAS |
242                                           GWMH_DESK_INFO_CURRENT_DESKTOP |
243                                           GWMH_DESK_INFO_CURRENT_AREA |
244                                           GWMH_DESK_INFO_CLIENT_LIST),
245  GWMH_DESK_INFO_HACK_FLAG              = 1 << 6,
246  GWMH_DESK_INFO_FORCE_EVERYTHING       = (GWMH_DESK_INFO_HACK_FLAG |
247                                           GWMH_DESK_INFO_ALL),
248  GWMH_DESK_INFO_BOOTUP                 = 1 << 7
249} GwmhDeskInfoMask;
250typedef enum
251{
252  GWMH_NOTIFY_INFO_CHANGED, /* features GwmhTaskInfoMask imask */
253  GWMH_NOTIFY_NEW,
254  GWMH_NOTIFY_DESTROY,
255  GWMH_NOTIFY_LAST
256} GwmhTaskNotifyType;
257
258typedef gboolean (*GwmhDeskNotifierFunc) (gpointer            func_data,
259                                          GwmhDesk           *desk,
260                                          GwmhDeskInfoMask    change_mask);
261typedef gboolean (*GwmhTaskNotifierFunc) (gpointer            func_data,
262                                          GwmhTask           *task,
263                                          GwmhTaskNotifyType  ntype,
264                                          GwmhTaskInfoMask    imask);
265
266
267/* init GNOME WM Helper code, i.e. watch out for property changes
268 * on the root window. returns whether gwmh code is at all usable,
269 * depending on whether we have a GNOME compliant window manager.
270 */
271gboolean        gwmh_init                       (void);
272
273/* --- notifiers --- */
274guint           gwmh_desk_notifier_add          (GwmhDeskNotifierFunc func,
275                                                 gpointer             func_data);
276void            gwmh_desk_notifier_remove       (guint                id);
277void            gwmh_desk_notifier_remove_func  (GwmhDeskNotifierFunc func,
278                                                 gpointer             func_data);
279guint           gwmh_task_notifier_add          (GwmhTaskNotifierFunc func,
280                                                 gpointer             func_data);
281void            gwmh_task_notifier_remove       (guint                id);
282void            gwmh_task_notifier_remove_func  (GwmhTaskNotifierFunc func,
283                                                 gpointer             func_data);
284
285/* --- GwmhDesk --- */
286void            gwmh_desk_queue_update          (GwmhDeskInfoMask imask);
287GwmhDesk*       gwmh_desk_get_config            (void);
288void            gwmh_desk_set_current_desktop   (guint           desktop);
289void            gwmh_desk_set_current_area      (guint           desktop,
290                                                 guint           harea,
291                                                 guint           varea);
292void            gwmh_desk_set_desktop_name      (guint           desktop,
293                                                 const gchar    *name);
294void            gwmh_desk_guess_desktop_area    (guint           desktop,
295                                                 guint          *harea,
296                                                 guint          *varea);
297void            gwmh_desk_set_hack_values       (gboolean        unified_areas,
298                                                 gboolean        violate_client_msg);
299
300
301/* --- GwmhTask --- */
302void            gwmh_task_queue_update          (GwmhTask        *task,
303                                                 GwmhTaskInfoMask imask);
304GwmhTask*       gwmh_task_from_window           (GdkWindow       *window);
305void            gwmh_task_set_qdata_full        (GwmhTask       *task,
306                                                 GQuark          quark,
307                                                 gpointer        data,
308                                                 GDestroyNotify  destroy);
309gpointer        gwmh_task_get_qdata             (GwmhTask       *task,
310                                                 GQuark          quark);
311gpointer        gwmh_task_steal_qdata           (GwmhTask       *task,
312                                                 GQuark          quark);
313void            gwmh_task_get_frame_area_pos    (GwmhTask        *task,
314                                                 gint            *x_p,
315                                                 gint            *y_p);
316gboolean        gwmh_task_close                 (GwmhTask        *task);
317void            gwmh_task_kill                  (GwmhTask        *task);
318void            gwmh_task_iconify               (GwmhTask        *task);
319void            gwmh_task_deiconify             (GwmhTask        *task);
320void            gwmh_task_focus                 (GwmhTask        *task);
321void            gwmh_task_raise                 (GwmhTask        *task);
322void            gwmh_task_show                  (GwmhTask        *task);
323void            gwmh_task_set_gstate_flags      (GwmhTask        *task,
324                                                 GwmhState        flags);
325void            gwmh_task_unset_gstate_flags    (GwmhTask        *task,
326                                                 GwmhState        flags);
327void            gwmh_task_set_ghint_flags       (GwmhTask        *task,
328                                                 GwmhHints        flags);
329void            gwmh_task_unset_ghint_flags     (GwmhTask        *task,
330                                                 GwmhHints        flags);
331void            gwmh_task_set_app_state         (GwmhTask        *task,
332                                                 GnomeWinAppState app_state);
333void            gwmh_task_set_layer             (GwmhTask        *task,
334                                                 GwmhLayer        layer);
335void            gwmh_task_set_desktop           (GwmhTask        *task,
336                                                 guint            desktop);
337void            gwmh_task_set_area              (GwmhTask        *task,
338                                                 guint            desktop,
339                                                 guint            harea,
340                                                 guint            varea);
341void            gwmh_task_get_mini_icon         (GwmhTask        *task,
342                                                 GdkPixmap      **pixmap,
343                                                 GdkBitmap      **mask);
344
345/* task list functions, task list managing needs to be explicitely
346 * enabled since it causes a lot of extra traffic that not all
347 * applications want to deal with. task will automatically be
348 * added/removed from the list as they appear/disappear on the
349 * screen.
350 */
351
352GList*          gwmh_task_list_get              (void);
353GList*          gwmh_task_list_stack_sort       (GList          *task_list);
354
355
356/* --- internal --- */
357void            gwmh_window_send_client_message (GdkWindow *window,
358                                                 gulong     atom,
359                                                 gulong     long1,
360                                                 gulong     long2,
361                                                 gulong     long3,
362                                                 gulong     long4,
363                                                 gulong     long5);
364GdkWindow*      gwmh_root_put_atom_window       (const gchar   *atom_name,
365                                                 GdkWindowType  window_type,
366                                                 GdkWindowClass window_class,
367                                                 GdkEventMask   event_mask);
368
369
370
371
372#ifdef __cplusplus
373}
374#endif /* __cplusplus */
375
376#endif /* __GWMH_H__ */
377
378
379
380
381
Note: See TracBrowser for help on using the repository browser.