X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fframe.c;h=5f491b72687271259d389058dece997029c3dddf;hb=cf5c75420a6237798ff73c1fe7af03eaca6f33b4;hp=29933d69fbe21d6444355ccd6299bb00a6cd6d91;hpb=6142eb3a48c78de29d0bce1d3ee5686f1bbf7ef9;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index 29933d69..5f491b72 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -25,7 +25,8 @@ #include "config.h" #include "framerender.h" #include "mainloop.h" -#include "focus.h" +#include "focus_cycle.h" +#include "focus_cycle_indicator.h" #include "moveresize.h" #include "screen.h" #include "render/theme.h" @@ -45,8 +46,7 @@ #define FRAME_ANIMATE_ICONIFY_TIME 150000 /* .15 seconds */ #define FRAME_ANIMATE_ICONIFY_STEP_TIME (G_USEC_PER_SEC / 60) /* 60 Hz */ -#define FRAME_HANDLE_Y(f) (f->innersize.top + f->client->area.height + \ - f->cbwidth_y) +#define FRAME_HANDLE_Y(f) (f->size.top + f->client->area.height + f->cbwidth_y) static void flash_done(gpointer data); static gboolean flash_timeout(gpointer data); @@ -71,6 +71,11 @@ static Visual *check_32bit_client(ObClient *c) XWindowAttributes wattrib; Status ret; + /* we're already running at 32 bit depth, yay. we don't need to use their + visual */ + if (RrDepth(ob_rr_inst) == 32) + return NULL; + ret = XGetWindowAttributes(ob_display, c->window, &wattrib); g_assert(ret != BadDrawable); g_assert(ret != BadWindow); @@ -103,8 +108,8 @@ ObFrame *frame_new(ObClient *client) XCreateColormap(ob_display, RootWindow(ob_display, ob_screen), visual, AllocNone); - attrib.background_pixel = BlackPixel(ob_display, 0); - attrib.border_pixel = BlackPixel(ob_display, 0); + attrib.background_pixel = BlackPixel(ob_display, ob_screen); + attrib.border_pixel = BlackPixel(ob_display, ob_screen); } attrib.event_mask = FRAME_EVENTMASK; self->window = createWindow(RootWindow(ob_display, ob_screen), visual, @@ -137,6 +142,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); @@ -175,6 +185,14 @@ ObFrame *frame_new(ObClient *client) static void set_theme_statics(ObFrame *self) { + gint handle_height; + + if (ob_rr_theme->handle_height > 0) + handle_height = ob_rr_theme->handle_height; + else + handle_height = 1; + + /* set colors/appearance/sizes for stuff that doesn't change */ XResizeWindow(ob_display, self->max, ob_rr_theme->button_size, ob_rr_theme->button_size); @@ -188,12 +206,10 @@ static void set_theme_statics(ObFrame *self) ob_rr_theme->button_size, ob_rr_theme->button_size); XResizeWindow(ob_display, self->shade, ob_rr_theme->button_size, ob_rr_theme->button_size); - if (ob_rr_theme->handle_height > 0) { - XResizeWindow(ob_display, self->lgrip, - ob_rr_theme->grip_width, ob_rr_theme->handle_height); - XResizeWindow(ob_display, self->rgrip, - ob_rr_theme->grip_width, ob_rr_theme->handle_height); - } + XResizeWindow(ob_display, self->lgrip, + ob_rr_theme->grip_width, handle_height); + XResizeWindow(ob_display, self->rgrip, + ob_rr_theme->grip_width, handle_height); XResizeWindow(ob_display, self->tltresize, ob_rr_theme->grip_width, ob_rr_theme->paddingy + 1); XResizeWindow(ob_display, self->trtresize, @@ -273,14 +289,14 @@ void frame_adjust_shape(ObFrame *self) if (!self->client->shaped) { /* clear the shape on the frame window */ XShapeCombineMask(ob_display, self->window, ShapeBounding, - self->innersize.left, - self->innersize.top, + self->size.left, + self->size.top, None, ShapeSet); } else { /* make the frame's shape match the clients */ XShapeCombineShape(ob_display, self->window, ShapeBounding, - self->innersize.left, - self->innersize.top, + self->size.left, + self->size.top, self->client->window, ShapeBounding, ShapeSet); @@ -333,19 +349,18 @@ void frame_adjust_area(ObFrame *self, gboolean moved, if (self->max_horz) self->bwidth = self->cbwidth_x = 0; - STRUT_SET(self->innersize, - self->cbwidth_x, - self->cbwidth_y, - self->cbwidth_x, - self->cbwidth_y); self->width = self->client->area.width + self->cbwidth_x * 2 - (self->max_horz ? self->rbwidth * 2 : 0); self->width = MAX(self->width, 1); /* no lower than 1 */ + STRUT_SET(self->size, + self->cbwidth_x + self->bwidth, + self->cbwidth_y + self->bwidth, + self->cbwidth_x + self->bwidth, + self->cbwidth_y + self->bwidth); + /* set border widths */ if (!fake) { - XSetWindowBorderWidth(ob_display, self->window, self->bwidth); - XSetWindowBorderWidth(ob_display, self->inner, self->bwidth); XSetWindowBorderWidth(ob_display, self->title, self->rbwidth); XSetWindowBorderWidth(ob_display, self->handle, self->rbwidth); XSetWindowBorderWidth(ob_display, self->lgrip, self->rbwidth); @@ -353,11 +368,11 @@ void frame_adjust_area(ObFrame *self, gboolean moved, } if (self->decorations & OB_FRAME_DECOR_TITLEBAR) - self->innersize.top += ob_rr_theme->title_height + self->rbwidth + + self->size.top += ob_rr_theme->title_height + self->rbwidth + (self->rbwidth - self->bwidth); if (self->decorations & OB_FRAME_DECOR_HANDLE && ob_rr_theme->handle_height > 0) - self->innersize.bottom += ob_rr_theme->handle_height + + self->size.bottom += ob_rr_theme->handle_height + self->rbwidth + (self->rbwidth - self->bwidth); /* position/size and map/unmap all the windows */ @@ -365,7 +380,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, if (!fake) { if (self->decorations & OB_FRAME_DECOR_TITLEBAR) { XMoveResizeWindow(ob_display, self->title, - -self->bwidth, -self->bwidth, + 0, 0, self->width, ob_rr_theme->title_height); XMapWindow(ob_display, self->title); @@ -405,12 +420,18 @@ void frame_adjust_area(ObFrame *self, gboolean moved, layout_title(self); if (!fake) { - if (self->decorations & OB_FRAME_DECOR_HANDLE && - ob_rr_theme->handle_height > 0) + if (self->decorations & OB_FRAME_DECOR_HANDLE) { + gint handle_height; + + if (ob_rr_theme->handle_height > 0) + handle_height = ob_rr_theme->handle_height; + else + handle_height = 1; + XMoveResizeWindow(ob_display, self->handle, - -self->bwidth, FRAME_HANDLE_Y(self), - self->width, ob_rr_theme->handle_height); + 0, FRAME_HANDLE_Y(self), + self->width, handle_height); XMapWindow(ob_display, self->handle); if (self->decorations & OB_FRAME_DECOR_GRIPS) { @@ -428,31 +449,45 @@ void frame_adjust_area(ObFrame *self, gboolean moved, } else XUnmapWindow(ob_display, self->handle); + if (self->decorations & OB_FRAME_DECOR_GRIPS) { + XMoveResizeWindow(ob_display, self->leftresize, + 0, + 0, + self->bwidth, + self->client->area.height + + self->cbwidth_y * 2); + XMoveResizeWindow(ob_display, self->rightresize, + self->client->area.width + + self->cbwidth_x * 2 + self->bwidth, + 0, + self->bwidth, + self->client->area.height + + self->cbwidth_y * 2); + + XMapWindow(ob_display, self->leftresize); + XMapWindow(ob_display, self->rightresize); + } else { + XUnmapWindow(ob_display, self->leftresize); + XUnmapWindow(ob_display, self->rightresize); + } + /* move and resize the inner border window which contains the plate */ XMoveResizeWindow(ob_display, self->inner, - self->innersize.left - self->cbwidth_x - - self->bwidth, - self->innersize.top - self->cbwidth_y - - self->bwidth, + 0, + self->size.top - self->cbwidth_y, self->client->area.width + - self->cbwidth_x * 2, + self->cbwidth_x * 2 + self->bwidth * 2, self->client->area.height + self->cbwidth_y * 2); /* move the plate */ XMoveWindow(ob_display, self->plate, - self->cbwidth_x, self->cbwidth_y); + self->bwidth + self->cbwidth_x, self->cbwidth_y); /* when the client has StaticGravity, it likes to move around. */ XMoveWindow(ob_display, self->client->window, 0, 0); } - - STRUT_SET(self->size, - self->innersize.left + self->bwidth, - self->innersize.top + self->bwidth, - self->innersize.right + self->bwidth, - self->innersize.bottom + self->bwidth); } /* shading can change without being moved or resized */ @@ -483,9 +518,10 @@ void frame_adjust_area(ObFrame *self, gboolean moved, reflected afterwards. */ XMoveResizeWindow(ob_display, self->window, - self->area.x, self->area.y, - self->area.width - self->bwidth * 2, - self->area.height - self->bwidth * 2); + self->area.x, + self->area.y, + self->area.width, + self->area.height); if (resized) { framerender_frame(self); @@ -507,7 +543,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, /* if this occurs while we are focus cycling, the indicator needs to match the changes */ if (focus_cycle_target == self->client) - focus_cycle_draw_indicator(); + focus_cycle_draw_indicator(self->client); } if (resized && (self->decorations & OB_FRAME_DECOR_TITLEBAR)) XResizeWindow(ob_display, self->label, self->label_width, @@ -547,6 +583,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 @@ -585,6 +622,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) @@ -643,6 +682,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); } @@ -818,6 +859,8 @@ ObFrameContext frame_context_from_string(const gchar *name) { if (!g_ascii_strcasecmp("Desktop", name)) return OB_FRAME_CONTEXT_DESKTOP; + else if (!g_ascii_strcasecmp("Root", name)) + return OB_FRAME_CONTEXT_ROOT; else if (!g_ascii_strcasecmp("Client", name)) return OB_FRAME_CONTEXT_CLIENT; else if (!g_ascii_strcasecmp("Titlebar", name)) @@ -836,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)) @@ -861,7 +908,7 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) return OB_FRAME_CONTEXT_MOVE_RESIZE; if (win == RootWindow(ob_display, ob_screen)) - return OB_FRAME_CONTEXT_DESKTOP; + return OB_FRAME_CONTEXT_ROOT ; if (client == NULL) return OB_FRAME_CONTEXT_NONE; if (win == client->window) { /* conceptually, this is the desktop, as far as users are @@ -913,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; @@ -1132,7 +1181,7 @@ static gboolean frame_animate_iconify(gpointer p) x = iconx; y = icony; w = iconw; - h = self->innersize.top; /* just the titlebar */ + h = self->size.top; /* just the titlebar */ } if (time > 0) { @@ -1149,7 +1198,7 @@ static gboolean frame_animate_iconify(gpointer p) x = x - (dx * elapsed) / FRAME_ANIMATE_ICONIFY_TIME; y = y - (dy * elapsed) / FRAME_ANIMATE_ICONIFY_TIME; w = w - (dw * elapsed) / FRAME_ANIMATE_ICONIFY_TIME; - h = self->innersize.top; /* just the titlebar */ + h = self->size.top; /* just the titlebar */ } if (time == 0)