From b26635fe994a7cd1dc28893c0e40517b61036a9f Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 19 May 2007 21:39:40 +0000 Subject: [PATCH] add Left and Right contexts for resizing --- data/rc.xml | 18 ++++++++++++++++++ data/rc.xsd | 2 ++ doc/rc-mouse-focus.xml | 24 ++++++++++++++++++++++++ openbox/frame.c | 36 ++++++++++++++++++++++++++++++++++++ openbox/frame.h | 4 ++++ openbox/framerender.c | 3 ++- 6 files changed, 86 insertions(+), 1 deletion(-) diff --git a/data/rc.xml b/data/rc.xml index edfba5f4..d963936f 100644 --- a/data/rc.xml +++ b/data/rc.xml @@ -290,6 +290,24 @@ + + + + + + left + + + + + + + + + right + + + diff --git a/data/rc.xsd b/data/rc.xsd index 83af035f..4b790148 100644 --- a/data/rc.xsd +++ b/data/rc.xsd @@ -342,6 +342,8 @@ + + diff --git a/doc/rc-mouse-focus.xml b/doc/rc-mouse-focus.xml index ce8ca2a0..c1351cac 100644 --- a/doc/rc-mouse-focus.xml +++ b/doc/rc-mouse-focus.xml @@ -296,6 +296,30 @@ + + + + + + + + + top + + + + + + + + + + + + top + + + diff --git a/openbox/frame.c b/openbox/frame.c index 5ee05530..c9c1543d 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -138,6 +138,11 @@ ObFrame *frame_new(ObClient *client) self->trtresize = createWindow(self->title, NULL, mask, &attrib); self->trrresize = createWindow(self->title, NULL, mask, &attrib); + attrib.cursor = ob_cursor(OB_CURSOR_WEST); + self->leftresize = createWindow(self->inner, NULL, mask, &attrib); + attrib.cursor = ob_cursor(OB_CURSOR_EAST); + self->rightresize = createWindow(self->inner, NULL, mask, &attrib); + mask &= ~CWCursor; self->label = createWindow(self->title, NULL, mask, &attrib); self->max = createWindow(self->title, NULL, mask, &attrib); @@ -357,6 +362,8 @@ void frame_adjust_area(ObFrame *self, gboolean moved, XSetWindowBorderWidth(ob_display, self->handle, self->rbwidth); XSetWindowBorderWidth(ob_display, self->lgrip, self->rbwidth); XSetWindowBorderWidth(ob_display, self->rgrip, self->rbwidth); + XSetWindowBorderWidth(ob_display, self->leftresize, self->bwidth); + XSetWindowBorderWidth(ob_display, self->rightresize, self->bwidth); } if (self->decorations & OB_FRAME_DECOR_TITLEBAR) @@ -391,17 +398,35 @@ void frame_adjust_area(ObFrame *self, gboolean moved, XMoveWindow(ob_display, self->trrresize, self->width - ob_rr_theme->paddingx - 1, 0); + XMoveResizeWindow(ob_display, self->leftresize, + -(ob_rr_theme->fbwidth * 2) - 1, + 0, + 1, + self->client->area.height + + self->cbwidth_y * 2); + XMoveResizeWindow(ob_display, self->rightresize, + self->client->area.width + + self->cbwidth_x * 2, + 0, + 1, + self->client->area.height + + self->cbwidth_y * 2); + XMapWindow(ob_display, self->topresize); XMapWindow(ob_display, self->tltresize); XMapWindow(ob_display, self->tllresize); XMapWindow(ob_display, self->trtresize); XMapWindow(ob_display, self->trrresize); + XMapWindow(ob_display, self->leftresize); + XMapWindow(ob_display, self->rightresize); } else { XUnmapWindow(ob_display, self->topresize); XUnmapWindow(ob_display, self->tltresize); XUnmapWindow(ob_display, self->tllresize); XUnmapWindow(ob_display, self->trtresize); XUnmapWindow(ob_display, self->trrresize); + XUnmapWindow(ob_display, self->leftresize); + XUnmapWindow(ob_display, self->rightresize); } } else XUnmapWindow(ob_display, self->title); @@ -560,6 +585,7 @@ void frame_grab_client(ObFrame *self) { /* reparent the client to the frame */ XReparentWindow(ob_display, self->client->window, self->plate, 0, 0); + /* When reparenting the client window, it is usually not mapped yet, since this occurs from a MapRequest. However, in the case where Openbox is @@ -598,6 +624,8 @@ void frame_grab_client(ObFrame *self) g_hash_table_insert(window_map, &self->tllresize, self->client); g_hash_table_insert(window_map, &self->trtresize, self->client); g_hash_table_insert(window_map, &self->trrresize, self->client); + g_hash_table_insert(window_map, &self->leftresize, self->client); + g_hash_table_insert(window_map, &self->rightresize, self->client); } void frame_release_client(ObFrame *self) @@ -656,6 +684,8 @@ void frame_release_client(ObFrame *self) g_hash_table_remove(window_map, &self->tllresize); g_hash_table_remove(window_map, &self->trtresize); g_hash_table_remove(window_map, &self->trrresize); + g_hash_table_remove(window_map, &self->leftresize); + g_hash_table_remove(window_map, &self->rightresize); ob_main_loop_timeout_remove_data(ob_main_loop, flash_timeout, self, TRUE); } @@ -849,6 +879,10 @@ ObFrameContext frame_context_from_string(const gchar *name) return OB_FRAME_CONTEXT_TOP; else if (!g_ascii_strcasecmp("Bottom", name)) return OB_FRAME_CONTEXT_BOTTOM; + else if (!g_ascii_strcasecmp("Left", name)) + return OB_FRAME_CONTEXT_LEFT; + else if (!g_ascii_strcasecmp("Right", name)) + return OB_FRAME_CONTEXT_RIGHT; else if (!g_ascii_strcasecmp("Maximize", name)) return OB_FRAME_CONTEXT_MAXIMIZE; else if (!g_ascii_strcasecmp("AllDesktops", name)) @@ -926,6 +960,8 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) if (win == self->tllresize) return OB_FRAME_CONTEXT_TLCORNER; if (win == self->trtresize) return OB_FRAME_CONTEXT_TRCORNER; if (win == self->trrresize) return OB_FRAME_CONTEXT_TRCORNER; + if (win == self->leftresize) return OB_FRAME_CONTEXT_LEFT; + if (win == self->rightresize) return OB_FRAME_CONTEXT_RIGHT; if (win == self->max) return OB_FRAME_CONTEXT_MAXIMIZE; if (win == self->iconify) return OB_FRAME_CONTEXT_ICONIFY; if (win == self->close) return OB_FRAME_CONTEXT_CLOSE; diff --git a/openbox/frame.h b/openbox/frame.h index 0f563432..28ad2755 100644 --- a/openbox/frame.h +++ b/openbox/frame.h @@ -41,6 +41,8 @@ typedef enum { OB_FRAME_CONTEXT_TRCORNER, OB_FRAME_CONTEXT_TOP, OB_FRAME_CONTEXT_BOTTOM, + OB_FRAME_CONTEXT_LEFT, + OB_FRAME_CONTEXT_RIGHT, OB_FRAME_CONTEXT_MAXIMIZE, OB_FRAME_CONTEXT_ALLDESKTOPS, OB_FRAME_CONTEXT_SHADE, @@ -101,6 +103,8 @@ struct _ObFrame Window tllresize; Window trtresize; Window trrresize; + Window leftresize; + Window rightresize; Colormap colormap; diff --git a/openbox/framerender.c b/openbox/framerender.c index 82a98a8e..78c1d02f 100644 --- a/openbox/framerender.c +++ b/openbox/framerender.c @@ -47,11 +47,12 @@ void framerender_frame(ObFrame *self) RrColorPixel(ob_rr_theme->frame_focused_border_color) : RrColorPixel(ob_rr_theme->frame_unfocused_border_color)); XSetWindowBorder(ob_display, self->window, px); - XSetWindowBorder(ob_display, self->inner, px); XSetWindowBorder(ob_display, self->title, px); XSetWindowBorder(ob_display, self->handle, px); XSetWindowBorder(ob_display, self->rgrip, px); XSetWindowBorder(ob_display, self->lgrip, px); + XSetWindowBorder(ob_display, self->leftresize, px); + XSetWindowBorder(ob_display, self->rightresize, px); } if (self->decorations & OB_FRAME_DECOR_TITLEBAR) {