X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=5ee055308e849b534215b27be269e0bd4db9750c;hb=ecdb7d5807059405608629264e698b21b6222203;hp=68a6434279a25f61fdbc6e4b98709a61b8d8989c;hpb=caba57b6946c0252fdcdea2a608429103f15a6ba;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index 68a64342..5ee05530 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" @@ -48,17 +49,6 @@ #define FRAME_HANDLE_Y(f) (f->innersize.top + f->client->area.height + \ f->cbwidth_y) -/* the offsets for the titlebar elements from the edge of the titlebar. - negative means from the right edge. */ -gint icon_off; -gint label_off; -gint iconify_off; -gint desk_off; -gint shade_off; -gint max_off; -gint close_off; - - static void flash_done(gpointer data); static gboolean flash_timeout(gpointer data); @@ -139,6 +129,8 @@ ObFrame *frame_new(ObClient *client) self->title = createWindow(self->window, NULL, mask, &attrib); mask |= CWCursor; + attrib.cursor = ob_cursor(OB_CURSOR_NORTH); + self->topresize = createWindow(self->title, NULL, mask, &attrib); attrib.cursor = ob_cursor(OB_CURSOR_NORTHWEST); self->tltresize = createWindow(self->title, NULL, mask, &attrib); self->tllresize = createWindow(self->title, NULL, mask, &attrib); @@ -154,9 +146,10 @@ ObFrame *frame_new(ObClient *client) self->shade = createWindow(self->title, NULL, mask, &attrib); self->icon = createWindow(self->title, NULL, mask, &attrib); self->iconify = createWindow(self->title, NULL, mask, &attrib); - self->handle = createWindow(self->window, NULL, mask, &attrib); mask |= CWCursor; + attrib.cursor = ob_cursor(OB_CURSOR_SOUTH); + self->handle = createWindow(self->window, NULL, mask, &attrib); attrib.cursor = ob_cursor(OB_CURSOR_SOUTHWEST); self->lgrip = createWindow(self->handle, NULL, mask, &attrib); attrib.cursor = ob_cursor(OB_CURSOR_SOUTHEAST); @@ -183,20 +176,15 @@ ObFrame *frame_new(ObClient *client) static void set_theme_statics(ObFrame *self) { - /* set colors/appearance/sizes for stuff that doesn't change */ - XSetWindowBorder(ob_display, self->window, - RrColorPixel(ob_rr_theme->frame_b_color)); - XSetWindowBorder(ob_display, self->inner, - RrColorPixel(ob_rr_theme->frame_b_color)); - XSetWindowBorder(ob_display, self->title, - RrColorPixel(ob_rr_theme->frame_b_color)); - XSetWindowBorder(ob_display, self->handle, - RrColorPixel(ob_rr_theme->frame_b_color)); - XSetWindowBorder(ob_display, self->rgrip, - RrColorPixel(ob_rr_theme->frame_b_color)); - XSetWindowBorder(ob_display, self->lgrip, - RrColorPixel(ob_rr_theme->frame_b_color)); + 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); XResizeWindow(ob_display, self->iconify, @@ -209,12 +197,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, @@ -391,17 +377,27 @@ void frame_adjust_area(ObFrame *self, gboolean moved, XMapWindow(ob_display, self->title); if (self->decorations & OB_FRAME_DECOR_GRIPS) { + XMoveResizeWindow(ob_display, self->topresize, + ob_rr_theme->grip_width + self->bwidth, + 0, + self->width - (ob_rr_theme->grip_width + + self->bwidth) * 2, + ob_rr_theme->paddingy + 1); + XMoveWindow(ob_display, self->tltresize, 0, 0); XMoveWindow(ob_display, self->tllresize, 0, 0); XMoveWindow(ob_display, self->trtresize, self->width - ob_rr_theme->grip_width, 0); XMoveWindow(ob_display, self->trrresize, self->width - ob_rr_theme->paddingx - 1, 0); + + 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); } else { + XUnmapWindow(ob_display, self->topresize); XUnmapWindow(ob_display, self->tltresize); XUnmapWindow(ob_display, self->tllresize); XUnmapWindow(ob_display, self->trtresize); @@ -416,12 +412,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); + self->width, handle_height); XMapWindow(ob_display, self->handle); if (self->decorations & OB_FRAME_DECOR_GRIPS) { @@ -518,7 +520,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, @@ -591,6 +593,7 @@ void frame_grab_client(ObFrame *self) g_hash_table_insert(window_map, &self->handle, self->client); g_hash_table_insert(window_map, &self->lgrip, self->client); g_hash_table_insert(window_map, &self->rgrip, self->client); + g_hash_table_insert(window_map, &self->topresize, self->client); g_hash_table_insert(window_map, &self->tltresize, self->client); g_hash_table_insert(window_map, &self->tllresize, self->client); g_hash_table_insert(window_map, &self->trtresize, self->client); @@ -648,6 +651,7 @@ void frame_release_client(ObFrame *self) g_hash_table_remove(window_map, &self->handle); g_hash_table_remove(window_map, &self->lgrip); g_hash_table_remove(window_map, &self->rgrip); + g_hash_table_remove(window_map, &self->topresize); g_hash_table_remove(window_map, &self->tltresize); g_hash_table_remove(window_map, &self->tllresize); g_hash_table_remove(window_map, &self->trtresize); @@ -831,8 +835,6 @@ ObFrameContext frame_context_from_string(const gchar *name) return OB_FRAME_CONTEXT_CLIENT; else if (!g_ascii_strcasecmp("Titlebar", name)) return OB_FRAME_CONTEXT_TITLEBAR; - else if (!g_ascii_strcasecmp("Handle", name)) - return OB_FRAME_CONTEXT_HANDLE; else if (!g_ascii_strcasecmp("Frame", name)) return OB_FRAME_CONTEXT_FRAME; else if (!g_ascii_strcasecmp("TLCorner", name)) @@ -843,6 +845,10 @@ ObFrameContext frame_context_from_string(const gchar *name) return OB_FRAME_CONTEXT_BLCORNER; else if (!g_ascii_strcasecmp("BRCorner", name)) return OB_FRAME_CONTEXT_BRCORNER; + else if (!g_ascii_strcasecmp("Top", name)) + return OB_FRAME_CONTEXT_TOP; + else if (!g_ascii_strcasecmp("Bottom", name)) + return OB_FRAME_CONTEXT_BOTTOM; else if (!g_ascii_strcasecmp("Maximize", name)) return OB_FRAME_CONTEXT_MAXIMIZE; else if (!g_ascii_strcasecmp("AllDesktops", name)) @@ -912,9 +918,10 @@ ObFrameContext frame_context(ObClient *client, Window win, gint x, gint y) if (win == self->window) return OB_FRAME_CONTEXT_FRAME; if (win == self->label) return OB_FRAME_CONTEXT_TITLEBAR; - if (win == self->handle) return OB_FRAME_CONTEXT_HANDLE; + if (win == self->handle) return OB_FRAME_CONTEXT_BOTTOM; if (win == self->lgrip) return OB_FRAME_CONTEXT_BLCORNER; if (win == self->rgrip) return OB_FRAME_CONTEXT_BRCORNER; + if (win == self->topresize) return OB_FRAME_CONTEXT_TOP; if (win == self->tltresize) return OB_FRAME_CONTEXT_TLCORNER; if (win == self->tllresize) return OB_FRAME_CONTEXT_TLCORNER; if (win == self->trtresize) return OB_FRAME_CONTEXT_TRCORNER; @@ -1175,6 +1182,10 @@ void frame_end_iconify_animation(ObFrame *self) if (!self->visible) XUnmapWindow(ob_display, self->window); + else + /* Send a ConfigureNotify when the animation is done, this fixes + KDE's pager showing the window in the wrong place. */ + client_reconfigure(self->client); /* we're not animating any more ! */ self->iconify_animation_going = 0;