2 * ion/ioncore/colormap.c
4 * Copyright (c) Tuomo Valkonen 1999-2007.
6 * Ion is free software; you can redistribute it and/or modify it under
7 * the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
16 #include "clientwin.h"
23 /*{{{ Installing colormaps */
26 void rootwin_install_colormap(WRootWin *rootwin, Colormap cmap)
29 cmap=rootwin->default_cmap;
30 XInstallColormap(ioncore_g.dpy, cmap);
34 void clientwin_install_colormap(WClientWin *cwin)
36 WRootWin *rw=region_rootwin_of((WRegion*)cwin);
40 for(i=cwin->n_cmapwins-1; i>=0; i--){
41 rootwin_install_colormap(rw, cwin->cmaps[i]);
42 if(cwin->cmapwins[i]==cwin->win)
49 rootwin_install_colormap(rw, cwin->cmap);
59 static XContext ctx=None;
62 void xwindow_unmanaged_selectinput(Window win, long mask)
66 /* We may be monitoring for colourmap changes */
68 if(XFindContext(ioncore_g.dpy, win, ctx, (XPointer*)&p)==0){
70 mask|=ColormapChangeMask;
74 XSelectInput(ioncore_g.dpy, win, mask);
79 static void xwindow_selcmap(Window win)
82 XWindowAttributes attr;
87 if(XFindContext(ioncore_g.dpy, win, ctx, (XPointer*)&p)==0){
95 if(XSaveContext(ioncore_g.dpy, win, ctx, (XPointer)p)!=0){
96 warn(TR("Unable to store colourmap watch info."));
100 if(XWINDOW_REGION_OF(win)==NULL){
101 XGetWindowAttributes(ioncore_g.dpy, win, &attr);
102 XSelectInput(ioncore_g.dpy, win,
103 attr.your_event_mask|ColormapChangeMask);
109 static void xwindow_unselcmap(Window win)
112 XWindowAttributes attr;
117 if(XFindContext(ioncore_g.dpy, win, ctx, (XPointer*)&p)==0){
120 XDeleteContext(ioncore_g.dpy, win, ctx);
122 if(XWINDOW_REGION_OF(win)==NULL){
123 XGetWindowAttributes(ioncore_g.dpy, win, &attr);
124 XSelectInput(ioncore_g.dpy, win,
125 attr.your_event_mask&~ColormapChangeMask);
132 void clientwin_get_colormaps(WClientWin *cwin)
135 XWindowAttributes attr;
138 clientwin_clear_colormaps(cwin);
140 n=xwindow_get_property(cwin->win, ioncore_g.atom_wm_colormaps,
141 XA_WINDOW, 100L, TRUE, (uchar**)&wins);
146 cwin->cmaps=ALLOC_N(Colormap, n);
148 if(cwin->cmaps==NULL)
155 if(wins[i]==cwin->win){
156 cwin->cmaps[i]=cwin->cmap;
158 xwindow_selcmap(wins[i]);
159 XGetWindowAttributes(ioncore_g.dpy, wins[i], &attr);
160 cwin->cmaps[i]=attr.colormap;
166 void clientwin_clear_colormaps(WClientWin *cwin)
169 XWindowAttributes attr;
171 if(cwin->n_cmapwins==0)
174 for(i=0; i<cwin->n_cmapwins; i++){
175 if(cwin->cmapwins[i]!=cwin->win)
176 xwindow_unselcmap(cwin->cmapwins[i]);
179 free(cwin->cmapwins);
190 /*{{{ Event handling */
193 static void handle_cwin_cmap(WClientWin *cwin, const XColormapEvent *ev)
197 if(ev->window==cwin->win){
198 cwin->cmap=ev->colormap;
199 if(REGION_IS_ACTIVE(cwin))
200 clientwin_install_colormap(cwin);
202 for(i=0; i<cwin->n_cmapwins; i++){
203 if(cwin->cmapwins[i]!=ev->window)
205 cwin->cmaps[i]=ev->colormap;
206 if(REGION_IS_ACTIVE(cwin))
207 clientwin_install_colormap(cwin);
214 static void handle_all_cmaps(const XColormapEvent *ev)
218 if(!ioncore_clientwin_ns.initialised)
221 rb_traverse(node, ioncore_clientwin_ns.rb){
222 WClientWin *cwin=(WClientWin*)rb_val(node);
224 handle_cwin_cmap(cwin, ev);
230 void ioncore_handle_colormap_notify(const XColormapEvent *ev)
237 cwin=XWINDOW_REGION_OF_T(ev->window, WClientWin);
240 handle_cwin_cmap(cwin, ev);
241 /*set_cmap(cwin, ev->colormap);*/
243 handle_all_cmaps(ev);