[vino/gnome-2-26] Added an option to disable XDamage extension.
- From: Jonh Wendell <jwendell src gnome org>
- To: svn-commits-list gnome org
- Subject: [vino/gnome-2-26] Added an option to disable XDamage extension.
- Date: Tue, 12 May 2009 07:42:26 -0400 (EDT)
commit f5260a2ad0ad9f3b1c673f6a52a938abd2a58dbb
Author: Jonh Wendell <jwendell gnome org>
Date: Mon May 11 17:03:28 2009 -0300
Added an option to disable XDamage extension.
In some environments the XDamage extension does not work properly
on 3D desktops. This adds a boolean gconf key 'disable_xdamage'.
If it is set to TRUE, VinoFB object willl not use it. Closes #533613.
---
server/vino-fb.c | 31 ++++++++++++++++++++++++-
server/vino-fb.h | 2 +-
server/vino-prefs.c | 42 +++++++++++++++++++++++++++++++++++-
server/vino-server.c | 48 +++++++++++++++++++++++++++++++++++++++-
server/vino-server.h | 10 ++++++--
server/vino-server.schemas.in | 17 ++++++++++++++
6 files changed, 141 insertions(+), 9 deletions(-)
diff --git a/server/vino-fb.c b/server/vino-fb.c
index 0aa3179..12b6e5f 100644
--- a/server/vino-fb.c
+++ b/server/vino-fb.c
@@ -90,6 +90,7 @@ struct _VinoFBPrivate
guint use_x_shm : 1;
guint use_xdamage : 1;
+ guint disable_xdamage : 1;
guint fb_image_is_x_shm_segment : 1;
guint scanline_is_x_shm_segment : 1;
@@ -100,7 +101,8 @@ struct _VinoFBPrivate
enum
{
PROP_0,
- PROP_SCREEN
+ PROP_SCREEN,
+ PROP_DISABLE_XDAMAGE
};
enum
@@ -697,6 +699,12 @@ vino_fb_init_xdamage (VinoFB *vfb)
int major, minor;
XGCValues values;
+ if (vfb->priv->disable_xdamage)
+ {
+ dprintf (POLLING, "Not using XDamage extension, as requested via gconf key\n");
+ return;
+ }
+
if (!XDamageQueryExtension (vfb->priv->xdisplay, &event_base, &error_base))
return;
@@ -918,6 +926,9 @@ vino_fb_set_property (GObject *object,
case PROP_SCREEN:
vino_fb_init_from_screen (vfb, g_value_get_object (value));
break;
+ case PROP_DISABLE_XDAMAGE:
+ vfb->priv->disable_xdamage = g_value_get_boolean (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -937,6 +948,9 @@ vino_fb_get_property (GObject *object,
case PROP_SCREEN:
g_value_set_object (value, vfb->priv->screen);
break;
+ case PROP_DISABLE_XDAMAGE:
+ g_value_set_boolean (value, vfb->priv->disable_xdamage);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -986,6 +1000,18 @@ vino_fb_class_init (VinoFBClass *klass)
G_PARAM_STATIC_NICK |
G_PARAM_STATIC_BLURB));
+ g_object_class_install_property (gobject_class,
+ PROP_DISABLE_XDAMAGE,
+ g_param_spec_boolean ("disable-xdamage",
+ "Disable XDamage",
+ "Whether to disable XDamage",
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_NAME |
+ G_PARAM_STATIC_NICK |
+ G_PARAM_STATIC_BLURB));
+
signals [DAMAGE_NOTIFY] =
g_signal_new ("damage-notify",
G_OBJECT_CLASS_TYPE (gobject_class),
@@ -1035,13 +1061,14 @@ vino_fb_get_type (void)
VinoFB *
-vino_fb_new (GdkScreen *screen)
+vino_fb_new (GdkScreen *screen, gboolean disable_xdamage)
{
VinoFB *vfb;
g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
vfb = g_object_new (VINO_TYPE_FB,
+ "disable-xdamage", disable_xdamage,
"screen", screen,
NULL);
if (vfb && !vfb->priv->fb_image)
diff --git a/server/vino-fb.h b/server/vino-fb.h
index 7fb1206..149ebee 100644
--- a/server/vino-fb.h
+++ b/server/vino-fb.h
@@ -56,7 +56,7 @@ struct _VinoFBClass
GType vino_fb_get_type (void) G_GNUC_CONST;
-VinoFB *vino_fb_new (GdkScreen *screen);
+VinoFB *vino_fb_new (GdkScreen *screen, gboolean disable_xdamage);
GdkScreen *vino_fb_get_screen (VinoFB *vfb);
char *vino_fb_get_pixels (VinoFB *vfb);
diff --git a/server/vino-prefs.c b/server/vino-prefs.c
index 374a96d..642adf6 100644
--- a/server/vino-prefs.c
+++ b/server/vino-prefs.c
@@ -49,8 +49,9 @@
#define VINO_PREFS_ICON_VISIBILITY VINO_PREFS_DIR "/icon_visibility"
#define VINO_PREFS_DISABLE_BACKGROUND VINO_PREFS_DIR "/disable_background"
#define VINO_PREFS_USE_UPNP VINO_PREFS_DIR "/use_upnp"
+#define VINO_PREFS_DISABLE_XDAMAGE VINO_PREFS_DIR "/disable_xdamage"
-#define VINO_N_LISTENERS 13
+#define VINO_N_LISTENERS 14
#define VINO_PREFS_LOCKFILE "vino-server.lock"
@@ -70,6 +71,7 @@ static int vino_alternative_port = VINO_SERVER_DEFAULT_PORT;
static gboolean vino_lock_screen = FALSE;
static gboolean vino_disable_background = FALSE;
static gboolean vino_use_upnp = TRUE;
+static gboolean vino_disable_xdamage = FALSE;
static VinoStatusIconVisibility vino_icon_visibility = VINO_STATUS_ICON_VISIBILITY_CLIENT;
static void
@@ -467,6 +469,30 @@ vino_prefs_use_upnp_changed (GConfClient *client,
vino_server_set_use_upnp (l->data, use_upnp);
}
+static void
+vino_prefs_disable_xdamage_changed (GConfClient *client,
+ guint cnxn_id,
+ GConfEntry *entry)
+{
+ gboolean disable_xdamage;
+ GSList *l;
+
+ if (!entry->value || entry->value->type != GCONF_VALUE_BOOL)
+ return;
+
+ disable_xdamage = gconf_value_get_bool (entry->value) != FALSE;
+
+ if (vino_disable_xdamage == disable_xdamage)
+ return;
+
+ vino_disable_xdamage = disable_xdamage;
+
+ dprintf (PREFS, "Disable XDamage: %s\n", vino_disable_xdamage ? "(true)" : "(false)");
+
+ for (l = vino_servers; l; l = l->next)
+ vino_server_set_disable_xdamage (l->data, disable_xdamage);
+}
+
void
vino_prefs_create_server (GdkScreen *screen)
{
@@ -488,6 +514,7 @@ vino_prefs_create_server (GdkScreen *screen)
"lock-screen", vino_lock_screen,
"disable-background", vino_disable_background,
"use-upnp", vino_use_upnp,
+ "disable-xdamage", vino_disable_xdamage,
NULL);
vino_servers = g_slist_prepend (vino_servers, server);
@@ -690,6 +717,11 @@ vino_prefs_init (gboolean view_only)
NULL);
dprintf (PREFS, "Use UPNP: %s\n", vino_use_upnp ? "(true)" : "(false)");
+ vino_disable_xdamage = gconf_client_get_bool (vino_client,
+ VINO_PREFS_DISABLE_XDAMAGE,
+ NULL);
+ dprintf (PREFS, "Disable XDamage: %s\n", vino_disable_xdamage ? "(true)" : "(false)");
+
key_str = gconf_client_get_string (vino_client,
VINO_PREFS_ICON_VISIBILITY,
NULL);
@@ -796,6 +828,14 @@ vino_prefs_init (gboolean view_only)
i++;
+ vino_listeners [i] =
+ gconf_client_notify_add (vino_client,
+ VINO_PREFS_DISABLE_XDAMAGE,
+ (GConfClientNotifyFunc) vino_prefs_disable_xdamage_changed,
+ NULL, NULL, NULL);
+
+ i++;
+
g_assert (i == VINO_N_LISTENERS);
}
diff --git a/server/vino-server.c b/server/vino-server.c
index 562597d..532c4b8 100644
--- a/server/vino-server.c
+++ b/server/vino-server.c
@@ -87,6 +87,7 @@ struct _VinoServerPrivate
guint lock_screen : 1;
guint disable_background : 1;
guint use_upnp : 1;
+ guint disable_xdamage : 1;
};
struct _VinoClient
@@ -118,7 +119,8 @@ enum
PROP_PORT,
PROP_LOCK_SCREEN,
PROP_DISABLE_BACKGROUND,
- PROP_USE_UPNP
+ PROP_USE_UPNP,
+ PROP_DISABLE_XDAMAGE
};
static enum rfbNewClientAction vino_server_auth_client (VinoServer *server,
@@ -270,6 +272,29 @@ vino_server_get_use_upnp (VinoServer *server)
return server->priv->use_upnp;
}
+void
+vino_server_set_disable_xdamage (VinoServer *server,
+ gboolean disable_xdamage)
+{
+ g_return_if_fail (VINO_IS_SERVER (server));
+
+ disable_xdamage = disable_xdamage != FALSE;
+
+ if (server->priv->disable_xdamage != disable_xdamage)
+ {
+ server->priv->disable_xdamage = disable_xdamage;
+ g_object_notify (G_OBJECT (server), "disable-xdamage");
+ }
+}
+
+gboolean
+vino_server_get_disable_xdamage (VinoServer *server)
+{
+ g_return_val_if_fail (VINO_IS_SERVER (server), FALSE);
+
+ return server->priv->disable_xdamage;
+}
+
static void
vino_server_client_accepted (VinoServer *server,
VinoClient *client)
@@ -849,7 +874,7 @@ vino_server_setup_framebuffer (VinoServer *server)
g_return_if_fail (server->priv->fb == NULL);
g_return_if_fail (server->priv->cursor_data == NULL);
- server->priv->fb = vino_fb_new (server->priv->screen);
+ server->priv->fb = vino_fb_new (server->priv->screen, server->priv->disable_xdamage);
g_signal_connect_swapped (server->priv->fb, "size-changed",
G_CALLBACK (vino_server_screen_size_changed),
@@ -1029,6 +1054,7 @@ vino_server_init_from_screen (VinoServer *server,
server->priv->icon = vino_status_icon_new (server, server->priv->screen);
server->priv->upnp = NULL;
+ server->priv->disable_xdamage = FALSE;
}
static void
@@ -1155,6 +1181,9 @@ vino_server_set_property (GObject *object,
case PROP_USE_UPNP:
vino_server_set_use_upnp (server, g_value_get_boolean (value));
break;
+ case PROP_DISABLE_XDAMAGE:
+ vino_server_set_disable_xdamage (server, g_value_get_boolean (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1213,6 +1242,9 @@ vino_server_get_property (GObject *object,
case PROP_USE_UPNP:
g_value_set_boolean (value, server->priv->use_upnp);
break;
+ case PROP_DISABLE_XDAMAGE:
+ g_value_set_boolean (value, server->priv->disable_xdamage);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -1409,6 +1441,18 @@ vino_server_class_init (VinoServerClass *klass)
G_PARAM_STATIC_NICK |
G_PARAM_STATIC_BLURB));
+ g_object_class_install_property (gobject_class,
+ PROP_DISABLE_XDAMAGE,
+ g_param_spec_boolean ("disable-xdamage",
+ "Disable XDamage",
+ "Whether to disable XDamage",
+ FALSE,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT |
+ G_PARAM_STATIC_NAME |
+ G_PARAM_STATIC_NICK |
+ G_PARAM_STATIC_BLURB));
+
}
GType
diff --git a/server/vino-server.h b/server/vino-server.h
index 75aeb8a..2442be7 100644
--- a/server/vino-server.h
+++ b/server/vino-server.h
@@ -107,9 +107,13 @@ void vino_server_set_disable_background (VinoServer *serve
gboolean disable_background);
gboolean vino_server_get_disable_background (VinoServer *server);
-void vino_server_set_use_upnp (VinoServer *server,
- gboolean use_upnp);
-gboolean vino_server_get_use_upnp (VinoServer *server);
+void vino_server_set_use_upnp (VinoServer *server,
+ gboolean use_upnp);
+gboolean vino_server_get_use_upnp (VinoServer *server);
+
+void vino_server_set_disable_xdamage (VinoServer *server,
+ gboolean disable_xdamage);
+gboolean vino_server_get_disable_xdamage (VinoServer *server);
#include "vino-status-icon.h"
VinoStatusIcon *vino_server_get_status_icon (VinoServer *server);
diff --git a/server/vino-server.schemas.in b/server/vino-server.schemas.in
index 8a9efa7..4b22232 100644
--- a/server/vino-server.schemas.in
+++ b/server/vino-server.schemas.in
@@ -229,5 +229,22 @@
</locale>
</schema>
+ <schema>
+ <key>/schemas/desktop/gnome/remote_access/disable_xdamage</key>
+ <applyto>/desktop/gnome/remote_access/disable_xdamage</applyto>
+ <owner>gnome</owner>
+ <type>bool</type>
+ <default>false</default>
+ <locale name="C">
+ <short>Whether we should disable the XDamage extension of X.org</short>
+ <long>
+ If true, we will not use the XDamage extension of X.org. This extension
+ does not work properly on some video drivers when using 3D effects.
+ Disabling it will make vino work on these environments with a slower
+ rendering as side effect.
+ </long>
+ </locale>
+ </schema>
+
</schemalist>
</gconfschemafile>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]