[gnome-flashback] display-config: add support for overscan compensation
- From: Alberts Muktupāvels <muktupavels src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-flashback] display-config: add support for overscan compensation
- Date: Wed, 29 Apr 2015 12:51:58 +0000 (UTC)
commit 7cd0de04d355b1cb69c311b7f32bd847ae6f1aec
Author: Tomeu Vizoso <tomeu vizoso collabora com>
Date: Wed Apr 16 10:20:55 2014 +0200
display-config: add support for overscan compensation
Some DRM drivers have added a consistent set of properties that
allow compensating for the overscan that some TVs do, without the
user being able to disable.
.../libdisplay-config/flashback-display-config.c | 6 ++
.../libdisplay-config/flashback-monitor-config.c | 14 ++++-
.../libdisplay-config/flashback-monitor-manager.c | 59 ++++++++++++++++++++
.../libdisplay-config/flashback-monitor-manager.h | 2 +
4 files changed, 78 insertions(+), 3 deletions(-)
---
diff --git a/gnome-flashback/libdisplay-config/flashback-display-config.c
b/gnome-flashback/libdisplay-config/flashback-display-config.c
index 5161ea7..11ae7db 100644
--- a/gnome-flashback/libdisplay-config/flashback-display-config.c
+++ b/gnome-flashback/libdisplay-config/flashback-display-config.c
@@ -382,6 +382,8 @@ handle_get_resources (MetaDBusDisplayConfig *skeleton,
g_variant_new_boolean (output->is_presentation));
g_variant_builder_add (&properties, "{sv}", "connector-type",
g_variant_new_string (get_connector_type_name (output->connector_type)));
+ g_variant_builder_add (&properties, "{sv}", "underscanning",
+ g_variant_new_boolean (output->is_underscanning));
edid = flashback_monitor_manager_read_edid (manager, output);
@@ -623,6 +625,7 @@ handle_apply_configuration (MetaDBusDisplayConfig *skeleton,
MetaOutputInfo *output_info;
gboolean primary;
gboolean presentation;
+ gboolean underscanning;
if (output_index >= manager->n_outputs)
{
@@ -641,6 +644,9 @@ handle_apply_configuration (MetaDBusDisplayConfig *skeleton,
if (g_variant_lookup (properties, "presentation", "b", &presentation))
output_info->is_presentation = presentation;
+ if (g_variant_lookup (properties, "underscanning", "b", &underscanning))
+ output_info->is_underscanning = underscanning;
+
g_ptr_array_add (output_infos, output_info);
}
diff --git a/gnome-flashback/libdisplay-config/flashback-monitor-config.c
b/gnome-flashback/libdisplay-config/flashback-monitor-config.c
index dc45fac..970425b 100644
--- a/gnome-flashback/libdisplay-config/flashback-monitor-config.c
+++ b/gnome-flashback/libdisplay-config/flashback-monitor-config.c
@@ -57,6 +57,7 @@ typedef struct {
gboolean is_primary;
gboolean is_presentation;
+ gboolean is_underscanning;
} MetaOutputConfig;
typedef struct {
@@ -664,6 +665,7 @@ meta_monitor_config_assign_crtcs (MetaConfiguration *config,
&config->keys[i]);
output_info->is_primary = output_config->is_primary;
output_info->is_presentation = output_config->is_presentation;
+ output_info->is_underscanning = output_config->is_underscanning;
g_ptr_array_add (outputs, output_info);
}
@@ -865,7 +867,8 @@ handle_start_element (GMarkupParseContext *context,
strcmp (element_name, "reflect_x") == 0 ||
strcmp (element_name, "reflect_y") == 0 ||
strcmp (element_name, "primary") == 0 ||
- strcmp (element_name, "presentation") == 0) && parser->unknown_count == 0)
+ strcmp (element_name, "presentation") == 0 ||
+ strcmp (element_name, "underscanning") == 0) && parser->unknown_count == 0)
{
parser->state = STATE_OUTPUT_FIELD;
@@ -1172,6 +1175,8 @@ handle_text (GMarkupParseContext *context,
parser->output.is_primary = read_bool (text, text_len, error);
else if (strcmp (parser->output_field, "presentation") == 0)
parser->output.is_presentation = read_bool (text, text_len, error);
+ else if (strcmp (parser->output_field, "underscanning") == 0)
+ parser->output.is_underscanning = read_bool (text, text_len, error);
else
g_assert_not_reached ();
return;
@@ -1654,6 +1659,7 @@ init_config_from_output (MetaOutputConfig *config,
config->transform = output->crtc->transform;
config->is_primary = output->is_primary;
config->is_presentation = output->is_presentation;
+ config->is_underscanning = output->is_underscanning;
}
static void
@@ -1748,7 +1754,8 @@ meta_monitor_config_save (FlashbackMonitorConfig *self)
" <reflect_x>%s</reflect_x>\n"
" <reflect_y>no</reflect_y>\n"
" <primary>%s</primary>\n"
- " <presentation>%s</presentation>\n",
+ " <presentation>%s</presentation>\n"
+ " <underscanning>%s</underscanning>\n",
output->rect.width,
output->rect.height,
refresh_rate,
@@ -1757,7 +1764,8 @@ meta_monitor_config_save (FlashbackMonitorConfig *self)
rotation_map[output->transform & 0x3],
output->transform >= META_MONITOR_TRANSFORM_FLIPPED ? "yes" : "no",
output->is_primary ? "yes" : "no",
- output->is_presentation ? "yes" : "no");
+ output->is_presentation ? "yes" : "no",
+ output->is_underscanning ? "yes" : "no");
}
g_string_append (buffer, " </output>\n");
diff --git a/gnome-flashback/libdisplay-config/flashback-monitor-manager.c
b/gnome-flashback/libdisplay-config/flashback-monitor-manager.c
index e662ab0..22c41cd 100644
--- a/gnome-flashback/libdisplay-config/flashback-monitor-manager.c
+++ b/gnome-flashback/libdisplay-config/flashback-monitor-manager.c
@@ -320,6 +320,38 @@ output_set_presentation_xrandr (FlashbackMonitorManagerPrivate *priv,
(unsigned char*) &value, 1);
}
+static gboolean
+output_get_underscanning_xrandr (FlashbackMonitorManagerPrivate *priv,
+ MetaOutput *output)
+{
+ gboolean value = FALSE;
+ Atom atom, actual_type;
+ int actual_format;
+ unsigned long nitems, bytes_after;
+ unsigned char *buffer;
+ char *str;
+
+ atom = XInternAtom (priv->xdisplay, "underscan", False);
+ XRRGetOutputProperty (priv->xdisplay,
+ (XID)output->winsys_id,
+ atom,
+ 0, G_MAXLONG, False, False, XA_ATOM,
+ &actual_type, &actual_format,
+ &nitems, &bytes_after, &buffer);
+
+ if (actual_type != XA_ATOM || actual_format != 32 ||
+ nitems < 1)
+ goto out;
+
+ str = XGetAtomName (priv->xdisplay, *(Atom *)buffer);
+ value = !strcmp(str, "on");
+ XFree (str);
+
+out:
+ XFree (buffer);
+ return value;
+}
+
static int
normalize_backlight (MetaOutput *output,
int hw_value)
@@ -1001,6 +1033,7 @@ read_current_config (FlashbackMonitorManager *manager)
meta_output->is_primary = ((XID)meta_output->winsys_id == primary_output);
meta_output->is_presentation = output_get_presentation_xrandr (priv, meta_output);
+ meta_output->is_underscanning = output_get_underscanning_xrandr (priv, meta_output);
output_get_backlight_limits_xrandr (priv, meta_output);
if (!(meta_output->backlight_min == 0 && meta_output->backlight_max == 0))
@@ -1192,6 +1225,27 @@ flashback_monitor_manager_new (MetaDBusDisplayConfig *display_config)
NULL);
}
+static void
+output_set_underscanning_xrandr (FlashbackMonitorManagerPrivate *priv,
+ MetaOutput *output,
+ gboolean underscanning)
+{
+ Atom prop, valueatom;
+ const char *value;
+
+ prop = XInternAtom (priv->xdisplay, "underscan", False);
+
+ /* XXX: Also implement underscan border */
+ value = underscanning ? "on" : "off";
+ valueatom = XInternAtom (priv->xdisplay, value, False);
+
+ XRRChangeOutputProperty (priv->xdisplay,
+ (XID)output->winsys_id,
+ prop,
+ XA_ATOM, 32, PropModeReplace,
+ (unsigned char*) &valueatom, 1);
+}
+
void
flashback_monitor_manager_apply_configuration (FlashbackMonitorManager *manager,
MetaCRTCInfo **crtcs,
@@ -1392,8 +1446,13 @@ flashback_monitor_manager_apply_configuration (FlashbackMonitorManager *manager
output_info->output,
output_info->is_presentation);
+ output_set_underscanning_xrandr (priv,
+ output_info->output,
+ output_info->is_underscanning);
+
output->is_primary = output_info->is_primary;
output->is_presentation = output_info->is_presentation;
+ output->is_underscanning = output_info->is_underscanning;
}
/* Disable outputs not mentioned in the list */
diff --git a/gnome-flashback/libdisplay-config/flashback-monitor-manager.h
b/gnome-flashback/libdisplay-config/flashback-monitor-manager.h
index 4ea3db0..0300180 100644
--- a/gnome-flashback/libdisplay-config/flashback-monitor-manager.h
+++ b/gnome-flashback/libdisplay-config/flashback-monitor-manager.h
@@ -112,6 +112,7 @@ struct _MetaOutput
*/
gboolean is_primary;
gboolean is_presentation;
+ gboolean is_underscanning;
gpointer driver_private;
GDestroyNotify driver_notify;
@@ -210,6 +211,7 @@ struct _MetaOutputInfo
MetaOutput *output;
gboolean is_primary;
gboolean is_presentation;
+ gboolean is_underscanning;
};
#define FLASHBACK_TYPE_MONITOR_MANAGER flashback_monitor_manager_get_type ()
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]