]> git.decadent.org.uk Git - ion3.git/blob - mod_statusbar/main.c
c54e17e8d86be0a695659fd2d40fb0f0113acf7a
[ion3.git] / mod_statusbar / main.c
1 /*
2  * ion/mod_statusbar/main.c
3  *
4  * Copyright (c) Tuomo Valkonen 1999-2008. 
5  *
6  * See the included file LICENSE for details.
7  */
8
9 #include <libtu/minmax.h>
10 #include <libextl/readconfig.h>
11 #include <ioncore/saveload.h>
12 #include <ioncore/bindmaps.h>
13 #include <ioncore/global.h>
14 #include <ioncore/ioncore.h>
15
16 #include "statusbar.h"
17 #include "exports.h"
18
19
20 /*{{{ Module information */
21
22
23 #include "../version.h"
24
25 char mod_statusbar_ion_api_version[]=ION_API_VERSION;
26
27
28 /*}}}*/
29
30
31 /*{{{ Bindmaps */
32
33
34 WBindmap *mod_statusbar_statusbar_bindmap=NULL;
35
36
37 /*}}}*/
38
39
40 /*{{{ Systray */
41
42
43 static bool is_systray(WClientWin *cwin)
44 {
45     static Atom atom__kde_net_wm_system_tray_window_for=None;
46     Atom actual_type=None;
47     int actual_format;
48     unsigned long nitems;
49     unsigned long bytes_after;
50     unsigned char *prop;
51     char *dummy;
52     bool is=FALSE;
53
54     if(extl_table_gets_s(cwin->proptab, "statusbar", &dummy)){
55         free(dummy);
56         return TRUE;
57     }
58     
59     if(atom__kde_net_wm_system_tray_window_for==None){
60         atom__kde_net_wm_system_tray_window_for=XInternAtom(ioncore_g.dpy,
61                                                             "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR",
62                                                             False);
63     }
64     if(XGetWindowProperty(ioncore_g.dpy, cwin->win,
65                           atom__kde_net_wm_system_tray_window_for, 0,
66                           sizeof(Atom), False, AnyPropertyType, 
67                           &actual_type, &actual_format, &nitems,
68                           &bytes_after, &prop)==Success){
69         if(actual_type!=None){
70             is=TRUE;
71         }
72         XFree(prop);
73     }
74     
75     return is;
76 }
77
78
79 static bool clientwin_do_manage_hook(WClientWin *cwin, const WManageParams *param)
80 {
81     WStatusBar *sb=NULL;
82     
83     if(!is_systray(cwin))
84         return FALSE;
85     
86     sb=mod_statusbar_find_suitable(cwin, param);
87     if(sb==NULL)
88         return FALSE;
89
90     return region_manage_clientwin((WRegion*)sb, cwin, param,
91                                    MANAGE_PRIORITY_NONE);
92 }
93
94     
95 /*}}}*/
96
97
98 /*{{{ Init & deinit */
99
100
101 void mod_statusbar_deinit()
102 {
103     hook_remove(clientwin_do_manage_alt, 
104                 (WHookDummy*)clientwin_do_manage_hook);
105
106     if(mod_statusbar_statusbar_bindmap!=NULL){
107         ioncore_free_bindmap("WStatusBar", mod_statusbar_statusbar_bindmap);
108         mod_statusbar_statusbar_bindmap=NULL;
109     }
110
111     ioncore_unregister_regclass(&CLASSDESCR(WStatusBar));
112
113     mod_statusbar_unregister_exports();
114 }
115
116
117 bool mod_statusbar_init()
118 {
119     mod_statusbar_statusbar_bindmap=ioncore_alloc_bindmap("WStatusBar", NULL);
120     
121     if(mod_statusbar_statusbar_bindmap==NULL)
122         return FALSE;
123
124     if(!ioncore_register_regclass(&CLASSDESCR(WStatusBar),
125                                   (WRegionLoadCreateFn*) statusbar_load)){
126         mod_statusbar_deinit();
127         return FALSE;
128     }
129
130     if(!mod_statusbar_register_exports()){
131         mod_statusbar_deinit();
132         return FALSE;
133     }
134     
135     hook_add(clientwin_do_manage_alt, 
136              (WHookDummy*)clientwin_do_manage_hook);
137
138     /*ioncore_read_config("cfg_statusbar", NULL, TRUE);*/
139     
140     return TRUE;
141 }
142
143
144 /*}}}*/
145