Author: benny
Date: 2006-12-21 20:53:43 +0000 (Thu, 21 Dec 2006)
New Revision: 24157

Modified:
   terminal/trunk/ChangeLog
   terminal/trunk/NEWS
   terminal/trunk/configure.in.in
   terminal/trunk/terminal/terminal-app.c
   terminal/trunk/terminal/terminal-screen.c
Log:
2006-12-21      Benedikt Meurer <[EMAIL PROTECTED]>

        * NEWS, configure.in.in, terminal/terminal-app.c,
          terminal/terminal-screen.c: Add support for real transparency with
          GTK+ 2.10 and a compositing manager. Bug #2671.




Modified: terminal/trunk/ChangeLog
===================================================================
--- terminal/trunk/ChangeLog    2006-12-21 13:36:48 UTC (rev 24156)
+++ terminal/trunk/ChangeLog    2006-12-21 20:53:43 UTC (rev 24157)
@@ -1,3 +1,9 @@
+2006-12-21     Benedikt Meurer <[EMAIL PROTECTED]>
+
+       * NEWS, configure.in.in, terminal/terminal-app.c,
+         terminal/terminal-screen.c: Add support for real transparency with
+         GTK+ 2.10 and a compositing manager. Bug #2671.
+
 2006-11-17     Benedikt Meurer <[EMAIL PROTECTED]>
 
        * terminal/terminal-window.c: Apply patch from Nick Schermer

Modified: terminal/trunk/NEWS
===================================================================
--- terminal/trunk/NEWS 2006-12-21 13:36:48 UTC (rev 24156)
+++ terminal/trunk/NEWS 2006-12-21 20:53:43 UTC (rev 24157)
@@ -1,3 +1,9 @@
+0.2.5.9svn
+==========
+- Add support for real transparency with GTK+ 2.10 and a compositing manager,
+  i.e. the one built into xfwm4 (Bug #2671).
+
+
 0.2.5.8rc2
 ==========
 - Add a new "Paste Selection" action to the "Edit" menu, which pastes the

Modified: terminal/trunk/configure.in.in
===================================================================
--- terminal/trunk/configure.in.in      2006-12-21 13:36:48 UTC (rev 24156)
+++ terminal/trunk/configure.in.in      2006-12-21 20:53:43 UTC (rev 24157)
@@ -126,6 +126,25 @@
 fi
 AM_CONDITIONAL([ENABLE_XML2PO], [test x"$enable_xml2po" = x"yes"])
 
+dnl **********************************
+dnl *** Check for VTE transparency ***
+dnl **********************************
+AC_MSG_CHECKING([whether VTE supports real transparency])
+save_LIBS="$LIBS"
+save_CFLAGS="$CFLAGS"
+LIBS="$LIBS $VTE_LIBS"
+CFLAGS="$CFLAGS $VTE_CFLAGS"
+AC_TRY_LINK([
+  #include <vte/vte.h>
+], [ vte_terminal_set_opacity (0, 0); ], [
+  AC_DEFINE_UNQUOTED([HAVE_VTE_TERMINAL_SET_OPACITY], [1], [Define to 1 if 
vte_terminal_set_opacity() is available])
+  AC_MSG_RESULT([yes])
+], [
+  AC_MSG_RESULT([no])
+])
+CFLAGS="$save_CFLAGS"
+LIBS="$save_LIBS"
+
 dnl ***********************************
 dnl *** Check for debugging support ***
 dnl ***********************************

Modified: terminal/trunk/terminal/terminal-app.c
===================================================================
--- terminal/trunk/terminal/terminal-app.c      2006-12-21 13:36:48 UTC (rev 
24156)
+++ terminal/trunk/terminal/terminal-app.c      2006-12-21 20:53:43 UTC (rev 
24157)
@@ -346,6 +346,9 @@
 terminal_app_find_screen (const gchar *display_name)
 {
   const gchar *other_name;
+#if GTK_CHECK_VERSION(2,10,0)
+  GdkColormap *colormap;
+#endif
   GdkDisplay  *display = NULL;
   GdkScreen   *screen = NULL;
   GSList      *displays;
@@ -406,6 +409,25 @@
       g_object_ref (G_OBJECT (screen));
     }
 
+#if GTK_CHECK_VERSION(2,10,0)
+  /* 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), "terminal-checked-screen", 
GINT_TO_POINTER (1));
+    }
+#endif
+
   return screen;
 }
 

Modified: terminal/trunk/terminal/terminal-screen.c
===================================================================
--- terminal/trunk/terminal/terminal-screen.c   2006-12-21 13:36:48 UTC (rev 
24156)
+++ terminal/trunk/terminal/terminal-screen.c   2006-12-21 20:53:43 UTC (rev 
24157)
@@ -70,51 +70,52 @@
 
 
 
-static void     terminal_screen_finalize                      (GObject         
 *object);
-static void     terminal_screen_get_property                  (GObject         
 *object,
-                                                               guint           
  prop_id,
-                                                               GValue          
 *value,
-                                                               GParamSpec      
 *pspec);
-static void     terminal_screen_set_property                  (GObject         
 *object,
-                                                               guint           
  prop_id,
-                                                               const GValue    
 *value,
-                                                               GParamSpec      
 *pspec);
-static void     terminal_screen_realize                       (GtkWidget       
*widget);
-static gboolean terminal_screen_get_child_command             (TerminalScreen  
 *screen,
-                                                               gchar           
**command,
-                                                               gchar          
***argv,
-                                                               GError          
**error);
-static gchar  **terminal_screen_get_child_environment         (TerminalScreen  
 *screen);
-static void terminal_screen_update_background                 (TerminalScreen  
 *screen);
-static void terminal_screen_update_binding_backspace          (TerminalScreen  
 *screen);
-static void terminal_screen_update_binding_delete             (TerminalScreen  
 *screen);
-static void terminal_screen_update_colors                     (TerminalScreen  
 *screen);
-static void terminal_screen_update_font                       (TerminalScreen  
 *screen);
-static void terminal_screen_update_misc_bell                  (TerminalScreen  
 *screen);
-static void terminal_screen_update_misc_cursor_blinks         (TerminalScreen  
 *screen);
-static void terminal_screen_update_misc_mouse_autohide        (TerminalScreen  
 *screen);
-static void terminal_screen_update_scrolling_bar              (TerminalScreen  
 *screen);
-static void terminal_screen_update_scrolling_lines            (TerminalScreen  
 *screen);
-static void terminal_screen_update_scrolling_on_output        (TerminalScreen  
 *screen);
-static void terminal_screen_update_scrolling_on_keystroke     (TerminalScreen  
 *screen);
-static void terminal_screen_update_title                      (TerminalScreen  
 *screen);
-static void terminal_screen_update_word_chars                 (TerminalScreen  
 *screen);
-static void terminal_screen_vte_child_exited                  (VteTerminal     
 *terminal,
-                                                               TerminalScreen  
 *screen);
-static void     terminal_screen_vte_eof                       (VteTerminal    
*terminal,
-                                                               TerminalScreen 
*screen);
-static GtkWidget *terminal_screen_vte_get_context_menu          
(TerminalWidget         *widget,
-                                                                 
TerminalScreen         *screen);
-static void       terminal_screen_vte_open_uri                  
(TerminalWidget         *widget,
-                                                                 const gchar   
         *uri,
-                                                                 
TerminalHelperCategory  category,
-                                                                 
TerminalScreen         *screen);
-static void       terminal_screen_vte_selection_changed         (VteTerminal   
         *terminal,
-                                                                 
TerminalScreen         *screen);
-static void       terminal_screen_vte_window_title_changed      (VteTerminal   
         *terminal,
-                                                                 
TerminalScreen         *screen);
-static gboolean   terminal_screen_timer_background              (gpointer      
          user_data);
-static void       terminal_screen_timer_background_destroy      (gpointer      
          user_data);
+static void       terminal_screen_finalize                      (GObject       
        *object);
+static void       terminal_screen_get_property                  (GObject       
        *object,
+                                                                 guint         
         prop_id,
+                                                                 GValue        
        *value,
+                                                                 GParamSpec    
        *pspec);
+static void       terminal_screen_set_property                  (GObject       
        *object,
+                                                                 guint         
         prop_id,
+                                                                 const GValue  
        *value,
+                                                                 GParamSpec    
        *pspec);
+static void       terminal_screen_realize                       (GtkWidget     
        *widget);
+static void       terminal_screen_unrealize                     (GtkWidget     
        *widget);
+static gboolean   terminal_screen_get_child_command             
(TerminalScreen        *screen,
+                                                                 gchar         
       **command,
+                                                                 gchar         
      ***argv,
+                                                                 GError        
       **error);
+static gchar    **terminal_screen_get_child_environment         
(TerminalScreen        *screen);
+static void       terminal_screen_update_background             
(TerminalScreen        *screen);
+static void       terminal_screen_update_binding_backspace      
(TerminalScreen        *screen);
+static void       terminal_screen_update_binding_delete         
(TerminalScreen        *screen);
+static void       terminal_screen_update_colors                 
(TerminalScreen        *screen);
+static void       terminal_screen_update_font                   
(TerminalScreen        *screen);
+static void       terminal_screen_update_misc_bell              
(TerminalScreen        *screen);
+static void       terminal_screen_update_misc_cursor_blinks     
(TerminalScreen        *screen);
+static void       terminal_screen_update_misc_mouse_autohide    
(TerminalScreen        *screen);
+static void       terminal_screen_update_scrolling_bar          
(TerminalScreen        *screen);
+static void       terminal_screen_update_scrolling_lines        
(TerminalScreen        *screen);
+static void       terminal_screen_update_scrolling_on_output    
(TerminalScreen        *screen);
+static void       terminal_screen_update_scrolling_on_keystroke 
(TerminalScreen        *screen);
+static void       terminal_screen_update_title                  
(TerminalScreen        *screen);
+static void       terminal_screen_update_word_chars             
(TerminalScreen        *screen);
+static void       terminal_screen_vte_child_exited              (VteTerminal   
        *terminal,
+                                                                 
TerminalScreen        *screen);
+static void       terminal_screen_vte_eof                       (VteTerminal   
        *terminal,
+                                                                 
TerminalScreen        *screen);
+static GtkWidget *terminal_screen_vte_get_context_menu          
(TerminalWidget        *widget,
+                                                                 
TerminalScreen        *screen);
+static void       terminal_screen_vte_open_uri                  
(TerminalWidget        *widget,
+                                                                 const gchar   
        *uri,
+                                                                 
TerminalHelperCategory category,
+                                                                 
TerminalScreen        *screen);
+static void       terminal_screen_vte_selection_changed         (VteTerminal   
        *terminal,
+                                                                 
TerminalScreen        *screen);
+static void       terminal_screen_vte_window_title_changed      (VteTerminal   
        *terminal,
+                                                                 
TerminalScreen        *screen);
+static gboolean   terminal_screen_timer_background              (gpointer      
         user_data);
+static void       terminal_screen_timer_background_destroy      (gpointer      
         user_data);
 
 
 
@@ -172,6 +173,7 @@
 
   gtkwidget_class = GTK_WIDGET_CLASS (klass);
   gtkwidget_class->realize = terminal_screen_realize;
+  gtkwidget_class->unrealize = terminal_screen_unrealize;
 
   /**
    * TerminalScreen:custom-title:
@@ -395,15 +397,41 @@
 static void
 terminal_screen_realize (GtkWidget *widget)
 {
+#if GTK_CHECK_VERSION(2,10,0) && defined(HAVE_VTE_TERMINAL_SET_OPACITY)
+  GdkScreen *screen;
+#endif
+
   (*GTK_WIDGET_CLASS (terminal_screen_parent_class)->realize) (widget);
 
   /* make sure the TerminalWidget is realized as well */
   if (!GTK_WIDGET_REALIZED (TERMINAL_SCREEN (widget)->terminal))
     gtk_widget_realize (TERMINAL_SCREEN (widget)->terminal);
+
+#if GTK_CHECK_VERSION(2,10,0) && defined(HAVE_VTE_TERMINAL_SET_OPACITY)
+  /* connect to the "composited-changed" signal */
+  screen = gtk_widget_get_screen (widget);
+  g_signal_connect_swapped (G_OBJECT (screen), "composited-changed", 
G_CALLBACK (terminal_screen_update_background), widget);
+#endif
 }
 
 
 
+static void
+terminal_screen_unrealize (GtkWidget *widget)
+{
+#if GTK_CHECK_VERSION(2,10,0) && defined(HAVE_VTE_TERMINAL_SET_OPACITY)
+  GdkScreen *screen;
+
+  /* disconnect the "composited-changed" handler */
+  screen = gtk_widget_get_screen (widget);
+  g_signal_handlers_disconnect_by_func (G_OBJECT (screen), 
terminal_screen_update_background, widget);
+#endif
+
+  (*GTK_WIDGET_CLASS (terminal_screen_parent_class)->unrealize) (widget);
+}
+
+
+
 static gboolean
 terminal_screen_get_child_command (TerminalScreen   *screen,
                                    gchar           **command,
@@ -868,6 +896,9 @@
       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);
+#if GTK_CHECK_VERSION(2,10,0) && defined(HAVE_VTE_TERMINAL_SET_OPACITY)
+      vte_terminal_set_opacity (VTE_TERMINAL (screen->terminal), 0xFFFF);
+#endif
     }
   else if (background_mode == TERMINAL_BACKGROUND_IMAGE)
     {
@@ -879,6 +910,9 @@
                                           screen->terminal->allocation.width,
                                           screen->terminal->allocation.height);
       vte_terminal_set_background_image (VTE_TERMINAL (screen->terminal), 
image);
+#if GTK_CHECK_VERSION(2,10,0) && defined(HAVE_VTE_TERMINAL_SET_OPACITY)
+      vte_terminal_set_opacity (VTE_TERMINAL (screen->terminal), 0xFFFF);
+#endif
       if (image != NULL)
         g_object_unref (G_OBJECT (image));
       g_object_unref (G_OBJECT (loader));
@@ -887,8 +921,24 @@
     {
       g_object_get (G_OBJECT (screen->preferences), "background-darkness", 
&background_darkness, NULL);
       vte_terminal_set_background_image (VTE_TERMINAL (screen->terminal), 
NULL);
-      vte_terminal_set_background_saturation (VTE_TERMINAL (screen->terminal), 
1.0 - background_darkness);
-      vte_terminal_set_background_transparent (VTE_TERMINAL 
(screen->terminal), TRUE);
+
+#if GTK_CHECK_VERSION(2,10,0) && defined(HAVE_VTE_TERMINAL_SET_OPACITY)
+      /* check if the X screen is composited */
+      if (gdk_screen_is_composited (gtk_widget_get_screen (user_data)))
+        {
+          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
+        {
+#endif
+          vte_terminal_set_background_saturation (VTE_TERMINAL 
(screen->terminal), 1.0 - background_darkness);
+          vte_terminal_set_background_transparent (VTE_TERMINAL 
(screen->terminal), TRUE);
+#if GTK_CHECK_VERSION(2,10,0) && defined(HAVE_VTE_TERMINAL_SET_OPACITY)
+          vte_terminal_set_opacity (VTE_TERMINAL (screen->terminal), 0xFFFF);
+        }
+#endif
     }
 
   return FALSE;

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to