summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Bidulock2015-09-26 10:05:51 -0600
committerBrian Bidulock2015-09-26 10:05:51 -0600
commit87b26d13ce0995bf6dc9a6f3bd770246b631ea81 (patch)
tree5a1ae762f432fc5038c9ce93e55a330f3c3e7c6b
downloadaur-87b26d13ce0995bf6dc9a6f3bd770246b631ea81.tar.gz
initial version
-rw-r--r--.SRCINFO22
-rw-r--r--PKGBUILD35
-rw-r--r--mvwm.desktop7
-rw-r--r--rounded.patch853
4 files changed, 917 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 00000000000..089d8caa960
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,22 @@
+pkgbase = mvwm-git
+ pkgdesc = A clean-up effort of FVWM (with rounded corner patch)
+ pkgver = r5713.f23f011
+ pkgrel = 1
+ url = https://github.com/ThomasAdam/mvwm
+ arch = i686
+ arch = x86_64
+ license = GPL
+ depends = fribidi
+ depends = libxrandr
+ depends = libpng
+ options = !emptydirs
+ options = !makeflags
+ source = mvwm-git::git+https://github.com/ThomasAdam/mvwm.git
+ source = rounded.patch
+ source = mvwm.desktop
+ sha1sums = SKIP
+ sha1sums = 97a8375721ba50fba7991f590b17feb1aa7e7a61
+ sha1sums = d39ecd8ecdda651b99289946802abad2e0f1342a
+
+pkgname = mvwm-git
+
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 00000000000..c5fa354c693
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,35 @@
+# Maintainer: Camille <onodera@rizon>
+
+pkgname=mvwm-git
+pkgver=r5713.f23f011
+pkgrel=1
+pkgdesc="A clean-up effort of FVWM (with rounded corner patch)"
+url="https://github.com/ThomasAdam/mvwm"
+arch=('i686' 'x86_64')
+license=('GPL')
+depends=('fribidi' 'libxrandr' 'libpng')
+options=('!emptydirs' '!makeflags')
+source=("$pkgname::git+https://github.com/ThomasAdam/mvwm.git" 'rounded.patch' 'mvwm.desktop')
+sha1sums=('SKIP' '97a8375721ba50fba7991f590b17feb1aa7e7a61' 'd39ecd8ecdda651b99289946802abad2e0f1342a')
+
+pkgver() {
+ cd $pkgname
+ printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
+}
+
+build() {
+ cd $pkgname
+
+ # Comment the next line to disable rounded corner patch
+ patch -p0 < $startdir/rounded.patch
+
+ ./autogen.sh
+ ./configure --prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib --disable-xrender --disable-xft --disable-freetypetest --disable-fontconfigtest --disable-xfttest --disable-perllib --with-x
+ make
+}
+
+package() {
+ cd $pkgname
+ make DESTDIR="$pkgdir" install
+ install -D -m644 ../mvwm.desktop "$pkgdir/usr/share/xsessions/mvwm.desktop"
+}
diff --git a/mvwm.desktop b/mvwm.desktop
new file mode 100644
index 00000000000..715c204bbd3
--- /dev/null
+++ b/mvwm.desktop
@@ -0,0 +1,7 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=MVWM
+Comment=The mvwm window manager
+Type=XSession
+Exec=/usr/bin/mvwm
+TryExec=/usr/bin/mvwm
diff --git a/rounded.patch b/rounded.patch
new file mode 100644
index 00000000000..810496fa513
--- /dev/null
+++ b/rounded.patch
@@ -0,0 +1,853 @@
+diff -ruN old/add_window.c mvwm/add_window.c
+--- mvwm/add_window.c 2014-08-26 21:45:02.404749906 +0200
++++ mvwm/add_window.c 2014-08-26 22:54:23.304701276 +0200
+@@ -1762,6 +1762,7 @@
+ {
+ int width;
+ int offset;
++ style_flags *sflags = &(pstyle->flags);
+
+ get_title_font_size_and_offset(
+ fw, S_TITLE_DIR(SCF(*pstyle)),
+@@ -1773,6 +1774,11 @@
+ fw->title_thickness = width;
+ fw->title_text_offset = offset;
+ fw->corner_width = fw->title_thickness + fw->boundary_width;
++ if (SHAS_CORNER_WIDTH(sflags))
++ {
++ fw->corner_width = SGET_CORNER_WIDTH(*pstyle);
++ }
++
+ if (!HAS_TITLE(fw))
+ {
+ fw->title_thickness = 0;
+@@ -2679,6 +2685,8 @@
+ fw = NULL;
+ }
+
++ frame_make_rounded_corners(fw);
++
+ return fw;
+ }
+
+diff -ruN mvwm/borders.c mvwm/borders.c
+--- mvwm/borders.c 2014-08-26 21:45:02.404749906 +0200
++++ mvwm/borders.c 2014-08-26 22:54:23.304701276 +0200
+@@ -1386,6 +1386,24 @@
+ return;
+ }
+
++static void border_fill_fluxbox_handle(
++ Pixmap dest_pix, rectangle *dest_g, common_decorations_type *cd, Bool corner)
++{
++ corner = False;
++ /* Main Color */
++ XFillRectangle(
++ dpy, dest_pix, corner ? cd->shadow_gc : cd->relief_gc, dest_g->x + 1, dest_g->y + 1,
++ dest_g->width - dest_g->x - 3, dest_g->height - dest_g->y - 2);
++ /* Right Shadow */
++ XFillRectangle(
++ dpy, dest_pix, cd->shadow_gc, dest_g->x + dest_g->width - 2, dest_g->y + 1,
++ 1, dest_g->height - dest_g->y - 2);
++ /* Bottom Shadow */
++ XFillRectangle(
++ dpy, dest_pix, cd->shadow_gc, dest_g->x + 1, dest_g->height - 2,
++ dest_g->width - dest_g->x - 3, 1);
++}
++
+ /* create a root transparent colorset bg, we take in account a possible
+ * drawing rotation */
+ static Pixmap border_create_root_transparent_pixmap(
+@@ -1601,12 +1619,28 @@
+ pix_g.width = part_g.width;
+ pix_g.height = part_g.height;
+ border_fill_pixmap_background(p, &pix_g, &bg, cd);
++ if (HAS_FLUXBOX_HANDLES(fw))
++ {
++ pix_g.y = part_g.height - fw->boundary_width;
++ if (part != PART_BORDER_S)
++ {
++ pix_g.width++;
++ }
++ if (part == PART_BORDER_SE)
++ {
++ pix_g.x--;
++ }
++ if (fw->boundary_width > 2)
++ {
++ border_fill_fluxbox_handle(p, &pix_g, cd, !(part & PART_BORDER_S));
++ }
++ }
+ if (free_bg_pixmap && bg.pixmap.p)
+ {
+ XFreePixmap(dpy, bg.pixmap.p);
+ }
+ /* draw the relief over the background */
+- if (!br->relief.is_flat)
++ if (!br->relief.is_flat && !HAS_FLUXBOX_HANDLES(fw))
+ {
+ border_draw_part_relief(br, frame_g, &part_g, p, is_inverted);
+ /* draw the handle marks */
+@@ -4121,6 +4155,9 @@
+ JustificationType just;
+ int lbl = 0;
+ int rbl = 0;
++ int bw;
++
++ bw = HAS_FLUXBOX_HANDLES(fw) ? 1 : fw->boundary_width;
+
+ ret_td->cd = cd;
+ ret_td->frame_g = *new_g;
+@@ -4158,7 +4195,7 @@
+ /* geometry of the title bar title + buttons */
+ if (!ret_td->has_vt)
+ {
+- ret_td->bar_g.width = new_g->width - 2 * fw->boundary_width;
++ ret_td->bar_g.width = new_g->width - 2 * bw;
+ ret_td->bar_g.height = ret_td->layout.title_g.height;
+ ret_td->bar_g.x = fw->boundary_width;
+ ret_td->bar_g.y = ret_td->layout.title_g.y;
+@@ -4166,8 +4203,8 @@
+ else
+ {
+ ret_td->bar_g.width = ret_td->layout.title_g.width;
+- ret_td->bar_g.height = new_g->height - 2 * fw->boundary_width;
+- ret_td->bar_g.y = fw->boundary_width;
++ ret_td->bar_g.height = new_g->height - 2 * bw;
++ ret_td->bar_g.y = bw;
+ ret_td->bar_g.x = ret_td->layout.title_g.x;
+ }
+
+@@ -4219,7 +4256,7 @@
+ {
+ ret_td->left_buttons_g.height = rbl;
+ ret_td->right_buttons_g.height = lbl;
+- ret_td->right_buttons_g.y = fw->boundary_width;
++ ret_td->right_buttons_g.y = bw;
+ ret_td->right_buttons_g.x = ret_td->bar_g.x;
+ ret_td->left_buttons_g.y = ret_td->layout.title_g.y +
+ ret_td->layout.title_g.height;
+@@ -4229,7 +4266,7 @@
+ {
+ ret_td->left_buttons_g.width = rbl;
+ ret_td->right_buttons_g.width = lbl;
+- ret_td->right_buttons_g.x = fw->boundary_width;
++ ret_td->right_buttons_g.x = bw;
+ ret_td->right_buttons_g.y = ret_td->bar_g.y;
+ ret_td->left_buttons_g.x = ret_td->layout.title_g.x +
+ ret_td->layout.title_g.width;
+@@ -4242,7 +4279,7 @@
+ {
+ ret_td->left_buttons_g.height = lbl;
+ ret_td->right_buttons_g.height = rbl;
+- ret_td->left_buttons_g.y = fw->boundary_width;
++ ret_td->left_buttons_g.y = bw;
+ ret_td->left_buttons_g.x = ret_td->bar_g.x;
+ ret_td->right_buttons_g.y = ret_td->layout.title_g.y +
+ ret_td->layout.title_g.height;
+@@ -4252,7 +4289,7 @@
+ {
+ ret_td->left_buttons_g.width = lbl;
+ ret_td->right_buttons_g.width = rbl;
+- ret_td->left_buttons_g.x = fw->boundary_width;
++ ret_td->left_buttons_g.x = bw;
+ ret_td->left_buttons_g.y = ret_td->bar_g.y;
+ ret_td->right_buttons_g.x = ret_td->layout.title_g.x +
+ ret_td->layout.title_g.width;
+@@ -4594,7 +4631,7 @@
+ {
+ int bw;
+
+- bw = fw->boundary_width;
++ bw = HAS_FLUXBOX_HANDLES(fw) ? 1 : fw->boundary_width;
+ /* ret_g->x and ret->y is just an offset relatively to the w,
+ * maybe we can take the relief in account? */
+ switch (part)
+@@ -4612,6 +4649,10 @@
+ case PART_BORDER_S:
+ ret_g->x = sidebar_g->x;
+ ret_g->y = 2 * sidebar_g->y + sidebar_g->height - bw;
++ if (HAS_FLUXBOX_HANDLES(fw))
++ {
++ ret_g->y = 2 * sidebar_g->y + sidebar_g->height - fw->boundary_width;
++ }
+ *ret_w = FW_W_SIDE(fw, 2);
+ break;
+ case PART_BORDER_W:
+@@ -4646,9 +4687,14 @@
+ switch (part)
+ {
+ case PART_BORDER_N:
++ ret_g->height = bw;
+ case PART_BORDER_S:
+ ret_g->width = sidebar_g->width;
+ ret_g->height = bw;
++ if (HAS_FLUXBOX_HANDLES(fw))
++ {
++ ret_g->height = fw->boundary_width;
++ }
+ break;
+ case PART_BORDER_E:
+ case PART_BORDER_W:
+diff -ruN mvwm/frame.c mvwm/frame.c
+--- mvwm/frame.c 2014-08-26 21:45:02.404749906 +0200
++++ mvwm/frame.c 2014-08-26 22:54:23.314701276 +0200
+@@ -435,6 +435,8 @@
+ /* inform the modules of the change */
+ BroadcastConfig(M_CONFIGURE_WINDOW,fw);
+
++ frame_make_rounded_corners(fw);
++
+ return;
+ }
+
+@@ -1952,6 +1954,7 @@
+ FShapeSet);
+ }
+ frame_setup_shape(fw, mra->end_g.width, mra->end_g.height, fw->wShaped);
++ frame_make_rounded_corners(fw);
+ if (mra->flags.do_restore_gravity)
+ {
+ /* TA: 2011-09-04: There might be a chance some clients with
+@@ -2085,6 +2088,211 @@
+ return;
+ }
+
++void draw_rounded_mask(Window win, int width, int height, Bool slightlyrounded, window_parts draw_parts, int col)
++{
++
++ Pixmap pm;
++ GC gc;
++ rectangle rect;
++ int w,h;
++ unsigned long valuemask;
++ int x;
++ int lstart, lend;
++ int l0[] = { 0, 1, 0, 1, 2, 3 };
++ int l1[] = { 1, 2, 1, 2, 3, 5 };
++ int l2[] = { 2, 1, 5, 3, 2, 1 };
++ int l3[] = { 1, 1, 1, 1, 1, 2 };
++
++ if (slightlyrounded)
++ {
++ lstart = 0;
++ lend = 2;
++ }
++ else
++ {
++ lstart = 2;
++ lend = 6;
++ }
++
++ XGetGeometry(
++ dpy, win, &JunkRoot, &rect.x, &rect.y,
++ &rect.width, &rect.height, &JunkBW, &JunkDepth);
++
++ w = rect.width;
++ h = rect.height;
++ pm = XCreatePixmap(dpy, win, width, height, 1);
++ gc = Scr.MonoGC;
++ XSetForeground(dpy, gc, !col);
++ XFillRectangle(dpy, pm, gc, 0, 0, w, h);
++ XSetForeground(dpy, gc, col);
++
++ /* Draw a rounded shape on the corners of the pixmap */
++ for (x = lstart; x < lend; x++)
++ {
++ if (draw_parts & PART_BORDER_NW)
++ {
++ XFillRectangle(dpy, pm, gc, 0, l0[x], l2[x], l3[x]);
++ }
++ if (draw_parts & PART_BORDER_NE)
++ {
++ XFillRectangle(dpy, pm, gc, w-l2[x], l0[x], l2[x], l3[x]);
++ }
++ if (draw_parts & PART_BORDER_SW)
++ {
++ XFillRectangle(dpy, pm, gc, 0, h-l1[x], l2[x], l3[x]);
++ }
++ if (draw_parts & PART_BORDER_SE)
++ {
++ XFillRectangle(dpy, pm, gc, w-l2[x], h-l1[x], l2[x], l3[x]);
++ }
++ }
++
++ FShapeCombineMask(dpy, win, ShapeBounding, 0, 0, pm, col==1 ? ShapeSubtract : ShapeSet);
++
++ XFreePixmap(dpy, pm);
++}
++
++static void frame_draw_rounded_mask(MvwmWindow *fw, Window win, window_parts draw_parts, int col)
++{
++ draw_rounded_mask(win, fw->g.frame.width, fw->g.frame.height,
++ HAS_SLIGHTLY_ROUNDED_CORNERS(fw), IS_MAXIMIZED(fw)?0:draw_parts, col);
++}
++
++/* Returns a corner corrected for rotation of the titlebar (ie button 1 is always NW) */
++#define SWAP_CORNER(PART) corner = corner & (PART) ? corner ^ (PART) : corner
++static window_parts __get_corner(window_parts corner, MvwmWindow *fw)
++{
++ int dir;
++
++ dir = GET_TITLE_DIR(fw);
++
++ /* Flip horizontally (relative to tb) if the titlebar is rotated */
++ if ((dir == DIR_N && IS_TOP_TITLE_ROTATED(fw))
++ || (dir == DIR_S && !IS_BOTTOM_TITLE_ROTATED(fw))
++ || (dir == DIR_W && IS_LEFT_TITLE_ROTATED_CW(fw))
++ || (dir == DIR_E && !IS_RIGHT_TITLE_ROTATED_CW(fw)))
++ {
++ SWAP_CORNER(PART_BORDER_NE | PART_BORDER_NW);
++ }
++
++ /* Swap SE/SW so that shift left goes in a clockwise order */
++ SWAP_CORNER(PART_BORDER_SW | PART_BORDER_SE);
++
++ /* Rotate clockwise depending on dir */
++ corner <<= dir;
++ if (corner > PART_BORDER_SE)
++ {
++ corner = corner >> 4;
++ }
++
++ /* Swap SE/SW back */
++ SWAP_CORNER(PART_BORDER_SW | PART_BORDER_SE);
++
++ return corner;
++}
++
++void frame_make_rounded_corners(MvwmWindow *fw)
++{
++ rectangle rect;
++ window_parts draw_parts;
++ window_parts mask;
++ int x;
++ MvwmWindow *left_button = 0;
++ MvwmWindow *right_button = 0;
++
++ if (!fw || !FShapesSupported)
++ {
++ return;
++ }
++
++ window_parts corner_nw = __get_corner(PART_BORDER_NW, fw);
++ window_parts corner_ne = __get_corner(PART_BORDER_NE, fw);
++ window_parts corner_se = __get_corner(PART_BORDER_SE, fw);
++ window_parts corner_sw = __get_corner(PART_BORDER_SW, fw);
++
++ for (x = 9;x>=0;x--)
++ {
++ if (FW_W_BUTTON(fw, x) != None)
++ {
++ if (x%2 == 0)
++ {
++ left_button = FW_W_BUTTON(fw, x);
++ }
++ else
++ {
++ right_button = FW_W_BUTTON(fw, x);
++ }
++ }
++ }
++
++ mask = 0;
++ if (HAS_ROUNDED_CORNERS_TOP(fw))
++ {
++ mask |= corner_ne | corner_nw;
++ }
++ if (HAS_ROUNDED_CORNERS_BOTTOM(fw))
++ {
++ mask |= corner_se | corner_sw;
++ }
++
++ /* Draw mask on each corner of the window. This involves the frame, title,
++ * buttons and parent wins depending on the window configuration */
++ rect = fw->g.frame;
++ frame_draw_rounded_mask(fw, FW_W_FRAME(fw), mask, 1);
++ if (HAS_TITLE(fw))
++ {
++ draw_parts = 0;
++ if (!left_button)
++ {
++ draw_parts |= corner_nw;
++ }
++ if (!right_button)
++ {
++ draw_parts |= corner_ne;
++ }
++ if (IS_SHADED(fw))
++ {
++ if (!left_button)
++ {
++ draw_parts |= corner_sw;
++ }
++ else
++ {
++ frame_draw_rounded_mask(fw, left_button, mask & (corner_nw|corner_sw), 0);
++ }
++ if (!right_button)
++ {
++ draw_parts |= corner_se;
++ }
++ else
++ {
++ frame_draw_rounded_mask(fw, right_button, mask & (corner_ne|corner_se), 0);
++ }
++ }
++ frame_draw_rounded_mask(fw, FW_W_TITLE(fw), mask & draw_parts, 0);
++
++ if (!IS_SHADED(fw))
++ {
++ frame_draw_rounded_mask(fw, FW_W_PARENT(fw), mask & (corner_sw|corner_se), 0);
++
++ if (left_button)
++ {
++ frame_draw_rounded_mask(fw, left_button, mask & corner_nw, 0);
++ }
++ if (right_button)
++ {
++ frame_draw_rounded_mask(fw, right_button, mask & corner_ne, 0);
++ }
++ }
++ }
++ else
++ {
++ frame_draw_rounded_mask(fw, FW_W_PARENT(fw), mask & PART_CORNERS, 0);
++ }
++
++ XFlush(dpy);
++}
++
+ /****************************************************************************
+ *
+ * Sets up the shaped window borders
+diff -ruN mvwm/frame.h new/frame.h
+--- mvwm/frame.h 2014-08-26 21:45:02.404749906 +0200
++++ mvwm/frame.h 2014-08-26 22:54:23.314701276 +0200
+@@ -5,6 +5,8 @@
+
+ /* ---------------------------- included header files ---------------------- */
+
++#include "borders.h"
++
+ /* ---------------------------- global definitions ------------------------- */
+
+ /* ---------------------------- global macros ------------------------------ */
+@@ -71,5 +73,7 @@
+ Bool do_send_configure_notify);
+ void frame_setup_shape(
+ MvwmWindow *fw, int w, int h, int shape_mode);
++void frame_make_rounded_corners(MvwmWindow *fw);
++void draw_rounded_mask(Window win, int width, int height, Bool slightlyrounded, window_parts draw_parts, int col);
+
+ #endif /* FRAME_H */
+diff -ruN mvwm/geometry.c mvwm/geometry.c
+--- mvwm/geometry.c 2014-08-26 21:45:02.404749906 +0200
++++ mvwm/geometry.c 2014-08-26 22:54:23.314701276 +0200
+@@ -483,9 +483,12 @@
+ void get_window_borders(
+ const MvwmWindow *fw, size_borders *borders)
+ {
+- borders->top_left.width = fw->boundary_width;
+- borders->bottom_right.width = fw->boundary_width;
+- borders->top_left.height = fw->boundary_width;
++ int bw;
++
++ bw = HAS_FLUXBOX_HANDLES(fw) ? 1 : fw->boundary_width;
++ borders->top_left.width = bw;
++ borders->bottom_right.width = bw;
++ borders->top_left.height = bw;
+ borders->bottom_right.height = fw->boundary_width;
+ switch (GET_TITLE_DIR(fw))
+ {
+@@ -514,9 +517,13 @@
+ void get_window_borders_no_title(
+ const MvwmWindow *fw, size_borders *borders)
+ {
+- borders->top_left.width = fw->boundary_width;
+- borders->bottom_right.width = fw->boundary_width;
+- borders->top_left.height = fw->boundary_width;
++ int bw;
++
++ bw = HAS_FLUXBOX_HANDLES(fw) ? 1 : fw->boundary_width;
++
++ borders->top_left.width = bw;
++ borders->bottom_right.width = bw;
++ borders->top_left.height = bw;
+ borders->bottom_right.height = fw->boundary_width;
+ borders->total_size.width =
+ borders->top_left.width + borders->bottom_right.width;
+diff -ruN mvwm/menus.c mvwm/menus.c
+--- mvwm/menus.c 2014-08-26 21:45:02.404749906 +0200
++++ mvwm/menus.c 2014-08-26 22:54:23.314701276 +0200
+@@ -66,6 +66,7 @@
+ #include "menugeometry.h"
+ #include "menuparameters.h"
+ #include "menus.h"
++#include "frame.h"
+ #include "libs/FGettext.h"
+
+ /* ---------------------------- local definitions -------------------------- */
+@@ -3132,6 +3133,13 @@
+ return x_overlap;
+ }
+
++static void menu_make_rounded_corners(MenuRoot *mr)
++{
++ draw_rounded_mask(MR_WINDOW(mr), MR_WIDTH(mr), MR_HEIGHT(mr),
++ MST_HAS_SLIGHTLY_ROUNDED_CORNERS(mr),
++ MST_HAS_ROUNDED_CORNERS(mr)?PART_CORNERS:0, 0);
++}
++
+ /*
+ *
+ * Procedure:
+@@ -3708,6 +3716,8 @@
+ * Pop up the menu
+ */
+
++ menu_make_rounded_corners(mr);
++
+ XMoveWindow(dpy, MR_WINDOW(mr), x, y);
+ XSelectInput(dpy, MR_WINDOW(mr), event_mask);
+ XMapRaised(dpy, MR_WINDOW(mr));
+diff -ruN mvwm/menustyle.c mvwm/menustyle.c
+--- mvwm/menustyle.c 2014-08-26 21:45:02.404749906 +0200
++++ mvwm/menustyle.c 2014-08-26 22:54:23.314701276 +0200
+@@ -430,6 +430,7 @@
+ "TitleColorset", "HilightTitleBack",
+ "TitleFont",
+ "VerticalMargins",
++ "RoundedCorners", "SlightlyRoundedCorners",
+ "UniqueHotkeyActivatesImmediate",
+ NULL
+ };
+@@ -1601,9 +1602,15 @@
+ &ST_VERTICAL_MARGIN_BOTTOM(tmpms),
+ 0, 0);
+ break;
+- case 63: /* UniqueHotKeyActivatesImmediate */
++ case 64: /* UniqueHotKeyActivatesImmediate */
+ ST_HOTKEY_ACTIVATES_IMMEDIATE(tmpms) = on;
+ break;
++ case 65: /* RoundedCorners */
++ ST_HAS_ROUNDED_CORNERS(tmpms) = on;
++ break;
++ case 66: /* SlightlyRoundedCorners */
++ ST_HAS_SLIGHTLY_ROUNDED_CORNERS(tmpms) = on;
++ break;
+
+ #if 0
+ case 99: /* PositionHints */
+diff -ruN mvwm/menustyle.h new/menustyle.h
+--- mvwm/menustyle.h 2014-08-26 21:45:02.404749906 +0200
++++ mvwm/menustyle.h 2014-08-26 22:54:23.314701276 +0200
+@@ -23,6 +23,10 @@
+ #define MST_FACE(m) ((m)->s->ms->look.face)
+ #define ST_DO_HILIGHT_BACK(s) ((s)->look.flags.do_hilight_back)
+ #define MST_DO_HILIGHT_BACK(m) ((m)->s->ms->look.flags.do_hilight_back)
++#define ST_HAS_ROUNDED_CORNERS(s) ((s)->look.flags.has_rounded_corners)
++#define MST_HAS_ROUNDED_CORNERS(m) ((m)->s->ms->look.flags.has_rounded_corners)
++#define ST_HAS_SLIGHTLY_ROUNDED_CORNERS(s) ((s)->look.flags.has_slightly_rounded_corners)
++#define MST_HAS_SLIGHTLY_ROUNDED_CORNERS(m) ((m)->s->ms->look.flags.has_slightly_rounded_corners)
+ #define ST_DO_HILIGHT_FORE(s) ((s)->look.flags.do_hilight_fore)
+ #define MST_DO_HILIGHT_FORE(m) ((m)->s->ms->look.flags.do_hilight_fore)
+ #define ST_DO_HILIGHT_TITLE_BACK(s) ((s)->look.flags.do_hilight_title_back)
+@@ -282,6 +286,8 @@
+ unsigned has_title_cset : 1;
+ unsigned do_hilight_title_back : 1;
+ unsigned using_default_titlefont : 1;
++ unsigned has_rounded_corners : 1;
++ unsigned has_slightly_rounded_corners : 1;
+ } flags;
+ unsigned char ReliefThickness;
+ unsigned char TitleUnderlines;
+diff -ruN mvwm/mvwm.h new/mvwm.h
+--- mvwm/mvwm.h 2014-08-26 21:45:02.404749906 +0200
++++ mvwm/mvwm.h 2014-08-26 22:54:23.314701276 +0200
+@@ -267,6 +267,10 @@
+ #define WINDOWSHADE_LAZY_MASK 0x3
+ unsigned windowshade_laziness : 2;
+ unsigned use_title_decor_rotation : 1;
++ unsigned has_fluxbox_handles : 1;
++ unsigned has_rounded_corners_top : 1;
++ unsigned has_rounded_corners_bottom : 1;
++ unsigned has_slightly_rounded_corners : 1;
+ focus_policy_t focus_policy;
+ } s;
+ } common_flags_t;
+@@ -543,6 +547,7 @@
+ unsigned has_edge_resistance_move : 1;
+ unsigned has_edge_resistance_xinerama_move : 1;
+ unsigned has_handle_width : 1;
++ unsigned has_corner_width : 1;
+ unsigned has_icon : 1;
+ unsigned has_icon_boxes : 1;
+ unsigned has_icon_size_limits : 1;
+@@ -670,6 +675,7 @@
+ short border_width;
+ /* resize handle width */
+ short handle_width;
++ short corner_width;
+ int layer;
+ int start_desk;
+ int start_page_x;
+diff -ruN mvwm/style.c mvwm/style.c
+--- mvwm/style.c 2014-08-26 21:45:02.404749906 +0200
++++ mvwm/style.c 2014-08-26 22:54:23.314701276 +0200
+@@ -544,6 +544,10 @@
+ SSET_HANDLE_WIDTH(
+ *merged_style, SGET_HANDLE_WIDTH(*add_style));
+ }
++ if (add_style->flags.has_corner_width)
++ {
++ SSET_CORNER_WIDTH(*merged_style, SGET_CORNER_WIDTH(*add_style));
++ }
+ if (add_style->flags.has_icon_size_limits)
+ {
+ SSET_MIN_ICON_WIDTH(
+@@ -2376,6 +2380,20 @@
+ ps->change_mask.has_color_back = 1;
+ break;
+ }
++ else if (StrEquals(token, "CornerWidth"))
++ {
++ if (GetIntegerArguments(rest, &rest, val, 1))
++ {
++ SSET_CORNER_WIDTH(*ps, (short)*val);
++ ps->flags.has_corner_width = 1;
++ }
++ else
++ {
++ ps->flags.has_corner_width = 0;
++ }
++ ps->flag_mask.has_corner_width = 1;
++ ps->change_mask.has_corner_width = 1;
++ }
+ else if (StrEquals(token, "CirculateSkipIcon"))
+ {
+ S_SET_DO_CIRCULATE_SKIP_ICON(SCF(*ps), on);
+@@ -2688,6 +2706,15 @@
+ S_SET_HAS_MWM_BORDER(SCM(*ps), 1);
+ S_SET_HAS_MWM_BORDER(SCC(*ps), 1);
+ }
++ else if (StrEquals(token, "FluxboxHandles"))
++ {
++ S_SET_HAS_FLUXBOX_HANDLES(SCF(*ps), on);
++ S_SET_HAS_FLUXBOX_HANDLES(SCM(*ps), 1);
++ S_SET_HAS_FLUXBOX_HANDLES(SCC(*ps), 1);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCF(*ps), !on);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCM(*ps), 1);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCC(*ps), 1);
++ }
+ else if (StrEquals(token, "FocusFollowsMouse"))
+ {
+ style_set_old_focus_policy(ps, 1);
+@@ -3758,6 +3785,50 @@
+ S_SET_IS_RIGHT_TITLE_ROTATED_CW(SCM(*ps), 1);
+ S_SET_IS_RIGHT_TITLE_ROTATED_CW(SCC(*ps), 1);
+ }
++ else if (StrEquals(token, "RoundedCorners"))
++ {
++ S_SET_HAS_ROUNDED_CORNERS_TOP(SCF(*ps), on);
++ S_SET_HAS_ROUNDED_CORNERS_TOP(SCM(*ps), 1);
++ S_SET_HAS_ROUNDED_CORNERS_TOP(SCC(*ps), 1);
++
++ /* FluxboxHandles found */
++ if (S_HAS_FLUXBOX_HANDLES(SCC(*ps))) {
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCF(*ps), !on);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCM(*ps), 1);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCC(*ps), 1);
++ }
++ else {
++ S_SET_HAS_FLUXBOX_HANDLES(SCF(*ps), !on);
++ S_SET_HAS_FLUXBOX_HANDLES(SCM(*ps), 1);
++ S_SET_HAS_FLUXBOX_HANDLES(SCC(*ps), 1);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCF(*ps), on);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCM(*ps), 1);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCC(*ps), 1);
++ }
++ }
++ else if (StrEquals(token, "RoundedCornersTop"))
++ {
++ S_SET_HAS_ROUNDED_CORNERS_TOP(SCF(*ps), on);
++ S_SET_HAS_ROUNDED_CORNERS_TOP(SCM(*ps), 1);
++ S_SET_HAS_ROUNDED_CORNERS_TOP(SCC(*ps), 1);
++ }
++ else if (StrEquals(token, "RoundedCornersBottom"))
++ {
++ /* FluxboxHandles found */
++ if (S_HAS_FLUXBOX_HANDLES(SCC(*ps))) {
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCF(*ps), !on);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCM(*ps), 1);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCC(*ps), 1);
++ }
++ else {
++ S_SET_HAS_FLUXBOX_HANDLES(SCF(*ps), !on);
++ S_SET_HAS_FLUXBOX_HANDLES(SCM(*ps), 1);
++ S_SET_HAS_FLUXBOX_HANDLES(SCC(*ps), 1);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCF(*ps), on);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCM(*ps), 1);
++ S_SET_HAS_ROUNDED_CORNERS_BOTTOM(SCC(*ps), 1);
++ }
++ }
+ else
+ {
+ found = False;
+@@ -3892,6 +3963,12 @@
+ S_SET_HAS_NO_STICKY_STIPPLED_ICON_TITLE(SCM(*ps), 1);
+ S_SET_HAS_NO_STICKY_STIPPLED_ICON_TITLE(SCC(*ps), 1);
+ }
++ else if (StrEquals(token, "SlightlyRoundedCorners"))
++ {
++ S_SET_HAS_SLIGHTLY_ROUNDED_CORNERS(SCF(*ps), on);
++ S_SET_HAS_SLIGHTLY_ROUNDED_CORNERS(SCM(*ps), 1);
++ S_SET_HAS_SLIGHTLY_ROUNDED_CORNERS(SCC(*ps), 1);
++ }
+ else if (StrEquals(token, "Slippery"))
+ {
+ S_SET_IS_STICKY_ACROSS_PAGES(SCF(*ps), !on);
+@@ -4890,6 +4967,21 @@
+ flags->do_update_rotated_title = 1;
+ }
+
++ /* has_fluxbox_handles */
++ if (S_HAS_FLUXBOX_HANDLES(SCC(*ret_style)))
++ {
++ flags->do_redecorate = True;
++ }
++
++ /* has_rounded_corners */
++ if (S_HAS_ROUNDED_CORNERS_TOP(SCC(*ret_style))
++ || S_HAS_ROUNDED_CORNERS_BOTTOM(SCC(*ret_style))
++ || S_HAS_SLIGHTLY_ROUNDED_CORNERS(SCC(*ret_style)))
++ {
++ flags->do_redecorate = True;
++ }
++
++
+ /* has_mwm_border
+ * has_mwm_buttons */
+ if (S_HAS_MWM_BORDER(SCC(*ret_style)) ||
+@@ -5142,6 +5234,12 @@
+ flags->do_update_modules_flags = 1;
+ }
+
++ /* has_corner_width */
++ if (ret_style->change_mask.has_corner_width)
++ {
++ flags->do_redecorate = True;
++ }
++
+ if (ret_style->change_mask.do_save_under ||
+ ret_style->change_mask.use_backing_store ||
+ ret_style->change_mask.use_parent_relative)
+diff -ruN mvwm/style.h new/style.h
+--- mvwm/style.h 2014-08-26 21:45:02.404749906 +0200
++++ mvwm/style.h 2014-08-26 22:54:23.314701276 +0200
+@@ -24,6 +24,8 @@
+ ((sf)->has_color_fore)
+ #define SHAS_HANDLE_WIDTH(sf) \
+ ((sf)->has_handle_width)
++#define SHAS_CORNER_WIDTH(sf) \
++ ((sf)->has_corner_width)
+ #define SHAS_ICON(sf) \
+ ((sf)->has_icon)
+ #define SHAS_ICON_BOXES(sf) \
+@@ -336,6 +338,22 @@
+ ((c).s.use_title_decor_rotation)
+ #define S_SET_USE_TITLE_DECOR_ROTATION(c,x) \
+ ((c).s.use_title_decor_rotation = !!(x))
++#define S_HAS_FLUXBOX_HANDLES(c) \
++ ((c).s.has_fluxbox_handles)
++#define S_SET_HAS_FLUXBOX_HANDLES(c,x) \
++ ((c).s.has_fluxbox_handles = !!(x))
++#define S_HAS_ROUNDED_CORNERS_TOP(c) \
++ ((c).s.has_rounded_corners_top)
++#define S_SET_HAS_ROUNDED_CORNERS_TOP(c,x) \
++ ((c).s.has_rounded_corners_top = !!(x))
++#define S_HAS_ROUNDED_CORNERS_BOTTOM(c) \
++ ((c).s.has_rounded_corners_bottom)
++#define S_SET_HAS_ROUNDED_CORNERS_BOTTOM(c,x) \
++ ((c).s.has_rounded_corners_bottom = !!(x))
++#define S_HAS_SLIGHTLY_ROUNDED_CORNERS(c) \
++ ((c).s.has_slightly_rounded_corners)
++#define S_SET_HAS_SLIGHTLY_ROUNDED_CORNERS(c,x) \
++ ((c).s.has_slightly_rounded_corners = !!(x))
+ #define S_DO_EWMH_MINI_ICON_OVERRIDE(c) \
+ ((c).s.do_ewmh_mini_icon_override)
+ #define S_SET_DO_EWMH_MINI_ICON_OVERRIDE(c,x) \
+@@ -488,6 +506,10 @@
+ ((s).handle_width)
+ #define SSET_HANDLE_WIDTH(s,x) \
+ ((s).handle_width = (x))
++#define SGET_CORNER_WIDTH(s) \
++ ((s).corner_width)
++#define SSET_CORNER_WIDTH(s,x) \
++ ((s).corner_width = (x))
+ #define SGET_LAYER(s) \
+ ((s).layer)
+ #define SSET_LAYER(s,x) \
+diff -ruN mvwm/window_flags.h new/window_flags.h
+--- mvwm/window_flags.h 2014-08-26 21:45:02.414749906 +0200
++++ mvwm/window_flags.h 2014-08-26 22:54:23.314701276 +0200
+@@ -314,18 +314,42 @@
+ (fw)->flags.common.s.is_bottom_title_rotated = !!(x)
+ #define SETM_IS_BOTTOM_TITLE_ROTATED(fw,x) \
+ (fw)->flag_mask.common.s.is_bottom_title_rotated = !!(x)
+-#define IS_BOTTOM_TITLE_ROTATED(fw) \
+- ((fw)->flags.common.s.is_bottom_title_rotated)
+-#define SET_IS_BOTTOM_TITLE_ROTATED(fw,x) \
+- (fw)->flags.common.s.is_bottom_title_rotated = !!(x)
+-#define SETM_IS_BOTTOM_TITLE_ROTATED(fw,x) \
+- (fw)->flag_mask.common.s.is_bottom_title_rotated = !!(x)
++#define IS_TOP_TITLE_ROTATED(fw) \
++ ((fw)->flags.common.s.is_top_title_rotated)
++#define SET_IS_TOP_TITLE_ROTATED(fw,x) \
++ (fw)->flags.common.s.is_top_title_rotated = !!(x)
++#define SETM_IS_TOP_TITLE_ROTATED(fw,x) \
++ (fw)->flag_mask.common.s.is_top_title_rotated = !!(x)
+ #define USE_TITLE_DECOR_ROTATION(fw) \
+ ((fw)->flags.common.s.use_title_decor_rotation)
+ #define SET_USE_TITLE_DECOR_ROTATION(fw,x) \
+ (fw)->flags.common.s.use_title_decor_rotation = !!(x)
+ #define SETM_USE_TITLE_DECOR_ROTATION(fw,x) \
+ (fw)->flag_mask.common.s.use_title_decor_rotation = !!(x)
++#define HAS_FLUXBOX_HANDLES(fw) \
++ ((fw)->flags.common.s.has_fluxbox_handles && (fw->flags.has_handles))
++#define SET_HAS_FLUXBOX_HANDLES(fw,x) \
++ (fw)->flags.common.s.has_fluxbox_handles = !!(x)
++#define SETM_HAS_FLUXBOX_HANDLES(fw,x) \
++ (fw)->flag_mask.common.s.has_fluxbox_handles = !!(x)
++#define HAS_ROUNDED_CORNERS_TOP(fw) \
++ ((fw)->flags.common.s.has_rounded_corners_top)
++#define SET_HAS_ROUNDED_CORNERS_TOP(fw,x) \
++ (fw)->flags.common.s.has_rounded_corners_top = !!(x)
++#define SETM_HAS_ROUNDED_CORNERS_TOP(fw,x) \
++ (fw)->flag_mask.common.s.has_rounded_corners_top = !!(x)
++#define HAS_ROUNDED_CORNERS_BOTTOM(fw) \
++ ((fw)->flags.common.s.has_rounded_corners_bottom)
++#define SET_HAS_ROUNDED_CORNERS_BOTTOM(fw,x) \
++ (fw)->flags.common.s.has_rounded_corners_bottom = !!(x)
++#define SETM_HAS_ROUNDED_CORNERS_BOTTOM(fw,x) \
++ (fw)->flag_mask.common.s.has_rounded_corners_bottom = !!(x)
++#define HAS_SLIGHTLY_ROUNDED_CORNERS(fw) \
++ ((fw)->flags.common.s.has_slightly_rounded_corners)
++#define SET_HAS_SLIGHTLY_ROUNDED_CORNERS_BOTTOM(fw,x) \
++ (fw)->flags.common.s.has_slightly_rounded_corners = !!(x)
++#define SETM_HAS_SLIGHTLY_ROUNDED_CORNERS(fw,x) \
++ (fw)->flag_mask.common.s.has_slightly_rounded_corners = !!(x)
+
+ /* access to the special flags of a window */
+ #define DO_REUSE_DESTROYED(fw) \
+diff -ruN mvwm/windowshade.c mvwm/windowshade.c
+--- mvwm/windowshade.c 2014-08-26 21:45:02.414749906 +0200
++++ mvwm/windowshade.c 2014-08-26 22:54:23.314701276 +0200
+@@ -212,6 +212,7 @@
+ border_draw_decorations(
+ fw, PART_TITLEBAR, (fw == get_focus_window()) ? True : False,
+ 0, CLEAR_BUTTONS, NULL, NULL);
++ frame_make_rounded_corners(fw);
+ /* update hints and inform modules */
+ BroadcastConfig(M_CONFIGURE_WINDOW, fw);
+ BroadcastPacket(