From 3283cc0d5a8c346146f84b4debe927b4ddf6bc90 Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Mon, 26 May 2003 03:34:20 +0000 Subject: [PATCH] complete destruction of all current frame functionality. you're welcome. --- openbox/frame.c | 437 ++----------------------------------- openbox/frame.h | 46 ++-- openbox/framerender.c | 204 ----------------- openbox/window.h | 4 + plugins/menu/client_menu.c | 4 +- 5 files changed, 38 insertions(+), 657 deletions(-) diff --git a/openbox/frame.c b/openbox/frame.c index 4076db83..d2065cca 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -10,69 +10,8 @@ #define ELEMENT_EVENTMASK (ButtonPressMask | ButtonReleaseMask | \ ButtonMotionMask | ExposureMask) -static void layout_title(Frame *self); - void frame_startup() { - RECT_SET(theme_a_focused_pressed_desk->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_focused_pressed_set_desk->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_focused_unpressed_desk->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_pressed_desk->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_pressed_set_desk->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_unpressed_desk->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_focused_pressed_shade->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_focused_pressed_set_shade->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_focused_unpressed_shade->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_pressed_shade->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_pressed_set_shade->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_unpressed_shade->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_focused_pressed_iconify->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_focused_unpressed_iconify->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_pressed_iconify->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_unpressed_iconify->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_unpressed_iconify->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_focused_pressed_max->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_focused_pressed_set_max->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_focused_unpressed_max->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_pressed_max->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_pressed_set_max->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_unpressed_max->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_focused_pressed_close->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_focused_unpressed_close->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_pressed_close->area, 0, 0, - theme_button_size, theme_button_size); - RECT_SET(theme_a_unfocused_unpressed_close->area, 0, 0, - theme_button_size, theme_button_size); - - RECT_SET(theme_a_focused_grip->area, 0, 0, - theme_grip_width, theme_handle_height); - RECT_SET(theme_a_unfocused_grip->area, 0, 0, - theme_grip_width, theme_handle_height); } void frame_shutdown() @@ -109,56 +48,12 @@ Frame *frame_new() mask = CWEventMask; attrib.event_mask = ELEMENT_EVENTMASK; - self->title = createWindow(self->window, mask, &attrib); - self->label = createWindow(self->title, mask, &attrib); - self->max = createWindow(self->title, mask, &attrib); - self->close = createWindow(self->title, mask, &attrib); - self->desk = createWindow(self->title, mask, &attrib); - self->shade = createWindow(self->title, mask, &attrib); - self->icon = createWindow(self->title, mask, &attrib); - self->iconify = createWindow(self->title, mask, &attrib); - self->handle = createWindow(self->window, mask, &attrib); - mask |= CWCursor; - attrib.cursor = ob_cursors.bl; - self->lgrip = createWindow(self->handle, mask, &attrib); - attrib.cursor = ob_cursors.br; - self->rgrip = createWindow(self->handle, mask, &attrib); + self->framedecors = 1; + self->framedecor = g_new(FrameDecor, self->framedecors); + self->framedecor[0].obwin.type = Window_Decoration; self->focused = FALSE; - /* the other stuff is shown based on decor settings */ - XMapWindow(ob_display, self->plate); - XMapWindow(ob_display, self->lgrip); - XMapWindow(ob_display, self->rgrip); - XMapWindow(ob_display, self->label); - - /* set colors/appearance/sizes for stuff that doesn't change */ - - XResizeWindow(ob_display, self->max, theme_button_size, theme_button_size); - XResizeWindow(ob_display, self->iconify, - theme_button_size, theme_button_size); - XResizeWindow(ob_display, self->icon, - theme_button_size + 2, theme_button_size + 2); - XResizeWindow(ob_display, self->close, - theme_button_size, theme_button_size); - XResizeWindow(ob_display, self->desk, - theme_button_size, theme_button_size); - XResizeWindow(ob_display, self->shade, - theme_button_size, theme_button_size); - XResizeWindow(ob_display, self->lgrip, - theme_grip_width, theme_handle_height); - XResizeWindow(ob_display, self->rgrip, - theme_grip_width, theme_handle_height); - - /* set up the dynamic appearances */ - self->a_unfocused_title = appearance_copy(theme_a_unfocused_title); - self->a_focused_title = appearance_copy(theme_a_focused_title); - self->a_unfocused_label = appearance_copy(theme_a_unfocused_label); - self->a_focused_label = appearance_copy(theme_a_focused_label); - self->a_unfocused_handle = appearance_copy(theme_a_unfocused_handle); - self->a_focused_handle = appearance_copy(theme_a_focused_handle); - self->a_icon = appearance_copy(theme_a_icon); - self->max_press = self->close_press = self->desk_press = self->iconify_press = self->shade_press = FALSE; @@ -167,14 +62,7 @@ Frame *frame_new() static void frame_free(Frame *self) { - appearance_free(self->a_unfocused_title); - appearance_free(self->a_focused_title); - appearance_free(self->a_unfocused_label); - appearance_free(self->a_focused_label); - appearance_free(self->a_unfocused_handle); - appearance_free(self->a_focused_handle); - appearance_free(self->a_icon); - +/* XXX WRITEME */ XDestroyWindow(ob_display, self->window); g_free(self); @@ -199,7 +87,7 @@ void frame_hide(Frame *self) void frame_adjust_shape(Frame *self) { -#ifdef SHAPE +#ifdef SHAPEAGAERGGREA int num; XRectangle xrect[2]; @@ -245,138 +133,6 @@ void frame_adjust_shape(Frame *self) void frame_adjust_area(Frame *self, gboolean moved, gboolean resized) { - if (resized) { - if (self->client->decorations & Decor_Border) { - self->bwidth = theme_bwidth; - self->cbwidth = theme_cbwidth; - } else { - self->bwidth = self->cbwidth = 0; - } - STRUT_SET(self->innersize, self->cbwidth, self->cbwidth, - self->cbwidth, self->cbwidth); - self->width = self->client->area.width + self->cbwidth * 2; - g_assert(self->width > 0); - - /* set border widths */ - XSetWindowBorderWidth(ob_display, self->plate, self->cbwidth); - XSetWindowBorderWidth(ob_display, self->window, self->bwidth); - XSetWindowBorderWidth(ob_display, self->title, self->bwidth); - XSetWindowBorderWidth(ob_display, self->handle, self->bwidth); - XSetWindowBorderWidth(ob_display, self->lgrip, self->bwidth); - XSetWindowBorderWidth(ob_display, self->rgrip, self->bwidth); - - /* position/size and map/unmap all the windows */ - - /* they all default off, they're turned on in layout_title */ - self->icon_x = -1; - self->desk_x = -1; - self->shade_x = -1; - self->iconify_x = -1; - self->label_x = -1; - self->max_x = -1; - self->close_x = -1; - - if (self->client->decorations & Decor_Titlebar) { - XMoveResizeWindow(ob_display, self->title, - -self->bwidth, -self->bwidth, - self->width, theme_title_height); - self->innersize.top += theme_title_height + self->bwidth; - XMapWindow(ob_display, self->title); - - RECT_SET(self->a_focused_title->area, 0, 0, - self->width, theme_title_height); - RECT_SET(self->a_unfocused_title->area, 0, 0, - self->width, theme_title_height); - - /* layout the title bar elements */ - layout_title(self); - } else - XUnmapWindow(ob_display, self->title); - - if (self->client->decorations & Decor_Handle) { - XMoveResizeWindow(ob_display, self->handle, - -self->bwidth, FRAME_HANDLE_Y(self), - self->width, theme_handle_height); - XMoveWindow(ob_display, self->lgrip, - -self->bwidth, -self->bwidth); - XMoveWindow(ob_display, self->rgrip, - -self->bwidth + self->width - - theme_grip_width, -self->bwidth); - self->innersize.bottom += theme_handle_height + - self->bwidth; - XMapWindow(ob_display, self->handle); - - if (theme_a_focused_grip->surface.data.planar.grad == - Background_ParentRelative) - RECT_SET(self->a_focused_handle->area, 0, 0, - self->width, theme_handle_height); - else - RECT_SET(self->a_focused_handle->area, - theme_grip_width + self->bwidth, 0, - self->width - (theme_grip_width + self->bwidth) * 2, - theme_handle_height); - if (theme_a_unfocused_grip->surface.data.planar.grad == - Background_ParentRelative) - RECT_SET(self->a_unfocused_handle->area, 0, 0, - self->width, theme_handle_height); - else - RECT_SET(self->a_unfocused_handle->area, - theme_grip_width + self->bwidth, 0, - self->width - (theme_grip_width + self->bwidth) * 2, - theme_handle_height); - - } else - XUnmapWindow(ob_display, self->handle); - } - - if (resized) { - /* move and resize the plate */ - XMoveResizeWindow(ob_display, self->plate, - self->innersize.left - self->cbwidth, - self->innersize.top - self->cbwidth, - self->client->area.width, - self->client->area.height); - /* when the client has StaticGravity, it likes to move around. */ - XMoveWindow(ob_display, self->client->window, 0, 0); - } - - if (resized) { - 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 */ - RECT_SET_SIZE(self->area, - self->client->area.width + - self->size.left + self->size.right, - (self->client->shaded ? theme_title_height + self->bwidth*2: - self->client->area.height + - self->size.top + self->size.bottom)); - - if (moved) { - /* find the new coordinates, done after setting the frame.size, for - frame_client_gravity. */ - self->area.x = self->client->area.x; - self->area.y = self->client->area.y; - frame_client_gravity((Frame*)self, - &self->area.x, &self->area.y); - } - - /* move and resize the top level frame. - shading can change without being moved or resized */ - XMoveResizeWindow(ob_display, self->window, - self->area.x, self->area.y, - self->width, - self->area.height - self->bwidth * 2); - - if (resized) { - framerender_frame(self); - - frame_adjust_shape(self); - } } void frame_adjust_state(Frame *self) @@ -402,6 +158,7 @@ void frame_adjust_icon(Frame *self) void frame_grab_client(Frame *self, Client *client) { + int i; self->client = client; /* reparent the client to the frame */ @@ -429,21 +186,15 @@ void frame_grab_client(Frame *self, Client *client) /* set all the windows for the frame in the window_map */ g_hash_table_insert(window_map, &self->window, client); g_hash_table_insert(window_map, &self->plate, client); - g_hash_table_insert(window_map, &self->title, client); - g_hash_table_insert(window_map, &self->label, client); - g_hash_table_insert(window_map, &self->max, client); - g_hash_table_insert(window_map, &self->close, client); - g_hash_table_insert(window_map, &self->desk, client); - g_hash_table_insert(window_map, &self->shade, client); - g_hash_table_insert(window_map, &self->icon, client); - g_hash_table_insert(window_map, &self->iconify, client); - g_hash_table_insert(window_map, &self->handle, client); - g_hash_table_insert(window_map, &self->lgrip, client); - g_hash_table_insert(window_map, &self->rgrip, client); + + for (i = 0; i < self->framedecors; i++) + g_hash_table_insert(window_map, &self->framedecor[i].window, + &self->framedecor[i]); } void frame_release_client(Frame *self, Client *client) { + int i; XEvent ev; g_assert(self->client == client); @@ -469,149 +220,11 @@ void frame_release_client(Frame *self, Client *client) /* 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->plate); - g_hash_table_remove(window_map, &self->title); - g_hash_table_remove(window_map, &self->label); - g_hash_table_remove(window_map, &self->max); - g_hash_table_remove(window_map, &self->close); - g_hash_table_remove(window_map, &self->desk); - g_hash_table_remove(window_map, &self->shade); - g_hash_table_remove(window_map, &self->icon); - g_hash_table_remove(window_map, &self->iconify); - g_hash_table_remove(window_map, &self->handle); - g_hash_table_remove(window_map, &self->lgrip); - g_hash_table_remove(window_map, &self->rgrip); - frame_free(self); -} + for (i = 0; i < self->framedecors; i++) + g_hash_table_remove(window_map, &self->framedecor[i].window); -static void layout_title(Frame *self) -{ - char *lc; - int x; - gboolean n, d, i, l, m, c, s; - - n = d = i = l = m = c = s = FALSE; - - /* figure out whats being shown, and the width of the label */ - self->label_width = self->width - (theme_bevel + 1) * 2; - for (lc = theme_title_layout; *lc != '\0'; ++lc) { - switch (*lc) { - case 'N': - if (!(self->client->decorations & Decor_Icon)) break; - if (n) { *lc = ' '; break; } /* rm duplicates */ - n = TRUE; - self->label_width -= theme_button_size + 2 + theme_bevel + 1; - break; - case 'D': - if (!(self->client->decorations & Decor_AllDesktops)) break; - if (d) { *lc = ' '; break; } /* rm duplicates */ - d = TRUE; - self->label_width -= theme_button_size + theme_bevel + 1; - break; - case 'S': - if (!(self->client->decorations & Decor_Shade)) break; - if (s) { *lc = ' '; break; } /* rm duplicates */ - s = TRUE; - self->label_width -= theme_button_size + theme_bevel + 1; - break; - case 'I': - if (!(self->client->decorations & Decor_Iconify)) break; - if (i) { *lc = ' '; break; } /* rm duplicates */ - i = TRUE; - self->label_width -= theme_button_size + theme_bevel + 1; - break; - case 'L': - if (l) { *lc = ' '; break; } /* rm duplicates */ - l = TRUE; - break; - case 'M': - if (!(self->client->decorations & Decor_Maximize)) break; - if (m) { *lc = ' '; break; } /* rm duplicates */ - m = TRUE; - self->label_width -= theme_button_size + theme_bevel + 1; - break; - case 'C': - if (!(self->client->decorations & Decor_Close)) break; - if (c) { *lc = ' '; break; } /* rm duplicates */ - c = TRUE; - self->label_width -= theme_button_size + theme_bevel + 1; - break; - } - } - if (self->label_width < 1) self->label_width = 1; - - XResizeWindow(ob_display, self->label, self->label_width, - theme_label_height); - - if (!n) XUnmapWindow(ob_display, self->icon); - if (!d) XUnmapWindow(ob_display, self->desk); - if (!s) XUnmapWindow(ob_display, self->shade); - if (!i) XUnmapWindow(ob_display, self->iconify); - if (!l) XUnmapWindow(ob_display, self->label); - if (!m) XUnmapWindow(ob_display, self->max); - if (!c) XUnmapWindow(ob_display, self->close); - - x = theme_bevel + 1; - for (lc = theme_title_layout; *lc != '\0'; ++lc) { - switch (*lc) { - case 'N': - if (!n) break; - self->icon_x = x; - RECT_SET(self->a_icon->area, 0, 0, - theme_button_size + 2, theme_button_size + 2); - XMapWindow(ob_display, self->icon); - XMoveWindow(ob_display, self->icon, x, theme_bevel); - x += theme_button_size + 2 + theme_bevel + 1; - break; - case 'D': - if (!d) break; - self->desk_x = x; - XMapWindow(ob_display, self->desk); - XMoveWindow(ob_display, self->desk, x, theme_bevel + 1); - x += theme_button_size + theme_bevel + 1; - break; - case 'S': - if (!s) break; - self->shade_x = x; - XMapWindow(ob_display, self->shade); - XMoveWindow(ob_display, self->shade, x, theme_bevel + 1); - x += theme_button_size + theme_bevel + 1; - break; - case 'I': - if (!i) break; - self->iconify_x = x; - XMapWindow(ob_display, self->iconify); - XMoveWindow(ob_display, self->iconify, x, theme_bevel + 1); - x += theme_button_size + theme_bevel + 1; - break; - case 'L': - if (!l) break; - self->label_x = x; - XMapWindow(ob_display, self->label); - XMoveWindow(ob_display, self->label, x, theme_bevel); - x += self->label_width + theme_bevel + 1; - break; - case 'M': - if (!m) break; - self->max_x = x; - XMapWindow(ob_display, self->max); - XMoveWindow(ob_display, self->max, x, theme_bevel + 1); - x += theme_button_size + theme_bevel + 1; - break; - case 'C': - if (!c) break; - self->close_x = x; - XMapWindow(ob_display, self->close); - XMoveWindow(ob_display, self->close, x, theme_bevel + 1); - x += theme_button_size + theme_bevel + 1; - break; - } - } - - RECT_SET(self->a_focused_label->area, 0, 0, - self->label_width, theme_label_height); - RECT_SET(self->a_unfocused_label->area, 0, 0, - self->label_width, theme_label_height); + frame_free(self); } Context frame_context_from_string(char *name) @@ -651,28 +264,16 @@ Context frame_context_from_string(char *name) Context frame_context(Client *client, Window win) { - Frame *self; + ObWindow *obwin; if (win == ob_root) return Context_Root; if (client == NULL) return Context_None; if (win == client->window) return Context_Client; - self = client->frame; - if (win == self->window) return Context_Frame; - if (win == self->plate) return Context_Client; - if (win == self->title) return Context_Titlebar; - if (win == self->label) return Context_Titlebar; - if (win == self->handle) return Context_Handle; - if (win == self->lgrip) return Context_BLCorner; - if (win == self->rgrip) return Context_BRCorner; - if (win == self->max) return Context_Maximize; - if (win == self->iconify)return Context_Iconify; - if (win == self->close) return Context_Close; - if (win == self->icon) return Context_Icon; - if (win == self->desk) return Context_AllDesktops; - if (win == self->shade) return Context_Shade; - - return Context_None; + obwin = g_hash_table_lookup(window_map, &win); + g_assert(obwin); + g_assert(WINDOW_IS_DECORATION(obwin)); + return WINDOW_AS_DECORATION(obwin)->context; } void frame_client_gravity(Frame *self, int *x, int *y) diff --git a/openbox/frame.h b/openbox/frame.h index 3d395342..b127f67f 100644 --- a/openbox/frame.h +++ b/openbox/frame.h @@ -4,6 +4,7 @@ #include "geom.h" #include "client.h" #include "render/render.h" +#include "window.h" typedef enum { Context_None, @@ -28,6 +29,13 @@ typedef enum { #define FRAME_HANDLE_Y(f) (f->innersize.top + f->client->area.height + \ f->cbwidth) +typedef struct FrameDecor { + ObWindow obwin; + + Window window; + Context context; +} FrameDecor; + typedef struct Frame { Client *client; @@ -38,39 +46,11 @@ typedef struct Frame { Rect area; gboolean visible; - Window title; - Window label; - Window max; - Window close; - Window desk; - Window shade; - Window icon; - Window iconify; - Window handle; - Window lgrip; - Window rgrip; - - Appearance *a_unfocused_title; - Appearance *a_focused_title; - Appearance *a_unfocused_label; - Appearance *a_focused_label; - Appearance *a_icon; - Appearance *a_unfocused_handle; - Appearance *a_focused_handle; - - Strut innersize; - - GSList *clients; - - int width; /* title and handle */ - int label_width; - int icon_x; /* x-position of the window icon button */ - int label_x; /* x-position of the window title */ - int iconify_x; /* x-position of the window iconify button */ - int desk_x; /* x-position of the window all-desktops button */ - int shade_x; /* x-position of the window shade button */ - int max_x; /* x-position of the window maximize button */ - int close_x; /* x-position of the window close button */ + int framedecors; + FrameDecor *framedecor; + + int width; /* width of client + borders */ + int height; /* height of client + borders */ int bwidth; /* border width */ int cbwidth; /* client border width */ diff --git a/openbox/framerender.c b/openbox/framerender.c index 7033c441..36030d4a 100644 --- a/openbox/framerender.c +++ b/openbox/framerender.c @@ -4,210 +4,6 @@ #include "framerender.h" #include "render/theme.h" -static void framerender_label(Frame *self, Appearance *a); -static void framerender_icon(Frame *self, Appearance *a); -static void framerender_max(Frame *self, Appearance *a); -static void framerender_iconify(Frame *self, Appearance *a); -static void framerender_desk(Frame *self, Appearance *a); -static void framerender_shade(Frame *self, Appearance *a); -static void framerender_close(Frame *self, Appearance *a); - void framerender_frame(Frame *self) { - if (self->client->decorations & Decor_Titlebar) { - Appearance *t, *l, *m, *n, *i, *d, *s, *c; - - t = (self->focused ? - self->a_focused_title : self->a_unfocused_title); - l = (self->focused ? - self->a_focused_label : self->a_unfocused_label); - m = (self->focused ? - (self->client->max_vert || self->client->max_horz ? - theme_a_focused_pressed_set_max : - (self->max_press ? - theme_a_focused_pressed_max : theme_a_focused_unpressed_max)) : - (self->client->max_vert || self->client->max_horz ? - theme_a_unfocused_pressed_set_max : - (self->max_press ? - theme_a_unfocused_pressed_max : - theme_a_unfocused_unpressed_max))); - n = self->a_icon; - i = (self->focused ? - (self->iconify_press ? - theme_a_focused_pressed_iconify : - theme_a_focused_unpressed_iconify) : - (self->iconify_press ? - theme_a_unfocused_pressed_iconify : - theme_a_unfocused_unpressed_iconify)); - d = (self->focused ? - (self->client->desktop == DESKTOP_ALL ? - theme_a_focused_pressed_set_desk : - (self->desk_press ? - theme_a_focused_pressed_desk : - theme_a_focused_unpressed_desk)) : - (self->client->desktop == DESKTOP_ALL ? - theme_a_unfocused_pressed_set_desk : - (self->desk_press ? - theme_a_unfocused_pressed_desk : - theme_a_unfocused_unpressed_desk))); - s = (self->focused ? - (self->client->shaded ? - theme_a_focused_pressed_set_shade : - (self->shade_press ? - theme_a_focused_pressed_shade : - theme_a_focused_unpressed_shade)) : - (self->client->shaded ? - theme_a_unfocused_pressed_set_shade : - (self->shade_press ? - theme_a_unfocused_pressed_shade : - theme_a_unfocused_unpressed_shade))); - c = (self->focused ? - (self->close_press ? - theme_a_focused_pressed_close : - theme_a_focused_unpressed_close) : - (self->close_press ? - theme_a_unfocused_pressed_close : - theme_a_unfocused_unpressed_close)); - - paint(self->title, t); - - /* set parents for any parent relative guys */ - l->surface.data.planar.parent = t; - l->surface.data.planar.parentx = self->label_x; - l->surface.data.planar.parenty = theme_bevel; - - m->surface.data.planar.parent = t; - m->surface.data.planar.parentx = self->max_x; - m->surface.data.planar.parenty = theme_bevel + 1; - - n->surface.data.planar.parent = t; - n->surface.data.planar.parentx = self->icon_x; - n->surface.data.planar.parenty = theme_bevel; - - i->surface.data.planar.parent = t; - i->surface.data.planar.parentx = self->iconify_x; - i->surface.data.planar.parenty = theme_bevel + 1; - - d->surface.data.planar.parent = t; - d->surface.data.planar.parentx = self->desk_x; - d->surface.data.planar.parenty = theme_bevel + 1; - - s->surface.data.planar.parent = t; - s->surface.data.planar.parentx = self->shade_x; - s->surface.data.planar.parenty = theme_bevel + 1; - - c->surface.data.planar.parent = t; - c->surface.data.planar.parentx = self->close_x; - c->surface.data.planar.parenty = theme_bevel + 1; - - framerender_label(self, l); - framerender_max(self, m); - framerender_icon(self, n); - framerender_iconify(self, i); - framerender_desk(self, d); - framerender_shade(self, s); - framerender_close(self, c); - } - - if (self->client->decorations & Decor_Handle) { - Appearance *h, *g; - - h = (self->focused ? - self->a_focused_handle : self->a_unfocused_handle); - g = (self->focused ? - theme_a_focused_grip : theme_a_unfocused_grip); - - if (g->surface.data.planar.grad == Background_ParentRelative) { - g->surface.data.planar.parent = h; - paint(self->handle, h); - } else - paint(self->handle, h); - - g->surface.data.planar.parentx = 0; - g->surface.data.planar.parenty = 0; - - paint(self->lgrip, g); - - g->surface.data.planar.parentx = self->width - theme_grip_width; - g->surface.data.planar.parenty = 0; - - paint(self->rgrip, g); - } -} - -static void framerender_label(Frame *self, Appearance *a) -{ - if (self->label_x < 0) return; - - - /* set the texture's text! */ - a->texture[0].data.text.string = self->client->title; - RECT_SET(a->texture[0].position, 0, 0, - self->label_width, theme_label_height); - - paint(self->label, a); -} - -static void framerender_icon(Frame *self, Appearance *a) -{ - if (self->icon_x < 0) return; - - if (self->client->nicons) { - Icon *icon = client_icon(self->client, - theme_button_size + 2, theme_button_size + 2); - a->texture[0].type = RGBA; - a->texture[0].data.rgba.width = icon->width; - a->texture[0].data.rgba.height = icon->height; - a->texture[0].data.rgba.data = icon->data; - RECT_SET(self->a_icon->texture[0].position, 0, 0, - theme_button_size + 2, theme_button_size + 2); - } else - a->texture[0].type = NoTexture; - - paint(self->icon, a); -} - -static void framerender_max(Frame *self, Appearance *a) -{ - if (self->max_x < 0) return; - - RECT_SET(a->texture[0].position, 0, 0, - theme_button_size, theme_button_size); - paint(self->max, a); -} - -static void framerender_iconify(Frame *self, Appearance *a) -{ - if (self->iconify_x < 0) return; - - RECT_SET(a->texture[0].position, 0, 0, - theme_button_size, theme_button_size); - paint(self->iconify, a); -} - -static void framerender_desk(Frame *self, Appearance *a) -{ - if (self->desk_x < 0) return; - - RECT_SET(a->texture[0].position, 0, 0, - theme_button_size, theme_button_size); - paint(self->desk, a); -} - -static void framerender_shade(Frame *self, Appearance *a) -{ - if (self->shade_x < 0) return; - - RECT_SET(a->texture[0].position, 0, 0, - theme_button_size, theme_button_size); - paint(self->shade, a); -} - -static void framerender_close(Frame *self, Appearance *a) -{ - if (self->close_x < 0) return; - - RECT_SET(a->texture[0].position, 0, 0, - theme_button_size, theme_button_size); - paint(self->close, a); } diff --git a/openbox/window.h b/openbox/window.h index b7762edf..2c4775f7 100644 --- a/openbox/window.h +++ b/openbox/window.h @@ -9,6 +9,7 @@ typedef enum { Window_Dock, Window_DockApp, /* used for events but not stacking */ Window_Client, + Window_Decoration, Window_Internal /* used for stacking but not events */ } Window_InternalType; @@ -28,17 +29,20 @@ typedef struct InternalWindow { #define WINDOW_IS_DOCKAPP(win) (((ObWindow*)win)->type == Window_DockApp) #define WINDOW_IS_CLIENT(win) (((ObWindow*)win)->type == Window_Client) #define WINDOW_IS_INTERNAL(win) (((ObWindow*)win)->type == Window_Internal) +#define WINDOW_IS_DECORATION(win) (((ObWindow*)win)->type == Window_Decoration) struct Menu; struct Dock; struct DockApp; struct Client; +struct Decoration; #define WINDOW_AS_MENU(win) ((struct Menu*)win) #define WINDOW_AS_DOCK(win) ((struct Dock*)win) #define WINDOW_AS_DOCKAPP(win) ((struct DockApp*)win) #define WINDOW_AS_CLIENT(win) ((struct Client*)win) #define WINDOW_AS_INTERNAL(win) ((struct InternalWindow*)win) +#define WINDOW_AS_DECORATION(win) ((struct FrameDecor *)win) #define MENU_AS_WINDOW(menu) ((ObWindow*)menu) #define DOCK_AS_WINDOW(dock) ((ObWindow*)dock) diff --git a/plugins/menu/client_menu.c b/plugins/menu/client_menu.c index 9905291e..b0810ee8 100644 --- a/plugins/menu/client_menu.c +++ b/plugins/menu/client_menu.c @@ -46,11 +46,11 @@ void client_menu_show(Menu *self, int x, int y, Client *client) int newy; g_assert(!self->invalid); g_assert(client); - +/* XXX Sorry wooby! newy = MAX(client->frame->area.y + client->frame->a_focused_title->area.height + theme_bwidth, y - theme_bwidth); - +*/ POINT_SET(self->location, MIN(x, screen_physical_size.width - self->size.width - theme_bwidth * 2), -- 2.34.1