X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=a876e110352d5e3c38688cbf49fad1a15046cab4;hb=6284d4ef9036764d4e6f708ca5f38aa7c1749865;hp=2bc7265d5fe93a52575c79c280e99b3259ef2503;hpb=c04cb76409820b3fa7543a49d21521907d1c9377;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index 2bc7265d..a876e110 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -55,6 +55,7 @@ extern "C" { #include "Workspace.hh" #include "Slit.hh" +using std::string; /* * Initializes the class with default values/the window's set initial values. @@ -649,54 +650,86 @@ void BlackboxWindow::destroyMaximizeButton(void) { void BlackboxWindow::positionButtons(bool redecorate_label) { - unsigned int bw = frame.button_w + frame.bevel_w + 1, - by = frame.bevel_w + 1, lx = by, lw = frame.inside_w - by; - - if (decorations & Decor_Iconify) { - if (frame.iconify_button == None) createIconifyButton(); - - XMoveResizeWindow(blackbox->getXDisplay(), frame.iconify_button, by, by, - frame.button_w, frame.button_w); - XMapWindow(blackbox->getXDisplay(), frame.iconify_button); - XClearWindow(blackbox->getXDisplay(), frame.iconify_button); - - lx += bw; - lw -= bw; - } else if (frame.iconify_button) { - destroyIconifyButton(); + string layout = blackbox->getTitlebarLayout(); + string parsed; + + bool hasclose, hasiconify, hasmaximize, haslabel; + hasclose = hasiconify = hasmaximize = haslabel = false; + + string::const_iterator it, end; + for (it = layout.begin(), end = layout.end(); it != end; ++it) { + switch(*it) { + case 'C': + if (! hasclose && (decorations & Decor_Close)) { + hasclose = true; + parsed += *it; + } + break; + case 'I': + if (! hasiconify && (decorations & Decor_Iconify)) { + hasiconify = true; + parsed += *it; + } + break; + case 'M': + if (! hasmaximize && (decorations & Decor_Maximize)) { + hasmaximize = true; + parsed += *it; + } + break; + case 'L': + if (! haslabel) { + haslabel = true; + parsed += *it; + } + } } - int bx = frame.inside_w - bw; - - if (decorations & Decor_Close) { - if (frame.close_button == None) createCloseButton(); - - XMoveResizeWindow(blackbox->getXDisplay(), frame.close_button, bx, by, - frame.button_w, frame.button_w); - XMapWindow(blackbox->getXDisplay(), frame.close_button); - XClearWindow(blackbox->getXDisplay(), frame.close_button); - - bx -= bw; - lw -= bw; - } else if (frame.close_button) { + if (! hasclose && frame.close_button) destroyCloseButton(); - } - if (decorations & Decor_Maximize) { - if (frame.maximize_button == None) createMaximizeButton(); - - XMoveResizeWindow(blackbox->getXDisplay(), frame.maximize_button, bx, by, - frame.button_w, frame.button_w); - XMapWindow(blackbox->getXDisplay(), frame.maximize_button); - XClearWindow(blackbox->getXDisplay(), frame.maximize_button); - - lw -= bw; - } else if (frame.maximize_button) { + if (! hasiconify && frame.iconify_button) + destroyIconifyButton(); + if (! hasmaximize && frame.maximize_button) destroyMaximizeButton(); + if (! haslabel) + parsed += 'L'; // require that the label be in the layout + + const unsigned int bsep = frame.bevel_w + 1; // separation between elements + const unsigned int by = frame.bevel_w + 1; + const unsigned int ty = frame.bevel_w; + + frame.label_w = frame.inside_w - bsep * 2 - + (frame.button_w + bsep) * (parsed.size() - 1); + + unsigned int x = bsep; + for (it = parsed.begin(), end = parsed.end(); it != end; ++it) { + switch(*it) { + case 'C': + if (!frame.close_button) createCloseButton(); + XMoveResizeWindow(blackbox->getXDisplay(), frame.close_button, x, by, + frame.button_w, frame.button_w); + x += frame.button_w + bsep; + break; + case 'I': + if (!frame.iconify_button) createIconifyButton(); + XMoveResizeWindow(blackbox->getXDisplay(), frame.iconify_button, x, by, + frame.button_w, frame.button_w); + x += frame.button_w + bsep; + break; + case 'M': + if (!frame.maximize_button) createMaximizeButton(); + XMoveResizeWindow(blackbox->getXDisplay(), frame.maximize_button, x, by, + frame.button_w, frame.button_w); + x += frame.button_w + bsep; + break; + case 'L': + XMoveResizeWindow(blackbox->getXDisplay(), frame.label, x, ty, + frame.label_w, frame.label_h); + x += frame.label_w + bsep; + break; + } } - frame.label_w = lw - by; - XMoveResizeWindow(blackbox->getXDisplay(), frame.label, lx, frame.bevel_w, - frame.label_w, frame.label_h); - if (redecorate_label) decorateLabel(); + if (redecorate_label) decorateLabel(); redrawLabel(); redrawAllButtons(); } @@ -906,12 +939,18 @@ void BlackboxWindow::getWMNormalHints(void) { long icccm_mask; XSizeHints sizehint; - const Rect& screen_area = screen->availableArea(); - client.min_width = client.min_height = client.width_inc = client.height_inc = 1; client.base_width = client.base_height = 0; + + /* + use the full screen, not the strut modified size. otherwise when the + availableArea changes max_width/height will be incorrect and lead to odd + rendering bugs. + */ + const Rect& screen_area = screen->getRect(); client.max_width = screen_area.width(); + client.max_height = screen_area.height(); client.min_aspect_x = client.min_aspect_y = client.max_aspect_x = client.max_aspect_y = 1; @@ -1119,8 +1158,8 @@ void BlackboxWindow::getTransientInfo(void) { client.transient_for = 0; Window trans_for; - if (!XGetTransientForHint(blackbox->getXDisplay(), client.window, - &trans_for)) { + if (! XGetTransientForHint(blackbox->getXDisplay(), client.window, + &trans_for)) { // transient_for hint not set return; } @@ -1447,7 +1486,7 @@ void BlackboxWindow::maximize(unsigned int button) { flags currently set. Otherwise it still thinks it is maximized. so we do not need to call configure() because resizing will handle it */ - if (!flags.resizing) + if (! flags.resizing) configure(blackbox_attrib.premax_x, blackbox_attrib.premax_y, blackbox_attrib.premax_w, blackbox_attrib.premax_h); @@ -1535,9 +1574,6 @@ void BlackboxWindow::setWorkspace(unsigned int n) { void BlackboxWindow::shade(void) { - if (! (decorations & Decor_Titlebar)) - return; - if (flags.shaded) { XResizeWindow(blackbox->getXDisplay(), frame.window, frame.inside_w, frame.inside_h); @@ -1551,6 +1587,9 @@ void BlackboxWindow::shade(void) { frame.rect.setHeight(client.rect.height() + frame.margin.top + frame.margin.bottom); } else { + if (! (decorations & Decor_Titlebar)) + return; + XResizeWindow(blackbox->getXDisplay(), frame.window, frame.inside_w, frame.title_h); flags.shaded = True; @@ -1770,7 +1809,7 @@ void BlackboxWindow::restoreAttributes(void) { blackbox->getBlackboxAttributesAtom(), &atom_return, &foo, &nitems, &ulfoo, (unsigned char **) &net); - if (ret != Success || !net || nitems != PropBlackboxAttributesElements) + if (ret != Success || ! net || nitems != PropBlackboxAttributesElements) return; if (net->flags & AttribShaded && @@ -2363,6 +2402,18 @@ void BlackboxWindow::buttonPressEvent(XButtonEvent *be) { windowmenu->hide(); } } + // mouse wheel up + } else if (be->button == 4) { + if ((be->window == frame.label || + be->window == frame.title) && + ! flags.shaded) + shade(); + // mouse wheel down + } else if (be->button == 5) { + if ((be->window == frame.label || + be->window == frame.title) && + flags.shaded) + shade(); } } @@ -2435,7 +2486,7 @@ void BlackboxWindow::buttonReleaseEvent(XButtonEvent *re) { void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) { - if (!flags.resizing && (me->state & Button1Mask) && + if (! flags.resizing && (me->state & Button1Mask) && (functions & Func_Move) && (frame.title == me->window || frame.label == me->window || frame.handle == me->window || frame.window == me->window)) { @@ -2735,6 +2786,11 @@ void BlackboxWindow::changeBlackboxHints(BlackboxHints *net) { break; } + + // we can not be shaded if we lack a titlebar + if (flags.shaded && ! (decorations & Decor_Titlebar)) + shade(); + if (frame.window) { XMapSubwindows(blackbox->getXDisplay(), frame.window); XMapWindow(blackbox->getXDisplay(), frame.window); @@ -2757,7 +2813,7 @@ void BlackboxWindow::upsize(void) { if (decorations & Decor_Border) { frame.border_w = screen->getBorderWidth(); - if (!isTransient()) + if (! isTransient()) frame.mwm_border_w = screen->getFrameWidth(); else frame.mwm_border_w = 0;