// Window.cc for Openbox
-// Copyright (c) 2001 Sean 'Shaleh' Perry <shaleh@debian.org>
-// Copyright (c) 1997 - 2000 Brad Hughes (bhughes@tcac.net)
+// Copyright (c) 2002 - 2002 Ben Jansens (ben at orodu.net)
+// Copyright (c) 2001 - 2002 Sean 'Shaleh' Perry (shaleh at debian.org)
+// Copyright (c) 1997 - 2000 Brad Hughes (bhughes at tcac.net)
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
if (! screen->sloppyFocus())
openbox.grabButton(Button1, 0, frame.plate, True, ButtonPressMask,
- GrabModeSync, GrabModeSync, None, None);
+ GrabModeSync, GrabModeSync, frame.plate, None);
openbox.grabButton(Button1, Mod1Mask, frame.window, True,
ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
- GrabModeAsync, None, openbox.getMoveCursor());
+ GrabModeAsync, frame.window, openbox.getMoveCursor());
openbox.grabButton(Button2, Mod1Mask, frame.window, True,
- ButtonReleaseMask, GrabModeAsync, GrabModeAsync, None, None);
+ ButtonReleaseMask, GrabModeAsync, GrabModeAsync, frame.window, None);
openbox.grabButton(Button3, Mod1Mask, frame.window, True,
ButtonReleaseMask | ButtonMotionMask, GrabModeAsync,
- GrabModeAsync, None, None);
+ GrabModeAsync, frame.window, None);
positionWindows();
XRaiseWindow(display, frame.plate);
if (decorations.iconify) createIconifyButton();
if (decorations.maximize) createMaximizeButton();
if (decorations.close) createCloseButton();
-
- if (frame.ubutton) {
- if (frame.close_button)
- XSetWindowBackgroundPixmap(display, frame.close_button, frame.ubutton);
- if (frame.maximize_button)
- XSetWindowBackgroundPixmap(display, frame.maximize_button,
- frame.ubutton);
- if (frame.iconify_button)
- XSetWindowBackgroundPixmap(display, frame.iconify_button, frame.ubutton);
- } else {
- if (frame.close_button)
- XSetWindowBackground(display, frame.close_button, frame.ubutton_pixel);
- if (frame.maximize_button)
- XSetWindowBackground(display, frame.maximize_button,
- frame.ubutton_pixel);
- if (frame.iconify_button)
- XSetWindowBackground(display, frame.iconify_button, frame.ubutton_pixel);
- }
}
}
-void OpenboxWindow::positionButtons(Bool redecorate_label) {
+void OpenboxWindow::positionButtons() {
const char *format = openbox.getTitleBarLayout();
const unsigned int bw = frame.bevel_w + 1;
const unsigned int by = frame.bevel_w + 1;
for (int i = 0; format[i] != '\0' && i < 4; i++) {
switch(format[i]) {
case 'C':
- if (decorations.close && frame.close_button != None) {
+ if (decorations.close) {
+ if (frame.close_button == None)
+ createCloseButton();
XMoveResizeWindow(display, frame.close_button, bx, by,
frame.button_w, frame.button_h);
XMapWindow(display, frame.close_button);
XClearWindow(display, frame.close_button);
bx += frame.button_w + bw;
hasclose = true;
- } else if (frame.close_button)
- XUnmapWindow(display, frame.close_button);
+ }
break;
case 'I':
- if (decorations.iconify && frame.iconify_button != None) {
+ if (decorations.iconify) {
+ if (frame.iconify_button == None)
+ createIconifyButton();
XMoveResizeWindow(display, frame.iconify_button, bx, by,
frame.button_w, frame.button_h);
XMapWindow(display, frame.iconify_button);
XClearWindow(display, frame.iconify_button);
bx += frame.button_w + bw;
hasiconify = true;
- } else if (frame.close_button)
- XUnmapWindow(display, frame.close_button);
+ }
break;
case 'M':
- if (decorations.maximize && frame.maximize_button != None) {
+ if (decorations.maximize) {
+ if (frame.maximize_button == None)
+ createMaximizeButton();
XMoveResizeWindow(display, frame.maximize_button, bx, by,
frame.button_w, frame.button_h);
XMapWindow(display, frame.maximize_button);
XClearWindow(display, frame.maximize_button);
bx += frame.button_w + bw;
hasmaximize = true;
- } else if (frame.close_button)
- XUnmapWindow(display, frame.close_button);
+ }
break;
case 'L':
XMoveResizeWindow(display, frame.label, bx, by - 1,
}
}
- if (!hasclose) {
- openbox.removeWindowSearch(frame.close_button);
- XDestroyWindow(display, frame.close_button);
+ if (!hasclose && frame.close_button) {
+ openbox.removeWindowSearch(frame.close_button);
+ XDestroyWindow(display, frame.close_button);
+ frame.close_button = None;
}
- if (!hasiconify) {
- openbox.removeWindowSearch(frame.iconify_button);
- XDestroyWindow(display, frame.iconify_button);
+ if (!hasiconify && frame.iconify_button) {
+ openbox.removeWindowSearch(frame.iconify_button);
+ XDestroyWindow(display, frame.iconify_button);
+ frame.iconify_button = None;
}
- if (!hasmaximize) {
- openbox.removeWindowSearch(frame.maximize_button);
- XDestroyWindow(display, frame.maximize_button);
+ if (!hasmaximize && frame.iconify_button) {
+ openbox.removeWindowSearch(frame.maximize_button);
+ XDestroyWindow(display, frame.maximize_button);
+ frame.maximize_button = None;
}
- if (redecorate_label)
- decorateLabel();
+
redrawLabel();
redrawAllButtons();
}
XMoveWindow(display, frame.window, frame.x, frame.y);
+ setFocusFlag(flags.focused);
positionWindows();
decorate();
- setFocusFlag(flags.focused);
- redrawAllButtons();
} else {
frame.x = dx;
frame.y = dy;
}
-Bool OpenboxWindow::setInputFocus(void) {
+bool OpenboxWindow::setInputFocus(void) {
if (((signed) (frame.x + frame.width)) < 0) {
if (((signed) (frame.y + frame.y_border)) < 0)
configure(frame.border_w, frame.border_w, frame.width, frame.height);
openbox.grab();
if (! validateClient()) return False;
- Bool ret = False;
+ bool ret = false;
if (client.transient && flags.modal) {
ret = client.transient->setInputFocus();
} else if (! flags.focused) {
- if (focus_mode == F_LocallyActive || focus_mode == F_Passive)
+ if (focus_mode == F_LocallyActive || focus_mode == F_Passive) {
XSetInputFocus(display, client.window,
- RevertToPointerRoot, CurrentTime);
- else
- XSetInputFocus(display, screen->getRootWindow(),
- RevertToNone, CurrentTime);
-
- openbox.setFocusedWindow(this);
-
- if (flags.send_focus_message) {
- XEvent ce;
- ce.xclient.type = ClientMessage;
- ce.xclient.message_type = openbox.getWMProtocolsAtom();
- ce.xclient.display = display;
- ce.xclient.window = client.window;
- ce.xclient.format = 32;
- ce.xclient.data.l[0] = openbox.getWMTakeFocusAtom();
- ce.xclient.data.l[1] = openbox.getLastTime();
- ce.xclient.data.l[2] = 0l;
- ce.xclient.data.l[3] = 0l;
- ce.xclient.data.l[4] = 0l;
- XSendEvent(display, client.window, False, NoEventMask, &ce);
- }
+ RevertToPointerRoot, CurrentTime);
+ openbox.focusWindow(this);
+
+ if (flags.send_focus_message) {
+ XEvent ce;
+ ce.xclient.type = ClientMessage;
+ ce.xclient.message_type = openbox.getWMProtocolsAtom();
+ ce.xclient.display = display;
+ ce.xclient.window = client.window;
+ ce.xclient.format = 32;
+ ce.xclient.data.l[0] = openbox.getWMTakeFocusAtom();
+ ce.xclient.data.l[1] = openbox.getLastTime();
+ ce.xclient.data.l[2] = 0l;
+ ce.xclient.data.l[3] = 0l;
+ ce.xclient.data.l[4] = 0l;
+ XSendEvent(display, client.window, False, NoEventMask, &ce);
+ }
- if (screen->sloppyFocus() && screen->autoRaise())
- timer->start();
+ if (screen->sloppyFocus() && screen->autoRaise())
+ timer->start();
- ret = True;
+ ret = true;
+ }
}
openbox.ungrab();
void OpenboxWindow::maximize(unsigned int button) {
+ if (flags.moving)
+ endMove();
+
// handle case where menu is open then the max button is used instead
if (windowmenu && windowmenu->isVisible()) windowmenu->hide();
openbox_attrib.premax_x = openbox_attrib.premax_y = 0;
openbox_attrib.premax_w = openbox_attrib.premax_h = 0;
- redrawAllButtons();
+ redrawMaximizeButton(flags.maximized);
setState(current_state);
return;
}
configure(dx, dy, dw, dh);
screen->getWorkspace(workspace_number)->raiseWindow(this);
- redrawAllButtons();
+ redrawMaximizeButton(flags.maximized);
setState(current_state);
}
void OpenboxWindow::setWorkspace(int n) {
+ ASSERT(n < screen->getWorkspaceCount());
workspace_number = n;
openbox_attrib.flags |= AttribWorkspace;
void OpenboxWindow::mapRequestEvent(XMapRequestEvent *re) {
- cout << "MAP REQUEST " << client.window << " " << client.title << endl;
if (re->window == client.window) {
#ifdef DEBUG
fprintf(stderr, i18n->getMessage(WindowSet, WindowMapRequest,
openbox.grab();
if (! validateClient()) return;
- if (decorations.titlebar) positionButtons();
-
setState(NormalState);
- redrawAllButtons();
-
if (flags.transient || screen->focusNew())
setInputFocus();
else
if (decorations.close && (! frame.close_button)) {
createCloseButton();
- if (decorations.titlebar) positionButtons(True);
+ if (decorations.titlebar) {
+ positionButtons();
+ decorateLabel();
+ }
if (windowmenu) windowmenu->reconfigure();
}
}
}
frame.grab_x = x - frame.x - frame.border_w;
frame.grab_y = y - frame.y - frame.border_w;
- cout << "START MOVE " << client.window << " " << client.title << endl;
}
// cause problems
XEvent e;
while (XCheckTypedWindowEvent(display, frame.window, MotionNotify, &e));
- cout << "END MOVE " << client.window << " " << client.title << endl;
}
Bool left = resize_zone & ZoneLeft;
if (! flags.resizing) {
- cout << "START RESIZE " << client.window << " " << client.title << endl;
Cursor cursor;
if (resize_zone & ZoneTop)
cursor = (resize_zone & ZoneLeft) ?
screen->showGeometry(gx, gy);
}
- } else
- cout << "MOTION " << client.window << " " << client.title << endl;
+ }
}
#endif // SHAPE
-Bool OpenboxWindow::validateClient(void) {
+bool OpenboxWindow::validateClient(void) {
XSync(display, False);
XEvent e;
XPutBackEvent(display, &e);
openbox.ungrab();
- return False;
+ return false;
}
- return True;
+ return true;
}
XMapWindow(display, client.window);
XFlush(display);
+
+ delete this;
}
void OpenboxWindow::right_fixsize(int *gx, int *gy) {
// calculate the size of the client window and conform it to the
// size specified by the size hints of the client window...
- int dx = frame.resize_w - client.base_width - (frame.mwm_border_w * 2) -
+ int dx = 1 + frame.resize_w - client.base_width - (frame.mwm_border_w * 2) -
(frame.border_w * 2) + (client.width_inc / 2);
- int dy = frame.resize_h - frame.y_border - client.base_height -
+ int dy = 1 + frame.resize_h - frame.y_border - client.base_height -
frame.handle_h - (frame.border_w * 3) - (frame.mwm_border_w * 2)
+ (client.height_inc / 2);
dx = (dx * client.width_inc) + client.base_width;
dy = (dy * client.height_inc) + client.base_height;
- frame.resize_w = dx + (frame.mwm_border_w * 2) + (frame.border_w * 2);
+ frame.resize_w = dx + (frame.mwm_border_w * 2) + (frame.border_w * 2) - 1;
frame.resize_h = dy + frame.y_border + frame.handle_h +
- (frame.mwm_border_w * 2) + (frame.border_w * 3);
+ (frame.mwm_border_w * 2) + (frame.border_w * 3) - 1;
if (resize_zone & ZoneTop)
frame.resize_y = frame.y + frame.height - frame.resize_h +
screen->getBorderWidth() * 2;
void OpenboxWindow::left_fixsize(int *gx, int *gy) {
// calculate the size of the client window and conform it to the
// size specified by the size hints of the client window...
- int dx = frame.x + frame.width - frame.resize_x - client.base_width -
+ int dx = 1 + frame.x + frame.width - frame.resize_x - client.base_width -
(frame.mwm_border_w * 2) + (client.width_inc / 2);
- int dy = frame.resize_h - frame.y_border - client.base_height -
+ int dy = 1 + frame.resize_h - frame.y_border - client.base_height -
frame.handle_h - (frame.border_w * 3) - (frame.mwm_border_w * 2)
+ (client.height_inc / 2);
dx = (dx * client.width_inc) + client.base_width;
dy = (dy * client.height_inc) + client.base_height;
- frame.resize_w = dx + (frame.mwm_border_w * 2) + (frame.border_w * 2);
+ frame.resize_w = dx + (frame.mwm_border_w * 2) + (frame.border_w * 2) - 1;
frame.resize_x = frame.x + frame.width - frame.resize_w +
(frame.border_w * 2);
frame.resize_h = dy + frame.y_border + frame.handle_h +
- (frame.mwm_border_w * 2) + (frame.border_w * 3);
+ (frame.mwm_border_w * 2) + (frame.border_w * 3) - 1;
if (resize_zone & ZoneTop)
frame.resize_y = frame.y + frame.height - frame.resize_h +
screen->getBorderWidth() * 2;