200
200
/* set the OPENBOX_PID hint */
202
PROP_SET32(RootWindow(ob_display, ob_screen),
203
openbox_pid, cardinal, pid);
202
OBT_PROP_SET32(obt_root(ob_screen), OPENBOX_PID, CARDINAL, pid);
205
204
/* set supporting window */
206
PROP_SET32(RootWindow(ob_display, ob_screen),
207
net_supporting_wm_check, window, screen_support_win);
205
OBT_PROP_SET32(obt_root(ob_screen),
206
NET_SUPPORTING_WM_CHECK, WINDOW, screen_support_win);
209
208
/* set properties on the supporting window */
210
PROP_SETS(screen_support_win, net_wm_name, "Openbox");
211
PROP_SET32(screen_support_win, net_supporting_wm_check,
212
window, screen_support_win);
209
OBT_PROP_SETS(screen_support_win, NET_WM_NAME, "Openbox");
210
OBT_PROP_SET32(screen_support_win, NET_SUPPORTING_WM_CHECK,
211
WINDOW, screen_support_win);
214
213
/* set the _NET_SUPPORTED_ATOMS hint */
216
/* this is all the atoms after net_supported in the prop_atoms struct */
217
prop_atoms_start = (Atom*)&prop_atoms;
218
wm_supported_pos = (Atom*)&(prop_atoms.net_supported);
219
num_support = sizeof(prop_atoms) / sizeof(Atom) -
220
(wm_supported_pos - prop_atoms_start) - 1;
215
/* this is all the atoms after NET_SUPPORTED in the ObtPropAtoms enum */
216
num_support = OBT_PROP_NUM_ATOMS - OBT_PROP_NET_SUPPORTED - 1;
222
218
supported = g_new(gulong, num_support);
223
supported[i++] = prop_atoms.net_supporting_wm_check;
224
supported[i++] = prop_atoms.net_wm_full_placement;
225
supported[i++] = prop_atoms.net_current_desktop;
226
supported[i++] = prop_atoms.net_number_of_desktops;
227
supported[i++] = prop_atoms.net_desktop_geometry;
228
supported[i++] = prop_atoms.net_desktop_viewport;
229
supported[i++] = prop_atoms.net_active_window;
230
supported[i++] = prop_atoms.net_workarea;
231
supported[i++] = prop_atoms.net_client_list;
232
supported[i++] = prop_atoms.net_client_list_stacking;
233
supported[i++] = prop_atoms.net_desktop_names;
234
supported[i++] = prop_atoms.net_close_window;
235
supported[i++] = prop_atoms.net_desktop_layout;
236
supported[i++] = prop_atoms.net_showing_desktop;
237
supported[i++] = prop_atoms.net_wm_name;
238
supported[i++] = prop_atoms.net_wm_visible_name;
239
supported[i++] = prop_atoms.net_wm_icon_name;
240
supported[i++] = prop_atoms.net_wm_visible_icon_name;
241
supported[i++] = prop_atoms.net_wm_desktop;
242
supported[i++] = prop_atoms.net_wm_strut;
243
supported[i++] = prop_atoms.net_wm_strut_partial;
244
supported[i++] = prop_atoms.net_wm_icon;
245
supported[i++] = prop_atoms.net_wm_icon_geometry;
246
supported[i++] = prop_atoms.net_wm_window_type;
247
supported[i++] = prop_atoms.net_wm_window_type_desktop;
248
supported[i++] = prop_atoms.net_wm_window_type_dock;
249
supported[i++] = prop_atoms.net_wm_window_type_toolbar;
250
supported[i++] = prop_atoms.net_wm_window_type_menu;
251
supported[i++] = prop_atoms.net_wm_window_type_utility;
252
supported[i++] = prop_atoms.net_wm_window_type_splash;
253
supported[i++] = prop_atoms.net_wm_window_type_dialog;
254
supported[i++] = prop_atoms.net_wm_window_type_normal;
255
supported[i++] = prop_atoms.net_wm_allowed_actions;
256
supported[i++] = prop_atoms.net_wm_action_move;
257
supported[i++] = prop_atoms.net_wm_action_resize;
258
supported[i++] = prop_atoms.net_wm_action_minimize;
259
supported[i++] = prop_atoms.net_wm_action_shade;
260
supported[i++] = prop_atoms.net_wm_action_maximize_horz;
261
supported[i++] = prop_atoms.net_wm_action_maximize_vert;
262
supported[i++] = prop_atoms.net_wm_action_fullscreen;
263
supported[i++] = prop_atoms.net_wm_action_change_desktop;
264
supported[i++] = prop_atoms.net_wm_action_close;
265
supported[i++] = prop_atoms.net_wm_action_above;
266
supported[i++] = prop_atoms.net_wm_action_below;
267
supported[i++] = prop_atoms.net_wm_state;
268
supported[i++] = prop_atoms.net_wm_state_modal;
269
supported[i++] = prop_atoms.net_wm_state_maximized_vert;
270
supported[i++] = prop_atoms.net_wm_state_maximized_horz;
271
supported[i++] = prop_atoms.net_wm_state_shaded;
272
supported[i++] = prop_atoms.net_wm_state_skip_taskbar;
273
supported[i++] = prop_atoms.net_wm_state_skip_pager;
274
supported[i++] = prop_atoms.net_wm_state_hidden;
275
supported[i++] = prop_atoms.net_wm_state_fullscreen;
276
supported[i++] = prop_atoms.net_wm_state_above;
277
supported[i++] = prop_atoms.net_wm_state_below;
278
supported[i++] = prop_atoms.net_wm_state_demands_attention;
279
supported[i++] = prop_atoms.net_moveresize_window;
280
supported[i++] = prop_atoms.net_wm_moveresize;
281
supported[i++] = prop_atoms.net_wm_user_time;
219
supported[i++] = OBT_PROP_ATOM(NET_SUPPORTING_WM_CHECK);
220
supported[i++] = OBT_PROP_ATOM(NET_WM_FULL_PLACEMENT);
221
supported[i++] = OBT_PROP_ATOM(NET_CURRENT_DESKTOP);
222
supported[i++] = OBT_PROP_ATOM(NET_NUMBER_OF_DESKTOPS);
223
supported[i++] = OBT_PROP_ATOM(NET_DESKTOP_GEOMETRY);
224
supported[i++] = OBT_PROP_ATOM(NET_DESKTOP_VIEWPORT);
225
supported[i++] = OBT_PROP_ATOM(NET_ACTIVE_WINDOW);
226
supported[i++] = OBT_PROP_ATOM(NET_WORKAREA);
227
supported[i++] = OBT_PROP_ATOM(NET_CLIENT_LIST);
228
supported[i++] = OBT_PROP_ATOM(NET_CLIENT_LIST_STACKING);
229
supported[i++] = OBT_PROP_ATOM(NET_DESKTOP_NAMES);
230
supported[i++] = OBT_PROP_ATOM(NET_CLOSE_WINDOW);
231
supported[i++] = OBT_PROP_ATOM(NET_DESKTOP_LAYOUT);
232
supported[i++] = OBT_PROP_ATOM(NET_SHOWING_DESKTOP);
233
supported[i++] = OBT_PROP_ATOM(NET_WM_NAME);
234
supported[i++] = OBT_PROP_ATOM(NET_WM_VISIBLE_NAME);
235
supported[i++] = OBT_PROP_ATOM(NET_WM_ICON_NAME);
236
supported[i++] = OBT_PROP_ATOM(NET_WM_VISIBLE_ICON_NAME);
237
supported[i++] = OBT_PROP_ATOM(NET_WM_DESKTOP);
238
supported[i++] = OBT_PROP_ATOM(NET_WM_STRUT);
239
supported[i++] = OBT_PROP_ATOM(NET_WM_STRUT_PARTIAL);
240
supported[i++] = OBT_PROP_ATOM(NET_WM_ICON);
241
supported[i++] = OBT_PROP_ATOM(NET_WM_ICON_GEOMETRY);
242
supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE);
243
supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DESKTOP);
244
supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DOCK);
245
supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_TOOLBAR);
246
supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_MENU);
247
supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_UTILITY);
248
supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_SPLASH);
249
supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DIALOG);
250
supported[i++] = OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_NORMAL);
251
supported[i++] = OBT_PROP_ATOM(NET_WM_ALLOWED_ACTIONS);
252
supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_MOVE);
253
supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_RESIZE);
254
supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_MINIMIZE);
255
supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_SHADE);
256
supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_MAXIMIZE_HORZ);
257
supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_MAXIMIZE_VERT);
258
supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_FULLSCREEN);
259
supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_CHANGE_DESKTOP);
260
supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_CLOSE);
261
supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_ABOVE);
262
supported[i++] = OBT_PROP_ATOM(NET_WM_ACTION_BELOW);
263
supported[i++] = OBT_PROP_ATOM(NET_WM_STATE);
264
supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_MODAL);
265
supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_VERT);
266
supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_MAXIMIZED_HORZ);
267
supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_SHADED);
268
supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_SKIP_TASKBAR);
269
supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_SKIP_PAGER);
270
supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_HIDDEN);
271
supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_FULLSCREEN);
272
supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_ABOVE);
273
supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_BELOW);
274
supported[i++] = OBT_PROP_ATOM(NET_WM_STATE_DEMANDS_ATTENTION);
275
supported[i++] = OBT_PROP_ATOM(NET_MOVERESIZE_WINDOW);
276
supported[i++] = OBT_PROP_ATOM(NET_WM_MOVERESIZE);
277
supported[i++] = OBT_PROP_ATOM(NET_WM_USER_TIME);
283
supported[i++] = prop_atoms.net_wm_user_time_window;
279
supported[i++] = OBT_PROP_ATOM(NET_WM_USER_TIME_WINDOW);
285
supported[i++] = prop_atoms.net_frame_extents;
286
supported[i++] = prop_atoms.net_request_frame_extents;
287
supported[i++] = prop_atoms.net_restack_window;
288
supported[i++] = prop_atoms.net_startup_id;
281
supported[i++] = OBT_PROP_ATOM(NET_FRAME_EXTENTS);
282
supported[i++] = OBT_PROP_ATOM(NET_REQUEST_FRAME_EXTENTS);
283
supported[i++] = OBT_PROP_ATOM(NET_RESTACK_WINDOW);
284
supported[i++] = OBT_PROP_ATOM(NET_STARTUP_ID);
290
supported[i++] = prop_atoms.net_wm_sync_request;
291
supported[i++] = prop_atoms.net_wm_sync_request_counter;
286
supported[i++] = OBT_PROP_ATOM(NET_WM_SYNC_REQUEST);
287
supported[i++] = OBT_PROP_ATOM(NET_WM_SYNC_REQUEST_COUNTER);
293
supported[i++] = prop_atoms.net_wm_pid;
294
supported[i++] = prop_atoms.net_wm_ping;
296
supported[i++] = prop_atoms.kde_wm_change_state;
297
supported[i++] = prop_atoms.kde_net_wm_frame_strut;
298
supported[i++] = prop_atoms.kde_net_wm_window_type_override;
300
supported[i++] = prop_atoms.ob_wm_action_undecorate;
301
supported[i++] = prop_atoms.ob_wm_state_undecorated;
302
supported[i++] = prop_atoms.openbox_pid;
303
supported[i++] = prop_atoms.ob_theme;
304
supported[i++] = prop_atoms.ob_config_file;
305
supported[i++] = prop_atoms.ob_control;
306
supported[i++] = prop_atoms.ob_version;
307
supported[i++] = prop_atoms.ob_app_role;
308
supported[i++] = prop_atoms.ob_app_name;
309
supported[i++] = prop_atoms.ob_app_class;
310
supported[i++] = prop_atoms.ob_app_type;
289
supported[i++] = OBT_PROP_ATOM(NET_WM_PID);
290
supported[i++] = OBT_PROP_ATOM(NET_WM_PING);
292
supported[i++] = OBT_PROP_ATOM(KDE_WM_CHANGE_STATE);
293
supported[i++] = OBT_PROP_ATOM(KDE_NET_WM_FRAME_STRUT);
294
supported[i++] = OBT_PROP_ATOM(KDE_NET_WM_WINDOW_TYPE_OVERRIDE);
296
supported[i++] = OBT_PROP_ATOM(OB_WM_ACTION_UNDECORATE);
297
supported[i++] = OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED);
298
supported[i++] = OBT_PROP_ATOM(OPENBOX_PID);
299
supported[i++] = OBT_PROP_ATOM(OB_THEME);
300
supported[i++] = OBT_PROP_ATOM(OB_CONFIG_FILE);
301
supported[i++] = OBT_PROP_ATOM(OB_CONTROL);
302
supported[i++] = OBT_PROP_ATOM(OB_VERSION);
303
supported[i++] = OBT_PROP_ATOM(OB_APP_ROLE);
304
supported[i++] = OBT_PROP_ATOM(OB_APP_TITLE);
305
supported[i++] = OBT_PROP_ATOM(OB_APP_NAME);
306
supported[i++] = OBT_PROP_ATOM(OB_APP_CLASS);
307
supported[i++] = OBT_PROP_ATOM(OB_APP_TYPE);
311
308
g_assert(i == num_support);
313
PROP_SETA32(RootWindow(ob_display, ob_screen),
314
net_supported, atom, supported, num_support);
310
OBT_PROP_SETA32(obt_root(ob_screen),
311
NET_SUPPORTED, ATOM, supported, num_support);
315
312
g_free(supported);
317
PROP_SETS(RootWindow(ob_display, ob_screen), ob_version,
314
OBT_PROP_SETS(RootWindow(obt_display, ob_screen), OB_VERSION,
320
317
screen_tell_ksplash();
1328
static void get_xinerama_screens(Rect **xin_areas, guint *nxin)
1333
XineramaScreenInfo *info;
1336
if (ob_debug_xinerama) {
1337
gint w = WidthOfScreen(ScreenOfDisplay(obt_display, ob_screen));
1338
gint h = HeightOfScreen(ScreenOfDisplay(obt_display, ob_screen));
1340
*xin_areas = g_new(Rect, *nxin + 1);
1341
RECT_SET((*xin_areas)[0], 0, 0, w/2, h);
1342
RECT_SET((*xin_areas)[1], w/2, 0, w-(w/2), h);
1345
else if (obt_display_extension_xinerama &&
1346
(info = XineramaQueryScreens(obt_display, &n))) {
1348
*xin_areas = g_new(Rect, *nxin + 1);
1349
for (i = 0; i < *nxin; ++i)
1350
RECT_SET((*xin_areas)[i], info[i].x_org, info[i].y_org,
1351
info[i].width, info[i].height);
1357
*xin_areas = g_new(Rect, *nxin + 1);
1358
RECT_SET((*xin_areas)[0], 0, 0,
1359
WidthOfScreen(ScreenOfDisplay(obt_display, ob_screen)),
1360
HeightOfScreen(ScreenOfDisplay(obt_display, ob_screen)));
1363
/* returns one extra with the total area in it */
1364
l = (*xin_areas)[0].x;
1365
t = (*xin_areas)[0].y;
1366
r = (*xin_areas)[0].x + (*xin_areas)[0].width - 1;
1367
b = (*xin_areas)[0].y + (*xin_areas)[0].height - 1;
1368
for (i = 1; i < *nxin; ++i) {
1369
l = MIN(l, (*xin_areas)[i].x);
1370
t = MIN(l, (*xin_areas)[i].y);
1371
r = MAX(r, (*xin_areas)[i].x + (*xin_areas)[i].width - 1);
1372
b = MAX(b, (*xin_areas)[i].y + (*xin_areas)[i].height - 1);
1374
RECT_SET((*xin_areas)[*nxin], l, t, r - l + 1, b - t + 1);
1322
1377
void screen_update_areas(void)
1381
GList *it, *onscreen;
1383
/* collect the clients that are on screen */
1385
for (it = client_list; it; it = g_list_next(it)) {
1386
if (client_monitor(it->data) != screen_num_monitors)
1387
onscreen = g_list_prepend(onscreen, it->data);
1328
1390
g_free(monitor_area);
1329
extensions_xinerama_screens(&monitor_area, &screen_num_monitors);
1391
get_xinerama_screens(&monitor_area, &screen_num_monitors);
1331
1393
/* set up the user-specified margins */
1332
1394
config_margins.top_start = RECT_LEFT(monitor_area[screen_num_monitors]);