monitor-manager: Take panel orientation into account when getting input matrix

If a LCD panel has a non normal orientation (mounted upside-down or 90
degrees rotated) then the kernel will report touchscreen coordinates with
the origin matching the native (e.g. upside down) coordinates of the panel.

Since we transparently rotate the image on the panel to correct for the
non normal panel-orientation, we must apply the same transform to input
coordinates to keep the aligned.

https://bugzilla.gnome.org/show_bug.cgi?id=782294
This commit is contained in:
Hans de Goede 2017-10-06 13:41:49 +02:00 committed by Jonas Ådahl
parent 7917b083cb
commit e59ca14f6c
3 changed files with 41 additions and 38 deletions

View File

@ -772,9 +772,8 @@ update_keyboard_repeat (MetaInputSettings *input_settings)
repeat, delay, interval); repeat, delay, interval);
} }
static gboolean static MetaMonitor *
logical_monitor_has_monitor (MetaMonitorManager *monitor_manager, logical_monitor_find_monitor (MetaLogicalMonitor *logical_monitor,
MetaLogicalMonitor *logical_monitor,
const char *vendor, const char *vendor,
const char *product, const char *product,
const char *serial) const char *serial)
@ -790,20 +789,22 @@ logical_monitor_has_monitor (MetaMonitorManager *monitor_manager,
if (g_strcmp0 (meta_monitor_get_vendor (monitor), vendor) == 0 && if (g_strcmp0 (meta_monitor_get_vendor (monitor), vendor) == 0 &&
g_strcmp0 (meta_monitor_get_product (monitor), product) == 0 && g_strcmp0 (meta_monitor_get_product (monitor), product) == 0 &&
g_strcmp0 (meta_monitor_get_serial (monitor), serial) == 0) g_strcmp0 (meta_monitor_get_serial (monitor), serial) == 0)
return TRUE; return monitor;
} }
return FALSE; return NULL;
} }
static MetaLogicalMonitor * static void
meta_input_settings_find_logical_monitor (MetaInputSettings *input_settings, meta_input_settings_find_monitor (MetaInputSettings *input_settings,
GSettings *settings, GSettings *settings,
ClutterInputDevice *device) ClutterInputDevice *device,
MetaMonitor **out_monitor,
MetaLogicalMonitor **out_logical_monitor)
{ {
MetaInputSettingsPrivate *priv; MetaInputSettingsPrivate *priv;
MetaMonitorManager *monitor_manager; MetaMonitorManager *monitor_manager;
MetaLogicalMonitor *ret = NULL; MetaMonitor *monitor;
guint n_values; guint n_values;
GList *logical_monitors; GList *logical_monitors;
GList *l; GList *l;
@ -831,20 +832,20 @@ meta_input_settings_find_logical_monitor (MetaInputSettings *input_settings,
{ {
MetaLogicalMonitor *logical_monitor = l->data; MetaLogicalMonitor *logical_monitor = l->data;
if (logical_monitor_has_monitor (monitor_manager, monitor = logical_monitor_find_monitor (logical_monitor,
logical_monitor, edid[0], edid[1], edid[2]);
edid[0], if (monitor)
edid[1],
edid[2]))
{ {
ret = logical_monitor; if (out_monitor)
*out_monitor = monitor;
if (out_logical_monitor)
*out_logical_monitor = logical_monitor;
break; break;
} }
} }
out: out:
g_strfreev (edid); g_strfreev (edid);
return ret;
} }
static void static void
@ -880,9 +881,8 @@ update_tablet_keep_aspect (MetaInputSettings *input_settings,
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE) CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE)
{ {
keep_aspect = g_settings_get_boolean (settings, "keep-aspect"); keep_aspect = g_settings_get_boolean (settings, "keep-aspect");
logical_monitor = meta_input_settings_find_logical_monitor (input_settings, meta_input_settings_find_monitor (input_settings, settings, device,
settings, NULL, &logical_monitor);
device);
} }
else else
{ {
@ -901,7 +901,8 @@ update_device_display (MetaInputSettings *input_settings,
MetaInputSettingsClass *input_settings_class; MetaInputSettingsClass *input_settings_class;
MetaInputSettingsPrivate *priv; MetaInputSettingsPrivate *priv;
gfloat matrix[6] = { 1, 0, 0, 0, 1, 0 }; gfloat matrix[6] = { 1, 0, 0, 0, 1, 0 };
MetaLogicalMonitor *logical_monitor; MetaMonitor *monitor = NULL;
MetaLogicalMonitor *logical_monitor = NULL;
if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE && if (clutter_input_device_get_device_type (device) != CLUTTER_TABLET_DEVICE &&
clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE && clutter_input_device_get_device_type (device) != CLUTTER_PEN_DEVICE &&
@ -916,15 +917,12 @@ update_device_display (MetaInputSettings *input_settings,
if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE || if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE ||
clutter_input_device_get_mapping_mode (device) == clutter_input_device_get_mapping_mode (device) ==
CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE) CLUTTER_INPUT_DEVICE_MAPPING_ABSOLUTE)
logical_monitor = meta_input_settings_find_logical_monitor (input_settings, meta_input_settings_find_monitor (input_settings, settings, device,
settings, &monitor, &logical_monitor);
device);
else
logical_monitor = NULL;
if (logical_monitor) if (monitor)
meta_monitor_manager_get_monitor_matrix (priv->monitor_manager, meta_monitor_manager_get_monitor_matrix (priv->monitor_manager,
logical_monitor, matrix); monitor, logical_monitor, matrix);
input_settings_class->set_matrix (input_settings, device, matrix); input_settings_class->set_matrix (input_settings, device, matrix);
@ -1745,6 +1743,7 @@ MetaLogicalMonitor *
meta_input_settings_get_tablet_logical_monitor (MetaInputSettings *settings, meta_input_settings_get_tablet_logical_monitor (MetaInputSettings *settings,
ClutterInputDevice *device) ClutterInputDevice *device)
{ {
MetaLogicalMonitor *logical_monitor = NULL;
MetaInputSettingsPrivate *priv; MetaInputSettingsPrivate *priv;
DeviceMappingInfo *info; DeviceMappingInfo *info;
@ -1756,9 +1755,9 @@ meta_input_settings_get_tablet_logical_monitor (MetaInputSettings *settings,
if (!info) if (!info)
return NULL; return NULL;
return meta_input_settings_find_logical_monitor (settings, meta_input_settings_find_monitor (settings, info->settings, device,
info->settings, NULL, &logical_monitor);
device); return logical_monitor;
} }
GDesktopTabletMapping GDesktopTabletMapping
@ -1862,7 +1861,7 @@ meta_input_settings_cycle_tablet_output (MetaInputSettings *input_settings,
{ {
MetaInputSettingsPrivate *priv; MetaInputSettingsPrivate *priv;
DeviceMappingInfo *info; DeviceMappingInfo *info;
MetaLogicalMonitor *logical_monitor; MetaLogicalMonitor *logical_monitor = NULL;
const gchar *edid[4] = { 0 }, *pretty_name = NULL; const gchar *edid[4] = { 0 }, *pretty_name = NULL;
g_return_if_fail (META_IS_INPUT_SETTINGS (input_settings)); g_return_if_fail (META_IS_INPUT_SETTINGS (input_settings));
@ -1885,9 +1884,9 @@ meta_input_settings_cycle_tablet_output (MetaInputSettings *input_settings,
} }
#endif #endif
logical_monitor = meta_input_settings_find_logical_monitor (input_settings, meta_input_settings_find_monitor (input_settings, info->settings, device,
info->settings, NULL, &logical_monitor);
device);
if (!cycle_logical_monitors (input_settings, if (!cycle_logical_monitors (input_settings,
logical_monitor, logical_monitor,
&logical_monitor)) &logical_monitor))

View File

@ -316,6 +316,7 @@ void meta_monitor_manager_read_current_state (MetaMonitorManager *
void meta_monitor_manager_on_hotplug (MetaMonitorManager *manager); void meta_monitor_manager_on_hotplug (MetaMonitorManager *manager);
gboolean meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager, gboolean meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager,
MetaMonitor *monitor,
MetaLogicalMonitor *logical_monitor, MetaLogicalMonitor *logical_monitor,
gfloat matrix[6]); gfloat matrix[6]);

View File

@ -2856,6 +2856,7 @@ multiply_matrix (float a[6],
gboolean gboolean
meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager, meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager,
MetaMonitor *monitor,
MetaLogicalMonitor *logical_monitor, MetaLogicalMonitor *logical_monitor,
gfloat matrix[6]) gfloat matrix[6])
{ {
@ -2865,7 +2866,9 @@ meta_monitor_manager_get_monitor_matrix (MetaMonitorManager *manager,
if (!calculate_viewport_matrix (manager, logical_monitor, viewport)) if (!calculate_viewport_matrix (manager, logical_monitor, viewport))
return FALSE; return FALSE;
/* Get transform corrected for LCD panel-orientation. */
transform = logical_monitor->transform; transform = logical_monitor->transform;
transform = meta_monitor_logical_to_crtc_transform (monitor, transform);
multiply_matrix (viewport, transform_matrices[transform], multiply_matrix (viewport, transform_matrices[transform],
matrix); matrix);
return TRUE; return TRUE;