1 /**************************************************************************
5 * Copyright (C) 2007 Pål Staurland (staura@gmail.com)
6 * Modified (C) 2008 thierry lorthiois (lorthiois@bbsoft.fr)
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License version 2
10 * as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 **************************************************************************/
29 void server_catch_error (Display
*d
, XErrorEvent
*ev
){}
32 void server_init_atoms ()
34 server
.atom
._XROOTPMAP_ID
= XInternAtom (server
.dsp
, "_XROOTPMAP_ID", False
);
35 server
.atom
._NET_CURRENT_DESKTOP
= XInternAtom (server
.dsp
, "_NET_CURRENT_DESKTOP", False
);
36 server
.atom
._NET_NUMBER_OF_DESKTOPS
= XInternAtom (server
.dsp
, "_NET_NUMBER_OF_DESKTOPS", False
);
37 server
.atom
._NET_DESKTOP_GEOMETRY
= XInternAtom (server
.dsp
, "_NET_DESKTOP_GEOMETRY", False
);
38 server
.atom
._NET_DESKTOP_VIEWPORT
= XInternAtom (server
.dsp
, "_NET_DESKTOP_VIEWPORT", False
);
39 server
.atom
._NET_ACTIVE_WINDOW
= XInternAtom (server
.dsp
, "_NET_ACTIVE_WINDOW", False
);
40 server
.atom
._NET_WM_WINDOW_TYPE
= XInternAtom (server
.dsp
, "_NET_WM_WINDOW_TYPE", False
);
41 server
.atom
._NET_WM_STATE_SKIP_PAGER
= XInternAtom (server
.dsp
, "_NET_WM_STATE_SKIP_PAGER", False
);
42 server
.atom
._NET_WM_STATE_SKIP_TASKBAR
= XInternAtom (server
.dsp
, "_NET_WM_STATE_SKIP_TASKBAR", False
);
43 server
.atom
._NET_WM_STATE_STICKY
= XInternAtom (server
.dsp
, "_NET_WM_STATE_STICKY", False
);
44 server
.atom
._NET_WM_WINDOW_TYPE_DOCK
= XInternAtom (server
.dsp
, "_NET_WM_WINDOW_TYPE_DOCK", False
);
45 server
.atom
._NET_WM_WINDOW_TYPE_DESKTOP
= XInternAtom (server
.dsp
, "_NET_WM_WINDOW_TYPE_DESKTOP", False
);
46 server
.atom
._NET_WM_WINDOW_TYPE_TOOLBAR
= XInternAtom (server
.dsp
, "_NET_WM_WINDOW_TYPE_TOOLBAR", False
);
47 server
.atom
._NET_WM_WINDOW_TYPE_MENU
= XInternAtom (server
.dsp
, "_NET_WM_WINDOW_TYPE_MENU", False
);
48 server
.atom
._NET_WM_WINDOW_TYPE_SPLASH
= XInternAtom (server
.dsp
, "_NET_WM_WINDOW_TYPE_SPLASH", False
);
49 server
.atom
._NET_WM_WINDOW_TYPE_DIALOG
= XInternAtom (server
.dsp
, "_NET_WM_WINDOW_TYPE_DIALOG", False
);
50 server
.atom
._NET_WM_WINDOW_TYPE_NORMAL
= XInternAtom (server
.dsp
, "_NET_WM_WINDOW_TYPE_NORMAL", False
);
51 server
.atom
._NET_WM_DESKTOP
= XInternAtom (server
.dsp
, "_NET_WM_DESKTOP", False
);
52 server
.atom
.WM_STATE
= XInternAtom (server
.dsp
, "WM_STATE", False
);
53 server
.atom
._NET_WM_STATE
= XInternAtom (server
.dsp
, "_NET_WM_STATE", False
);
54 server
.atom
._NET_WM_STATE_SHADED
= XInternAtom (server
.dsp
, "_NET_WM_STATE_SHADED", False
);
55 server
.atom
._NET_WM_STATE_BELOW
= XInternAtom (server
.dsp
, "_NET_WM_STATE_BELOW", False
);
56 server
.atom
._NET_WM_STATE_MODAL
= XInternAtom (server
.dsp
, "_NET_WM_STATE_MODAL", False
);
57 server
.atom
._NET_CLIENT_LIST
= XInternAtom (server
.dsp
, "_NET_CLIENT_LIST", False
);
58 server
.atom
._NET_WM_VISIBLE_NAME
= XInternAtom (server
.dsp
, "_NET_WM_VISIBLE_NAME", False
);
59 server
.atom
._NET_WM_NAME
= XInternAtom (server
.dsp
, "_NET_WM_NAME", False
);
60 server
.atom
._NET_WM_STRUT
= XInternAtom (server
.dsp
, "_NET_WM_STRUT", False
);
61 server
.atom
._NET_WM_ICON
= XInternAtom (server
.dsp
, "_NET_WM_ICON", False
);
62 server
.atom
._NET_CLOSE_WINDOW
= XInternAtom (server
.dsp
, "_NET_CLOSE_WINDOW", False
);
63 server
.atom
.UTF8_STRING
= XInternAtom (server
.dsp
, "UTF8_STRING", False
);
64 server
.atom
._NET_SUPPORTING_WM_CHECK
= XInternAtom (server
.dsp
, "_NET_SUPPORTING_WM_CHECK", False
);
65 server
.atom
._NET_SUPPORTING_WM_CHECK
= XInternAtom (server
.dsp
, "_NET_WM_NAME", False
);
66 server
.atom
._WIN_LAYER
= XInternAtom (server
.dsp
, "_WIN_LAYER", False
);
67 server
.atom
._NET_WM_STRUT_PARTIAL
= XInternAtom (server
.dsp
, "_NET_WM_STRUT_PARTIAL", False
);
68 server
.atom
.WM_NAME
= XInternAtom(server
.dsp
, "WM_NAME", False
);
69 server
.atom
.__SWM_VROOT
= XInternAtom(server
.dsp
, "__SWM_VROOT", False
);
73 void send_event32 (Window win
, Atom at
, long data1
, long data2
)
77 event
.xclient
.type
= ClientMessage
;
78 event
.xclient
.serial
= 0;
79 event
.xclient
.send_event
= True
;
80 event
.xclient
.display
= server
.dsp
;
81 event
.xclient
.window
= win
;
82 event
.xclient
.message_type
= at
;
84 event
.xclient
.format
= 32;
85 event
.xclient
.data
.l
[0] = data1
;
86 event
.xclient
.data
.l
[1] = data2
;
87 event
.xclient
.data
.l
[2] = 0;
88 event
.xclient
.data
.l
[3] = 0;
89 event
.xclient
.data
.l
[4] = 0;
91 XSendEvent(server
.dsp
, server
.root_win
, False
, SubstructureRedirectMask
|SubstructureNotifyMask
, &event
);
95 int get_property32 (Window win
, Atom at
, Atom type
)
98 int format_ret
= 0, data
= 0;
99 unsigned long nitems_ret
= 0;
100 unsigned long bafter_ret
= 0;
101 unsigned char *prop_value
= 0;
106 result
= XGetWindowProperty(server
.dsp
, win
, at
, 0, 0x7fffffff, False
, type
, &type_ret
, &format_ret
, &nitems_ret
, &bafter_ret
, &prop_value
);
108 if (result
== Success
&& prop_value
) {
109 data
= ((gulong
*)prop_value
)[0];
116 void *server_get_property (Window win
, Atom at
, Atom type
, int *num_results
)
120 unsigned long nitems_ret
= 0;
121 unsigned long bafter_ret
= 0;
122 unsigned char *prop_value
;
127 result
= XGetWindowProperty(server
.dsp
, win
, at
, 0, 0x7fffffff, False
, type
, &type_ret
, &format_ret
, &nitems_ret
, &bafter_ret
, &prop_value
);
129 /* Send back resultcount */
130 if (num_results
) *num_results
= nitems_ret
;
132 if (result
== Success
&& prop_value
) return prop_value
;
137 Pixmap
server_create_pixmap (int width
, int height
)
139 return XCreatePixmap (server
.dsp
, server
.root_win
, width
, height
, server
.depth
);
143 Pixmap
get_root_pixmap ()
146 Window root
= RootWindow(server
.dsp
, server
.screen
);
149 int act_format
, c
= 2 ;
156 if (XGetWindowProperty(server
.dsp
, root
, server
.atom
._XROOTPMAP_ID
, 0, 1,
157 False
, XA_PIXMAP
, &dummy_id
, &act_format
,
158 &nitems
, &bytes_after
, &prop
) == Success
) {
160 ret
= *((Pixmap
*)prop
);
172 Pixmap get_root_pixmap ()
174 // conky capture correctement le fond d'écran en xlib !!
178 server.root_win = window_get_root();
180 res = server_get_property (server.root_win, server.atom._XROOTPMAP_ID, XA_PIXMAP, 0);
182 root_pixmap = *((Drawable*) res);
187 printf("get_root_pixmap incorrect\n");
197 if (server
.monitor
) free(server
.monitor
);
198 server
.nb_monitor
= 0;
201 if (XineramaIsActive(server
.dsp
)) {
202 XineramaScreenInfo
*info
= XineramaQueryScreens(server
.dsp
, &server
.nb_monitor
);
207 server
.monitor
= calloc(server
.nb_monitor
, sizeof(Monitor
));
208 for (i
= 0; i
< server
.nb_monitor
; i
++) {
209 server
.monitor
[i
].x
= info
[i
].x_org
;
210 server
.monitor
[i
].y
= info
[i
].y_org
;
211 server
.monitor
[i
].width
= info
[i
].width
;
212 server
.monitor
[i
].height
= info
[i
].height
;
218 if (!server
.nb_monitor
) {
219 server
.nb_monitor
= 1;
220 server
.monitor
= calloc(server
.nb_monitor
, sizeof(Monitor
));
221 server
.monitor
[0].x
= server
.monitor
[0].y
= 0;
222 server
.monitor
[0].width
= DisplayWidth (server
.dsp
, server
.screen
);
223 server
.monitor
[0].height
= DisplayHeight (server
.dsp
, server
.screen
);