Add 6 desktop features: workspace shortcuts, Exposé, deskbar icons, notifications, screen lock, move-to-desktop
- Super+1-4: switch virtual desktop; Super+Shift+1-4: move focused window to desktop N - Super+Space: Exposé window overview (tiled grid), click to select, Escape to cancel - wm/src/expose.c: expose_show/expose_hide using ceil(sqrt) grid layout with saved/restored geometry - client_move_to_desktop(): moves window between desktops, fires _NET_WM_DESKTOP update - on_client_message: handles _NET_WM_DESKTOP to move windows from external requests - deskbar: optional imlib2 app icon rendering (Papirus-Dark → Papirus → hicolor → pixmaps fallback) - deskbar: XGetClassHint populates cls field for better icon lookup - deskbar: context menu extended with separator + "→ Desktop 1-4" items via _NET_WM_DESKTOP - orionnotify/: freedesktop.org notification daemon (libdbus-1), stacks up to 5 popups top-right - orionlock/: PAM-authenticated fullscreen screen lock with clock, date, password dots - Lock Screen menu item wired to orionlock - Root Makefile includes orionnotify and orionlock targets Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GHiBQKPfUoaJgCKuA9op1H
This commit is contained in:
14 files changed
+977
-31
No files matched your search
+56
-3
@@ -74,6 +74,7 @@ void on_expose(WM *wm, XExposeEvent *e) {
|
||||
if (c && !c->minimized) frame_draw(wm, c);
|
||||
}
|
||||
|
||||
|
||||
void on_configure_request(WM *wm, XConfigureRequestEvent *e) {
|
||||
Client *c = client_find_by_win(wm, e->window);
|
||||
XWindowChanges wc;
|
||||
@@ -136,6 +137,7 @@ void on_client_message(WM *wm, XClientMessageEvent *e) {
|
||||
Atom net_active = XInternAtom(wm->dpy, "_NET_ACTIVE_WINDOW", False);
|
||||
Atom net_close = XInternAtom(wm->dpy, "_NET_CLOSE_WINDOW", False);
|
||||
Atom wm_change_state = XInternAtom(wm->dpy, "WM_CHANGE_STATE", False);
|
||||
Atom net_wm_desktop = XInternAtom(wm->dpy, "_NET_WM_DESKTOP", False);
|
||||
|
||||
/* _NET_CURRENT_DESKTOP → switch virtual desktop */
|
||||
if (e->message_type == wm->net_current_desktop && e->window == wm->root) {
|
||||
@@ -143,6 +145,13 @@ void on_client_message(WM *wm, XClientMessageEvent *e) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* _NET_WM_DESKTOP → move window to desktop */
|
||||
if (e->message_type == net_wm_desktop) {
|
||||
Client *c = client_find_by_win(wm, e->window);
|
||||
if (c) client_move_to_desktop(wm, c, (int)e->data.l[0]);
|
||||
return;
|
||||
}
|
||||
|
||||
if (e->message_type == net_active) {
|
||||
Client *c = client_find_by_win(wm, e->window);
|
||||
if (c) client_restore(wm, c);
|
||||
@@ -208,6 +217,14 @@ void on_property_notify(WM *wm, XPropertyEvent *e) {
|
||||
}
|
||||
|
||||
void on_button_press(WM *wm, XButtonEvent *e) {
|
||||
/* Exposé — click on any frame to select and exit */
|
||||
if (wm->expose_active) {
|
||||
Client *c = client_find_by_frame(wm, e->window);
|
||||
if (c) expose_hide(wm, c->frame);
|
||||
else expose_hide(wm, None);
|
||||
return;
|
||||
}
|
||||
|
||||
/* menu window */
|
||||
if (wm->menu_visible && e->window == wm->menu_win) {
|
||||
if (e->button == Button1) menu_click(wm, e->x, e->y);
|
||||
@@ -401,9 +418,45 @@ void on_key_press(WM *wm, XKeyEvent *e) {
|
||||
if ((e->state & Mod4Mask) && sym == XK_Down && wm->focused)
|
||||
client_unmaximize(wm, wm->focused);
|
||||
|
||||
/* Escape — hide menu */
|
||||
if (sym == XK_Escape && wm->menu_visible)
|
||||
menu_hide(wm);
|
||||
/* Super+Space — Exposé window overview */
|
||||
if ((e->state & Mod4Mask) && sym == XK_space) {
|
||||
if (wm->expose_active) expose_hide(wm, None);
|
||||
else expose_show(wm);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Super+1-4 — switch to desktop N */
|
||||
if ((e->state & Mod4Mask) && !(e->state & ShiftMask)) {
|
||||
int desk = -1;
|
||||
if (sym == XK_1) desk = 0;
|
||||
else if (sym == XK_2) desk = 1;
|
||||
else if (sym == XK_3) desk = 2;
|
||||
else if (sym == XK_4) desk = 3;
|
||||
if (desk >= 0) {
|
||||
if (wm->expose_active) expose_hide(wm, None);
|
||||
wm_switch_desktop(wm, desk);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Super+Shift+1-4 — move focused window to desktop N */
|
||||
if ((e->state & Mod4Mask) && (e->state & ShiftMask) && wm->focused) {
|
||||
int desk = -1;
|
||||
if (sym == XK_1) desk = 0;
|
||||
else if (sym == XK_2) desk = 1;
|
||||
else if (sym == XK_3) desk = 2;
|
||||
else if (sym == XK_4) desk = 3;
|
||||
if (desk >= 0) {
|
||||
client_move_to_desktop(wm, wm->focused, desk);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Escape — hide menu or exit Exposé */
|
||||
if (sym == XK_Escape) {
|
||||
if (wm->expose_active) expose_hide(wm, None);
|
||||
else if (wm->menu_visible) menu_hide(wm);
|
||||
}
|
||||
}
|
||||
|
||||
void on_key_release(WM *wm, XKeyEvent *e) {
|
||||
|
||||
Reference in new issue
Block a user