Fixes #7–#11: launcher Other tab, ICCCM size hints, icon loading, multi-desktop
Fix #7: Add "Other" catch-all category to the launcher. map_category() now returns "Other" instead of "" for unrecognized .desktop Categories, and an "Other" tab is added to the CATS list so those apps are discoverable instead of silently hidden. Fix #8: Respect ICCCM WM_NORMAL_HINTS. client_add() reads PMinSize, PResizeInc, and PBaseSize from the window's size hints. The resize drag handler in events.c clamps to min_w/min_h and snaps to the width_inc/height_inc grid, fixing jank in character-cell terminal emulators (xterm, Alacritty). Fix #10: Optional freedesktop icon loading via imlib2. The launcher now parses the Icon= field from .desktop files and attempts to render a PNG icon from Papirus-Dark (or hicolor fallback). When imlib2 is not present the existing letter-square is shown unchanged. launcher/Makefile auto-detects imlib2 via pkg-config and sets -DHAVE_IMLIB2. Fix #11: True 4-desktop support in the WM. Each Client carries a desktop field (assigned at map time from wm->cur_desktop). Clicking a workspace button in the deskbar sends _NET_CURRENT_DESKTOP; the WM now handles it via wm_switch_desktop() which unmaps frames on the leaving desktop, maps frames on the arriving desktop, and re-focuses. _NET_WM_DESKTOP is set per window so the deskbar can filter db_update_apps() to show only current-desktop windows (sticky windows with desktop 0xFFFFFFFF are always shown).
This commit is contained in:
7 files changed
+173
-16
No files matched your search
+36
-3
@@ -54,9 +54,12 @@ Client *client_add(WM *wm, Window win) {
|
||||
if (client_find_by_win(wm, win)) return NULL;
|
||||
|
||||
Client *c = calloc(1, sizeof(Client));
|
||||
c->win = win;
|
||||
c->w = wa.width;
|
||||
c->h = wa.height;
|
||||
c->win = win;
|
||||
c->w = wa.width;
|
||||
c->h = wa.height;
|
||||
c->desktop = wm->cur_desktop;
|
||||
c->min_w = MIN_WIN_W;
|
||||
c->min_h = MIN_WIN_H;
|
||||
|
||||
/* use application-requested position if non-zero, otherwise smart place */
|
||||
if (wa.x == 0 && wa.y == 0) {
|
||||
@@ -93,6 +96,36 @@ Client *client_add(WM *wm, Window win) {
|
||||
}
|
||||
}
|
||||
|
||||
/* ICCCM WM_NORMAL_HINTS — size constraints and resize increments */
|
||||
{
|
||||
XSizeHints hints;
|
||||
long supplied = 0;
|
||||
if (XGetWMNormalHints(wm->dpy, win, &hints, &supplied)) {
|
||||
if (hints.flags & PMinSize) {
|
||||
if (hints.min_width > c->min_w) c->min_w = hints.min_width;
|
||||
if (hints.min_height > c->min_h) c->min_h = hints.min_height;
|
||||
}
|
||||
if (hints.flags & PResizeInc) {
|
||||
c->inc_w = hints.width_inc;
|
||||
c->inc_h = hints.height_inc;
|
||||
}
|
||||
if (hints.flags & PBaseSize) {
|
||||
c->base_w = hints.base_width;
|
||||
c->base_h = hints.base_height;
|
||||
} else if (hints.flags & PMinSize) {
|
||||
c->base_w = hints.min_width;
|
||||
c->base_h = hints.min_height;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* advertise which desktop this window lives on */
|
||||
{
|
||||
long desk = wm->cur_desktop;
|
||||
XChangeProperty(wm->dpy, win, wm->net_wm_desktop, XA_CARDINAL, 32,
|
||||
PropModeReplace, (unsigned char *)&desk, 1);
|
||||
}
|
||||
|
||||
int fw = (int)c->w + BORDER_W * 2;
|
||||
int fh = (int)c->h + TITLE_HEIGHT + BORDER_W;
|
||||
|
||||
|
||||
Reference in new issue
Block a user