Move more logical monitor getters from the screen to the monitor manager

Turning a rectangle into a logical monitor also has nothing to do with
the screen (MetaScreen) so move it to MetaMonitorManager which has that
information.

https://bugzilla.gnome.org/show_bug.cgi?id=777732
This commit is contained in:
Jonas Ådahl
2016-12-01 12:52:07 +08:00
parent f5b2d79f3b
commit af616c96d4
7 changed files with 90 additions and 70 deletions

View File

@ -330,7 +330,10 @@ setup_constraint_info (ConstraintInfo *info,
const MetaRectangle *orig,
MetaRectangle *new)
{
const MetaLogicalMonitor *logical_monitor;
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaLogicalMonitor *logical_monitor;
MetaWorkspace *cur_workspace;
info->orig = *orig;
@ -379,10 +382,11 @@ setup_constraint_info (ConstraintInfo *info,
info->fixed_directions = FIXED_DIRECTION_NONE;
logical_monitor =
meta_screen_get_logical_monitor_for_rect (window->screen, &info->current);
meta_window_get_work_area_for_monitor (window,
logical_monitor->number,
&info->work_area_monitor);
meta_monitor_manager_get_logical_monitor_from_rect (monitor_manager,
&info->current);
meta_window_get_work_area_for_logical_monitor (window,
logical_monitor,
&info->work_area_monitor);
if (!window->fullscreen || !meta_window_has_fullscreen_monitors (window))
{
@ -459,10 +463,13 @@ place_window_if_needed(MetaWindow *window,
!window->minimized &&
!window->fullscreen)
{
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaRectangle orig_rect;
MetaRectangle placed_rect;
MetaWorkspace *cur_workspace;
const MetaLogicalMonitor *logical_monitor;
MetaLogicalMonitor *logical_monitor;
placed_rect = (MetaRectangle) {
.x = window->rect.x,
@ -481,11 +488,12 @@ place_window_if_needed(MetaWindow *window,
* new monitor and update the ConstraintInfo
*/
logical_monitor =
meta_screen_get_logical_monitor_for_rect (window->screen, &placed_rect);
meta_monitor_manager_get_logical_monitor_from_rect (monitor_manager,
&placed_rect);
info->entire_monitor = logical_monitor->rect;
meta_window_get_work_area_for_monitor (window,
logical_monitor->number,
&info->work_area_monitor);
meta_window_get_work_area_for_logical_monitor (window,
logical_monitor,
&info->work_area_monitor);
cur_workspace = window->screen->active_workspace;
info->usable_monitor_region =
meta_workspace_get_onmonitor_region (cur_workspace,

View File

@ -137,8 +137,6 @@ MetaLogicalMonitor * meta_screen_get_current_logical_monitor (MetaScreen *scr
MetaLogicalMonitor * meta_screen_get_current_logical_monitor_for_pos (MetaScreen *screen,
int x,
int y);
MetaLogicalMonitor * meta_screen_get_logical_monitor_for_rect (MetaScreen *screen,
MetaRectangle *rect);
MetaLogicalMonitor * meta_screen_calculate_logical_monitor_for_window (MetaScreen *screen,
MetaWindow *window);

View File

@ -44,6 +44,7 @@
#include "core.h"
#include "meta-cursor-tracker-private.h"
#include "boxes-private.h"
#include "backends/meta-backend-private.h"
#include <X11/extensions/Xinerama.h>
#include <X11/extensions/Xcomposite.h>
@ -1403,77 +1404,32 @@ meta_screen_get_mouse_window (MetaScreen *screen,
}
MetaLogicalMonitor *
meta_screen_get_logical_monitor_for_rect (MetaScreen *screen,
MetaRectangle *rect)
meta_screen_calculate_logical_monitor_for_window (MetaScreen *screen,
MetaWindow *window)
{
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaLogicalMonitor *logical_monitors;
unsigned int n_logical_monitors;
unsigned int i, best_monitor;
int monitor_score, rect_area;
logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager,
&n_logical_monitors);
if (n_logical_monitors == 1)
return &logical_monitors[0];
best_monitor = 0;
monitor_score = -1;
rect_area = meta_rectangle_area (rect);
for (i = 0; i < n_logical_monitors; i++)
{
gboolean result;
int cur;
if (rect_area > 0)
{
MetaRectangle dest;
result = meta_rectangle_intersect (&logical_monitors[i].rect,
rect,
&dest);
cur = meta_rectangle_area (&dest);
}
else
{
result = meta_rectangle_contains_rect (&logical_monitors[i].rect,
rect);
cur = rect_area;
}
if (result && cur > monitor_score)
{
monitor_score = cur;
best_monitor = i;
}
}
return &logical_monitors[best_monitor];
}
MetaLogicalMonitor *
meta_screen_calculate_logical_monitor_for_window (MetaScreen *screen,
MetaWindow *window)
{
MetaRectangle window_rect;
meta_window_get_frame_rect (window, &window_rect);
return meta_screen_get_logical_monitor_for_rect (screen, &window_rect);
return meta_monitor_manager_get_logical_monitor_from_rect (monitor_manager,
&window_rect);
}
int
meta_screen_get_monitor_index_for_rect (MetaScreen *screen,
MetaRectangle *rect)
{
MetaLogicalMonitor *monitor;
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaLogicalMonitor *logical_monitor;
monitor = meta_screen_get_logical_monitor_for_rect (screen, rect);
return monitor->number;
logical_monitor =
meta_monitor_manager_get_logical_monitor_from_rect (monitor_manager, rect);
return logical_monitor->number;
}
MetaLogicalMonitor *

View File

@ -955,13 +955,22 @@ void
meta_workspace_set_builtin_struts (MetaWorkspace *workspace,
GSList *struts)
{
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaScreen *screen = workspace->screen;
GSList *l;
for (l = struts; l; l = l->next)
{
MetaStrut *strut = l->data;
int idx = meta_screen_get_monitor_index_for_rect (screen, &strut->rect);
MetaLogicalMonitor *logical_monitor;
int idx;
logical_monitor =
meta_monitor_manager_get_logical_monitor_from_rect (monitor_manager,
&strut->rect);
idx = logical_monitor->number;
switch (strut->side)
{