summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorTor Lillqvist <tml@novell.com>2007-04-30 07:27:22 +0000
committerTor Lillqvist <tml@src.gnome.org>2007-04-30 07:27:22 +0000
commitb18f04427015628110e6c78201635b611e7674f5 (patch)
treef2b1058d3832d6289c2d966b81eb7c020665e114 /gdk
parent10862a344aa8fb44e6045343ddf65eb0d14cc1b2 (diff)
downloadgdk-pixbuf-b18f04427015628110e6c78201635b611e7674f5.tar.gz
Add functionality to set overall opacity of a top-level window. (#405316)
2007-04-30 Tor Lillqvist <tml@novell.com> Add functionality to set overall opacity of a top-level window. (#405316) * gdk/gdk.symbols: Add gdk_window_set_opacity. * gdk/x11/gdkwindow-x11.c * gdk/win32/gdkwindow-win32.c: Implement gdk_window_set_opacity(). On X11 use the _NET_WM_WINDOW_OPACITY property. On Win32 use SetLayeredWindowAttributes(LWA_ALPHA). * gdk/gdkwindow.h: Declare gdk_window_set_opacity(). * gdk/x11/gdkscreen-x11.c (gdk_screen_get_rgba_colormap): Document that this is not implemented in the Windows backend. Add reference to gdk_window_set_opacity(). svn path=/trunk/; revision=17730
Diffstat (limited to 'gdk')
-rw-r--r--gdk/gdk.symbols1
-rw-r--r--gdk/gdkwindow.h3
-rw-r--r--gdk/win32/gdkwindow-win32.c30
-rw-r--r--gdk/x11/gdkscreen-x11.c7
-rw-r--r--gdk/x11/gdkwindow-x11.c49
5 files changed, 88 insertions, 2 deletions
diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols
index b064cc7f5..ae3458654 100644
--- a/gdk/gdk.symbols
+++ b/gdk/gdk.symbols
@@ -740,6 +740,7 @@ gdk_window_set_icon_list
gdk_window_set_icon
gdk_window_set_icon_name
gdk_window_beep
+gdk_window_set_opacity
gdk_window_iconify
gdk_window_deiconify
gdk_window_stick
diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h
index 325c4b3d8..9ff3a09fc 100644
--- a/gdk/gdkwindow.h
+++ b/gdk/gdkwindow.h
@@ -569,7 +569,8 @@ void gdk_window_set_keep_above (GdkWindow *window,
gboolean setting);
void gdk_window_set_keep_below (GdkWindow *window,
gboolean setting);
-
+void gdk_window_set_opacity (GdkWindow *window,
+ gdouble opacity);
void gdk_window_register_dnd (GdkWindow *window);
void gdk_window_begin_resize_drag (GdkWindow *window,
diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c
index 9d029619a..75d944d2d 100644
--- a/gdk/win32/gdkwindow-win32.c
+++ b/gdk/win32/gdkwindow-win32.c
@@ -3399,3 +3399,33 @@ gdk_window_beep (GdkWindow *window)
{
gdk_display_beep (_gdk_display);
}
+
+void
+gdk_window_set_opacity (GdkWindow *window,
+ gdouble opacity)
+{
+ LONG exstyle;
+
+ g_return_if_fail (GDK_IS_WINDOW (window));
+ g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
+
+ if (GDK_WINDOW_DESTROYED (window))
+ return;
+
+ if (opacity < 0)
+ opacity = 0;
+ else if (opacity > 1)
+ opacity = 1;
+
+ exstyle = GetWindowLong (GDK_WINDOW_HWND (window), GWL_EXSTYLE);
+
+ if (!(exstyle & WS_EX_LAYERED))
+ API_CALL (SetWindowLong, (GDK_WINDOW_HWND (window),
+ GWL_EXSTYLE,
+ exstyle | WS_EX_LAYERED));
+
+ API_CALL (SetLayeredWindowAttributes, (GDK_WINDOW_HWND (window),
+ 0,
+ opacity * 0xff,
+ LWA_ALPHA));
+}
diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c
index f5e08d87a..624870f85 100644
--- a/gdk/x11/gdkscreen-x11.c
+++ b/gdk/x11/gdkscreen-x11.c
@@ -382,7 +382,12 @@ gdk_screen_get_monitor_geometry (GdkScreen *screen,
* when displaying the window on the screen: in particular, for
* X an appropriate windowing manager and compositing manager
* must be running to provide appropriate display.
- *
+ *
+ * This functionality is not implemented in the Windows backend.
+ *
+ * For setting an overall opacity for a top-level window, see
+ * gdk_window_set_opacity().
+
* Return value: a colormap to use for windows with an alpha channel
* or %NULL if the capability is not available.
*
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index fe5a0976f..621d3245d 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -6402,5 +6402,54 @@ gdk_window_beep (GdkWindow *window)
gdk_display_beep (display);
}
+/**
+ * gdk_window_set_opacity:
+ * @window a top-level #GdkWindow
+ * @opacity: opacity
+ *
+ * Request the windowing system to make @window partially transparent,
+ * with opacity 0 being fully transparent and 1 fully opaque. (Values
+ * of the opacity parameter are clamped to the [0,1] range.) On X11
+ * this works only on X screens with a compositing manager running.
+ *
+ * For setting up per-pixel alpha, see gdk_screen_get_rgba_colormap().
+ *
+ * Since: 2.12
+ */
+void
+gdk_window_set_opacity (GdkWindow *window,
+ gdouble opacity)
+{
+ GdkDisplay *display;
+ guint32 cardinal;
+
+ g_return_if_fail (GDK_IS_WINDOW (window));
+ g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
+
+ if (GDK_WINDOW_DESTROYED (window))
+ return;
+
+ display = gdk_drawable_get_display (window);
+
+ if (opacity < 0)
+ opacity = 0;
+ else if (opacity > 1)
+ opacity = 1;
+
+ cardinal = opacity * 0xffffffff;
+
+ if (cardinal == 0xffffffff)
+ XDeleteProperty (GDK_DISPLAY_XDISPLAY (display),
+ GDK_WINDOW_XID (window),
+ gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_WINDOW_OPACITY"));
+ else
+ XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
+ GDK_WINDOW_XID (window),
+ gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_WINDOW_OPACITY"),
+ XA_CARDINAL, 32,
+ PropModeReplace,
+ (guchar *) cardinal, 1);
+}
+
#define __GDK_WINDOW_X11_C__
#include "gdkaliasdef.c"