#endif // DEBUG
#ifdef HAVE_STDLIB_H
- #include <stdlib.h>
+# include <stdlib.h>
#endif // HAVE_STDLIB_H
}
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 |
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(),
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);
if (frame.stick_button)
destroyStickyButton();
-
+
if (frame.ftitle)
screen->getImageControl()->removeImage(frame.ftitle);
if (frame.ubutton)
screen->getImageControl()->removeImage(frame.ubutton);
- if (frame.pbutton)
- screen->getImageControl()->removeImage(frame.pbutton);
-
blackbox->removeWindowSearch(frame.title);
blackbox->removeWindowSearch(frame.label);
}
-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) {
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();
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;
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;