6
6
* Some ICCCM manager selection code derived from fvwm2,
7
7
* Copyright (C) 2001 Dominik Vogt, Matthias Clasen, and fvwm2 team
8
8
* Copyright (C) 2003 Rob Adams
9
* Copyright (C) 2004, 2005 Elijah Newren
10
11
* This program is free software; you can redistribute it and/or
11
12
* modify it under the terms of the GNU General Public License as
220
221
while (i < n_infos)
222
223
screen->xinerama_infos[i].number = infos[i].screen_number;
223
screen->xinerama_infos[i].x_origin = infos[i].x_org;
224
screen->xinerama_infos[i].y_origin = infos[i].y_org;
225
screen->xinerama_infos[i].width = infos[i].width;
226
screen->xinerama_infos[i].height = infos[i].height;
224
screen->xinerama_infos[i].rect.x = infos[i].x_org;
225
screen->xinerama_infos[i].rect.y = infos[i].y_org;
226
screen->xinerama_infos[i].rect.width = infos[i].width;
227
screen->xinerama_infos[i].rect.height = infos[i].height;
228
229
meta_topic (META_DEBUG_XINERAMA,
229
230
"Xinerama %d is %d,%d %d x %d\n",
230
231
screen->xinerama_infos[i].number,
231
screen->xinerama_infos[i].x_origin,
232
screen->xinerama_infos[i].y_origin,
233
screen->xinerama_infos[i].width,
234
screen->xinerama_infos[i].height);
232
screen->xinerama_infos[i].rect.x,
233
screen->xinerama_infos[i].rect.y,
234
screen->xinerama_infos[i].rect.width,
235
screen->xinerama_infos[i].rect.height);
281
282
while (i < n_monitors)
283
284
screen->xinerama_infos[i].number = i;
284
screen->xinerama_infos[i].x_origin = monitors[i].x;
285
screen->xinerama_infos[i].y_origin = monitors[i].y;
286
screen->xinerama_infos[i].width = monitors[i].width;
287
screen->xinerama_infos[i].height = monitors[i].height;
285
screen->xinerama_infos[i].rect.x = monitors[i].x;
286
screen->xinerama_infos[i].rect.y = monitors[i].y;
287
screen->xinerama_infos[i].rect.width = monitors[i].width;
288
screen->xinerama_infos[i].rect.height = monitors[i].height;
289
290
meta_topic (META_DEBUG_XINERAMA,
290
291
"Xinerama %d is %d,%d %d x %d\n",
291
292
screen->xinerama_infos[i].number,
292
screen->xinerama_infos[i].x_origin,
293
screen->xinerama_infos[i].y_origin,
294
screen->xinerama_infos[i].width,
295
screen->xinerama_infos[i].height);
293
screen->xinerama_infos[i].rect.x,
294
screen->xinerama_infos[i].rect.y,
295
screen->xinerama_infos[i].rect.width,
296
screen->xinerama_infos[i].rect.height);
324
325
screen->n_xinerama_infos = 2;
326
327
screen->xinerama_infos[0].number = 0;
327
screen->xinerama_infos[0].x_origin = 0;
328
screen->xinerama_infos[0].y_origin = 0;
329
screen->xinerama_infos[0].width = screen->width / 2;
330
screen->xinerama_infos[0].height = screen->height;
328
screen->xinerama_infos[0].rect = screen->rect;
329
screen->xinerama_infos[0].rect.width = screen->rect.width / 2;
332
331
screen->xinerama_infos[1].number = 1;
333
screen->xinerama_infos[1].x_origin = screen->width / 2;
334
screen->xinerama_infos[1].y_origin = 0;
335
screen->xinerama_infos[1].width = screen->width / 2 + screen->width % 2;
336
screen->xinerama_infos[1].height = screen->height;
332
screen->xinerama_infos[1].rect = screen->rect;
333
screen->xinerama_infos[1].rect.x = screen->rect.width / 2;
334
screen->xinerama_infos[1].rect.width = screen->rect.width / 2;
344
342
screen->n_xinerama_infos = 1;
346
344
screen->xinerama_infos[0].number = 0;
347
screen->xinerama_infos[0].x_origin = 0;
348
screen->xinerama_infos[0].y_origin = 0;
349
screen->xinerama_infos[0].width = screen->width;
350
screen->xinerama_infos[0].height = screen->height;
345
screen->xinerama_infos[0].rect = screen->rect;
519
514
screen->screen_name = get_screen_name (display, number);
520
515
screen->xscreen = ScreenOfDisplay (xdisplay, number);
521
516
screen->xroot = xroot;
522
screen->width = WidthOfScreen (screen->xscreen);
523
screen->height = HeightOfScreen (screen->xscreen);
517
screen->rect.x = screen->rect.y = 0;
518
screen->rect.width = WidthOfScreen (screen->xscreen);
519
screen->rect.height = HeightOfScreen (screen->xscreen);
524
520
screen->current_cursor = -1; /* invalid/unset */
525
521
screen->default_xvisual = DefaultVisualOfScreen (screen->xscreen);
526
522
screen->default_depth = DefaultDepthOfScreen (screen->xscreen);
1014
1010
if (screen->closing > 0)
1017
data[0] = screen->width;
1018
data[1] = screen->height;
1013
data[0] = screen->rect.width;
1014
data[1] = screen->rect.height;
1020
1016
meta_verbose ("Setting _NET_DESKTOP_GEOMETRY to %ld, %ld\n", data[0], data[1]);
1205
1201
entries[i].title = window->title;
1206
1202
entries[i].icon = window->icon;
1207
1203
entries[i].blank = FALSE;
1208
entries[i].minimized = !meta_window_showing_on_its_workspace (window);
1204
entries[i].hidden = !meta_window_showing_on_its_workspace (window);
1209
1205
entries[i].demands_attention = window->wm_state_demands_attention;
1211
1207
if (!window->minimized || !meta_window_get_icon_geometry (window, &r))
1212
1208
meta_window_get_outer_rect (window, &r);
1216
entries[i].width = r.width;
1217
entries[i].height = r.height;
1210
entries[i].rect = r;
1219
1212
/* Find inside of highlight rectangle to be used
1220
1213
* when window is outlined for tabbing.
1228
1221
int south = window->frame->rect.height - window->frame->child_y -
1229
1222
window->rect.height;
1230
1223
int east = window->frame->child_x;
1231
entries[i].inner_x = east;
1232
entries[i].inner_y = south;
1233
entries[i].inner_width = window->rect.width;
1234
entries[i].inner_height = window->frame->rect.height - south * 2;
1224
entries[i].inner_rect.x = east;
1225
entries[i].inner_rect.y = south;
1226
entries[i].inner_rect.width = window->rect.width;
1227
entries[i].inner_rect.height = window->frame->rect.height - south * 2;
1238
1231
/* Use an arbitrary border size */
1239
1232
#define OUTLINE_WIDTH 5
1240
entries[i].inner_x = OUTLINE_WIDTH;
1241
entries[i].inner_y = OUTLINE_WIDTH;
1242
entries[i].inner_width = window->rect.width - OUTLINE_WIDTH * 2;
1243
entries[i].inner_height = window->rect.height - OUTLINE_WIDTH * 2;
1233
entries[i].inner_rect.x = OUTLINE_WIDTH;
1234
entries[i].inner_rect.y = OUTLINE_WIDTH;
1235
entries[i].inner_rect.width = window->rect.width - OUTLINE_WIDTH * 2;
1236
entries[i].inner_rect.height = window->rect.height - OUTLINE_WIDTH * 2;
1375
1368
best_xinerama = 0;
1376
1369
xinerama_score = 0;
1379
while (i < screen->n_xinerama_infos)
1371
for (i = 0; i < screen->n_xinerama_infos; i++)
1381
MetaRectangle dest, screen_info;
1383
screen_info.x = screen->xinerama_infos[i].x_origin;
1384
screen_info.y = screen->xinerama_infos[i].y_origin;
1385
screen_info.width = screen->xinerama_infos[i].width;
1386
screen_info.height = screen->xinerama_infos[i].height;
1388
if (meta_rectangle_intersect (&screen_info, rect, &dest))
1374
if (meta_rectangle_intersect (&screen->xinerama_infos[i].rect,
1390
if (dest.width * dest.height > xinerama_score)
1378
int cur = meta_rectangle_area (&dest);
1379
if (cur > xinerama_score)
1392
xinerama_score = dest.width * dest.height;
1381
xinerama_score = cur;
1393
1382
best_xinerama = i;
1400
1387
return &screen->xinerama_infos[best_xinerama];
1425
1412
current = screen->xinerama_infos + i;
1427
if (((direction == META_SCREEN_RIGHT) &&
1428
(current->x_origin == input->x_origin + input->width) &&
1429
(current->y_origin >= input->y_origin) &&
1430
(current->y_origin <= input->y_origin+input->height)) ||
1431
((direction == META_SCREEN_LEFT) &&
1432
(input->x_origin == current->x_origin + current->width) &&
1433
(current->y_origin >= input->y_origin) &&
1434
(current->y_origin <= input->y_origin + input->height)) ||
1435
((direction == META_SCREEN_UP) &&
1436
(input->y_origin == current->y_origin + current->height) &&
1437
(current->x_origin >= input->x_origin) &&
1438
(current->x_origin <= input->x_origin + input->width)) ||
1439
((direction == META_SCREEN_DOWN) &&
1440
(current->y_origin == input->y_origin + input->height) &&
1441
(current->x_origin >= input->x_origin) &&
1442
(current->x_origin <= input->x_origin + input->width)))
1414
if ((direction == META_SCREEN_RIGHT &&
1415
current->rect.x == input->rect.x + input->rect.width &&
1416
meta_rectangle_vert_overlap(¤t->rect, &input->rect)) ||
1417
(direction == META_SCREEN_LEFT &&
1418
input->rect.x == current->rect.x + current->rect.width &&
1419
meta_rectangle_vert_overlap(¤t->rect, &input->rect)) ||
1420
(direction == META_SCREEN_UP &&
1421
input->rect.y == current->rect.y + current->rect.height &&
1422
meta_rectangle_horiz_overlap(¤t->rect, &input->rect)) ||
1423
(direction == META_SCREEN_DOWN &&
1424
current->rect.y == input->rect.y + input->rect.height &&
1425
meta_rectangle_horiz_overlap(¤t->rect, &input->rect)))
1444
1427
return current;
1543
1526
g_queue_free (xinerama_queue);
1547
meta_screen_rect_intersects_xinerama (MetaScreen *screen,
1548
MetaRectangle *rect,
1551
MetaRectangle dest, screen_rect;
1553
screen_rect.x = screen->xinerama_infos[which_xinerama].x_origin;
1554
screen_rect.y = screen->xinerama_infos[which_xinerama].y_origin;
1555
screen_rect.width = screen->xinerama_infos[which_xinerama].width;
1556
screen_rect.height = screen->xinerama_infos[which_xinerama].height;
1558
if (meta_rectangle_intersect (&screen_rect, rect, &dest))
1564
1529
const MetaXineramaScreenInfo*
1565
1530
meta_screen_get_current_xinerama (MetaScreen *screen)
1573
1538
if (screen->display->xinerama_cache_invalidated)
1575
1540
Window root_return, child_return;
1576
int root_x_return, root_y_return;
1577
1541
int win_x_return, win_y_return;
1578
1542
unsigned int mask_return;
1544
MetaRectangle pointer_position;
1581
1546
screen->display->xinerama_cache_invalidated = FALSE;
1548
pointer_position.width = pointer_position.height = 1;
1583
1549
XQueryPointer (screen->display->xdisplay,
1553
&pointer_position.x,
1554
&pointer_position.y,
1593
1559
screen->last_xinerama_index = 0;
1595
while (i < screen->n_xinerama_infos)
1560
for (i = 0; i < screen->n_xinerama_infos; i++)
1597
if ((root_x_return >= screen->xinerama_infos[i].x_origin &&
1598
root_x_return < (screen->xinerama_infos[i].x_origin +
1599
screen->xinerama_infos[i].width) &&
1600
root_y_return >= screen->xinerama_infos[i].y_origin &&
1601
root_y_return < (screen->xinerama_infos[i].y_origin +
1602
screen->xinerama_infos[i].height)))
1604
screen->last_xinerama_index = i;
1562
if (meta_rectangle_contains_rect (&screen->xinerama_infos[i].rect,
1565
screen->last_xinerama_index = i;
1611
1570
meta_topic (META_DEBUG_XINERAMA,