mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 17:40:40 -05:00
screen: Allow reusing the current position when quering the monitor
Add new api (meta_screen_get_current_monitor_for_pos and meta_screen_get_current_monitor_info_for_pos) that allow querying the monitor without a roundtrip by reusing the passed in cursor position.
This commit is contained in:
parent
96221e6c04
commit
7187206ef5
@ -187,6 +187,9 @@ MetaWindow* meta_screen_get_mouse_window (MetaScreen *scre
|
|||||||
MetaWindow *not_this_one);
|
MetaWindow *not_this_one);
|
||||||
|
|
||||||
const MetaMonitorInfo* meta_screen_get_current_monitor_info (MetaScreen *screen);
|
const MetaMonitorInfo* meta_screen_get_current_monitor_info (MetaScreen *screen);
|
||||||
|
const MetaMonitorInfo* meta_screen_get_current_monitor_info_for_pos (MetaScreen *screen,
|
||||||
|
int x,
|
||||||
|
int y);
|
||||||
const MetaMonitorInfo* meta_screen_get_monitor_for_rect (MetaScreen *screen,
|
const MetaMonitorInfo* meta_screen_get_monitor_for_rect (MetaScreen *screen,
|
||||||
MetaRectangle *rect);
|
MetaRectangle *rect);
|
||||||
const MetaMonitorInfo* meta_screen_get_monitor_for_window (MetaScreen *screen,
|
const MetaMonitorInfo* meta_screen_get_monitor_for_window (MetaScreen *screen,
|
||||||
|
@ -2216,6 +2216,65 @@ meta_screen_get_current_monitor_info (MetaScreen *screen)
|
|||||||
return &screen->monitor_infos[monitor_index];
|
return &screen->monitor_infos[monitor_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const MetaMonitorInfo*
|
||||||
|
meta_screen_get_current_monitor_info_for_pos (MetaScreen *screen,
|
||||||
|
int x,
|
||||||
|
int y)
|
||||||
|
{
|
||||||
|
int monitor_index;
|
||||||
|
monitor_index = meta_screen_get_current_monitor_for_pos (screen, x, y);
|
||||||
|
return &screen->monitor_infos[monitor_index];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* meta_screen_get_current_monitor_for_pos:
|
||||||
|
* @screen: a #MetaScreen
|
||||||
|
* @x: The x coordinate
|
||||||
|
* @y: The y coordinate
|
||||||
|
*
|
||||||
|
* Gets the index of the monitor that contains the passed coordinates.
|
||||||
|
*
|
||||||
|
* Return value: a monitor index
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
meta_screen_get_current_monitor_for_pos (MetaScreen *screen,
|
||||||
|
int x,
|
||||||
|
int y)
|
||||||
|
{
|
||||||
|
if (screen->n_monitor_infos == 1)
|
||||||
|
return 0;
|
||||||
|
else if (screen->display->monitor_cache_invalidated)
|
||||||
|
{
|
||||||
|
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 < screen->n_monitor_infos; i++)
|
||||||
|
{
|
||||||
|
if (meta_rectangle_contains_rect (&screen->monitor_infos[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:
|
* meta_screen_get_current_monitor:
|
||||||
* @screen: a #MetaScreen
|
* @screen: a #MetaScreen
|
||||||
@ -2241,11 +2300,7 @@ meta_screen_get_current_monitor (MetaScreen *screen)
|
|||||||
XIButtonState buttons;
|
XIButtonState buttons;
|
||||||
XIModifierState mods;
|
XIModifierState mods;
|
||||||
XIGroupState group;
|
XIGroupState group;
|
||||||
int i;
|
|
||||||
MetaRectangle pointer_position;
|
|
||||||
|
|
||||||
screen->display->monitor_cache_invalidated = FALSE;
|
|
||||||
|
|
||||||
XIQueryPointer (screen->display->xdisplay,
|
XIQueryPointer (screen->display->xdisplay,
|
||||||
META_VIRTUAL_CORE_POINTER_ID,
|
META_VIRTUAL_CORE_POINTER_ID,
|
||||||
screen->xroot,
|
screen->xroot,
|
||||||
@ -2260,24 +2315,7 @@ meta_screen_get_current_monitor (MetaScreen *screen)
|
|||||||
&group);
|
&group);
|
||||||
free (buttons.mask);
|
free (buttons.mask);
|
||||||
|
|
||||||
pointer_position.x = root_x_return;
|
meta_screen_get_current_monitor_for_pos (screen, root_x_return, root_y_return);
|
||||||
pointer_position.y = root_y_return;
|
|
||||||
pointer_position.width = pointer_position.height = 1;
|
|
||||||
|
|
||||||
screen->last_monitor_index = 0;
|
|
||||||
for (i = 0; i < screen->n_monitor_infos; i++)
|
|
||||||
{
|
|
||||||
if (meta_rectangle_contains_rect (&screen->monitor_infos[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;
|
return screen->last_monitor_index;
|
||||||
|
@ -78,6 +78,9 @@ MetaWorkspace * meta_screen_get_active_workspace (MetaScreen *screen);
|
|||||||
int meta_screen_get_n_monitors (MetaScreen *screen);
|
int meta_screen_get_n_monitors (MetaScreen *screen);
|
||||||
int meta_screen_get_primary_monitor (MetaScreen *screen);
|
int meta_screen_get_primary_monitor (MetaScreen *screen);
|
||||||
int meta_screen_get_current_monitor (MetaScreen *screen);
|
int meta_screen_get_current_monitor (MetaScreen *screen);
|
||||||
|
int meta_screen_get_current_monitor_for_pos (MetaScreen *screen,
|
||||||
|
int x,
|
||||||
|
int y);
|
||||||
void meta_screen_get_monitor_geometry (MetaScreen *screen,
|
void meta_screen_get_monitor_geometry (MetaScreen *screen,
|
||||||
int monitor,
|
int monitor,
|
||||||
MetaRectangle *geometry);
|
MetaRectangle *geometry);
|
||||||
|
Loading…
Reference in New Issue
Block a user