81a8d62
--- libwnck-2.19.4/libwnck/xutils.h.appearance	2007-06-18 15:59:14.000000000 -0400
81a8d62
+++ libwnck-2.19.4/libwnck/xutils.h	2007-06-18 17:08:26.000000000 -0400
81a8d62
@@ -110,6 +110,16 @@ void _wnck_change_viewport (Screen *scre
Kristian Høgsberg 77f9263
 			    int     x,
Kristian Høgsberg 77f9263
 			    int     y);
Kristian Høgsberg 77f9263
 
Kristian Høgsberg 77f9263
+void _wnck_change_opacity (Screen  *screen,
Kristian Høgsberg 77f9263
+			   Window  xwindow,
Kristian Høgsberg 77f9263
+			   guint32 opacity);
Kristian Høgsberg 77f9263
+void _wnck_change_saturation (Screen  *screen,
Kristian Høgsberg 77f9263
+			   Window  xwindow,
Kristian Høgsberg 77f9263
+			   guint32 saturation);
Kristian Høgsberg 77f9263
+void _wnck_change_brightness (Screen  *screen,
Kristian Høgsberg 77f9263
+			   Window  xwindow,
Kristian Høgsberg 77f9263
+			   guint32 brightness);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
 char*  _wnck_get_session_id     (Window xwindow);
Kristian Høgsberg 77f9263
 int    _wnck_get_pid            (Window xwindow);
Kristian Høgsberg 77f9263
 char*  _wnck_get_name           (Window xwindow);
81a8d62
@@ -124,6 +134,12 @@ gboolean _wnck_get_frame_extents  (Windo
81a8d62
                                    int    *top_frame,
81a8d62
                                    int    *bottom_frame);
Kristian Høgsberg 77f9263
 
Kristian Høgsberg 77f9263
+guint32 _wnck_get_opacity (Window xwindow);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+guint32 _wnck_get_saturation (Window xwindow);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+guint32 _wnck_get_brightness (Window xwindow);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
 void   _wnck_select_input     (Window xwindow,
Kristian Høgsberg 77f9263
                                int    mask);
Kristian Høgsberg 77f9263
 
81a8d62
--- libwnck-2.19.4/libwnck/xutils.c.appearance	2007-06-18 15:59:14.000000000 -0400
81a8d62
+++ libwnck-2.19.4/libwnck/xutils.c	2007-06-18 17:08:26.000000000 -0400
81a8d62
@@ -1092,6 +1092,87 @@ _wnck_toggle_showing_desktop (Screen  *s
6b12524
 	      &xev);
6b12524
 }
6b12524
 
6b12524
+void
6b12524
+_wnck_change_opacity (Screen  *screen,
6b12524
+		      Window  xwindow,
6b12524
+		      guint32 opacity)
6b12524
+{
6b12524
+  XEvent xev;
6b12524
+
6b12524
+  xev.xclient.type = ClientMessage;
6b12524
+  xev.xclient.serial = 0;
6b12524
+  xev.xclient.send_event = True;
6b12524
+  xev.xclient.display = gdk_display;
6b12524
+  xev.xclient.window = xwindow;
6b12524
+  xev.xclient.message_type = _wnck_atom_get ("_NET_WM_WINDOW_OPACITY");
6b12524
+  xev.xclient.format = 32;
6b12524
+  xev.xclient.data.l[0] = opacity;
6b12524
+  xev.xclient.data.l[1] = 0;
6b12524
+  xev.xclient.data.l[2] = 0;
6b12524
+  xev.xclient.data.l[3] = 0;
6b12524
+  xev.xclient.data.l[4] = 0;
6b12524
+
6b12524
+  XSendEvent (gdk_display,
6b12524
+	      RootWindowOfScreen (screen),
6b12524
+	      False,
6b12524
+	      SubstructureRedirectMask | SubstructureNotifyMask,
6b12524
+	      &xev);
6b12524
+}
6b12524
+
6b12524
+void
6b12524
+_wnck_change_saturation (Screen  *screen,
6b12524
+		      Window  xwindow,
6b12524
+		      guint32 saturation)
6b12524
+{
6b12524
+  XEvent xev;
6b12524
+
6b12524
+  xev.xclient.type = ClientMessage;
6b12524
+  xev.xclient.serial = 0;
6b12524
+  xev.xclient.send_event = True;
6b12524
+  xev.xclient.display = gdk_display;
6b12524
+  xev.xclient.window = xwindow;
6b12524
+  xev.xclient.message_type = _wnck_atom_get ("_NET_WM_WINDOW_SATURATION");
6b12524
+  xev.xclient.format = 32;
6b12524
+  xev.xclient.data.l[0] = saturation;
6b12524
+  xev.xclient.data.l[1] = 0;
6b12524
+  xev.xclient.data.l[2] = 0;
6b12524
+  xev.xclient.data.l[3] = 0;
6b12524
+  xev.xclient.data.l[4] = 0;
6b12524
+
6b12524
+  XSendEvent (gdk_display,
6b12524
+	      RootWindowOfScreen (screen),
6b12524
+	      False,
6b12524
+	      SubstructureRedirectMask | SubstructureNotifyMask,
6b12524
+	      &xev);
6b12524
+}
6b12524
+
6b12524
+void
6b12524
+_wnck_change_brightness (Screen  *screen,
6b12524
+		      Window  xwindow,
6b12524
+		      guint32 brightness)
6b12524
+{
6b12524
+  XEvent xev;
6b12524
+
6b12524
+  xev.xclient.type = ClientMessage;
6b12524
+  xev.xclient.serial = 0;
6b12524
+  xev.xclient.send_event = True;
6b12524
+  xev.xclient.display = gdk_display;
6b12524
+  xev.xclient.window = xwindow;
6b12524
+  xev.xclient.message_type = _wnck_atom_get ("_NET_WM_WINDOW_BRIGHTNESS");
6b12524
+  xev.xclient.format = 32;
6b12524
+  xev.xclient.data.l[0] = brightness;
6b12524
+  xev.xclient.data.l[1] = 0;
6b12524
+  xev.xclient.data.l[2] = 0;
6b12524
+  xev.xclient.data.l[3] = 0;
6b12524
+  xev.xclient.data.l[4] = 0;
6b12524
+
6b12524
+  XSendEvent (gdk_display,
6b12524
+	      RootWindowOfScreen (screen),
6b12524
+	      False,
6b12524
+	      SubstructureRedirectMask | SubstructureNotifyMask,
6b12524
+	      &xev);
6b12524
+}
6b12524
+
6b12524
 char*
6b12524
 _wnck_get_session_id (Window xwindow)
6b12524
 {
81a8d62
@@ -1266,6 +1347,45 @@ _wnck_get_frame_extents (Window  xwindow
81a8d62
   return retval;
6b12524
 }
6b12524
 
6b12524
+guint32
6b12524
+_wnck_get_opacity (Window xwindow)
6b12524
+{
6b12524
+  int val;
6b12524
+
6b12524
+  if (_wnck_get_cardinal (xwindow,
6b12524
+			  _wnck_atom_get ("_NET_WM_WINDOW_OPACITY"),
6b12524
+			  &val))
6b12524
+      return val;
6b12524
+
6b12524
+  return G_MAXUINT32;
6b12524
+}
6b12524
+
6b12524
+guint32
6b12524
+_wnck_get_saturation (Window xwindow)
6b12524
+{
6b12524
+  int val;
6b12524
+
6b12524
+  if (_wnck_get_cardinal (xwindow,
6b12524
+			  _wnck_atom_get ("_NET_WM_WINDOW_SATURATION"),
6b12524
+			  &val))
6b12524
+      return val;
6b12524
+
6b12524
+  return G_MAXUINT32;
6b12524
+}
6b12524
+
6b12524
+guint32
6b12524
+_wnck_get_brightness (Window xwindow)
6b12524
+{
6b12524
+  int val;
6b12524
+
6b12524
+  if (_wnck_get_cardinal (xwindow,
6b12524
+			  _wnck_atom_get ("_NET_WM_WINDOW_BRIGHTNESS"),
6b12524
+			  &val))
6b12524
+      return val;
6b12524
+
6b12524
+  return G_MAXUINT32;
6b12524
+}
6b12524
+
6b12524
 void
6b12524
 _wnck_select_input (Window xwindow,
6b12524
                     int    mask)
81a8d62
--- libwnck-2.19.4/libwnck/window.c.appearance	2007-06-18 15:59:14.000000000 -0400
81a8d62
+++ libwnck-2.19.4/libwnck/window.c	2007-06-18 17:11:29.000000000 -0400
81a8d62
@@ -107,6 +107,10 @@ struct _WnckWindowPrivate
Kristian Høgsberg 77f9263
   char *res_class;
Kristian Høgsberg 77f9263
   char *res_name;
Kristian Høgsberg 77f9263
   
Kristian Høgsberg 77f9263
+  guint32 opacity;
Kristian Høgsberg 77f9263
+  guint32 saturation;
Kristian Høgsberg 77f9263
+  guint32 brightness;
Kristian Høgsberg 77f9263
+  
Kristian Høgsberg 77f9263
   /* true if transient_for points to root window,
Kristian Høgsberg 77f9263
    * not another app window
Kristian Høgsberg 77f9263
    */
81a8d62
@@ -152,6 +156,10 @@ struct _WnckWindowPrivate
Kristian Høgsberg 77f9263
   guint need_update_wmhints : 1;
81a8d62
   guint need_update_frame_extents : 1;
81a8d62
 
Kristian Høgsberg 77f9263
+  guint need_update_opacity : 1;
Kristian Høgsberg 77f9263
+  guint need_update_saturation : 1;
Kristian Høgsberg 77f9263
+  guint need_update_brightness : 1;
81a8d62
+
Kristian Høgsberg 77f9263
   guint need_emit_name_changed : 1;
Kristian Høgsberg 77f9263
   guint need_emit_icon_changed : 1;
81a8d62
 };
81a8d62
@@ -165,6 +173,9 @@ enum {
Kristian Høgsberg 77f9263
   ICON_CHANGED,
Kristian Høgsberg 77f9263
   ACTIONS_CHANGED,
Kristian Høgsberg 77f9263
   GEOMETRY_CHANGED,
Kristian Høgsberg 77f9263
+  OPACITY_CHANGED,
Kristian Høgsberg 77f9263
+  SATURATION_CHANGED,
Kristian Høgsberg 77f9263
+  BRIGHTNESS_CHANGED,
Kristian Høgsberg 77f9263
   LAST_SIGNAL
Kristian Høgsberg 77f9263
 };
Kristian Høgsberg 77f9263
 
81a8d62
@@ -193,6 +204,9 @@ static void update_wintype   (WnckWindow
Kristian Høgsberg 77f9263
 static void update_transient_for (WnckWindow *window);
Kristian Høgsberg 77f9263
 static void update_startup_id (WnckWindow *window);
Kristian Høgsberg 77f9263
 static void update_wmclass    (WnckWindow *window);
Kristian Høgsberg 77f9263
+static void update_opacity   (WnckWindow *window);
Kristian Høgsberg 77f9263
+static void update_saturation   (WnckWindow *window);
Kristian Høgsberg 77f9263
+static void update_brightness   (WnckWindow *window);
81a8d62
 static void update_frame_extents (WnckWindow *window);
Kristian Høgsberg 77f9263
 static void unqueue_update   (WnckWindow *window);
Kristian Høgsberg 77f9263
 static void queue_update     (WnckWindow *window);
81a8d62
@@ -325,6 +339,33 @@ wnck_window_class_init (WnckWindowClass 
Kristian Høgsberg 77f9263
                   NULL, NULL,
Kristian Høgsberg 77f9263
                   g_cclosure_marshal_VOID__VOID,
Kristian Høgsberg 77f9263
                   G_TYPE_NONE, 0);  
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  signals[OPACITY_CHANGED] =
Kristian Høgsberg 77f9263
+    g_signal_new ("opacity_changed",
Kristian Høgsberg 77f9263
+                  G_OBJECT_CLASS_TYPE (object_class),
Kristian Høgsberg 77f9263
+                  G_SIGNAL_RUN_LAST,
Kristian Høgsberg 77f9263
+                  G_STRUCT_OFFSET (WnckWindowClass, opacity_changed),
Kristian Høgsberg 77f9263
+                  NULL, NULL,
Kristian Høgsberg 77f9263
+                  g_cclosure_marshal_VOID__VOID,
Kristian Høgsberg 77f9263
+                  G_TYPE_NONE, 0);  
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  signals[SATURATION_CHANGED] =
Kristian Høgsberg 77f9263
+    g_signal_new ("saturation_changed",
Kristian Høgsberg 77f9263
+                  G_OBJECT_CLASS_TYPE (object_class),
Kristian Høgsberg 77f9263
+                  G_SIGNAL_RUN_LAST,
Kristian Høgsberg 77f9263
+                  G_STRUCT_OFFSET (WnckWindowClass, saturation_changed),
Kristian Høgsberg 77f9263
+                  NULL, NULL,
Kristian Høgsberg 77f9263
+                  g_cclosure_marshal_VOID__VOID,
Kristian Høgsberg 77f9263
+                  G_TYPE_NONE, 0);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  signals[BRIGHTNESS_CHANGED] =
Kristian Høgsberg 77f9263
+    g_signal_new ("brightness_changed",
Kristian Høgsberg 77f9263
+                  G_OBJECT_CLASS_TYPE (object_class),
Kristian Høgsberg 77f9263
+                  G_SIGNAL_RUN_LAST,
Kristian Høgsberg 77f9263
+                  G_STRUCT_OFFSET (WnckWindowClass, brightness_changed),
Kristian Høgsberg 77f9263
+                  NULL, NULL,
Kristian Høgsberg 77f9263
+                  g_cclosure_marshal_VOID__VOID,
Kristian Høgsberg 77f9263
+                  G_TYPE_NONE, 0);
Kristian Høgsberg 77f9263
 }
Kristian Høgsberg 77f9263
 
Kristian Høgsberg 77f9263
 static void
81a8d62
@@ -460,6 +501,9 @@ _wnck_window_create (Window      xwindow
Kristian Høgsberg 77f9263
   window->priv->need_update_wmclass = TRUE;
Kristian Høgsberg 77f9263
   window->priv->need_update_wmhints = TRUE;
81a8d62
   window->priv->need_update_frame_extents = TRUE;
Kristian Høgsberg 77f9263
+  window->priv->need_update_opacity = TRUE;
Kristian Høgsberg 77f9263
+  window->priv->need_update_saturation = TRUE;
Kristian Høgsberg 77f9263
+  window->priv->need_update_brightness = TRUE;
Kristian Høgsberg 77f9263
   window->priv->need_emit_name_changed = FALSE;
Kristian Høgsberg 77f9263
   window->priv->need_emit_icon_changed = FALSE;
Kristian Høgsberg 77f9263
   force_update_now (window);
81a8d62
@@ -2083,6 +2127,77 @@ wnck_window_set_geometry (WnckWindow    
Kristian Høgsberg 77f9263
                              gravity_and_flags, x, y, width, height);
Kristian Høgsberg 77f9263
 }
Kristian Høgsberg 77f9263
 
Kristian Høgsberg 77f9263
+guint
Kristian Høgsberg 77f9263
+wnck_window_get_opacity (WnckWindow *window)
Kristian Høgsberg 77f9263
+{
Kristian Høgsberg 77f9263
+  guint64 o;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  g_return_val_if_fail (WNCK_IS_WINDOW (window), 0);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  o = ((guint64) window->priv->opacity * 1005) / G_MAXUINT32;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  return o / 10;
Kristian Høgsberg 77f9263
+}
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+void
Kristian Høgsberg 77f9263
+wnck_window_set_opacity (WnckWindow *window,
Kristian Høgsberg 77f9263
+			 guint      opacity)
Kristian Høgsberg 77f9263
+{
Kristian Høgsberg 77f9263
+  g_return_if_fail (WNCK_IS_WINDOW (window));
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  _wnck_change_opacity (WNCK_SCREEN_XSCREEN (window->priv->screen),
Kristian Høgsberg 77f9263
+			wnck_window_get_xid (window),
Kristian Høgsberg 77f9263
+			(((guint64) opacity * G_MAXUINT32) / 100));
Kristian Høgsberg 77f9263
+}
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+guint
Kristian Høgsberg 77f9263
+wnck_window_get_saturation (WnckWindow *window)
Kristian Høgsberg 77f9263
+{
Kristian Høgsberg 77f9263
+  guint64 o;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  g_return_val_if_fail (WNCK_IS_WINDOW (window), 0);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  o = ((guint64) window->priv->saturation * 1005) / G_MAXUINT32;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  return o / 10;
Kristian Høgsberg 77f9263
+}
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+void
Kristian Høgsberg 77f9263
+wnck_window_set_saturation (WnckWindow *window,
Kristian Høgsberg 77f9263
+			 guint      saturation)
Kristian Høgsberg 77f9263
+{
Kristian Høgsberg 77f9263
+  g_return_if_fail (WNCK_IS_WINDOW (window));
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  _wnck_change_saturation (WNCK_SCREEN_XSCREEN (window->priv->screen),
Kristian Høgsberg 77f9263
+			wnck_window_get_xid (window),
Kristian Høgsberg 77f9263
+			(((guint64) saturation * G_MAXUINT32) / 100));
Kristian Høgsberg 77f9263
+}
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+guint
Kristian Høgsberg 77f9263
+wnck_window_get_brightness (WnckWindow *window)
Kristian Høgsberg 77f9263
+{
Kristian Høgsberg 77f9263
+  guint64 o;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  g_return_val_if_fail (WNCK_IS_WINDOW (window), 0);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  o = ((guint64) window->priv->brightness * 1005) / G_MAXUINT32;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  return o / 10;
Kristian Høgsberg 77f9263
+}
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+void
Kristian Høgsberg 77f9263
+wnck_window_set_brightness (WnckWindow *window,
Kristian Høgsberg 77f9263
+			 guint      brightness)
Kristian Høgsberg 77f9263
+{
Kristian Høgsberg 77f9263
+  g_return_if_fail (WNCK_IS_WINDOW (window));
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  _wnck_change_brightness (WNCK_SCREEN_XSCREEN (window->priv->screen),
Kristian Høgsberg 77f9263
+			wnck_window_get_xid (window),
Kristian Høgsberg 77f9263
+			(((guint64) brightness * G_MAXUINT32) / 100));
Kristian Høgsberg 77f9263
+}
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
 /**
Kristian Høgsberg 77f9263
  * wnck_window_is_visible_on_workspace:
81a8d62
  * @window: a #WnckWindow.
81a8d62
@@ -2328,6 +2443,26 @@ _wnck_window_process_property_notify (Wn
81a8d62
       window->priv->need_update_frame_extents = TRUE;
Kristian Høgsberg 77f9263
       queue_update (window);
Kristian Høgsberg 77f9263
     }
Kristian Høgsberg 77f9263
+  else if (xevent->xproperty.atom ==
Kristian Høgsberg 77f9263
+           _wnck_atom_get ("_NET_WM_WINDOW_OPACITY"))
Kristian Høgsberg 77f9263
+    {
Kristian Høgsberg 77f9263
+      window->priv->need_update_opacity = TRUE;
Kristian Høgsberg 77f9263
+      queue_update (window);
Kristian Høgsberg 77f9263
+    }
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  else if (xevent->xproperty.atom ==
Kristian Høgsberg 77f9263
+           _wnck_atom_get ("_NET_WM_WINDOW_SATURATION"))
Kristian Høgsberg 77f9263
+    {
Kristian Høgsberg 77f9263
+      window->priv->need_update_saturation = TRUE;
Kristian Høgsberg 77f9263
+      queue_update (window);
Kristian Høgsberg 77f9263
+    }
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  else if (xevent->xproperty.atom ==
Kristian Høgsberg 77f9263
+           _wnck_atom_get ("_NET_WM_WINDOW_BRIGHTNESS"))
Kristian Høgsberg 77f9263
+    {
Kristian Høgsberg 77f9263
+      window->priv->need_update_brightness = TRUE;
Kristian Høgsberg 77f9263
+      queue_update (window);
Kristian Høgsberg 77f9263
+    }
Kristian Høgsberg 77f9263
 }
Kristian Høgsberg 77f9263
 
Kristian Høgsberg 77f9263
 void
81a8d62
@@ -2879,6 +3014,39 @@ update_frame_extents (WnckWindow *window
Kristian Høgsberg 77f9263
 }
Kristian Høgsberg 77f9263
 
Kristian Høgsberg 77f9263
 static void
Kristian Høgsberg 77f9263
+update_opacity (WnckWindow *window)
Kristian Høgsberg 77f9263
+{
Kristian Høgsberg 77f9263
+  if (!window->priv->need_update_opacity)
Kristian Høgsberg 77f9263
+    return;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  window->priv->need_update_opacity = FALSE;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  window->priv->opacity = _wnck_get_opacity (window->priv->xwindow);
Kristian Høgsberg 77f9263
+}
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+static void
Kristian Høgsberg 77f9263
+update_saturation (WnckWindow *window)
Kristian Høgsberg 77f9263
+{
Kristian Høgsberg 77f9263
+  if (!window->priv->need_update_saturation)
Kristian Høgsberg 77f9263
+    return;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  window->priv->need_update_saturation = FALSE;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  window->priv->saturation = _wnck_get_saturation (window->priv->xwindow);
Kristian Høgsberg 77f9263
+}
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+static void
Kristian Høgsberg 77f9263
+update_brightness (WnckWindow *window)
Kristian Høgsberg 77f9263
+{
Kristian Høgsberg 77f9263
+  if (!window->priv->need_update_brightness)
Kristian Høgsberg 77f9263
+    return;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  window->priv->need_update_brightness = FALSE;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  window->priv->brightness = _wnck_get_brightness (window->priv->xwindow);
Kristian Høgsberg 77f9263
+}
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+static void
Kristian Høgsberg 77f9263
 force_update_now (WnckWindow *window)
Kristian Høgsberg 77f9263
 {
Kristian Høgsberg 77f9263
   WnckWindowState old_state;
81a8d62
@@ -2914,6 +3082,9 @@ force_update_now (WnckWindow *window)
Kristian Høgsberg 77f9263
   update_workspace (window); /* emits signals */
Kristian Høgsberg 77f9263
   update_actions (window);
81a8d62
   update_frame_extents (window); /* emits signals */
Kristian Høgsberg 77f9263
+  update_opacity (window);
Kristian Høgsberg 77f9263
+  update_saturation (window);
Kristian Høgsberg 77f9263
+  update_brightness (window);
Kristian Høgsberg 77f9263
 
Kristian Høgsberg 77f9263
   get_icons (window);
Kristian Høgsberg 77f9263
   
81a8d62
--- libwnck-2.19.4/libwnck/window.h.appearance	2007-06-18 15:59:14.000000000 -0400
81a8d62
+++ libwnck-2.19.4/libwnck/window.h	2007-06-18 17:08:26.000000000 -0400
81a8d62
@@ -268,6 +268,15 @@ struct _WnckWindowClass
Kristian Høgsberg 77f9263
   /* Changed size/position */
Kristian Høgsberg 77f9263
   void (* geometry_changed)      (WnckWindow       *window);
e4123c2
   
e4123c2
+ /* Changed opacity */
e4123c2
+ void (* opacity_changed)      (WnckWindow       *window);
Kristian Høgsberg 77f9263
+
e4123c2
+ /* Changed saturation */
e4123c2
+ void (* saturation_changed)      (WnckWindow       *window);
Kristian Høgsberg 77f9263
+
e4123c2
+ /* Changed brightness */
e4123c2
+ void (* brightness_changed)      (WnckWindow       *window);
e4123c2
+
e4123c2
   /* Padding for future expansion */
e4123c2
   void (* pad1) (void);
e4123c2
   void (* pad2) (void);
81a8d62
@@ -393,6 +402,15 @@ void wnck_window_set_geometry (WnckWindo
Kristian Høgsberg 77f9263
                                int                       width,
Kristian Høgsberg 77f9263
                                int                       height);
Kristian Høgsberg 77f9263
 
Kristian Høgsberg 77f9263
+guint wnck_window_get_opacity (WnckWindow *window);
Kristian Høgsberg 77f9263
+void  wnck_window_set_opacity (WnckWindow *window, guint opacity);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+guint wnck_window_get_saturation (WnckWindow *window);
Kristian Høgsberg 77f9263
+void  wnck_window_set_saturation (WnckWindow *window, guint saturation);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+guint wnck_window_get_brightness (WnckWindow *window);
Kristian Høgsberg 77f9263
+void  wnck_window_set_brightness (WnckWindow *window, guint brightness);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
 gboolean wnck_window_is_visible_on_workspace (WnckWindow    *window,
Kristian Høgsberg 77f9263
                                               WnckWorkspace *workspace);
Kristian Høgsberg 77f9263
 gboolean wnck_window_is_on_workspace         (WnckWindow    *window,
81a8d62
--- libwnck-2.19.4/libwnck/window-action-menu.c.appearance	2007-06-18 15:59:14.000000000 -0400
81a8d62
+++ libwnck-2.19.4/libwnck/window-action-menu.c	2007-06-18 17:08:26.000000000 -0400
81a8d62
@@ -48,6 +48,10 @@ typedef enum
Kristian Høgsberg 77f9263
   ABOVE,
Kristian Høgsberg 77f9263
   MOVE,
Kristian Høgsberg 77f9263
   RESIZE,
Kristian Høgsberg 77f9263
+  CHANGE_OPACITY,
Kristian Høgsberg 77f9263
+  CHANGE_SATURATION,
Kristian Høgsberg 77f9263
+  CHANGE_BRIGHTNESS,
Kristian Høgsberg 77f9263
+  RESET,
Kristian Høgsberg 77f9263
   PIN,
6b12524
   UNPIN,
Kristian Høgsberg 77f9263
   LEFT,
81a8d62
@@ -68,6 +72,11 @@ struct _ActionMenuData
Kristian Høgsberg 77f9263
   GtkWidget *above_item;
Kristian Høgsberg 77f9263
   GtkWidget *move_item;
Kristian Høgsberg 77f9263
   GtkWidget *resize_item;
Kristian Høgsberg 77f9263
+  GtkWidget *appearance_item;
Kristian Høgsberg 77f9263
+  GtkWidget *opacity_item;
Kristian Høgsberg 77f9263
+  GtkWidget *saturation_item;
Kristian Høgsberg 77f9263
+  GtkWidget *brightness_item;
Kristian Høgsberg 77f9263
+  GtkWidget *reset_item;
Kristian Høgsberg 77f9263
   GtkWidget *close_item;
Kristian Høgsberg 77f9263
   GtkWidget *workspace_separator;
Kristian Høgsberg 77f9263
   GtkWidget *pin_item;
81a8d62
@@ -170,6 +179,46 @@ item_activated_callback (GtkWidget *menu
Kristian Høgsberg 77f9263
     case RESIZE:
Kristian Høgsberg 77f9263
       wnck_window_keyboard_size (amd->window);
Kristian Høgsberg 77f9263
       break;
Kristian Høgsberg 77f9263
+    case CHANGE_OPACITY:
Kristian Høgsberg 77f9263
+      {
Kristian Høgsberg 77f9263
+	int opacity_value;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	opacity_value =
Kristian Høgsberg 77f9263
+	    GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menu_item),
Kristian Høgsberg 77f9263
+						"opacity"));
Kristian Høgsberg 77f9263
+	
Kristian Høgsberg 77f9263
+	wnck_window_set_opacity (amd->window, opacity_value);
Kristian Høgsberg 77f9263
+	break;
Kristian Høgsberg 77f9263
+      }
Kristian Høgsberg 77f9263
+    case CHANGE_SATURATION:
Kristian Høgsberg 77f9263
+      {
Kristian Høgsberg 77f9263
+	int saturation_value;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	saturation_value =
Kristian Høgsberg 77f9263
+	    GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menu_item),
Kristian Høgsberg 77f9263
+						"saturation"));
Kristian Høgsberg 77f9263
+	
Kristian Høgsberg 77f9263
+	wnck_window_set_saturation (amd->window, saturation_value);
Kristian Høgsberg 77f9263
+	break;
Kristian Høgsberg 77f9263
+      }
Kristian Høgsberg 77f9263
+    case CHANGE_BRIGHTNESS:
Kristian Høgsberg 77f9263
+      {
Kristian Høgsberg 77f9263
+	int brightness_value;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	brightness_value =
Kristian Høgsberg 77f9263
+	    GPOINTER_TO_INT (g_object_get_data (G_OBJECT (menu_item),
Kristian Høgsberg 77f9263
+						"brightness"));
Kristian Høgsberg 77f9263
+	
Kristian Høgsberg 77f9263
+	wnck_window_set_brightness (amd->window, brightness_value);
Kristian Høgsberg 77f9263
+	break;
Kristian Høgsberg 77f9263
+      }
Kristian Høgsberg 77f9263
+    case RESET:
Kristian Høgsberg 77f9263
+      {
Kristian Høgsberg 77f9263
+	wnck_window_set_brightness (amd->window, 100);
Kristian Høgsberg 77f9263
+	wnck_window_set_saturation (amd->window, 100);
Kristian Høgsberg 77f9263
+	wnck_window_set_opacity (amd->window, 100);
Kristian Høgsberg 77f9263
+	break;
Kristian Høgsberg 77f9263
+      } 
Kristian Høgsberg 77f9263
     case PIN:
Kristian Høgsberg 77f9263
         wnck_window_unpin (amd->window);
6b12524
       break;
81a8d62
@@ -269,6 +318,10 @@ update_menu_state (ActionMenuData *amd)
Kristian Høgsberg 77f9263
   WnckWindowActions  actions;  
Kristian Høgsberg 77f9263
   WnckScreen        *screen;
Kristian Høgsberg 77f9263
 
Kristian Høgsberg 77f9263
+  guint present_opacity;
Kristian Høgsberg 77f9263
+  guint present_saturation;
Kristian Høgsberg 77f9263
+  guint present_brightness;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
   amd->idle_handler = 0;
Kristian Høgsberg 77f9263
   
Kristian Høgsberg 77f9263
   actions = wnck_window_get_actions (amd->window);
81a8d62
@@ -316,6 +369,19 @@ update_menu_state (ActionMenuData *amd)
Kristian Høgsberg 77f9263
   gtk_widget_set_sensitive (amd->above_item,
Kristian Høgsberg 77f9263
                             (actions & WNCK_WINDOW_ACTION_ABOVE) != 0);
Kristian Høgsberg 77f9263
 
Kristian Høgsberg 77f9263
+  present_opacity = wnck_window_get_opacity (amd->window);
Kristian Høgsberg 77f9263
+  present_saturation = wnck_window_get_saturation (amd->window);
Kristian Høgsberg 77f9263
+  present_brightness = wnck_window_get_brightness (amd->window);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  if (present_opacity == 100 && present_saturation == 100 && present_brightness == 100)
Kristian Høgsberg 77f9263
+    {
Kristian Høgsberg 77f9263
+      gtk_widget_set_sensitive (amd->reset_item, FALSE);      
Kristian Høgsberg 77f9263
+    }
Kristian Høgsberg 77f9263
+  else
Kristian Høgsberg 77f9263
+    {
Kristian Høgsberg 77f9263
+      gtk_widget_set_sensitive (amd->reset_item, TRUE); 
Kristian Høgsberg 77f9263
+    }
Kristian Høgsberg 77f9263
+
6b12524
   g_signal_handlers_block_by_func (G_OBJECT (amd->pin_item),
6b12524
                                    item_activated_callback,
6b12524
                                    GINT_TO_POINTER (PIN));
81a8d62
@@ -573,7 +639,7 @@ get_workspace_name_with_accel (WnckWindo
Kristian Høgsberg 77f9263
 GtkWidget*
Kristian Høgsberg 77f9263
 wnck_create_window_action_menu (WnckWindow *window)
Kristian Høgsberg 77f9263
 {
Kristian Høgsberg 77f9263
-  GtkWidget *menu, *submenu;
Kristian Høgsberg 77f9263
+  GtkWidget *menu, *submenu, *submenu2;
Kristian Høgsberg 77f9263
   ActionMenuData *amd;
Kristian Høgsberg 77f9263
   GtkWidget *separator;
81a8d62
   int num_workspaces, window_space, i;
81a8d62
@@ -741,6 +807,154 @@ wnck_create_window_action_menu (WnckWind
e4123c2
       g_free (label);	
e4123c2
     }
Kristian Høgsberg 77f9263
 
Kristian Høgsberg 77f9263
+  if (wnck_screen_net_wm_supports (wnck_window_get_screen (amd->window),
Kristian Høgsberg 77f9263
+				   "_NET_WM_WINDOW_OPACITY"))
Kristian Høgsberg 77f9263
+  {
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      amd->appearance_item = gtk_menu_item_new_with_mnemonic (_("_Appearance"));
Kristian Høgsberg 77f9263
+      gtk_widget_show (amd->appearance_item);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      submenu = gtk_menu_new ();
Kristian Høgsberg 77f9263
+      gtk_menu_item_set_submenu (GTK_MENU_ITEM (amd->appearance_item),
Kristian Høgsberg 77f9263
+				 submenu);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      gtk_menu_shell_append (GTK_MENU_SHELL (menu), amd->appearance_item);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  }
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  if (wnck_screen_net_wm_supports (wnck_window_get_screen (amd->window),
Kristian Høgsberg 77f9263
+				   "_NET_WM_WINDOW_OPACITY"))
Kristian Høgsberg 77f9263
+  {
Kristian Høgsberg 77f9263
+      guint present_opacity;
Kristian Høgsberg 77f9263
+      gint  j;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      amd->opacity_item = gtk_menu_item_new_with_mnemonic (_("_Opacity"));
Kristian Høgsberg 77f9263
+      gtk_widget_show (amd->opacity_item);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      submenu2 = gtk_menu_new ();
Kristian Høgsberg 77f9263
+      gtk_menu_item_set_submenu (GTK_MENU_ITEM (amd->opacity_item),
Kristian Høgsberg 77f9263
+				 submenu2);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      gtk_menu_shell_append (GTK_MENU_SHELL (submenu), amd->opacity_item);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      present_opacity = wnck_window_get_opacity (window);
Kristian Høgsberg 77f9263
+      for (j = 0; j < 4; j++)
Kristian Høgsberg 77f9263
+      {
Kristian Høgsberg 77f9263
+	  GtkWidget *item;
Kristian Høgsberg 77f9263
+	  gchar	    *label;
Kristian Høgsberg 77f9263
+	  guint	    o;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  label = g_strdup_printf ("%d%%", (j + 1) * 25);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  item = make_menu_item (amd, CHANGE_OPACITY);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  o = (j + 1) * 25;
Kristian Høgsberg 77f9263
+	  g_object_set_data (G_OBJECT (item), "opacity", GINT_TO_POINTER (o));
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  if (o == present_opacity)
Kristian Høgsberg 77f9263
+	      gtk_widget_set_sensitive (item, FALSE);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  gtk_menu_shell_append (GTK_MENU_SHELL (submenu2), item);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  set_item_text (item, label);
Kristian Høgsberg 77f9263
+	  set_item_stock (item, NULL);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  g_free (label);
Kristian Høgsberg 77f9263
+      }
Kristian Høgsberg 77f9263
+  }
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  if (wnck_screen_net_wm_supports (wnck_window_get_screen (amd->window),
Kristian Høgsberg 77f9263
+				   "_NET_WM_WINDOW_SATURATION"))
Kristian Høgsberg 77f9263
+  {
Kristian Høgsberg 77f9263
+      guint present_saturation;
Kristian Høgsberg 77f9263
+      gint  j;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      amd->saturation_item = gtk_menu_item_new_with_mnemonic (_("_Saturation"));
Kristian Høgsberg 77f9263
+      gtk_widget_show (amd->saturation_item);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      submenu2 = gtk_menu_new ();
Kristian Høgsberg 77f9263
+      gtk_menu_item_set_submenu (GTK_MENU_ITEM (amd->saturation_item),
Kristian Høgsberg 77f9263
+				 submenu2);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      gtk_menu_shell_append (GTK_MENU_SHELL (submenu), amd->saturation_item);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      present_saturation = wnck_window_get_saturation (window);
Kristian Høgsberg 77f9263
+      for (j = 0; j < 4; j++)
Kristian Høgsberg 77f9263
+      {
Kristian Høgsberg 77f9263
+	  GtkWidget *item;
Kristian Høgsberg 77f9263
+	  gchar	    *label;
Kristian Høgsberg 77f9263
+	  guint	    o;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  label = g_strdup_printf ("%d%%", (j + 1) * 25);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  item = make_menu_item (amd, CHANGE_SATURATION);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  o = (j + 1) * 25;
Kristian Høgsberg 77f9263
+	  g_object_set_data (G_OBJECT (item), "saturation", GINT_TO_POINTER (o));
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  if (o == present_saturation)
Kristian Høgsberg 77f9263
+	      gtk_widget_set_sensitive (item, FALSE);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  gtk_menu_shell_append (GTK_MENU_SHELL (submenu2), item);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  set_item_text (item, label);
Kristian Høgsberg 77f9263
+	  set_item_stock (item, NULL);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  g_free (label);
Kristian Høgsberg 77f9263
+      }
Kristian Høgsberg 77f9263
+  }
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+  if (wnck_screen_net_wm_supports (wnck_window_get_screen (amd->window),
Kristian Høgsberg 77f9263
+				   "_NET_WM_WINDOW_BRIGHTNESS"))
Kristian Høgsberg 77f9263
+  {
Kristian Høgsberg 77f9263
+      guint present_brightness;
Kristian Høgsberg 77f9263
+      gint  j;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      amd->brightness_item = gtk_menu_item_new_with_mnemonic (_("_Brightness"));
Kristian Høgsberg 77f9263
+      gtk_widget_show (amd->brightness_item);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      submenu2 = gtk_menu_new ();
Kristian Høgsberg 77f9263
+      gtk_menu_item_set_submenu (GTK_MENU_ITEM (amd->brightness_item),
Kristian Høgsberg 77f9263
+				 submenu2);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      gtk_menu_shell_append (GTK_MENU_SHELL (submenu), amd->brightness_item);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+      present_brightness = wnck_window_get_brightness (window);
Kristian Høgsberg 77f9263
+      for (j = 0; j < 4; j++)
Kristian Høgsberg 77f9263
+      {
Kristian Høgsberg 77f9263
+	  GtkWidget *item;
Kristian Høgsberg 77f9263
+	  gchar	    *label;
Kristian Høgsberg 77f9263
+	  guint	    o;
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  label = g_strdup_printf ("%d%%", (j + 1) * 25);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  item = make_menu_item (amd, CHANGE_BRIGHTNESS);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  o = (j + 1) * 25;
Kristian Høgsberg 77f9263
+	  g_object_set_data (G_OBJECT (item), "brightness", GINT_TO_POINTER (o));
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  if (o == present_brightness)
Kristian Høgsberg 77f9263
+	      gtk_widget_set_sensitive (item, FALSE);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  gtk_menu_shell_append (GTK_MENU_SHELL (submenu2), item);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  set_item_text (item, label);
Kristian Høgsberg 77f9263
+	  set_item_stock (item, NULL);
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+	  g_free (label);
Kristian Høgsberg 77f9263
+      }
Kristian Høgsberg 77f9263
+  }
Kristian Høgsberg 77f9263
+  
Kristian Høgsberg 77f9263
+  if (wnck_screen_net_wm_supports (wnck_window_get_screen (amd->window),
Kristian Høgsberg 77f9263
+				   "_NET_WM_WINDOW_OPACITY"))
Kristian Høgsberg 77f9263
+  {
Kristian Høgsberg 77f9263
+      amd->reset_item = make_menu_item (amd, RESET);
Kristian Høgsberg 77f9263
+      gtk_menu_shell_append (GTK_MENU_SHELL (submenu), amd->reset_item);  
Kristian Høgsberg 77f9263
+      
Kristian Høgsberg 77f9263
+      set_item_text (amd->reset_item, _("_Reset settings"));
Kristian Høgsberg 77f9263
+  }
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
+
Kristian Høgsberg 77f9263
   separator = gtk_separator_menu_item_new ();
Kristian Høgsberg 77f9263
   gtk_widget_show (separator);
Kristian Høgsberg 77f9263
   gtk_menu_shell_append (GTK_MENU_SHELL (menu),