summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.scm1
-rw-r--r--schewm.c89
-rw-r--r--wm.scm37
3 files changed, 112 insertions, 15 deletions
diff --git a/main.scm b/main.scm
index 77aedc3..8f3d023 100644
--- a/main.scm
+++ b/main.scm
@@ -74,6 +74,7 @@
(,(make-shift-key "o") . ,wm-client-monitor-next)))
(when (wm-init)
+ (wm-reconfigure config)
(wm-grab-keys wm-keybindings)
(wm-set-key-press-handler!
(lambda (mod keysym)
diff --git a/schewm.c b/schewm.c
index aff4ad9..4ac11f8 100644
--- a/schewm.c
+++ b/schewm.c
@@ -600,7 +600,7 @@ callbacks_map_free(struct CallbacksMap *map) {
free(map);
}
-static struct {
+static struct Config {
uint16_t inner_border_width, outer_border_width, magnet_border_width;
int16_t offset_x, offset_y;
uint16_t offset_width, offset_height;
@@ -2103,6 +2103,12 @@ wm_fit_client(struct Client *client) {
}
void
+wm_update_client_monitor(struct Client *client) {
+ client->monitor = find_monitor(client);
+ wm_fit_client(client);
+}
+
+void
wm_handle_state(struct Client *client, xcb_atom_t atom, uint32_t action) {
// `state' holds what the atom wants to tell us about what to do
enum WindowState state = WS_NORMAL;
@@ -2219,8 +2225,7 @@ manage_client_maybe_reposition(xcb_window_t window, bool set_position) {
client->y = p.y - client->height / 2;
dpy_update_window_position(client);
}
- client->monitor = find_monitor(client);
- wm_fit_client(client);
+ wm_update_client_monitor(client);
clients_map_add(wm.clients, client);
if (client->state == WS_NORMAL) {
dpy_draw_unfocused_borders(client);
@@ -2321,6 +2326,64 @@ wm_destroy() {
}
void
+wm_reconfigure(uint16_t inner_border_width,
+ uint16_t outer_border_width,
+ uint16_t magnet_border_width,
+ int16_t offset_x,
+ int16_t offset_y,
+ uint16_t offset_width,
+ uint16_t offset_height,
+ uint32_t focused,
+ uint32_t unfocused,
+ uint32_t unkillable,
+ uint32_t empty,
+ uint32_t outer) {
+ cfg.inner_border_width = inner_border_width;
+ cfg.outer_border_width = outer_border_width;
+ cfg.magnet_border_width = magnet_border_width;
+ cfg.offset_x = offset_x;
+ cfg.offset_width = offset_width;
+ cfg.offset_height = offset_height;
+ cfg.colors.focused = focused;
+ cfg.colors.unfocused = unfocused;
+ cfg.colors.unkillable = unkillable;
+ cfg.colors.empty = empty;
+ cfg.colors.outer = outer;
+
+ // Set new window border of ALL clients
+ for (uint32_t workspace = 0; workspace < wm.num_workspaces; workspace++) {
+ struct Client *client = wm.workspaces[workspace].ring;
+ if (client == NULL) {
+ continue;
+ }
+
+ for (;;) {
+ dpy_set_window_border_width(client->id);
+ wm_fit_client(client);
+
+ client = client->next;
+ if (client == wm.workspaces[workspace].ring) {
+ break;
+ }
+ }
+ }
+
+ // Redraw borders of clients from current workspace only
+ struct Client *client = wm.workspaces[wm.cur_workspace].ring;
+ if (client == NULL) {
+ return;
+ }
+
+ for (;;) {
+ dpy_draw_borders(client, wm.focus == client);
+ client = client->next;
+ if (client == wm.workspaces[wm.cur_workspace].ring) {
+ break;
+ }
+ }
+}
+
+void
wm_close(struct Client *client) {
if (client->is_unkillable) {
return;
@@ -2764,13 +2827,7 @@ ev_configure_request(xcb_generic_event_t *generic_ev) {
}
wm_apply_size_hints(client);
dpy_update_window_geometry(client);
-
- // Update the client monitor accordingly
- struct Monitor *monitor = find_monitor(client);
- if (monitor != NULL && client->monitor != monitor) {
- client->monitor = monitor;
- }
- wm_fit_client(client);
+ wm_update_client_monitor(client);
// TODO: do we need this?
// dpy_draw_borders(client, wm.focus->id == client->id);
@@ -2910,7 +2967,6 @@ ev_unmap_notify(xcb_generic_event_t *generic_ev) {
struct Client *client = wm_find_client(ev->window);
if (client == NULL
|| wm.workspaces[wm.cur_workspace].ring == NULL
- || wm.workspaces[wm.cur_workspace].ring->id == ev->window
|| client->state == WS_ICONIFIED) {
/*
* For unknown clients, clients not in our current workspace,
@@ -2921,15 +2977,18 @@ ev_unmap_notify(xcb_generic_event_t *generic_ev) {
}
bool should_ignore = true;
- struct Client *ring_ptr = wm.workspaces[wm.cur_workspace].ring->next;
- while (ring_ptr != wm.workspaces[wm.cur_workspace].ring) {
- if (ring_ptr->id == ev->window) {
+ struct Client *ring_client = wm.workspaces[wm.cur_workspace].ring;
+ for (;;) {
+ if (ring_client->id == ev->window) {
// We found the client, now we must handle the unmapping
should_ignore = false;
break;
}
+ ring_client = ring_client->next;
+ if (ring_client == wm.workspaces[wm.cur_workspace].ring) {
+ break;
+ }
}
-
if (should_ignore) {
return;
}
diff --git a/wm.scm b/wm.scm
index a778dae..346d6a4 100644
--- a/wm.scm
+++ b/wm.scm
@@ -4,6 +4,7 @@
#:use-module (system foreign)
#:export (wm-init
make-config
+ wm-reconfigure
make-key
make-shift-key
wm-grab-keys
@@ -88,6 +89,42 @@
(define wm-run
(schewm-func void "wm_run" '()))
+(define c/parse-color
+ (schewm-func uint32 "parse_color" (list '*)))
+
+(define (parse-color s)
+ (c/parse-color (string->pointer s)))
+
+(define c/wm-reconfigure
+ (schewm-func void
+ "wm_reconfigure"
+ (list uint16
+ uint16
+ uint16
+ int16
+ int16
+ uint16
+ uint16
+ uint32
+ uint32
+ uint32
+ uint32
+ uint32)))
+
+(define (wm-reconfigure config)
+ (c/wm-reconfigure (config-inner-border-width config)
+ (config-outer-border-width config)
+ (config-magnet-border-width config)
+ (config-offset-x config)
+ (config-offset-y config)
+ (config-offset-width config)
+ (config-offset-height config)
+ (parse-color (config-focused-color config))
+ (parse-color (config-unfocused-color config))
+ (parse-color (config-unkillable-color config))
+ (parse-color (config-empty-color config))
+ (parse-color (config-outer-color config))))
+
(define wm-focus-prev
(schewm-func void "wm_focus_prev" '()))