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
@@ -73,10 +73,15 @@ typedef struct Client {
|
||||
int focused;
|
||||
int minimized;
|
||||
int maximized;
|
||||
int desktop; /* virtual desktop this window lives on */
|
||||
int saved_x, saved_y; /* pre-maximize position */
|
||||
unsigned saved_w, saved_h; /* pre-maximize size */
|
||||
Time last_click_time; /* for double-click detection */
|
||||
char title[256];
|
||||
/* ICCCM WM_NORMAL_HINTS */
|
||||
int min_w, min_h; /* PMinSize */
|
||||
int inc_w, inc_h; /* PResizeInc — 0 means no constraint */
|
||||
int base_w, base_h; /* PBaseSize — baseline for increment calc */
|
||||
struct Client *next;
|
||||
} Client;
|
||||
|
||||
@@ -104,6 +109,8 @@ typedef struct WM {
|
||||
Client *clients;
|
||||
Client *focused;
|
||||
|
||||
int cur_desktop; /* active virtual desktop (0-based) */
|
||||
|
||||
Atom wm_delete_window;
|
||||
Atom wm_protocols;
|
||||
Atom wm_state;
|
||||
@@ -112,6 +119,8 @@ typedef struct WM {
|
||||
Atom net_wm_state_hidden;
|
||||
Atom net_wm_state_maximized_vert;
|
||||
Atom net_wm_state_maximized_horz;
|
||||
Atom net_wm_desktop;
|
||||
Atom net_current_desktop;
|
||||
|
||||
DragMode drag_mode;
|
||||
int drag_start_x, drag_start_y;
|
||||
|
||||
Reference in new issue
Block a user