From: "Alexey I. Froloff" <[email protected]>
---
wmpager/src/wmpager.c | 49 +++++++++++++++++++++++++++++++++++--------------
1 file changed, 35 insertions(+), 14 deletions(-)
diff --git a/wmpager/src/wmpager.c b/wmpager/src/wmpager.c
index abb9b74..edf6c3d 100644
--- a/wmpager/src/wmpager.c
+++ b/wmpager/src/wmpager.c
@@ -30,8 +30,9 @@
#define BUILD_REV "$Revision: 1.4 $"
#define BUILD_DATE "$Date: 2002/08/16 17:22:26 $"
-#define XA_WIN_WORKSPACE "_WIN_WORKSPACE"
-#define XA_WIN_WORKSPACE_NAMES "_WIN_WORKSPACE_NAMES"
+#define XA_NET_NUMBER_OF_DESKTOPS "_NET_NUMBER_OF_DESKTOPS"
+#define XA_NET_CURRENT_DESKTOP "_NET_CURRENT_DESKTOP"
+#define XA_NET_DESKTOP_NAMES "_NET_DESKTOP_NAMES"
#define WMPAGER_ENV "WMPAGER"
#define WMPAGER_DEFAULT_INSTALL_DIR "/usr/local/share/wmpager/"
@@ -718,7 +719,7 @@ void loop () {
}
break;
case PropertyNotify:
- if (strcmp(XA_WIN_WORKSPACE,
XGetAtomName(getDisplay(), event.xproperty.atom)) == 0) {
+ if (strcmp(XA_NET_CURRENT_DESKTOP,
XGetAtomName(getDisplay(), event.xproperty.atom)) == 0) {
setCurrentScreen(-1);
if (isVerbose()) {
fprintf(stdout, "[%8ld]
new current workspace (%d= %s)\n",
@@ -896,10 +897,12 @@ long currentTimeMillis () {
* Screen Handling
*/
-static Atom _xaWinWorkspace;
-static Atom _xaWinWorkspaceNames;
+static Atom _xaNetNumberOfDesktops;
+static Atom _xaNetCurrentDesktop;
+static Atom _xaNetDesktopNames;
static int _nScreens;
static char** _szScreenNames;
+static int _nDesktopNames;
static int _nLastScreen;
int getScreenCount () {
@@ -907,8 +910,8 @@ int getScreenCount () {
}
char* getScreenName (int nScreen) {
- if (nScreen < 0 || nScreen >= _nScreens) {
- return NULL;
+ if (nScreen < 0 || nScreen >= _nDesktopNames) {
+ return "<empty>";
}
return _szScreenNames[nScreen];
}
@@ -918,7 +921,7 @@ void gotoScreen (int nWorkspace) {
event.type= ClientMessage;
event.xclient.type= ClientMessage;
event.xclient.window= getRootWindow();
- event.xclient.message_type= _xaWinWorkspace;
+ event.xclient.message_type= _xaNetCurrentDesktop;
event.xclient.format= 32;
event.xclient.data.l[0]= nWorkspace;
event.xclient.data.l[1]= currentTimeMillis();
@@ -938,7 +941,7 @@ void setCurrentScreen (int nCurrentScreen) {
unsigned char* data;
XGetWindowProperty(
- getDisplay(), getRootWindow(), _xaWinWorkspace,
+ getDisplay(), getRootWindow(), _xaNetCurrentDesktop,
0, 8192, False, XA_CARDINAL, &xaType, &nFormat,
&nItems, &nBytesAfter, &data
);
if ((nFormat == 32) && (nItems == 1) && (nBytesAfter == 0)) {
@@ -955,21 +958,39 @@ void setCurrentScreen (int nCurrentScreen) {
void initScreens () {
XTextProperty tp;
+ Atom xaType;
+ int nFormat;
+ unsigned long nItems, nBytesAfter;
+ unsigned char* data;
if (isVerbose()) {
fprintf(stdout, "[%8ld] initializing window maker
communication\n", currentTimeMillis());
}
- _xaWinWorkspace= XInternAtom(getDisplay(), XA_WIN_WORKSPACE, False);
- _xaWinWorkspaceNames= XInternAtom(getDisplay(), XA_WIN_WORKSPACE_NAMES,
False);
- XGetTextProperty(getDisplay(), getRootWindow(), &tp,
_xaWinWorkspaceNames);
- XTextPropertyToStringList(&tp, &_szScreenNames, &_nScreens);
+ _xaNetNumberOfDesktops= XInternAtom(getDisplay(),
XA_NET_NUMBER_OF_DESKTOPS, False);
+ _xaNetCurrentDesktop= XInternAtom(getDisplay(), XA_NET_CURRENT_DESKTOP,
False);
+ _xaNetDesktopNames= XInternAtom(getDisplay(), XA_NET_DESKTOP_NAMES,
False);
+
+ XGetWindowProperty(
+ getDisplay(), getRootWindow(), _xaNetNumberOfDesktops,
+ 0, 8192, False, XA_CARDINAL, &xaType, &nFormat, &nItems,
&nBytesAfter, &data
+ );
+ if ((nFormat == 32) && (nItems == 1) && (nBytesAfter == 0)) {
+ _nScreens= *(long*) data;
+ }
+ if (xaType != None) {
+ XFree(data);
+ }
+
+ XGetTextProperty(getDisplay(), getRootWindow(), &tp,
_xaNetDesktopNames);
+ Xutf8TextPropertyToTextList(getDisplay(), &tp, &_szScreenNames,
&_nDesktopNames);
+
_nLastScreen= -1;
setCurrentScreen(-1);
if (_nLastScreen == -1) {
fprintf(
stderr,
"%s: couldn't determine current workspace.\n" \
- "Make sure your WindowMaker has Gnome support
enabled!\n",
+ "Make sure your WindowMaker has EWMH support
enabled!\n",
getApplicationName()
);
setCurrentScreen(0);
--
1.7.11.4
--
To unsubscribe, send mail to [email protected].