174 lines
5.7 KiB
Diff
174 lines
5.7 KiB
Diff
From 582568b08c354f4bb037bcfb00dd440a59d7cbe0 Mon Sep 17 00:00:00 2001
|
|
From: cpoakes <cpoakes@users.noreply.github.com>
|
|
Date: Tue, 29 Aug 2017 19:56:29 -0500
|
|
Subject: [PATCH] openbox-3.6.2-rounded-corners
|
|
|
|
---
|
|
openbox/config.c | 8 ++++++++
|
|
openbox/config.h | 4 ++++
|
|
openbox/frame.c | 30 +++++++++++++++++++++++++++++-
|
|
openbox/framerender.c | 7 +++++++
|
|
openbox/menuframe.c | 4 ++++
|
|
5 files changed, 52 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/openbox/config.c b/openbox/config.c
|
|
index dad5d1bf..a387335c 100644
|
|
--- a/openbox/config.c
|
|
+++ b/openbox/config.c
|
|
@@ -48,6 +48,8 @@ StrutPartial config_margins;
|
|
gchar *config_theme;
|
|
gboolean config_theme_keepborder;
|
|
guint config_theme_window_list_icon_size;
|
|
+guint config_theme_cornerradius;
|
|
+gboolean config_theme_menuradius;
|
|
|
|
gchar *config_title_layout;
|
|
|
|
@@ -719,6 +721,10 @@ static void parse_theme(xmlNodePtr node, gpointer d)
|
|
else if (config_theme_window_list_icon_size > 96)
|
|
config_theme_window_list_icon_size = 96;
|
|
}
|
|
+ if ((n = obt_xml_find_node(node, "cornerRadius"))) {
|
|
+ config_theme_cornerradius = obt_xml_node_int(n);
|
|
+ obt_xml_attr_bool(n, "menu", &config_theme_menuradius);
|
|
+ }
|
|
|
|
for (n = obt_xml_find_node(node, "font");
|
|
n;
|
|
@@ -1098,6 +1104,8 @@ void config_startup(ObtXmlInst *i)
|
|
config_title_layout = g_strdup("NLIMC");
|
|
config_theme_keepborder = TRUE;
|
|
config_theme_window_list_icon_size = 36;
|
|
+ config_theme_cornerradius = 0;
|
|
+ config_theme_menuradius = TRUE;
|
|
|
|
config_font_activewindow = NULL;
|
|
config_font_inactivewindow = NULL;
|
|
diff --git a/openbox/config.h b/openbox/config.h
|
|
index 96a66cf1..5622d059 100644
|
|
--- a/openbox/config.h
|
|
+++ b/openbox/config.h
|
|
@@ -152,6 +152,10 @@ extern gchar *config_title_layout;
|
|
extern gboolean config_animate_iconify;
|
|
/*! Size of icons in focus switching dialogs */
|
|
extern guint config_theme_window_list_icon_size;
|
|
+/*! Display rounded corners for decorated windows */
|
|
+extern guint config_theme_cornerradius;
|
|
+/*! Display rounded corners for root and client-list menus */
|
|
+extern gboolean config_theme_menuradius;
|
|
|
|
/*! The font for the active window's title */
|
|
extern RrFont *config_font_activewindow;
|
|
diff --git a/openbox/frame.c b/openbox/frame.c
|
|
index 89669726..db2c7531 100644
|
|
--- a/openbox/frame.c
|
|
+++ b/openbox/frame.c
|
|
@@ -334,6 +334,31 @@ void frame_adjust_shape(ObFrame *self)
|
|
#endif
|
|
}
|
|
|
|
+void frame_round_corners(Window window)
|
|
+{
|
|
+ XWindowAttributes win_attr;
|
|
+ XGetWindowAttributes(obt_display, window, &win_attr);
|
|
+ int width = win_attr.width + win_attr.border_width;
|
|
+ int height = win_attr.height + win_attr.border_width;
|
|
+ Pixmap mask = XCreatePixmap(obt_display, window, width, height, 1);
|
|
+ XGCValues xgcv;
|
|
+ GC shape_gc = XCreateGC(obt_display, mask, 0, &xgcv);
|
|
+ int rad = config_theme_cornerradius;
|
|
+ int dia = 2 * rad;
|
|
+ XSetForeground(obt_display, shape_gc, 0);
|
|
+ XFillRectangle(obt_display, mask, shape_gc, 0, 0, width, height);
|
|
+ XSetForeground(obt_display, shape_gc, 1);
|
|
+ XFillArc(obt_display, mask, shape_gc, 0, 0, dia, dia, 0, 23040);
|
|
+ XFillArc(obt_display, mask, shape_gc, width-dia-1, 0, dia, dia, 0, 23040);
|
|
+ XFillArc(obt_display, mask, shape_gc, 0, height-dia-1, dia, dia, 0, 23040);
|
|
+ XFillArc(obt_display, mask, shape_gc, width-dia-1, height-dia-1, dia, dia,
|
|
+ 0, 23040);
|
|
+ XFillRectangle(obt_display, mask, shape_gc, rad, 0, width-dia, height);
|
|
+ XFillRectangle(obt_display, mask, shape_gc, 0, rad, width, height-dia);
|
|
+ XShapeCombineMask(obt_display, window, ShapeBounding, 0, 0, mask, ShapeSet);
|
|
+ XFreePixmap(obt_display, mask);
|
|
+}
|
|
+
|
|
void frame_adjust_area(ObFrame *self, gboolean moved,
|
|
gboolean resized, gboolean fake)
|
|
{
|
|
@@ -857,7 +882,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
|
|
|
|
if (resized) {
|
|
self->need_render = TRUE;
|
|
- framerender_frame(self);
|
|
frame_adjust_shape(self);
|
|
}
|
|
|
|
@@ -884,7 +908,9 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
|
|
{
|
|
XResizeWindow(obt_display, self->label, self->label_width,
|
|
ob_rr_theme->label_height);
|
|
+ self->need_render = TRUE;
|
|
}
|
|
+ framerender_frame(self);
|
|
}
|
|
|
|
static void frame_adjust_cursors(ObFrame *self)
|
|
@@ -958,6 +984,8 @@ void frame_adjust_client_area(ObFrame *self)
|
|
XMoveResizeWindow(obt_display, self->backfront, 0, 0,
|
|
self->client->area.width,
|
|
self->client->area.height);
|
|
+ self->need_render = TRUE;
|
|
+ framerender_frame(self);
|
|
}
|
|
|
|
void frame_adjust_state(ObFrame *self)
|
|
diff --git a/openbox/framerender.c b/openbox/framerender.c
|
|
index 094d5962..54046580 100644
|
|
--- a/openbox/framerender.c
|
|
+++ b/openbox/framerender.c
|
|
@@ -21,6 +21,7 @@
|
|
#include "openbox.h"
|
|
#include "screen.h"
|
|
#include "client.h"
|
|
+#include "config.h"
|
|
#include "framerender.h"
|
|
#include "obrender/theme.h"
|
|
|
|
@@ -42,6 +43,12 @@ void framerender_frame(ObFrame *self)
|
|
return;
|
|
self->need_render = FALSE;
|
|
|
|
+ if (config_theme_cornerradius &&
|
|
+ !self->client->fullscreen &&
|
|
+ !self->client->shaped &&
|
|
+ !(self->client->type == OB_CLIENT_TYPE_DOCK))
|
|
+ frame_round_corners(self->window);
|
|
+
|
|
{
|
|
gulong px;
|
|
|
|
diff --git a/openbox/menuframe.c b/openbox/menuframe.c
|
|
index c37fdcc5..f598cf15 100644
|
|
--- a/openbox/menuframe.c
|
|
+++ b/openbox/menuframe.c
|
|
@@ -17,6 +17,7 @@
|
|
See the COPYING file for a copy of the GNU General Public License.
|
|
*/
|
|
|
|
+#include "frame.h"
|
|
#include "menuframe.h"
|
|
#include "client.h"
|
|
#include "menu.h"
|
|
@@ -845,6 +846,9 @@ void menu_frame_render(ObMenuFrame *self)
|
|
|
|
RECT_SET_SIZE(self->area, w, h);
|
|
|
|
+ if (config_theme_menuradius)
|
|
+ frame_round_corners(self->window);
|
|
+
|
|
XFlush(obt_display);
|
|
}
|
|
|
|
--
|
|
2.14.1
|
|
|