X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=7cf8ec1bdf892126e3eaefff9cfbee163a263000;hb=63f8386dde9fb610492dd9a10d0a688f16d0dcf4;hp=431d3167f0ad72a0a79453820fea02a159b5d450;hpb=5f9c458fbc5fff1fdde65981084b658fcde5eabc;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index 431d3167..7cf8ec1b 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -1,6 +1,7 @@ // Window.cc for Openbox -// Copyright (c) 2001 Sean 'Shaleh' Perry -// 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"), @@ -261,16 +262,16 @@ OpenboxWindow::OpenboxWindow(Openbox &o, Window w, BScreen *s) : openbox(o) { 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); @@ -538,24 +539,6 @@ void OpenboxWindow::associateClientWindow(void) { 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); - } } @@ -739,7 +722,7 @@ void OpenboxWindow::createMaximizeButton(void) { } -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; @@ -760,37 +743,40 @@ void OpenboxWindow::positionButtons(Bool redecorate_label) { 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, @@ -800,20 +786,22 @@ void OpenboxWindow::positionButtons(Bool redecorate_label) { } } - 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(); } @@ -1314,10 +1302,9 @@ void OpenboxWindow::configure(int dx, int dy, XMoveWindow(display, frame.window, frame.x, frame.y); + setFocusFlag(flags.focused); positionWindows(); decorate(); - setFocusFlag(flags.focused); - redrawAllButtons(); } else { frame.x = dx; frame.y = dy; @@ -1353,7 +1340,7 @@ void OpenboxWindow::configure(int dx, int 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); @@ -1378,39 +1365,36 @@ Bool OpenboxWindow::setInputFocus(void) { 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(); @@ -1527,6 +1511,9 @@ void OpenboxWindow::withdraw(void) { 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(); @@ -1546,7 +1533,7 @@ void OpenboxWindow::maximize(unsigned int button) { 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; } @@ -1620,12 +1607,13 @@ void OpenboxWindow::maximize(unsigned int button) { 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; @@ -2202,7 +2190,6 @@ void OpenboxWindow::redrawCloseButton(Bool pressed) { 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, @@ -2253,12 +2240,8 @@ void OpenboxWindow::mapNotifyEvent(XMapEvent *ne) { openbox.grab(); if (! validateClient()) return; - if (decorations.titlebar) positionButtons(); - setState(NormalState); - redrawAllButtons(); - if (flags.transient || screen->focusNew()) setInputFocus(); else @@ -2422,7 +2405,10 @@ void OpenboxWindow::propertyNotifyEvent(Atom atom) { if (decorations.close && (! frame.close_button)) { createCloseButton(); - if (decorations.titlebar) positionButtons(True); + if (decorations.titlebar) { + positionButtons(); + decorateLabel(); + } if (windowmenu) windowmenu->reconfigure(); } } @@ -2791,7 +2777,6 @@ void OpenboxWindow::startMove(int x, int y) { } 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; } @@ -2885,7 +2870,6 @@ void OpenboxWindow::endMove() { // cause problems XEvent e; while (XCheckTypedWindowEvent(display, frame.window, MotionNotify, &e)); - cout << "END MOVE " << client.window << " " << client.title << endl; } @@ -2904,7 +2888,6 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { 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) ? @@ -2978,8 +2961,7 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { screen->showGeometry(gx, gy); } - } else - cout << "MOTION " << client.window << " " << client.title << endl; + } } @@ -3017,7 +2999,7 @@ void OpenboxWindow::shapeEvent(XShapeEvent *) { #endif // SHAPE -Bool OpenboxWindow::validateClient(void) { +bool OpenboxWindow::validateClient(void) { XSync(display, False); XEvent e; @@ -3026,10 +3008,10 @@ Bool OpenboxWindow::validateClient(void) { XPutBackEvent(display, &e); openbox.ungrab(); - return False; + return false; } - return True; + return true; } @@ -3048,6 +3030,8 @@ void OpenboxWindow::restore(void) { XMapWindow(display, client.window); XFlush(display); + + delete this; } @@ -3219,9 +3203,9 @@ void OpenboxWindow::downsize(void) { 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); @@ -3239,9 +3223,9 @@ void OpenboxWindow::right_fixsize(int *gx, int *gy) { 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; @@ -3251,9 +3235,9 @@ void OpenboxWindow::right_fixsize(int *gx, int *gy) { 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); @@ -3271,11 +3255,11 @@ void OpenboxWindow::left_fixsize(int *gx, int *gy) { 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;