summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthieu Herrb <matthieu@cvs.openbsd.org>2007-04-27 18:27:55 +0000
committerMatthieu Herrb <matthieu@cvs.openbsd.org>2007-04-27 18:27:55 +0000
commit76a444c734664fceb5927fd1fc89c3e259db0a8e (patch)
tree4f0c4e81330daaff084f16af51c8df345fb2d6e2
parent32b8d4410a951983937769b6a3cec845f9122dcb (diff)
wm2 is going to ports...
-rw-r--r--app/Makefile4
-rw-r--r--app/wm2/Border.C745
-rw-r--r--app/wm2/Border.h101
-rw-r--r--app/wm2/Buttons.C741
-rw-r--r--app/wm2/Client.C760
-rw-r--r--app/wm2/Client.h148
-rw-r--r--app/wm2/Config.h49
-rw-r--r--app/wm2/Cursors.h85
-rw-r--r--app/wm2/Events.C660
-rw-r--r--app/wm2/General.h61
-rw-r--r--app/wm2/Imakefile10
-rw-r--r--app/wm2/Main.C20
-rw-r--r--app/wm2/Makefile15
-rw-r--r--app/wm2/Manager.C565
-rw-r--r--app/wm2/Manager.h131
-rw-r--r--app/wm2/README174
-rw-r--r--app/wm2/Rotated.C623
-rw-r--r--app/wm2/Rotated.h101
-rw-r--r--app/wm2/listmacro2.h76
-rw-r--r--app/wm2/wm2.1136
20 files changed, 2 insertions, 5203 deletions
diff --git a/app/Makefile b/app/Makefile
index e1ede3162..693994dee 100644
--- a/app/Makefile
+++ b/app/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.7 2007/04/27 18:19:00 bernd Exp $
+# $OpenBSD: Makefile,v 1.8 2007/04/27 18:27:54 matthieu Exp $
.if ${MACHINE} != landisk
MKFONTSCALE= mkfontscale
@@ -23,7 +23,7 @@ SUBDIR= bdftopcf $(MKFONTSCALE) mkfontdir \
SUBDIR += glxgears glxinfo
# extras
-SUBDIR += cwm fvwm ssh-askpass wm2 xterm xidle xlockmore xsystrace xvctl
+SUBDIR += cwm fvwm ssh-askpass xterm xidle xlockmore xsystrace xvctl
.include <bsd.subdir.mk>
diff --git a/app/wm2/Border.C b/app/wm2/Border.C
deleted file mode 100644
index 7fd129478..000000000
--- a/app/wm2/Border.C
+++ /dev/null
@@ -1,745 +0,0 @@
-
-#include "Border.h"
-#include "Client.h"
-#include "Manager.h"
-#include "Rotated.h"
-
-// These are degenerate initialisations, don't change them
-int Border::m_tabWidth = -1;
-XRotFontStruct *Border::m_tabFont = 0;
-GC Border::m_drawGC = 0;
-
-unsigned long Border::m_foregroundPixel;
-unsigned long Border::m_backgroundPixel;
-unsigned long Border::m_frameBackgroundPixel;
-unsigned long Border::m_buttonBackgroundPixel;
-unsigned long Border::m_borderPixel;
-
-static int borderCounter = 0;
-
-
-declareList(RectangleList, XRectangle);
-implementList(RectangleList, XRectangle);
-
-class BorderRectangleList : public RectangleList
-{
-public:
- BorderRectangleList() { }
- ~BorderRectangleList() { }
-
- void appendRect(int x, int y, int w, int h);
-};
-
-void BorderRectangleList::appendRect(int x, int y, int w, int h)
-{
- XRectangle r;
- r.x = x; r.y = y; r.width = w; r.height = h;
- append(r);
-}
-
-
-Border::Border(Client *const c, Window child) :
- m_client(c), m_parent(0), m_tab(0),
- m_child(child), m_button(0), m_resize(0), m_label(0),
- m_tabHeight(-1), m_prevW(-1), m_prevH(-1)
-{
- m_parent = root();
-
- if (m_tabFont == 0) {
-
- if (!(m_tabFont = XRotLoadFont(display(), CONFIG_NICE_FONT, 90.0)) &&
- !(m_tabFont = XRotLoadFont(display(), CONFIG_NASTY_FONT, 90.0))) {
- windowManager()->fatal
- ("couldn't load default rotated font, bailing out");
- }
-
- m_tabWidth = m_tabFont->height + 4;
- if (m_tabWidth < TAB_TOP_HEIGHT * 2 + 8) {
- m_tabWidth = TAB_TOP_HEIGHT * 2 + 8;
- }
-
- m_foregroundPixel = windowManager()->allocateColour
- (CONFIG_TAB_FOREGROUND, "tab foreground");
- m_backgroundPixel = windowManager()->allocateColour
- (CONFIG_TAB_BACKGROUND, "tab background");
- m_frameBackgroundPixel = windowManager()->allocateColour
- (CONFIG_FRAME_BACKGROUND, "frame background");
- m_buttonBackgroundPixel = windowManager()->allocateColour
- (CONFIG_BUTTON_BACKGROUND, "button background");
- m_borderPixel = windowManager()->allocateColour
- (CONFIG_BORDERS, "border");
-
- XGCValues values;
- values.foreground = m_foregroundPixel;
- values.background = m_backgroundPixel;
- values.function = GXcopy;
- values.line_width = 0;
- values.subwindow_mode = IncludeInferiors;
-
- m_drawGC = XCreateGC(display(), root(),
- GCForeground | GCBackground | GCFunction |
- GCLineWidth | GCSubwindowMode,
- &values);
-
- if (!m_drawGC) {
- windowManager()->fatal("couldn't allocate border GC");
- }
- }
-
- ++borderCounter;
-}
-
-
-Border::~Border()
-{
- if (m_parent != root()) {
- if (!m_parent) fprintf(stderr,"wm2: zero parent in Border::~Border\n");
- else {
- XDestroyWindow(display(), m_tab);
- XDestroyWindow(display(), m_button);
- XDestroyWindow(display(), m_parent);
-
- // bad window if its parent has already gone:
- XDestroyWindow(display(), m_resize);
- }
- }
-
- if (m_label) free(m_label);
-
- if (--borderCounter == 0) {
- XFreeGC(display(), m_drawGC);
- }
-}
-
-
-void Border::fatal(char *s)
-{
- windowManager()->fatal(s);
-}
-
-
-Display *Border::display()
-{
- return m_client->display();
-}
-
-
-WindowManager *Border::windowManager()
-{
- return m_client->windowManager();
-}
-
-
-Window Border::root()
-{
- return m_client->root();
-}
-
-
-void Border::expose(XExposeEvent *e)
-{
- if (e->window != m_tab) return;
- drawLabel();
-}
-
-
-void Border::drawLabel()
-{
- if (m_label) {
- XClearWindow(display(), m_tab);
- XRotDrawString(display(), m_tabFont, m_tab, m_drawGC,
- 2 + m_tabFont->max_ascent, m_tabHeight - 1,
- m_label, strlen(m_label));
- }
-}
-
-
-Boolean Border::isTransient(void)
-{
- return m_client->isTransient();
-}
-
-
-Boolean Border::isFixedSize(void)
-{
- return m_client->isFixedSize();
-}
-
-
-void Border::fixTabHeight(int maxHeight)
-{
- m_tabHeight = 0x7fff;
- maxHeight -= m_tabWidth; // for diagonal
-
- if (m_label) free(m_label);
- m_label = NewString(m_client->label());
-
- if (m_label) {
- m_tabHeight =
- XRotTextWidth(m_tabFont, m_label, strlen(m_label)) + 6 + m_tabWidth;
- }
-
- if (m_tabHeight <= maxHeight) return;
-
- if (m_label) free(m_label);
- m_label = m_client->iconName() ?
- NewString(m_client->iconName()) : NewString("incognito");
-
- int len = strlen(m_label);
- m_tabHeight = XRotTextWidth(m_tabFont, m_label, len) + 6 + m_tabWidth;
- if (m_tabHeight <= maxHeight) return;
-
- char *newLabel = (char *)malloc(len + 4);
-
- do {
- strlcpy(newLabel, m_label, len + 4);
- strlcat(newLabel, "...", len + 4);
- m_tabHeight = XRotTextWidth(m_tabFont, newLabel,
- strlen(newLabel)) + 6 + m_tabWidth;
- --len;
-
- } while (m_tabHeight > maxHeight && len > 2);
-
- free(m_label);
- m_label = newLabel;
-
- if (m_tabHeight > maxHeight) m_tabHeight = maxHeight;
-}
-
-
-void Border::shapeTransientParent(int w, int h)
-{
- XRectangle r;
-
- r.x = xIndent() - 1; r.y = yIndent() - 1;
- r.width = w + 2; r.height = h + 2;
-
- XShapeCombineRectangles
- (display(), m_parent, ShapeBounding, 0, 0, &r, 1, ShapeSet, YXBanded);
-
- r.x = xIndent(); r.y = yIndent();
- r.width = w; r.height = h;
-
- XShapeCombineRectangles
- (display(), m_parent, ShapeClip, 0, 0, &r, 1, ShapeSet, YXBanded);
-}
-
-
-void Border::setTransientFrameVisibility(Boolean visible, int w, int h)
-{
- int i;
- BorderRectangleList rl;
-
- rl.appendRect(0, 0, w + 1, yIndent() - 1);
- for (i = 1; i < yIndent(); ++i) {
- rl.appendRect(w + 1, i - 1, i + 1, 1);
- }
- rl.appendRect(0, yIndent() - 1, xIndent() - 1, h - yIndent() + 2);
- for (i = 1; i < yIndent(); ++i) {
- rl.appendRect(i - 1, h, 1, i + 2);
- }
-
- XShapeCombineRectangles
- (display(), m_parent, ShapeBounding,
- 0, 0, rl.array(0, rl.count()), rl.count(),
- visible ? ShapeUnion : ShapeSubtract, YXSorted);
-
- rl.remove_all();
-
- rl.appendRect(1, 1, w, yIndent() - 2);
- for (i = 2; i < yIndent(); ++i) {
- rl.appendRect(w + 1, i - 1, i, 1);
- }
- rl.appendRect(1, yIndent() - 1, xIndent() - 2, h - yIndent() + 1);
- for (i = 2; i < yIndent(); ++i) {
- rl.appendRect(i - 1, h, 1, i + 1);
- }
-
- XShapeCombineRectangles
- (display(), m_parent, ShapeClip,
- 0, 0, rl.array(0, rl.count()), rl.count(),
- visible ? ShapeUnion : ShapeSubtract, YXSorted);
-}
-
-
-void Border::shapeParent(int w, int h)
-{
- int i;
- int mainRect;
- BorderRectangleList rl;
-
- if (isTransient()) {
- shapeTransientParent(w, h);
- return;
- }
-
- // Bounding rectangles -- clipping will be the same except for
- // child window border
-
- // top of tab
- rl.appendRect(0, 0, w + m_tabWidth + 1, TAB_TOP_HEIGHT + 2);
-
- // struts in tab, left...
- rl.appendRect(0, TAB_TOP_HEIGHT + 1,
- TAB_TOP_HEIGHT + 2, m_tabWidth - TAB_TOP_HEIGHT*2 - 1);
-
- // ...and right
- rl.appendRect(m_tabWidth - TAB_TOP_HEIGHT, TAB_TOP_HEIGHT + 1,
- TAB_TOP_HEIGHT + 2, m_tabWidth - TAB_TOP_HEIGHT*2 - 1);
-
- mainRect = rl.count();
- rl.appendRect(xIndent() - 1, yIndent() - 1, w + 2, h + 2);
-
- // main tab
- rl.appendRect(0, m_tabWidth - TAB_TOP_HEIGHT, m_tabWidth + 2,
- m_tabHeight - m_tabWidth + TAB_TOP_HEIGHT);
-
- // diagonal
- for (i = 1; i < m_tabWidth - 1; ++i) {
- rl.appendRect(i, m_tabHeight + i - 1, m_tabWidth - i + 2, 1);
- }
-
- XShapeCombineRectangles
- (display(), m_parent, ShapeBounding,
- 0, 0, rl.array(0, rl.count()), rl.count(), ShapeSet, YXSorted);
-
- rl.item(mainRect).x ++;
- rl.item(mainRect).y ++;
- rl.item(mainRect).width -= 2;
- rl.item(mainRect).height -= 2;
-
- XShapeCombineRectangles
- (display(), m_parent, ShapeClip,
- 0, 0, rl.array(0, rl.count()), rl.count(), ShapeSet, YXSorted);
-}
-
-
-void Border::shapeTab(int w, int)
-{
- int i;
- BorderRectangleList rl;
-
- if (isTransient()) {
- return;
- }
-
- // Bounding rectangles
-
- rl.appendRect(0, 0, w + m_tabWidth + 1, TAB_TOP_HEIGHT + 2);
- rl.appendRect(0, TAB_TOP_HEIGHT + 1, TAB_TOP_HEIGHT + 2,
- m_tabWidth - TAB_TOP_HEIGHT*2 - 1);
-
- rl.appendRect(m_tabWidth - TAB_TOP_HEIGHT, TAB_TOP_HEIGHT + 1,
- TAB_TOP_HEIGHT + 2, m_tabWidth - TAB_TOP_HEIGHT*2 - 1);
-
- rl.appendRect(0, m_tabWidth - TAB_TOP_HEIGHT, m_tabWidth + 2,
- m_tabHeight - m_tabWidth + TAB_TOP_HEIGHT);
-
- for (i = 1; i < m_tabWidth - 1; ++i) {
- rl.appendRect(i, m_tabHeight + i - 1, m_tabWidth - i + 2, 1);
- }
-
- XShapeCombineRectangles
- (display(), m_tab, ShapeBounding,
- 0, 0, rl.array(0, rl.count()), rl.count(), ShapeSet, YXSorted);
-
- rl.remove_all();
-
- // Clipping rectangles
-
- rl.appendRect(1, 1, w + m_tabWidth - 1, TAB_TOP_HEIGHT);
-
- rl.appendRect(1, TAB_TOP_HEIGHT + 1, TAB_TOP_HEIGHT,
- m_tabWidth + TAB_TOP_HEIGHT*2 - 1);
-
- rl.appendRect(m_tabWidth - TAB_TOP_HEIGHT + 1, TAB_TOP_HEIGHT + 1,
- TAB_TOP_HEIGHT, m_tabWidth + TAB_TOP_HEIGHT*2 - 1);
-
- rl.appendRect(1, m_tabWidth - TAB_TOP_HEIGHT + 1, m_tabWidth,
- m_tabHeight - m_tabWidth + TAB_TOP_HEIGHT - 1);
-
- for (i = 1; i < m_tabWidth - 2; ++i) {
- rl.appendRect(i + 1, m_tabHeight + i - 1, m_tabWidth - i, 1);
- }
-
- XShapeCombineRectangles
- (display(), m_tab, ShapeClip,
- 0, 0, rl.array(0, rl.count()), rl.count(), ShapeSet, YXSorted);
-}
-
-
-void Border::resizeTab(int h)
-{
- int i;
- XRectangle r;
- BorderRectangleList rl;
- int shorter, longer, operation;
-
- if (isTransient()) {
- return;
- }
-
- int prevTabHeight = m_tabHeight;
- fixTabHeight(h);
- if (m_tabHeight == prevTabHeight) return;
-
- XWindowChanges wc;
- wc.height = m_tabHeight + 2 + m_tabWidth;
- XConfigureWindow(display(), m_tab, CWHeight, &wc);
-
- if (m_tabHeight > prevTabHeight) {
-
- shorter = prevTabHeight;
- longer = m_tabHeight;
- operation = ShapeUnion;
-
- } else {
-
- shorter = m_tabHeight;
- longer = prevTabHeight + m_tabWidth;
- operation = ShapeSubtract;
- }
-
- r.x = 0; r.y = shorter /*- 2*/;
- r.width = m_tabWidth + 2; r.height = longer - shorter;
-
- XShapeCombineRectangles(display(), m_parent, ShapeBounding,
- 0, 0, &r, 1, operation, YXBanded);
-
- XShapeCombineRectangles(display(), m_parent, ShapeClip,
- 0, 0, &r, 1, operation, YXBanded);
-
- XShapeCombineRectangles(display(), m_tab, ShapeBounding,
- 0, 0, &r, 1, operation, YXBanded);
-
- r.x ++; r.width -= 2;
-
- XShapeCombineRectangles(display(), m_tab, ShapeClip,
- 0, 0, &r, 1, operation, YXBanded);
-
- if (m_client->isActive()) {
- // restore a bit of the frame edge
- r.x = m_tabWidth + 1; r.y = shorter;
- r.width = FRAME_WIDTH - 1; r.height = longer - shorter;
- XShapeCombineRectangles(display(), m_parent, ShapeBounding,
- 0, 0, &r, 1, ShapeUnion, YXBanded);
- }
-
- for (i = 1; i < m_tabWidth - 1; ++i) {
- rl.appendRect(i, m_tabHeight + i - 1, m_tabWidth - i + 2, 1);
- }
-
- XShapeCombineRectangles
- (display(), m_parent, ShapeBounding,
- 0, 0, rl.array(0, rl.count()), rl.count(), ShapeUnion, YXBanded);
-
- XShapeCombineRectangles
- (display(), m_parent, ShapeClip,
- 0, 0, rl.array(0, rl.count()), rl.count(), ShapeUnion, YXBanded);
-
- XShapeCombineRectangles
- (display(), m_tab, ShapeBounding,
- 0, 0, rl.array(0, rl.count()), rl.count(), ShapeUnion, YXBanded);
-
- if (rl.count() < 2) return;
-
- for (i = 0; i < rl.count() - 1; ++i) {
- rl.item(i).x ++; rl.item(i).width -= 2;
- }
-
- XShapeCombineRectangles
- (display(), m_tab, ShapeClip,
- 0, 0, rl.array(0, rl.count() - 1), rl.count() - 1,
- ShapeUnion, YXBanded);
-}
-
-
-void Border::shapeResize()
-{
- int i;
- BorderRectangleList rl;
-
- for (i = 0; i < FRAME_WIDTH*2; ++i) {
- rl.appendRect(FRAME_WIDTH*2 - i - 1, i, i + 1, 1);
- }
-
- XShapeCombineRectangles
- (display(), m_resize, ShapeBounding, 0, 0,
- rl.array(0, rl.count()), rl.count(), ShapeSet, YXBanded);
-
- rl.remove_all();
-
- for (i = 1; i < FRAME_WIDTH*2; ++i) {
- rl.appendRect(FRAME_WIDTH*2 - i, i, i, 1);
- }
-
- XShapeCombineRectangles
- (display(), m_resize, ShapeClip, 0, 0,
- rl.array(0, rl.count()), rl.count(), ShapeSet, YXBanded);
-
- rl.remove_all();
-
- for (i = 0; i < FRAME_WIDTH*2 - 3; ++i) {
- rl.appendRect(FRAME_WIDTH*2 - i - 1, i + 3, 1, 1);
- }
-
- XShapeCombineRectangles
- (display(), m_resize, ShapeClip, 0, 0,
- rl.array(0, rl.count()), rl.count(), ShapeSubtract, YXBanded);
-
- windowManager()->installCursorOnWindow
- (WindowManager::DownrightCursor, m_resize);
-}
-
-
-void Border::setFrameVisibility(Boolean visible, int w, int h)
-{
- BorderRectangleList rl;
-
- if (CONFIG_PROD_SHAPE) {
- shapeParent(w, h);
- shapeTab(w, h);
- }
-
- if (isTransient()) {
- setTransientFrameVisibility(visible, w, h);
- return;
- }
-
- // Bounding rectangles
-
- rl.appendRect(m_tabWidth + w + 1, 0, FRAME_WIDTH + 1, FRAME_WIDTH);
-
- rl.appendRect(m_tabWidth + 2, TAB_TOP_HEIGHT + 2, w,
- FRAME_WIDTH - TAB_TOP_HEIGHT - 2);
-
- // for button
- int ww = m_tabWidth - TAB_TOP_HEIGHT*2 - 4;
- rl.appendRect((m_tabWidth + 2 - ww) / 2, (m_tabWidth+2 - ww) / 2, ww, ww);
-
- rl.appendRect(m_tabWidth + 2, FRAME_WIDTH,
- FRAME_WIDTH - 2, m_tabHeight + m_tabWidth - FRAME_WIDTH - 2);
-
- // swap last two if sorted wrong
- if (rl.item(rl.count()-2).y > rl.item(rl.count()-1).y) {
- rl.append(rl.item(rl.count()-2));
- rl.remove(rl.count()-3);
- }
-
- int final = rl.count();
- rl.append(rl.item(final-1));
- rl.item(final).x -= 1;
- rl.item(final).y += rl.item(final).height;
- rl.item(final).width += 1;
- rl.item(final).height = h - rl.item(final).height + 2;
-
- XShapeCombineRectangles(display(), m_parent, ShapeBounding,
- 0, 0, rl.array(0, rl.count()), rl.count(),
- visible ? ShapeUnion : ShapeSubtract, YXSorted);
- rl.remove_all();
-
- // Clip rectangles
-
- rl.appendRect(m_tabWidth + w + 1, 1, FRAME_WIDTH, FRAME_WIDTH - 1);
-
- rl.appendRect(m_tabWidth + 2, TAB_TOP_HEIGHT + 2, w,
- FRAME_WIDTH - TAB_TOP_HEIGHT - 2);
-
- // for button
- ww = m_tabWidth - TAB_TOP_HEIGHT*2 - 6;
- rl.appendRect((m_tabWidth + 2 - ww) / 2, (m_tabWidth+2 - ww) / 2, ww, ww);
-
- rl.appendRect(m_tabWidth + 2, FRAME_WIDTH,
- FRAME_WIDTH - 2, h - FRAME_WIDTH);
-
- // swap last two if sorted wrong
- if (rl.item(rl.count()-2).y > rl.item(rl.count()-1).y) {
- rl.append(rl.item(rl.count()-2));
- rl.remove(rl.count()-3);
- }
-
- rl.appendRect(m_tabWidth + 2, h, FRAME_WIDTH - 2, FRAME_WIDTH + 1);
-
- XShapeCombineRectangles(display(), m_parent, ShapeClip,
- 0, 0, rl.array(0, rl.count()), rl.count(),
- visible ? ShapeUnion : ShapeSubtract, YXSorted);
- rl.remove_all();
-
- if (visible && !isFixedSize()) {
- XMapRaised(display(), m_resize);
- } else {
- XUnmapWindow(display(), m_resize);
- }
-}
-
-
-void Border::configure(int x, int y, int w, int h,
- unsigned long mask, int detail,
- Boolean force) // must reshape everything
-{
- if (!m_parent || m_parent == root()) {
-
- // create windows, then shape them afterwards
-
- m_parent = XCreateSimpleWindow
- (display(), root(), 1, 1, 1, 1, 0,
- m_borderPixel, m_frameBackgroundPixel);
-
- m_tab = XCreateSimpleWindow
- (display(), m_parent, 1, 1, 1, 1, 0,
- m_borderPixel, m_backgroundPixel);
-
- m_button = XCreateSimpleWindow
- (display(), m_parent, 1, 1, 1, 1, 0,
- m_borderPixel, m_buttonBackgroundPixel);
-
- m_resize = XCreateWindow
- (display(), m_child, 1, 1, FRAME_WIDTH*2, FRAME_WIDTH*2, 0,
- CopyFromParent, InputOutput, CopyFromParent, 0L, 0);
-
- shapeResize();
-
- XSelectInput(display(), m_parent,
- SubstructureRedirectMask | SubstructureNotifyMask |
- ButtonPressMask | ButtonReleaseMask);
-
- if (!isTransient()) {
- XSelectInput(display(), m_tab,
- ExposureMask | ButtonPressMask | ButtonReleaseMask |
- EnterWindowMask/* | LeaveWindowMask*/);
- }
-
- XSelectInput(display(), m_button,
- ButtonPressMask | ButtonReleaseMask/* | LeaveWindowMask*/);
- XSelectInput(display(), m_resize, ButtonPressMask | ButtonReleaseMask);
- mask |= CWX | CWY | CWWidth | CWHeight | CWBorderWidth;
- }
-
- XWindowChanges wc;
- wc.x = x - xIndent();
- wc.y = y - yIndent();
- wc.width = w + xIndent() + 1;
- wc.height = h + yIndent() + 1;
- wc.border_width = 0;
- wc.sibling = None;
- wc.stack_mode = detail;
- XConfigureWindow(display(), m_parent, mask, &wc);
-
- unsigned long rmask = 0L;
- if (mask & CWWidth) rmask |= CWX;
- if (mask & CWHeight) rmask |= CWY;
- wc.x = w - FRAME_WIDTH*2;
- wc.y = h - FRAME_WIDTH*2;
- XConfigureWindow(display(), m_resize, rmask, &wc);
-
- if (force ||
- (m_prevW < 0 || m_prevH < 0) ||
- ((mask & (CWWidth | CWHeight)) && (w != m_prevW || h != m_prevH))) {
-
- int prevTabHeight = m_tabHeight;
- if (isTransient()) m_tabHeight = 10; // arbitrary
- else fixTabHeight(h);
-
- shapeParent(w, h);
- setFrameVisibility(m_client->isActive(), w, h);
-
- if (force ||
- prevTabHeight != m_tabHeight || m_prevW < 0 || m_prevH < 0) {
-
- wc.x = 0;
- wc.y = 0;
- wc.width = w + xIndent();
- wc.height = m_tabHeight + 2 + m_tabWidth;
- XConfigureWindow(display(), m_tab, mask, &wc);
- shapeTab(w, h);
- }
-
- m_prevW = w;
- m_prevH = h;
-
- } else {
-
- resizeTab(h);
- }
-
- wc.x = TAB_TOP_HEIGHT + 2;
- wc.y = wc.x;
- wc.width = wc.height = m_tabWidth - TAB_TOP_HEIGHT*2 - 4;
- XConfigureWindow(display(), m_button, mask, &wc);
-}
-
-
-void Border::moveTo(int x, int y)
-{
- XWindowChanges wc;
- wc.x = x - xIndent();
- wc.y = y - yIndent();
- XConfigureWindow(display(), m_parent, CWX | CWY, &wc);
-}
-
-
-void Border::map()
-{
- if (m_parent == root()) {
- fprintf(stderr, "wm2: bad parent in Border::map()\n");
- } else {
- XMapWindow(display(), m_parent);
-
- if (!isTransient()) {
- XMapWindow(display(), m_tab);
- XMapWindow(display(), m_button);
- if (!isFixedSize()) XMapWindow(display(), m_resize);
- }
- }
-}
-
-
-void Border::mapRaised()
-{
- if (m_parent == root()) {
- fprintf(stderr, "wm2: bad parent in Border::mapRaised()\n");
- } else {
- XMapRaised(display(), m_parent);
-
- if (!isTransient()) {
- XMapWindow(display(), m_tab);
- XMapRaised(display(), m_button);
- if (!isFixedSize()) XMapRaised(display(), m_resize);
- }
- }
-}
-
-
-void Border::lower()
-{
- XLowerWindow(display(), m_parent);
-}
-
-
-void Border::unmap()
-{
- if (m_parent == root()) {
- fprintf(stderr, "wm2: bad parent in Border::unmap()\n");
- } else {
- XUnmapWindow(display(), m_parent);
-
- if (!isTransient()) {
- XUnmapWindow(display(), m_tab);
- XUnmapWindow(display(), m_button);
-// XUnmapWindow(display(), m_resize); // no, will unmap with parent
- }
- }
-}
-
-
-void Border::decorate(Boolean active, int w, int h)
-{
- setFrameVisibility(active, w, h);
-}
-
-
-void Border::reparent()
-{
- XReparentWindow(display(), m_child, m_parent, xIndent(), yIndent());
-}
-
diff --git a/app/wm2/Border.h b/app/wm2/Border.h
deleted file mode 100644
index 79676fdcf..000000000
--- a/app/wm2/Border.h
+++ /dev/null
@@ -1,101 +0,0 @@
-
-#ifndef _BORDER_H_
-#define _BORDER_H_
-
-#include "General.h"
-#include "Rotated.h"
-
-class Client;
-class WindowManager;
-
-// These distances exclude the 1-pixel borders. You could probably
-// change these a certain amount before breaking the shoddy code in
-// the rest of this file.
-
-#define TAB_TOP_HEIGHT 2
-#define FRAME_WIDTH CONFIG_FRAME_THICKNESS
-#define TRANSIENT_FRAME_WIDTH 4
-// NB frameTopHeight = frameHeight-tabTopHeight
-
-class Border { // friend of client
-public:
- Border(Client *const, Window child);
- ~Border();
-
- void map();
- void unmap();
- void lower();
- void mapRaised();
- void decorate(Boolean active, int w, int h);
- void reparent();
- void configure(int x, int y, int w, int h, unsigned long mask, int detail,
- Boolean force = False);
- void moveTo(int x, int y);
-
- WindowManager *windowManager(); // calls into Client
- Boolean isTransient(); // calls into Client
- Boolean isFixedSize(); // calls into Client
- Window parent() { return m_parent; }
- Boolean hasWindow(Window w) {
- return (w != root() && (w == m_parent || w == m_tab ||
- w == m_button || w == m_resize));
- }
-
- Display *display();
- Window root();
-
- void expose(XExposeEvent *);
- void eventButton(XButtonEvent *); // in Buttons.C
-
- int yIndent() {
- return isTransient() ? TRANSIENT_FRAME_WIDTH + 1 : FRAME_WIDTH + 1;
- }
- int xIndent() {
- return isTransient() ? TRANSIENT_FRAME_WIDTH + 1 :
- m_tabWidth + FRAME_WIDTH + 1;
- }
-
- Boolean coordsInHole(int, int); // in Events.C of all places
-
-private:
- Client *m_client;
-
- Window m_parent;
- Window m_tab;
- Window m_child;
- Window m_button;
- Window m_resize;
-
- void fatal(char *);
-
- char *m_label;
-
- void fixTabHeight(int);
- void drawLabel();
-
- void setFrameVisibility(Boolean, int, int);
- void setTransientFrameVisibility(Boolean, int, int);
- void shapeParent(int, int);
- void shapeTransientParent(int, int);
- void shapeTab(int, int);
- void resizeTab(int); // for rename without changing window size
- void shapeResize();
-
- int m_prevW;
- int m_prevH;
-
-private:
- int m_tabHeight; // depends on the label
- static int m_tabWidth; // depends on the label font
- static XRotFontStruct *m_tabFont;
- static GC m_drawGC;
- static unsigned long m_foregroundPixel;
- static unsigned long m_backgroundPixel;
- static unsigned long m_frameBackgroundPixel;
- static unsigned long m_buttonBackgroundPixel;
- static unsigned long m_borderPixel;
-};
-
-
-#endif
-
diff --git a/app/wm2/Buttons.C b/app/wm2/Buttons.C
deleted file mode 100644
index 087165292..000000000
--- a/app/wm2/Buttons.C
+++ /dev/null
@@ -1,741 +0,0 @@
-
-#include "Manager.h"
-#include "Client.h"
-#include <sys/time.h>
-
-#define AllButtonMask ( Button1Mask | Button2Mask | Button3Mask \
- | Button4Mask | Button5Mask )
-#define ButtonMask ( ButtonPressMask | ButtonReleaseMask )
-#define DragMask ( ButtonMask | ButtonMotionMask )
-#define MenuMask ( ButtonMask | ButtonMotionMask | ExposureMask )
-#define MenuGrabMask ( ButtonMask | ButtonMotionMask | StructureNotifyMask )
-
-
-void WindowManager::eventButton(XButtonEvent *e)
-{
- if (e->button == Button3) {
- circulate(e->window == e->root);
- return;
- }
-
- Client *c = windowToClient(e->window);
-
- if (e->window == e->root) {
-
- if (e->button == Button1) menu(e);
-
- } else if (c) {
-
- c->eventButton(e);
- return;
- }
-}
-
-
-void WindowManager::circulate(Boolean activeFirst)
-{
- Client *c = 0;
- if (activeFirst) c = m_activeClient;
-
- if (!c) {
-
- int i, j;
-
- if (!m_activeClient) i = -1;
- else {
- for (i = 0; i < m_clients.count(); ++i) {
- if (m_clients.item(i) == m_activeClient) break;
- }
-
- if (i >= m_clients.count()-1) i = -1;
- }
-
- for (j = i + 1;
- (!m_clients.item(j)->isNormal() ||
- m_clients.item(j)->isTransient()); ++j) {
- if (j >= m_clients.count() - 1) j = -1;
- if (j == i) return; // no suitable clients
- }
-
- c = m_clients.item(j);
- }
-
- c->activateAndWarp();
-}
-
-
-void Client::activateAndWarp()
-{
- mapRaised();
- ensureVisible();
- XWarpPointer(display(), None, parent(), 0, 0, 0, 0,
- m_border->xIndent() / 2, m_border->xIndent() + 8);
- activate();
-}
-
-
-void Client::eventButton(XButtonEvent *e)
-{
- if (e->type != ButtonPress) return;
-
- mapRaised();
-
- if (e->button == Button1) {
- if (m_border->hasWindow(e->window)) {
-
- m_border->eventButton(e);
- }
- }
-
- if (!isNormal() || isActive() || e->send_event) return;
- activate();
-}
-
-
-static int nobuttons(XButtonEvent *e) // straight outta 9wm
-{
- int state;
- state = (e->state & AllButtonMask);
- return (e->type == ButtonRelease) && (state & (state - 1)) == 0;
-}
-
-
-int WindowManager::attemptGrab(Window w, Window constrain, int mask, int t)
-{
- int status;
- if (t == 0) t = timestamp(False);
- status = XGrabPointer(display(), w, False, mask, GrabModeAsync,
- GrabModeAsync, constrain, None, t);
- return status;
-}
-
-
-void WindowManager::releaseGrab(XButtonEvent *e)
-{
- XEvent ev;
- if (!nobuttons(e)) {
- for (;;) {
- XMaskEvent(display(), ButtonMask | ButtonMotionMask, &ev);
- if (ev.type == MotionNotify) continue;
- e = &ev.xbutton;
- if (nobuttons(e)) break;
- }
- }
-
- XUngrabPointer(display(), e->time);
- m_currentTime = e->time;
-}
-
-
-void WindowManager::menu(XButtonEvent *e)
-{
- if (e->window == m_menuWindow) return;
-
- int i;
- ClientList clients;
- Boolean allowExit = False;
-
-#define MENU_LABEL(n) ((n)==0 ? m_menuCreateLabel : \
- (allowExit && ((n) > clients.count())) ? "[Exit wm2]" \
- : clients.item((n)-1)->label())
-
- for (i = 0; i < m_hiddenClients.count(); ++i) {
- clients.append(m_hiddenClients.item(i));
- }
- int nh = clients.count() + 1;
-
- if (CONFIG_EVERYTHING_ON_ROOT_MENU) {
- for (i = 0; i < m_clients.count(); ++i) {
- if (m_clients.item(i)->isNormal()) {
- clients.append(m_clients.item(i));
- }
- }
- }
- int n = clients.count() + 1;
-
- int mx = DisplayWidth (display(), m_screenNumber) - 1;
- int my = DisplayHeight(display(), m_screenNumber) - 1;
-
- allowExit = ((e->x > mx-3) && (e->y > my-3));
- if (allowExit) n += 1;
-
- int width, maxWidth = 10;
- for (i = 0; i < n; ++i) {
- width = XTextWidth(m_menuFont, MENU_LABEL(i), strlen(MENU_LABEL(i)));
- if (width > maxWidth) maxWidth = width;
- }
- maxWidth += 32;
-
- int selecting = -1, prev = -1;
- int entryHeight = m_menuFont->ascent + m_menuFont->descent + 4;
- int totalHeight = entryHeight * n + 13;
- int x = e->x - maxWidth/2;
- int y = e->y - 2;
- Boolean warp = False;
-
- if (x < 0) {
- e->x -= x; x = 0; warp = True;
- } else if (x + maxWidth >= mx) {
- e->x -= x + maxWidth - mx; x = mx - maxWidth; warp = True;
- }
-
- if (y < 0) {
- e->y -= y; y = 0; warp = True;
- } else if (y + totalHeight >= my) {
- e->y -= y + totalHeight - my; y = my - totalHeight; warp = True;
- }
-
- if (warp) XWarpPointer(display(), None, root(),
- None, None, None, None, e->x, e->y);
-
- XMoveResizeWindow(display(), m_menuWindow, x, y, maxWidth, totalHeight);
- XSelectInput(display(), m_menuWindow, MenuMask);
- XMapRaised(display(), m_menuWindow);
-
- if (attemptGrab(m_menuWindow, None, MenuGrabMask, e->time) != GrabSuccess){
- XUnmapWindow(display(), m_menuWindow);
- return;
- }
-
- Boolean done = False;
- Boolean drawn = False;
- XEvent event;
-
- while (!done) {
- XMaskEvent(display(), MenuMask, &event);
-
- switch (event.type) {
-
- default:
- fprintf(stderr, "wm2: unknown event type %d\n", event.type);
- break;
-
- case ButtonPress:
- break;
-
- case ButtonRelease:
- if (drawn) {
-
- if (event.xbutton.button != e->button) break;
- x = event.xbutton.x;
- y = event.xbutton.y - 11;
- i = y / entryHeight;
-
- if (selecting >= 0 && y >= selecting * entryHeight - 3 &&
- y <= (selecting+1) * entryHeight - 3) i = selecting;
-
- if (x < 0 || x > maxWidth || y < -3) i = -1;
- else if (i < 0 || i >= n) i = -1;
-
- } else {
- selecting = -1;
- }
-
- if (!nobuttons(&event.xbutton)) i = -1;
- releaseGrab(&event.xbutton);
- XUnmapWindow(display(), m_menuWindow);
- selecting = i;
- done = True;
- break;
-
- case MotionNotify:
- if (!drawn) break;
- x = event.xbutton.x;
- y = event.xbutton.y - 11;
- prev = selecting;
- selecting = y / entryHeight;
-
- if (prev >= 0 && y >= prev * entryHeight - 3 &&
- y <= (prev+1) * entryHeight - 3) selecting = prev;
-
- if (x < 0 || x > maxWidth || y < -3) selecting = -1;
- else if (selecting < 0 || selecting > n) selecting = -1;
-
- if (selecting == prev) break;
-
- if (prev >= 0 && prev < n) {
- XFillRectangle(display(), m_menuWindow, m_menuGC,
- 4, prev * entryHeight + 9,
- maxWidth - 8, entryHeight);
- }
-
- if (selecting >= 0 && selecting < n) {
- XFillRectangle(display(), m_menuWindow, m_menuGC,
- 4, selecting * entryHeight + 9,
- maxWidth - 8, entryHeight);
- }
-
- break;
-
- case Expose:
- XClearWindow(display(), m_menuWindow);
-
- XDrawRectangle(display(), m_menuWindow, m_menuGC, 2, 7,
- maxWidth - 5, totalHeight - 10);
-
- for (i = 0; i < n; ++i) {
-
- int dx = XTextWidth(m_menuFont, MENU_LABEL(i),
- strlen(MENU_LABEL(i)));
- int dy = i * entryHeight + m_menuFont->ascent + 10;
-
- if (i >= nh) {
- XDrawString(display(), m_menuWindow, m_menuGC,
- maxWidth - 8 - dx, dy,
- MENU_LABEL(i), strlen(MENU_LABEL(i)));
- } else {
- XDrawString(display(), m_menuWindow, m_menuGC, 8,
- dy, MENU_LABEL(i), strlen(MENU_LABEL(i)));
- }
- }
-
- if (selecting >= 0 && selecting < n) {
- XFillRectangle(display(), m_menuWindow, m_menuGC,
- 4, selecting * entryHeight + 9,
- maxWidth - 8, entryHeight);
- }
-
- drawn = True;
- }
- }
-
- if (selecting == n-1 && allowExit) {
- m_signalled = True;
- return;
- }
-
- if (selecting >= 0) {
- if (selecting == 0) {
- spawn();
- } else if (selecting < nh) {
- clients.item(selecting - 1)->unhide(True);
- } else if (selecting < n) {
- if (CONFIG_CLICK_TO_FOCUS) {
- clients.item(selecting - 1)->activate();
- } else {
- clients.item(selecting - 1)->mapRaised();
- }
- clients.item(selecting - 1)->ensureVisible();
- }
- }
-
- clients.remove_all();
- return;
-}
-
-
-void WindowManager::showGeometry(int x, int y)
-{
- char string[20];
- snprintf(string, sizeof(string), "%d %d\n", x, y);
- int width = XTextWidth(m_menuFont, string, strlen(string)) + 8;
- int height = m_menuFont->ascent + m_menuFont->descent + 8;
- int mx = DisplayWidth (display(), m_screenNumber) - 1;
- int my = DisplayHeight(display(), m_screenNumber) - 1;
-
- XMoveResizeWindow(display(), m_menuWindow,
- (mx - width) / 2, (my - height) / 2, width, height);
- XClearWindow(display(), m_menuWindow);
- XMapRaised(display(), m_menuWindow);
-
- XDrawString(display(), m_menuWindow, m_menuGC, 4, 4 + m_menuFont->ascent,
- string, strlen(string));
-}
-
-
-void WindowManager::removeGeometry()
-{
- XUnmapWindow(display(), m_menuWindow);
-}
-
-
-void Client::move(XButtonEvent *e)
-{
- int x = -1, y = -1, xoff, yoff;
- Boolean done = False;
-
- if (m_windowManager->attemptGrab
- (root(), None, DragMask, e->time) != GrabSuccess) {
- return;
- }
-
- xoff = m_border->xIndent() - e->x;
- yoff = m_border->yIndent() - e->y;
-
- XEvent event;
- Boolean found;
- Boolean doSomething = False;
- struct timeval sleepval;
-
- while (!done) {
-
- found = False;
-
- while (XCheckMaskEvent(display(), DragMask | ExposureMask, &event)) {
- found = True;
- if (event.type != MotionNotify) break;
- }
-
- if (!found) {
- sleepval.tv_sec = 0;
- sleepval.tv_usec = 50000;
- select(0, 0, 0, 0, &sleepval);
- continue;
- }
-
- switch (event.type) {
-
- default:
- fprintf(stderr, "wm2: unknown event type %d\n", event.type);
- break;
-
- case Expose:
- m_windowManager->eventExposure(&event.xexpose);
- break;
-
- case ButtonPress:
- // don't like this
- XUngrabPointer(display(), event.xbutton.time);
- doSomething = False;
- done = True;
- break;
-
- case ButtonRelease:
-
- x = event.xbutton.x; y = event.xbutton.y;
- if (!nobuttons(&event.xbutton)) doSomething = False;
-
-// XUngrabPointer(display(), event.xbutton.time);
- m_windowManager->releaseGrab(&event.xbutton);
- done = True;
- break;
-
- case MotionNotify:
- x = event.xbutton.x; y = event.xbutton.y;
- if (x + xoff != m_x || y + yoff != m_y) {
- windowManager()->showGeometry(x + xoff, y + yoff);
- m_border->moveTo(x + xoff, y + yoff);
- doSomething = True;
- }
- break;
- }
- }
-
- windowManager()->removeGeometry();
-
- if (x >= 0 && doSomething) {
- m_x = x + xoff;
- m_y = y + yoff;
- }
-
- if (CONFIG_CLICK_TO_FOCUS) activate();
- m_border->moveTo(m_x, m_y);
- sendConfigureNotify();
-}
-
-
-void Client::fixResizeDimensions(int &w, int &h, int &dw, int &dh)
-{
- if (w < 50) w = 50;
- if (h < 50) h = 50;
-
- if (m_sizeHints.flags & PResizeInc) {
- w = m_minWidth + (((w - m_minWidth) / m_sizeHints.width_inc) *
- m_sizeHints.width_inc);
- h = m_minHeight + (((h - m_minHeight) / m_sizeHints.height_inc) *
- m_sizeHints.height_inc);
-
- dw = (w - m_minWidth) / m_sizeHints.width_inc;
- dh = (h - m_minHeight) / m_sizeHints.height_inc;
- } else {
- dw = w; dh = h;
- }
-
- if (m_sizeHints.flags & PMaxSize) {
- if (w > m_sizeHints.max_width) w = m_sizeHints.max_width;
- if (h > m_sizeHints.max_height) h = m_sizeHints.max_height;
- }
-
- if (w < m_minWidth) w = m_minWidth;
- if (h < m_minHeight) h = m_minHeight;
-}
-
-
-void Client::resize(XButtonEvent *e, Boolean horizontal, Boolean vertical)
-{
- if (isFixedSize()) return;
-
- if (m_windowManager->attemptGrab
- (root(), None, DragMask, e->time) != GrabSuccess) {
- return;
- }
-
- if (vertical && horizontal)
- m_windowManager->installCursor(WindowManager::DownrightCursor);
- else if (vertical)
- m_windowManager->installCursor(WindowManager::DownCursor);
- else
- m_windowManager->installCursor(WindowManager::RightCursor);
-
- Window dummy;
- XTranslateCoordinates(display(), e->window, parent(),
- e->x, e->y, &e->x, &e->y, &dummy);
-
- int xorig = e->x;
- int yorig = e->y;
- int x = xorig;
- int y = yorig;
- int w = m_w, h = m_h;
- int prevW, prevH;
- int dw, dh;
-
- XEvent event;
- Boolean found;
- Boolean doSomething = False;
- Boolean done = False;
- struct timeval sleepval;
-
- while (!done) {
-
- found = False;
-
- while (XCheckMaskEvent(display(), DragMask | ExposureMask, &event)) {
- found = True;
- if (event.type != MotionNotify) break;
- }
-
- if (!found) {
- sleepval.tv_sec = 0;
- sleepval.tv_usec = 50000;
- select(0, 0, 0, 0, &sleepval);
- continue;
- }
-
- switch (event.type) {
-
- default:
- fprintf(stderr, "wm2: unknown event type %d\n", event.type);
- break;
-
- case Expose:
- m_windowManager->eventExposure(&event.xexpose);
- break;
-
- case ButtonPress:
- // don't like this
- XUngrabPointer(display(), event.xbutton.time);
- done = True;
- break;
-
- case ButtonRelease:
-
- x = event.xbutton.x; y = event.xbutton.y;
-
- if (!nobuttons(&event.xbutton)) x = -1;
- m_windowManager->releaseGrab(&event.xbutton);
-
- done = True;
- break;
-
- case MotionNotify:
- x = event.xbutton.x; y = event.xbutton.y;
-
- if (vertical && horizontal) {
- prevH = h; h = y - m_y;
- prevW = w; w = x - m_x;
- fixResizeDimensions(w, h, dw, dh);
- if (h == prevH && w == prevW) break;
- m_border->configure(m_x, m_y, w, h, CWWidth | CWHeight, 0);
- windowManager()->showGeometry(dw, dh);
- doSomething = True;
-
- } else if (vertical) {
- prevH = h; h = y - m_y;
- fixResizeDimensions(w, h, dw, dh);
- if (h == prevH) break;
- m_border->configure(m_x, m_y, w, h, CWHeight, 0);
- windowManager()->showGeometry(dw, dh);
- doSomething = True;
-
- } else {
- prevW = w; w = x - m_x;
- fixResizeDimensions(w, h, dw, dh);
- if (w == prevW) break;
- m_border->configure(m_x, m_y, w, h, CWWidth, 0);
- windowManager()->showGeometry(dw, dh);
- doSomething = True;
- }
-
- break;
- }
- }
-
- if (doSomething) {
-
- windowManager()->removeGeometry();
-
- if (vertical && horizontal) {
- m_w = x - m_x;
- m_h = y - m_y;
- fixResizeDimensions(m_w, m_h, dw, dh);
- m_border->configure(m_x, m_y, m_w, m_h, CWWidth|CWHeight, 0, True);
- } else if (vertical) {
- m_h = y - m_y;
- fixResizeDimensions(m_w, m_h, dw, dh);
- m_border->configure(m_x, m_y, m_w, m_h, CWHeight, 0, True);
- } else {
- m_w = x - m_x;
- fixResizeDimensions(m_w, m_h, dw, dh);
- m_border->configure(m_x, m_y, m_w, m_h, CWWidth, 0, True);
- }
-
- XMoveResizeWindow(display(), m_window,
- m_border->xIndent(), m_border->yIndent(), m_w, m_h);
-
- sendConfigureNotify();
- }
-
- m_windowManager->installCursor(WindowManager::NormalCursor);
-}
-
-
-void Client::moveOrResize(XButtonEvent *e)
-{
- if (e->x < m_border->xIndent() && e->y > m_h) {
- resize(e, False, True);
- } else if (e->y < m_border->yIndent() &&
- e->x > m_w + m_border->xIndent() - m_border->yIndent()) { //hack
- resize(e, True, False);
- } else {
- move(e);
- }
-}
-
-
-void Border::eventButton(XButtonEvent *e)
-{
- if (e->window == m_parent) {
-
- if (!m_client->isActive()) return;
- if (isTransient()) {
- if (e->x >= xIndent() && e->y >= yIndent()) {
- return;
- } else {
- m_client->move(e);
- return;
- }
- }
-
- m_client->moveOrResize(e);
- return;
-
- } else if (e->window == m_tab) {
- m_client->move(e);
- return;
- }
-
- if (e->window == m_resize) {
- m_client->resize(e, True, True);
- return;
- }
-
- if (e->window != m_button || e->type == ButtonRelease) return;
-
- if (windowManager()->attemptGrab(m_button, None, MenuGrabMask, e->time)
- != GrabSuccess) {
- return;
- }
-
- XEvent event;
- Boolean found;
- Boolean done = False;
- struct timeval sleepval;
- unsigned long tdiff = 0L;
- int x = e->x;
- int y = e->y;
- int action = 1;
- int buttonSize = m_tabWidth - TAB_TOP_HEIGHT*2 - 4;
-
- XFillRectangle(display(), m_button, m_drawGC, 0, 0, buttonSize, buttonSize);
-
- while (!done) {
-
- found = False;
-
- if (tdiff > CONFIG_DESTROY_WINDOW_DELAY && action == 1) {
- windowManager()->installCursor(WindowManager::DeleteCursor);
- action = 2;
- }
-
- while (XCheckMaskEvent(display(), MenuMask, &event)) {
- found = True;
- if (event.type != MotionNotify) break;
- }
-
- if (!found) {
- sleepval.tv_sec = 0;
- sleepval.tv_usec = 50000;
- select(0, 0, 0, 0, &sleepval);
- tdiff += 50;
- continue;
- }
-
- switch (event.type) {
-
- default:
- fprintf(stderr, "wm2: unknown event type %d\n", event.type);
- break;
-
- case Expose:
- windowManager()->eventExposure(&event.xexpose);
- break;
-
- case ButtonPress:
- break;
-
- case ButtonRelease:
-
- if (!nobuttons(&event.xbutton)) {
- action = 0;
- }
-
- if (x < 0 || y < 0 || x >= buttonSize || y >= buttonSize) {
- action = 0;
- }
-
- windowManager()->releaseGrab(&event.xbutton);
- done = True;
- break;
-
- case MotionNotify:
- tdiff = event.xmotion.time - e->time;
- if (tdiff > 5000L) tdiff = 5001L; // in case of overflow!
-
- x = event.xmotion.x;
- y = event.xmotion.y;
-
- if (action == 0 || action == 2) {
- if (x < 0 || y < 0 || x >= buttonSize || y >= buttonSize) {
- windowManager()->installCursor(WindowManager::NormalCursor);
- action = 0;
- } else {
- windowManager()->installCursor(WindowManager::DeleteCursor);
- action = 2;
- }
- }
-
- break;
- }
- }
-
- XClearWindow(display(), m_button);
- windowManager()->installCursor(WindowManager::NormalCursor);
-
- if (tdiff > 5000L) { // do nothing, they dithered too long
- return;
- }
-
- if (action == 1) m_client->hide();
- else if (action == 2) m_client->kill();
-}
-
diff --git a/app/wm2/Client.C b/app/wm2/Client.C
deleted file mode 100644
index 9869c94d2..000000000
--- a/app/wm2/Client.C
+++ /dev/null
@@ -1,760 +0,0 @@
-
-#include "Manager.h"
-#include "Client.h"
-
-#include <X11/Xutil.h>
-
-const char *const Client::m_defaultLabel = "incognito";
-
-
-
-Client::Client(WindowManager *const wm, Window w) :
- m_window(w),
- m_transient(None),
- m_revert(0),
- m_fixedSize(False),
- m_state(WithdrawnState),
- m_managed(False),
- m_reparenting(False),
- m_stubborn(False),
- m_lastPopTime(0L),
- m_colormap(None),
- m_colormapWinCount(0),
- m_colormapWindows(NULL),
- m_windowColormaps(NULL),
- m_windowManager(wm)
-{
- XWindowAttributes attr;
- XGetWindowAttributes(display(), m_window, &attr);
-
- m_x = attr.x;
- m_y = attr.y;
- m_w = attr.width;
- m_h = attr.height;
- m_bw = attr.border_width;
- m_name = m_iconName = 0;
- m_sizeHints.flags = 0L;
-
- m_label = NewString(m_defaultLabel);
- m_border = new Border(this, w);
-
- if (attr.map_state == IsViewable) manage(True);
-}
-
-
-Client::~Client()
-{
- // empty
-}
-
-
-void Client::release()
-{
- // assume wm called for this, and will remove me from its list itself
-
-// fprintf(stderr, "deleting client %p\n",this);
-
- if (m_window == None) {
- fprintf(stderr,
- "wm2: invalid parent in Client::release (released twice?)\n");
- }
-
- windowManager()->skipInRevert(this, m_revert);
-
-// fprintf(stderr, "deleting %lx\n",m_window);
-
- if (isHidden()) unhide(False);
-
- delete m_border;
- m_window = None;
-
- if (isActive()) {
- if (CONFIG_CLICK_TO_FOCUS) {
- if (m_revert) {
- windowManager()->setActiveClient(m_revert);
- m_revert->activate();
- } else windowManager()->setActiveClient(0);// windowManager()->clearFocus();
- } else {
- windowManager()->setActiveClient(0);
- }
- }
-
- if (m_colormapWinCount > 0) {
- XFree((char *)m_colormapWindows);
- free((char *)m_windowColormaps); // not allocated through X
- }
-
- if (m_iconName) XFree(m_iconName);
- if (m_name) XFree(m_name);
- if (m_label) free((void *)m_label);
-
- delete this;
-}
-
-
-void Client::unreparent()
-{
- XWindowChanges wc;
-
- if (!isWithdrawn()) {
- gravitate(True);
- XReparentWindow(display(), m_window, root(), m_x, m_y);
- }
-
- wc.border_width = m_bw;
- XConfigureWindow(display(), m_window, CWBorderWidth, &wc);
-
- XSync(display(), True);
-}
-
-
-void Client::installColormap()
-{
- Client *cc = 0;
- int i, found;
-
- if (m_colormapWinCount != 0) {
-
- found = 0;
-
- for (i = m_colormapWinCount - 1; i >= 0; --i) {
- windowManager()->installColormap(m_windowColormaps[i]);
- if (m_colormapWindows[i] == m_window) ++found;
- }
-
- if (found == 0) {
- windowManager()->installColormap(m_colormap);
- }
-
- } else if (m_transient != None &&
- (cc = windowManager()->windowToClient(m_transient))) {
-
- cc->installColormap();
- } else {
- windowManager()->installColormap(m_colormap);
- }
-}
-
-
-void Client::manage(Boolean mapped)
-{
- Boolean shouldHide, reshape;
- XWMHints *hints;
- Display *d = display();
- long mSize;
- int state;
-
- XSelectInput(d, m_window, ColormapChangeMask | EnterWindowMask |
- PropertyChangeMask | FocusChangeMask);
-
- m_iconName = getProperty(XA_WM_ICON_NAME);
- m_name = getProperty(XA_WM_NAME);
- setLabel();
-
- getColormaps();
- getProtocols();
- getTransient();
-
- hints = XGetWMHints(d, m_window);
-
- if (!getState(&state)) {
- state = hints ? hints->initial_state : NormalState;
- }
-
- shouldHide = (state == IconicState);
- if (hints) XFree(hints);
-
- if (XGetWMNormalHints(d, m_window, &m_sizeHints, &mSize) == 0 ||
- m_sizeHints.flags == 0) {
- m_sizeHints.flags = PSize;
- }
-
- m_fixedSize = False;
-// if ((m_sizeHints.flags & (USSize | PSize))) m_fixedSize = True;
- if ((m_sizeHints.flags & (PMinSize | PMaxSize)) == (PMinSize | PMaxSize) &&
- (m_sizeHints.min_width == m_sizeHints.max_width &&
- m_sizeHints.min_height == m_sizeHints.max_height)) m_fixedSize = True;
-
- reshape = !mapped;
-
- if (m_fixedSize) {
- if ((m_sizeHints.flags & USPosition)) reshape = False;
- if ((m_sizeHints.flags & PPosition) && shouldHide) reshape = False;
- if ((m_transient != None)) reshape = False;
- }
-
- if ((m_sizeHints.flags & PBaseSize)) {
- m_minWidth = m_sizeHints.base_width;
- m_minHeight = m_sizeHints.base_height;
- } else if ((m_sizeHints.flags & PMinSize)) {
- m_minWidth = m_sizeHints.min_width;
- m_minHeight = m_sizeHints.min_height;
- } else {
- m_minWidth = m_minHeight = 50;
- }
-
- // act
-
- gravitate(False);
-
- // zeros are iffy, should be calling some Manager method
- int dw = DisplayWidth(display(), 0), dh = DisplayHeight(display(), 0);
-
- if (m_w < m_minWidth) {
- m_w = m_minWidth; m_fixedSize = False; reshape = True;
- }
- if (m_h < m_minHeight) {
- m_h = m_minHeight; m_fixedSize = False; reshape = True;
- }
-
- if (m_w > dw - 8) m_w = dw - 8;
- if (m_h > dh - 8) m_h = dh - 8;
-
- if (m_x > dw - m_border->xIndent()) {
- m_x = dw - m_border->xIndent();
- }
-
- if (m_y > dh - m_border->yIndent()) {
- m_y = dh - m_border->yIndent();
- }
-
- if (m_x < m_border->xIndent()) m_x = m_border->xIndent();
- if (m_y < m_border->yIndent()) m_y = m_border->yIndent();
-
- m_border->configure(m_x, m_y, m_w, m_h, 0L, Above);
-
- if (mapped) m_reparenting = True;
- if (reshape && !m_fixedSize) XResizeWindow(d, m_window, m_w, m_h);
- XSetWindowBorderWidth(d, m_window, 0);
-
- m_border->reparent();
-
- // (support for shaped windows absent)
-
- XAddToSaveSet(d, m_window);
- m_managed = True;
-
- if (shouldHide) hide();
- else {
- XMapWindow(d, m_window);
- m_border->map();
- setState(NormalState);
-
- if (CONFIG_CLICK_TO_FOCUS ||
- (m_transient != None && activeClient() &&
- activeClient()->m_window == m_transient)) {
- activate();
- mapRaised();
- } else {
- deactivate();
- }
- }
-
- if (activeClient() && !isActive()) {
- activeClient()->installColormap();
- }
-
- if (CONFIG_AUTO_RAISE) {
- m_windowManager->stopConsideringFocus();
- focusIfAppropriate(False);
- }
-}
-
-
-void Client::selectOnMotion(Window w, Boolean select)
-{
- if (!CONFIG_AUTO_RAISE) return;
- if (!w || w == root()) return;
-
- if (w == m_window || m_border->hasWindow(w)) {
- XSelectInput(display(), m_window, // not "w"
- ColormapChangeMask | EnterWindowMask |
- PropertyChangeMask | FocusChangeMask |
- (select ? PointerMotionMask : 0L));
- } else {
- XSelectInput(display(), w, select ? PointerMotionMask : 0L);
- }
-}
-
-
-void Client::decorate(Boolean active)
-{
- m_border->decorate(active, m_w, m_h);
-}
-
-
-void Client::activate()
-{
-// fprintf(stderr, "Client::activate (this = %p, window = %x, parent = %x)\n",
-// this, m_window, parent());
-
- if (parent() == root()) {
- fprintf(stderr, "wm2: warning: bad parent in Client::activate\n");
- return;
- }
-
- if (!m_managed || isHidden() || isWithdrawn()) return;
-
- if (isActive()) {
- decorate(True);
- if (CONFIG_AUTO_RAISE || CONFIG_RAISE_ON_FOCUS) mapRaised();
- return;
- }
-
- if (activeClient()) {
- activeClient()->deactivate();
- // & some other-screen business
- }
-
- XUngrabButton(display(), AnyButton, AnyModifier, parent());
-
- XSetInputFocus(display(), m_window, RevertToPointerRoot,
- windowManager()->timestamp(False));
-
- if (m_protocol & PtakeFocus) {
- sendMessage(Atoms::wm_protocols, Atoms::wm_takeFocus);
- }
-
- // now set revert of window that reverts to this one so as to
- // revert to the window this one used to revert to (huh?)
-
- windowManager()->skipInRevert(this, m_revert);
-
- m_revert = activeClient();
- while (m_revert && !m_revert->isNormal()) m_revert = m_revert->revertTo();
-
- windowManager()->setActiveClient(this);
-// if (CONFIG_AUTO_RAISE || CONFIG_RAISE_ON_FOCUS) mapRaised();
- decorate(True);
-
- installColormap(); // new!
-}
-
-
-void Client::deactivate() // called from wm?
-{
-// fprintf(stderr,
-// "Client::deactivate (this = %p, window = %x, parent = %x)\n",
-// this, m_window, parent());
-
- if (parent() == root()) {
- fprintf(stderr, "wm2: warning: bad parent in Client::deactivate\n");
- return;
- }
-
- XGrabButton(display(), AnyButton, AnyModifier, parent(), False,
- ButtonPressMask | ButtonReleaseMask,
- GrabModeAsync, GrabModeSync, None, None);
-
- decorate(False);
-}
-
-
-void Client::sendMessage(Atom a, long l)
-{
- XEvent ev;
- int status;
- long mask;
-
- memset(&ev, 0, sizeof(ev));
- ev.xclient.type = ClientMessage;
- ev.xclient.window = m_window;
- ev.xclient.message_type = a;
- ev.xclient.format = 32;
- ev.xclient.data.l[0] = l;
- ev.xclient.data.l[1] = windowManager()->timestamp(False);
- mask = 0L;
- status = XSendEvent(display(), m_window, False, mask, &ev);
-
- if (status == 0) {
- fprintf(stderr, "wm2: warning: Client::sendMessage failed\n");
- }
-}
-
-
-static int getProperty_aux(Display *d, Window w, Atom a, Atom type, long len,
- unsigned char **p)
-{
- Atom realType;
- int format;
- unsigned long n, extra;
- int status;
-
- status = XGetWindowProperty(d, w, a, 0L, len, False, type, &realType,
- &format, &n, &extra, p);
-
- if (status != Success || *p == 0) return -1;
- if (n == 0) XFree((void *) *p);
-
- return n;
-}
-
-
-char *Client::getProperty(Atom a)
-{
- unsigned char *p;
- if (getProperty_aux(display(), m_window, a, XA_STRING, 100L, &p) <= 0) {
- return NULL;
- }
- return (char *)p;
-}
-
-
-int Client::getAtomProperty(Atom a, Atom type)
-{
- char **p, *x;
- if (getProperty_aux(display(), m_window, a, type, 1L,
- (unsigned char **)&p) <= 0) {
- return 0;
- }
-
- x = *p;
- XFree((void *)p);
- return (int)x;
-}
-
-
-int Client::getIntegerProperty(Atom a)
-{
- return getAtomProperty(a, XA_INTEGER);
-}
-
-
-void Client::setState(int state)
-{
- m_state = state;
-
-// fprintf(stderr, "state set to %d\n",state);
-
- long data[2];
- data[0] = (long)state;
- data[1] = (long)None;
-
- XChangeProperty(display(), m_window, Atoms::wm_state, Atoms::wm_state,
- 32, PropModeReplace, (unsigned char *)data, 2);
-}
-
-
-Boolean Client::getState(int *state)
-{
- long *p = 0;
-
- if (getProperty_aux(display(), m_window, Atoms::wm_state, Atoms::wm_state,
- 2L, (unsigned char **)&p) <= 0) {
- return False;
- }
-
- *state = (int) *p;
- XFree((char *)p);
- return True;
-}
-
-
-void Client::getProtocols()
-{
- long n;
- Atom *p;
-
- m_protocol = 0;
- if ((n = getProperty_aux(display(), m_window, Atoms::wm_protocols, XA_ATOM,
- 20L, (unsigned char **)&p)) <= 0) {
- return;
- }
-
- for (int i = 0; i < n; ++i) {
- if (p[i] == Atoms::wm_delete) {
- m_protocol |= Pdelete;
- } else if (p[i] == Atoms::wm_takeFocus) {
- m_protocol |= PtakeFocus;
- }
- }
-
- XFree((char *) p);
-}
-
-
-void Client::gravitate(Boolean invert)
-{
- int gravity;
- int w = 0, h = 0, xdelta, ydelta;
-
- // possibly shouldn't work if we haven't been managed yet?
-
- gravity = NorthWestGravity;
- if (m_sizeHints.flags & PWinGravity) gravity = m_sizeHints.win_gravity;
-
- xdelta = m_bw - m_border->xIndent();
- ydelta = m_bw - m_border->yIndent();
-
- // note that right and bottom borders have indents of 1
-
- switch (gravity) {
-
- case NorthWestGravity:
- break;
-
- case NorthGravity:
- w = xdelta;
- break;
-
- case NorthEastGravity:
- w = xdelta + m_bw-1;
- break;
-
- case WestGravity:
- h = ydelta;
- break;
-
- case CenterGravity:
- case StaticGravity:
- w = xdelta;
- h = ydelta;
- break;
-
- case EastGravity:
- w = xdelta + m_bw-1;
- h = ydelta;
- break;
-
- case SouthWestGravity:
- h = ydelta + m_bw-1;
- break;
-
- case SouthGravity:
- w = xdelta;
- h = ydelta + m_bw-1;
- break;
-
- case SouthEastGravity:
- w = xdelta + m_bw-1;
- h = ydelta + m_bw-1;
- break;
-
- default:
- fprintf(stderr, "wm2: bad window gravity %d for window 0x%lx\n",
- gravity, m_window);
- return;
- }
-
- w += m_border->xIndent();
- h += m_border->yIndent();
-
- if (invert) { w = -w; h = -h; }
-
- m_x += w;
- m_y += h;
-}
-
-
-Boolean Client::setLabel(void)
-{
- const char *newLabel;
-
- if (m_name) newLabel = m_name;
- else if (m_iconName) newLabel = m_iconName;
- else newLabel = m_defaultLabel;
-
- if (!m_label) {
-
- m_label = NewString(newLabel);
- return True;
-
- } else if (strcmp(m_label, newLabel)) {
-
- free((void *)m_label);
- m_label = NewString(newLabel);
- return True;
-
- } else return True;//False;// dammit!
-}
-
-
-void Client::getColormaps(void)
-{
- int i, n;
- Window *cw;
- XWindowAttributes attr;
-
- if (!m_managed) {
- XGetWindowAttributes(display(), m_window, &attr);
- m_colormap = attr.colormap;
-
-// fprintf(stderr, "colormap for %s is %p\n",m_label, (void *)m_colormap);
- }
-
- n = getProperty_aux(display(), m_window, Atoms::wm_colormaps, XA_WINDOW,
- 100L, (unsigned char **)&cw);
-
- if (m_colormapWinCount != 0) {
- XFree((char *)m_colormapWindows);
- free((char *)m_windowColormaps);
- }
-
- if (n <= 0) {
- m_colormapWinCount = 0;
- return;
- }
-
- m_colormapWinCount = n;
- m_colormapWindows = cw;
-
- m_windowColormaps = (Colormap *)malloc(n * sizeof(Colormap));
-
- for (i = 0; i < n; ++i) {
- if (cw[i] == m_window) {
- m_windowColormaps[i] = m_colormap;
- } else {
- XSelectInput(display(), cw[i], ColormapChangeMask);
- XGetWindowAttributes(display(), cw[i], &attr);
- m_windowColormaps[i] = attr.colormap;
- }
- }
-}
-
-
-void Client::getTransient()
-{
- Window t = None;
-
- if (XGetTransientForHint(display(), m_window, &t) != 0) {
-
- if (windowManager()->windowToClient(t) == this) {
- fprintf(stderr,
- "wm2: warning: client \"%s\" thinks it's a transient "
- "for\nitself -- ignoring WM_TRANSIENT_FOR property...\n",
- m_label ? m_label : "(no name)");
- m_transient = None;
- } else {
- m_transient = t;
- }
- } else {
- m_transient = None;
- }
-}
-
-
-void Client::hide()
-{
- if (isHidden()) {
- fprintf(stderr, "wm2: Client already hidden in Client::hide\n");
- return;
- }
-
- m_border->unmap();
- XUnmapWindow(display(), m_window);
-
-// if (isActive()) windowManager()->setActiveClient(0);
- if (isActive()) windowManager()->clearFocus();
-
- setState(IconicState);
- windowManager()->addToHiddenList(this);
-}
-
-
-void Client::unhide(Boolean map)
-{
- if (!isHidden()) {
- fprintf(stderr, "wm2: Client not hidden in Client::unhide\n");
- return;
- }
-
- windowManager()->removeFromHiddenList(this);
-
- if (map) {
- setState(NormalState);
- XMapWindow(display(), m_window);
- mapRaised();
-
- if (CONFIG_AUTO_RAISE) focusIfAppropriate(False);
- else if (CONFIG_CLICK_TO_FOCUS) activate();
- }
-}
-
-
-void Client::sendConfigureNotify()
-{
- XConfigureEvent ce;
-
- ce.type = ConfigureNotify;
- ce.event = m_window;
- ce.window = m_window;
-
- ce.x = m_x;
- ce.y = m_y;
- ce.width = m_w;
- ce.height = m_h;
- ce.border_width = m_bw;
- ce.above = None;
- ce.override_redirect = 0;
-
- XSendEvent(display(), m_window, False, StructureNotifyMask, (XEvent*)&ce);
-}
-
-
-void Client::withdraw(Boolean changeState)
-{
-// fprintf(stderr,"withdrawing\n");
-
- m_border->unmap();
-
- gravitate(True);
- XReparentWindow(display(), m_window, root(), m_x, m_y);
-
- gravitate(False);
-
- if (changeState) {
- XRemoveFromSaveSet(display(), m_window);
- setState(WithdrawnState);
- }
-
- ignoreBadWindowErrors = True;
- XSync(display(), False);
- ignoreBadWindowErrors = False;
-}
-
-
-void Client::rename()
-{
- m_border->configure(0, 0, m_w, m_h, CWWidth | CWHeight, Above);
-}
-
-
-void Client::mapRaised()
-{
- m_border->mapRaised();
- windowManager()->raiseTransients(this);
-}
-
-
-void Client::kill()
-{
- if (m_protocol & Pdelete) {
- sendMessage(Atoms::wm_protocols, Atoms::wm_delete);
- } else {
- XKillClient(display(), m_window);
- }
-}
-
-
-void Client::ensureVisible()
-{
- int mx = DisplayWidth(display(), 0) - 1; // hack
- int my = DisplayHeight(display(), 0) - 1;
- int px = m_x;
- int py = m_y;
-
- if (m_x + m_w > mx) m_x = mx - m_w;
- if (m_y + m_h > my) m_y = my - m_h;
- if (m_x < 0) m_x = 0;
- if (m_y < 0) m_y = 0;
-
- if (m_x != px || m_y != py) m_border->moveTo(m_x, m_y);
-}
-
-
-void Client::lower()
-{
- m_border->lower();
-}
-
-
diff --git a/app/wm2/Client.h b/app/wm2/Client.h
deleted file mode 100644
index 069d3dbbb..000000000
--- a/app/wm2/Client.h
+++ /dev/null
@@ -1,148 +0,0 @@
-
-#ifndef _CLIENT_H_
-#define _CLIENT_H_
-
-#include "General.h"
-#include "Manager.h"
-#include "Border.h"
-
-
-class Client {
-public:
- Client(WindowManager *const, Window);
- void release();
-
- /* for call from WindowManager: */
-
- void activate(); /* active() */
- void deactivate(); /* setactive(0) */
- void gravitate(Boolean invert);
- void installColormap();
- void unreparent();
- void withdraw(Boolean = True);
- void hide();
- void unhide(Boolean map);
- void rename();
- void kill();
- void mapRaised(); // without activating
- void lower();
-
- void move(XButtonEvent *); // event for grab timestamp & coords
- void resize(XButtonEvent *, Boolean, Boolean);
- void moveOrResize(XButtonEvent *);
- void ensureVisible(); // make sure x, y are on-screen
-
- void manage(Boolean mapped);
- Boolean hasWindow(Window w) {
- return ((m_window == w) || m_border->hasWindow(w));
- }
-
- Client *revertTo() { return m_revert; }
- void setRevertTo(Client *c) { m_revert = c; }
-
- Boolean isHidden() { return (m_state == IconicState); }
- Boolean isWithdrawn() { return (m_state == WithdrawnState); }
- Boolean isNormal() { return (m_state == NormalState); }
- Boolean isTransient() { return (m_transient != None); }
- Window transientFor() { return m_transient; }
- Boolean isFixedSize() { return m_fixedSize; }
-
- const char *label() { return m_label; }
- const char *name() { return m_name; }
- const char *iconName() { return m_iconName; }
-
- void sendMessage(Atom, long);
- void sendConfigureNotify();
-
- void activateAndWarp();
- void focusIfAppropriate(Boolean);
- void selectOnMotion(Window, Boolean);
-
- /* for call from within: */
-
- void fatal(char *m) { m_windowManager->fatal(m); }
- Display *display() { return m_windowManager->display(); }
- Window parent() { return m_border->parent(); }
- Window root() { return m_windowManager->root(); }
- Client *activeClient() { return m_windowManager->activeClient(); }
- Boolean isActive() { return (activeClient() == this); }
-
- WindowManager *windowManager() { return m_windowManager; }
-
- // for call from equivalent wm functions in Events.C:
-
- void eventButton(XButtonEvent *);
- void eventMapRequest(XMapRequestEvent *);
- void eventConfigureRequest(XConfigureRequestEvent *);
- void eventUnmap(XUnmapEvent *);
- void eventColormap(XColormapEvent *);
- void eventProperty(XPropertyEvent *);
- void eventEnter(XCrossingEvent *);
- void eventFocusIn(XFocusInEvent *);
- void eventExposure(XExposeEvent *);
-
-protected: // cravenly submitting to gcc's warnings
- ~Client();
-
-private:
-
- Window m_window;
- Window m_transient;
- Border *m_border;
-
- Client *m_revert;
-
- int m_x;
- int m_y;
- int m_w;
- int m_h;
- int m_bw;
-
- XSizeHints m_sizeHints;
- Boolean m_fixedSize;
- int m_minWidth;
- int m_minHeight;
- void fixResizeDimensions(int &, int &, int &, int &);
- Boolean coordsInHole(int, int);
-
- int m_state;
- int m_protocol;
- Boolean m_managed;
- Boolean m_reparenting;
- Boolean m_stubborn; // keeps popping itself to the front
- Time m_lastPopTime;
-
- char *m_name;
- char *m_iconName;
- const char *m_label; // alias: one of (instance,class,name,iconName)
- static const char *const m_defaultLabel;
-
- Colormap m_colormap;
- int m_colormapWinCount;
- Window *m_colormapWindows;
- Colormap *m_windowColormaps;
-
- WindowManager *const m_windowManager;
-
- char *getProperty(Atom);
- int getAtomProperty(Atom, Atom);
- int getIntegerProperty(Atom);
-
- // accessors
- Boolean getState(int *);
- void setState(int);
-
- // internal instantiation requests
- Boolean setLabel(void); // returns True if changed
- void getColormaps(void);
- void getProtocols(void);
- void getTransient(void);
-
- void decorate(Boolean active);
-};
-
-#define Pdelete 1
-#define PtakeFocus 2
-
-#endif
-
diff --git a/app/wm2/Config.h b/app/wm2/Config.h
deleted file mode 100644
index 6c0e48a03..000000000
--- a/app/wm2/Config.h
+++ /dev/null
@@ -1,49 +0,0 @@
-
-#ifndef _CONFIG_H_
-#define _CONFIG_H_
-
-#define CONFIG_NICE_FONT "-*-lucida-bold-r-*-*-14-*-75-75-*-*-*-*"
-#define CONFIG_NICE_MENU_FONT "-*-lucida-medium-r-*-*-14-*-75-75-*-*-*-*"
-#define CONFIG_NASTY_FONT "fixed"
-
-#define CONFIG_EXEC_USING_SHELL False
-#define CONFIG_NEW_WINDOW_COMMAND "xterm"
-#define CONFIG_EVERYTHING_ON_ROOT_MENU False
-
-// You can't have CLICK_TO_FOCUS without RAISE_ON_FOCUS but the other
-// combinations should be okay. If you set AUTO_RAISE you must leave
-// the other two False; you'll then get focus-follows, auto-raise, and
-// a delay on auto-raise as configured in the DELAY settings below.
-#define CONFIG_CLICK_TO_FOCUS False
-#define CONFIG_RAISE_ON_FOCUS False
-#define CONFIG_AUTO_RAISE False
-
-// milliseconds. In theory these only apply when using AUTO_RAISE,
-// not when just using RAISE_ON_FOCUS without CLICK_TO_FOCUS. First
-// of these is the usual delay before raising; second is the delay
-// after the pointer has stopped moving (only applicable over simple X
-// windows such as xvt).
-#define CONFIG_AUTO_RAISE_DELAY 400
-#define CONFIG_POINTER_STOPPED_DELAY 80
-#define CONFIG_DESTROY_WINDOW_DELAY 1500L
-
-#define CONFIG_TAB_FOREGROUND "black"
-#define CONFIG_TAB_BACKGROUND "gray80"
-#define CONFIG_FRAME_BACKGROUND "gray95"
-#define CONFIG_BUTTON_BACKGROUND "gray95"
-#define CONFIG_BORDERS "black"
-
-#define CONFIG_MENU_FOREGROUND "black"
-#define CONFIG_MENU_BACKGROUND "gray80"
-#define CONFIG_MENU_BORDERS "black"
-
-#define CONFIG_FRAME_THICKNESS 7
-
-// If CONFIG_PROD_SHAPE is True, all frame element shapes will be
-// recalculated afresh every time their focus changes. This will
-// probably slow things down hideously, but has been reported as
-// necessary on some systems (possibly SunOS 4.x with OpenWindows).
-#define CONFIG_PROD_SHAPE False
-
-#endif
-
diff --git a/app/wm2/Cursors.h b/app/wm2/Cursors.h
deleted file mode 100644
index 321b203e7..000000000
--- a/app/wm2/Cursors.h
+++ /dev/null
@@ -1,85 +0,0 @@
-
-#ifndef _WM2_CURSORS_H_
-#define _WM2_CURSORS_H_
-
-#define cursor_width 16
-#define cursor_height 16
-#define cursor_x_hot 1
-#define cursor_y_hot 1
-static unsigned char cursor_bits[] = {
- 0x00, 0x00, 0x06, 0x00, 0x1e, 0x00, 0x7c, 0x00, 0xfc, 0x01, 0xf8, 0x07,
- 0xf8, 0x1f, 0xf0, 0x07, 0xf0, 0x03, 0xe0, 0x07, 0xe0, 0x0e, 0x40, 0x1c,
- 0x40, 0x38, 0x00, 0x70, 0x00, 0x20, 0x00, 0x00};
-
-#define cursor_mask_width 16
-#define cursor_mask_height 16
-static unsigned char cursor_mask_bits[] = {
- 0x07, 0x00, 0x1f, 0x00, 0x7f, 0x00, 0xfe, 0x01, 0xfe, 0x07, 0xfc, 0x1f,
- 0xfc, 0x3f, 0xf8, 0x1f, 0xf8, 0x07, 0xf0, 0x0f, 0xf0, 0x1f, 0xe0, 0x3e,
- 0xe0, 0x7c, 0x40, 0xf8, 0x00, 0x70, 0x00, 0x20};
-
-#define ninja_cross_width 16
-#define ninja_cross_height 16
-#define ninja_cross_x_hot 7
-#define ninja_cross_y_hot 7
-static unsigned char ninja_cross_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x18, 0x10, 0x3c, 0x18, 0x38, 0x0c, 0x70, 0x06,
- 0xe0, 0x07, 0xc0, 0x03, 0xc0, 0x01, 0xe0, 0x03, 0x70, 0x06, 0x38, 0x06,
- 0x1c, 0x0c, 0x08, 0x18, 0x00, 0x10, 0x00, 0x00};
-
-#define ninja_cross_mask_width 16
-#define ninja_cross_mask_height 16
-static unsigned char ninja_cross_mask_bits[] = {
- 0x00, 0x00, 0x18, 0x10, 0x3c, 0x38, 0x7e, 0x3c, 0x7c, 0x1e, 0xf8, 0x0f,
- 0xf0, 0x0f, 0xe0, 0x07, 0xe0, 0x03, 0xf0, 0x07, 0xf8, 0x0f, 0x7c, 0x0f,
- 0x3e, 0x1e, 0x1c, 0x3c, 0x08, 0x38, 0x00, 0x10};
-
-#define cursor_right_width 16
-#define cursor_right_height 16
-#define cursor_right_x_hot 13
-#define cursor_right_y_hot 7
-static unsigned char cursor_right_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x80, 0x03,
- 0x80, 0x0f, 0xfe, 0x3f, 0xfe, 0x3f, 0x80, 0x0f, 0x80, 0x03, 0xc0, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
-#define cursor_right_mask_width 16
-#define cursor_right_mask_height 16
-static unsigned char cursor_right_mask_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xe0, 0x03, 0xc0, 0x0f,
- 0xfe, 0x3f, 0xff, 0x7f, 0xff, 0x7f, 0xfe, 0x3f, 0xc0, 0x0f, 0xe0, 0x03,
- 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
-#define cursor_down_width 16
-#define cursor_down_height 16
-#define cursor_down_x_hot 7
-#define cursor_down_y_hot 13
-static unsigned char cursor_down_bits[] = {
- 0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01,
- 0x90, 0x09, 0xf0, 0x0f, 0xe0, 0x07, 0xe0, 0x07, 0xc0, 0x03, 0xc0, 0x03,
- 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00};
-
-#define cursor_down_mask_width 16
-#define cursor_down_mask_height 16
-static unsigned char cursor_down_mask_bits[] = {
- 0x80, 0x01, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xc0, 0x03, 0xd0, 0x0b,
- 0xf8, 0x1f, 0xf8, 0x1f, 0xf0, 0x0f, 0xf0, 0x0f, 0xe0, 0x07, 0xe0, 0x07,
- 0xc0, 0x03, 0xc0, 0x03, 0x80, 0x01, 0x00, 0x00};
-
-#define cursor_down_right_width 16
-#define cursor_down_right_height 16
-#define cursor_down_right_x_hot 13
-#define cursor_down_right_y_hot 13
-static unsigned char cursor_down_right_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x70, 0x00,
- 0xe0, 0x04, 0xc0, 0x05, 0x80, 0x0f, 0x00, 0x0f, 0xc0, 0x1f, 0x00, 0x1f,
- 0x00, 0x3c, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00};
-
-#define cursor_down_right_mask_width 16
-#define cursor_down_right_mask_height 16
-static unsigned char cursor_down_right_mask_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x70, 0x00, 0xf8, 0x04,
- 0xf0, 0x0f, 0xe0, 0x0f, 0xc0, 0x1f, 0xc0, 0x1f, 0xe0, 0x3f, 0xc0, 0x3f,
- 0x00, 0x7f, 0x00, 0x7c, 0x00, 0x70, 0x00, 0x00};
-
-#endif
diff --git a/app/wm2/Events.C b/app/wm2/Events.C
deleted file mode 100644
index 35ea28c4e..000000000
--- a/app/wm2/Events.C
+++ /dev/null
@@ -1,660 +0,0 @@
-
-#include "Manager.h"
-#include "Client.h"
-
-
-int WindowManager::loop()
-{
- XEvent ev;
- m_looping = True;
-
- while (m_looping) {
-
- nextEvent(&ev);
- m_currentTime = CurrentTime;
-
- switch (ev.type) {
-
- case ButtonPress:
- eventButton(&ev.xbutton);
- break;
-
- case ButtonRelease:
- break;
-
- case MapRequest:
- eventMapRequest(&ev.xmaprequest);
- break;
-
- case ConfigureRequest:
- eventConfigureRequest(&ev.xconfigurerequest);
- break;
-
- case UnmapNotify:
- eventUnmap(&ev.xunmap);
- break;
-
- case CreateNotify:
- eventCreate(&ev.xcreatewindow);
- break;
-
- case DestroyNotify:
- eventDestroy(&ev.xdestroywindow);
- break;
-
- case ClientMessage:
- eventClient(&ev.xclient);
- break;
-
- case ColormapNotify:
- eventColormap(&ev.xcolormap);
- break;
-
- case PropertyNotify:
- eventProperty(&ev.xproperty);
- break;
-
- case SelectionClear:
- fprintf(stderr, "wm2: SelectionClear (this should not happen)\n");
- break;
-
- case SelectionNotify:
- fprintf(stderr, "wm2: SelectionNotify (this should not happen)\n");
- break;
-
- case SelectionRequest:
- fprintf(stderr, "wm2: SelectionRequest (this should not happen)\n");
- break;
-
- case EnterNotify:
- case LeaveNotify:
- eventEnter(&ev.xcrossing);
- break;
-
- case ReparentNotify:
- eventReparent(&ev.xreparent);
- break;
-
- case FocusIn:
- eventFocusIn(&ev.xfocus);
- break;
-
- case Expose: // might be wm tab
- eventExposure(&ev.xexpose);
- break;
-
- case MotionNotify:
- if (CONFIG_AUTO_RAISE && m_focusChanging) {
- if (!m_focusPointerMoved) m_focusPointerMoved = True;
- else m_focusPointerNowStill = False;
- }
- break;
-
- case FocusOut:
- case ConfigureNotify:
- case MapNotify:
- case MappingNotify:
- break;
-
- default:
-// if (ev.type == m_shapeEvent) eventShapeNotify((XShapeEvent *)&ev);
- if (ev.type == m_shapeEvent) {
- fprintf(stderr, "wm2: shaped windows are not supported\n");
- } else {
- fprintf(stderr, "wm2: unsupported event type %d\n", ev.type);
- }
- break;
- }
- }
-
- release();
- return m_returnCode;
-}
-
-
-void WindowManager::nextEvent(XEvent *e)
-{
- int fd;
- fd_set rfds;
- struct timeval t;
- int r;
-
- if (!m_signalled) {
-
- waiting:
-
- if (QLength(m_display) > 0) {
- XNextEvent(m_display, e);
- return;
- }
-
- fd = ConnectionNumber(m_display);
- memset((void *)&rfds, 0, sizeof(fd_set)); // SGI's FD_ZERO is fucked
- FD_SET(fd, &rfds);
- t.tv_sec = t.tv_usec = 0;
-
-#ifdef hpux
-#define select(a,b,c,d,e) select((a),(int *)(b),(c),(d),(e))
-#endif
-
- if (select(fd + 1, &rfds, NULL, NULL, &t) == 1) {
- XNextEvent(m_display, e);
- return;
- }
-
- XFlush(m_display);
- FD_SET(fd, &rfds);
- t.tv_sec = 0; t.tv_usec = 20000;
-
- if ((r = select(fd + 1, &rfds, NULL, NULL,
- (m_focusChanging) ? &t :
- (struct timeval *)NULL)) == 1) {
- XNextEvent(m_display, e);
- return;
- }
-
- if (CONFIG_AUTO_RAISE && m_focusChanging) { // timeout on select
- checkDelaysForFocus();
- }
-
- if (r == 0) goto waiting;
-
- if (errno != EINTR || !m_signalled) {
- perror("wm2: select failed");
- m_looping = False;
- }
- }
-
- fprintf(stderr, "wm2: signal caught, exiting\n");
- m_looping = False;
- m_returnCode = 0;
-}
-
-
-void WindowManager::checkDelaysForFocus()
-{
- if (!CONFIG_AUTO_RAISE) return;
-
- int t = timestamp(True);
-
- if (m_focusPointerMoved) { // only raise when pointer stops
-
- if (t < m_focusTimestamp ||
- t - m_focusTimestamp > CONFIG_POINTER_STOPPED_DELAY) {
-
- if (m_focusPointerNowStill) {
- m_focusCandidate->focusIfAppropriate(True);
-// if (m_focusCandidate->isNormal()) m_focusCandidate->mapRaised();
-// stopConsideringFocus();
-
- } else m_focusPointerNowStill = True; // until proven false
- }
- } else {
-
- if (t < m_focusTimestamp ||
- t - m_focusTimestamp > CONFIG_AUTO_RAISE_DELAY) {
-
- m_focusCandidate->focusIfAppropriate(True);
-
-// if (m_focusCandidate->isNormal()) m_focusCandidate->mapRaised();
-// stopConsideringFocus();
- }
- }
-}
-
-
-void WindowManager::considerFocusChange(Client *c, Window w, Time timestamp)
-{
- if (!CONFIG_AUTO_RAISE) return;
-
- if (m_focusChanging) {
- stopConsideringFocus();
- }
-
- m_focusChanging = True;
- m_focusTimestamp = timestamp;
- m_focusCandidate = c;
- m_focusCandidateWindow = w;
-
- // we need to wait until at least one pointer-motion event has
- // come in before we can start to wonder if the pointer's
- // stopped moving -- otherwise we'll be caught out by all the
- // windows for which we don't get motion events at all
-
- m_focusPointerMoved = False;
- m_focusPointerNowStill = False;
- m_focusCandidate->selectOnMotion(m_focusCandidateWindow, True);
-}
-
-
-void WindowManager::stopConsideringFocus()
-{
- if (!CONFIG_AUTO_RAISE) return;
-
- m_focusChanging = False;
- if (m_focusChanging && m_focusCandidateWindow) {
- m_focusCandidate->selectOnMotion(m_focusCandidateWindow, False);
- }
-}
-
-
-void Client::focusIfAppropriate(Boolean ifActive)
-{
- if (!CONFIG_AUTO_RAISE) return;
- if (!m_managed || !isNormal()) return;
- if (!ifActive && isActive()) return;
-
- Window rw, cw;
- int rx, ry, cx, cy;
- unsigned int k;
-
- XQueryPointer(display(), root(), &rw, &cw, &rx, &ry, &cx, &cy, &k);
-
- if (hasWindow(cw)) {
- activate();
- mapRaised();
- m_windowManager->stopConsideringFocus();
- }
-}
-
-
-void WindowManager::eventConfigureRequest(XConfigureRequestEvent *e)
-{
- XWindowChanges wc;
- Client *c = windowToClient(e->window);
-
- e->value_mask &= ~CWSibling;
- if (c) c->eventConfigureRequest(e);
- else {
-
- wc.x = e->x;
- wc.y = e->y;
- wc.width = e->width;
- wc.height = e->height;
- wc.border_width = 0;
- wc.sibling = None;
- wc.stack_mode = Above;
- e->value_mask &= ~CWStackMode;
- e->value_mask |= CWBorderWidth;
-
- XConfigureWindow(display(), e->window, e->value_mask, &wc);
- }
-}
-
-
-void Client::eventConfigureRequest(XConfigureRequestEvent *e)
-{
- XWindowChanges wc;
- Boolean raise = False;
-
- e->value_mask &= ~CWSibling;
-
- gravitate(True);
-
- if (e->value_mask & CWX) m_x = e->x;
- if (e->value_mask & CWY) m_y = e->y;
- if (e->value_mask & CWWidth) m_w = e->width;
- if (e->value_mask & CWHeight) m_h = e->height;
- if (e->value_mask & CWBorderWidth) m_bw = e->border_width;
-
- gravitate(False);
-
- if (e->value_mask & CWStackMode) {
- if (e->detail == Above) raise = True;
- e->value_mask &= ~CWStackMode;
- }
-
- if (parent() != root() && m_window == e->window) {
- m_border->configure(m_x, m_y, m_w, m_h, e->value_mask, e->detail);
- sendConfigureNotify();
- }
-
- if (m_managed) {
- wc.x = m_border->xIndent();
- wc.y = m_border->yIndent();
- } else {
- wc.x = e->x;
- wc.y = e->y;
- }
-
- wc.width = e->width;
- wc.height = e->height;
- wc.border_width = 0;
- wc.sibling = None;
- wc.stack_mode = Above;
- e->value_mask &= ~CWStackMode;
- e->value_mask |= CWBorderWidth;
-
- XConfigureWindow(display(), e->window, e->value_mask, &wc);
-
- // if parent==root, it's not managed yet -- & it'll be raised when it is
- if (raise && parent() != root()) {
-
- if (CONFIG_AUTO_RAISE) {
-
- m_windowManager->stopConsideringFocus();
-
- if (!m_stubborn) { // outstubborn stubborn windows
- Time popTime = windowManager()->timestamp(True);
-
- if (m_lastPopTime > 0L &&
- popTime > m_lastPopTime &&
- popTime - m_lastPopTime < 2000) { // 2 pops in 2 seconds
- m_stubborn = True;
- m_lastPopTime = 0L;
-
- fprintf(stderr, "wm2: client \"%s\" declared stubborn\n",
- label());
-
- } else {
- m_lastPopTime = popTime;
- }
-
- mapRaised();
- }
- } else {
- mapRaised();
- if (CONFIG_CLICK_TO_FOCUS) activate();
- }
- }
-}
-
-
-void WindowManager::eventMapRequest(XMapRequestEvent *e)
-{
- Client *c = windowToClient(e->window);
-
- // some stuff for multi-screen fuckups here, omitted
-
- if (c) c->eventMapRequest(e);
- else {
- fprintf(stderr, "wm2: bad map request for window %lx\n", e->window);
- }
-}
-
-
-void Client::eventMapRequest(XMapRequestEvent *)
-{
- switch(m_state) {
-
- case WithdrawnState:
- if (parent() == root()) {
- manage(False);
- return;
- }
-
- m_border->reparent();
-
- if (CONFIG_AUTO_RAISE) m_windowManager->stopConsideringFocus();
- XAddToSaveSet(display(), m_window);
- XMapWindow(display(), m_window);
- mapRaised();
- setState(NormalState);
- if (CONFIG_CLICK_TO_FOCUS) activate();
- break;
-
- case NormalState:
- XMapWindow(display(), m_window);
- mapRaised();
- if (CONFIG_CLICK_TO_FOCUS) activate();
- break;
-
- case IconicState:
- if (CONFIG_AUTO_RAISE) m_windowManager->stopConsideringFocus();
- unhide(True);
- break;
- }
-}
-
-
-void WindowManager::eventUnmap(XUnmapEvent *e)
-{
- Client *c = windowToClient(e->window);
- if (c) c->eventUnmap(e);
-}
-
-
-void Client::eventUnmap(XUnmapEvent *e)
-{
- switch (m_state) {
-
- case IconicState:
- if (e->send_event) {
- unhide(False);
- withdraw();
- }
- break;
-
- case NormalState:
- if (isActive()) m_windowManager->clearFocus();
- if (!m_reparenting) withdraw();
- break;
- }
-
- m_reparenting = False;
- m_stubborn = False;
-}
-
-
-void WindowManager::eventCreate(XCreateWindowEvent *e)
-{
- if (e->override_redirect) return;
- Client *c = windowToClient(e->window, True);
-}
-
-
-void WindowManager::eventDestroy(XDestroyWindowEvent *e)
-{
- Client *c = windowToClient(e->window);
-
- if (c) {
-
- if (CONFIG_AUTO_RAISE && m_focusChanging && c == m_focusCandidate) {
- m_focusChanging = False;
- }
-
- for (int i = m_clients.count()-1; i >= 0; --i) {
- if (m_clients.item(i) == c) {
- m_clients.remove(i);
- break;
- }
- }
-
- c->release();
-
- ignoreBadWindowErrors = True;
- XSync(display(), False);
- ignoreBadWindowErrors = False;
- }
-}
-
-
-void WindowManager::eventClient(XClientMessageEvent *e)
-{
- Client *c = windowToClient(e->window);
-
- if (e->message_type == Atoms::wm_changeState) {
- if (c && e->format == 32 && e->data.l[0] == IconicState && c != 0) {
- if (c->isNormal()) c->hide();
- return;
- }
- }
-
- fprintf(stderr, "wm2: unexpected XClientMessageEvent, type 0x%lx, "
- "window 0x%lx\n", e->message_type, e->window);
-}
-
-
-void WindowManager::eventColormap(XColormapEvent *e)
-{
- Client *c = windowToClient(e->window);
- int i;
-
- if (e->c_new) { // this field is called "new" in the old C++-unaware Xlib
-
- if (c) c->eventColormap(e);
- else {
- for (i = 0; i < m_clients.count(); ++i) {
- m_clients.item(i)->eventColormap(e);
- }
- }
- }
-}
-
-
-void Client::eventColormap(XColormapEvent *e)
-{
- if (e->window == m_window || e->window == parent()) {
-
- m_colormap = e->colormap;
- if (isActive()) installColormap();
-
- } else {
-
- for (int i = 0; i < m_colormapWinCount; ++i) {
- if (m_colormapWindows[i] == e->window) {
- m_windowColormaps[i] = e->colormap;
- if (isActive()) installColormap();
- return;
- }
- }
- }
-}
-
-
-void WindowManager::eventProperty(XPropertyEvent *e)
-{
- Client *c = windowToClient(e->window);
- if (c) c->eventProperty(e);
-}
-
-
-void Client::eventProperty(XPropertyEvent *e)
-{
- Atom a = e->atom;
- Boolean shouldDelete = (e->state == PropertyDelete);
-
- switch (a) {
-
- case XA_WM_ICON_NAME:
- if (m_iconName) XFree((char *)m_iconName);
- m_iconName = shouldDelete ? 0 : getProperty(a);
- if (setLabel()) rename();
- return;
-
- case XA_WM_NAME:
- if (m_name) XFree((char *)m_name);
- m_name = shouldDelete ? 0 : getProperty(a);
- if (setLabel()) rename();
- return;
-
- case XA_WM_TRANSIENT_FOR:
- getTransient();
- return;
- }
-
- if (a == Atoms::wm_colormaps) {
- getColormaps();
- if (isActive()) installColormap();
- }
-}
-
-
-void WindowManager::eventReparent(XReparentEvent *e)
-{
- if (e->override_redirect) return;
- (void)windowToClient(e->window, True); // create if absent
-
- // odd screen complications, omitted
-}
-
-
-void WindowManager::eventEnter(XCrossingEvent *e)
-{
- if (e->type != EnterNotify) return;
-
- while (XCheckMaskEvent(m_display, EnterWindowMask, (XEvent *)e));
- m_currentTime = e->time; // not CurrentTime
-
- Client *c = windowToClient(e->window);
- if (c) c->eventEnter(e);
-}
-
-
-void Client::eventEnter(XCrossingEvent *e)
-{
- // first, big checks so as not to allow focus to change "through"
- // the hole in the tab
-
- if (!isActive() && activeClient() && activeClient()->isNormal() &&
- !activeClient()->isTransient()) {
-
- int x, y;
- Window c;
-
- XTranslateCoordinates
- (display(), activeClient()->parent(), e->window, 0, 0, &x, &y, &c);
-
- if (activeClient()->coordsInHole(e->x - x, e->y - y)) return;
- }
-
- if (e->type == EnterNotify) {
- if (!isActive() && !CONFIG_CLICK_TO_FOCUS) {
- activate();
- if (CONFIG_AUTO_RAISE) {
- windowManager()->considerFocusChange(this, m_window, e->time);
- } else if (CONFIG_RAISE_ON_FOCUS) {
- mapRaised();
- }
- }
- }
-}
-
-
-Boolean Client::coordsInHole(int x, int y) // relative to parent
-{
- return m_border->coordsInHole(x, y);
-}
-
-
-Boolean Border::coordsInHole(int x, int y) // this is all a bit of a hack
-{
- return (x > 1 && x < m_tabWidth-1 &&
- y > 1 && y < m_tabWidth-1);
-}
-
-
-void WindowManager::eventFocusIn(XFocusInEvent *e)
-{
- if (e->detail != NotifyNonlinearVirtual) return;
- Client *c = windowToClient(e->window);
-
- if (c) c->eventFocusIn(e);
-}
-
-
-void Client::eventFocusIn(XFocusInEvent *e)
-{
- if (m_window == e->window && !isActive()) {
- activate();
- mapRaised();
- }
-}
-
-
-void WindowManager::eventExposure(XExposeEvent *e)
-{
- if (e->count != 0) return;
- Client *c = windowToClient(e->window);
- if (c) c->eventExposure(e);
-}
-
-
-void Client::eventExposure(XExposeEvent *e)
-{
- if (m_border->hasWindow(e->window)) {
- m_border->expose(e);
- }
-}
-
-
diff --git a/app/wm2/General.h b/app/wm2/General.h
deleted file mode 100644
index 9c8d5fd42..000000000
--- a/app/wm2/General.h
+++ /dev/null
@@ -1,61 +0,0 @@
-
-#ifndef _GENERAL_H_
-#define _GENERAL_H_
-
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/time.h>
-
-#ifdef _POSIX_SOURCE
-#undef _POSIX_SOURCE
-#endif
-
-#include <stdio.h>
-#include <signal.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <X11/X.h>
-#include <X11/Xlib.h>
-#include <X11/Xos.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/Xatom.h>
-
-#include <X11/extensions/shape.h>
-
-// True and False are defined in Xlib.h
-typedef char Boolean;
-
-#define NewString(x) (strdup(x))
-
-#ifndef SIGNAL_CALLBACK_TYPE
-#define SIGNAL_CALLBACK_TYPE (void (*)(int))
-#endif
-
-#define signal(x,y) \
- do { \
- struct sigaction sAct; \
- (void)sigemptyset(&sAct.sa_mask); \
- sAct.sa_flags = 0; \
- sAct.sa_handler = (SIGNAL_CALLBACK_TYPE(y)); \
- (void)sigaction((x), &sAct, NULL); \
- } while (0)
-
-#include "Config.h"
-
-class Atoms {
-public:
- static Atom wm_state;
- static Atom wm_changeState;
- static Atom wm_protocols;
- static Atom wm_delete;
- static Atom wm_takeFocus;
- static Atom wm_colormaps;
- static Atom wm2_running;
-};
-
-extern Boolean ignoreBadWindowErrors; // tidiness hack
-
-#endif
diff --git a/app/wm2/Imakefile b/app/wm2/Imakefile
deleted file mode 100644
index b737389a4..000000000
--- a/app/wm2/Imakefile
+++ /dev/null
@@ -1,10 +0,0 @@
-XCOMM $OpenBSD: Imakefile,v 1.1 2006/11/26 10:56:59 matthieu Exp $
- DEPLIBS = XkbClientDepLibs XawClientDepLibs
-LOCAL_LIBRARIES = XkbClientLibs XawClientLibs
-
-SRCS = Border.C Buttons.C Client.C Events.C Main.C Manager.C Rotated.C
-OBJS = Border.o Buttons.o Client.o Events.o Main.o Manager.o Rotated.o
-HEADERS = Border.h Client.h Cursors.h General.h Manager.h Rotated.h \
- listmacro2.h
-
-ComplexCplusplusProgramTarget(wm2)
diff --git a/app/wm2/Main.C b/app/wm2/Main.C
deleted file mode 100644
index b226c512d..000000000
--- a/app/wm2/Main.C
+++ /dev/null
@@ -1,20 +0,0 @@
-
-#include "Manager.h"
-
-#include "Client.h"
-#include "Border.h"
-
-int main(int argc, char **argv)
-{
- int i;
-
- if (argc > 1) {
- for (i = strlen(argv[0])-1; i > 0 && argv[0][i] != '/'; --i);
- fprintf(stderr, "usage: %s\n", argv[0] + (i > 0) + i);
- exit(2);
- }
-
- WindowManager manager;
- return 0;
-}
-
diff --git a/app/wm2/Makefile b/app/wm2/Makefile
deleted file mode 100644
index c9b7a9ac2..000000000
--- a/app/wm2/Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
-# $OpenBSD: Makefile,v 1.4 2007/04/09 10:43:05 matthieu Exp $
-.include <bsd.own.mk>
-X11BASE?= /usr/X11R6
-
-PROG= wm2
-SRCS= Border.C Buttons.C Client.C Events.C Main.C Manager.C Rotated.C
-
-CPPFLAGS+= -I${X11BASE}/include
-LDADD+= -L${X11BASE}/lib -lXext -lX11 -lXau -lXdmcp
-MANDIR= ${X11BASE}/man/cat
-
-obj: _xenocara_obj
-
-.include <bsd.prog.mk>
-.include <bsd.xorg.mk>
diff --git a/app/wm2/Manager.C b/app/wm2/Manager.C
deleted file mode 100644
index 04e6891fe..000000000
--- a/app/wm2/Manager.C
+++ /dev/null
@@ -1,565 +0,0 @@
-
-#include "Manager.h"
-#include "Client.h"
-#include <string.h>
-#include <X11/Xproto.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include "Cursors.h"
-
-Atom Atoms::wm_state;
-Atom Atoms::wm_changeState;
-Atom Atoms::wm_protocols;
-Atom Atoms::wm_delete;
-Atom Atoms::wm_takeFocus;
-Atom Atoms::wm_colormaps;
-Atom Atoms::wm2_running;
-
-int WindowManager::m_signalled = False;
-Boolean WindowManager::m_initialising = False;
-Boolean ignoreBadWindowErrors;
-
-const char *const WindowManager::m_menuCreateLabel = "New";
-
-implementPList(ClientList, Client);
-
-
-WindowManager::WindowManager() :
- m_menuGC(0), m_menuWindow(0), m_menuFont(0), m_focusChanging(False)
-{
- fprintf(stderr, "\nwm2: Copyright (c) 1996-7 Chris Cannam."
- " Fourth release, March 1997\n"
- " Parts derived from 9wm Copyright (c) 1994-96 David Hogan\n"
- " %s\n Copying and redistribution encouraged. "
- "No warranty.\n\n", XV_COPYRIGHT);
-
- if (CONFIG_AUTO_RAISE) {
- if (CONFIG_CLICK_TO_FOCUS) {
- fatal("can't have auto-raise-with-delay with click-to-focus");
- } else if (CONFIG_RAISE_ON_FOCUS) {
- fatal("can't have raise-on-focus AND auto-raise-with-delay");
- } else {
- fprintf(stderr, " Focus follows, auto-raise with delay. ");
- }
-
- } else {
- if (CONFIG_CLICK_TO_FOCUS) {
- if (CONFIG_RAISE_ON_FOCUS) {
- fprintf(stderr, " Click to focus. ");
- } else {
- fatal("can't have click-to-focus without raise-on-focus");
- }
- } else {
- if (CONFIG_RAISE_ON_FOCUS) {
- fprintf(stderr, " Focus follows, auto-raise. ");
- } else {
- fprintf(stderr, " Focus follows pointer. ");
- }
- }
- }
-
- if (CONFIG_EVERYTHING_ON_ROOT_MENU) {
- fprintf(stderr, "All clients on menu.\n");
- } else {
- fprintf(stderr, "Hidden clients only on menu.\n");
- }
-
- if (CONFIG_PROD_SHAPE) {
- fprintf(stderr, " Shape prodding on. ");
- } else {
- fprintf(stderr, " Shape prodding off. ");
- }
-
- fprintf(stderr, "\n (To reconfigure, simply edit and recompile.)\n\n");
-
- m_display = XOpenDisplay(NULL);
- if (!m_display) fatal("can't open display");
-
- m_shell = (char *)getenv("SHELL");
- if (!m_shell) m_shell = NewString("/bin/sh");
-
- m_initialising = True;
- XSetErrorHandler(errorHandler);
- ignoreBadWindowErrors = False;
-
- // 9wm does more, I think for nohup
- signal(SIGTERM, sigHandler);
- signal(SIGINT, sigHandler);
- signal(SIGHUP, sigHandler);
-
- m_currentTime = -1;
- m_activeClient = 0;
-
- Atoms::wm_state = XInternAtom(m_display, "WM_STATE", False);
- Atoms::wm_changeState= XInternAtom(m_display, "WM_CHANGE_STATE", False);
- Atoms::wm_protocols = XInternAtom(m_display, "WM_PROTOCOLS", False);
- Atoms::wm_delete = XInternAtom(m_display, "WM_DELETE_WINDOW", False);
- Atoms::wm_takeFocus = XInternAtom(m_display, "WM_TAKE_FOCUS", False);
- Atoms::wm_colormaps = XInternAtom(m_display, "WM_COLORMAP_WINDOWS", False);
- Atoms::wm2_running = XInternAtom(m_display, "_WM2_RUNNING", False);
-
- int dummy;
- if (!XShapeQueryExtension(m_display, &m_shapeEvent, &dummy))
- fatal("no shape extension, can't run without it");
-
- // we only cope with one screen!
- initialiseScreen();
-
- XSetSelectionOwner(m_display, Atoms::wm2_running,
- m_menuWindow, timestamp(True));
- XSync(m_display, False);
- m_initialising = False;
- m_returnCode = 0;
-
- clearFocus();
- scanInitialWindows();
- loop();
-}
-
-
-WindowManager::~WindowManager()
-{
- // empty
-}
-
-
-void WindowManager::release()
-{
- if (m_returnCode != 0) return; // hasty exit
-
- ClientList normalList, unparentList;
- Client *c;
- int i;
-
- for (i = 0; i < m_clients.count(); ++i) {
- c = m_clients.item(i);
-// fprintf(stderr, "client %d is %p\n", i, c);
-
- if (c->isNormal()) normalList.append(c);
- else unparentList.append(c);
- }
-
- for (i = normalList.count()-1; i >= 0; --i) {
- unparentList.append(normalList.item(i));
- }
-
- m_clients.remove_all();
-
- for (i = 0; i < unparentList.count(); ++i) {
-// fprintf(stderr, "unparenting client %p\n",unparentList.item(i));
- unparentList.item(i)->unreparent();
- unparentList.item(i)->release();
- unparentList.item(i) = 0;
- }
-
- XSetInputFocus(m_display, PointerRoot, RevertToPointerRoot,
- timestamp(False));
- installColormap(None);
-
- XFreeCursor(m_display, m_cursor);
- XFreeCursor(m_display, m_xCursor);
- XFreeCursor(m_display, m_vCursor);
- XFreeCursor(m_display, m_hCursor);
- XFreeCursor(m_display, m_vhCursor);
-
- XFreeFont(m_display, m_menuFont);
- XFreeGC(m_display, m_menuGC);
-
- XCloseDisplay(m_display);
-}
-
-
-void WindowManager::fatal(const char *message)
-{
- fprintf(stderr, "wm2: ");
- perror(message);
- fprintf(stderr, "\n");
- exit(1);
-}
-
-
-int WindowManager::errorHandler(Display *d, XErrorEvent *e)
-{
- if (m_initialising && (e->request_code == X_ChangeWindowAttributes) &&
- e->error_code == BadAccess) {
- fprintf(stderr, "wm2: another window manager running?\n");
- exit(1);
- }
-
- // ugh
- if (ignoreBadWindowErrors == True && e->error_code == BadWindow) return 0;
-
- char msg[100], number[30], request[100];
- XGetErrorText(d, e->error_code, msg, 100);
- snprintf(number, sizeof(number), "%d", e->request_code);
- XGetErrorDatabaseText(d, "XRequest", number, "", request, 100);
-
- if (request[0] == '\0') snprintf(request, sizeof(request),
- "<request-code-%d>", e->request_code);
-
- fprintf(stderr, "wm2: %s (0x%lx): %s\n", request, e->resourceid, msg);
-
- if (m_initialising) {
- fprintf(stderr, "wm2: failure during initialisation, abandoning\n");
- exit(1);
- }
-
- return 0;
-}
-
-
-static Cursor makeCursor(Display *d, Window w,
- unsigned char *bits, unsigned char *mask_bits,
- int width, int height, int xhot, int yhot,
- XColor *fg, XColor *bg)
-{
- Pixmap pixmap =
- XCreateBitmapFromData(d, w, (const char *)bits, width, height);
-
- Pixmap mask =
- XCreateBitmapFromData(d, w, (const char *)mask_bits, width, height);
-
- Cursor cursor = XCreatePixmapCursor(d, pixmap, mask, fg, bg, xhot, yhot);
- XFreePixmap(d, pixmap);
- XFreePixmap(d, mask);
-
- return cursor;
-}
-
-
-void WindowManager::initialiseScreen()
-{
- int i = 0;
- m_screenNumber = i;
-
- m_root = RootWindow(m_display, i);
- m_defaultColormap = DefaultColormap(m_display, i);
- m_minimumColormaps = MinCmapsOfScreen(ScreenOfDisplay(m_display, i));
-
- XColor black, white, temp;
-
- if (!XAllocNamedColor(m_display, m_defaultColormap, "black", &black, &temp))
- fatal("couldn't load colour \"black\"!");
- if (!XAllocNamedColor(m_display, m_defaultColormap, "white", &white, &temp))
- fatal("couldn't load colour \"white\"!");
-
- m_cursor = makeCursor
- (m_display, m_root, cursor_bits, cursor_mask_bits,
- cursor_width, cursor_height, cursor_x_hot,
- cursor_y_hot, &black, &white);
-
- m_xCursor = makeCursor
- (m_display, m_root, ninja_cross_bits, ninja_cross_mask_bits,
- ninja_cross_width, ninja_cross_height, ninja_cross_x_hot,
- ninja_cross_y_hot, &black, &white);
-
- m_hCursor = makeCursor
- (m_display, m_root, cursor_right_bits, cursor_right_mask_bits,
- cursor_right_width, cursor_right_height, cursor_right_x_hot,
- cursor_right_y_hot, &black, &white);
-
- m_vCursor = makeCursor
- (m_display, m_root, cursor_down_bits, cursor_down_mask_bits,
- cursor_down_width, cursor_down_height, cursor_down_x_hot,
- cursor_down_y_hot, &black, &white);
-
- m_vhCursor = makeCursor
- (m_display, m_root, cursor_down_right_bits, cursor_down_right_mask_bits,
- cursor_down_right_width, cursor_down_right_height,
- cursor_down_right_x_hot, cursor_down_right_y_hot, &black, &white);
-
- XSetWindowAttributes attr;
- attr.cursor = m_cursor;
- attr.event_mask = SubstructureRedirectMask | SubstructureNotifyMask |
- ColormapChangeMask | ButtonPressMask | ButtonReleaseMask |
- PropertyChangeMask;
- XChangeWindowAttributes(m_display, m_root, CWCursor | CWEventMask, &attr);
- XSync(m_display, False);
-
- m_menuForegroundPixel =
- allocateColour(CONFIG_MENU_FOREGROUND, "menu foreground");
- m_menuBackgroundPixel =
- allocateColour(CONFIG_MENU_BACKGROUND, "menu background");
- m_menuBorderPixel =
- allocateColour(CONFIG_MENU_BORDERS, "menu border");
-
- m_menuWindow = XCreateSimpleWindow
- (m_display, m_root, 0, 0, 1, 1, 1,
- m_menuBorderPixel, m_menuBackgroundPixel);
-
- if (DoesSaveUnders(ScreenOfDisplay(m_display, m_screenNumber))) {
- XSetWindowAttributes attr;
- attr.save_under = True;
- XChangeWindowAttributes(m_display, m_menuWindow, CWSaveUnder, &attr);
- }
-
- XGCValues values;
- values.background = m_menuBackgroundPixel;
- values.foreground = m_menuForegroundPixel ^ m_menuBackgroundPixel;
- values.function = GXxor;
- values.line_width = 0;
- values.subwindow_mode = IncludeInferiors;
-
- m_menuFont = XLoadQueryFont(display(), CONFIG_NICE_MENU_FONT);
- if (!m_menuFont) m_menuFont = XLoadQueryFont(display(),
- CONFIG_NASTY_FONT);
- if (!m_menuFont) fatal("couldn't load default menu font\n");
-
- values.font = m_menuFont->fid;
- m_menuGC = XCreateGC
- (display(), root(), GCForeground | GCBackground |
- GCFunction | GCLineWidth | GCSubwindowMode | GCFont, &values);
-}
-
-
-unsigned long WindowManager::allocateColour(char *name, char *desc)
-{
- XColor nearest, ideal;
-
- if (!XAllocNamedColor
- (display(), DefaultColormap(display(), m_screenNumber), name,
- &nearest, &ideal)) {
-
- char error[100];
- snprintf(error, sizeof(error), "couldn't load %s colour", desc);
- fatal(error);
-
- } else return nearest.pixel;
-}
-
-
-void WindowManager::installCursor(RootCursor c)
-{
- installCursorOnWindow(c, m_root);
-}
-
-
-void WindowManager::installCursorOnWindow(RootCursor c, Window w)
-{
- XSetWindowAttributes attr;
-
- switch (c) {
- case DeleteCursor: attr.cursor = m_xCursor; break;
- case DownCursor: attr.cursor = m_vCursor; break;
- case RightCursor: attr.cursor = m_hCursor; break;
- case DownrightCursor: attr.cursor = m_vhCursor; break;
- case NormalCursor: attr.cursor = m_cursor; break;
- }
-
- XChangeWindowAttributes(m_display, w, CWCursor, &attr);
-}
-
-
-Time WindowManager::timestamp(Boolean reset)
-{
- if (reset) m_currentTime = CurrentTime;
-
- if (m_currentTime == CurrentTime) {
-
- XEvent event;
- XChangeProperty(m_display, m_root, Atoms::wm2_running,
- Atoms::wm2_running, 8, PropModeAppend,
- (unsigned char *)"", 0);
- XMaskEvent(m_display, PropertyChangeMask, &event);
-
- m_currentTime = event.xproperty.time;
- }
-
- return m_currentTime;
-}
-
-void WindowManager::sigHandler(int)
-{
- m_signalled = True;
-}
-
-void WindowManager::scanInitialWindows()
-{
- unsigned int i, n;
- Window w1, w2, *wins;
- XWindowAttributes attr;
-
- XQueryTree(m_display, m_root, &w1, &w2, &wins, &n);
-
- for (i = 0; i < n; ++i) {
-
- XGetWindowAttributes(m_display, wins[i], &attr);
- if (attr.override_redirect || wins[i] == m_menuWindow) continue;
-
- (void)windowToClient(wins[i], True);
- }
-
- XFree((void *)wins);
-}
-
-Client *WindowManager::windowToClient(Window w, Boolean create)
-{
- if (w == 0) return 0;
-
- for (int i = m_clients.count()-1; i >= 0; --i) {
-
- if (m_clients.item(i)->hasWindow(w)) {
- return m_clients.item(i);
- }
- }
-
- if (!create) return 0;
- else {
- Client *newC = new Client(this, w);
- m_clients.append(newC);
- return newC;
- }
-}
-
-void WindowManager::installColormap(Colormap cmap)
-{
- if (cmap == None) {
- XInstallColormap(m_display, m_defaultColormap);
- } else {
- XInstallColormap(m_display, cmap);
- }
-}
-
-void WindowManager::clearFocus()
-{
- static Window w = 0;
- Client *active = activeClient();
-
- if (CONFIG_AUTO_RAISE || !CONFIG_CLICK_TO_FOCUS) {
- setActiveClient(0);
- return;
- }
-
- if (active) {
-
- setActiveClient(0);
- active->deactivate();
-
- for (Client *c = active->revertTo(); c; c = c->revertTo()) {
- if (c->isNormal()) {
- c->activate();
- return;
- }
- }
-
- installColormap(None);
- }
-
- if (w == 0) {
-
- XSetWindowAttributes attr;
- int mask = CWOverrideRedirect;
- attr.override_redirect = 1;
-
- w = XCreateWindow(display(), root(), 0, 0, 1, 1, 0,
- CopyFromParent, InputOnly, CopyFromParent,
- mask, &attr);
-
- XMapWindow(display(), w);
- }
-
- XSetInputFocus(display(), w, RevertToPointerRoot, timestamp(False));
-}
-
-
-void WindowManager::skipInRevert(Client *c, Client *myRevert)
-{
- for (int i = 0; i < m_clients.count(); ++i) {
- if (m_clients.item(i) != c &&
- m_clients.item(i)->revertTo() == c) {
- m_clients.item(i)->setRevertTo(myRevert);
- }
- }
-}
-
-
-void WindowManager::addToHiddenList(Client *c)
-{
- for (int i = 0; i < m_hiddenClients.count(); ++i) {
- if (m_hiddenClients.item(i) == c) return;
- }
-
- m_hiddenClients.append(c);
-}
-
-
-void WindowManager::removeFromHiddenList(Client *c)
-{
- for (int i = 0; i < m_hiddenClients.count(); ++i) {
- if (m_hiddenClients.item(i) == c) {
- m_hiddenClients.remove(i);
- return;
- }
- }
-}
-
-
-Boolean WindowManager::raiseTransients(Client *c)
-{
- Client *first = 0;
-
- if (!c->isNormal()) return False;
-
- for (int i = 0; i < m_clients.count(); ++i) {
-
- if (m_clients.item(i)->isNormal() &&
- m_clients.item(i)->isTransient()) {
-
- if (c->hasWindow(m_clients.item(i)->transientFor())) {
-
- if (!first) first = m_clients.item(i);
- else m_clients.item(i)->mapRaised();
- }
- }
- }
-
- if (first) {
- first->mapRaised();
- return True;
- } else {
- return False;
- }
-}
-
-
-void WindowManager::spawn()
-{
- // strange code thieved from 9wm to avoid leaving zombies
-
- char *displayName = DisplayString(m_display);
-
- if (fork() == 0) {
- if (fork() == 0) {
-
- close(ConnectionNumber(m_display));
-
- // if you don't have putenv, miss out this next
- // conditional and its contents
-
- if (displayName && (displayName[0] != '\0')) {
-
- char *pstring;
- asprintf(&pstring, "DISPLAY=%s", displayName);
- putenv(pstring);
- }
-
- if (CONFIG_EXEC_USING_SHELL) {
- execl(m_shell, m_shell, "-c", CONFIG_NEW_WINDOW_COMMAND, 0);
- fprintf(stderr, "wm2: exec %s", m_shell);
- perror(" failed");
- }
-
- execlp(CONFIG_NEW_WINDOW_COMMAND, CONFIG_NEW_WINDOW_COMMAND, 0);
- fprintf(stderr, "wm2: exec %s", CONFIG_NEW_WINDOW_COMMAND);
- perror(" failed");
-
- execlp("xterm", "xterm", "-ut", 0);
- perror("wm2: exec xterm failed");
- exit(1);
- }
- exit(0);
- }
- wait((int *) 0);
-}
-
-
diff --git a/app/wm2/Manager.h b/app/wm2/Manager.h
deleted file mode 100644
index 1e6dfb6ae..000000000
--- a/app/wm2/Manager.h
+++ /dev/null
@@ -1,131 +0,0 @@
-
-#ifndef _MANAGER_H_
-#define _MANAGER_H_
-
-#include "General.h"
-#include "listmacro2.h"
-
-class Client;
-declarePList(ClientList, Client);
-
-
-class WindowManager {
-public:
- WindowManager();
- ~WindowManager();
-
- void fatal(const char *);
-
- // for call from Client and within:
-
- Client *windowToClient(Window, Boolean create = False);
- Client *activeClient() { return m_activeClient; }
- Boolean raiseTransients(Client *); // true if raised any
- Time timestamp(Boolean reset);
- void clearFocus();
-
- void setActiveClient(Client *const c) { m_activeClient = c; }
-
- void addToHiddenList(Client *);
- void removeFromHiddenList(Client *);
- void skipInRevert(Client *, Client *);
-
- Display *display() { return m_display; }
- Window root() { return m_root; }
-
- enum RootCursor {
- NormalCursor, DeleteCursor, DownCursor, RightCursor, DownrightCursor
- };
-
- void installCursor(RootCursor);
- void installCursorOnWindow(RootCursor, Window);
- void installColormap(Colormap);
- unsigned long allocateColour(char *, char *);
-
- void considerFocusChange(Client *, Window, Time timestamp);
- void stopConsideringFocus();
-
- // shouldn't really be public
- int attemptGrab(Window, Window, int, int);
- void releaseGrab(XButtonEvent *);
- void eventExposure(XExposeEvent *); // for exposures during client grab
- void showGeometry(int, int);
- void removeGeometry();
-
-private:
- int loop();
- void release();
-
- Display *m_display;
- int m_screenNumber;
-
- Window m_root;
-
- Colormap m_defaultColormap;
- int m_minimumColormaps;
-
- Cursor m_cursor;
- Cursor m_xCursor;
- Cursor m_vCursor;
- Cursor m_hCursor;
- Cursor m_vhCursor;
-
- char *m_terminal;
- char *m_shell;
-
- ClientList m_clients;
- ClientList m_hiddenClients;
- Client *m_activeClient;
-
- int m_shapeEvent;
- int m_currentTime;
-
- Boolean m_looping;
- int m_returnCode;
-
- static Boolean m_initialising;
- static int errorHandler(Display *, XErrorEvent *);
- static void sigHandler(int);
- static int m_signalled;
-
- void initialiseScreen();
- void scanInitialWindows();
-
- GC m_menuGC;
- Window m_menuWindow;
- XFontStruct *m_menuFont;
- unsigned long m_menuForegroundPixel;
- unsigned long m_menuBackgroundPixel;
- unsigned long m_menuBorderPixel;
- static const char *const m_menuCreateLabel;
- const char *const menuLabel(int);
- void menu(XButtonEvent *);
- void spawn();
- void circulate(Boolean activeFirst);
-
- Boolean m_focusChanging; // checking times for focus change
- Client *m_focusCandidate;
- Window m_focusCandidateWindow;
- Time m_focusTimestamp; // time of last crossing event
- Boolean m_focusPointerMoved;
- Boolean m_focusPointerNowStill;
- void checkDelaysForFocus();
-
- void nextEvent(XEvent *); // return
-
- void eventButton(XButtonEvent *);
- void eventMapRequest(XMapRequestEvent *);
- void eventConfigureRequest(XConfigureRequestEvent *);
- void eventUnmap(XUnmapEvent *);
- void eventCreate(XCreateWindowEvent *);
- void eventDestroy(XDestroyWindowEvent *);
- void eventClient(XClientMessageEvent *);
- void eventColormap(XColormapEvent *);
- void eventProperty(XPropertyEvent *);
- void eventEnter(XCrossingEvent *);
- void eventReparent(XReparentEvent *);
- void eventFocusIn(XFocusInEvent *);
-};
-
-#endif
-
diff --git a/app/wm2/README b/app/wm2/README
deleted file mode 100644
index 3b1969fed..000000000
--- a/app/wm2/README
+++ /dev/null
@@ -1,174 +0,0 @@
-
-wm2 -- a window manager
-=======================
-
-wm2 is a window manager for X. It provides an unusual style of window
-decoration and as little functionality as I feel comfortable with in a
-window manager. wm2 is not configurable, except by editing the source
-and recompiling the code, and is really intended for people who don't
-particularly want their window manager to be too friendly.
-
-wm2 provides:
-
- -- Decorative frames for your windows.
-
- -- The ability to move, resize, hide and restore windows.
-
- -- No icons.
-
- -- No configurable root menus, buttons or mouse or keyboard bindings.
-
- -- No virtual desktop, toolbars or integrated applications.
-
-
-This release
-============
-
-This is the fourth release of wm2, made in March 1997. It differs in
-some ways from the first, second and third releases.
-
-
-Building wm2
-============
-
-You will need a Unix machine, X libraries and a C++ compiler such as
-gcc. You will also need a mouse, with at least one button. Your X
-server and libraries must be R4 or newer and must support the Shape
-extension. wm2 does NOT support multi-screen displays, because I
-don't have anything to test multi-screen code on.
-
-wm2 makes relatively heavy demands on the performance of your X
-server, because of the use of shaped windows, but it shouldn't place
-too much of a load on other aspects of your system.
-
-Inspect the file Config.h. If any of the settings (fonts, colours and
-"xterm" application name) in this file are unlikely to work with your
-system, change them. Ensure that CONFIG_NASTY_FONT is set to
-something which is unlikely not to be found.
-
-Edit the Makefile to suit the requirements of your system, and run
-"make depend" followed by "make". This should build wm2. On certain
-systems you may need to edit the source to overcome problems with the
-location of non-POSIX functions such as putenv() and select().
-
-
-Using wm2
-=========
-
-To run wm2, make sure you're not already running a window manager,
-make sure the DISPLAY variable is correctly set, and then execute the
-file "wm2". There are no command-line options or X resources, and
-there is no start-up file. If your X server doesn't support the Shape
-extension, wm2 will exit (and will never work on your server); if it
-can't find the required fonts or allocate the required colours, it
-will also exit (but you should be able to fix this by changing the
-definitions in Config.h and recompiling).
-
-Available window manipulations are:
-
- -- To focus a window: depends on the focus policy you selected
- in Config.h before compiling. See "Focus policy", below.
-
- -- To raise a window: click on its tab or frame, unless you have
- auto-raise on focus set in Config.h.
-
- -- To move a window: make sure it's in focus, then click and drag
- on its tab.
-
- -- To hide a window: make sure it's in focus, then click on the
- button at the top of its tab.
-
- -- To recover a hidden window: click left button on the root
- window for the root menu, and choose the window you want.
-
- -- To start a new xterm: use the first item on root menu ("New").
-
- -- To delete a window: make sure it's in focus, click on the
- button on the tab, hold the mouse button for at least a
- second and a half until the cursor changes to a cross, then
- release. (I know, it's not very easy. On the other hand,
- things like Windows-95 tend to obscure the fact that most
- windows already have a perfectly good Close option. If the
- default delay doesn't suit you, change it in Config.h and
- recompile.)
-
- -- To resize a window: make sure it's in focus, then click and
- drag on its bottom-right corner. For a constrained resize,
- click and drag on the bottom-left or top-right corner of
- the enclosing window frame.
-
- -- To flip around amongst the windows on-screen: click with the right
- mouse button on the root window or on any window's frame or tab.
-
- -- To exit from wm2: move the mouse pointer to the very edge of the
- screen at the extreme lower-right corner, and click left button on
- the root window for the root menu. The menu should have an extra
- option labelled "Exit wm2"; select this.
-
-All move and resize operations are opaque.
-
-
-Focus policy
-============
-
-Config.h contains settings for focus policy. There are three things
-you can define to either True or False: CONFIG_CLICK_TO_FOCUS,
-CONFIG_RAISE_ON_FOCUS and CONFIG_AUTO_RAISE. The first two are
-connected: together they define a focus policy. The third is a
-separate focus policy on its own and will only work if the first two
-are both False. CONFIG_AUTO_RAISE differs from
-(!CONFIG_CLICK_TO_FOCUS && CONFIG_RAISE_ON_FOCUS) only in that it
-provides a short delay before raising each window. The delay is also
-definable in Config.h.
-
-
-Pixmaps
-=======
-
-This fourth release of wm2 no longer supports frame background
-pixmaps. If you want them, consider using wmx (available from the
-same place as wm2) instead.
-
-
-xterm
-=====
-
-Some versions of xterm and rxvt run badly with wm2. If you use xterm
-and find that it refreshes the window excessively slowly, you might
-like to try experimenting with a different terminal emulation program.
-I think it might help to ensure that the scrollbar is on the
-right-hand side of the rxvt window and is thick enough that wmx's
-resize handle doesn't obscure any of the text area.
-
-
-Credits
-=======
-
-wm2 was written by Chris Cannam, recycling a lot of code and structure
-from "9wm" by David Hogan (see http://www.cs.su.oz.au/~dhog/ ). 9wm
-is written in C, so very little of the code is used verbatim, but the
-intention was to reuse and a lot of the resulting code is
-recognisable. (Also 9wm's minimalism was rather inspiring.) I've
-made enough changes to make it very probable that any bugs you find
-will be my fault rather than David's.
-
-wm2 also uses version 2.0 of Alan Richardson's "xvertext"
-font-rotation routines.
-
-The sideways tabs on the window frames were Andy Green's idea.
-
-If you want to hack the code into something else for your own
-amusement, please go ahead. Feel free to modify and redistribute, as
-long as you retain the original copyrights as appropriate.
-
-
-Bugs
-====
-
-The principal bug is that wm2 now has too many features. That aside,
-if you find a bug, please report it to me (preferably with a fix).
-
-
-
-Chris Cannam, cannam@zands.demon.co.uk
-October 1996
diff --git a/app/wm2/Rotated.C b/app/wm2/Rotated.C
deleted file mode 100644
index e65504800..000000000
--- a/app/wm2/Rotated.C
+++ /dev/null
@@ -1,623 +0,0 @@
-/* ********************************************************************** */
-
-/* xvertext, Copyright (c) 1992 Alan Richardson (mppa3@uk.ac.sussex.syma)
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both the
- * copyright notice and this permission notice appear in supporting
- * documentation. All work developed as a consequence of the use of
- * this program should duly acknowledge such use. No representations are
- * made about the suitability of this software for any purpose. It is
- * provided "as is" without express or implied warranty.
- */
-
-/* ********************************************************************** */
-
-
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include "Rotated.h"
-
-
-/* ---------------------------------------------------------------------- */
-
-
-int xv_errno;
-
-static char *my_strdup(char *);
-static char *my_strtok(char *, char *);
-
-
-/* ---------------------------------------------------------------------- */
-
-
-/* *** Routine to mimic `strdup()' (some machines don't have it) *** */
-
-static char *my_strdup(char *str)
-{
- char *s;
- size_t len;
-
- if (str == NULL) return NULL;
-
- len = strlen(str) + 1;
- s = (char *)malloc(len);
- /* this error is highly unlikely ... */
- if (s == NULL) {
- fprintf(stderr, "Fatal error: my_strdup(): Couldn't do malloc (gulp!)\n");
- exit(1);
- }
-
- strlcpy(s, str, len);
- return s;
-}
-
-
-/* ---------------------------------------------------------------------- */
-
-
-/* *** Routine to replace `strtok' : this one returns a zero
- length string if it encounters two consecutive delimiters *** */
-
-static char *my_strtok(char *str1, char *str2)
-{
- char *ret;
- int i, j, stop;
- static int start, len;
- static char *stext;
-
- /* this error should never occur ... */
- if (str2 == NULL) {
- fprintf(stderr,
- "Fatal error: my_strtok(): recieved null delimiter string\n");
- exit(1);
- }
-
- /* initialise if str1 not NULL ... */
- if (str1 != NULL) {
- start = 0;
- stext = str1;
- len = strlen(str1);
- }
-
- /* run out of tokens ? ... */
- if (start >= len) return NULL;
-
- /* loop through characters ... */
- for (i = start; i < len; i++) {
-
- /* loop through delimiters ... */
- stop = 0;
- for (j = 0; j < strlen(str2); j++)
- if (stext[i] == str2[j]) stop = 1;
-
- if (stop) break;
- }
-
- stext[i] = '\0';
- ret = stext + start;
- start = i+1;
-
- return ret;
-}
-
-
-/* ---------------------------------------------------------------------- */
-
-
-/* *** Routine to return version/copyright information *** */
-
-float XRotVersion(char *str, int n)
-{
- if (str != NULL) strncpy(str, XV_COPYRIGHT, n);
- return XV_VERSION;
-}
-
-
-/* ---------------------------------------------------------------------- */
-
-
-/* *** Load the rotated version of a given font *** */
-
-XRotFontStruct *XRotLoadFont(Display *dpy, char *fontname, float angle)
-{
- char val;
- XImage *I1, *I2;
- Pixmap canvas;
- Window root;
- int screen;
- GC font_gc;
- char text[3];/*, errstr[300];*/
- XFontStruct *fontstruct;
- XRotFontStruct *rotfont;
- int ichar, i, j, index, boxlen = 60, dir;
- int vert_w, vert_h, vert_len, bit_w, bit_h, bit_len;
- int min_char, max_char;
- unsigned char *vertdata, *bitdata;
- int ascent, descent, lbearing, rbearing;
- int on = 1, off = 0;
-
- /* make angle positive ... */
- if (angle < 0) do angle += 360; while (angle < 0);
-
- /* get nearest vertical or horizontal direction ... */
- dir = (int)((angle+45.)/90.)%4;
-
- /* useful macros ... */
- screen = DefaultScreen(dpy);
- root = DefaultRootWindow(dpy);
-
- /* create the depth 1 canvas bitmap ... */
- canvas = XCreatePixmap(dpy, root, boxlen, boxlen, 1);
-
- /* create a GC ... */
- font_gc = XCreateGC(dpy, canvas, 0, 0);
- XSetBackground(dpy, font_gc, off);
-
- /* load the font ... */
- fontstruct = XLoadQueryFont(dpy, fontname);
- if (fontstruct == NULL) {
- xv_errno = XV_NOFONT;
- return NULL;
- }
-
- XSetFont(dpy, font_gc, fontstruct->fid);
-
- /* allocate space for rotated font ... */
- rotfont = (XRotFontStruct *)malloc((unsigned)sizeof(XRotFontStruct));
- if (rotfont == NULL) {
- xv_errno = XV_NOMEM;
- return NULL;
- }
-
- /* determine which characters are defined in font ... */
- min_char = fontstruct->min_char_or_byte2;
- max_char = fontstruct->max_char_or_byte2;
-
- /* we only want printing characters ... */
- if (min_char<32) min_char = 32;
- if (max_char>126) max_char = 126;
-
- /* some overall font data ... */
- rotfont->name = my_strdup(fontname);
- rotfont->dir = dir;
- rotfont->min_char = min_char;
- rotfont->max_char = max_char;
- rotfont->max_ascent = fontstruct->max_bounds.ascent;
- rotfont->max_descent = fontstruct->max_bounds.descent;
- rotfont->height = rotfont->max_ascent+rotfont->max_descent;
-
- /* remember xfontstruct for `normal' text ... */
- if (dir == 0) rotfont->xfontstruct = fontstruct;
-
- else {
- /* font needs rotation ... */
- /* loop through each character ... */
- for (ichar = min_char; ichar <= max_char; ichar++) {
-
- index = ichar-fontstruct->min_char_or_byte2;
-
- /* per char dimensions ... */
- ascent = rotfont->per_char[ichar-32].ascent =
- fontstruct->per_char[index].ascent;
- descent = rotfont->per_char[ichar-32].descent =
- fontstruct->per_char[index].descent;
- lbearing = rotfont->per_char[ichar-32].lbearing =
- fontstruct->per_char[index].lbearing;
- rbearing = rotfont->per_char[ichar-32].rbearing =
- fontstruct->per_char[index].rbearing;
- rotfont->per_char[ichar-32].width =
- fontstruct->per_char[index].width;
-
- /* some space chars have zero body, but a bitmap can't have ... */
- if (!ascent && !descent)
- ascent = rotfont->per_char[ichar-32].ascent = 1;
- if (!lbearing && !rbearing)
- rbearing = rotfont->per_char[ichar-32].rbearing = 1;
-
- /* glyph width and height when vertical ... */
- vert_w = rbearing-lbearing;
- vert_h = ascent+descent;
-
- /* width in bytes ... */
- vert_len = (vert_w-1)/8+1;
-
- XSetForeground(dpy, font_gc, off);
- XFillRectangle(dpy, canvas, font_gc, 0, 0, boxlen, boxlen);
-
- /* draw the character centre top right on canvas ... */
- snprintf(text, sizeof(text), "%c", ichar);
- XSetForeground(dpy, font_gc, on);
- XDrawImageString(dpy, canvas, font_gc, boxlen/2 - lbearing,
- boxlen/2 - descent, text, 1);
-
- /* reserve memory for first XImage ... */
- vertdata = (unsigned char *) malloc((unsigned)(vert_len*vert_h));
- if (vertdata == NULL) {
- xv_errno = XV_NOMEM;
- return NULL;
- }
-
- /* create the XImage ... */
- I1 = XCreateImage(dpy, DefaultVisual(dpy, screen), 1, XYBitmap,
- 0, (char *)vertdata, vert_w, vert_h, 8, 0);
-
- if (I1 == NULL) {
- xv_errno = XV_NOXIMAGE;
- return NULL;
- }
-
- I1->byte_order = I1->bitmap_bit_order = MSBFirst;
-
- /* extract character from canvas ... */
- XGetSubImage(dpy, canvas, boxlen/2, boxlen/2-vert_h,
- vert_w, vert_h, 1, XYPixmap, I1, 0, 0);
- I1->format = XYBitmap;
-
- /* width, height of rotated character ... */
- if (dir == 2) {
- bit_w = vert_w;
- bit_h = vert_h;
- } else {
- bit_w = vert_h;
- bit_h = vert_w;
- }
-
- /* width in bytes ... */
- bit_len = (bit_w-1)/8 + 1;
-
- rotfont->per_char[ichar-32].glyph.bit_w = bit_w;
- rotfont->per_char[ichar-32].glyph.bit_h = bit_h;
-
- /* reserve memory for the rotated image ... */
- bitdata = (unsigned char *)calloc((unsigned)(bit_h*bit_len), 1);
- if (bitdata == NULL) {
- xv_errno = XV_NOMEM;
- return NULL;
- }
-
- /* create the image ... */
- I2 = XCreateImage(dpy, DefaultVisual(dpy, screen), 1, XYBitmap, 0,
- (char *)bitdata, bit_w, bit_h, 8, 0);
-
- if (I2 == NULL) {
- xv_errno = XV_NOXIMAGE;
- return NULL;
- }
-
- I2->byte_order = I2->bitmap_bit_order = MSBFirst;
-
- /* map vertical data to rotated character ... */
- for (j = 0; j < bit_h; j++) {
- for (i = 0; i < bit_w; i++) {
- /* map bits ... */
- if (dir == 1)
- val = vertdata[i*vert_len + (vert_w-j-1)/8] &
- (128>>((vert_w-j-1)%8));
-
- else if (dir == 2)
- val = vertdata[(vert_h-j-1)*vert_len + (vert_w-i-1)/8] &
- (128>>((vert_w-i-1)%8));
-
- else
- val = vertdata[(vert_h-i-1)*vert_len + j/8] &
- (128>>(j%8));
-
- if (val)
- bitdata[j*bit_len + i/8] = bitdata[j*bit_len + i/8] |
- (128>>(i%8));
- }
- }
-
- /* create this character's bitmap ... */
- rotfont->per_char[ichar-32].glyph.bm =
- XCreatePixmap(dpy, root, bit_w, bit_h, 1);
-
- /* put the image into the bitmap ... */
- XPutImage(dpy, rotfont->per_char[ichar-32].glyph.bm,
- font_gc, I2, 0, 0, 0, 0, bit_w, bit_h);
-
- /* free the image and data ... */
- XDestroyImage(I1);
- XDestroyImage(I2);
- /* free((char *)bitdata); -- XDestroyImage does this
- free((char *)vertdata);*/
- }
-
- XFreeFont(dpy, fontstruct);
- }
-
- /* free pixmap and GC ... */
- XFreePixmap(dpy, canvas);
- XFreeGC(dpy, font_gc);
-
- return rotfont;
-}
-
-
-/* ---------------------------------------------------------------------- */
-
-
-/* *** Free the resources associated with a rotated font *** */
-
-void XRotUnloadFont(Display *dpy, XRotFontStruct *rotfont)
-{
- int ichar;
-
- if (rotfont->dir == 0) XFreeFont(dpy, rotfont->xfontstruct);
-
- else
- /* loop through each character, freeing its pixmap ... */
- for (ichar = rotfont->min_char-32; ichar <= rotfont->max_char-32; ichar++)
- XFreePixmap(dpy, rotfont->per_char[ichar].glyph.bm);
-
- /* rotfont should never be referenced again ... */
- free((char *)rotfont->name);
- free((char *)rotfont);
-}
-
-
-/* ---------------------------------------------------------------------- */
-
-
-/* *** Return the width of a string *** */
-
-int XRotTextWidth(XRotFontStruct *rotfont, char *str, int len)
-{
- int i, width = 0, ichar;
-
- if (str == NULL) return 0;
-
- if (rotfont->dir == 0)
- width = XTextWidth(rotfont->xfontstruct, str, strlen(str));
-
- else
- for (i = 0; i<len; i++) {
- ichar = str[i]-32;
-
- /* make sure it's a printing character ... */
- if (ichar >= 0 && ichar<95)
- width += rotfont->per_char[ichar].width;
- }
-
- return width;
-}
-
-
-/* ---------------------------------------------------------------------- */
-
-
-/* *** A front end to XRotPaintString : mimics XDrawString *** */
-
-void XRotDrawString(Display *dpy, XRotFontStruct *rotfont, Drawable drawable,
- GC gc, int x, int y, char *str, int len)
-{
- static GC my_gc = 0;
- int i, xp, yp, dir, ichar;
-
- if (str == NULL || len<1) return;
-
- dir = rotfont->dir;
- if (my_gc == 0) my_gc = XCreateGC(dpy, drawable, 0, 0);
-
- XCopyGC(dpy, gc, GCForeground|GCBackground, my_gc);
-
- /* a horizontal string is easy ... */
- if (dir == 0) {
- XSetFillStyle(dpy, my_gc, FillSolid);
- XSetFont(dpy, my_gc, rotfont->xfontstruct->fid);
- XDrawString(dpy, drawable, my_gc, x, y, str, len);
- return;
- }
-
- /* vertical or upside down ... */
-
- XSetFillStyle(dpy, my_gc, FillStippled);
-
- /* loop through each character in string ... */
- for (i = 0; i<len; i++) {
- ichar = str[i]-32;
-
- /* make sure it's a printing character ... */
- if (ichar >= 0 && ichar<95) {
- /* suitable offset ... */
- if (dir == 1) {
- xp = x-rotfont->per_char[ichar].ascent;
- yp = y-rotfont->per_char[ichar].rbearing;
- }
- else if (dir == 2) {
- xp = x-rotfont->per_char[ichar].rbearing;
- yp = y-rotfont->per_char[ichar].descent+1;
- }
- else {
- xp = x-rotfont->per_char[ichar].descent+1;
- yp = y+rotfont->per_char[ichar].lbearing;
- }
-
- /* draw the glyph ... */
- XSetStipple(dpy, my_gc, rotfont->per_char[ichar].glyph.bm);
-
- XSetTSOrigin(dpy, my_gc, xp, yp);
-
- XFillRectangle(dpy, drawable, my_gc, xp, yp,
- rotfont->per_char[ichar].glyph.bit_w,
- rotfont->per_char[ichar].glyph.bit_h);
-
- /* advance position ... */
- if (dir == 1)
- y -= rotfont->per_char[ichar].width;
- else if (dir == 2)
- x -= rotfont->per_char[ichar].width;
- else
- y += rotfont->per_char[ichar].width;
- }
- }
-}
-
-
-
-/* ---------------------------------------------------------------------- */
-
-
-/* *** A front end to XRotPaintAlignedString : uses XRotDrawString *** */
-
-void XRotDrawAlignedString(Display *dpy, XRotFontStruct *rotfont,
- Drawable drawable, GC gc, int x, int y,
- char *text, int align)
-{
- int xp = 0, yp = 0, dir;
- int i, nl = 1, max_width = 0, this_width;
- char *str1, *str2 = "\n\0", *str3;
-
- if (text == NULL)
- return;
-
- dir = rotfont->dir;
-
- /* count number of sections in string ... */
- for (i = 0; i<strlen(text); i++)
- if (text[i] == '\n')
- nl++;
-
- /* find width of longest section ... */
- str1 = my_strdup(text);
- str3 = my_strtok(str1, str2);
- max_width = XRotTextWidth(rotfont, str3, strlen(str3));
-
- do {
- str3 = my_strtok((char *)NULL, str2);
- if (str3 != NULL)
- if (XRotTextWidth(rotfont, str3, strlen(str3))>max_width)
- max_width = XRotTextWidth(rotfont, str3, strlen(str3));
- }
- while (str3 != NULL);
-
- /* calculate vertical starting point according to alignment policy and
- rotation angle ... */
- if (dir == 0) {
- if (align == TLEFT || align == TCENTRE || align == TRIGHT)
- yp = y+rotfont->max_ascent;
-
- else if (align == BLEFT || align == BCENTRE || align == BRIGHT)
- yp = y-(nl-1)*rotfont->height - rotfont->max_descent;
-
- else
- yp = y-(nl-1)/2*rotfont->height + rotfont->max_ascent -
- rotfont->height/2 - ((nl%2 == 0)?rotfont->height/2:0);
- }
-
- else if (dir == 1) {
- if (align == TLEFT || align == TCENTRE || align == TRIGHT)
- xp = x+rotfont->max_ascent;
-
- else if (align == BLEFT || align == BCENTRE || align == BRIGHT)
- xp = x-(nl-1)*rotfont->height - rotfont->max_descent;
-
- else
- xp = x-(nl-1)/2*rotfont->height + rotfont->max_ascent -
- rotfont->height/2 - ((nl%2 == 0)?rotfont->height/2:0);
- }
-
- else if (dir == 2) {
- if (align == TLEFT || align == TCENTRE || align == TRIGHT)
- yp = y-rotfont->max_ascent;
-
- else if (align == BLEFT || align == BCENTRE || align == BRIGHT)
- yp = y+(nl-1)*rotfont->height + rotfont->max_descent;
-
- else
- yp = y+(nl-1)/2*rotfont->height - rotfont->max_ascent +
- rotfont->height/2 + ((nl%2 == 0)?rotfont->height/2:0);
- }
-
- else {
- if (align == TLEFT || align == TCENTRE || align == TRIGHT)
- xp = x-rotfont->max_ascent;
-
- else if (align == BLEFT || align == BCENTRE || align == BRIGHT)
- xp = x+(nl-1)*rotfont->height + rotfont->max_descent;
-
- else
- xp = x+(nl-1)/2*rotfont->height - rotfont->max_ascent +
- rotfont->height/2 + ((nl%2 == 0)?rotfont->height/2:0);
- }
-
- free(str1);
- str1 = my_strdup(text);
- str3 = my_strtok(str1, str2);
-
- /* loop through each section in the string ... */
- do {
- /* width of this section ... */
- this_width = XRotTextWidth(rotfont, str3, strlen(str3));
-
- /* horizontal alignment ... */
- if (dir == 0) {
- if (align == TLEFT || align == MLEFT || align == BLEFT)
- xp = x;
-
- else if (align == TCENTRE || align == MCENTRE || align == BCENTRE)
- xp = x-this_width/2;
-
- else
- xp = x-max_width;
- }
-
- else if (dir == 1) {
- if (align == TLEFT || align == MLEFT || align == BLEFT)
- yp = y;
-
- else if (align == TCENTRE || align == MCENTRE || align == BCENTRE)
- yp = y+this_width/2;
-
- else
- yp = y+max_width;
- }
-
- else if (dir == 2) {
- if (align == TLEFT || align == MLEFT || align == BLEFT)
- xp = x;
-
- else if (align == TCENTRE || align == MCENTRE || align == BCENTRE)
- xp = x+this_width/2;
-
- else
- xp = x+max_width;
- }
-
- else {
- if (align == TLEFT || align == MLEFT || align == BLEFT)
- yp = y;
-
- else if (align == TCENTRE || align == MCENTRE || align == BCENTRE)
- yp = y-this_width/2;
-
- else
- yp = y-max_width;
- }
-
- /* draw the section ... */
- XRotDrawString(dpy, rotfont, drawable, gc, xp, yp,
- str3, strlen(str3));
-
- str3 = my_strtok((char *)NULL, str2);
-
- /* advance position ... */
- if (dir == 0)
- yp += rotfont->height;
- else if (dir == 1)
- xp += rotfont->height;
- else if (dir == 2)
- yp -= rotfont->height;
- else
- xp -= rotfont->height;
- }
- while (str3 != NULL);
-
- free(str1);
-}
-
diff --git a/app/wm2/Rotated.h b/app/wm2/Rotated.h
deleted file mode 100644
index a3be0a875..000000000
--- a/app/wm2/Rotated.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/* ************************************************************************ */
-
-
-/* Header file for the `xvertext' routines.
-
- Copyright (c) 1992 Alan Richardson (mppa3@uk.ac.sussex.syma) */
-
-
-/* ************************************************************************ */
-
-
-#ifndef _XVERTEXT_INCLUDED_
-#define _XVERTEXT_INCLUDED_
-
-
-#define XV_VERSION 2.0
-#define XV_COPYRIGHT "xvertext routines Copyright (c) 1992 Alan Richardson"
-
-
-/* ---------------------------------------------------------------------- */
-
-
-/* *** The font structures *** */
-
-struct BitmapStruct {
- int bit_w;
- int bit_h;
-
- Pixmap bm;
-};
-
-struct XRotCharStruct {
- int ascent;
- int descent;
- int lbearing;
- int rbearing;
- int width;
-
- BitmapStruct glyph;
-};
-
-struct XRotFontStruct {
- int dir;
- int height;
- int max_ascent;
- int max_descent;
- int max_char;
- int min_char;
- char *name;
-
- XFontStruct *xfontstruct;
-
- XRotCharStruct per_char[95];
-};
-
-
-/* ---------------------------------------------------------------------- */
-
-
-extern float XRotVersion(char *, int);
-extern XRotFontStruct *XRotLoadFont(Display *, char *, float);
-extern void XRotUnloadFont(Display *, XRotFontStruct *);
-extern int XRotTextWidth(XRotFontStruct *, char *, int);
-extern void XRotDrawString(Display *, XRotFontStruct *, Drawable, GC,
- int, int, char *, int);
-extern void XRotDrawAlignedString(Display *, XRotFontStruct *, Drawable, GC,
- int, int, char *, int);
-
-
-/* ---------------------------------------------------------------------- */
-
-
-#define TLEFT 1
-#define TCENTRE 2
-#define TRIGHT 3
-#define MLEFT 4
-#define MCENTRE 5
-#define MRIGHT 6
-#define BLEFT 7
-#define BCENTRE 8
-#define BRIGHT 9
-
-
-/* ---------------------------------------------------------------------- */
-
-
-extern int xv_errno;
-
-#define XV_NOFONT 1 /* no such font on X server */
-#define XV_NOMEM 2 /* couldn't do malloc */
-#define XV_NOXIMAGE 3 /* couldn't create an XImage */
-
-
-/* ---------------------------------------------------------------------- */
-
-
-#else
-
-extern int xv_errno;
-
-#endif
diff --git a/app/wm2/listmacro2.h b/app/wm2/listmacro2.h
deleted file mode 100644
index fa822836c..000000000
--- a/app/wm2/listmacro2.h
+++ /dev/null
@@ -1,76 +0,0 @@
-
-#ifndef _LISTMACRO_H_
-#define _LISTMACRO_H_
-
-#include <assert.h>
-
-// assumes efficient realloc()
-
-#define declarePList(List, T) \
- typedef T *T##_pointer; \
- declareList(List, T##_pointer);
-
-#define implementPList(List, T) \
- typedef T *T##_pointer; \
- implementList(List, T##_pointer);
-
-#define declareList(List, T) \
-class List { \
-public: \
- List(); \
- ~List(); \
-\
- long count() const { return m_count; } \
- T &item(long index) const { \
- assert(index >= 0 && index < m_count); \
- return m_items[index]; \
- } \
- T *array(long index, long count) { \
- return m_items + index; \
- } \
-\
- void append(const T &); \
- void remove(long index); \
- void remove_all(); \
- void move_to_start(long index); \
-\
-private: \
- T *m_items; \
- long m_count; \
-};
-
-#define implementList(List, T) \
-\
-List::List() : m_count(0), m_items(0) { } \
-\
-List::~List() { remove_all(); } \
-\
-void List::append(const T &item) { \
- if (m_items) { \
- m_items = (T *)realloc(m_items, (m_count + 1) * sizeof(T)); \
- } else { \
- m_items = (T *)malloc(sizeof(T)); \
- } \
- assert(m_items); \
- m_items[m_count++] = (T)item; \
-} \
-\
-void List::remove(long index) { \
- assert(index >= 0 && index < m_count); \
- memcpy(m_items+index, m_items+index+1, (m_count-index-1) * sizeof(T)); \
- m_items = (T *)realloc(m_items, (m_count - 1) * sizeof(T)); \
- --m_count; \
-} \
-\
-void List::remove_all() { \
- while (m_count > 0) remove(0); \
-} \
-\
-void List::move_to_start(long index) { \
- assert(index >= 0 && index < m_count); \
- T temp = item(index); \
- if (index > 0) memcpy(m_items+1, m_items, index * sizeof(T)); \
- m_items[0] = temp; \
-}
-
-#endif
diff --git a/app/wm2/wm2.1 b/app/wm2/wm2.1
deleted file mode 100644
index 9d7435fdf..000000000
--- a/app/wm2/wm2.1
+++ /dev/null
@@ -1,136 +0,0 @@
-.\" $OpenBSD: wm2.1,v 1.1 2006/11/26 10:57:00 matthieu Exp $
-.Dd March 28, 1998
-.Dt WM2 1
-.Os
-.Sh NAME
-.Nm wm2
-.Nd a window manager
-.Sh SYNOPSIS
-.Nm wm2
-.Sh DESCRIPTION
-.Nm wm2
-is a window manager for X. It provides an unusual style of window
-decoration and as little functionality as I feel comfortable with in a
-window manager. wm2 is not configurable, except by editing the source
-and recompiling the code, and is really intended for people who don't
-particularly want their window manager to be too friendly.
-.Pp
-.Nm wm2
-provides:
-.Bl -dash
-.It
-Decorative frames for your windows.
-.It
-The ability to move, resize, hide and restore windows.
-.It
-No icons.
-.It
-No configurable root menus, buttons or mouse or keyboard bindings.
-.It
-No virtual desktop, toolbars or integrated applications.
-.El
-.Sh USAGE
-To run wm2, make sure you're not already running a window manager,
-make sure the DISPLAY variable is correctly set, and then execute the
-file
-.Nm wm2 .
-There are no command-line options or X resources, and
-there is no start-up file. If your X server doesn't support the Shape
-extension, wm2 will exit (and will never work on your server); if it
-can't find the required fonts or allocate the required colours, it
-will also exit (but you should be able to fix this by changing the
-definitions in
-.Pa Config.h
-and recompiling).
-.Pp
-Available window manipulations are:
-.Bl -dash
-.It
-To focus a window: depends on the focus policy you selected
-in
-.Pa Config.h
-before compiling. See "Focus policy", below.
-.It
-To raise a window: click on its tab or frame, unless you have
-auto-raise on focus set in
-.Pa Config.h .
-.It
-To move a window: make sure it's in focus, then click and drag
-on its tab.
-.It
-To hide a window: make sure it's in focus, then click on the
-button at the top of its tab.
-.It
-To recover a hidden window: click left button on the root
-window for the root menu, and choose the window you want.
-.It
-To start a new xterm: use the first item on root menu ("New").
-.It
-To delete a window: make sure it's in focus, click on the
-button on the tab, hold the mouse button for at least a
-second and a half until the cursor changes to a cross, then
-release. (I know, it's not very easy. On the other hand,
-things like Windows-95 tend to obscure the fact that most
-windows already have a perfectly good Close option. If the
-default delay doesn't suit you, change it in
-.Pa Config.h
-and recompile.)
-.It
-To resize a window: make sure it's in focus, then click and
-drag on its bottom-right corner. For a constrained resize,
-click and drag on the bottom-left or top-right corner of
-the enclosing window frame.
-.It
-To flip around amongst the windows on-screen: click with the right
-mouse button on the root window or on any window's frame or tab.
-.It
-To exit from wm2: move the mouse pointer to the very edge of the
-screen at the extreme lower-right corner, and click left button on
-the root window for the root menu. The menu should have an extra
-option labelled "Exit wm2"; select this.
-.El
-All move and resize operations are opaque.
-.Sh FOCUS POLICY
-.Pa Config.h
-contains settings for focus policy. There are three things
-you can define to either True or False: CONFIG_CLICK_TO_FOCUS,
-CONFIG_RAISE_ON_FOCUS and CONFIG_AUTO_RAISE. The first two are
-connected: together they define a focus policy. The third is a
-separate focus policy on its own and will only work if the first two
-are both False. CONFIG_AUTO_RAISE differs from
-(!CONFIG_CLICK_TO_FOCUS && CONFIG_RAISE_ON_FOCUS) only in that it
-provides a short delay before raising each window. The delay is also
-definable in
-.Pa Config.h .
-.Sh XTERM
-Some versions of xterm and rxvt run badly with wm2. If you use xterm
-and find that it refreshes the window excessively slowly, you might
-like to try experimenting with a different terminal emulation program.
-I think it might help to ensure that the scrollbar is on the
-right-hand side of the rxvt window and is thick enough that wmx's
-resize handle doesn't obscure any of the text area.
-.Sh SEE ALSO
-.Xr twm 1 ,
-.Xr fvwm 1
-.Sh AUTHORS
-wm2 was written by Chris Cannam, recycling a lot of code and structure
-from "9wm" by David Hogan (see http://www.cs.su.oz.au/~dhog/ ). 9wm
-is written in C, so very little of the code is used verbatim, but the
-intention was to reuse and a lot of the resulting code is
-recognisable. (Also 9wm's minimalism was rather inspiring.) I've
-made enough changes to make it very probable that any bugs you find
-will be my fault rather than David's.
-.Pp
-wm2 also uses version 2.0 of Alan Richardson's "xvertext"
-font-rotation routines.
-.Pp
-The sideways tabs on the window frames were Andy Green's idea.
-.Pp
-If you want to hack the code into something else for your own
-amusement, please go ahead. Feel free to modify and redistribute, as
-long as you retain the original copyrights as appropriate.
-.Pp
-This manual page was written by Matthieu Herrb, from the README file.
-.Sh BUGS
-The principal bug is that wm2 now has too many features. That aside,
-if you find a bug, please report it to me (preferably with a fix).