[vino/gnome-2-26] Added an option to disable XDamage extension.



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]