gnome-screensaver r1444 - in trunk: . src



Author: mccann
Date: Mon May 12 23:29:05 2008
New Revision: 1444
URL: http://svn.gnome.org/viewvc/gnome-screensaver?rev=1444&view=rev

Log:
2008-05-12  William Jon McCann  <jmccann redhat com>

	* src/gs-manager.c (manager_show_window):
	* src/gs-window-x11.c (force_no_pixmap_background),
	(widget_clear_all_children),
	(gs_window_clear_to_background_pixmap), (clear_widget),
	(gs_window_clear), (gs_window_get_drawing_area),
	(lock_command_watch), (popup_dialog_idle), (gs_window_init):
	* src/gs-window.h:
	Add a new child widget to use for savers to draw on.  We
	hide this widget entirely when popping up the unlock dialog.
	This avoids interference between the background styles.



Modified:
   trunk/ChangeLog
   trunk/src/gs-manager.c
   trunk/src/gs-window-x11.c
   trunk/src/gs-window.h

Modified: trunk/src/gs-manager.c
==============================================================================
--- trunk/src/gs-manager.c	(original)
+++ trunk/src/gs-manager.c	Mon May 12 23:29:05 2008
@@ -1351,7 +1351,7 @@
 
         apply_background_to_window (manager, window);
 
-        job = gs_job_new_for_widget (GTK_WIDGET (window));
+        job = gs_job_new_for_widget (gs_window_get_drawing_area (window));
 
         manager_select_theme_for_job (manager, job);
         manager_add_job_for_window (manager, window, job);

Modified: trunk/src/gs-window-x11.c
==============================================================================
--- trunk/src/gs-window-x11.c	(original)
+++ trunk/src/gs-window-x11.c	Mon May 12 23:29:05 2008
@@ -73,6 +73,7 @@
         char      *away_message;
 
         GtkWidget *vbox;
+        GtkWidget *drawing_area;
         GtkWidget *lock_box;
         GtkWidget *lock_socket;
         GtkWidget *keyboard_socket;
@@ -204,12 +205,12 @@
                                      "      bg[ACTIVE] = { 0.0, 0.0, 0.0 }\n"
                                      "      bg[PRELIGHT] = { 0.0, 0.0, 0.0 }\n"
                                      "   }\n"
-                                     "   widget \"gs-window*\" style : highest \"gs-theme-engine-style\"\n"
+                                     "   widget \"gs-window-drawing-area*\" style : highest \"gs-theme-engine-style\"\n"
                                      "\n");
                 first_time = FALSE;
         }
 
-        gtk_widget_set_name (widget, "gs-window");
+        gtk_widget_set_name (widget, "gs-window-drawing-area");
 }
 
 static void
@@ -246,7 +247,7 @@
 }
 
 static void
-clear_all_children (GSWindow *window)
+widget_clear_all_children (GtkWidget *widget)
 {
         GdkWindow *w;
 
@@ -254,11 +255,11 @@
 
         gdk_error_trap_push ();
 
-        w = GTK_WIDGET (window)->window;
+        w = widget->window;
 
         clear_children (GDK_WINDOW_XID (w));
 
-        gdk_display_sync (gtk_widget_get_display (GTK_WIDGET (window)));
+        gdk_display_sync (gtk_widget_get_display (widget));
         gdk_error_trap_pop ();
 }
 
@@ -280,7 +281,7 @@
         }
 }
 
-void
+static void
 gs_window_clear_to_background_pixmap (GSWindow *window)
 {
         GtkStateType state;
@@ -323,38 +324,33 @@
 
         gdk_window_clear (GTK_WIDGET (window)->window);
 
-        /* If a screensaver theme adds child windows we need to clear them too */
-        clear_all_children (window);
-
         gdk_flush ();
 }
 
-void
-gs_window_clear (GSWindow *window)
+static void
+clear_widget (GtkWidget *widget)
 {
         GdkColor     color = { 0, 0x0000, 0x0000, 0x0000 };
         GdkColormap *colormap;
         GtkStateType state;
         GtkStyle    *style;
 
-        g_return_if_fail (GS_IS_WINDOW (window));
-
-        if (! GTK_WIDGET_VISIBLE (GTK_WIDGET (window))) {
+        if (! GTK_WIDGET_VISIBLE (widget)) {
                 return;
         }
 
-        gs_debug ("Clearing window");
+        gs_debug ("Clearing widget");
 
         state = (GtkStateType) 0;
-        while (state < (GtkStateType) G_N_ELEMENTS (GTK_WIDGET (window)->style->bg)) {
-                gtk_widget_modify_bg (GTK_WIDGET (window), state, &color);
+        while (state < (GtkStateType) G_N_ELEMENTS (widget->style->bg)) {
+                gtk_widget_modify_bg (widget, state, &color);
                 state++;
         }
 
-        style = gtk_style_copy (GTK_WIDGET (window)->style);
+        style = gtk_style_copy (widget->style);
 
         state = (GtkStateType) 0;
-        while (state < (GtkStateType) G_N_ELEMENTS (GTK_WIDGET (window)->style->bg_pixmap)) {
+        while (state < (GtkStateType) G_N_ELEMENTS (widget->style->bg_pixmap)) {
 
                 if (style->bg_pixmap[state] != NULL) {
                         g_object_unref (style->bg_pixmap[state]);
@@ -364,21 +360,30 @@
                 state++;
         }
 
-        colormap = gdk_drawable_get_colormap (GTK_WIDGET (window)->window);
+        colormap = gdk_drawable_get_colormap (widget->window);
         gdk_colormap_alloc_color (colormap, &color, FALSE, TRUE);
-        gdk_window_set_background (GTK_WIDGET (window)->window, &color);
+        gdk_window_set_background (widget->window, &color);
 
-        gtk_widget_set_style (GTK_WIDGET (window), style);
+        gtk_widget_set_style (widget, style);
         g_object_unref (style);
 
-        gdk_window_clear (GTK_WIDGET (window)->window);
+        gdk_window_clear (widget->window);
 
         /* If a screensaver theme adds child windows we need to clear them too */
-        clear_all_children (window);
+        widget_clear_all_children (widget);
 
         gdk_flush ();
 }
 
+void
+gs_window_clear (GSWindow *window)
+{
+        g_return_if_fail (GS_IS_WINDOW (window));
+
+        clear_widget (GTK_WIDGET (window));
+        clear_widget (window->priv->drawing_area);
+}
+
 static GdkRegion *
 get_outside_region (GSWindow *window)
 {
@@ -909,6 +914,14 @@
         return GTK_WIDGET (window)->window;
 }
 
+GtkWidget *
+gs_window_get_drawing_area (GSWindow *window)
+{
+        g_return_val_if_fail (GS_IS_WINDOW (window), NULL);
+
+        return window->priv->drawing_area;
+}
+
 /* just for debugging */
 static gboolean
 error_watch (GIOChannel   *source,
@@ -1446,6 +1459,8 @@
                         add_emit_deactivated_idle (window);
                 }
 
+                gtk_widget_show (window->priv->drawing_area);
+
                 gs_window_clear (window);
                 set_invisible_cursor (GTK_WIDGET (window)->window, TRUE);
                 g_signal_emit (window, signals [DIALOG_DOWN], 0);
@@ -1524,6 +1539,8 @@
                 command = g_string_append (command, " --verbose");
         }
 
+        gtk_widget_hide (window->priv->drawing_area);
+
         gs_window_clear_to_background_pixmap (window);
 
         set_invisible_cursor (GTK_WIDGET (window)->window, FALSE);
@@ -2208,11 +2225,16 @@
                                | GDK_VISIBILITY_NOTIFY_MASK
                                | GDK_ENTER_NOTIFY_MASK
                                | GDK_LEAVE_NOTIFY_MASK);
-        /*force_no_pixmap_background (GTK_WIDGET (window));*/
 
         window->priv->vbox = gtk_vbox_new (FALSE, 12);
         gtk_widget_show (window->priv->vbox);
         gtk_container_add (GTK_CONTAINER (window), window->priv->vbox);
+
+        window->priv->drawing_area = gtk_drawing_area_new ();
+        gtk_widget_show (window->priv->drawing_area);
+        gtk_box_pack_start (GTK_BOX (window->priv->vbox), window->priv->drawing_area, TRUE, TRUE, 0);
+
+        force_no_pixmap_background (window->priv->drawing_area);
 }
 
 static void

Modified: trunk/src/gs-window.h
==============================================================================
--- trunk/src/gs-window.h	(original)
+++ trunk/src/gs-window.h	Mon May 12 23:29:05 2008
@@ -93,8 +93,8 @@
 void        gs_window_show               (GSWindow  *window);
 void        gs_window_destroy            (GSWindow  *window);
 GdkWindow * gs_window_get_gdk_window     (GSWindow  *window);
+GtkWidget * gs_window_get_drawing_area   (GSWindow  *window);
 void        gs_window_clear              (GSWindow  *window);
-void        gs_window_clear_to_background_pixmap (GSWindow  *window);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]