commit - 801fab761b523d968811e2c3d88a7a377dcb4975
commit + 9eede8d30b233bf3ee3c74fbbed3803540b556b5
blob - 8c2d515010933fbddb7f2346fc58bd29a1cd96d0
blob + f2036ceee0d2a17f9060e28eec8ee71c00c908af
--- bxwm.c
+++ bxwm.c
#include "config.h"
+
+/* Layout types */
+enum { FLOAT, CENTER, LEFT_HALF, RIGHT_HALF, SMALL, MAXIMIZE };
+
/* Types */
typedef struct {
Window win;
int focused;
int ws;
int is_dock; /* dock/bar window: no border, no positioning, no focus */
+ int layout; /* Remember window geometry type */
} Client;
/* Globals */
update_workarea();
+ spawn(STATUSBAR);
+
#ifdef DEBUG
fprintf(stderr, "bxwm: setup complete\n");
#endif
win_x = wa_x + (wa_w - (win_w + 2 * BORDER_WIDTH)) / 2;
win_y = wa_y + (wa_h - (win_h + 2 * BORDER_WIDTH)) / 2;
+ c->layout = SMALL; /* Default golden ratio placement */
+
XWindowChanges wc = {
.x = win_x,
.y = win_y,
int win_y = wa_y;
if (!c) return;
+ c->layout = CENTER;
#ifdef DEBUG
fprintf(stderr, "bxwm: center 0x%lx\n", c->win);
unsigned int mask = (CWX | CWY | CWWidth | CWHeight | CWBorderWidth | CWStackMode);
XConfigureWindow(dpy, c->win, mask, &wc);
}
- focus_client(c);
}
static void left_half_window(Client *c) {
int win_y = wa_y;
if (!c) return;
+ c->layout = LEFT_HALF;
#ifdef DEBUG
fprintf(stderr, "bxwm: left 0x%lx\n", c->win);
unsigned int mask = (CWX | CWY | CWWidth | CWHeight | CWBorderWidth | CWStackMode);
XConfigureWindow(dpy, c->win, mask, &wc);
}
- focus_client(c);
}
static void right_half_window(Client *c) {
int win_y = wa_y;
if (!c) return;
-
+ c->layout = RIGHT_HALF;
+
#ifdef DEBUG
fprintf(stderr, "bxwm: right 0x%lx\n", c->win);
#endif
unsigned int mask = (CWX | CWY | CWWidth | CWHeight | CWBorderWidth | CWStackMode);
XConfigureWindow(dpy, c->win, mask, &wc);
}
- focus_client(c);
}
static void small_window(Client *c) {
int win_x, win_y;
if (!c) return;
-
+ c->layout = SMALL;
+
/* Step 1: Calculate height first (50% of screen, minus borders) */
win_h = (wa_h * INITIAL_HEIGHT) - (2 * BORDER_WIDTH);
unsigned int mask = CWX | CWY | CWWidth | CWHeight | CWBorderWidth | CWStackMode;
XConfigureWindow(dpy, c->win, mask, &wc);
}
- focus_client(c);
}
static void maximize_window(Client *c) {
int win_y = wa_y;
if (!c) return;
-
+ c->layout = MAXIMIZE;
+
#ifdef DEBUG
fprintf(stderr, "bxwm: maximize 0x%lx\n", c->win);
#endif
unsigned int mask = (CWX | CWY | CWWidth | CWHeight | CWBorderWidth | CWStackMode);
XConfigureWindow(dpy, c->win, mask, &wc);
}
- focus_client(c);
}
static void close_window(Client *c) {
free(wins);
}
+static void arrange(void) {
+ unsigned int i;
+ for (i = 0; i < num_clients; i++) {
+ if (clients[i].ws == curws && !clients[i].is_dock) {
+ switch (clients[i].layout) {
+ case CENTER: center_window(&clients[i]); break;
+ case LEFT_HALF: left_half_window(&clients[i]); break;
+ case RIGHT_HALF: right_half_window(&clients[i]); break;
+ case SMALL: small_window(&clients[i]); break;
+ case MAXIMIZE: maximize_window(&clients[i]); break;
+ }
+ }
+ }
+}
+
static void update_workarea(void) {
unsigned long left = 0, right = 0, top = 0, bottom = 0;
unsigned int i;
PropModeReplace, (unsigned char *)workareas,
NUM_WORKSPACES * 4);
free(workareas);
+
+ arrange();
}