From d9435a1cb92dba205d41f0f554d9c9cf4f1aa791 Mon Sep 17 00:00:00 2001 From: Mike Lowis Date: Wed, 14 Aug 2024 16:48:07 -0400 Subject: [PATCH] broken checkpoint --- anvil.c | 9 +++++++ anvil.h | 36 ++++++++++++------------- client.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 97 insertions(+), 28 deletions(-) diff --git a/anvil.c b/anvil.c index 4b3b0da..ba98d6f 100644 --- a/anvil.c +++ b/anvil.c @@ -167,6 +167,15 @@ static void XClientMsg(XEvent* e) EWMH_UpdateWindowStateFlags( ev->window, ev->data.l[0], ev->data.l[1]); } + + /* + TODO: + * handle WM_State && fullscreen + * handle active window (set urgency) + + */ + + } static void XPropNotify(XEvent* e) diff --git a/anvil.h b/anvil.h index b482b9b..77e0b8d 100644 --- a/anvil.h +++ b/anvil.h @@ -66,25 +66,22 @@ typedef struct { } XConf; enum { - F_MAPPED_ONCE = (1 << 0), - F_WM_DELETE = (1 << 1), - F_DIALOG = (1 << 2), - F_FLOATING = (1 << 3), - F_SHADED = (1 << 4), - F_NO_FRAME = (1 << 5), - -// F_STATE_MODAL = (1 << 0), -// F_STATE_STICKY = (1 << 1), -// F_STATE_MAXIMIZED_VERT = (1 << 2), -// F_STATE_MAXIMIZED_HORZ = (1 << 3), -// F_STATE_SHADED = (1 << 4), -// F_STATE_SKIP_TASKBAR = (1 << 5), -// F_STATE_SKIP_PAGER = (1 << 6), -// F_STATE_HIDDEN = (1 << 7), -// F_STATE_FULLSCREEN = (1 << 8), -// F_STATE_ABOVE = (1 << 9), -// F_STATE_BELOW = (1 << 10), -// F_STATE_DEMANDS_ATTENTION = (1 << 11), + F_MAPPED_ONCE = (1 << 0), + F_MAPPED_FRAME = (1 << 1), + F_MAPPED_WINDOW = (1 << 2), + + + +// F_NO_FRAME = (1 << 1), + + + F_WM_DELETE = (1 << 16), +}; + +enum { + SET_FLAG = 0, + CLR_FLAG = 1, + TOG_FLAG = 2 }; typedef struct Node { @@ -164,7 +161,6 @@ void Client_MoveResize(Client* c); void Client_Move(Client* c, int xdiff, int ydiff); void Client_Resize(Client* c, int xdiff, int ydiff); void Client_Raise(Client* c); -void Client_Lower(Client* c); void Client_Update(Client* c); void Client_Focus(Client* client); void Client_Close(Client* client); diff --git a/client.c b/client.c index 4c2ebe7..629abfc 100644 --- a/client.c +++ b/client.c @@ -129,14 +129,14 @@ void Client_Destroy(Client* c) void Client_MoveResize(Client* c) { - int shaded = (c->flags & F_SHADED); - int floating = 1; //(c->flags & (F_DIALOG|F_FLOATING)); + int shaded = (c->wm_state & F_NET_WM_STATE_SHADED); + int floating = (c->wm_types & (F_NET_WM_WINDOW_TYPE_DIALOG|F_NET_WM_WINDOW_TYPE_NORMAL)); int minheight = (shaded || !floating ? MIN_HEIGHT : 3*MIN_HEIGHT); if (c->w < minheight) c->w = minheight; if (c->h < minheight) c->h = minheight; // printf("XMoveResize(0x%lx, %d, %d, %d, %d)\n", c->frame, c->x, c->y, c->w, c->h); XMoveResizeWindow(X.disp, c->frame, c->x, c->y, c->w, (shaded ? minheight : c->h)); - if ( !(c->flags & F_SHADED) ) + if ( !(c->wm_state & F_NET_WM_STATE_SHADED) ) { int child_w = c->w - FRAME_WIDTH_SUM; int child_h = c->h - FRAME_HEIGHT_SUM; @@ -347,10 +347,6 @@ static void ReadProps(Client* c) c->wm_types = EWMH_GetWindowTypeFlags(c->win); c->wm_state = EWMH_GetWindowStateFlags(c->win); -// ReadWindowTypes(c); -// -// ReadWindowState(c); - /* The following properties are unused currently */ /* WM_ICON_NAME - window title when iconified */ /* WM_COLORMAP_WINDOWS - */ @@ -377,7 +373,7 @@ static void Redraw(Client* c) XDrawLine(X.disp, c->frame, DefaultGC(X.disp, X.screen), c->w-1, 0, c->w-1, c->h); /* draw inner border */ - if (!(c->flags & F_SHADED)) + if (!(c->wm_state & F_NET_WM_STATE_SHADED)) { int bw = BORDER_WIDTH; int mh = MIN_HEIGHT; @@ -511,3 +507,71 @@ static void* ListDelete(void* list, void* node) return l; } } + +static void UpdateState(Client* c) +{ + int frame_shown = 1; + int window_shown = 1; + int save_size_and_pos = 1; + +/* + if (fullscreen) + { + Update frame extents + Set window state to normal + Resize to fill workspace (do not change saved x/y/w/h) + Hide frame + Show window + Mark as fullscreen client on workspace + } + else if (maximized) + { + Update frame extents + Set window state to normal + Resize to fill workspace (do not change saved x/y/w/h) + Show frame + Show window + Clear fullscreen client if it was us + } + else if (!tiled and snapped left) + { + Update frame extents + Set window state to normal + Move/Resize to fill left side of workspace (do not change saved x/y/w/h) + Show frame + Show window + Clear fullscreen client if it was us + } + else if (!tiled and snapped right) + { + Update frame extents + Set window state to normal + Move/Resize to fill right side of workspace (do not change saved x/y/w/h) + Show frame + Show window + Clear fullscreen client if it was us + } + else if (hidden) + { + Update frame extents + Set window state to normal + Move/Resize to current x/y/w/h + Hide frame + Hide window + Clear fullscreen client if it was us + } + else // normal floating or tiled window + { + Update frame extents + Set window state to normal + Move/Resize to fill right side of workspace (do not change saved x/y/w/h) + Show frame + Show window + Clear fullscreen client if it was us + Place in current x/y/w/h + } + + redraw +*/ +} + -- 2.51.0