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