diff options
Diffstat (limited to 'src/core/screen.c')
-rw-r--r-- | src/core/screen.c | 270 |
1 files changed, 136 insertions, 134 deletions
diff --git a/src/core/screen.c b/src/core/screen.c index c1a2bd50..7f9e0b81 100644 --- a/src/core/screen.c +++ b/src/core/screen.c @@ -142,7 +142,7 @@ set_wm_icon_size_hint (MetaScreen *screen) } static void -reload_xinerama_infos (MetaScreen *screen) +reload_monitor_infos (MetaScreen *screen) { { GList *tmp; @@ -158,14 +158,14 @@ reload_xinerama_infos (MetaScreen *screen) } } - if (screen->xinerama_infos) - g_free (screen->xinerama_infos); + if (screen->monitor_infos) + g_free (screen->monitor_infos); - screen->xinerama_infos = NULL; - screen->n_xinerama_infos = 0; - screen->last_xinerama_index = 0; + screen->monitor_infos = NULL; + screen->n_monitor_infos = 0; + screen->last_monitor_index = 0; - screen->display->xinerama_cache_invalidated = TRUE; + screen->display->monitor_cache_invalidated = TRUE; #ifdef HAVE_XINERAMA if (XineramaIsActive (screen->display->xdisplay)) @@ -178,30 +178,30 @@ reload_xinerama_infos (MetaScreen *screen) infos = XineramaQueryScreens (screen->display->xdisplay, &n_infos); meta_topic (META_DEBUG_XINERAMA, - "Found %d Xinerama screens on display %s\n", + "Found %d monitors on display %s\n", n_infos, screen->display->name); if (n_infos > 0) { - screen->xinerama_infos = g_new (MetaXineramaScreenInfo, n_infos); - screen->n_xinerama_infos = n_infos; + screen->monitor_infos = g_new (MetaMonitorInfo, n_infos); + screen->n_monitor_infos = n_infos; i = 0; while (i < n_infos) { - screen->xinerama_infos[i].number = infos[i].screen_number; - screen->xinerama_infos[i].rect.x = infos[i].x_org; - screen->xinerama_infos[i].rect.y = infos[i].y_org; - screen->xinerama_infos[i].rect.width = infos[i].width; - screen->xinerama_infos[i].rect.height = infos[i].height; + screen->monitor_infos[i].number = infos[i].screen_number; + screen->monitor_infos[i].rect.x = infos[i].x_org; + screen->monitor_infos[i].rect.y = infos[i].y_org; + screen->monitor_infos[i].rect.width = infos[i].width; + screen->monitor_infos[i].rect.height = infos[i].height; meta_topic (META_DEBUG_XINERAMA, - "Xinerama %d is %d,%d %d x %d\n", - screen->xinerama_infos[i].number, - screen->xinerama_infos[i].rect.x, - screen->xinerama_infos[i].rect.y, - screen->xinerama_infos[i].rect.width, - screen->xinerama_infos[i].rect.height); + "Monitor %d is %d,%d %d x %d\n", + screen->monitor_infos[i].number, + screen->monitor_infos[i].rect.x, + screen->monitor_infos[i].rect.y, + screen->monitor_infos[i].rect.width, + screen->monitor_infos[i].rect.height); ++i; } @@ -223,40 +223,40 @@ reload_xinerama_infos (MetaScreen *screen) /* If no Xinerama, fill in the single screen info so * we can use the field unconditionally */ - if (screen->n_xinerama_infos == 0) + if (screen->n_monitor_infos == 0) { if (g_getenv ("METACITY_DEBUG_XINERAMA")) { meta_topic (META_DEBUG_XINERAMA, - "Pretending a single monitor has two Xinerama screens\n"); + "Pretending a single screen has two monitors\n"); - screen->xinerama_infos = g_new (MetaXineramaScreenInfo, 2); - screen->n_xinerama_infos = 2; + screen->monitor_infos = g_new (MetaMonitorInfo, 2); + screen->n_monitor_infos = 2; - screen->xinerama_infos[0].number = 0; - screen->xinerama_infos[0].rect = screen->rect; - screen->xinerama_infos[0].rect.width = screen->rect.width / 2; + screen->monitor_infos[0].number = 0; + screen->monitor_infos[0].rect = screen->rect; + screen->monitor_infos[0].rect.width = screen->rect.width / 2; - screen->xinerama_infos[1].number = 1; - screen->xinerama_infos[1].rect = screen->rect; - screen->xinerama_infos[1].rect.x = screen->rect.width / 2; - screen->xinerama_infos[1].rect.width = screen->rect.width / 2; + screen->monitor_infos[1].number = 1; + screen->monitor_infos[1].rect = screen->rect; + screen->monitor_infos[1].rect.x = screen->rect.width / 2; + screen->monitor_infos[1].rect.width = screen->rect.width / 2; } else { meta_topic (META_DEBUG_XINERAMA, - "No Xinerama screens, using default screen info\n"); + "No monitors, using default screen info\n"); - screen->xinerama_infos = g_new (MetaXineramaScreenInfo, 1); - screen->n_xinerama_infos = 1; + screen->monitor_infos = g_new (MetaMonitorInfo, 1); + screen->n_monitor_infos = 1; - screen->xinerama_infos[0].number = 0; - screen->xinerama_infos[0].rect = screen->rect; + screen->monitor_infos[0].number = 0; + screen->monitor_infos[0].rect = screen->rect; } } - g_assert (screen->n_xinerama_infos > 0); - g_assert (screen->xinerama_infos != NULL); + g_assert (screen->n_monitor_infos > 0); + g_assert (screen->monitor_infos != NULL); } MetaScreen* @@ -463,11 +463,11 @@ meta_screen_new (MetaDisplay *display, &gc_values); } - screen->xinerama_infos = NULL; - screen->n_xinerama_infos = 0; - screen->last_xinerama_index = 0; + screen->monitor_infos = NULL; + screen->n_monitor_infos = 0; + screen->last_monitor_index = 0; - reload_xinerama_infos (screen); + reload_monitor_infos (screen); meta_screen_set_cursor (screen, META_CURSOR_DEFAULT); @@ -619,8 +619,8 @@ meta_screen_free (MetaScreen *screen, XFreeGC (screen->display->xdisplay, screen->root_xor_gc); - if (screen->xinerama_infos) - g_free (screen->xinerama_infos); + if (screen->monitor_infos) + g_free (screen->monitor_infos); if (screen->tile_preview_timeout_id) g_source_remove (screen->tile_preview_timeout_id); @@ -1414,61 +1414,61 @@ meta_screen_get_mouse_window (MetaScreen *screen, return window; } -const MetaXineramaScreenInfo* -meta_screen_get_xinerama_for_rect (MetaScreen *screen, - MetaRectangle *rect) +const MetaMonitorInfo * +meta_screen_get_monitor_for_rect (MetaScreen *screen, + MetaRectangle *rect) { int i; - int best_xinerama, xinerama_score; + int best_monitor, monitor_score; - if (screen->n_xinerama_infos == 1) - return &screen->xinerama_infos[0]; + if (screen->n_monitor_infos == 1) + return &screen->monitor_infos[0]; - best_xinerama = 0; - xinerama_score = 0; + best_monitor = 0; + monitor_score = 0; - for (i = 0; i < screen->n_xinerama_infos; i++) + for (i = 0; i < screen->n_monitor_infos; i++) { MetaRectangle dest; - if (meta_rectangle_intersect (&screen->xinerama_infos[i].rect, + if (meta_rectangle_intersect (&screen->monitor_infos[i].rect, rect, &dest)) { int cur = meta_rectangle_area (&dest); - if (cur > xinerama_score) + if (cur > monitor_score) { - xinerama_score = cur; - best_xinerama = i; + monitor_score = cur; + best_monitor = i; } } } - return &screen->xinerama_infos[best_xinerama]; + return &screen->monitor_infos[best_monitor]; } -const MetaXineramaScreenInfo* -meta_screen_get_xinerama_for_window (MetaScreen *screen, - MetaWindow *window) +const MetaMonitorInfo * +meta_screen_get_monitor_for_window (MetaScreen *screen, + MetaWindow *window) { MetaRectangle window_rect; meta_window_get_outer_rect (window, &window_rect); - return meta_screen_get_xinerama_for_rect (screen, &window_rect); + return meta_screen_get_monitor_for_rect (screen, &window_rect); } -const MetaXineramaScreenInfo* -meta_screen_get_xinerama_neighbor (MetaScreen *screen, - int which_xinerama, - MetaScreenDirection direction) +const MetaMonitorInfo * +meta_screen_get_monitor_neighbor (MetaScreen *screen, + int which_monitor, + MetaScreenDirection direction) { - MetaXineramaScreenInfo* input = screen->xinerama_infos + which_xinerama; - MetaXineramaScreenInfo* current; + MetaMonitorInfo *input = screen->monitor_infos + which_monitor; + MetaMonitorInfo *current; int i; - for (i = 0; i < screen->n_xinerama_infos; i++) + for (i = 0; i < screen->n_monitor_infos; i++) { - current = screen->xinerama_infos + i; + current = screen->monitor_infos + i; if ((direction == META_SCREEN_RIGHT && current->rect.x == input->rect.x + input->rect.width && @@ -1491,110 +1491,112 @@ meta_screen_get_xinerama_neighbor (MetaScreen *screen, } void -meta_screen_get_natural_xinerama_list (MetaScreen *screen, - int** xineramas_list, - int* n_xineramas) +meta_screen_get_natural_monitor_list (MetaScreen *screen, + int** monitors_list, + int* n_monitors) { - const MetaXineramaScreenInfo* current; - const MetaXineramaScreenInfo* tmp; - GQueue* xinerama_queue; + const MetaMonitorInfo *current; + const MetaMonitorInfo *tmp; + GQueue* monitor_queue; int* visited; int cur = 0; int i; - *n_xineramas = screen->n_xinerama_infos; - *xineramas_list = g_new (int, screen->n_xinerama_infos); + *n_monitors = screen->n_monitor_infos; + *monitors_list = g_new (int, screen->n_monitor_infos); - /* we calculate a natural ordering by which to choose xineramas for - * window placement. We start at the current xinerama, and perform - * a breadth-first search of the xineramas starting from that - * xinerama. We choose preferentially left, then right, then down, - * then up. The visitation order produced by this traversal is the - * natural xinerama ordering. + /* we calculate a natural ordering by which to choose monitors for + * window placement. We start at the current monitor, and perform + * a breadth-first search of the monitors starting from that monitor. + * We choose preferentially left, then right, then down, then up. + * The visitation order produced by this traversal is the natural + * monitor ordering. */ - visited = g_new (int, screen->n_xinerama_infos); - for (i = 0; i < screen->n_xinerama_infos; i++) + visited = g_new (int, screen->n_monitor_infos); + for (i = 0; i < screen->n_monitor_infos; i++) { visited[i] = FALSE; } - current = meta_screen_get_current_xinerama (screen); - xinerama_queue = g_queue_new (); - g_queue_push_tail (xinerama_queue, (gpointer) current); + current = meta_screen_get_current_monitor (screen); + monitor_queue = g_queue_new (); + g_queue_push_tail (monitor_queue, (gpointer) current); visited[current->number] = TRUE; - while (!g_queue_is_empty (xinerama_queue)) + while (!g_queue_is_empty (monitor_queue)) { - current = (const MetaXineramaScreenInfo*) - g_queue_pop_head (xinerama_queue); + current = (const MetaMonitorInfo *) g_queue_pop_head (monitor_queue); - (*xineramas_list)[cur++] = current->number; + (*monitors_list)[cur++] = current->number; /* enqueue each of the directions */ - tmp = meta_screen_get_xinerama_neighbor (screen, - current->number, - META_SCREEN_LEFT); + tmp = meta_screen_get_monitor_neighbor (screen, + current->number, + META_SCREEN_LEFT); + if (tmp && !visited[tmp->number]) { - g_queue_push_tail (xinerama_queue, - (MetaXineramaScreenInfo*) tmp); + g_queue_push_tail (monitor_queue, (MetaMonitorInfo *) tmp); visited[tmp->number] = TRUE; } - tmp = meta_screen_get_xinerama_neighbor (screen, - current->number, - META_SCREEN_RIGHT); + + tmp = meta_screen_get_monitor_neighbor (screen, + current->number, + META_SCREEN_RIGHT); + if (tmp && !visited[tmp->number]) { - g_queue_push_tail (xinerama_queue, - (MetaXineramaScreenInfo*) tmp); + g_queue_push_tail (monitor_queue, (MetaMonitorInfo *) tmp); visited[tmp->number] = TRUE; } - tmp = meta_screen_get_xinerama_neighbor (screen, - current->number, - META_SCREEN_UP); + + tmp = meta_screen_get_monitor_neighbor (screen, + current->number, + META_SCREEN_UP); + if (tmp && !visited[tmp->number]) { - g_queue_push_tail (xinerama_queue, - (MetaXineramaScreenInfo*) tmp); + g_queue_push_tail (monitor_queue, (MetaMonitorInfo *) tmp); visited[tmp->number] = TRUE; } - tmp = meta_screen_get_xinerama_neighbor (screen, - current->number, - META_SCREEN_DOWN); + + tmp = meta_screen_get_monitor_neighbor (screen, + current->number, + META_SCREEN_DOWN); + if (tmp && !visited[tmp->number]) { - g_queue_push_tail (xinerama_queue, - (MetaXineramaScreenInfo*) tmp); + g_queue_push_tail (monitor_queue, (MetaMonitorInfo *) tmp); visited[tmp->number] = TRUE; } } - /* in case we somehow missed some set of xineramas, go through the - * visited list and add in any xineramas that were missed + /* in case we somehow missed some set of monitors, go through the + * visited list and add in any monitors that were missed */ - for (i = 0; i < screen->n_xinerama_infos; i++) + for (i = 0; i < screen->n_monitor_infos; i++) { if (visited[i] == FALSE) { - (*xineramas_list)[cur++] = i; + (*monitors_list)[cur++] = i; } } g_free (visited); - g_queue_free (xinerama_queue); + g_queue_free (monitor_queue); } -const MetaXineramaScreenInfo* -meta_screen_get_current_xinerama (MetaScreen *screen) +const MetaMonitorInfo * +meta_screen_get_current_monitor (MetaScreen *screen) { - if (screen->n_xinerama_infos == 1) - return &screen->xinerama_infos[0]; + if (screen->n_monitor_infos == 1) + return &screen->monitor_infos[0]; /* Sadly, we have to do it this way. Yuck. */ - if (screen->display->xinerama_cache_invalidated) + if (screen->display->monitor_cache_invalidated) { Window root_return, child_return; int win_x_return, win_y_return; @@ -1602,7 +1604,7 @@ meta_screen_get_current_xinerama (MetaScreen *screen) int i; MetaRectangle pointer_position; - screen->display->xinerama_cache_invalidated = FALSE; + screen->display->monitor_cache_invalidated = FALSE; pointer_position.width = pointer_position.height = 1; XQueryPointer (screen->display->xdisplay, @@ -1615,23 +1617,23 @@ meta_screen_get_current_xinerama (MetaScreen *screen) &win_y_return, &mask_return); - screen->last_xinerama_index = 0; - for (i = 0; i < screen->n_xinerama_infos; i++) + screen->last_monitor_index = 0; + for (i = 0; i < screen->n_monitor_infos; i++) { - if (meta_rectangle_contains_rect (&screen->xinerama_infos[i].rect, + if (meta_rectangle_contains_rect (&screen->monitor_infos[i].rect, &pointer_position)) { - screen->last_xinerama_index = i; + screen->last_monitor_index = i; break; } } meta_topic (META_DEBUG_XINERAMA, - "Rechecked current Xinerama, now %d\n", - screen->last_xinerama_index); + "Rechecked current monitor, now %d\n", + screen->last_monitor_index); } - return &screen->xinerama_infos[screen->last_xinerama_index]; + return &screen->monitor_infos[screen->last_monitor_index]; } #define _NET_WM_ORIENTATION_HORZ 0 @@ -1857,7 +1859,7 @@ set_work_area_hint (MetaScreen *screen) if (workspace->screen == screen) { - meta_workspace_get_work_area_all_xineramas (workspace, &area); + meta_workspace_get_work_area_all_monitors (workspace, &area); tmp[0] = area.x; tmp[1] = area.y; tmp[2] = area.width; @@ -2224,7 +2226,7 @@ meta_screen_resize (MetaScreen *screen, screen->rect.width = width; screen->rect.height = height; - reload_xinerama_infos (screen); + reload_monitor_infos (screen); set_desktop_geometry_hint (screen); meta_compositor_sync_screen_size (screen->display->compositor); |