wmpager: EWMH support
This commit is contained in:
parent
e707010e98
commit
aca75d2e2d
1 changed files with 35 additions and 14 deletions
|
@ -30,8 +30,9 @@
|
||||||
#define BUILD_REV "$Revision: 1.4 $"
|
#define BUILD_REV "$Revision: 1.4 $"
|
||||||
#define BUILD_DATE "$Date: 2002/08/16 17:22:26 $"
|
#define BUILD_DATE "$Date: 2002/08/16 17:22:26 $"
|
||||||
|
|
||||||
#define XA_WIN_WORKSPACE "_WIN_WORKSPACE"
|
#define XA_NET_NUMBER_OF_DESKTOPS "_NET_NUMBER_OF_DESKTOPS"
|
||||||
#define XA_WIN_WORKSPACE_NAMES "_WIN_WORKSPACE_NAMES"
|
#define XA_NET_CURRENT_DESKTOP "_NET_CURRENT_DESKTOP"
|
||||||
|
#define XA_NET_DESKTOP_NAMES "_NET_DESKTOP_NAMES"
|
||||||
|
|
||||||
#define WMPAGER_ENV "WMPAGER"
|
#define WMPAGER_ENV "WMPAGER"
|
||||||
#define WMPAGER_DEFAULT_INSTALL_DIR "/usr/local/share/wmpager/"
|
#define WMPAGER_DEFAULT_INSTALL_DIR "/usr/local/share/wmpager/"
|
||||||
|
@ -718,7 +719,7 @@ void loop () {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PropertyNotify:
|
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);
|
setCurrentScreen(-1);
|
||||||
if (isVerbose()) {
|
if (isVerbose()) {
|
||||||
fprintf(stdout, "[%8ld] new current workspace (%d= %s)\n",
|
fprintf(stdout, "[%8ld] new current workspace (%d= %s)\n",
|
||||||
|
@ -896,10 +897,12 @@ long currentTimeMillis () {
|
||||||
* Screen Handling
|
* Screen Handling
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static Atom _xaWinWorkspace;
|
static Atom _xaNetNumberOfDesktops;
|
||||||
static Atom _xaWinWorkspaceNames;
|
static Atom _xaNetCurrentDesktop;
|
||||||
|
static Atom _xaNetDesktopNames;
|
||||||
static int _nScreens;
|
static int _nScreens;
|
||||||
static char** _szScreenNames;
|
static char** _szScreenNames;
|
||||||
|
static int _nDesktopNames;
|
||||||
static int _nLastScreen;
|
static int _nLastScreen;
|
||||||
|
|
||||||
int getScreenCount () {
|
int getScreenCount () {
|
||||||
|
@ -907,8 +910,8 @@ int getScreenCount () {
|
||||||
}
|
}
|
||||||
|
|
||||||
char* getScreenName (int nScreen) {
|
char* getScreenName (int nScreen) {
|
||||||
if (nScreen < 0 || nScreen >= _nScreens) {
|
if (nScreen < 0 || nScreen >= _nDesktopNames) {
|
||||||
return NULL;
|
return "<empty>";
|
||||||
}
|
}
|
||||||
return _szScreenNames[nScreen];
|
return _szScreenNames[nScreen];
|
||||||
}
|
}
|
||||||
|
@ -918,7 +921,7 @@ void gotoScreen (int nWorkspace) {
|
||||||
event.type= ClientMessage;
|
event.type= ClientMessage;
|
||||||
event.xclient.type= ClientMessage;
|
event.xclient.type= ClientMessage;
|
||||||
event.xclient.window= getRootWindow();
|
event.xclient.window= getRootWindow();
|
||||||
event.xclient.message_type= _xaWinWorkspace;
|
event.xclient.message_type= _xaNetCurrentDesktop;
|
||||||
event.xclient.format= 32;
|
event.xclient.format= 32;
|
||||||
event.xclient.data.l[0]= nWorkspace;
|
event.xclient.data.l[0]= nWorkspace;
|
||||||
event.xclient.data.l[1]= currentTimeMillis();
|
event.xclient.data.l[1]= currentTimeMillis();
|
||||||
|
@ -938,7 +941,7 @@ void setCurrentScreen (int nCurrentScreen) {
|
||||||
unsigned char* data;
|
unsigned char* data;
|
||||||
|
|
||||||
XGetWindowProperty(
|
XGetWindowProperty(
|
||||||
getDisplay(), getRootWindow(), _xaWinWorkspace,
|
getDisplay(), getRootWindow(), _xaNetCurrentDesktop,
|
||||||
0, 8192, False, XA_CARDINAL, &xaType, &nFormat, &nItems, &nBytesAfter, &data
|
0, 8192, False, XA_CARDINAL, &xaType, &nFormat, &nItems, &nBytesAfter, &data
|
||||||
);
|
);
|
||||||
if ((nFormat == 32) && (nItems == 1) && (nBytesAfter == 0)) {
|
if ((nFormat == 32) && (nItems == 1) && (nBytesAfter == 0)) {
|
||||||
|
@ -955,21 +958,39 @@ void setCurrentScreen (int nCurrentScreen) {
|
||||||
|
|
||||||
void initScreens () {
|
void initScreens () {
|
||||||
XTextProperty tp;
|
XTextProperty tp;
|
||||||
|
Atom xaType;
|
||||||
|
int nFormat;
|
||||||
|
unsigned long nItems, nBytesAfter;
|
||||||
|
unsigned char* data;
|
||||||
|
|
||||||
if (isVerbose()) {
|
if (isVerbose()) {
|
||||||
fprintf(stdout, "[%8ld] initializing window maker communication\n", currentTimeMillis());
|
fprintf(stdout, "[%8ld] initializing window maker communication\n", currentTimeMillis());
|
||||||
}
|
}
|
||||||
_xaWinWorkspace= XInternAtom(getDisplay(), XA_WIN_WORKSPACE, False);
|
_xaNetNumberOfDesktops= XInternAtom(getDisplay(), XA_NET_NUMBER_OF_DESKTOPS, False);
|
||||||
_xaWinWorkspaceNames= XInternAtom(getDisplay(), XA_WIN_WORKSPACE_NAMES, False);
|
_xaNetCurrentDesktop= XInternAtom(getDisplay(), XA_NET_CURRENT_DESKTOP, False);
|
||||||
XGetTextProperty(getDisplay(), getRootWindow(), &tp, _xaWinWorkspaceNames);
|
_xaNetDesktopNames= XInternAtom(getDisplay(), XA_NET_DESKTOP_NAMES, False);
|
||||||
XTextPropertyToStringList(&tp, &_szScreenNames, &_nScreens);
|
|
||||||
|
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;
|
_nLastScreen= -1;
|
||||||
setCurrentScreen(-1);
|
setCurrentScreen(-1);
|
||||||
if (_nLastScreen == -1) {
|
if (_nLastScreen == -1) {
|
||||||
fprintf(
|
fprintf(
|
||||||
stderr,
|
stderr,
|
||||||
"%s: couldn't determine current workspace.\n" \
|
"%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()
|
getApplicationName()
|
||||||
);
|
);
|
||||||
setCurrentScreen(0);
|
setCurrentScreen(0);
|
||||||
|
|
Loading…
Reference in a new issue