X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2FWindow.cc;h=680943e214d5eb3c3e8453b8043f4573ad086064;hb=9af642d29918e8b36d7f1fd17e4c771662d4fe97;hp=02783d20a5fea23cd87d7a06a696cf3b40234be9;hpb=c1e79a4a8277d3be30439d3b1680b9e4f7092d41;p=chaz%2Fopenbox diff --git a/src/Window.cc b/src/Window.cc index 02783d20..680943e2 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -40,7 +40,7 @@ extern "C" { #endif // DEBUG #ifdef HAVE_STDLIB_H - #include +# include #endif // HAVE_STDLIB_H } @@ -134,12 +134,11 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) { frame.ulabel_pixel = frame.flabel_pixel = frame.utitle_pixel = frame.ftitle_pixel = frame.uhandle_pixel = frame.fhandle_pixel = - frame.ubutton_pixel = frame.fbutton_pixel = frame.pbutton_pixel = - frame.uborder_pixel = frame.fborder_pixel = frame.ugrip_pixel = - frame.fgrip_pixel = 0; + frame.ubutton_pixel = frame.fbutton_pixel = frame.uborder_pixel = + frame.fborder_pixel = frame.ugrip_pixel = frame.fgrip_pixel = 0; frame.utitle = frame.ftitle = frame.uhandle = frame.fhandle = None; frame.ulabel = frame.flabel = frame.ubutton = frame.fbutton = None; - frame.pbutton = frame.ugrip = frame.fgrip = None; + frame.ugrip = frame.fgrip = None; functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize; mwm_decorations = Decor_Titlebar | Decor_Handle | Decor_Border | @@ -475,7 +474,13 @@ Window BlackboxWindow::createToplevelWindow(void) { attrib_create.background_pixmap = None; attrib_create.colormap = screen->getColormap(); attrib_create.override_redirect = True; - attrib_create.event_mask = EnterWindowMask | LeaveWindowMask; + attrib_create.event_mask = EnterWindowMask | LeaveWindowMask | + ButtonPress; + /* + We catch button presses because other wise they get passed down to the + root window, which will then cause root menus to show when you click the + window's frame. + */ return XCreateWindow(blackbox->getXDisplay(), screen->getRootWindow(), 0, 0, 1, 1, frame.border_w, screen->getDepth(), @@ -565,11 +570,50 @@ void BlackboxWindow::decorate(void) { if (! frame.ubutton) frame.ubutton_pixel = texture->color().pixel(); - texture = &(screen->getWindowStyle()->b_pressed); - frame.pbutton = texture->render(frame.button_w, frame.button_w, - frame.pbutton); - if (! frame.pbutton) - frame.pbutton_pixel = texture->color().pixel(); + unsigned char needsPressed = 0; + + texture = &(screen->getWindowStyle()->b_pressed_focus); + + if (texture->texture() != BTexture::NoTexture) { + frame.pfbutton = texture->render(frame.button_w, frame.button_w, + frame.pfbutton); + if (! frame.pfbutton) + frame.pfbutton_pixel = texture->color().pixel(); + } else { + needsPressed = 0x1; + } + + texture = &(screen->getWindowStyle()->b_pressed_unfocus); + + if (texture->texture() != BTexture::NoTexture) { + frame.pubutton = texture->render(frame.button_w, frame.button_w, + frame.pubutton); + if (! frame.pubutton) + frame.pubutton = texture->color().pixel(); + } else { + needsPressed |= 0x2; + } + + // if we either pressed unfocused, or pressed focused were undefined, + // make them inherit from the old resource. It's a hack for sure, but + // it allows for some backwards and forwards compatibility. + if (needsPressed) { + texture = &(screen->getWindowStyle()->b_pressed); + + if (needsPressed & 0x1) { + frame.pfbutton = texture->render(frame.button_w, frame.button_w, + frame.pfbutton); + if (! frame.pfbutton) + frame.pfbutton_pixel = texture->color().pixel(); + } + if (needsPressed & 0x2) { + frame.pubutton = texture->render(frame.button_w, frame.button_w, + frame.pubutton); + if (! frame.pubutton) + frame.pubutton = texture->color().pixel(); + } + + } if (decorations & Decor_Titlebar) { texture = &(screen->getWindowStyle()->t_focus); @@ -722,7 +766,7 @@ void BlackboxWindow::destroyTitlebar(void) { if (frame.stick_button) destroyStickyButton(); - + if (frame.ftitle) screen->getImageControl()->removeImage(frame.ftitle); @@ -741,9 +785,6 @@ void BlackboxWindow::destroyTitlebar(void) { if (frame.ubutton) screen->getImageControl()->removeImage(frame.ubutton); - if (frame.pbutton) - screen->getImageControl()->removeImage(frame.pbutton); - blackbox->removeWindowSearch(frame.title); blackbox->removeWindowSearch(frame.label); @@ -2583,144 +2624,184 @@ void BlackboxWindow::redrawAllButtons(void) const { } -void BlackboxWindow::redrawIconifyButton(bool pressed) const { - if (! pressed) { +void BlackboxWindow::redrawButton(bool pressed, Window win, + Pixmap fppix, unsigned long fppixel, + Pixmap uppix, unsigned long uppixel, + Pixmap fpix, unsigned long fpixel, + Pixmap upix, unsigned long upixel) const { + Pixmap p; + unsigned long pix; + + if (pressed) { if (flags.focused) { - if (frame.fbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.iconify_button, frame.fbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), - frame.iconify_button, frame.fbutton_pixel); + p = fppix; + pix = fppixel; } else { - if (frame.ubutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.iconify_button, frame.ubutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.iconify_button, - frame.ubutton_pixel); + p = uppix; + pix = uppixel; } } else { - if (frame.pbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.iconify_button, frame.pbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), - frame.iconify_button, frame.pbutton_pixel); + if (flags.focused) { + p = fpix; + pix = fpixel; + } else { + p = upix; + pix = upixel; + } } - XClearWindow(blackbox->getXDisplay(), frame.iconify_button); + + if (p) + XSetWindowBackgroundPixmap(blackbox->getXDisplay(), win, p); + else + XSetWindowBackground(blackbox->getXDisplay(), win, pix); - BPen pen((flags.focused) ? screen->getWindowStyle()->b_pic_focus : - screen->getWindowStyle()->b_pic_unfocus); - XDrawRectangle(blackbox->getXDisplay(), frame.iconify_button, pen.gc(), - 2, (frame.button_w - 5), (frame.button_w - 5), 2); } +void BlackboxWindow::redrawIconifyButton(bool pressed) const { + redrawButton(pressed, frame.iconify_button, + frame.pfbutton, frame.pfbutton_pixel, + frame.pubutton, frame.pubutton_pixel, + frame.fbutton, frame.fbutton_pixel, + frame.ubutton, frame.ubutton_pixel); -void BlackboxWindow::redrawMaximizeButton(bool pressed) const { - if (! pressed) { - if (flags.focused) { - if (frame.fbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.maximize_button, frame.fbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.maximize_button, - frame.fbutton_pixel); - } else { - if (frame.ubutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.maximize_button, frame.ubutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.maximize_button, - frame.ubutton_pixel); - } + XClearWindow(blackbox->getXDisplay(), frame.iconify_button); + BPen pen((flags.focused) ? screen->getWindowStyle()->b_pic_focus : + screen->getWindowStyle()->b_pic_unfocus); + +#ifdef BITMAPBUTTONS + PixmapMask pm = screen->getWindowStyle()->icon_button; + + if (screen->getWindowStyle()->icon_button.mask != None) { + XSetClipMask(blackbox->getXDisplay(), pen.gc(), pm.mask); + XSetClipOrigin(blackbox->getXDisplay(), pen.gc(), + (frame.button_w - pm.w)/2, (frame.button_w - pm.h)/2); + + XFillRectangle(blackbox->getXDisplay(), frame.iconify_button, pen.gc(), + (frame.button_w - pm.w)/2, (frame.button_w - pm.h)/2, + (frame.button_w + pm.w)/2, (frame.button_w + pm.h)/2); + + XSetClipMask(blackbox->getXDisplay(), pen.gc(), None); + XSetClipOrigin(blackbox->getXDisplay(), pen.gc(), 0, 0); } else { - if (frame.pbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.maximize_button, frame.pbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.maximize_button, - frame.pbutton_pixel); +#endif // BITMAPBUTTONS + XDrawRectangle(blackbox->getXDisplay(), frame.iconify_button, pen.gc(), + 2, (frame.button_w - 5), (frame.button_w - 5), 2); +#ifdef BITMAPBUTTONS } +#endif // BITMAPBUTTONS +} + + +void BlackboxWindow::redrawMaximizeButton(bool pressed) const { + redrawButton(pressed, frame.maximize_button, + frame.pfbutton, frame.pfbutton_pixel, + frame.pubutton, frame.pubutton_pixel, + frame.fbutton, frame.fbutton_pixel, + frame.ubutton, frame.ubutton_pixel); + XClearWindow(blackbox->getXDisplay(), frame.maximize_button); BPen pen((flags.focused) ? screen->getWindowStyle()->b_pic_focus : screen->getWindowStyle()->b_pic_unfocus); - XDrawRectangle(blackbox->getXDisplay(), frame.maximize_button, pen.gc(), - 2, 2, (frame.button_w - 5), (frame.button_w - 5)); - XDrawLine(blackbox->getXDisplay(), frame.maximize_button, pen.gc(), - 2, 3, (frame.button_w - 3), 3); + +#ifdef BITMAPBUTTONS + PixmapMask pm = screen->getWindowStyle()->max_button; + + if (pm.mask != None) { + XSetClipMask(blackbox->getXDisplay(), pen.gc(), pm.mask); + XSetClipOrigin(blackbox->getXDisplay(), pen.gc(), + (frame.button_w - pm.w)/2, (frame.button_w - pm.h)/2); + + XFillRectangle(blackbox->getXDisplay(), frame.maximize_button, pen.gc(), + (frame.button_w - pm.w)/2, (frame.button_w - pm.h)/2, + (frame.button_w + pm.w)/2, (frame.button_w + pm.h)/2); + + XSetClipOrigin(blackbox->getXDisplay(), pen.gc(), 0, 0 ); + XSetClipMask( blackbox->getXDisplay(), pen.gc(), None ); + } else { +#endif // BITMAPBUTTONS + XDrawRectangle(blackbox->getXDisplay(), frame.maximize_button, pen.gc(), + 2, 2, (frame.button_w - 5), (frame.button_w - 5)); + XDrawLine(blackbox->getXDisplay(), frame.maximize_button, pen.gc(), + 2, 3, (frame.button_w - 3), 3); +#ifdef BITMAPBUTTONS + } +#endif // BITMAPBUTTONS } void BlackboxWindow::redrawCloseButton(bool pressed) const { - if (! pressed) { - if (flags.focused) { - if (frame.fbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), frame.close_button, - frame.fbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.close_button, - frame.fbutton_pixel); - } else { - if (frame.ubutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), frame.close_button, - frame.ubutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.close_button, - frame.ubutton_pixel); - } - } else { - if (frame.pbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.close_button, frame.pbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), - frame.close_button, frame.pbutton_pixel); - } + redrawButton(pressed, frame.close_button, + frame.pfbutton, frame.pfbutton_pixel, + frame.pubutton, frame.pubutton_pixel, + frame.fbutton, frame.fbutton_pixel, + frame.ubutton, frame.ubutton_pixel); + XClearWindow(blackbox->getXDisplay(), frame.close_button); BPen pen((flags.focused) ? screen->getWindowStyle()->b_pic_focus : screen->getWindowStyle()->b_pic_unfocus); - XDrawLine(blackbox->getXDisplay(), frame.close_button, pen.gc(), - 2, 2, (frame.button_w - 3), (frame.button_w - 3)); - XDrawLine(blackbox->getXDisplay(), frame.close_button, pen.gc(), - 2, (frame.button_w - 3), (frame.button_w - 3), 2); -} + +#ifdef BITMAPBUTTONS + PixmapMask pm = screen->getWindowStyle()->close_button; + if (pm.mask != None) { + XSetClipMask(blackbox->getXDisplay(), pen.gc(), pm.mask); + XSetClipOrigin(blackbox->getXDisplay(), pen.gc(), + (frame.button_w - pm.w)/2, (frame.button_w - pm.h)/2); + + XFillRectangle(blackbox->getXDisplay(), frame.close_button, pen.gc(), + (frame.button_w - pm.w)/2, (frame.button_w - pm.h)/2, + (frame.button_w + pm.w)/2, (frame.button_w + pm.h)/2); -void BlackboxWindow::redrawStickyButton(bool pressed) const { - if (! pressed) { - if (flags.focused) { - if (frame.fbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.stick_button, frame.fbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.stick_button, - frame.fbutton_pixel); - } else { - if (frame.ubutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.stick_button, frame.ubutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.stick_button, - frame.ubutton_pixel); - } + + XSetClipOrigin(blackbox->getXDisplay(), pen.gc(), 0, 0 ); + XSetClipMask( blackbox->getXDisplay(), pen.gc(), None ); } else { - if (frame.pbutton) - XSetWindowBackgroundPixmap(blackbox->getXDisplay(), - frame.stick_button, frame.pbutton); - else - XSetWindowBackground(blackbox->getXDisplay(), frame.stick_button, - frame.pbutton_pixel); - } +#endif // BITMAPBUTTONS + XDrawLine(blackbox->getXDisplay(), frame.close_button, pen.gc(), + 2, 2, (frame.button_w - 3), (frame.button_w - 3)); + XDrawLine(blackbox->getXDisplay(), frame.close_button, pen.gc(), + 2, (frame.button_w - 3), (frame.button_w - 3), 2); +#ifdef BITMAPBUTTONS + } +#endif // BITMAPBUTTONS +} + +void BlackboxWindow::redrawStickyButton(bool pressed) const { + redrawButton(pressed, frame.stick_button, + frame.pfbutton, frame.pfbutton_pixel, + frame.pubutton, frame.pubutton_pixel, + frame.fbutton, frame.fbutton_pixel, + frame.ubutton, frame.ubutton_pixel); + XClearWindow(blackbox->getXDisplay(), frame.stick_button); BPen pen((flags.focused) ? screen->getWindowStyle()->b_pic_focus : screen->getWindowStyle()->b_pic_unfocus); - XFillRectangle(blackbox->getXDisplay(), frame.stick_button, pen.gc(), - frame.button_w/2 - 1, frame.button_w/2 -1, 2, 2 ); +#ifdef BITMAPBUTTONS + PixmapMask pm = screen->getWindowStyle()->stick_button; + + if (pm.mask != None) { + XSetClipMask(blackbox->getXDisplay(), pen.gc(), pm.mask); + XSetClipOrigin(blackbox->getXDisplay(), pen.gc(), + (frame.button_w - pm.w)/2, (frame.button_w - pm.h)/2); + + XFillRectangle(blackbox->getXDisplay(), frame.stick_button, pen.gc(), + (frame.button_w - pm.w)/2, (frame.button_w - pm.h)/2, + (frame.button_w + pm.w)/2, (frame.button_w + pm.h)/2); + + + XSetClipOrigin(blackbox->getXDisplay(), pen.gc(), 0, 0 ); + XSetClipMask( blackbox->getXDisplay(), pen.gc(), None ); + } else { +#endif // BITMAPBUTTONS + XFillRectangle(blackbox->getXDisplay(), frame.stick_button, pen.gc(), + frame.button_w/2 - 1, frame.button_w/2 -1, 2, 2 ); +#ifdef BITMAPBUTTONS + } +#endif } void BlackboxWindow::mapRequestEvent(const XMapRequestEvent *re) { @@ -3088,12 +3169,16 @@ void BlackboxWindow::buttonPressEvent(const XButtonEvent *be) { if (mx < left_edge) mx = left_edge; - if (mx > right_edge) + else if (mx > right_edge) mx = right_edge; if (my < top_edge) my = top_edge; - if (my > bottom_edge) + else if (my > bottom_edge) my = bottom_edge; + + if (my + windowmenu->getHeight() > screen->getHeight()) + my = screen->getHeight() - windowmenu->getHeight() - + (screen->getBorderWidth() * 2); windowmenu->move(mx, my); windowmenu->show(); @@ -3809,11 +3894,14 @@ void BlackboxWindow::motionNotifyEvent(const XMotionEvent *me) { frame.handle == me->window || frame.window == me->window)) { beginMove(me->x_root, me->y_root); } else if ((functions & Func_Resize) && - ((me->state & Button1Mask) && (me->window == frame.right_grip || - me->window == frame.left_grip)) || + ((me->state & Button1Mask) && + (me->window == frame.right_grip || + me->window == frame.left_grip)) || ((me->state & Button3Mask) && (me->state & mod_mask) && (frame.title == me->window || frame.label == me->window || - frame.handle == me->window || frame.window == me->window))) { + frame.handle == me->window || frame.window == me->window || + frame.right_grip == me->window || + frame.left_grip == me->window))) { unsigned int zones = screen->getResizeZones(); Corner corner; @@ -4137,8 +4225,6 @@ void BlackboxWindow::constrain(Corner anchor, if (dh > client.max_height) dh = client.max_height; } - assert(dw >= base_width && dh >= base_height); - if (client.width_inc > 1) { dw -= base_width; dw /= client.width_inc;