[Xfce4-commits] r30202 - terminal/trunk/terminal

Nick Schermer nick at xfce.org
Sun Jul 5 18:05:27 CEST 2009


Author: nick
Date: 2009-07-05 16:05:26 +0000 (Sun, 05 Jul 2009)
New Revision: 30202

Modified:
   terminal/trunk/terminal/terminal-app.c
   terminal/trunk/terminal/terminal-screen.c
   terminal/trunk/terminal/terminal-window.c
Log:
Set the rgba colormap on the window.

Hopefully this will fix some issues regarding drawing
problems with the compositor. The previous way
was a bit of a flaw since the vte widget was assumed
to be composited while the window had no rgba colormap.


Modified: terminal/trunk/terminal/terminal-app.c
===================================================================
--- terminal/trunk/terminal/terminal-app.c	2009-07-05 15:09:54 UTC (rev 30201)
+++ terminal/trunk/terminal/terminal-app.c	2009-07-05 16:05:26 UTC (rev 30202)
@@ -360,7 +360,6 @@
 terminal_app_find_screen (const gchar *display_name)
 {
   const gchar *other_name;
-  GdkColormap *colormap;
   GdkDisplay  *display = NULL;
   GdkScreen   *screen = NULL;
   GSList      *displays;
@@ -421,23 +420,6 @@
       g_object_ref (G_OBJECT (screen));
     }
 
-  /* check if we already checked this screen */
-  if (g_object_get_data (G_OBJECT (screen), "terminal-checked-screen") == NULL)
-    {
-      /* check if we can use ARGB visual for this screen */
-      colormap = gdk_screen_get_rgba_colormap (screen);
-      if (G_LIKELY (colormap != NULL))
-        {
-          /* use ARGB visual for all windows on this screen, required
-           * for real transparency with a compositing manager.
-           */
-          gdk_screen_set_default_colormap (screen, colormap);
-        }
-
-      /* mark this screen as handled */
-      g_object_set_data (G_OBJECT (screen), I_("terminal-checked-screen"), GINT_TO_POINTER (1));
-    }
-
   return screen;
 }
 

Modified: terminal/trunk/terminal/terminal-screen.c
===================================================================
--- terminal/trunk/terminal/terminal-screen.c	2009-07-05 15:09:54 UTC (rev 30201)
+++ terminal/trunk/terminal/terminal-screen.c	2009-07-05 16:05:26 UTC (rev 30202)
@@ -977,11 +977,12 @@
 static gboolean
 terminal_screen_timer_background (gpointer user_data)
 {
+  TerminalScreen      *screen = TERMINAL_SCREEN (user_data);
   TerminalImageLoader *loader;
   TerminalBackground   background_mode;
-  TerminalScreen      *screen = TERMINAL_SCREEN (user_data);
   GdkPixbuf           *image;
   gdouble              background_darkness;
+  gboolean             transparent = FALSE;
 
   terminal_return_val_if_fail (TERMINAL_IS_SCREEN (screen), FALSE);
   terminal_return_val_if_fail (VTE_IS_TERMINAL (screen->terminal), FALSE);
@@ -990,49 +991,49 @@
 
   g_object_get (G_OBJECT (screen->preferences), "background-mode", &background_mode, NULL);
 
-  if (background_mode == TERMINAL_BACKGROUND_SOLID)
+
+  if (G_UNLIKELY (background_mode == TERMINAL_BACKGROUND_IMAGE))
     {
-      vte_terminal_set_background_image (VTE_TERMINAL (screen->terminal), NULL);
-      vte_terminal_set_background_saturation (VTE_TERMINAL (screen->terminal), 1.0);
-      vte_terminal_set_background_transparent (VTE_TERMINAL (screen->terminal), FALSE);
-      vte_terminal_set_opacity (VTE_TERMINAL (screen->terminal), 0xFFFF);
-    }
-  else if (background_mode == TERMINAL_BACKGROUND_IMAGE)
-    {
-      vte_terminal_set_background_saturation (VTE_TERMINAL (screen->terminal), 1.0);
-      vte_terminal_set_background_transparent (VTE_TERMINAL (screen->terminal), FALSE);
-
       loader = terminal_image_loader_get ();
       image = terminal_image_loader_load (loader,
                                           screen->terminal->allocation.width,
                                           screen->terminal->allocation.height);
       vte_terminal_set_background_image (VTE_TERMINAL (screen->terminal), image);
-      vte_terminal_set_opacity (VTE_TERMINAL (screen->terminal), 0xFFFF);
 
-      if (image != NULL)
+      if (G_LIKELY (image != NULL))
         g_object_unref (G_OBJECT (image));
       g_object_unref (G_OBJECT (loader));
     }
   else
     {
-      g_object_get (G_OBJECT (screen->preferences), "background-darkness", &background_darkness, NULL);
       vte_terminal_set_background_image (VTE_TERMINAL (screen->terminal), NULL);
+    }
 
-      /* check if the X screen is composited */
-      if (gdk_screen_is_composited (gtk_widget_get_screen (user_data)))
+  if (G_UNLIKELY (background_mode == TERMINAL_BACKGROUND_IMAGE
+      || background_mode == TERMINAL_BACKGROUND_TRANSPARENT))
+    {
+      g_object_get (G_OBJECT (screen->preferences), "background-darkness", &background_darkness, NULL);
+
+      if (gtk_widget_is_composited (GTK_WIDGET (screen)))
         {
+          vte_terminal_set_opacity (VTE_TERMINAL (screen->terminal), 0xffff * background_darkness);
           vte_terminal_set_background_saturation (VTE_TERMINAL (screen->terminal), 1.0);
-          vte_terminal_set_background_transparent (VTE_TERMINAL (screen->terminal), FALSE);
-          vte_terminal_set_opacity (VTE_TERMINAL (screen->terminal), (guint16) (0xFFFFu * background_darkness));
         }
       else
         {
           vte_terminal_set_background_saturation (VTE_TERMINAL (screen->terminal), 1.0 - background_darkness);
-          vte_terminal_set_background_transparent (VTE_TERMINAL (screen->terminal), TRUE);
-          vte_terminal_set_opacity (VTE_TERMINAL (screen->terminal), 0xFFFF);
+          vte_terminal_set_opacity (VTE_TERMINAL (screen->terminal), 0xffff);
+          transparent = TRUE;
         }
     }
+  else
+    {
+      vte_terminal_set_background_saturation (VTE_TERMINAL (screen->terminal), 1.0);
+      vte_terminal_set_opacity (VTE_TERMINAL (screen->terminal), 0xffff);
+    }
 
+  vte_terminal_set_background_transparent (VTE_TERMINAL (screen->terminal), transparent);
+
   screen->last_size_change = time (NULL);
 
   GDK_THREADS_LEAVE ();

Modified: terminal/trunk/terminal/terminal-window.c
===================================================================
--- terminal/trunk/terminal/terminal-window.c	2009-07-05 15:09:54 UTC (rev 30201)
+++ terminal/trunk/terminal/terminal-window.c	2009-07-05 16:05:26 UTC (rev 30202)
@@ -84,6 +84,7 @@
 static void            terminal_window_dispose                       (GObject                *object);
 static void            terminal_window_finalize                      (GObject                *object);
 static void            terminal_window_show                          (GtkWidget              *widget);
+static void            terminal_window_realize                       (GtkWidget              *widget);
 static gboolean        terminal_window_confirm_close                 (TerminalWindow         *window);
 static void            terminal_window_queue_reset_size              (TerminalWindow         *window);
 static gboolean        terminal_window_reset_size                    (gpointer                user_data);
@@ -207,6 +208,9 @@
   TerminalScreen      *active;
 
   guint                reset_size_idle_id;
+
+  /* whether this window has an rgba colormap */
+  guint                is_composited : 1;
 };
 
 
@@ -272,6 +276,7 @@
 
   gtkwidget_class = GTK_WIDGET_CLASS (klass);
   gtkwidget_class->show = terminal_window_show;
+  gtkwidget_class->realize = terminal_window_realize;
 
   /**
    * TerminalWindow::new-window
@@ -495,6 +500,34 @@
 
 
 
+static void
+terminal_window_realize (GtkWidget *widget)
+{
+  TerminalWindow *window = TERMINAL_WINDOW (widget);
+  GdkScreen      *screen;
+  GdkColormap    *colormap;
+
+  /* unset rgba */
+  window->is_composited = FALSE;
+
+  /* try to set the rgba colormap so vte can use real transparency */
+  screen = gtk_widget_get_screen (widget);
+  if (gdk_screen_is_composited (screen))
+    {
+      colormap = gdk_screen_get_rgba_colormap (screen);
+      if (G_LIKELY (colormap != NULL))
+        window->is_composited = TRUE;
+      else
+        colormap = gdk_screen_get_default_colormap (screen);
+
+      gtk_widget_set_colormap (widget, colormap);
+    }
+
+  (*GTK_WIDGET_CLASS (terminal_window_parent_class)->realize) (widget);
+}
+
+
+
 static gboolean
 terminal_window_confirm_close (TerminalWindow *window)
 {




More information about the Xfce4-commits mailing list