get rid of the "inner" window
This commit is contained in:
parent
3e8d8108e7
commit
a1511e4655
3 changed files with 73 additions and 29 deletions
|
@ -37,11 +37,6 @@
|
||||||
#define ELEMENT_EVENTMASK (ButtonPressMask | ButtonReleaseMask | \
|
#define ELEMENT_EVENTMASK (ButtonPressMask | ButtonReleaseMask | \
|
||||||
ButtonMotionMask | PointerMotionMask | \
|
ButtonMotionMask | PointerMotionMask | \
|
||||||
EnterWindowMask | LeaveWindowMask)
|
EnterWindowMask | LeaveWindowMask)
|
||||||
/* The inner window does not need enter/leave events.
|
|
||||||
If it does get them, then it needs its own context for enter events
|
|
||||||
because sloppy focus will focus the window when you enter the inner window
|
|
||||||
from the frame. */
|
|
||||||
#define INNER_EVENTMASK (ButtonPressMask)
|
|
||||||
|
|
||||||
#define FRAME_ANIMATE_ICONIFY_TIME 150000 /* .15 seconds */
|
#define FRAME_ANIMATE_ICONIFY_TIME 150000 /* .15 seconds */
|
||||||
#define FRAME_ANIMATE_ICONIFY_STEP_TIME (G_USEC_PER_SEC / 60) /* 60 Hz */
|
#define FRAME_ANIMATE_ICONIFY_STEP_TIME (G_USEC_PER_SEC / 60) /* 60 Hz */
|
||||||
|
@ -116,11 +111,8 @@ ObFrame *frame_new(ObClient *client)
|
||||||
self->window = createWindow(RootWindow(ob_display, ob_screen), visual,
|
self->window = createWindow(RootWindow(ob_display, ob_screen), visual,
|
||||||
mask, &attrib);
|
mask, &attrib);
|
||||||
|
|
||||||
attrib.event_mask = INNER_EVENTMASK;
|
|
||||||
self->inner = createWindow(self->window, visual, mask, &attrib);
|
|
||||||
|
|
||||||
mask &= ~CWEventMask;
|
mask &= ~CWEventMask;
|
||||||
self->plate = createWindow(self->inner, visual, mask, &attrib);
|
self->plate = createWindow(self->window, visual, mask, &attrib);
|
||||||
|
|
||||||
/* create the visible decor windows */
|
/* create the visible decor windows */
|
||||||
|
|
||||||
|
@ -148,6 +140,11 @@ ObFrame *frame_new(ObClient *client)
|
||||||
self->left = createWindow(self->window, NULL, mask, &attrib);
|
self->left = createWindow(self->window, NULL, mask, &attrib);
|
||||||
self->right = createWindow(self->window, NULL, mask, &attrib);
|
self->right = createWindow(self->window, NULL, mask, &attrib);
|
||||||
|
|
||||||
|
self->innerleft = createWindow(self->window, NULL, mask, &attrib);
|
||||||
|
self->innertop = createWindow(self->window, NULL, mask, &attrib);
|
||||||
|
self->innerright = createWindow(self->window, NULL, mask, &attrib);
|
||||||
|
self->innerbottom = createWindow(self->window, NULL, mask, &attrib);
|
||||||
|
|
||||||
self->label = createWindow(self->title, NULL, mask, &attrib);
|
self->label = createWindow(self->title, NULL, mask, &attrib);
|
||||||
self->max = createWindow(self->title, NULL, mask, &attrib);
|
self->max = createWindow(self->title, NULL, mask, &attrib);
|
||||||
self->close = createWindow(self->title, NULL, mask, &attrib);
|
self->close = createWindow(self->title, NULL, mask, &attrib);
|
||||||
|
@ -176,7 +173,6 @@ ObFrame *frame_new(ObClient *client)
|
||||||
|
|
||||||
/* the other stuff is shown based on decor settings */
|
/* the other stuff is shown based on decor settings */
|
||||||
XMapWindow(ob_display, self->plate);
|
XMapWindow(ob_display, self->plate);
|
||||||
XMapWindow(ob_display, self->inner);
|
|
||||||
XMapWindow(ob_display, self->label);
|
XMapWindow(ob_display, self->label);
|
||||||
|
|
||||||
self->max_press = self->close_press = self->desk_press =
|
self->max_press = self->close_press = self->desk_press =
|
||||||
|
@ -375,6 +371,42 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
|
||||||
/* position/size and map/unmap all the windows */
|
/* position/size and map/unmap all the windows */
|
||||||
|
|
||||||
if (!fake) {
|
if (!fake) {
|
||||||
|
if (self->cbwidth_x) {
|
||||||
|
XMoveResizeWindow(ob_display, self->innerleft,
|
||||||
|
self->size.left - self->cbwidth_x,
|
||||||
|
self->size.top,
|
||||||
|
self->cbwidth_x, self->client->area.height);
|
||||||
|
XMoveResizeWindow(ob_display, self->innerright,
|
||||||
|
self->size.left + self->client->area.width,
|
||||||
|
self->size.top,
|
||||||
|
self->cbwidth_x, self->client->area.height);
|
||||||
|
|
||||||
|
XMapWindow(ob_display, self->innerleft);
|
||||||
|
XMapWindow(ob_display, self->innerright);
|
||||||
|
} else {
|
||||||
|
XUnmapWindow(ob_display, self->innerleft);
|
||||||
|
XUnmapWindow(ob_display, self->innerright);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self->cbwidth_y) {
|
||||||
|
XMoveResizeWindow(ob_display, self->innertop,
|
||||||
|
self->size.left - self->cbwidth_x,
|
||||||
|
self->size.top - self->cbwidth_y,
|
||||||
|
self->client->area.width +
|
||||||
|
self->cbwidth_x * 2, self->cbwidth_y);
|
||||||
|
XMoveResizeWindow(ob_display, self->innerbottom,
|
||||||
|
self->size.left - self->cbwidth_x,
|
||||||
|
self->size.top + self->client->area.height,
|
||||||
|
self->client->area.width +
|
||||||
|
self->cbwidth_x * 2, self->cbwidth_y);
|
||||||
|
|
||||||
|
XMapWindow(ob_display, self->innertop);
|
||||||
|
XMapWindow(ob_display, self->innerbottom);
|
||||||
|
} else {
|
||||||
|
XUnmapWindow(ob_display, self->innertop);
|
||||||
|
XUnmapWindow(ob_display, self->innerbottom);
|
||||||
|
}
|
||||||
|
|
||||||
if (self->bwidth) {
|
if (self->bwidth) {
|
||||||
gint titlesides;
|
gint titlesides;
|
||||||
|
|
||||||
|
@ -678,21 +710,9 @@ void frame_adjust_area(ObFrame *self, gboolean moved,
|
||||||
} else
|
} else
|
||||||
XUnmapWindow(ob_display, self->right);
|
XUnmapWindow(ob_display, self->right);
|
||||||
|
|
||||||
/* move and resize the inner border window which contains the plate
|
|
||||||
*/
|
|
||||||
XMoveResizeWindow(ob_display, self->inner,
|
|
||||||
0,
|
|
||||||
self->size.top - self->cbwidth_y,
|
|
||||||
self->client->area.width +
|
|
||||||
self->cbwidth_x * 2 +
|
|
||||||
(!self->max_horz ? self->bwidth * 2 : 0),
|
|
||||||
self->client->area.height +
|
|
||||||
self->cbwidth_y * 2);
|
|
||||||
|
|
||||||
/* move the plate */
|
/* move the plate */
|
||||||
XMoveWindow(ob_display, self->plate,
|
XMoveWindow(ob_display, self->plate,
|
||||||
(!self->max_horz ? self->bwidth : 0) + self->cbwidth_x,
|
self->size.left, self->size.top);
|
||||||
self->cbwidth_y);
|
|
||||||
|
|
||||||
/* when the client has StaticGravity, it likes to move around. */
|
/* when the client has StaticGravity, it likes to move around. */
|
||||||
XMoveWindow(ob_display, self->client->window,
|
XMoveWindow(ob_display, self->client->window,
|
||||||
|
@ -782,6 +802,7 @@ static void frame_adjust_cursors(ObFrame *self)
|
||||||
XChangeWindowAttributes(ob_display, self->handle, CWCursor, &a);
|
XChangeWindowAttributes(ob_display, self->handle, CWCursor, &a);
|
||||||
XChangeWindowAttributes(ob_display, self->handletop, CWCursor, &a);
|
XChangeWindowAttributes(ob_display, self->handletop, CWCursor, &a);
|
||||||
XChangeWindowAttributes(ob_display, self->handlebottom, CWCursor, &a);
|
XChangeWindowAttributes(ob_display, self->handlebottom, CWCursor, &a);
|
||||||
|
XChangeWindowAttributes(ob_display, self->innerbottom, CWCursor, &a);
|
||||||
|
|
||||||
/* these ones don't */
|
/* these ones don't */
|
||||||
a.cursor = ob_cursor(r ? OB_CURSOR_NORTHWEST : OB_CURSOR_NONE);
|
a.cursor = ob_cursor(r ? OB_CURSOR_NORTHWEST : OB_CURSOR_NONE);
|
||||||
|
@ -796,8 +817,10 @@ static void frame_adjust_cursors(ObFrame *self)
|
||||||
XChangeWindowAttributes(ob_display, self->titleright, CWCursor, &a);
|
XChangeWindowAttributes(ob_display, self->titleright, CWCursor, &a);
|
||||||
a.cursor = ob_cursor(r ? OB_CURSOR_WEST : OB_CURSOR_NONE);
|
a.cursor = ob_cursor(r ? OB_CURSOR_WEST : OB_CURSOR_NONE);
|
||||||
XChangeWindowAttributes(ob_display, self->left, CWCursor, &a);
|
XChangeWindowAttributes(ob_display, self->left, CWCursor, &a);
|
||||||
|
XChangeWindowAttributes(ob_display, self->innerleft, CWCursor, &a);
|
||||||
a.cursor = ob_cursor(r ? OB_CURSOR_EAST : OB_CURSOR_NONE);
|
a.cursor = ob_cursor(r ? OB_CURSOR_EAST : OB_CURSOR_NONE);
|
||||||
XChangeWindowAttributes(ob_display, self->right, CWCursor, &a);
|
XChangeWindowAttributes(ob_display, self->right, CWCursor, &a);
|
||||||
|
XChangeWindowAttributes(ob_display, self->innerright, CWCursor, &a);
|
||||||
a.cursor = ob_cursor(r ? OB_CURSOR_SOUTHWEST : OB_CURSOR_NONE);
|
a.cursor = ob_cursor(r ? OB_CURSOR_SOUTHWEST : OB_CURSOR_NONE);
|
||||||
XChangeWindowAttributes(ob_display, self->lgrip, CWCursor, &a);
|
XChangeWindowAttributes(ob_display, self->lgrip, CWCursor, &a);
|
||||||
XChangeWindowAttributes(ob_display, self->handleleft, CWCursor, &a);
|
XChangeWindowAttributes(ob_display, self->handleleft, CWCursor, &a);
|
||||||
|
@ -869,7 +892,10 @@ void frame_grab_client(ObFrame *self)
|
||||||
/* set all the windows for the frame in the window_map */
|
/* set all the windows for the frame in the window_map */
|
||||||
g_hash_table_insert(window_map, &self->window, self->client);
|
g_hash_table_insert(window_map, &self->window, self->client);
|
||||||
g_hash_table_insert(window_map, &self->plate, self->client);
|
g_hash_table_insert(window_map, &self->plate, self->client);
|
||||||
g_hash_table_insert(window_map, &self->inner, self->client);
|
g_hash_table_insert(window_map, &self->innerleft, self->client);
|
||||||
|
g_hash_table_insert(window_map, &self->innertop, self->client);
|
||||||
|
g_hash_table_insert(window_map, &self->innerright, self->client);
|
||||||
|
g_hash_table_insert(window_map, &self->innerbottom, self->client);
|
||||||
g_hash_table_insert(window_map, &self->title, self->client);
|
g_hash_table_insert(window_map, &self->title, self->client);
|
||||||
g_hash_table_insert(window_map, &self->label, self->client);
|
g_hash_table_insert(window_map, &self->label, self->client);
|
||||||
g_hash_table_insert(window_map, &self->max, self->client);
|
g_hash_table_insert(window_map, &self->max, self->client);
|
||||||
|
@ -945,7 +971,10 @@ void frame_release_client(ObFrame *self)
|
||||||
/* remove all the windows for the frame from the window_map */
|
/* remove all the windows for the frame from the window_map */
|
||||||
g_hash_table_remove(window_map, &self->window);
|
g_hash_table_remove(window_map, &self->window);
|
||||||
g_hash_table_remove(window_map, &self->plate);
|
g_hash_table_remove(window_map, &self->plate);
|
||||||
g_hash_table_remove(window_map, &self->inner);
|
g_hash_table_remove(window_map, &self->innerleft);
|
||||||
|
g_hash_table_remove(window_map, &self->innertop);
|
||||||
|
g_hash_table_remove(window_map, &self->innerright);
|
||||||
|
g_hash_table_remove(window_map, &self->innerbottom);
|
||||||
g_hash_table_remove(window_map, &self->title);
|
g_hash_table_remove(window_map, &self->title);
|
||||||
g_hash_table_remove(window_map, &self->label);
|
g_hash_table_remove(window_map, &self->label);
|
||||||
g_hash_table_remove(window_map, &self->max);
|
g_hash_table_remove(window_map, &self->max);
|
||||||
|
@ -1221,7 +1250,7 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y)
|
||||||
}
|
}
|
||||||
|
|
||||||
self = client->frame;
|
self = client->frame;
|
||||||
if (win == self->inner || win == self->plate) {
|
if (win == self->plate) {
|
||||||
/* conceptually, this is the desktop, as far as users are
|
/* conceptually, this is the desktop, as far as users are
|
||||||
concerned */
|
concerned */
|
||||||
if (client->type == OB_CLIENT_TYPE_DESKTOP)
|
if (client->type == OB_CLIENT_TYPE_DESKTOP)
|
||||||
|
@ -1304,6 +1333,7 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y)
|
||||||
if (win == self->rgriptop) return OB_FRAME_CONTEXT_BLCORNER;
|
if (win == self->rgriptop) return OB_FRAME_CONTEXT_BLCORNER;
|
||||||
if (win == self->rgripbottom) return OB_FRAME_CONTEXT_BLCORNER;
|
if (win == self->rgripbottom) return OB_FRAME_CONTEXT_BLCORNER;
|
||||||
if (win == self->title) return OB_FRAME_CONTEXT_TITLEBAR;
|
if (win == self->title) return OB_FRAME_CONTEXT_TITLEBAR;
|
||||||
|
if (win == self->titlebottom) return OB_FRAME_CONTEXT_TITLEBAR;
|
||||||
if (win == self->titleleft) return OB_FRAME_CONTEXT_TLCORNER;
|
if (win == self->titleleft) return OB_FRAME_CONTEXT_TLCORNER;
|
||||||
if (win == self->titletopleft) return OB_FRAME_CONTEXT_TLCORNER;
|
if (win == self->titletopleft) return OB_FRAME_CONTEXT_TLCORNER;
|
||||||
if (win == self->titleright) return OB_FRAME_CONTEXT_TRCORNER;
|
if (win == self->titleright) return OB_FRAME_CONTEXT_TRCORNER;
|
||||||
|
@ -1316,6 +1346,10 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y)
|
||||||
if (win == self->trrresize) return OB_FRAME_CONTEXT_TRCORNER;
|
if (win == self->trrresize) return OB_FRAME_CONTEXT_TRCORNER;
|
||||||
if (win == self->left) return OB_FRAME_CONTEXT_LEFT;
|
if (win == self->left) return OB_FRAME_CONTEXT_LEFT;
|
||||||
if (win == self->right) return OB_FRAME_CONTEXT_RIGHT;
|
if (win == self->right) return OB_FRAME_CONTEXT_RIGHT;
|
||||||
|
if (win == self->innertop) return OB_FRAME_CONTEXT_TITLEBAR;
|
||||||
|
if (win == self->innerleft) return OB_FRAME_CONTEXT_LEFT;
|
||||||
|
if (win == self->innerbottom) return OB_FRAME_CONTEXT_BOTTOM;
|
||||||
|
if (win == self->innerright) return OB_FRAME_CONTEXT_RIGHT;
|
||||||
if (win == self->max) return OB_FRAME_CONTEXT_MAXIMIZE;
|
if (win == self->max) return OB_FRAME_CONTEXT_MAXIMIZE;
|
||||||
if (win == self->iconify) return OB_FRAME_CONTEXT_ICONIFY;
|
if (win == self->iconify) return OB_FRAME_CONTEXT_ICONIFY;
|
||||||
if (win == self->close) return OB_FRAME_CONTEXT_CLOSE;
|
if (win == self->close) return OB_FRAME_CONTEXT_CLOSE;
|
||||||
|
|
|
@ -86,7 +86,6 @@ struct _ObFrame
|
||||||
guint functions;
|
guint functions;
|
||||||
guint decorations;
|
guint decorations;
|
||||||
|
|
||||||
Window inner; /*!< The window for drawing the inner client border */
|
|
||||||
Window title;
|
Window title;
|
||||||
Window label;
|
Window label;
|
||||||
Window max;
|
Window max;
|
||||||
|
@ -118,6 +117,10 @@ struct _ObFrame
|
||||||
Window rgriptop;
|
Window rgriptop;
|
||||||
Window rgripright;
|
Window rgripright;
|
||||||
Window rgripbottom;
|
Window rgripbottom;
|
||||||
|
Window innerleft; /*!< For drawing the inner client border */
|
||||||
|
Window innertop; /*!< For drawing the inner client border */
|
||||||
|
Window innerright; /*!< For drawing the inner client border */
|
||||||
|
Window innerbottom; /*!< For drawing the inner client border */
|
||||||
|
|
||||||
/* These are resize handles inside the titlebar */
|
/* These are resize handles inside the titlebar */
|
||||||
Window topresize;
|
Window topresize;
|
||||||
|
|
|
@ -40,8 +40,15 @@ void framerender_frame(ObFrame *self)
|
||||||
px = (self->focused ?
|
px = (self->focused ?
|
||||||
RrColorPixel(ob_rr_theme->cb_focused_color) :
|
RrColorPixel(ob_rr_theme->cb_focused_color) :
|
||||||
RrColorPixel(ob_rr_theme->cb_unfocused_color));
|
RrColorPixel(ob_rr_theme->cb_unfocused_color));
|
||||||
XSetWindowBackground(ob_display, self->inner, px);
|
|
||||||
XClearWindow(ob_display, self->inner);
|
XSetWindowBackground(ob_display, self->innerleft, px);
|
||||||
|
XClearWindow(ob_display, self->innerleft);
|
||||||
|
XSetWindowBackground(ob_display, self->innertop, px);
|
||||||
|
XClearWindow(ob_display, self->innertop);
|
||||||
|
XSetWindowBackground(ob_display, self->innerright, px);
|
||||||
|
XClearWindow(ob_display, self->innerright);
|
||||||
|
XSetWindowBackground(ob_display, self->innerbottom, px);
|
||||||
|
XClearWindow(ob_display, self->innerbottom);
|
||||||
|
|
||||||
px = (self->focused ?
|
px = (self->focused ?
|
||||||
RrColorPixel(ob_rr_theme->frame_focused_border_color) :
|
RrColorPixel(ob_rr_theme->frame_focused_border_color) :
|
||||||
|
|
Loading…
Reference in a new issue