summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoruint23 <[email protected]>2025-04-21 13:01:49 +0100
committeruint23 <[email protected]>2025-04-21 13:01:49 +0100
commit096f37882d1521d5bc42a693fe490c1366f82607 (patch)
treef11fde5950dde727709f663f2d8477731fd908a5 /src
parent149c0723a99bd0a5f81bb466321417b38706aa72 (diff)
official release !v1.0.0
added mouse support for polybar
Diffstat (limited to 'src')
-rw-r--r--src/defs.h38
-rw-r--r--src/sxwm.c45
2 files changed, 60 insertions, 23 deletions
diff --git a/src/defs.h b/src/defs.h
index 4e47e70..97cbd7b 100644
--- a/src/defs.h
+++ b/src/defs.h
@@ -9,7 +9,7 @@
#define ulong unsigned long
#define u_char unsigned char
-#define SXWM_VERSION "sxwm ver. 0.1.6"
+#define SXWM_VERSION "sxwm ver. 1.0.0"
#define SXWM_AUTHOR "(C) Abhinav Prasai 2025"
#define SXWM_LICINFO "See LICENSE for more info"
@@ -27,26 +27,26 @@
#define CMD(name, ...) \
static const char *name[] = { __VA_ARGS__, NULL }
-static void change_ws1(void);
-static void moveto_ws1(void);
-static void change_ws2(void);
-static void moveto_ws2(void);
-static void change_ws3(void);
-static void moveto_ws3(void);
-static void change_ws4(void);
-static void moveto_ws4(void);
-static void change_ws5(void);
-static void moveto_ws5(void);
-static void change_ws6(void);
-static void moveto_ws6(void);
-static void change_ws7(void);
-static void moveto_ws7(void);
-static void change_ws8(void);
-static void moveto_ws8(void);
-static void change_ws9(void);
-static void moveto_ws9(void);
#define INIT_WORKSPACE \
+static void change_ws1(void);\
+static void moveto_ws1(void);\
+static void change_ws2(void);\
+static void moveto_ws2(void);\
+static void change_ws3(void);\
+static void moveto_ws3(void);\
+static void change_ws4(void);\
+static void moveto_ws4(void);\
+static void change_ws5(void);\
+static void moveto_ws5(void);\
+static void change_ws6(void);\
+static void moveto_ws6(void);\
+static void change_ws7(void);\
+static void moveto_ws7(void);\
+static void change_ws8(void);\
+static void moveto_ws8(void);\
+static void change_ws9(void);\
+static void moveto_ws9(void);\
static void change_ws1(void) { change_workspace(0); update_net_client_list(); } \
static void moveto_ws1(void) { move_to_workspace(0); update_net_client_list(); }\
static void change_ws2(void) { change_workspace(1); update_net_client_list(); } \
diff --git a/src/sxwm.c b/src/sxwm.c
index a45632c..b628163 100644
--- a/src/sxwm.c
+++ b/src/sxwm.c
@@ -49,6 +49,7 @@ static void hdl_enter(XEvent *xev);
static void hdl_keypress(XEvent *xev);
static void hdl_map_req(XEvent *xev);
static void hdl_motion(XEvent *xev);
+static void hdl_root_property(XEvent *xev);
static void inc_gaps(void);
static void move_master_next(void);
static void move_master_prev(void);
@@ -73,7 +74,9 @@ static void update_monitors(void);
static void update_net_client_list(void);
static int xerr(Display *dpy, XErrorEvent *ee);
static void xev_case(XEvent *xev);
+INIT_WORKSPACE
#include "config.h"
+
#ifdef XINERAMA_SUPPORT
#include <X11/extensions/Xinerama.h>
#endif
@@ -83,6 +86,7 @@ static Atom atom_wm_strut_partial;
static Atom atom_wm_window_type;
static Atom atom_net_supported;
static Atom atom_net_wm_state;
+static Atom atom_net_current_desktop;
static Atom atom_net_wm_state_fullscreen;
static Atom atom_net_wm_window_type_dock;
static Atom atom_net_workarea;
@@ -114,7 +118,6 @@ static uint reserve_left = 0;
static uint reserve_right = 0;
static uint reserve_top = 0;
static uint reserve_bottom = 0;
-INIT_WORKSPACE
static void
add_client(Window w)
@@ -333,6 +336,12 @@ hdl_button_release(XEvent *xev)
static void
hdl_client_msg(XEvent *xev)
{
+ /* clickable bar workspace switching */
+ if (xev->xclient.message_type == atom_net_current_desktop) {
+ uint ws = (uint)xev->xclient.data.l[0];
+ change_workspace(ws);
+ return;
+ }
if (xev->xclient.message_type == atom_net_wm_state) {
long action = xev->xclient.data.l[0];
Atom target = xev->xclient.data.l[1];
@@ -621,6 +630,26 @@ hdl_motion(XEvent *xev)
}
static void
+hdl_root_property(XEvent *xev)
+{
+ XPropertyEvent *e = &xev->xproperty;
+ if (e->atom != atom_net_current_desktop) return;
+
+ long *val = NULL;
+ Atom actual;
+ int fmt;
+ unsigned long n, after;
+ if (XGetWindowProperty(dpy, root, atom_net_current_desktop,
+ 0, 1, False, XA_CARDINAL,
+ &actual, &fmt, &n, &after,
+ (unsigned char**)&val) == Success &&
+ val) {
+ change_workspace((uint)val[0]);
+ XFree(val);
+ }
+}
+
+static void
inc_gaps(void)
{
if (gaps < MAXGAPS) {
@@ -820,8 +849,12 @@ setup(void)
scr_height = XDisplayHeight(dpy, DefaultScreen(dpy));
update_monitors();
- XSelectInput(dpy, root, StructureNotifyMask | SubstructureRedirectMask |
- SubstructureNotifyMask | KeyPressMask);
+ XSelectInput(dpy, root,
+ StructureNotifyMask |
+ SubstructureRedirectMask |
+ SubstructureNotifyMask |
+ KeyPressMask |
+ PropertyChangeMask);
XGrabButton(dpy, Button1, MOD, root,
True, ButtonPressMask | ButtonReleaseMask|PointerMotionMask,
GrabModeAsync, GrabModeAsync, None, None);
@@ -843,6 +876,7 @@ setup(void)
evtable[KeyPress] = hdl_keypress;
evtable[MapRequest] = hdl_map_req;
evtable[MotionNotify] = hdl_motion;
+ evtable[PropertyNotify] = hdl_root_property;
border_foc_col = parse_col(BORDER_FOC_COL);
border_ufoc_col = parse_col(BORDER_UFOC_COL);
@@ -851,7 +885,7 @@ setup(void)
}
static void
-setup_atoms(void)
+setup_atoms (void)
{
/* bar atoms */
atom_net_supported = XInternAtom(dpy, "_NET_SUPPORTED", False);
@@ -904,6 +938,9 @@ setup_atoms(void)
/* delete atoms */
atom_wm_delete = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
+
+ /* current desktop atoms */
+ atom_net_current_desktop = XInternAtom(dpy, "_NET_CURRENT_DESKTOP", False);
}
static void