X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=342864c9e11d4cbd48208e6555983e4158d3db11;hb=7ca4d98726f40fe6ec5b1335ee02d05ba0c18e57;hp=6d9d8859baad3a97d5a235ced4e0daa8b4b13310;hpb=2809005ab0ab761a831f4353f2ff190a62d92794;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index 6d9d8859..342864c9 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"), @@ -61,9 +62,9 @@ */ OpenboxWindow::OpenboxWindow(Openbox &o, Window w, BScreen *s) : openbox(o) { #ifdef DEBUG - fprintf(stderr, i18n->getMessage(WindowSet, WindowCreating, - "OpenboxWindow::OpenboxWindow(): creating 0x%lx\n"), - w); + fprintf(stderr, i18n(WindowSet, WindowCreating, + "OpenboxWindow::OpenboxWindow(): creating 0x%lx\n"), + w); #endif // DEBUG client.window = w; @@ -78,9 +79,9 @@ OpenboxWindow::OpenboxWindow(Openbox &o, Window w, BScreen *s) : openbox(o) { (! wattrib.screen) || wattrib.override_redirect) { #ifdef DEBUG fprintf(stderr, - i18n->getMessage(WindowSet, WindowXGetWindowAttributesFail, - "OpenboxWindow::OpenboxWindow(): XGetWindowAttributes " - "failed\n")); + i18n(WindowSet, WindowXGetWindowAttributesFail, + "OpenboxWindow::OpenboxWindow(): XGetWindowAttributes " + "failed\n")); #endif // DEBUG openbox.ungrab(); @@ -93,10 +94,10 @@ OpenboxWindow::OpenboxWindow(Openbox &o, Window w, BScreen *s) : openbox(o) { screen = openbox.searchScreen(RootWindowOfScreen(wattrib.screen)); if (! screen) { #ifdef DEBUG - fprintf(stderr, i18n->getMessage(WindowSet, WindowCannotFindScreen, - "OpenboxWindow::OpenboxWindow(): can't find screen\n" - "\tfor root window 0x%lx\n"), - RootWindowOfScreen(wattrib.screen)); + fprintf(stderr, i18n(WindowSet, WindowCannotFindScreen, + "OpenboxWindow::OpenboxWindow(): can't find screen\n" + "\tfor root window 0x%lx\n"), + RootWindowOfScreen(wattrib.screen)); #endif // DEBUG openbox.ungrab(); @@ -184,19 +185,19 @@ OpenboxWindow::OpenboxWindow(Openbox &o, Window w, BScreen *s) : openbox(o) { if (win && (win != client.window)) { OpenboxWindow *tr; if ((tr = openbox.searchWindow(win))) { - while (tr->client.transient) tr = tr->client.transient; - client.transient_for = tr; - tr->client.transient = this; - flags.stuck = client.transient_for->flags.stuck; - flags.transient = True; + while (tr->client.transient) tr = tr->client.transient; + client.transient_for = tr; + tr->client.transient = this; + flags.stuck = client.transient_for->flags.stuck; + flags.transient = True; } else if (win == client.window_group) { - if ((tr = openbox.searchGroup(win, this))) { - while (tr->client.transient) tr = tr->client.transient; - client.transient_for = tr; - tr->client.transient = this; - flags.stuck = client.transient_for->flags.stuck; - flags.transient = True; - } + if ((tr = openbox.searchGroup(win, this))) { + while (tr->client.transient) tr = tr->client.transient; + client.transient_for = tr; + tr->client.transient = this; + flags.stuck = client.transient_for->flags.stuck; + flags.transient = True; + } } } @@ -209,29 +210,29 @@ OpenboxWindow::OpenboxWindow(Openbox &o, Window w, BScreen *s) : openbox(o) { if ((client.normal_hint_flags & PMinSize) && (client.normal_hint_flags & PMaxSize) && - client.max_width <= client.min_width && + client.max_width <= client.min_width && client.max_height <= client.min_height) { decorations.maximize = decorations.handle = functions.resize = functions.maximize = False; } upsize(); - Bool place_window = True; + place_window = true; if (openbox.isStartup() || flags.transient || client.normal_hint_flags & (PPosition|USPosition)) { setGravityOffsets(); if ((openbox.isStartup()) || - (frame.x >= 0 && - (signed) (frame.y + frame.y_border) >= 0 && - frame.x <= (signed) screen->size().w() && - frame.y <= (signed) screen->size().h())) - place_window = False; + (frame.x >= 0 && + (signed) (frame.y + frame.y_border) >= 0 && + frame.x <= (signed) screen->size().w() && + frame.y <= (signed) screen->size().h())) + place_window = false; } frame.window = createToplevelWindow(frame.x, frame.y, frame.width, - frame.height, - frame.border_w); + frame.height, + frame.border_w); openbox.saveWindowSearch(frame.window, this); frame.plate = createChildWindow(frame.window); @@ -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()); + ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, + 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); + ButtonReleaseMask | ButtonMotionMask, GrabModeAsync, + GrabModeAsync, frame.window, None); positionWindows(); XRaiseWindow(display, frame.plate); @@ -313,9 +314,14 @@ OpenboxWindow::~OpenboxWindow(void) { XUngrabPointer(display, CurrentTime); } - if (workspace_number != -1 && window_number != -1) - screen->getWorkspace(workspace_number)->removeWindow(this); - else if (flags.iconic) + if (workspace_number != -1 && window_number != -1) { + if (flags.stuck) { + // make sure no other workspaces think that we're focused + for (int i=0; i < screen->getWorkspaceCount(); i++) + screen->getWorkspace(i)->removeWindow(this); + } else + screen->getWorkspace(workspace_number)->removeWindow(this); + } else if (flags.iconic) screen->removeIcon(this); if (timer) { @@ -432,23 +438,23 @@ OpenboxWindow::~OpenboxWindow(void) { * Returns: the newly created window */ Window OpenboxWindow::createToplevelWindow(int x, int y, unsigned int width, - unsigned int height, - unsigned int borderwidth) + unsigned int height, + unsigned int borderwidth) { XSetWindowAttributes attrib_create; unsigned long create_mask = CWBackPixmap | CWBorderPixel | CWColormap | - CWOverrideRedirect | CWEventMask; + CWOverrideRedirect | CWEventMask; attrib_create.background_pixmap = None; attrib_create.colormap = screen->getColormap(); attrib_create.override_redirect = True; attrib_create.event_mask = ButtonPressMask | ButtonReleaseMask | - ButtonMotionMask | EnterWindowMask; + ButtonMotionMask | EnterWindowMask; return XCreateWindow(display, screen->getRootWindow(), x, y, width, height, - borderwidth, screen->getDepth(), InputOutput, - screen->getVisual(), create_mask, - &attrib_create); + borderwidth, screen->getDepth(), InputOutput, + screen->getVisual(), create_mask, + &attrib_create); } @@ -459,12 +465,12 @@ Window OpenboxWindow::createToplevelWindow(int x, int y, unsigned int width, Window OpenboxWindow::createChildWindow(Window parent, Cursor cursor) { XSetWindowAttributes attrib_create; unsigned long create_mask = CWBackPixmap | CWBorderPixel | - CWEventMask; + CWEventMask; attrib_create.background_pixmap = None; attrib_create.event_mask = ButtonPressMask | ButtonReleaseMask | - ButtonMotionMask | ExposureMask | - EnterWindowMask | LeaveWindowMask; + ButtonMotionMask | ExposureMask | + EnterWindowMask | LeaveWindowMask; if (cursor) { create_mask |= CWCursor; @@ -472,8 +478,8 @@ Window OpenboxWindow::createChildWindow(Window parent, Cursor cursor) { } return XCreateWindow(display, parent, 0, 0, 1, 1, 0, screen->getDepth(), - InputOutput, screen->getVisual(), create_mask, - &attrib_create); + InputOutput, screen->getVisual(), create_mask, + &attrib_create); } @@ -492,9 +498,9 @@ void OpenboxWindow::associateClientWindow(void) { XFlush(display); attrib_set.event_mask = PropertyChangeMask | StructureNotifyMask | - FocusChangeMask; + FocusChangeMask; attrib_set.do_not_propagate_mask = ButtonPressMask | ButtonReleaseMask | - ButtonMotionMask; + ButtonMotionMask; XChangeWindowAttributes(display, client.window, CWEventMask|CWDontPropagate, &attrib_set); @@ -507,13 +513,13 @@ void OpenboxWindow::associateClientWindow(void) { unsigned int ufoo; XShapeQueryExtents(display, client.window, &flags.shaped, &foo, &foo, - &ufoo, &ufoo, &foo, &foo, &foo, &ufoo, &ufoo); + &ufoo, &ufoo, &foo, &foo, &foo, &ufoo, &ufoo); if (flags.shaped) { XShapeCombineShape(display, frame.window, ShapeBounding, - frame.mwm_border_w, frame.y_border + - frame.mwm_border_w, client.window, - ShapeBounding, ShapeSet); + frame.mwm_border_w, frame.y_border + + frame.mwm_border_w, client.window, + ShapeBounding, ShapeSet); int num = 1; XRectangle xrect[2]; @@ -522,15 +528,15 @@ void OpenboxWindow::associateClientWindow(void) { xrect[0].height = frame.y_border; if (decorations.handle) { - xrect[1].x = 0; - xrect[1].y = frame.y_handle; - xrect[1].width = frame.width; - xrect[1].height = frame.handle_h + frame.border_w; - num++; + xrect[1].x = 0; + xrect[1].y = frame.y_handle; + xrect[1].width = frame.width; + xrect[1].height = frame.handle_h + frame.border_w; + num++; } XShapeCombineRectangles(display, frame.window, ShapeBounding, 0, 0, - xrect, num, ShapeUnion, Unsorted); + xrect, num, ShapeUnion, Unsorted); } } #endif // SHAPE @@ -538,24 +544,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 +727,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; @@ -753,44 +741,47 @@ void OpenboxWindow::positionButtons(Bool redecorate_label) { if (!decorations.iconify) bcount--; frame.label_w = frame.width - bx * 2 - (frame.button_w + bw) * bcount; - + bool hasclose, hasiconify, hasmaximize; hasclose = hasiconify = hasmaximize = false; - + 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 +791,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(); } @@ -824,17 +817,17 @@ void OpenboxWindow::reconfigure(void) { client.x = frame.x + frame.mwm_border_w + frame.border_w; client.y = frame.y + frame.y_border + frame.mwm_border_w + - frame.border_w; + frame.border_w; if (client.title) { - if (i18n->multibyte()) { + if (i18n.multibyte()) { XRectangle ink, logical; XmbTextExtents(screen->getWindowStyle()->fontset, - client.title, client.title_len, &ink, &logical); + client.title, client.title_len, &ink, &logical); client.title_text_w = logical.width; } else { client.title_text_w = XTextWidth(screen->getWindowStyle()->font, - client.title, client.title_len); + client.title, client.title_len); } client.title_text_w += (frame.bevel_w * 4); } @@ -849,7 +842,7 @@ void OpenboxWindow::reconfigure(void) { if (! screen->sloppyFocus()) openbox.grabButton(Button1, 0, frame.plate, True, ButtonPressMask, - GrabModeSync, GrabModeSync, None, None); + GrabModeSync, GrabModeSync, None, None); else openbox.ungrabButton(Button1, 0, frame.plate); @@ -857,6 +850,9 @@ void OpenboxWindow::reconfigure(void) { windowmenu->move(windowmenu->getX(), frame.y + frame.title_h); windowmenu->reconfigure(); } + + // re-get the timeout delay + timer->setTimeout(openbox.getAutoRaiseDelay()); } @@ -872,7 +868,7 @@ void OpenboxWindow::positionWindows(void) { if (decorations.titlebar) { XSetWindowBorderWidth(display, frame.title, frame.border_w); XMoveResizeWindow(display, frame.title, -frame.border_w, - -frame.border_w, frame.width, frame.title_h); + -frame.border_w, frame.width, frame.title_h); positionButtons(); } else if (frame.title) { @@ -885,11 +881,11 @@ void OpenboxWindow::positionWindows(void) { XMoveResizeWindow(display, frame.handle, -frame.border_w, frame.y_handle - frame.border_w, - frame.width, frame.handle_h); + frame.width, frame.handle_h); XMoveResizeWindow(display, frame.left_grip, -frame.border_w, - -frame.border_w, frame.grip_w, frame.grip_h); + -frame.border_w, frame.grip_w, frame.grip_h); XMoveResizeWindow(display, frame.right_grip, - frame.width - frame.grip_w - frame.border_w, + frame.width - frame.grip_w - frame.border_w, -frame.border_w, frame.grip_w, frame.grip_h); XMapSubwindows(display, frame.handle); } else if (frame.handle) { @@ -911,39 +907,39 @@ void OpenboxWindow::getWMName(void) { if (XGetWMName(display, client.window, &text_prop)) { if (text_prop.value && text_prop.nitems > 0) { if (text_prop.encoding != XA_STRING) { - text_prop.nitems = strlen((char *) text_prop.value); - - if ((XmbTextPropertyToTextList(display, &text_prop, - &list, &num) == Success) && - (num > 0) && *list) { - client.title = bstrdup(*list); - XFreeStringList(list); - } else { - client.title = bstrdup((char *) text_prop.value); - } + text_prop.nitems = strlen((char *) text_prop.value); + + if ((XmbTextPropertyToTextList(display, &text_prop, + &list, &num) == Success) && + (num > 0) && *list) { + client.title = bstrdup(*list); + XFreeStringList(list); + } else { + client.title = bstrdup((char *) text_prop.value); + } } else { - client.title = bstrdup((char *) text_prop.value); + client.title = bstrdup((char *) text_prop.value); } XFree((char *) text_prop.value); } else { - client.title = bstrdup(i18n->getMessage(WindowSet, WindowUnnamed, - "Unnamed")); + client.title = bstrdup(i18n(WindowSet, WindowUnnamed, + "Unnamed")); } } else { - client.title = bstrdup(i18n->getMessage(WindowSet, WindowUnnamed, - "Unnamed")); + client.title = bstrdup(i18n(WindowSet, WindowUnnamed, + "Unnamed")); } client.title_len = strlen(client.title); - if (i18n->multibyte()) { + if (i18n.multibyte()) { XRectangle ink, logical; XmbTextExtents(screen->getWindowStyle()->fontset, - client.title, client.title_len, &ink, &logical); + client.title, client.title_len, &ink, &logical); client.title_text_w = logical.width; } else { client.title_len = strlen(client.title); client.title_text_w = XTextWidth(screen->getWindowStyle()->font, - client.title, client.title_len); + client.title, client.title_len); } client.title_text_w += (frame.bevel_w * 4); @@ -963,18 +959,18 @@ void OpenboxWindow::getWMIconName(void) { if (XGetWMIconName(display, client.window, &text_prop)) { if (text_prop.value && text_prop.nitems > 0) { if (text_prop.encoding != XA_STRING) { - text_prop.nitems = strlen((char *) text_prop.value); - - if ((XmbTextPropertyToTextList(display, &text_prop, - &list, &num) == Success) && - (num > 0) && *list) { - client.icon_title = bstrdup(*list); - XFreeStringList(list); - } else { - client.icon_title = bstrdup((char *) text_prop.value); - } + text_prop.nitems = strlen((char *) text_prop.value); + + if ((XmbTextPropertyToTextList(display, &text_prop, + &list, &num) == Success) && + (num > 0) && *list) { + client.icon_title = bstrdup(*list); + XFreeStringList(list); + } else { + client.icon_title = bstrdup((char *) text_prop.value); + } } else { - client.icon_title = bstrdup((char *) text_prop.value); + client.icon_title = bstrdup((char *) text_prop.value); } XFree((char *) text_prop.value); } else { @@ -1000,7 +996,7 @@ void OpenboxWindow::getWMProtocols(void) { if (XGetWMProtocols(display, client.window, &proto, &num_return)) { for (int i = 0; i < num_return; ++i) { if (proto[i] == openbox.getWMDeleteAtom()) - functions.close = decorations.close = True; + functions.close = decorations.close = True; else if (proto[i] == openbox.getWMTakeFocusAtom()) flags.send_focus_message = True; else if (proto[i] == openbox.getOpenboxStructureMessagesAtom()) @@ -1030,14 +1026,14 @@ void OpenboxWindow::getWMHints(void) { if (wmhint->flags & InputHint) { if (wmhint->input == True) { if (flags.send_focus_message) - focus_mode = F_LocallyActive; + focus_mode = F_LocallyActive; else - focus_mode = F_Passive; + focus_mode = F_Passive; } else { if (flags.send_focus_message) - focus_mode = F_GloballyActive; + focus_mode = F_GloballyActive; else - focus_mode = F_NoInput; + focus_mode = F_NoInput; } } else { focus_mode = F_Passive; @@ -1127,11 +1123,11 @@ void OpenboxWindow::getMWMHints(void) { unsigned long num, len; int ret = XGetWindowProperty(display, client.window, - openbox.getMotifWMHintsAtom(), 0, - PropMwmHintsElements, False, - openbox.getMotifWMHintsAtom(), &atom_return, - &format, &num, &len, - (unsigned char **) &client.mwm_hint); + openbox.getMotifWMHintsAtom(), 0, + PropMwmHintsElements, False, + openbox.getMotifWMHintsAtom(), &atom_return, + &format, &num, &len, + (unsigned char **) &client.mwm_hint); if (ret != Success || !client.mwm_hint || num != PropMwmHintsElements) return; @@ -1139,46 +1135,46 @@ void OpenboxWindow::getMWMHints(void) { if (client.mwm_hint->flags & MwmHintsDecorations) { if (client.mwm_hint->decorations & MwmDecorAll) { decorations.titlebar = decorations.handle = decorations.border = - decorations.iconify = decorations.maximize = - decorations.close = decorations.menu = True; + decorations.iconify = decorations.maximize = + decorations.close = decorations.menu = True; } else { decorations.titlebar = decorations.handle = decorations.border = - decorations.iconify = decorations.maximize = - decorations.close = decorations.menu = False; + decorations.iconify = decorations.maximize = + decorations.close = decorations.menu = False; if (client.mwm_hint->decorations & MwmDecorBorder) - decorations.border = True; + decorations.border = True; if (client.mwm_hint->decorations & MwmDecorHandle) - decorations.handle = True; + decorations.handle = True; if (client.mwm_hint->decorations & MwmDecorTitle) - decorations.titlebar = True; + decorations.titlebar = True; if (client.mwm_hint->decorations & MwmDecorMenu) - decorations.menu = True; + decorations.menu = True; if (client.mwm_hint->decorations & MwmDecorIconify) - decorations.iconify = True; + decorations.iconify = True; if (client.mwm_hint->decorations & MwmDecorMaximize) - decorations.maximize = True; + decorations.maximize = True; } } if (client.mwm_hint->flags & MwmHintsFunctions) { if (client.mwm_hint->functions & MwmFuncAll) { functions.resize = functions.move = functions.iconify = - functions.maximize = functions.close = True; + functions.maximize = functions.close = True; } else { functions.resize = functions.move = functions.iconify = - functions.maximize = functions.close = False; + functions.maximize = functions.close = False; if (client.mwm_hint->functions & MwmFuncResize) - functions.resize = True; + functions.resize = True; if (client.mwm_hint->functions & MwmFuncMove) - functions.move = True; + functions.move = True; if (client.mwm_hint->functions & MwmFuncIconify) - functions.iconify = True; + functions.iconify = True; if (client.mwm_hint->functions & MwmFuncMaximize) - functions.maximize = True; + functions.maximize = True; if (client.mwm_hint->functions & MwmFuncClose) - functions.close = True; + functions.close = True; } } } @@ -1197,11 +1193,11 @@ void OpenboxWindow::getOpenboxHints(void) { unsigned long num, len; int ret = XGetWindowProperty(display, client.window, - openbox.getOpenboxHintsAtom(), 0, - PropOpenboxHintsElements, False, - openbox.getOpenboxHintsAtom(), &atom_return, - &format, &num, &len, - (unsigned char **) &client.openbox_hint); + openbox.getOpenboxHintsAtom(), 0, + PropOpenboxHintsElements, False, + openbox.getOpenboxHintsAtom(), &atom_return, + &format, &num, &len, + (unsigned char **) &client.openbox_hint); if (ret != Success || !client.openbox_hint || num != PropOpenboxHintsElements) return; @@ -1212,7 +1208,7 @@ void OpenboxWindow::getOpenboxHints(void) { if ((client.openbox_hint->flags & AttribMaxHoriz) && (client.openbox_hint->flags & AttribMaxVert)) flags.maximized = (client.openbox_hint->attrib & - (AttribMaxHoriz | AttribMaxVert)) ? 1 : 0; + (AttribMaxHoriz | AttribMaxVert)) ? 1 : 0; else if (client.openbox_hint->flags & AttribMaxVert) flags.maximized = (client.openbox_hint->attrib & AttribMaxVert) ? 2 : 0; else if (client.openbox_hint->flags & AttribMaxHoriz) @@ -1232,36 +1228,36 @@ void OpenboxWindow::getOpenboxHints(void) { switch (client.openbox_hint->decoration) { case DecorNone: decorations.titlebar = decorations.border = decorations.handle = - decorations.iconify = decorations.maximize = - decorations.menu = False; + decorations.iconify = decorations.maximize = + decorations.menu = False; functions.resize = functions.move = functions.iconify = - functions.maximize = False; + functions.maximize = False; break; case DecorTiny: decorations.titlebar = decorations.iconify = decorations.menu = - functions.move = functions.iconify = True; + functions.move = functions.iconify = True; decorations.border = decorations.handle = decorations.maximize = - functions.resize = functions.maximize = False; + functions.resize = functions.maximize = False; break; case DecorTool: decorations.titlebar = decorations.menu = functions.move = True; decorations.iconify = decorations.border = decorations.handle = - decorations.maximize = functions.resize = functions.maximize = - functions.iconify = False; + decorations.maximize = functions.resize = functions.maximize = + functions.iconify = False; break; case DecorNormal: default: decorations.titlebar = decorations.border = decorations.handle = - decorations.iconify = decorations.maximize = - decorations.menu = True; + decorations.iconify = decorations.maximize = + decorations.menu = True; functions.resize = functions.move = functions.iconify = - functions.maximize = True; + functions.maximize = True; break; } @@ -1272,7 +1268,7 @@ void OpenboxWindow::getOpenboxHints(void) { void OpenboxWindow::configure(int dx, int dy, - unsigned int dw, unsigned int dh) { + unsigned int dw, unsigned int dh) { Bool send_event = (frame.x != dx || frame.y != dy); if ((dw != frame.width) || (dh != frame.height)) { @@ -1289,9 +1285,9 @@ void OpenboxWindow::configure(int dx, int dy, #ifdef SHAPE if (openbox.hasShapeExtensions() && flags.shaped) { XShapeCombineShape(display, frame.window, ShapeBounding, - frame.mwm_border_w, frame.y_border + - frame.mwm_border_w, client.window, - ShapeBounding, ShapeSet); + frame.mwm_border_w, frame.y_border + + frame.mwm_border_w, client.window, + ShapeBounding, ShapeSet); int num = 1; XRectangle xrect[2]; @@ -1300,24 +1296,23 @@ void OpenboxWindow::configure(int dx, int dy, xrect[0].height = frame.y_border; if (decorations.handle) { - xrect[1].x = 0; - xrect[1].y = frame.y_handle; - xrect[1].width = frame.width; - xrect[1].height = frame.handle_h + frame.border_w; - num++; + xrect[1].x = 0; + xrect[1].y = frame.y_handle; + xrect[1].width = frame.width; + xrect[1].height = frame.handle_h + frame.border_w; + num++; } XShapeCombineRectangles(display, frame.window, ShapeBounding, 0, 0, - xrect, num, ShapeUnion, Unsorted); + xrect, num, ShapeUnion, Unsorted); } #endif // SHAPE XMoveWindow(display, frame.window, frame.x, frame.y); + setFocusFlag(flags.focused); positionWindows(); decorate(); - setFocusFlag(flags.focused); - redrawAllButtons(); } else { frame.x = dx; frame.y = dy; @@ -1330,7 +1325,7 @@ void OpenboxWindow::configure(int dx, int dy, if (send_event && ! flags.moving) { client.x = dx + frame.mwm_border_w + frame.border_w; client.y = dy + frame.y_border + frame.mwm_border_w + - frame.border_w; + frame.border_w; XEvent event; event.type = ConfigureNotify; @@ -1353,7 +1348,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); @@ -1369,7 +1364,7 @@ Bool OpenboxWindow::setInputFocus(void) { frame.width, frame.height); else if (frame.y > (signed) screen->size().h()) configure(screen->size().w() - frame.width, - screen->size().h() - frame.height, frame.width, frame.height); + screen->size().h() - frame.height, frame.width, frame.height); else configure(screen->size().w() - frame.width, frame.y + frame.border_w, frame.width, frame.height); @@ -1378,39 +1373,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(); @@ -1422,6 +1414,9 @@ Bool OpenboxWindow::setInputFocus(void) { void OpenboxWindow::iconify(void) { if (flags.iconic) return; + if (flags.moving) + endMove(); + if (windowmenu) windowmenu->hide(); setState(IconicState); @@ -1449,7 +1444,7 @@ void OpenboxWindow::iconify(void) { } -void OpenboxWindow::deiconify(Bool reassoc, Bool raise) { +void OpenboxWindow::deiconify(bool reassoc, bool raise, bool initial) { if (flags.iconic || reassoc) screen->reassociateWindow(this, -1, False); else if (workspace_number != screen->getCurrentWorkspace()->getWorkspaceID()) @@ -1465,6 +1460,18 @@ void OpenboxWindow::deiconify(Bool reassoc, Bool raise) { XMapSubwindows(display, frame.window); XMapWindow(display, frame.window); + // if we're using the click to place placement type, then immediately + // after the window is mapped, we need to start interactively moving it + if (initial && place_window && + screen->placementPolicy() == BScreen::ClickMousePlacement) { + int x, y, rx, ry; + Window c, r; + unsigned int m; + XQueryPointer(openbox.getXDisplay(), screen->getRootWindow(), + &r, &c, &rx, &ry, &x, &y, &m); + startMove(rx, ry); + } + if (flags.iconic && screen->focusNew()) setInputFocus(); flags.visible = True; @@ -1494,6 +1501,9 @@ void OpenboxWindow::close(void) { void OpenboxWindow::withdraw(void) { + if (flags.moving) + endMove(); + flags.visible = False; flags.iconic = False; @@ -1509,6 +1519,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(); @@ -1523,114 +1536,24 @@ void OpenboxWindow::maximize(unsigned int button) { // so we do not need to call configure() because resizing will handle it if (!flags.resizing) configure(openbox_attrib.premax_x, openbox_attrib.premax_y, - openbox_attrib.premax_w, openbox_attrib.premax_h); + openbox_attrib.premax_w, openbox_attrib.premax_h); 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; } - // the following code is temporary and will be taken care of by Screen in the - // future (with the NETWM 'strut') - Rect space(0, 0, screen->size().w(), screen->size().h()); - if (! screen->fullMax()) { -#ifdef SLIT - Slit *slit = screen->getSlit(); - int slit_x = slit->autoHide() ? slit->hiddenOrigin().x() : slit->area().x(), - slit_y = slit->autoHide() ? slit->hiddenOrigin().y() : slit->area().y(); - Toolbar *toolbar = screen->getToolbar(); - int tbarh = screen->hideToolbar() ? 0 : - toolbar->getExposedHeight() + screen->getBorderWidth() * 2; - bool tbartop; - switch (toolbar->placement()) { - case Toolbar::TopLeft: - case Toolbar::TopCenter: - case Toolbar::TopRight: - tbartop = true; - break; - case Toolbar::BottomLeft: - case Toolbar::BottomCenter: - case Toolbar::BottomRight: - tbartop = false; - break; - default: - ASSERT(false); // unhandled placement - } - if ((slit->direction() == Slit::Horizontal && - (slit->placement() == Slit::TopLeft || - slit->placement() == Slit::TopRight)) || - slit->placement() == Slit::TopCenter) { - // exclude top - if (tbartop) - space.setH(space.h() - slit_y); - else - space.setH(space.h() - tbarh); - space.setY(space.y() + slit_y + slit->area().h() + - screen->getBorderWidth() * 2); - space.setH(space.h() - (slit_y + slit->area().h() + - screen->getBorderWidth() * 2)); - } else if ((slit->direction() == Slit::Vertical && - (slit->placement() == Slit::TopRight || - slit->placement() == Slit::BottomRight)) || - slit->placement() == Slit::CenterRight) { - // exclude right - space.setW(space.w() - (screen->size().w() - slit_x + - screen->getBorderWidth() * 2)); - if (tbartop) - space.setY(space.y() + tbarh); - space.setH(space.h() - tbarh); - } else if ((slit->direction() == Slit::Horizontal && - (slit->placement() == Slit::BottomLeft || - slit->placement() == Slit::BottomRight)) || - slit->placement() == Slit::BottomCenter) { - // exclude bottom - space.setH(space.h() - ((screen->size().h() - slit_y) > tbarh ? - screen->size().h() - slit_y : tbarh)); - } else {// if ((slit->direction() == Slit::Vertical && - // (slit->placement() == Slit::TopLeft || - // slit->placement() == Slit::BottomLeft)) || - // slit->placement() == Slit::CenterLeft) - // exclude left - space.setX(slit_x + slit->area().w() + - screen->getBorderWidth() * 2); - space.setW(space.w() - (slit_x + slit->area().w() + - screen->getBorderWidth() * 2)); - if (tbartop) - space.setY(space.y() + tbarh); - space.setH(space.h() - tbarh); - } -#else // !SLIT - Toolbar *toolbar = screen->getToolbar(); - int tbarh = screen->hideToolbar() ? 0 : - toolbar->getExposedHeight() + screen->getBorderWidth() * 2; - switch (toolbar->placement()) { - case Toolbar::TopLeft: - case Toolbar::TopCenter: - case Toolbar::TopRight: - space.setY(toolbar->getExposedHeight()); - space.setH(space.h() - toolbar->getExposedHeight()); - break; - case Toolbar::BottomLeft: - case Toolbar::BottomCenter: - case Toolbar::BottomRight: - space.setH(space.h() - tbarh); - break; - default: - ASSERT(false); // unhandled placement - } -#endif // SLIT - } - openbox_attrib.premax_x = frame.x; openbox_attrib.premax_y = frame.y; openbox_attrib.premax_w = frame.width; openbox_attrib.premax_h = frame.height; + Rect space = screen->availableArea(); unsigned int dw = space.w(), - dh = space.h(); + dh = space.h(); dw -= frame.border_w * 2; dw -= frame.mwm_border_w * 2; dw -= client.base_width; @@ -1657,7 +1580,7 @@ void OpenboxWindow::maximize(unsigned int button) { dh += frame.mwm_border_w * 2; int dx = space.x() + ((space.w() - dw) / 2) - frame.border_w, - dy = space.y() + ((space.h() - dh) / 2) - frame.border_w; + dy = space.y() + ((space.h() - dh) / 2) - frame.border_w; switch(button) { case 1: @@ -1692,12 +1615,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; @@ -1812,6 +1736,7 @@ void OpenboxWindow::setFocusFlag(Bool focus) { if (screen->sloppyFocus() && screen->autoRaise() && timer->isTiming()) timer->stop(); + } @@ -1825,22 +1750,22 @@ void OpenboxWindow::installColormap(Bool install) { if (cmaps) { if (XGetWindowAttributes(display, client.window, &wattrib)) { if (install) { - // install the window's colormap - for (i = 0; i < ncmap; i++) { - if (*(cmaps + i) == wattrib.colormap) - // this window is using an installed color map... do not install - install = False; - } - // otherwise, install the window's colormap - if (install) - XInstallColormap(display, wattrib.colormap); + // install the window's colormap + for (i = 0; i < ncmap; i++) { + if (*(cmaps + i) == wattrib.colormap) + // this window is using an installed color map... do not install + install = False; + } + // otherwise, install the window's colormap + if (install) + XInstallColormap(display, wattrib.colormap); } else { - // uninstall the window's colormap - for (i = 0; i < ncmap; i++) { - if (*(cmaps + i) == wattrib.colormap) - // we found the colormap to uninstall - XUninstallColormap(display, wattrib.colormap); - } + // uninstall the window's colormap + for (i = 0; i < ncmap; i++) { + if (*(cmaps + i) == wattrib.colormap) + // we found the colormap to uninstall + XUninstallColormap(display, wattrib.colormap); + } } } @@ -1858,14 +1783,14 @@ void OpenboxWindow::setState(unsigned long new_state) { state[0] = (unsigned long) current_state; state[1] = (unsigned long) None; XChangeProperty(display, client.window, openbox.getWMStateAtom(), - openbox.getWMStateAtom(), 32, PropModeReplace, - (unsigned char *) state, 2); + openbox.getWMStateAtom(), 32, PropModeReplace, + (unsigned char *) state, 2); XChangeProperty(display, client.window, - openbox.getOpenboxAttributesAtom(), + openbox.getOpenboxAttributesAtom(), openbox.getOpenboxAttributesAtom(), 32, PropModeReplace, (unsigned char *) &openbox_attrib, - PropOpenboxAttributesElements); + PropOpenboxAttributesElements); } @@ -1878,9 +1803,9 @@ Bool OpenboxWindow::getState(void) { unsigned long *state, ulfoo, nitems; if ((XGetWindowProperty(display, client.window, openbox.getWMStateAtom(), - 0l, 2l, False, openbox.getWMStateAtom(), - &atom_return, &foo, &nitems, &ulfoo, - (unsigned char **) &state) != Success) || + 0l, 2l, False, openbox.getWMStateAtom(), + &atom_return, &foo, &nitems, &ulfoo, + (unsigned char **) &state) != Success) || (! state)) { openbox.ungrab(); return False; @@ -1964,11 +1889,11 @@ void OpenboxWindow::restoreAttributes(void) { OpenboxAttributes *net; int ret = XGetWindowProperty(display, client.window, - openbox.getOpenboxAttributesAtom(), 0l, - PropOpenboxAttributesElements, False, - openbox.getOpenboxAttributesAtom(), - &atom_return, &foo, &nitems, &ulfoo, - (unsigned char **) &net); + openbox.getOpenboxAttributesAtom(), 0l, + PropOpenboxAttributesElements, False, + openbox.getOpenboxAttributesAtom(), + &atom_return, &foo, &nitems, &ulfoo, + (unsigned char **) &net); if (ret != Success || !net || nitems != PropOpenboxAttributesElements) return; @@ -2120,18 +2045,18 @@ void OpenboxWindow::redrawLabel(void) { if (client.title_text_w > frame.label_w) { for (; dlen >= 0; dlen--) { - if (i18n->multibyte()) { - XRectangle ink, logical; - XmbTextExtents(screen->getWindowStyle()->fontset, client.title, dlen, - &ink, &logical); - l = logical.width; + if (i18n.multibyte()) { + XRectangle ink, logical; + XmbTextExtents(screen->getWindowStyle()->fontset, client.title, dlen, + &ink, &logical); + l = logical.width; } else { - l = XTextWidth(screen->getWindowStyle()->font, client.title, dlen); + l = XTextWidth(screen->getWindowStyle()->font, client.title, dlen); } l += (frame.bevel_w * 4); if (l < frame.label_w) - break; + break; } } @@ -2148,13 +2073,13 @@ void OpenboxWindow::redrawLabel(void) { WindowStyle *style = screen->getWindowStyle(); GC text_gc = (flags.focused) ? style->l_text_focus_gc : style->l_text_unfocus_gc; - if (i18n->multibyte()) + if (i18n.multibyte()) XmbDrawString(display, frame.label, style->fontset, text_gc, dx, - (1 - style->fontset_extents->max_ink_extent.y), - client.title, dlen); + (1 - style->fontset_extents->max_ink_extent.y), + client.title, dlen); else XDrawString(display, frame.label, text_gc, dx, - (style->font->ascent + 1), client.title, dlen); + (style->font->ascent + 1), client.title, dlen); } @@ -2170,17 +2095,17 @@ void OpenboxWindow::redrawIconifyButton(Bool pressed) { if (flags.focused) { if (frame.fbutton) XSetWindowBackgroundPixmap(display, frame.iconify_button, - frame.fbutton); + frame.fbutton); else XSetWindowBackground(display, frame.iconify_button, - frame.fbutton_pixel); + frame.fbutton_pixel); } else { if (frame.ubutton) XSetWindowBackgroundPixmap(display, frame.iconify_button, - frame.ubutton); + frame.ubutton); else XSetWindowBackground(display, frame.iconify_button, - frame.ubutton_pixel); + frame.ubutton_pixel); } } else { if (frame.pbutton) @@ -2191,9 +2116,9 @@ void OpenboxWindow::redrawIconifyButton(Bool pressed) { XClearWindow(display, frame.iconify_button); XDrawRectangle(display, frame.iconify_button, - ((flags.focused) ? screen->getWindowStyle()->b_pic_focus_gc : - screen->getWindowStyle()->b_pic_unfocus_gc), - 2, (frame.button_h - 5), (frame.button_w - 5), 2); + ((flags.focused) ? screen->getWindowStyle()->b_pic_focus_gc : + screen->getWindowStyle()->b_pic_unfocus_gc), + 2, (frame.button_h - 5), (frame.button_w - 5), 2); } @@ -2202,36 +2127,36 @@ void OpenboxWindow::redrawMaximizeButton(Bool pressed) { if (flags.focused) { if (frame.fbutton) XSetWindowBackgroundPixmap(display, frame.maximize_button, - frame.fbutton); + frame.fbutton); else XSetWindowBackground(display, frame.maximize_button, - frame.fbutton_pixel); + frame.fbutton_pixel); } else { if (frame.ubutton) XSetWindowBackgroundPixmap(display, frame.maximize_button, - frame.ubutton); + frame.ubutton); else XSetWindowBackground(display, frame.maximize_button, - frame.ubutton_pixel); + frame.ubutton_pixel); } } else { if (frame.pbutton) XSetWindowBackgroundPixmap(display, frame.maximize_button, - frame.pbutton); + frame.pbutton); else XSetWindowBackground(display, frame.maximize_button, - frame.pbutton_pixel); + frame.pbutton_pixel); } XClearWindow(display, frame.maximize_button); XDrawRectangle(display, frame.maximize_button, - ((flags.focused) ? screen->getWindowStyle()->b_pic_focus_gc : - screen->getWindowStyle()->b_pic_unfocus_gc), - 2, 2, (frame.button_w - 5), (frame.button_h - 5)); + ((flags.focused) ? screen->getWindowStyle()->b_pic_focus_gc : + screen->getWindowStyle()->b_pic_unfocus_gc), + 2, 2, (frame.button_w - 5), (frame.button_h - 5)); XDrawLine(display, frame.maximize_button, - ((flags.focused) ? screen->getWindowStyle()->b_pic_focus_gc : - screen->getWindowStyle()->b_pic_unfocus_gc), - 2, 3, (frame.button_w - 3), 3); + ((flags.focused) ? screen->getWindowStyle()->b_pic_focus_gc : + screen->getWindowStyle()->b_pic_unfocus_gc), + 2, 3, (frame.button_w - 3), 3); } @@ -2240,17 +2165,17 @@ void OpenboxWindow::redrawCloseButton(Bool pressed) { if (flags.focused) { if (frame.fbutton) XSetWindowBackgroundPixmap(display, frame.close_button, - frame.fbutton); + frame.fbutton); else XSetWindowBackground(display, frame.close_button, - frame.fbutton_pixel); + frame.fbutton_pixel); } else { if (frame.ubutton) XSetWindowBackgroundPixmap(display, frame.close_button, - frame.ubutton); + frame.ubutton); else XSetWindowBackground(display, frame.close_button, - frame.ubutton_pixel); + frame.ubutton_pixel); } } else { if (frame.pbutton) @@ -2261,13 +2186,13 @@ void OpenboxWindow::redrawCloseButton(Bool pressed) { XClearWindow(display, frame.close_button); XDrawLine(display, frame.close_button, - ((flags.focused) ? screen->getWindowStyle()->b_pic_focus_gc : - screen->getWindowStyle()->b_pic_unfocus_gc), 2, 2, + ((flags.focused) ? screen->getWindowStyle()->b_pic_focus_gc : + screen->getWindowStyle()->b_pic_unfocus_gc), 2, 2, (frame.button_w - 3), (frame.button_h - 3)); XDrawLine(display, frame.close_button, - ((flags.focused) ? screen->getWindowStyle()->b_pic_focus_gc : - screen->getWindowStyle()->b_pic_unfocus_gc), 2, - (frame.button_h - 3), + ((flags.focused) ? screen->getWindowStyle()->b_pic_focus_gc : + screen->getWindowStyle()->b_pic_unfocus_gc), 2, + (frame.button_h - 3), (frame.button_w - 3), 2); } @@ -2275,8 +2200,8 @@ void OpenboxWindow::redrawCloseButton(Bool pressed) { void OpenboxWindow::mapRequestEvent(XMapRequestEvent *re) { if (re->window == client.window) { #ifdef DEBUG - fprintf(stderr, i18n->getMessage(WindowSet, WindowMapRequest, - "OpenboxWindow::mapRequestEvent() for 0x%lx\n"), + fprintf(stderr, i18n(WindowSet, WindowMapRequest, + "OpenboxWindow::mapRequestEvent() for 0x%lx\n"), client.window); #endif // DEBUG @@ -2307,7 +2232,8 @@ void OpenboxWindow::mapRequestEvent(XMapRequestEvent *re) { case InactiveState: case ZoomState: default: - deiconify(False); + deiconify(False, True, True); // specify that we're initializing the + // window break; } @@ -2322,12 +2248,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 @@ -2344,36 +2266,39 @@ void OpenboxWindow::mapNotifyEvent(XMapEvent *ne) { void OpenboxWindow::unmapNotifyEvent(XUnmapEvent *ue) { if (ue->window == client.window) { #ifdef DEBUG - fprintf(stderr, i18n->getMessage(WindowSet, WindowUnmapNotify, - "OpenboxWindow::unmapNotifyEvent() for 0x%lx\n"), + fprintf(stderr, i18n(WindowSet, WindowUnmapNotify, + "OpenboxWindow::unmapNotifyEvent() for 0x%lx\n"), client.window); #endif // DEBUG openbox.grab(); if (! validateClient()) return; + if (flags.moving) + endMove(); + XChangeSaveSet(display, client.window, SetModeDelete); XSelectInput(display, client.window, NoEventMask); XDeleteProperty(display, client.window, openbox.getWMStateAtom()); XDeleteProperty(display, client.window, - openbox.getOpenboxAttributesAtom()); + openbox.getOpenboxAttributesAtom()); XUnmapWindow(display, frame.window); XUnmapWindow(display, client.window); XEvent dummy; if (! XCheckTypedWindowEvent(display, client.window, ReparentNotify, - &dummy)) { + &dummy)) { #ifdef DEBUG - fprintf(stderr, i18n->getMessage(WindowSet, WindowUnmapNotifyReparent, - "OpenboxWindow::unmapNotifyEvent(): reparent 0x%lx to " - "root.\n"), client.window); + fprintf(stderr, i18n(WindowSet, WindowUnmapNotifyReparent, + "OpenboxWindow::unmapNotifyEvent(): reparent 0x%lx to " + "root.\n"), client.window); #endif // DEBUG restoreGravity(); XReparentWindow(display, client.window, screen->getRootWindow(), - client.x, client.y); + client.x, client.y); } XFlush(display); @@ -2387,6 +2312,8 @@ void OpenboxWindow::unmapNotifyEvent(XUnmapEvent *ue) { void OpenboxWindow::destroyNotifyEvent(XDestroyWindowEvent *de) { if (de->window == client.window) { + if (flags.moving) + endMove(); XUnmapWindow(display, frame.window); delete this; @@ -2414,7 +2341,7 @@ void OpenboxWindow::propertyNotifyEvent(Atom atom) { flags.stuck = client.transient_for->flags.stuck; flags.transient = True; } else if (win == client.window_group) { - //jr This doesn't look quite right... + //jr This doesn't look quite right... if ((client.transient_for = openbox.searchGroup(win, this))) { client.transient_for->client.transient = this; flags.stuck = client.transient_for->flags.stuck; @@ -2462,10 +2389,10 @@ void OpenboxWindow::propertyNotifyEvent(Atom atom) { if (client.max_width <= client.min_width && client.max_height <= client.min_height) decorations.maximize = decorations.handle = - functions.resize = functions.maximize = False; + functions.resize = functions.maximize = False; else decorations.maximize = decorations.handle = - functions.resize = functions.maximize = True; + functions.resize = functions.maximize = True; } int x = frame.x, y = frame.y; @@ -2486,7 +2413,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(); } } @@ -2544,15 +2474,15 @@ void OpenboxWindow::configureRequestEvent(XConfigureRequestEvent *cr) { case Above: case TopIf: default: - if (flags.iconic) deiconify(); - screen->getWorkspace(workspace_number)->raiseWindow(this); - break; + if (flags.iconic) deiconify(); + screen->getWorkspace(workspace_number)->raiseWindow(this); + break; case Below: case BottomIf: - if (flags.iconic) deiconify(); - screen->getWorkspace(workspace_number)->lowerWindow(this); - break; + if (flags.iconic) deiconify(); + screen->getWorkspace(workspace_number)->lowerWindow(this); + break; } } @@ -2567,14 +2497,12 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { return; int stack_change = 1; // < 0 means to lower the window - // > 0 means to raise the window - // 0 means to leave it where it is - + // > 0 means to raise the window + // 0 means to leave it where it is + // alt + left/right click begins interactively moving/resizing the window // when the mouse is moved if (be->state == Mod1Mask && (be->button == 1 || be->button == 3)) { - frame.grab_x = be->x_root - frame.x - frame.border_w; - frame.grab_y = be->y_root - frame.y - frame.border_w; if (be->button == 3) { if (screen->getWindowZones() == 4 && be->y < (signed) frame.height / 2) { @@ -2589,15 +2517,15 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { resize_zone |= ZoneRight; } } - // control + left click on the titlebar shades the window + // control + left click on the titlebar shades the window } else if (be->state == ControlMask && be->button == 1) { if (be->window == frame.title || be->window == frame.label) shade(); - // left click + // left click } else if (be->state == 0 && be->button == 1) { if (windowmenu && windowmenu->isVisible()) - windowmenu->hide(); + windowmenu->hide(); if (be->window == frame.maximize_button) { redrawMaximizeButton(True); @@ -2611,7 +2539,7 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { be->window == frame.label) { // shade the window when the titlebar is double clicked if ( (be->time - lastButtonPressTime) <= - openbox.getDoubleClickInterval()) { + openbox.getDoubleClickInterval()) { lastButtonPressTime = 0; shade(); } else { @@ -2634,22 +2562,22 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { else if (be->window == frame.right_grip) resize_zone = ZoneBottom | ZoneRight; } - // middle click + // middle click } else if (be->state == 0 && be->button == 2) { if (be->window == frame.maximize_button) { redrawMaximizeButton(True); - // a middle click anywhere on the window's frame except for on the buttons - // will lower the window + // a middle click anywhere on the window's frame except for on the buttons + // will lower the window } else if (! (be->window == frame.iconify_button || be->window == frame.close_button) ) { stack_change = -1; } - // right click + // right click } else if (be->state == 0 && be->button == 3) { if (be->window == frame.maximize_button) { redrawMaximizeButton(True); - // a right click on the window's frame will show or hide the window's - // windowmenu + // a right click on the window's frame will show or hide the window's + // windowmenu } else if (be->window == frame.title || be->window == frame.label || be->window == frame.handle || @@ -2663,7 +2591,7 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { mx = be->x_root - windowmenu->getWidth() / 2; if (be->window == frame.title || be->window == frame.label) { my = frame.y + frame.title_h; - } else if (be->window = frame.handle) { + } else if (be->window == frame.handle) { my = frame.y + frame.y_handle - windowmenu->getHeight(); } else { // (be->window == frame.window) if (be->y <= (signed) frame.bevel_w) { @@ -2674,17 +2602,17 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { } if (mx > (signed) (frame.x + frame.width - - windowmenu->getWidth())) { + windowmenu->getWidth())) { mx = frame.x + frame.width - windowmenu->getWidth(); } else if (mx < frame.x) { mx = frame.x; } if (my > (signed) (frame.y + frame.y_handle - - windowmenu->getHeight())) { + windowmenu->getHeight())) { my = frame.y + frame.y_handle - windowmenu->getHeight(); } else if (my < (signed) (frame.y + - ((decorations.titlebar) ? frame.title_h : frame.y_border))) { + ((decorations.titlebar) ? frame.title_h : frame.y_border))) { my = frame.y + ((decorations.titlebar) ? frame.title_h : frame.y_border); } @@ -2697,16 +2625,16 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { } } } - // mouse wheel up + // mouse wheel up } else if (be->state == 0 && be->button == 4) { if ((be->window == frame.label || - be->window == frame.title) && + be->window == frame.title) && !flags.shaded) shade(); - // mouse wheel down + // mouse wheel down } else if (be->state == 0 && be->button == 5) { if ((be->window == frame.label || - be->window == frame.title) && + be->window == frame.title) && flags.shaded) shade(); } @@ -2719,7 +2647,7 @@ void OpenboxWindow::buttonPressEvent(XButtonEvent *be) { } else if (stack_change > 0) { screen->getWorkspace(workspace_number)->raiseWindow(this); } - + openbox.ungrab(); } @@ -2734,7 +2662,7 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) { if (re->window == frame.window) { XUngrabPointer(display, CurrentTime); // why? i dont know } - // left button released + // left button released } else if (re->button == 1) { if (re->window == frame.maximize_button) { if (re->state == Button1Mask && // only the left button was depressed @@ -2756,13 +2684,13 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) { if (re->state == Button1Mask && // only the left button was depressed (re->x >= 0) && ((unsigned) re->x <= frame.button_w) && (re->y >= 0) && ((unsigned) re->y <= frame.button_h)) { - close(); + close(); } //we should always redraw the close button. some applications //eg. acroread don't honour the close. redrawCloseButton(False); } - // middle button released + // middle button released } else if (re->button == 2) { if (re->window == frame.maximize_button) { if (re->state == Button2Mask && // only the middle button was depressed @@ -2773,7 +2701,7 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) { redrawMaximizeButton(False); } } - // right button released + // right button released } else if (re->button == 3) { if (re->window == frame.maximize_button) { if (re->state == Button3Mask && // only the right button was depressed @@ -2785,27 +2713,13 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) { } } } - + // when the window is being interactively moved, a button release stops the // move where it is if (flags.moving) { - flags.moving = False; - - openbox.maskWindowEvents(0, (OpenboxWindow *) 0); - if (!screen->opaqueMove()) { - XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.move_x, frame.move_y, frame.resize_w - 1, - frame.resize_h - 1); - - configure(frame.move_x, frame.move_y, frame.width, frame.height); - openbox.ungrab(); - } else { - configure(frame.x, frame.y, frame.width, frame.height); - } - screen->hideGeometry(); - XUngrabPointer(display, CurrentTime); - // when the window is being interactively resized, a button release stops the - // resizing + endMove(); + // when the window is being interactively resized, a button release stops the + // resizing } else if (flags.resizing) { flags.resizing = False; XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), @@ -2815,13 +2729,13 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) { if (resize_zone & ZoneLeft) { left_fixsize(); } else { // when resizing with "Alt+Button3", the resize is the same as if - // done with the right grip (the right side of the window is what - // moves) + // done with the right grip (the right side of the window is what + // moves) right_fixsize(); } // unset maximized state when resized after fully maximized if (flags.maximized == 1) { - maximize(0); + maximize(0); } configure(frame.resize_x, frame.resize_y, frame.resize_w - (frame.border_w * 2), @@ -2835,106 +2749,150 @@ void OpenboxWindow::buttonReleaseEvent(XButtonEvent *re) { } -void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { - if (!flags.resizing && (me->state & Button1Mask) && functions.move && - (frame.title == me->window || frame.label == me->window || - frame.handle == me->window || frame.window == me->window)) { - if (! flags.moving) { - XGrabPointer(display, me->window, False, Button1MotionMask | - ButtonReleaseMask, GrabModeAsync, GrabModeAsync, - None, openbox.getMoveCursor(), CurrentTime); +void OpenboxWindow::startMove(int x, int y) { + ASSERT(!flags.moving); - if (windowmenu && windowmenu->isVisible()) - windowmenu->hide(); + // make sure only one window is moving at a time + OpenboxWindow *w = openbox.getMaskedWindow(); + if (w != (OpenboxWindow *) 0 && w->flags.moving) + w->endMove(); - flags.moving = True; + XGrabPointer(display, frame.window, False, PointerMotionMask | + ButtonReleaseMask, GrabModeAsync, GrabModeAsync, + None, openbox.getMoveCursor(), CurrentTime); - openbox.maskWindowEvents(client.window, this); + if (windowmenu && windowmenu->isVisible()) + windowmenu->hide(); - if (! screen->opaqueMove()) { - openbox.grab(); + flags.moving = True; - frame.move_x = frame.x; - frame.move_y = frame.y; - frame.resize_w = frame.width + (frame.border_w * 2); - frame.resize_h = ((flags.shaded) ? frame.title_h : frame.height) + - (frame.border_w * 2); + openbox.maskWindowEvents(client.window, this); - screen->showPosition(frame.x, frame.y); + if (! screen->opaqueMove()) { + openbox.grab(); - XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.move_x, frame.move_y, - frame.resize_w - 1, frame.resize_h - 1); - } - } else { - int dx = me->x_root - frame.grab_x, dy = me->y_root - frame.grab_y; - - dx -= frame.border_w; - dy -= frame.border_w; - - int snap_distance = screen->edgeSnapThreshold(); - // width/height of the snapping window - unsigned int snap_w = frame.width + (frame.border_w * 2); - unsigned int snap_h = area().h() + (frame.border_w * 2); - if (snap_distance) { - int drx = screen->size().w() - (dx + snap_w); - - if (dx < drx && (dx > 0 && dx < snap_distance) || - (dx < 0 && dx > -snap_distance) ) - dx = 0; - else if ( (drx > 0 && drx < snap_distance) || - (drx < 0 && drx > -snap_distance) ) - dx = screen->size().w() - snap_w; - - int dtty, dbby, dty, dby; - switch (screen->getToolbar()->placement()) { - case Toolbar::TopLeft: - case Toolbar::TopCenter: - case Toolbar::TopRight: - dtty = screen->getToolbar()->getExposedHeight() + - frame.border_w; - dbby = screen->size().h(); - break; - - default: - dtty = 0; - dbby = screen->getToolbar()->area().y(); - break; - } + frame.move_x = frame.x; + frame.move_y = frame.y; + frame.resize_w = frame.width + (frame.border_w * 2); + frame.resize_h = ((flags.shaded) ? frame.title_h : frame.height) + + (frame.border_w * 2); - dty = dy - dtty; - dby = dbby - (dy + snap_h); + screen->showPosition(frame.x, frame.y); - if ( (dy > 0 && dty < snap_distance) || - (dy < 0 && dty > -snap_distance) ) - dy = dtty; - else if ( (dby > 0 && dby < snap_distance) || - (dby < 0 && dby > -snap_distance) ) - dy = dbby - snap_h; - } + XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), + frame.move_x, frame.move_y, + frame.resize_w - 1, frame.resize_h - 1); + } + frame.grab_x = x - frame.x - frame.border_w; + frame.grab_y = y - frame.y - frame.border_w; +} - if (screen->opaqueMove()) { - configure(dx, dy, frame.width, frame.height); - } else { - XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.move_x, frame.move_y, frame.resize_w - 1, - frame.resize_h - 1); - frame.move_x = dx; - frame.move_y = dy; +void OpenboxWindow::doMove(int x, int y) { + ASSERT(flags.moving); - XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.move_x, frame.move_y, frame.resize_w - 1, - frame.resize_h - 1); - } + int dx = x - frame.grab_x, dy = y - frame.grab_y; + + dx -= frame.border_w; + dy -= frame.border_w; - screen->showPosition(dx, dy); + int snap_distance = screen->edgeSnapThreshold(); + // width/height of the snapping window + unsigned int snap_w = frame.width + (frame.border_w * 2); + unsigned int snap_h = area().h() + (frame.border_w * 2); + if (snap_distance) { + int drx = screen->size().w() - (dx + snap_w); + + if (dx < drx && (dx > 0 && dx < snap_distance) || + (dx < 0 && dx > -snap_distance) ) + dx = 0; + else if ( (drx > 0 && drx < snap_distance) || + (drx < 0 && drx > -snap_distance) ) + dx = screen->size().w() - snap_w; + + int dtty, dbby, dty, dby; + switch (screen->getToolbar()->placement()) { + case Toolbar::TopLeft: + case Toolbar::TopCenter: + case Toolbar::TopRight: + dtty = screen->getToolbar()->getExposedHeight() + + frame.border_w; + dbby = screen->size().h(); + break; + + default: + dtty = 0; + dbby = screen->getToolbar()->area().y(); + break; } - } else if (functions.resize && - (((me->state & Button1Mask) && (me->window == frame.right_grip || - me->window == frame.left_grip)) || - (me->state & (Mod1Mask | Button3Mask) && - me->window == frame.window))) { + + dty = dy - dtty; + dby = dbby - (dy + snap_h); + + if ( (dy > 0 && dty < snap_distance) || + (dy < 0 && dty > -snap_distance) ) + dy = dtty; + else if ( (dby > 0 && dby < snap_distance) || + (dby < 0 && dby > -snap_distance) ) + dy = dbby - snap_h; + } + + if (screen->opaqueMove()) { + configure(dx, dy, frame.width, frame.height); + } else { + XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), + frame.move_x, frame.move_y, frame.resize_w - 1, + frame.resize_h - 1); + + frame.move_x = dx; + frame.move_y = dy; + + XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), + frame.move_x, frame.move_y, frame.resize_w - 1, + frame.resize_h - 1); + } + + screen->showPosition(dx, dy); +} + + +void OpenboxWindow::endMove() { + ASSERT(flags.moving); + + flags.moving = False; + + openbox.maskWindowEvents(0, (OpenboxWindow *) 0); + if (!screen->opaqueMove()) { + XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), + frame.move_x, frame.move_y, frame.resize_w - 1, + frame.resize_h - 1); + + configure(frame.move_x, frame.move_y, frame.width, frame.height); + openbox.ungrab(); + } else { + configure(frame.x, frame.y, frame.width, frame.height); + } + screen->hideGeometry(); + XUngrabPointer(display, CurrentTime); + // if there are any left over motions from the move, drop them now cuz they + // cause problems + XEvent e; + while (XCheckTypedWindowEvent(display, frame.window, MotionNotify, &e)); +} + + +void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { + if (flags.moving) + doMove(me->x_root, me->y_root); + else if (!flags.resizing && (me->state & Button1Mask) && functions.move && + (frame.title == me->window || frame.label == me->window || + frame.handle == me->window || frame.window == me->window)) + startMove(me->x_root, me->y_root); + else if (functions.resize && + (((me->state & Button1Mask) && (me->window == frame.right_grip || + me->window == frame.left_grip)) || + (me->state == (Mod1Mask | Button3Mask) && + me->window == frame.window))) { Bool left = resize_zone & ZoneLeft; if (! flags.resizing) { @@ -2972,17 +2930,17 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { if (left) left_fixsize(&gx, &gy); else - right_fixsize(&gx, &gy); + right_fixsize(&gx, &gy); screen->showGeometry(gx, gy); XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.resize_x, frame.resize_y, - frame.resize_w - 1, frame.resize_h - 1); + frame.resize_x, frame.resize_y, + frame.resize_w - 1, frame.resize_h - 1); } else { XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.resize_x, frame.resize_y, - frame.resize_w - 1, frame.resize_h - 1); + frame.resize_x, frame.resize_y, + frame.resize_w - 1, frame.resize_h - 1); int gx, gy; @@ -2999,15 +2957,15 @@ void OpenboxWindow::motionNotifyEvent(XMotionEvent *me) { left_fixsize(&gx, &gy); } else { - frame.resize_w = frame.width + (me->x - frame.grab_x); - if (frame.resize_w < 1) frame.resize_w = 1; + frame.resize_w = frame.width + (me->x - frame.grab_x); + if (frame.resize_w < 1) frame.resize_w = 1; - right_fixsize(&gx, &gy); + right_fixsize(&gx, &gy); } XDrawRectangle(display, screen->getRootWindow(), screen->getOpGC(), - frame.resize_x, frame.resize_y, - frame.resize_w - 1, frame.resize_h - 1); + frame.resize_x, frame.resize_y, + frame.resize_w - 1, frame.resize_h - 1); screen->showGeometry(gx, gy); } @@ -3022,9 +2980,9 @@ void OpenboxWindow::shapeEvent(XShapeEvent *) { openbox.grab(); if (! validateClient()) return; XShapeCombineShape(display, frame.window, ShapeBounding, - frame.mwm_border_w, frame.y_border + - frame.mwm_border_w, client.window, - ShapeBounding, ShapeSet); + frame.mwm_border_w, frame.y_border + + frame.mwm_border_w, client.window, + ShapeBounding, ShapeSet); int num = 1; XRectangle xrect[2]; @@ -3033,15 +2991,15 @@ void OpenboxWindow::shapeEvent(XShapeEvent *) { xrect[0].height = frame.y_border; if (decorations.handle) { - xrect[1].x = 0; - xrect[1].y = frame.y_handle; - xrect[1].width = frame.width; - xrect[1].height = frame.handle_h + frame.border_w; - num++; + xrect[1].x = 0; + xrect[1].y = frame.y_handle; + xrect[1].width = frame.width; + xrect[1].height = frame.handle_h + frame.border_w; + num++; } XShapeCombineRectangles(display, frame.window, ShapeBounding, 0, 0, - xrect, num, ShapeUnion, Unsorted); + xrect, num, ShapeUnion, Unsorted); openbox.ungrab(); } } @@ -3049,7 +3007,7 @@ void OpenboxWindow::shapeEvent(XShapeEvent *) { #endif // SHAPE -Bool OpenboxWindow::validateClient(void) { +bool OpenboxWindow::validateClient(void) { XSync(display, False); XEvent e; @@ -3058,10 +3016,10 @@ Bool OpenboxWindow::validateClient(void) { XPutBackEvent(display, &e); openbox.ungrab(); - return False; + return false; } - return True; + return true; } @@ -3080,6 +3038,8 @@ void OpenboxWindow::restore(void) { XMapWindow(display, client.window); XFlush(display); + + delete this; } @@ -3131,27 +3091,31 @@ void OpenboxWindow::changeOpenboxHints(OpenboxHints *net) { switch (net->decoration) { case DecorNone: decorations.titlebar = decorations.border = decorations.handle = - decorations.iconify = decorations.maximize = decorations.menu = False; + decorations.iconify = decorations.maximize = decorations.menu = False; break; default: case DecorNormal: - decorations.titlebar = decorations.border = decorations.handle = - decorations.iconify = decorations.maximize = decorations.menu = True; + decorations.titlebar = decorations.iconify = decorations.menu = + decorations.border = True; + decorations.handle = (functions.resize && !flags.transient); + decorations.maximize = functions.maximize; break; case DecorTiny: decorations.titlebar = decorations.iconify = decorations.menu = True; - decorations.border = decorations.handle = decorations.maximize = False; - + decorations.border = decorations.border = decorations.handle = False; + decorations.maximize = functions.maximize; + break; case DecorTool: - decorations.titlebar = decorations.menu = functions.move = True; - decorations.iconify = decorations.border = decorations.handle = - decorations.maximize = False; + decorations.titlebar = decorations.menu = True; + decorations.iconify = decorations.border = False; + decorations.handle = (functions.resize && !flags.transient); + decorations.maximize = functions.maximize; break; } @@ -3189,12 +3153,12 @@ void OpenboxWindow::upsize(void) { // the height of the titlebar is based upon the height of the font being // used to display the window's title WindowStyle *style = screen->getWindowStyle(); - if (i18n->multibyte()) + if (i18n.multibyte()) frame.title_h = (style->fontset_extents->max_ink_extent.height + - (frame.bevel_w * 2) + 2); + (frame.bevel_w * 2) + 2); else frame.title_h = (style->font->ascent + style->font->descent + - (frame.bevel_w * 2) + 2); + (frame.bevel_w * 2) + 2); frame.label_h = frame.title_h - (frame.bevel_w * 2); frame.button_w = frame.button_h = (frame.label_h - 2); @@ -3217,7 +3181,7 @@ void OpenboxWindow::upsize(void) { frame.handle_h = 0; frame.grip_w = frame.grip_h = 0; } - + frame.width = client.width + (frame.mwm_border_w * 2); frame.height = frame.y_handle + frame.handle_h; } @@ -3247,9 +3211,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); @@ -3267,9 +3231,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; @@ -3279,9 +3243,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); @@ -3299,13 +3263,13 @@ 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.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; - + }