Move current logical monitor retrieval to the backends

The method used for getting the current logical monitor (the monitor
where the pointer cursor is currently at) depends on the backend type,
so move that logic to the corresponding backends.

https://bugzilla.gnome.org/show_bug.cgi?id=777732
This commit is contained in:
Jonas Ådahl
2016-12-01 12:59:47 +08:00
parent 06770b0dd4
commit 5a8509f895
11 changed files with 101 additions and 127 deletions

View File

@ -651,8 +651,6 @@ meta_display_open (void)
display->leader_window = None;
display->timestamp_pinging_window = None;
display->monitor_cache_invalidated = TRUE;
display->groups_by_leader = NULL;
display->screen = NULL;
@ -3085,6 +3083,7 @@ meta_display_request_pad_osd (MetaDisplay *display,
ClutterInputDevice *pad,
gboolean edition_mode)
{
MetaBackend *backend = meta_get_backend ();
MetaInputSettings *input_settings;
const gchar *layout_path = NULL;
ClutterActor *osd;
@ -3119,7 +3118,7 @@ meta_display_request_pad_osd (MetaDisplay *display,
return;
if (!logical_monitor)
logical_monitor = meta_screen_get_current_logical_monitor (display->screen);
logical_monitor = meta_backend_get_current_logical_monitor (backend);
g_signal_emit (display, display_signals[SHOW_PAD_OSD], 0,
pad, settings, layout_path,

View File

@ -81,6 +81,7 @@ find_next_cascade (MetaWindow *window,
int *new_x,
int *new_y)
{
MetaBackend *backend = meta_get_backend ();
GList *tmp;
GList *sorted;
int cascade_x, cascade_y;
@ -114,7 +115,7 @@ find_next_cascade (MetaWindow *window,
* of NW corner of window frame.
*/
current = meta_screen_get_current_logical_monitor (window->screen);
current = meta_backend_get_current_logical_monitor (backend);
meta_window_get_work_area_for_logical_monitor (window, current, &work_area);
cascade_x = MAX (0, work_area.x);
@ -665,6 +666,7 @@ meta_window_place (MetaWindow *window,
int *new_x,
int *new_y)
{
MetaBackend *backend = meta_get_backend ();
GList *windows = NULL;
MetaLogicalMonitor *logical_monitor;
@ -815,7 +817,7 @@ meta_window_place (MetaWindow *window,
meta_window_get_frame_rect (window, &frame_rect);
/* Warning, this function is a round trip! */
logical_monitor = meta_screen_get_current_logical_monitor (window->screen);
logical_monitor = meta_backend_get_current_logical_monitor (backend);
w = logical_monitor->rect.width;
h = logical_monitor->rect.height;
@ -859,8 +861,8 @@ meta_window_place (MetaWindow *window,
g_slist_free (all_windows);
}
/* Warning, this is a round trip! */
logical_monitor = meta_screen_get_current_logical_monitor (window->screen);
/* Warning, on X11 this might be a round trip! */
logical_monitor = meta_backend_get_current_logical_monitor (backend);
/* Maximize windows if they are too big for their work area (bit of
* a hack here). Assume undecorated windows probably don't intend to

View File

@ -77,9 +77,6 @@ struct _MetaScreen
gboolean has_xinerama_indices;
/* Cache the current monitor */
int last_monitor_index;
GSList *startup_sequences;
Window wm_cm_selection_window;
@ -133,10 +130,6 @@ void meta_screen_hide_tile_preview (MetaScreen *screen);
MetaWindow* meta_screen_get_mouse_window (MetaScreen *screen,
MetaWindow *not_this_one);
MetaLogicalMonitor * meta_screen_get_current_logical_monitor (MetaScreen *screen);
MetaLogicalMonitor * meta_screen_get_current_logical_monitor_for_pos (MetaScreen *screen,
int x,
int y);
MetaLogicalMonitor * meta_screen_calculate_logical_monitor_for_window (MetaScreen *screen,
MetaWindow *window);

View File

@ -430,9 +430,7 @@ reload_logical_monitors (MetaScreen *screen)
meta_workspace_invalidate_work_area (space);
}
screen->last_monitor_index = 0;
screen->has_xinerama_indices = FALSE;
screen->display->monitor_cache_invalidated = TRUE;
}
/* The guard window allows us to leave minimized windows mapped so
@ -1488,97 +1486,6 @@ meta_screen_get_monitor_neighbor_index (MetaScreen *screen,
return logical_monitor ? logical_monitor->number : -1;
}
MetaLogicalMonitor *
meta_screen_get_current_logical_monitor (MetaScreen *screen)
{
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaLogicalMonitor *logical_monitors;
unsigned int n_logical_monitors;
int monitor_index;
logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager,
&n_logical_monitors);
monitor_index = meta_screen_get_current_monitor (screen);
return &logical_monitors[monitor_index];
}
static int
meta_screen_get_current_monitor_for_pos (MetaScreen *screen,
int x,
int y);
MetaLogicalMonitor *
meta_screen_get_current_logical_monitor_for_pos (MetaScreen *screen,
int x,
int y)
{
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaLogicalMonitor *logical_monitors;
unsigned int n_logical_monitors;
int monitor_index;
logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager,
&n_logical_monitors);
monitor_index = meta_screen_get_current_monitor_for_pos (screen, x, y);
return &logical_monitors[monitor_index];
}
static int
meta_screen_get_current_monitor_for_pos (MetaScreen *screen,
int x,
int y)
{
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaLogicalMonitor *logical_monitors;
unsigned int n_logical_monitors;
logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager,
&n_logical_monitors);
if (n_logical_monitors == 1)
return 0;
else if (screen->display->monitor_cache_invalidated)
{
unsigned int i;
MetaRectangle pointer_position;
pointer_position.x = x;
pointer_position.y = y;
pointer_position.width = pointer_position.height = 1;
screen->display->monitor_cache_invalidated = FALSE;
screen->last_monitor_index = 0;
for (i = 0; i < n_logical_monitors; i++)
{
if (meta_rectangle_contains_rect (&logical_monitors[i].rect,
&pointer_position))
{
screen->last_monitor_index = i;
break;
}
}
meta_topic (META_DEBUG_XINERAMA,
"Rechecked current monitor, now %d\n",
screen->last_monitor_index);
}
return screen->last_monitor_index;
}
/**
* meta_screen_get_current_monitor:
* @screen: a #MetaScreen
@ -1591,27 +1498,15 @@ int
meta_screen_get_current_monitor (MetaScreen *screen)
{
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
int n_logical_monitors =
meta_monitor_manager_get_num_logical_monitors (monitor_manager);
MetaLogicalMonitor *logical_monitor;
if (n_logical_monitors == 1)
logical_monitor = meta_backend_get_current_logical_monitor (backend);
/* Pretend its the first when there is no actual current monitor. */
if (!logical_monitor)
return 0;
/* Sadly, we have to do it this way. Yuck.
*/
if (screen->display->monitor_cache_invalidated)
{
int x, y;
meta_cursor_tracker_get_pointer (cursor_tracker, &x, &y, NULL);
meta_screen_get_current_monitor_for_pos (screen, x, y);
}
return screen->last_monitor_index;
return logical_monitor->number;
}
/**

View File

@ -729,6 +729,8 @@ void meta_window_activate_full (MetaWindow *window,
MetaClientType source_indication,
MetaWorkspace *workspace);
MetaLogicalMonitor * meta_window_calculate_main_logical_monitor (MetaWindow *window);
void meta_window_update_monitor (MetaWindow *window,
gboolean user_op);