Hi,
Here is a new diff file for the X-Transparency extension. This diff
is based off the x11 source tag xf-4_2_99_3 and xdirectfb-rc4.
There are two changes.
1. There is now a simple man page on the extension in xc/doc/man/Xext.
2. The XSetTransparency and XGetTransparency calls have been changed
to XSetOpacity and XGetOpacity.
I will soon fix the patch I made to sawfish and post it to this list
to use these new names.
The previous patch was out of date and failed on xdirectfb-rc4. I
have also tested this new patch against sources from x11 cvs retrieved
with the command:
$ cvs checkout -D "02/18/03" xc
Thanks,
Scott Brumbaugh
Index: xc/config/cf/X11.tmpl
diff -u xc/config/cf/X11.tmpl:1.1.1.1 xc/config/cf/X11.tmpl:1.2
--- xc/config/cf/X11.tmpl:1.1.1.1 Sat Mar 15 18:34:40 2003
+++ xc/config/cf/X11.tmpl Sat Mar 15 19:39:26 2003
@@ -1107,6 +1107,14 @@
#endif
#endif
+#ifndef XTransparencyExtensionDefines
+#if BuildTransparency
+#define XTransparencyExtensionDefines -DXTRANSPARENCY
+#else
+#define XTransparencyExtensionDefines /**/
+#endif
+#endif
+
#ifndef SitePervasiveExtensionDefines
#define SitePervasiveExtensionDefines /**/
#endif
@@ -1129,7 +1137,7 @@
XF86MiscExtensionDefines DBEDefines DPMSDefines EVIDefines \
ScreenSaverExtensionDefines XvExtensionDefines XvMCExtensionDefines \
GlxDefines FontCacheExtensionDefines SiteExtensionDefines \
- XResExtensionDefines
+ XResExtensionDefines XTransparencyExtensionDefines
#endif
#define ExtensionDefines BaseExtensionDefines ExtensionOSDefines
#endif /* ExtensionDefines */
@@ -2262,6 +2270,20 @@
ProjectUnsharedLibReferences(XXF86DGA,Xxf86dga,$(XXF86DGALIBSRC),XBuildLibDir)
#endif
+#if BuildTransparencyLib
+#ifndef SharedLibXTransparency
+#define SharedLibXTransparency NO
+#endif
+#ifndef NormalLibXTransparency
+#define NormalLibXTransparency YES
+#endif
+#ifndef DebugLibXTransparency
+#define DebugLibXTransparency NO
+#endif
+#ifndef ProfileLibXTransparency
+#define ProfileLibXTransparency NO
+#endif
+#endif
XXF86RUSHLIBSRC = $(LIBSRC)/Xxf86rush
#if SharedLibXxf86rush
Index: xc/config/cf/directfb.cf
diff -u xc/config/cf/directfb.cf:1.1.2.1 xc/config/cf/directfb.cf:1.2
--- xc/config/cf/directfb.cf:1.1.2.1 Sat Mar 15 19:09:11 2003
+++ xc/config/cf/directfb.cf Sat Mar 15 19:39:26 2003
@@ -163,7 +163,9 @@
#define GlxUseBuiltInDRIDriver NO /* For libOSmesa */
-
+/* The X top-level window transparency extension */
+#define BuildTransparency YES
+#define BuildTransparencyLib YES
/*
* XIE
Index: xc/doc/man/Xext/Imakefile
diff -u xc/doc/man/Xext/Imakefile:1.1.1.1 xc/doc/man/Xext/Imakefile:1.2
--- xc/doc/man/Xext/Imakefile:1.1.1.1 Sat Mar 15 18:34:44 2003
+++ xc/doc/man/Xext/Imakefile Tue Mar 18 14:40:48 2003
@@ -24,8 +24,11 @@
InstallManPageAliases(XmbufQueryExtension,$(MANDIR),XmbufGetVersion
XmbufCreateBuffers XmbufDestroyBuffers XmbufDisplayBuffers XmbufGetWindowAttributes
XmbufChangeWindowAttributes XmbufGetBufferAttributes XmbufChangeBufferAttributes
XmbufGetScreenInfo XmbufCreateStereoWindow)
InstallManPageLong(Xevi,$(MANDIR),XeviQueryVersion)
InstallManPageAliases(XeviQueryVersion,$(MANDIR),XeviGetVisualInfo XeviQueryExtension)
+InstallManPageLong(XTransparency,$(MANDIR),XTransparencyQueryExtension)
+InstallManPageAliases(XTransparency,$(MANDIR),XSetOpacity XGetOpacity
XTransparencyQueryExtension XTransparencyQueryVersion)
#else
InstallManPage(XShape,$(MANDIR))
InstallManPage(Xmbuf,$(MANDIR))
InstallManPage(Xevi,$(MANDIR))
+InstallManPage(XTransparency,$(MANDIR))
#endif
Index: xc/doc/man/Xext/XTransparency.man
diff -u /dev/null xc/doc/man/Xext/XTransparency.man:1.1
--- /dev/null Wed Mar 19 07:57:30 2003
+++ xc/doc/man/Xext/XTransparency.man Tue Mar 18 14:40:49 2003
@@ -0,0 +1,55 @@
+.\" XTransparency.man - simple documentation file outlining the X-Transparency
+.\" protocol extension
+.\"
+.\" Scott Brumbaugh <[EMAIL PROTECTED]>
+.\"
+.TH XTRANSPARENCY 3X11 __xorgversion__ "X FUNCTIONS"
+.SH NAME
+XTransparencyQueryExtension, XTransparencyQueryVersion, XSetOpacity, XGetOpacity
+.SH SYNTAX
+.nf
+.LP
+\&#include <X11/extensions/transparency.h>
+.LP
+Bool XTransparencyQueryExtension (
+ Display *dpy,
+ int *event_basep,
+ int *error_basep);
+.LP
+Status XTransparencyQueryVersion (
+ Display *dpy,
+ int *major_versionp,
+ int *minor_versionp);
+.LP
+void XSetOpacity (
+ Display *dpy,
+ Window dest,
+ OpacityValue value);
+.LP
+Status XGetOpacity (
+ Display *dpy,
+ Window dest,
+ OpacityValue *value);
+.fi
+.SH DATA TYPES
+.nf
+.LP
+.ta 3i
+typedef unsigned char OpacityValue;
+.fi
+.SH DESCRIPTION
+The \fIX11 Transparency Extension\fP allows any X client program to set the
+opacity of its own or any other client's top-level X window. Here, top-level window
+means that a window's parent is the root window. The opacity value will vary between
+0 and a maximum value of 255. A window with an opacity value of 0 is invisible, while
+a window with an opacity value of 255 is fully opaque. Calling XSetOpacity on a
window
+which is not top-level is an error in the protocol. An XErrorEvent will be returned
to
+the calling process asynchronously.
+.SH BUGS
+This is an experimental protocol extension. This manual page is incomplete.
+.SH AUTHOR
+Scott Brumbaugh <[EMAIL PROTECTED]>
+.SH SEE ALSO
+.nf
+\fIX11 Rootless X Server\fP
+\fIXDirectFB\fP
Index: xc/include/extensions/Imakefile
diff -u xc/include/extensions/Imakefile:1.1.1.1 xc/include/extensions/Imakefile:1.2
--- xc/include/extensions/Imakefile:1.1.1.1 Sat Mar 15 18:35:38 2003
+++ xc/include/extensions/Imakefile Sat Mar 15 19:39:43 2003
@@ -51,12 +51,15 @@
#if BuildXResExt || BuildXResLibrary
XRESHEADERS = XRes.h XResproto.h
#endif
+#if BuildTransparency || BuildTransparencyLibs
+TRANSPARENCYHEADERS = transparency.h transparencyproto.h
+#endif
EXTRAHEADERS = $(SCREENSAVERHEADERS) $(XF86MISCHEADERS) $(XF86BIGFONTHEADERS) \
$(XF86VIDMODEHEADERS) $(XF86DGAHEADERS) $(XINERAMAHEADERS) \
$(LBXHEADERS) $(XVHEADERS) $(XVMCHEADERS) $(XF86RUSHHEADERS) \
$(FONTCACHEHEADERS) $(RENDERHEADERS) $(RANDRHEADERS) \
- $(XTRAPHEADERS) $(XRESHEADERS)
+ $(XTRAPHEADERS) $(XRESHEADERS) $(TRANSPARENCYHEADERS)
Index: xc/include/extensions/transparency.h
diff -u /dev/null xc/include/extensions/transparency.h:1.2
--- /dev/null Wed Mar 19 07:57:31 2003
+++ xc/include/extensions/transparency.h Tue Mar 18 14:41:18 2003
@@ -0,0 +1,31 @@
+/*
+ * transparency.h
+ *
+ * Copyright 2002 Scott Brumbaugh
+ * All rights reserved
+ *
+ * X-Transparency extension, get/set opacity for top level windows.
+ */
+
+#ifndef _TRANSPARENCY_H_
+#define _TRANSPARENCY_H_
+
+#include <X11/Xlib.h>
+#include <X11/Xfuncproto.h>
+
+/* The opacity, 0 invisible, 255 fully opaque */
+typedef unsigned char OpacityValue;
+
+_XFUNCPROTOBEGIN
+
+Bool XTransparencyQueryExtension(Display * dpy, int *event_base, int *error_base);
+
+Status XTransparencyQueryVersion(Display * dpy, int *major, int *minor);
+
+void XSetOpacity(Display * dpy, Window win, OpacityValue value);
+
+Status XGetOpacity(Display * dpy, Window win, OpacityValue *value);
+
+_XFUNCPROTOEND
+
+#endif /* _TRANSPARENCY_H_ */
Index: xc/include/extensions/transparencyproto.h
diff -u /dev/null xc/include/extensions/transparencyproto.h:1.2
--- /dev/null Wed Mar 19 07:57:31 2003
+++ xc/include/extensions/transparencyproto.h Tue Mar 18 14:41:18 2003
@@ -0,0 +1,98 @@
+/*
+ * transparencyproto.h
+ *
+ * Copyright 2002 Scott Brumbaugh
+ * All rights reserved
+ *
+ * X-Transparency extension, get/set opacity for top level windows.
+ */
+
+#ifndef _TRANSPARENCYPROTO_H_
+#define _TRANSPARENCYPROTO_H_
+
+#include <X11/Xlibint.h>
+
+#define TRANSPARENCY_NAME "X-Transparency"
+#define TRANSPARENCY_MAJOR 0
+#define TRANSPARENCY_MINOR 1
+
+#define X_TRANSPARENCY_ERRORS 0
+#define X_TRANSPARENCY_EVENTS 0
+
+#define X_XTransparencyQueryVersion 0
+#define X_XSetOpacity 1
+#define X_XGetOpacity 2
+
+#define Window CARD32
+#define Transparency CARD32
+
+typedef struct
+{
+ CARD8 reqType;
+ CARD8 transparencyReqType;
+ CARD16 length B16;
+ CARD32 major B32;
+ CARD32 minor B32;
+}
+xXTransparencyQueryVersionReq;
+
+#define sz_xXTransparencyQueryVersionReq 12
+
+typedef struct
+{
+ CARD8 type; /* X_Reply */
+ CARD8 pad1;
+ CARD16 sequence B16;
+ CARD32 length B32;
+ CARD32 major B32;
+ CARD32 minor B32;
+ CARD32 pad2 B32;
+ CARD32 pad3 B32;
+ CARD32 pad4 B32;
+ CARD32 pad5 B32;
+}
+xXTransparencyQueryVersionReply;
+
+#define sz_xXTransparencyQueryVersionReply 32
+
+typedef struct
+{
+ CARD8 reqType;
+ CARD8 transparencyReqType;
+ CARD16 length B16;
+ CARD32 window B32;
+}
+xXGetOpacityReq;
+
+#define sz_xXGetOpacityReq 8
+
+typedef struct
+{
+ CARD8 type;
+ CARD8 pad1;
+ CARD16 sequence B16;
+ CARD32 length B32;
+ CARD32 value B32;
+ CARD32 pad2 B32;
+ CARD32 pad3 B32;
+ CARD32 pad4 B32;
+ CARD32 pad5 B32;
+ CARD32 pad6 B32;
+}
+xXGetOpacityReply;
+
+#define sz_xXGetOpacityReply 32
+
+typedef struct
+{
+ CARD8 reqType;
+ CARD8 transparencyReqType;
+ CARD16 length B16;
+ CARD32 window B32;
+ CARD32 value B32;
+}
+xXSetOpacityReq;
+
+#define sz_xXSetOpacityReq 12
+
+#endif /* _TRANSPARENCYPROTO_H_ */
Index: xc/include/extensions/transparencystr.h
diff -u /dev/null xc/include/extensions/transparencystr.h:1.2
--- /dev/null Wed Mar 19 07:57:31 2003
+++ xc/include/extensions/transparencystr.h Tue Mar 18 14:41:18 2003
@@ -0,0 +1,19 @@
+/*
+ * transparencystr.h
+ *
+ * Copyright 2002 Scott Brumbaugh
+ * All rights reserved
+ *
+ * X-Transparency extension, get/set opacity for top level windows.
+ */
+
+#ifndef _TRANSPARENCYSTR_H_
+#define _TRANSPARENCYSTR_H_
+
+typedef Bool(*SetOpacityProcPtr) (WindowPtr, unsigned char);
+typedef Bool(*GetOpacityProcPtr) (WindowPtr, unsigned char *);
+
+Bool TransparencyExtAddScreen(ScreenPtr, SetOpacityProcPtr, GetOpacityProcPtr);
+void XTransparencyExtensionInit(void);
+
+#endif /* _TRANSPARENCYSTR_H_ */
Index: xc/lib/Imakefile
diff -u xc/lib/Imakefile:1.1.1.1 xc/lib/Imakefile:1.2
--- xc/lib/Imakefile:1.1.1.1 Sat Mar 15 18:35:38 2003
+++ xc/lib/Imakefile Sat Mar 15 19:39:43 2003
@@ -168,6 +168,10 @@
FONTCACHELIBDIR = Xfontcache
#endif
+#if BuildTransparencyLib
+TRANSPARENCYLIBDIR = Xtransparency
+#endif
+
FONTSUBDIR = font
#if BuildFontEncLib
@@ -216,7 +220,7 @@
$(ZLIBDIR) $(REGEXDIR) $(RENDERLIBDIR) $(FREETYPE2BUILDDIR) \
$(LIBXML2BUILDDIR) $(EXPATBUILDDIR) $(FONTCONFIGBUILDDIR) \
$(XFT1LIBDIR) $(XFTLIBDIR) $(XVMCLIBDIR) $(RANDRLIBDIR) \
- $(XTRAPLIBDIR) $(XRESLIBDIR) $(XCURSORLIBDIR)
+ $(XTRAPLIBDIR) $(XRESLIBDIR) $(XCURSORLIBDIR) $(TRANSPARENCYLIBDIR)
SUBDIRS = $(BERKDIR) xtrans $(LINTSUBDIRS) $(FONTSUBDIR) $(FONTENCSUBDIR) \
$(FONTCACHELIBDIR)
Index: xc/lib/Xtransparency/Imakefile
diff -u /dev/null xc/lib/Xtransparency/Imakefile:1.1
--- /dev/null Wed Mar 19 07:57:31 2003
+++ xc/lib/Xtransparency/Imakefile Sat Mar 15 19:39:43 2003
@@ -0,0 +1,30 @@
+XCOMM $XFree86$
+
+#define DoNormalLib NormalLibXTransparency
+#define DoSharedLib SharedLibXTransparency
+#define DoDebugLib DebugLibXTransparency
+#define DoProfileLib ProfileLibXTransparency
+#define LibName XTransparency
+#define SoRev SOXTRANSPARENCYREV
+#define IncSubdir X11
+#define IncSubSubdir extensions
+
+#include <Threads.tmpl>
+
+#ifdef SharedXTransparencyReqs
+REQUIREDLIBS = SharedXTransparencyReqs
+#endif
+
+#if Malloc0ReturnsNull
+ALLOC_DEFINES = -DMALLOC_0_RETURNS_NULL
+#endif
+
+ DEFINES = $(ALLOC_DEFINES)
+ INCLUDES = -I$(XLIBSRC) -I$(EXTINCSRC)
+ SRCS = transparency.c
+ OBJS = transparency.o
+ LINTLIBS = $(LINTXLIB)
+
+#include <Library.tmpl>
+
+DependTarget()
Index: xc/lib/Xtransparency/transparency.c
diff -u /dev/null xc/lib/Xtransparency/transparency.c:1.2
--- /dev/null Wed Mar 19 07:57:31 2003
+++ xc/lib/Xtransparency/transparency.c Tue Mar 18 14:41:32 2003
@@ -0,0 +1,196 @@
+/*
+ * transparency.c
+ *
+ * Copyright 2002 Scott Brumbaugh
+ * All rights reserved
+ *
+ * X-Transparency extension, get/set opacity for top level windows.
+ */
+
+#include "transparency.h"
+#include "transparencyproto.h"
+
+#include <X11/Xlib.h>
+#include <X11/Xlibint.h>
+#include <Xext.h>
+#include <extutil.h>
+
+#include <stdio.h>
+
+typedef struct
+{
+ int major;
+ int minor;
+}
+XTransparencyInfo;
+
+XExtensionInfo XTransparencyExtensionInfo;
+
+static Status XTransparencyCloseDisplay(Display * dpy, XExtCodes * codes);
+
+static XExtensionHooks transparency_extension_hooks = {
+ NULL, /* create_gc */
+ NULL, /* copy_gc */
+ NULL, /* flush_gc */
+ NULL, /* free_gc */
+ NULL, /* create_font */
+ NULL, /* free_font */
+ XTransparencyCloseDisplay, /* close_display */
+ NULL, /* wire_to_event */
+ NULL, /* event_to_wire */
+ NULL, /* error */
+ NULL, /* error_string */
+};
+
+#define XTransparencyCheckExtension(dpy,i,val) \
+ XextCheckExtension(dpy,i,TRANSPARENCY_NAME, val)
+#define XTransparencySimpleCheckExtension(dpy,i) \
+ XextSimpleCheckExtension(dpy,i,TRANSPARENCY_NAME)
+
+XExtDisplayInfo *
+XTransparencyFindDisplay(Display * dpy)
+{
+ XExtDisplayInfo *dpyinfo;
+ XTransparencyInfo *xti;
+
+ dpyinfo = XextFindDisplay(&XTransparencyExtensionInfo, dpy);
+
+ if (!dpyinfo) {
+ xti = Xmalloc(sizeof(XTransparencyInfo));
+ if (xti == NULL) {
+ return NULL;
+ }
+
+ dpyinfo = XextAddDisplay(&XTransparencyExtensionInfo, dpy,
+ TRANSPARENCY_NAME, &transparency_extension_hooks, 0, 0);
+
+ xti->major = -1;
+ xti->minor = -1;
+ dpyinfo->data = (char *)xti;
+ }
+
+ return dpyinfo;
+}
+
+Bool
+XTransparencyQueryExtension(Display * dpy, int *event_basep, int *error_basep)
+{
+ XExtDisplayInfo *info = XTransparencyFindDisplay(dpy);
+
+ if (XextHasExtension(info)) {
+ *event_basep = info->codes->first_event;
+ *error_basep = info->codes->first_error;
+ return True;
+ } else {
+ return False;
+ }
+
+}
+
+Status
+XTransparencyQueryVersion(Display * dpy,
+ int *major_versionp, int *minor_versionp)
+{
+
+ XExtDisplayInfo *info = XTransparencyFindDisplay(dpy);
+ XTransparencyInfo *xti;
+ xXTransparencyQueryVersionReq *request;
+ xXTransparencyQueryVersionReply reply;
+
+ XTransparencyCheckExtension(dpy, info, 0);
+
+ xti = (XTransparencyInfo *) info->data;
+
+ LockDisplay(dpy);
+
+ GetReq(XTransparencyQueryVersion, request);
+ request->reqType = info->codes->major_opcode;
+ request->transparencyReqType = X_XTransparencyQueryVersion;
+ request->major = 0;
+ request->minor = 0;
+ if (!_XReply(dpy, (xReply *) & reply, 0, True)) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return 0; /* failure */
+ }
+
+ xti->major = reply.major;
+ xti->minor = reply.minor;
+
+ UnlockDisplay(dpy);
+
+ *major_versionp = xti->major;
+ *minor_versionp = xti->minor;
+
+ SyncHandle();
+
+ return 1;
+}
+
+void
+XSetOpacity(Display * dpy, Window win, OpacityValue value)
+{
+ XExtDisplayInfo *info = XTransparencyFindDisplay(dpy);
+ xXSetOpacityReq *request;
+
+ XTransparencySimpleCheckExtension(dpy, info);
+
+ LockDisplay(dpy);
+ GetReq(XSetOpacity, request);
+ request->reqType = info->codes->major_opcode;
+ request->transparencyReqType = X_XSetOpacity;
+ request->window = win;
+ request->value = (CARD32) value;
+ UnlockDisplay(dpy);
+ SyncHandle();
+}
+
+Status
+XGetOpacity(Display * dpy, Window win, OpacityValue *value)
+{
+
+ XExtDisplayInfo *info = XTransparencyFindDisplay(dpy);
+ xXGetOpacityReq *request;
+ xXGetOpacityReply reply;
+ unsigned long value1;
+
+ XTransparencyCheckExtension(dpy, info, None);
+
+ LockDisplay(dpy);
+ GetReq(XGetOpacity, request);
+ request->reqType = info->codes->major_opcode;
+ request->transparencyReqType = X_XGetOpacity;
+ request->window = win;
+
+ if (!_XReply(dpy, (xReply *) & reply, 0, xFalse)) {
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return BadRequest;
+ }
+
+ *value = (OpacityValue)reply.value;
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ return Success;
+
+}
+
+static Status
+XTransparencyCloseDisplay(Display * dpy, XExtCodes * codes)
+{
+
+ XExtDisplayInfo *info = XTransparencyFindDisplay(dpy);
+
+ LockDisplay(dpy);
+ if (info->data) {
+ XTransparencyInfo *xti = (XTransparencyInfo *) info->data;
+
+ XFree(xti);
+ }
+ UnlockDisplay(dpy);
+
+ return XextRemoveDisplay(&XTransparencyExtensionInfo, dpy);
+
+}
Index: xc/programs/Imakefile
diff -u xc/programs/Imakefile:1.1.1.1 xc/programs/Imakefile:1.2
--- xc/programs/Imakefile:1.1.1.1 Sat Mar 15 18:35:50 2003
+++ xc/programs/Imakefile Sat Mar 15 19:39:43 2003
@@ -108,6 +108,10 @@
XCURSORGENDIR = xcursorgen
#endif
+#if BuildTransparency && BuildTransparencyLib
+ XTOGGLETRANSDIR = xtoggletrans
+#endif
+
#if BuildServersOnly || !BuildClients
SUBDIRS = $(XSSRCDIR)
#else
@@ -132,7 +136,7 @@
$(XTERMSRCDIR) $(XTRAPCLIENTDIRS) $(XVIDTUNESRCDIR) xwd xwininfo xwud \
$(XPMCLIENTDIRS) $(XVINFOSRCDIR) \
$(XSSRCDIR) $(XASSRCDIR) $(LBXPROXYSRCDIR) $(SCRIPTSDIR) \
- $(GLXCLIENTDIRS) $(XRANDRDIR) $(XCURSORGENDIR)
+ $(GLXCLIENTDIRS) $(XRANDRDIR) $(XCURSORGENDIR) $(XTOGGLETRANSDIR)
#endif
MakeSubdirs($(SUBDIRS))
Index: xc/programs/Xserver/Xext/Imakefile
diff -u xc/programs/Xserver/Xext/Imakefile:1.1.1.1
xc/programs/Xserver/Xext/Imakefile:1.2
--- xc/programs/Xserver/Xext/Imakefile:1.1.1.1 Sat Mar 15 18:35:52 2003
+++ xc/programs/Xserver/Xext/Imakefile Sat Mar 15 19:39:43 2003
@@ -101,20 +101,27 @@
#endif
#endif
+#if BuildTransparency
+ TRANSPARENCYSRCS = transparency.c
+ TRANSPARENCYOBJS = transparency.o
+#endif
+
SRCS = shape.c $(SHMSRCS) $(MULTIBUFSRC) \
mitmisc.c xtest.c xtest1di.c xtest1dd.c sleepuntil.c \
bigreq.c sync.c $(SCRNSAVSRC) xcmisc.c $(VIDMODESRCS) \
$(XF86MISCSRCS) $(XF86BIGFSRCS) $(XF86DGASRCS) $(SECURITYSRCS) \
$(APPGROUPSRCS) xprint.c $(CUPSRCS) $(PNRXSRCS) $(DPMSSRCS) \
- $(EVISRCS) $(XVSRCS) $(FONTCACHESRCS) $(XRESSRCS)
+ $(EVISRCS) $(XVSRCS) $(FONTCACHESRCS) $(XRESSRCS) \
+ $(TRANSPARENCYSRCS)
OBJS = shape.o $(SHMOBJS) $(MULTIBUFOBJ) \
mitmisc.o xtest.o xtest1di.o xtest1dd.o sleepuntil.o \
bigreq.o sync.o $(SCRNSAVOBJ) xcmisc.o $(VIDMODEOBJS) \
$(XF86MISCOBJS) $(XF86BIGFOBJS) $(XF86DGAOBJS) $(SECURITYOBJS) \
$(APPGROUPOBJS) xprint.o $(CUPOBJS) $(PNRXOBJS) $(DPMSOBJS) \
- $(EVIOBJS) $(XVOBJS) $(FONTCACHEOBJS) $(XRESOBJS)
+ $(EVIOBJS) $(XVOBJS) $(FONTCACHEOBJS) $(XRESOBJS) \
+ $(TRANSPARENCYOBJS)
SOBJS = $(SHMOBJS) $(APPGROUPOBJS) $(SECURITYOBJS) xprint.o \
xtest.o xtest1di.o xtest1dd.o sleepuntil.o $(PNRXOBJS) \
Index: xc/programs/Xserver/Xext/transparency.c
diff -u /dev/null xc/programs/Xserver/Xext/transparency.c:1.2
--- /dev/null Wed Mar 19 07:57:31 2003
+++ xc/programs/Xserver/Xext/transparency.c Tue Mar 18 14:41:36 2003
@@ -0,0 +1,285 @@
+/*
+ * transparency.c
+ *
+ * Copyright 2002 Scott Brumbaugh
+ * All rights reserved
+ *
+ * X-Transparency extension, get/set opacity for top level windows.
+ */
+
+#include "X.h"
+#include "Xdefs.h"
+#include "windowstr.h"
+#include "scrnintstr.h"
+#include "extnsionst.h"
+#include "dixstruct.h"
+
+#include "transparencyproto.h"
+#include "transparencystr.h"
+#include "transparency.h"
+
+#define IsTopLevel(pWin) \
+ ((pWin) && (pWin)->parent && !(pWin)->parent->parent)
+
+typedef struct _TransparencyPrivate
+{
+ SetOpacityProcPtr SetOpacityCallback;
+ GetOpacityProcPtr GetOpacityCallback;
+ CloseScreenProcPtr CloseScreen;
+}
+TransparencyPrivate, *TransparencyPrivatePtr;
+
+static int TransparencyScreenPrivateIndex;
+static int TransparencyGeneration = 0;
+
+Bool TransparencyExtAddScreen(ScreenPtr, SetOpacityProcPtr, GetOpacityProcPtr);
+static Bool TransparencyCloseScreen(int i, ScreenPtr pScreen);
+
+static int ProcXTransparencyQueryVersion(ClientPtr);
+static int SProcXTransparencyQueryVersion(ClientPtr);
+static int ProcXOpacitySet(ClientPtr);
+static int SProcXOpacitySet(ClientPtr);
+static int ProcXOpacityGet(ClientPtr);
+static int SProcXOpacityGet(ClientPtr);
+static int ProcXTransparencyDispatch(ClientPtr);
+static int SProcXTransparencyDispatch(ClientPtr);
+
+static void
+XTransparencyResetProc(ExtensionEntry * extEntry)
+{
+ /* empty */
+}
+
+void
+XTransparencyExtensionInit()
+{
+ ExtensionEntry *extEntry = AddExtension(TRANSPARENCY_NAME,
+ X_TRANSPARENCY_EVENTS, X_TRANSPARENCY_ERRORS,
+ ProcXTransparencyDispatch,
+ SProcXTransparencyDispatch,
+ XTransparencyResetProc,
+ StandardMinorOpcode);
+}
+
+Bool
+TransparencyExtAddScreen(ScreenPtr pScreen,
+ SetOpacityProcPtr setOpacity,
+ GetOpacityProcPtr getOpacity)
+{
+
+ TransparencyPrivatePtr pTransparencyPrivate;
+
+ if (TransparencyGeneration != serverGeneration) {
+ TransparencyScreenPrivateIndex = AllocateScreenPrivateIndex();
+ if (TransparencyScreenPrivateIndex < 0) {
+ return FALSE;
+ }
+ TransparencyGeneration = serverGeneration;
+ }
+
+ pTransparencyPrivate = xalloc(sizeof(TransparencyPrivate));
+ if (pTransparencyPrivate == 0) {
+ return FALSE;
+ }
+
+ pTransparencyPrivate->SetOpacityCallback = setOpacity;
+ pTransparencyPrivate->GetOpacityCallback = getOpacity;
+ pTransparencyPrivate->CloseScreen = pScreen->CloseScreen;
+
+ pScreen->CloseScreen = TransparencyCloseScreen;
+
+ pScreen->devPrivates[TransparencyScreenPrivateIndex].ptr =
+ (pointer) pTransparencyPrivate;
+
+ return TRUE;
+}
+
+static Bool
+TransparencyCloseScreen(int i, ScreenPtr pScreen)
+{
+
+ TransparencyPrivatePtr pTransparencyPrivate;
+
+ pTransparencyPrivate =
+ (TransparencyPrivatePtr) pScreen->
+ devPrivates[TransparencyScreenPrivateIndex].ptr;
+
+ pScreen->CloseScreen = pTransparencyPrivate->CloseScreen;
+
+ xfree(pTransparencyPrivate);
+
+ return pScreen->CloseScreen(i, pScreen);
+
+}
+
+static int
+ProcXTransparencyQueryVersion(ClientPtr client)
+{
+
+ REQUEST(xXTransparencyQueryVersionReq);
+ xXTransparencyQueryVersionReply reply;
+
+ REQUEST_SIZE_MATCH(xXTransparencyQueryVersionReq);
+
+ reply.type = X_Reply;
+ reply.length = 0;
+ reply.sequence = client->sequence;
+ reply.major = TRANSPARENCY_MAJOR;
+ reply.minor = TRANSPARENCY_MINOR;
+ if (client->swapped) {
+ int n;
+
+ swaps(&reply.sequence, n);
+ swapl(&reply.length, n);
+ swaps(&reply.major, n);
+ swaps(&reply.minor, n);
+ }
+ WriteToClient(client, sz_xXTransparencyQueryVersionReply, (char *)&reply);
+
+ return client->noClientException;
+
+}
+
+static int
+SProcXTransparencyQueryVersion(ClientPtr client)
+{
+ REQUEST(xXTransparencyQueryVersionReq);
+ int n;
+
+ REQUEST_SIZE_MATCH(xXTransparencyQueryVersionReq);
+ swaps(&stuff->major, n);
+ swaps(&stuff->minor, n);
+ return ProcXTransparencyQueryVersion(client);
+}
+
+static int
+ProcXOpacitySet(ClientPtr client)
+{
+
+ REQUEST(xXSetOpacityReq);
+ WindowPtr pWin;
+ OpacityValue value;
+ TransparencyPrivatePtr pPriv;
+
+ REQUEST_SIZE_MATCH(xXSetOpacityReq);
+
+ pWin = LookupWindow(stuff->window, client);
+ if (!IsTopLevel(pWin)) {
+ return BadWindow;
+ }
+
+ if (TransparencyScreenPrivateIndex == -1) {
+ return BadMatch;
+ }
+
+ pPriv =
+ (TransparencyPrivatePtr) pWin->drawable.pScreen->
+ devPrivates[TransparencyScreenPrivateIndex].ptr;
+
+ value = (OpacityValue) stuff->value;
+
+ if (!pPriv->SetOpacityCallback(pWin, value)) {
+ return BadMatch;
+ }
+
+ return client->noClientException;
+}
+
+static int
+SProcXOpacitySet(ClientPtr client)
+{
+ return ProcXOpacitySet(client);
+}
+
+static int
+ProcXOpacityGet(ClientPtr client)
+{
+
+ REQUEST(xXGetOpacityReq);
+ xXGetOpacityReply reply;
+ WindowPtr pWin;
+ OpacityValue value;
+ TransparencyPrivatePtr pPriv;
+
+ REQUEST_SIZE_MATCH(xXGetOpacityReq);
+
+ pWin = LookupWindow(stuff->window, client);
+ if (!IsTopLevel(pWin)) {
+ return BadWindow;
+ }
+
+ if (TransparencyScreenPrivateIndex == -1) {
+ return BadMatch;
+ }
+
+ pPriv =
+ (TransparencyPrivatePtr) pWin->drawable.pScreen->
+ devPrivates[TransparencyScreenPrivateIndex].ptr;
+
+ if (!pPriv->GetOpacityCallback(pWin, &value)) {
+ return BadMatch;
+ }
+
+ reply.type = X_Reply;
+ reply.sequence = client->sequence;
+ reply.length = 0; /* words */
+ reply.value = (CARD32) value;
+ if (client->swapped) {
+ int n;
+
+ swaps(&reply.sequence, n);
+ swapl(&reply.length, n);
+ swapl(&reply.value, n);
+ }
+
+ WriteToClient(client, sz_xXGetOpacityReply, (char *)&reply);
+
+ return client->noClientException;
+}
+
+static int
+SProcXOpacityGet(ClientPtr client)
+{
+ REQUEST(xXGetOpacityReq);
+
+ REQUEST_SIZE_MATCH(xXGetOpacityReq);
+
+ return ProcXOpacityGet(client);
+}
+
+static int
+ProcXTransparencyDispatch(ClientPtr client)
+{
+ REQUEST(xReq);
+
+ switch (stuff->data) {
+ case X_XTransparencyQueryVersion:
+ return ProcXTransparencyQueryVersion(client);
+ case X_XSetOpacity:
+ return ProcXOpacitySet(client);
+ case X_XGetOpacity:
+ return ProcXOpacityGet(client);
+ }
+
+ return BadRequest;
+}
+
+static int
+SProcXTransparencyDispatch(ClientPtr client)
+{
+ REQUEST(xReq);
+ int n;
+
+ swaps(&stuff->length, n);
+
+ switch (stuff->data) {
+ case X_XTransparencyQueryVersion:
+ return SProcXTransparencyQueryVersion(client);
+ case X_XSetOpacity:
+ return SProcXOpacitySet(client);
+ case X_XGetOpacity:
+ return SProcXOpacityGet(client);
+ }
+
+ return BadRequest;
+}
Index: xc/programs/Xserver/hw/directfb/Imakefile
diff -u xc/programs/Xserver/hw/directfb/Imakefile:1.1.2.1
xc/programs/Xserver/hw/directfb/Imakefile:1.2
--- xc/programs/Xserver/hw/directfb/Imakefile:1.1.2.1 Sat Mar 15 19:09:58 2003
+++ xc/programs/Xserver/hw/directfb/Imakefile Sat Mar 15 19:39:43 2003
@@ -35,6 +35,9 @@
DEFINES = -Wall
EXTRAMANDEFS = -D__logdir__=$(LOGDIRECTORY)
+SpecialCObjectRule(directfbScreen,NullParameter,XTransparencyExtensionDefines)
+SpecialCObjectRule(rootlessDirectFB,NullParameter,XTransparencyExtensionDefines)
+
NormalLibraryObjectRule()
NormalLibraryTarget(directfb,$(OBJS))
Index: xc/programs/Xserver/hw/directfb/directfbScreen.c
diff -u xc/programs/Xserver/hw/directfb/directfbScreen.c:1.1.2.1
xc/programs/Xserver/hw/directfb/directfbScreen.c:1.3
--- xc/programs/Xserver/hw/directfb/directfbScreen.c:1.1.2.1 Sat Mar 15 19:09:58
2003
+++ xc/programs/Xserver/hw/directfb/directfbScreen.c Tue Mar 18 14:41:40 2003
@@ -33,6 +33,10 @@
#include "globals.h"
#include "dix.h"
+#ifdef XTRANSPARENCY
+#include "transparencystr.h"
+#endif
+
/* System headers */
#include <unistd.h>
#include <sys/types.h>
@@ -301,6 +305,10 @@
#ifdef MITSHM
ShmRegisterFbFuncs(pScreen);
+#endif
+
+#ifdef XTRANSPARENCY
+ TransparencyExtAddScreen(pScreen, XDirectFBSetOpacity, XDirectFBGetOpacity);
#endif
/* This must be initialized (why doesnt X have a default?) */
Index: xc/programs/Xserver/hw/directfb/rootlessDirectFB.c
diff -u xc/programs/Xserver/hw/directfb/rootlessDirectFB.c:1.1.2.1
xc/programs/Xserver/hw/directfb/rootlessDirectFB.c:1.3
--- xc/programs/Xserver/hw/directfb/rootlessDirectFB.c:1.1.2.1 Sat Mar 15 19:09:58
2003
+++ xc/programs/Xserver/hw/directfb/rootlessDirectFB.c Tue Mar 18 14:41:40 2003
@@ -1031,3 +1031,47 @@
}
}
+
+#ifdef XTRANSPARENCY
+/* Callbacks for the X-Transparent top level window extention */
+/* Get the current transparency for a window */
+Bool XDirectFBGetOpacity(WindowPtr pWin, __u8 * value)
+{
+
+ RootlessWindowRec *pWinRec;
+ DirectFBWindowRec *pDFBWinRec;
+
+ pWinRec = WINREC(pWin);
+ if (!pWinRec)
+ {
+ return FALSE;
+ }
+ pDFBWinRec = DFBWINREC(&pWinRec->frame);
+ *value = pDFBWinRec->opacity.current;
+
+ return TRUE;
+}
+
+/* Set the current opacity for a window */
+Bool XDirectFBSetOpacity(WindowPtr pWin, __u8 value)
+{
+
+ RootlessWindowRec *pWinRec;
+ DirectFBWindowRec *pDFBWinRec;
+ IDirectFBWindow *window;
+
+ pWinRec = WINREC(pWin);
+ if (!pWinRec)
+ {
+ return FALSE;
+ }
+
+ pDFBWinRec = DFBWINREC(&(pWinRec->frame));
+ pDFBWinRec->opacity.current = value;
+ window = pDFBWinRec->window;
+ window->SetOpacity(window, value);
+
+ return TRUE;
+}
+
+#endif /* XTRANSPARENCY */
Index: xc/programs/Xserver/hw/directfb/rootlessDirectFB.h
diff -u xc/programs/Xserver/hw/directfb/rootlessDirectFB.h:1.1.2.1
xc/programs/Xserver/hw/directfb/rootlessDirectFB.h:1.3
--- xc/programs/Xserver/hw/directfb/rootlessDirectFB.h:1.1.2.1 Sat Mar 15 19:09:58
2003
+++ xc/programs/Xserver/hw/directfb/rootlessDirectFB.h Tue Mar 18 14:41:40 2003
@@ -38,4 +38,12 @@
*/
void XDirectFBSetCursorShape (IDirectFBSurface *shape, int hot_x, int hot_y);
+#ifdef XTRANSPARENCY
+/* Callbacks for the X top-level window transparency extension.
+ * The protocol will call these when it handles a get/set opacity
+ * request from an X client. */
+Bool XDirectFBSetOpacity(WindowPtr pWin, __u8 value);
+Bool XDirectFBGetOpacity(WindowPtr pWin, __u8 * value);
+#endif
+
#endif /* _ROOTLESSDIRECTFB_H */
Index: xc/programs/Xserver/mi/miinitext.c
diff -u xc/programs/Xserver/mi/miinitext.c:1.1.1.1
xc/programs/Xserver/mi/miinitext.c:1.2
--- xc/programs/Xserver/mi/miinitext.c:1.1.1.1 Sat Mar 15 18:36:21 2003
+++ xc/programs/Xserver/mi/miinitext.c Sat Mar 15 19:39:44 2003
@@ -111,6 +111,9 @@
#ifdef RES
#include "XResproto.h"
#endif
+#ifdef XTRANSPARENCY
+#include "transparencystr.h"
+#endif
/* FIXME: this whole block of externs should be from the appropriate headers */
#ifdef BEZIER
@@ -235,6 +238,9 @@
#ifdef RES
extern void ResExtensionInit(INITARGS);
#endif
+#ifdef XTRANSPARENCY
+extern void XTransparencyExtensionInit(INITARGS);
+#endif
#ifndef XFree86LOADER
@@ -374,6 +380,10 @@
#ifdef RES
ResExtensionInit();
#endif
+#ifdef XTRANSPARENCY
+ XTransparencyExtensionInit();
+#endif
+
}
void
Index: xc/programs/xtoggletrans/Imakefile
diff -u /dev/null xc/programs/xtoggletrans/Imakefile:1.1
--- /dev/null Wed Mar 19 07:57:33 2003
+++ xc/programs/xtoggletrans/Imakefile Sat Mar 15 19:39:44 2003
@@ -0,0 +1,9 @@
+ DEPLIBS = $(DEPXMUULIB) $(DEPXLIB)
+LOCAL_LIBRARIES = $(XMUULIB) $(XLIB) -lXTransparency
+ SRCS = xtoggletrans.c dsimple.c
+ OBJS = xtoggletrans.o dsimple.o
+
+LinkSourceFile(dsimple.c,../xlsfonts)
+LinkSourceFile(dsimple.h,../xlsfonts)
+
+ComplexProgramTargetNoMan(xtoggletrans)
Index: xc/programs/xtoggletrans/xtoggletrans.c
diff -u /dev/null xc/programs/xtoggletrans/xtoggletrans.c:1.2
--- /dev/null Wed Mar 19 07:57:33 2003
+++ xc/programs/xtoggletrans/xtoggletrans.c Tue Mar 18 14:41:46 2003
@@ -0,0 +1,95 @@
+/*
+ * xtoggletrans.c
+ *
+ * Copyright 2002 Scott Brumbaugh
+ * All rights reserved
+ *
+ * Demonstrates use of the X-Transparency extension wich allows
+ * clients to get/set opacity value of top-level windows.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <X11/Xlib.h>
+#include <X11/extensions/transparency.h>
+
+#include "dsimple.h"
+
+extern Display *dpy;
+
+void
+usage()
+{
+ fprintf(stdout,
+ "xtoggletrans [-value number]\n"
+ "\n"
+ "Toggle transparency of top-level X window with a mouse click.\n"
+ "If the selected window is already partly transparent, it is reset to
opaque.\n"
+ "Otherwise, the opacity of the window is set to number.\n"
+ "Number is 0 for completely transparent, 255 for fully opaque, default is
127\n");
+
+ exit(1);
+
+}
+
+int
+main(int argc, char *argv[])
+{
+
+ Window window;
+ int event_base, error_base;
+ int major, minor;
+ OpacityValue orig_value;
+ OpacityValue new_value = 127;
+ int i;
+
+ Setup_Display_And_Screen(&argc, argv);
+
+ for (i = 1; i < argc; i++) {
+ if (!strncmp(argv[i], "-value", 6) && argv[++i]) {
+ new_value = (OpacityValue) atoi(argv[i]);
+ continue;
+ }
+ usage();
+ }
+
+ if (!XTransparencyQueryExtension(dpy, &event_base, &error_base)) {
+ fprintf(stderr, "Transparency extension not found\n");
+ exit(1);
+ }
+
+ if (!XTransparencyQueryVersion(dpy, &major, &minor)) {
+ fprintf(stderr, "Query transparency extension version failed\n");
+ exit(1);
+ }
+
+ fprintf(stdout, "Using X-Transparency extension version %d.%d\n",
+ major, minor);
+ fprintf(stdout, "Select a top level window\n");
+
+ window = Select_Window(dpy);
+
+ if (XGetOpacity(dpy, window, &orig_value) != 0) {
+ fprintf(stderr, "Failed to get window opacity\n");
+ exit(1);
+ }
+
+ /*
+ * Toggle the opacity value between full opacity and the new value
+ * If the window is already partly transparent reset it to opaque
+ */
+ if (orig_value != 255) {
+ new_value = 255;
+ }
+
+ XSetOpacity(dpy, window, new_value);
+
+ XSync(dpy, False);
+
+ fprintf(stdout, "Window id 0x%lx: opacity was %d now %d\n", window, orig_value,
+ new_value);
+
+ return 0;
+}
--
Info: To unsubscribe send a mail to [EMAIL PROTECTED] with
"unsubscribe directfb-dev" as subject.