]> Dogcows Code - chaz/tint2/blob - src/panel.c
fixed issue 13, removed Window magager s menu for stability reason
[chaz/tint2] / src / panel.c
1 /**************************************************************************
2 *
3 * Copyright (C) 2008 Pål Staurland (staura@gmail.com)
4 * Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License version 2
8 * as published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 **************************************************************************/
18
19 #include <stdio.h>
20 #include <X11/Xlib.h>
21 #include <X11/Xutil.h>
22 #include <X11/Xatom.h>
23 #include <cairo.h>
24 #include <cairo-xlib.h>
25 #include <pango/pangocairo.h>
26
27 #include "server.h"
28 #include "window.h"
29 #include "task.h"
30 #include "panel.h"
31
32
33 void visual_refresh ()
34 {
35 if (server.pmap) XFreePixmap (server.dsp, server.pmap);
36 server.pmap = XCreatePixmap (server.dsp, server.root_win, panel.area.width, panel.area.height, server.depth);
37
38 XCopyArea (server.dsp, panel.area.pix.pmap, server.pmap, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0);
39
40 // draw child object
41 GSList *l = panel.area.list;
42 for (; l ; l = l->next)
43 refresh (l->data);
44
45 // main_win doesn't include panel.area.paddingx, so we have WM capabilities on left and right.
46 // this feature is disabled !
47 //XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, panel.area.paddingxlr, 0, panel.area.width-(2*panel.area.paddingxlr), panel.area.height, 0, 0);
48
49 XCopyArea (server.dsp, server.pmap, window.main_win, server.gc, 0, 0, panel.area.width, panel.area.height, 0, 0);
50 XFlush (server.dsp);
51 panel.refresh = 0;
52 }
53
54
55 void set_panel_properties (Window win)
56 {
57 XStoreName (server.dsp, win, "tint2");
58
59 // TODO: check if the name is really needed for a panel/taskbar ?
60 gsize len;
61 gchar *name = g_locale_to_utf8("tint2", -1, NULL, &len, NULL);
62 if (name != NULL) {
63 XChangeProperty(server.dsp, win, server.atom._NET_WM_NAME, server.atom.UTF8_STRING, 8, PropModeReplace, (unsigned char *) name, (int) len);
64 g_free(name);
65 }
66
67 // Dock
68 long val = server.atom._NET_WM_WINDOW_TYPE_DOCK;
69 XChangeProperty (server.dsp, win, server.atom._NET_WM_WINDOW_TYPE, XA_ATOM, 32, PropModeReplace, (unsigned char *) &val, 1);
70
71 // Reserved space
72 long struts [12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
73 if (panel.position & TOP) {
74 struts[2] = panel.area.height + panel.marginy;
75 struts[8] = server.posx;
76 // panel.area.width - 1 allowed full screen on monitor 2
77 struts[9] = server.posx + panel.area.width - 1;
78 }
79 else {
80 struts[3] = panel.area.height + panel.marginy;
81 struts[10] = server.posx;
82 // panel.area.width - 1 allowed full screen on monitor 2
83 struts[11] = server.posx + panel.area.width - 1;
84 }
85 // Old specification : fluxbox need _NET_WM_STRUT.
86 XChangeProperty (server.dsp, win, server.atom._NET_WM_STRUT, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 4);
87 XChangeProperty (server.dsp, win, server.atom._NET_WM_STRUT_PARTIAL, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &struts, 12);
88
89 // Sticky and below other window
90 val = 0xFFFFFFFF;
91 XChangeProperty (server.dsp, win, server.atom._NET_WM_DESKTOP, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &val, 1);
92 Atom state[4];
93 state[0] = server.atom._NET_WM_STATE_SKIP_PAGER;
94 state[1] = server.atom._NET_WM_STATE_SKIP_TASKBAR;
95 state[2] = server.atom._NET_WM_STATE_STICKY;
96 state[3] = server.atom._NET_WM_STATE_BELOW;
97 XChangeProperty (server.dsp, win, server.atom._NET_WM_STATE, XA_ATOM, 32, PropModeReplace, (unsigned char *) state, 4);
98
99 // Fixed position
100 XSizeHints size_hints;
101 size_hints.flags = PPosition;
102 XChangeProperty (server.dsp, win, XA_WM_NORMAL_HINTS, XA_WM_SIZE_HINTS, 32, PropModeReplace, (unsigned char *) &size_hints, sizeof (XSizeHints) / 4);
103
104 // Unfocusable
105 XWMHints wmhints;
106 wmhints.flags = InputHint;
107 wmhints.input = False;
108 XChangeProperty (server.dsp, win, XA_WM_HINTS, XA_WM_HINTS, 32, PropModeReplace, (unsigned char *) &wmhints, sizeof (XWMHints) / 4);
109
110 // Undecorated
111 long prop[5] = { 2, 0, 0, 0, 0 };
112 XChangeProperty(server.dsp, win, server.atom._MOTIF_WM_HINTS, server.atom._MOTIF_WM_HINTS, 32, PropModeReplace, (unsigned char *) prop, 5);
113 }
114
115
116 void window_draw_panel ()
117 {
118 /* panel position determined here */
119 if (panel.position & LEFT) {
120 server.posx = server.monitor[panel.monitor].x + panel.marginleft;
121 }
122 else {
123 if (panel.position & RIGHT) {
124 //server.posx = server.monitor[panel.monitor].x + server.monitor[panel.monitor].width - panel.area.width - panel.marginright;
125 server.posx = server.monitor[panel.monitor].x + server.monitor[panel.monitor].width - panel.area.width;
126 }
127 else {
128 server.posx = server.monitor[panel.monitor].x + ((server.monitor[panel.monitor].width - panel.area.width) / 2);
129 }
130 }
131 if (panel.position & TOP) {
132 server.posy = server.monitor[panel.monitor].y + panel.marginy;
133 }
134 else {
135 server.posy = server.monitor[panel.monitor].y + server.monitor[panel.monitor].height - panel.area.height - panel.marginy;
136 }
137
138 // Catch some events
139 XSetWindowAttributes att = { ParentRelative, 0L, 0, 0L, 0, 0, Always, 0L, 0L, False, ExposureMask|ButtonPressMask|ButtonReleaseMask, NoEventMask, False, 0, 0 };
140
141 // XCreateWindow(display, parent, x, y, w, h, border, depth, class, visual, mask, attrib)
142 // main_win doesn't include panel.area.paddingx, so we have WM capabilities on left and right.
143 Window win;
144 if (window.main_win) XDestroyWindow(server.dsp, window.main_win);
145 //win = XCreateWindow (server.dsp, server.root_win, server.posx+panel.area.paddingxlr, server.posy, panel.area.width-(2*panel.area.paddingxlr), panel.area.height, 0, server.depth, InputOutput, CopyFromParent, CWEventMask, &att);
146 win = XCreateWindow (server.dsp, server.root_win, server.posx, server.posy, panel.area.width, panel.area.height, 0, server.depth, InputOutput, CopyFromParent, CWEventMask, &att);
147
148 set_panel_properties (win);
149 window.main_win = win;
150
151 set_panel_background();
152
153 XMapWindow (server.dsp, win);
154 XFlush (server.dsp);
155 }
156
157
158 void visible_object()
159 {
160 if (panel.area.list) {
161 g_slist_free(panel.area.list);
162 panel.area.list = 0;
163 }
164
165 // list of visible objects
166 // start with clock because draw(clock) can resize others object
167 if (time1_format)
168 panel.area.list = g_slist_append(panel.area.list, &panel.clock);
169
170 int i, j;
171 Taskbar *taskbar;
172 for (i=0 ; i < panel.nb_desktop ; i++) {
173 for (j=0 ; j < panel.nb_monitor ; j++) {
174 taskbar = &panel.taskbar[index(i,j)];
175 if (panel.mode != MULTI_DESKTOP && taskbar->desktop != server.desktop) continue;
176
177 panel.area.list = g_slist_append(panel.area.list, taskbar);
178 }
179 }
180 set_redraw(&panel.area);
181 panel.refresh = 1;
182 }
183
184
185 void get_root_pixmap()
186 {
187 Pixmap ret = None;
188
189 unsigned long *res;
190 int c = 2;
191
192 do {
193 res = server_get_property (server.root_win, server.atom._XROOTPMAP_ID, XA_PIXMAP, 0);
194 if (res) {
195 ret = *((Pixmap*)res);
196 XFree(res);
197 break;
198 }
199 } while (--c > 0);
200 server.root_pmap = ret;
201
202 if (server.root_pmap != None) {
203 XGCValues gcv;
204 gcv.ts_x_origin = 0;
205 gcv.ts_y_origin = 0;
206 gcv.fill_style = FillTiled;
207 uint mask = GCTileStipXOrigin | GCTileStipYOrigin | GCFillStyle | GCTile;
208
209 gcv.tile = server.root_pmap;
210 XChangeGC(server.dsp, server.gc, mask, &gcv);
211 //fprintf(stderr, "pixmap background detected\n");
212 }
213 else
214 fprintf(stderr, "pixmap background detection failed\n");
215 }
216
217
218 void set_panel_background()
219 {
220 get_root_pixmap();
221
222 if (panel.area.pix.pmap) XFreePixmap (server.dsp, panel.area.pix.pmap);
223 panel.area.pix.pmap = XCreatePixmap (server.dsp, server.root_win, panel.area.width, panel.area.height, server.depth);
224
225 // copy background (server.root_pmap) in panel
226 Window dummy;
227 int x, y ;
228 XTranslateCoordinates(server.dsp, window.main_win, server.root_win, 0, 0, &x, &y, &dummy);
229 XSetTSOrigin(server.dsp, server.gc, -x, -y) ;
230 XFillRectangle(server.dsp, panel.area.pix.pmap, server.gc, 0, 0, panel.area.width, panel.area.height);
231
232 // draw background panel
233 cairo_surface_t *cs;
234 cairo_t *c;
235 cs = cairo_xlib_surface_create (server.dsp, panel.area.pix.pmap, server.visual, panel.area.width, panel.area.height);
236 c = cairo_create (cs);
237
238 draw_background (&panel.area, c, 0);
239
240 cairo_destroy (c);
241 cairo_surface_destroy (cs);
242
243 // redraw panel
244 set_redraw (&panel.area);
245
246 // copy background panel on desktop window
247 //XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy);
248 }
249
250
251
This page took 0.048911 seconds and 5 git commands to generate.