diff options
-rw-r--r-- | src/Screen.cc | 125 |
1 files changed, 92 insertions, 33 deletions
diff --git a/src/Screen.cc b/src/Screen.cc index 5d20aff..951d5d8 100644 --- a/src/Screen.cc +++ b/src/Screen.cc | |||
@@ -53,36 +53,36 @@ | |||
53 | #include "Workspace.hh" | 53 | #include "Workspace.hh" |
54 | #include "Workspacemenu.hh" | 54 | #include "Workspacemenu.hh" |
55 | 55 | ||
56 | #ifdef STDC_HEADERS | 56 | #ifdef STDC_HEADERS |
57 | # include <sys/types.h> | 57 | # include <sys/types.h> |
58 | #endif // STDC_HEADERS | 58 | #endif // STDC_HEADERS |
59 | 59 | ||
60 | #ifdef HAVE_CTYPE_H | 60 | #ifdef HAVE_CTYPE_H |
61 | # include <ctype.h> | 61 | # include <ctype.h> |
62 | #endif // HAVE_CTYPE_H | 62 | #endif // HAVE_CTYPE_H |
63 | 63 | ||
64 | #ifdef HAVE_DIRENT_H | 64 | #ifdef HAVE_DIRENT_H |
65 | # include <dirent.h> | 65 | # include <dirent.h> |
66 | #endif // HAVE_DIRENT_H | 66 | #endif // HAVE_DIRENT_H |
67 | 67 | ||
68 | #ifdef HAVE_LOCALE_H | 68 | #ifdef HAVE_LOCALE_H |
69 | # include <locale.h> | 69 | # include <locale.h> |
70 | #endif // HAVE_LOCALE_H | 70 | #endif // HAVE_LOCALE_H |
71 | 71 | ||
72 | #ifdef HAVE_UNISTD_H | 72 | #ifdef HAVE_UNISTD_H |
73 | # include <sys/types.h> | 73 | # include <sys/types.h> |
74 | # include <unistd.h> | 74 | # include <unistd.h> |
75 | #endif // HAVE_UNISTD_H | 75 | #endif // HAVE_UNISTD_H |
76 | 76 | ||
77 | #ifdef HAVE_SYS_STAT_H | 77 | #ifdef HAVE_SYS_STAT_H |
78 | # include <sys/stat.h> | 78 | # include <sys/stat.h> |
79 | #endif // HAVE_SYS_STAT_H | 79 | #endif // HAVE_SYS_STAT_H |
80 | 80 | ||
81 | #ifdef HAVE_STDARG_H | 81 | #ifdef HAVE_STDARG_H |
82 | # include <stdarg.h> | 82 | # include <stdarg.h> |
83 | #endif // HAVE_STDARG_H | 83 | #endif // HAVE_STDARG_H |
84 | 84 | ||
85 | #ifndef MAXPATHLEN | 85 | #ifndef MAXPATHLEN |
86 | #define MAXPATHLEN 255 | 86 | #define MAXPATHLEN 255 |
87 | #endif // MAXPATHLEN | 87 | #endif // MAXPATHLEN |
88 | 88 | ||
@@ -230,7 +230,7 @@ resource(rm, screenname, altscreenname) | |||
230 | 230 | ||
231 | event_mask = ColormapChangeMask | EnterWindowMask | PropertyChangeMask | | 231 | event_mask = ColormapChangeMask | EnterWindowMask | PropertyChangeMask | |
232 | SubstructureRedirectMask | KeyPressMask | KeyReleaseMask | | 232 | SubstructureRedirectMask | KeyPressMask | KeyReleaseMask | |
233 | ButtonPressMask | ButtonReleaseMask; | 233 | ButtonPressMask | ButtonReleaseMask| SubstructureNotifyMask; |
234 | 234 | ||
235 | XErrorHandler old = XSetErrorHandler((XErrorHandler) anotherWMRunning); | 235 | XErrorHandler old = XSetErrorHandler((XErrorHandler) anotherWMRunning); |
236 | XSelectInput(getBaseDisplay()->getXDisplay(), getRootWindow(), event_mask); | 236 | XSelectInput(getBaseDisplay()->getXDisplay(), getRootWindow(), event_mask); |
@@ -294,6 +294,7 @@ resource(rm, screenname, altscreenname) | |||
294 | image_control, fluxbox->getStyleFilename(), getRootCommand().c_str()); | 294 | image_control, fluxbox->getStyleFilename(), getRootCommand().c_str()); |
295 | 295 | ||
296 | #ifdef GNOME | 296 | #ifdef GNOME |
297 | |||
297 | /* create the GNOME window */ | 298 | /* create the GNOME window */ |
298 | Window gnome_win = XCreateSimpleWindow(getBaseDisplay()->getXDisplay(), | 299 | Window gnome_win = XCreateSimpleWindow(getBaseDisplay()->getXDisplay(), |
299 | getRootWindow(), 0, 0, 5, 5, 0, 0, 0); | 300 | getRootWindow(), 0, 0, 5, 5, 0, 0, 0); |
@@ -307,14 +308,30 @@ resource(rm, screenname, altscreenname) | |||
307 | getBaseDisplay()->getGnomeSupportingWMCheckAtom(), | 308 | getBaseDisplay()->getGnomeSupportingWMCheckAtom(), |
308 | XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &gnome_win, 1); | 309 | XA_CARDINAL, 32, PropModeReplace, (unsigned char *) &gnome_win, 1); |
309 | 310 | ||
310 | Atom gnomeatomlist[1] = {getBaseDisplay()->getGnomeWorkspaceAtom()}; | 311 | Atom gnomeatomlist[] = { |
312 | getBaseDisplay()->getGnomeWorkspaceAtom(), | ||
313 | getBaseDisplay()->getGnomeWorkspaceCountAtom(), | ||
314 | getBaseDisplay()->getGnomeStateAtom() | ||
315 | }; | ||
316 | |||
317 | XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(), | ||
318 | getBaseDisplay()->getGnomeProtAtom(), XA_ATOM, 32, PropModeReplace, | ||
319 | (unsigned char *)gnomeatomlist, (sizeof gnomeatomlist)/sizeof gnomeatomlist[0]); | ||
311 | 320 | ||
312 | XChangeProperty(getBaseDisplay()->getXDisplay(), | ||
313 | getRootWindow(), getBaseDisplay()->getGnomeProtAtom(), | ||
314 | XA_ATOM, 32, PropModeReplace, | ||
315 | (unsigned char *)gnomeatomlist, 1); | ||
316 | #endif | 321 | #endif |
317 | 322 | ||
323 | #ifdef NEWWMSPEC | ||
324 | Atom netwmsupported[] = { | ||
325 | // getBaseDisplay()->getNETWMStateAtom(), | ||
326 | getBaseDisplay()->getNETNumberOfDesktopsAtom(), | ||
327 | getBaseDisplay()->getNETCurrentDesktopAtom(), | ||
328 | getBaseDisplay()->getNETSupportingWMCheckAtom(), | ||
329 | }; | ||
330 | |||
331 | XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(), | ||
332 | getBaseDisplay()->getNETSupportedAtom(), XA_ATOM, 32, PropModeReplace, | ||
333 | (unsigned char *)netwmsupported, (sizeof netwmsupported)/sizeof netwmsupported[0]); | ||
334 | #endif //!NEWWMSPEC | ||
318 | 335 | ||
319 | const char *s = i18n->getMessage( | 336 | const char *s = i18n->getMessage( |
320 | #ifdef NLS | 337 | #ifdef NLS |
@@ -350,8 +367,8 @@ resource(rm, screenname, altscreenname) | |||
350 | 367 | ||
351 | geom_window = | 368 | geom_window = |
352 | XCreateWindow(getBaseDisplay()->getXDisplay(), getRootWindow(), | 369 | XCreateWindow(getBaseDisplay()->getXDisplay(), getRootWindow(), |
353 | 0, 0, geom_w, geom_h, theme->getBorderWidth(), getDepth(), | 370 | 0, 0, geom_w, geom_h, theme->getBorderWidth(), getDepth(), |
354 | InputOutput, getVisual(), mask, &attrib); | 371 | InputOutput, getVisual(), mask, &attrib); |
355 | geom_visible = False; | 372 | geom_visible = False; |
356 | 373 | ||
357 | if (theme->getWindowStyle().l_focus.getTexture() & BImage::PARENTRELATIVE) { | 374 | if (theme->getWindowStyle().l_focus.getTexture() & BImage::PARENTRELATIVE) { |
@@ -362,7 +379,7 @@ resource(rm, screenname, altscreenname) | |||
362 | theme->getWindowStyle().t_focus.getColor()->getPixel()); | 379 | theme->getWindowStyle().t_focus.getColor()->getPixel()); |
363 | } else { | 380 | } else { |
364 | geom_pixmap = image_control->renderImage(geom_w, geom_h, | 381 | geom_pixmap = image_control->renderImage(geom_w, geom_h, |
365 | &theme->getWindowStyle().t_focus); | 382 | &theme->getWindowStyle().t_focus); |
366 | XSetWindowBackgroundPixmap(getBaseDisplay()->getXDisplay(), | 383 | XSetWindowBackgroundPixmap(getBaseDisplay()->getXDisplay(), |
367 | geom_window, geom_pixmap); | 384 | geom_window, geom_pixmap); |
368 | } | 385 | } |
@@ -374,7 +391,7 @@ resource(rm, screenname, altscreenname) | |||
374 | theme->getWindowStyle().l_focus.getColor()->getPixel()); | 391 | theme->getWindowStyle().l_focus.getColor()->getPixel()); |
375 | } else { | 392 | } else { |
376 | geom_pixmap = image_control->renderImage(geom_w, geom_h, | 393 | geom_pixmap = image_control->renderImage(geom_w, geom_h, |
377 | &theme->getWindowStyle().l_focus); | 394 | &theme->getWindowStyle().l_focus); |
378 | XSetWindowBackgroundPixmap(getBaseDisplay()->getXDisplay(), | 395 | XSetWindowBackgroundPixmap(getBaseDisplay()->getXDisplay(), |
379 | geom_window, geom_pixmap); | 396 | geom_window, geom_pixmap); |
380 | } | 397 | } |
@@ -398,13 +415,13 @@ resource(rm, screenname, altscreenname) | |||
398 | } | 415 | } |
399 | 416 | ||
400 | workspacemenu->insert(i18n-> | 417 | workspacemenu->insert(i18n-> |
401 | getMessage( | 418 | getMessage( |
402 | #ifdef NLS | 419 | #ifdef NLS |
403 | IconSet, IconIcons, | 420 | IconSet, IconIcons, |
404 | #else // !NLS | 421 | #else // !NLS |
405 | 0, 0, | 422 | 0, 0, |
406 | #endif // NLS | 423 | #endif // NLS |
407 | "Icons"), | 424 | "Icons"), |
408 | iconmenu); | 425 | iconmenu); |
409 | workspacemenu->update(); | 426 | workspacemenu->update(); |
410 | 427 | ||
@@ -413,9 +430,9 @@ resource(rm, screenname, altscreenname) | |||
413 | 430 | ||
414 | toolbar = new Toolbar(this); | 431 | toolbar = new Toolbar(this); |
415 | 432 | ||
416 | #ifdef SLIT | 433 | #ifdef SLIT |
417 | slit = new Slit(this); | 434 | slit = new Slit(this); |
418 | #endif // SLIT | 435 | #endif // SLIT |
419 | 436 | ||
420 | InitMenu(); | 437 | InitMenu(); |
421 | 438 | ||
@@ -423,7 +440,8 @@ resource(rm, screenname, altscreenname) | |||
423 | rootmenu->update(); | 440 | rootmenu->update(); |
424 | 441 | ||
425 | changeWorkspaceID(0); | 442 | changeWorkspaceID(0); |
426 | 443 | updateNetizenWorkspaceCount(); | |
444 | |||
427 | int i; | 445 | int i; |
428 | unsigned int nchild; | 446 | unsigned int nchild; |
429 | Window r, p, *children; | 447 | Window r, p, *children; |
@@ -432,21 +450,21 @@ resource(rm, screenname, altscreenname) | |||
432 | 450 | ||
433 | // preen the window list of all icon windows... for better dockapp support | 451 | // preen the window list of all icon windows... for better dockapp support |
434 | for (i = 0; i < (int) nchild; i++) { | 452 | for (i = 0; i < (int) nchild; i++) { |
453 | |||
435 | if (children[i] == None) continue; | 454 | if (children[i] == None) continue; |
436 | 455 | ||
437 | XWMHints *wmhints = XGetWMHints(getBaseDisplay()->getXDisplay(), | 456 | XWMHints *wmhints = XGetWMHints(getBaseDisplay()->getXDisplay(), |
438 | children[i]); | 457 | children[i]); |
439 | 458 | ||
440 | if (wmhints) { | 459 | if (wmhints) { |
441 | if ((wmhints->flags & IconWindowHint) && | 460 | if ((wmhints->flags & IconWindowHint) && |
442 | (wmhints->icon_window != children[i])) | 461 | (wmhints->icon_window != children[i])) |
443 | for (int j = 0; j < (int) nchild; j++) | 462 | for (int j = 0; j < (int) nchild; j++) { |
444 | if (children[j] == wmhints->icon_window) { | 463 | if (children[j] == wmhints->icon_window) { |
445 | children[j] = None; | 464 | children[j] = None; |
446 | |||
447 | break; | 465 | break; |
448 | } | 466 | } |
449 | 467 | } | |
450 | XFree(wmhints); | 468 | XFree(wmhints); |
451 | } | 469 | } |
452 | } | 470 | } |
@@ -840,9 +858,29 @@ void BScreen::removeNetizen(Window w) { | |||
840 | 858 | ||
841 | 859 | ||
842 | void BScreen::updateNetizenCurrentWorkspace(void) { | 860 | void BScreen::updateNetizenCurrentWorkspace(void) { |
861 | #ifdef NEWWMSPEC | ||
862 | //update _NET_WM_CURRENT_DESKTOP | ||
863 | int workspace = getCurrentWorkspaceID(); | ||
864 | XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(), | ||
865 | getBaseDisplay()->getNETCurrentDesktopAtom(), XA_CARDINAL, 32, PropModeReplace, | ||
866 | (unsigned char *)&workspace, 1); | ||
867 | #endif | ||
868 | #ifdef GNOME | ||
869 | //update _WIN_WORKSPACE | ||
870 | int gnome_workspace = getCurrentWorkspaceID(); | ||
871 | XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(), | ||
872 | getBaseDisplay()->getGnomeWorkspaceAtom(), XA_CARDINAL, 32, PropModeReplace, | ||
873 | (unsigned char *)&gnome_workspace, 1); | ||
874 | #endif | ||
875 | |||
843 | LinkedListIterator<Netizen> it(netizenList); | 876 | LinkedListIterator<Netizen> it(netizenList); |
844 | for (; it.current(); it++) | 877 | for (; it.current(); it++) |
845 | it.current()->sendCurrentWorkspace(); | 878 | it.current()->sendCurrentWorkspace(); |
879 | |||
880 | |||
881 | #ifdef DEBUG | ||
882 | cerr<<__FILE__<<"("<<__LINE__<<"): Update Current Workspace"<<endl; | ||
883 | #endif | ||
846 | } | 884 | } |
847 | 885 | ||
848 | 886 | ||
@@ -850,6 +888,27 @@ void BScreen::updateNetizenWorkspaceCount(void) { | |||
850 | LinkedListIterator<Netizen> it(netizenList); | 888 | LinkedListIterator<Netizen> it(netizenList); |
851 | for (; it.current(); it++) | 889 | for (; it.current(); it++) |
852 | it.current()->sendWorkspaceCount(); | 890 | it.current()->sendWorkspaceCount(); |
891 | |||
892 | #ifdef NEWWMSPEC | ||
893 | //update _NET_WM_NUMBER_OF_DESKTOPS | ||
894 | int numworkspaces = getCount()-1; | ||
895 | XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(), | ||
896 | getBaseDisplay()->getNETNumberOfDesktopsAtom(), XA_CARDINAL, 32, PropModeReplace, | ||
897 | (unsigned char *)&numworkspaces, 1); | ||
898 | #endif | ||
899 | |||
900 | #ifdef GNOME | ||
901 | { | ||
902 | int numworkspaces = getCount(); | ||
903 | XChangeProperty(getBaseDisplay()->getXDisplay(), getRootWindow(), | ||
904 | getBaseDisplay()->getGnomeWorkspaceCountAtom(), XA_CARDINAL, 32, PropModeReplace, | ||
905 | (unsigned char *)&numworkspaces, 1); | ||
906 | } | ||
907 | #endif | ||
908 | |||
909 | #ifdef DEBUG | ||
910 | cerr<<__FILE__<<"("<<__LINE__<<"): Update Workspace Count"<<endl; | ||
911 | #endif | ||
853 | } | 912 | } |
854 | 913 | ||
855 | 914 | ||