Ok, here's another one that shaleh says is never gonna make it into blackbox...
I like being able to rearrange the buttons, or for that matter, delete them. So I re-did this one for 0.62.1. It's not pretty, it doesn't particularly follow shaleh's idea of proper coding (he's bracket happy), it just works. It adds a resource to your .blackboxrc like so: session.titlebarLayout: LIMC where: L == window label I == iconify button M == maximize button C == close button If you don't have it already there, it defaults it to the standard blackbox arrangement (that being 'ILMC') and adds it for you. If you want to leave a button out, you can edit .blackboxrc yourself and do so. ^_^ Please note that I did *NOT* create the patch, nor am I claiming credit for it. I merely want to use it. ^_^ (ok, now I get to work on taskbar_menu, which is the OTHER one I want to use, and which makes mouse_wheel unnecessary...) -- Marc Wilson [EMAIL PROTECTED] http://members.cox.net/msw
diff -urN blackbox-0.62.1.orig/configure blackbox-0.62.1/configure --- blackbox-0.62.1.orig/configure Fri Jan 25 02:50:25 2002 +++ blackbox-0.62.1/configure Sat Mar 2 20:11:11 2002 @@ -714,7 +714,7 @@ PACKAGE=blackbox -VERSION=0.62.1pre0 +VERSION=0.62.1 if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } diff -urN blackbox-0.62.1.orig/configure.in blackbox-0.62.1/configure.in --- blackbox-0.62.1.orig/configure.in Fri Jan 25 02:50:18 2002 +++ blackbox-0.62.1/configure.in Sat Mar 2 20:11:39 2002 @@ -1,7 +1,7 @@ dnl configure.in for Blackbox - an X11 Window manager dnl Initialize autoconf and automake AC_INIT(src/blackbox.cc) -AM_INIT_AUTOMAKE(blackbox,0.62.1pre0,no-define) +AM_INIT_AUTOMAKE(blackbox,0.62.1,no-define) dnl Determine default prefix test x$prefix = "xNONE" && prefix="$ac_default_prefix" diff -urN blackbox-0.62.1.orig/src/Window.cc blackbox-0.62.1/src/Window.cc --- blackbox-0.62.1.orig/src/Window.cc Sat Jan 19 08:06:30 2002 +++ blackbox-0.62.1/src/Window.cc Sat Mar 2 20:05:25 2002 @@ -741,50 +741,103 @@ 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.width - by; + char *format = (char *) blackbox->getTitleBarLayout(); - if (decorations.iconify && frame.iconify_button != None) { - XMoveResizeWindow(display, frame.iconify_button, by, by, - frame.button_w, frame.button_h); - XMapWindow(display, frame.iconify_button); - XClearWindow(display, frame.iconify_button); - - lx += bw; - lw -= bw; - } else if (frame.iconify_button) { - XUnmapWindow(display, frame.iconify_button); + unsigned int x = 0; + unsigned int ty = frame.bevel_w + 1; + unsigned int tx = frame.bevel_w + 1; + unsigned int bw = frame.button_w + frame.bevel_w + 1; + unsigned int bc = strlen(format) - 1; + + if (!decorations.close) bc -= 1; + if (!decorations.iconify) bc -= 1; + if (!decorations.maximize) bc -= 1; + + frame.label_w = frame.width - (bc * bw) - (2 * frame.bevel_w) - 1; + + while (&format[x] != "" && x <= 3) { + switch(format[x++]){ + case 'C': + { + tx += BlackboxWindow::positionCloseButton(tx,ty); + break; + } + case 'I': + { + tx += BlackboxWindow::positionIconifyButton(tx,ty); + break; + } + case 'M': + { + tx += BlackboxWindow::positionMaximizeButton(tx,ty); + break; + } + case 'L': + { + tx += BlackboxWindow::positionLabel(tx,ty); + break; + } + } } - int bx = frame.width - bw; + + if (redecorate_label) decorateLabel(); + redrawLabel(); + redrawAllButtons(); + + +} + + +unsigned int BlackboxWindow::positionCloseButton(unsigned int tx, unsigned int ty) { if (decorations.close && frame.close_button != None) { - XMoveResizeWindow(display, frame.close_button, bx, by, - frame.button_w, frame.button_h); + XMoveResizeWindow(display, frame.close_button, tx, ty, frame.button_w, +frame.button_h); XMapWindow(display, frame.close_button); XClearWindow(display, frame.close_button); + return frame.button_w + frame.bevel_w + 1; - bx -= bw; - lw -= bw; } else if (frame.close_button) { XUnmapWindow(display, frame.close_button); + return 0; + } + +} + +unsigned int BlackboxWindow::positionIconifyButton(unsigned int tx, unsigned int ty) { + + if (decorations.iconify && frame.iconify_button != None) { + XMoveResizeWindow(display, frame.iconify_button, tx, ty, frame.button_w, +frame.button_h); + XMapWindow(display, frame.iconify_button); + XClearWindow(display, frame.iconify_button); + return frame.button_w + frame.bevel_w + 1; + + } else if (frame.iconify_button) { + XUnmapWindow(display, frame.iconify_button); + return 0; } + +} + +unsigned int BlackboxWindow::positionMaximizeButton(unsigned int tx, unsigned int ty) +{ + if (decorations.maximize && frame.maximize_button != None) { - XMoveResizeWindow(display, frame.maximize_button, bx, by, - frame.button_w, frame.button_h); + XMoveResizeWindow(display, frame.maximize_button, tx, ty, frame.button_w, +frame.button_h); XMapWindow(display, frame.maximize_button); XClearWindow(display, frame.maximize_button); + return frame.button_w + frame.bevel_w + 1; - lw -= bw; } else if (frame.maximize_button) { XUnmapWindow(display, frame.maximize_button); - } - frame.label_w = lw - by; - XMoveResizeWindow(display, frame.label, lx, frame.bevel_w, - frame.label_w, frame.label_h); - if (redecorate_label) decorateLabel(); + return 0; + } + +} + +unsigned int BlackboxWindow::positionLabel(unsigned int tx, unsigned int ty) { + + XMoveResizeWindow(display, frame.label, tx, ty - 1, frame.label_w, frame.label_h); + return frame.label_w + frame.bevel_w + 1; - redrawLabel(); - redrawAllButtons(); } diff -urN blackbox-0.62.1.orig/src/Window.hh blackbox-0.62.1/src/Window.hh --- blackbox-0.62.1.orig/src/Window.hh Sat Dec 29 23:00:19 2001 +++ blackbox-0.62.1/src/Window.hh Sat Mar 2 19:46:37 2002 @@ -210,7 +210,14 @@ void associateClientWindow(void); void decorate(void); void decorateLabel(void); + void positionButtons(Bool redecorate_label = False); + unsigned int BlackboxWindow::positionCloseButton(unsigned int tx, unsigned int ty); + unsigned int BlackboxWindow::positionMaximizeButton(unsigned int tx, unsigned int +ty); + unsigned int BlackboxWindow::positionIconifyButton(unsigned int tx, unsigned int +ty); + unsigned int BlackboxWindow::positionLabel(unsigned int tx, unsigned int ty); + + void positionWindows(void); void createCloseButton(void); void createIconifyButton(void); diff -urN blackbox-0.62.1.orig/src/blackbox.cc blackbox-0.62.1/src/blackbox.cc --- blackbox-0.62.1.orig/src/blackbox.cc Sat Jan 12 03:17:26 2002 +++ blackbox-0.62.1/src/blackbox.cc Sat Mar 2 20:10:05 2002 @@ -161,7 +161,7 @@ no_focus = False; - resource.menu_file = resource.style_file = (char *) 0; + resource.menu_file = resource.style_file = resource.titlebar_layout = (char *) 0; resource.auto_raise_delay.tv_sec = resource.auto_raise_delay.tv_usec = 0; focused_window = masked_window = (BlackboxWindow *) 0; @@ -1161,6 +1161,10 @@ delete [] save_string; } + sprintf(rc_string, "session.titlebarLayout: %s", + resource.titlebar_layout); + XrmPutLineResource(&new_blackboxrc, rc_string); + XrmDatabase old_blackboxrc = XrmGetFileDatabase(dbfile); XrmMergeDatabases(new_blackboxrc, &old_blackboxrc); @@ -1259,6 +1263,12 @@ resource.cache_max = 200; } else { resource.cache_max = 200; + } + if (XrmGetResource(database, "session.titlebarLayout", "Session.TitlebarLayout", + &value_type, &value)) { + resource.titlebar_layout = bstrdup(value.addr); + } else { + resource.titlebar_layout = bstrdup("ILMC"); } } diff -urN blackbox-0.62.1.orig/src/blackbox.hh blackbox-0.62.1/src/blackbox.hh --- blackbox-0.62.1.orig/src/blackbox.hh Sat Dec 29 23:11:38 2001 +++ blackbox-0.62.1/src/blackbox.hh Sat Mar 2 19:46:12 2002 @@ -81,7 +81,7 @@ struct resource { Time double_click_interval; - char *menu_file, *style_file; + char *menu_file, *style_file, *titlebar_layout; int colors_per_channel; timeval auto_raise_delay; unsigned long cache_life, cache_max; @@ -159,6 +159,9 @@ inline const timeval &getAutoRaiseDelay(void) const { return resource.auto_raise_delay; } + + inline const char *getTitleBarLayout(void) const + { return resource.titlebar_layout; } inline const unsigned long &getCacheLife(void) const { return resource.cache_life; }