From: Dana Jansens Date: Tue, 27 May 2003 03:20:27 +0000 (+0000) Subject: port to the new render stuff.. but this isnt complte since we don't have themes yet. X-Git-Tag: gl2~89 X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=eeadc53289ef70cd57523a737a69f3d804c51231;p=dana%2Fopenbox.git port to the new render stuff.. but this isnt complte since we don't have themes yet. --- diff --git a/openbox/client.c b/openbox/client.c index ade1a109..d4f62845 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -15,7 +15,7 @@ #include "group.h" #include "config.h" #include "menu.h" -#include "render/render.h" +#include "render2/render.h" #include #include @@ -1337,23 +1337,25 @@ void client_update_icons(Client *self) w = self->icons[j].width = data[i++]; h = self->icons[j].height = data[i++]; - self->icons[j].data = g_new(pixel32, w * h); + self->icons[j].data = g_new(RrData32, w * h); for (x = 0, y = 0, t = 0; t < w * h; ++t, ++x, ++i) { if (x >= w) { x = 0; ++y; } + /* XXX optimize me, less shifts pls */ self->icons[j].data[t] = - (((data[i] >> 24) & 0xff) << default_alpha_offset) + - (((data[i] >> 16) & 0xff) << default_red_offset) + - (((data[i] >> 8) & 0xff) << default_green_offset) + - (((data[i] >> 0) & 0xff) << default_blue_offset); + (((data[i] >> 24) & 0xff) << 0) + + (((data[i] >> 16) & 0xff) << 24) + + (((data[i] >> 8) & 0xff) << 16) + + (((data[i] >> 0) & 0xff) << 8); } g_assert(i <= num); } g_free(data); - } else if (PROP_GETA32(self->window, kwm_win_icon, + }/* XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX XXX + else if (PROP_GETA32(self->window, kwm_win_icon, kwm_win_icon, &data, &num)) { if (num == 2) { self->nicons++; @@ -1387,6 +1389,7 @@ void client_update_icons(Client *self) XFree(hints); } } +*/ if (self->frame) frame_adjust_icon(self->frame); diff --git a/openbox/client.h b/openbox/client.h index 5d84df0b..a335c36e 100644 --- a/openbox/client.h +++ b/openbox/client.h @@ -3,7 +3,7 @@ #include "geom.h" #include "stacking.h" -#include "render/color.h" +#include "render2/render.h" #include #include @@ -18,7 +18,7 @@ struct Group; /*! Holds an icon in ARGB format */ typedef struct Icon { int width, height; - pixel32 *data; + RrData32 *data; } Icon; /*! The MWM Hints as retrieved from the window property diff --git a/openbox/dock.c b/openbox/dock.c index aaae5b6e..63fe2948 100644 --- a/openbox/dock.c +++ b/openbox/dock.c @@ -4,7 +4,9 @@ #include "config.h" #include "grab.h" #include "openbox.h" -#include "render/theme.h" + +/* XXX temp */ +static int theme_bwidth = 3; #define DOCK_EVENT_MASK (ButtonPressMask | ButtonReleaseMask | \ EnterWindowMask | LeaveWindowMask) @@ -28,11 +30,15 @@ void dock_startup() attrib.event_mask = DOCK_EVENT_MASK; attrib.override_redirect = True; dock->frame = XCreateWindow(ob_display, ob_root, 0, 0, 1, 1, 0, - render_depth, InputOutput, render_visual, + RrInstanceDepth(ob_render_inst), InputOutput, + RrInstanceVisual(ob_render_inst), CWOverrideRedirect | CWEventMask, &attrib); + dock->s_frame = RrSurfaceNew(ob_render_inst, RR_SURFACE_PLANAR, + dock->frame, 0); + /* XXX COPY THE APPEARANCE FROM THE THEME !#&*(# LIKE THIS SORTA... dock->a_frame = appearance_copy(theme_a_unfocused_title); - XSetWindowBorderWidth(ob_display, dock->frame, theme_bwidth); + */ g_hash_table_insert(window_map, &dock->frame, dock); stacking_add(DOCK_AS_WINDOW(dock)); @@ -41,8 +47,8 @@ void dock_startup() void dock_shutdown() { + RrSurfaceFree(dock->s_frame); XDestroyWindow(ob_display, dock->frame); - appearance_free(dock->a_frame); g_hash_table_remove(window_map, &dock->frame); stacking_remove(dock); } @@ -163,6 +169,9 @@ void dock_configure() } } + dock->w += theme_bwidth * 2; + dock->h += theme_bwidth * 2; + /* position the apps */ for (it = dock->dock_apps; it; it = it->next) { struct DockApp *app = it->data; @@ -179,10 +188,6 @@ void dock_configure() XMoveWindow(ob_display, app->icon_win, app->x, app->y); } - /* used for calculating offsets */ - dock->w += theme_bwidth * 2; - dock->h += theme_bwidth * 2; - /* calculate position */ switch (config_dock_pos) { case DockPos_Floating: @@ -343,23 +348,11 @@ void dock_configure() break; } - /* not used for actually sizing shit */ - dock->w -= theme_bwidth * 2; - dock->h -= theme_bwidth * 2; - if (dock->w > 0 && dock->h > 0) { - RECT_SET(dock->a_frame->area, 0, 0, dock->w, dock->h); - XMoveResizeWindow(ob_display, dock->frame, - dock->x, dock->y, dock->w, dock->h); - - paint(dock->frame, dock->a_frame); - XMapWindow(ob_display, dock->frame); + RrSurfaceSetArea(dock->s_frame, dock->x, dock->y, dock->w, dock->h); + RrSurfaceShow(dock->s_frame); } else - XUnmapWindow(ob_display, dock->frame); - - /* but they are useful outside of this function! */ - dock->w += theme_bwidth * 2; - dock->h += theme_bwidth * 2; + RrSurfaceHide(dock->s_frame); screen_update_struts(); } diff --git a/openbox/dock.h b/openbox/dock.h index 2b6dc4d2..c88320d8 100644 --- a/openbox/dock.h +++ b/openbox/dock.h @@ -5,7 +5,7 @@ #include "window.h" #include "stacking.h" #include "geom.h" -#include "render/render.h" +#include "render2/render.h" #include #include @@ -27,7 +27,7 @@ typedef struct Dock { ObWindow obwin; Window frame; - Appearance *a_frame; + struct RrSurface *s_frame; /* actual position (when not auto-hidden) */ int x, y; diff --git a/openbox/frame.c b/openbox/frame.c index c6395ae6..d932fcf3 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -2,7 +2,6 @@ #include "openbox.h" #include "extensions.h" #include "framerender.h" -#include "render/theme.h" #define PLATE_EVENTMASK (SubstructureRedirectMask | ButtonPressMask) #define FRAME_EVENTMASK (EnterWindowMask | LeaveWindowMask | \ @@ -10,6 +9,11 @@ #define ELEMENT_EVENTMASK (ButtonPressMask | ButtonReleaseMask | \ ButtonMotionMask | ExposureMask) +/* XXX temp */ +static int theme_bwidth = 3; +static int theme_cbwidth = 3; +static int theme_title_height = 8; + void frame_startup() { } @@ -22,7 +26,8 @@ static Window createWindow(Window parent, unsigned long mask, XSetWindowAttributes *attrib) { return XCreateWindow(ob_display, parent, 0, 0, 1, 1, 0, - render_depth, InputOutput, render_visual, + RrInstanceDepth(ob_render_inst), + InputOutput, RrInstanceVisual(ob_render_inst), mask, attrib); } @@ -294,12 +299,12 @@ Context frame_context(Client *client, Window win) g_assert(obwin); if (client->frame->window == win) { -printf("frame context\n"); +g_print("frame context\n"); return Context_Frame; } if (client->frame->plate == win) return Context_Client; -printf("decoration clicked\n"); +g_print("decoration clicked\n"); g_assert(WINDOW_IS_DECORATION(obwin)); return WINDOW_AS_DECORATION(obwin)->context; } @@ -430,7 +435,7 @@ void decor_calculate_size(FrameDecor *d, Rect *r) r->height = d->frame->client->area.height * d->area.height / 100; break; } -printf("area of decoration is %d, %d, %d, %d\n", r->x, r->y, r->width, +g_print("area of decoration is %d, %d, %d, %d\n", r->x, r->y, r->width, r->height); } diff --git a/openbox/frame.h b/openbox/frame.h index e021ce1a..163c4be2 100644 --- a/openbox/frame.h +++ b/openbox/frame.h @@ -3,7 +3,7 @@ #include "geom.h" #include "client.h" -#include "render/render.h" +/*#include "render2/render.h"*/ #include "window.h" typedef enum { diff --git a/openbox/framerender.c b/openbox/framerender.c index 36030d4a..e2f1b08b 100644 --- a/openbox/framerender.c +++ b/openbox/framerender.c @@ -2,7 +2,6 @@ #include "openbox.h" #include "screen.h" #include "framerender.h" -#include "render/theme.h" void framerender_frame(Frame *self) { diff --git a/openbox/menu.c b/openbox/menu.c index b67f92c3..41b0d749 100644 --- a/openbox/menu.c +++ b/openbox/menu.c @@ -2,7 +2,6 @@ #include "openbox.h" #include "stacking.h" #include "grab.h" -#include "render/theme.h" #include "screen.h" #include "geom.h" #include "plugin.h" @@ -33,16 +32,17 @@ void menu_destroy_hash_value(Menu *self) g_free(self->label); g_free(self->name); - g_hash_table_remove(window_map, &self->title); - g_hash_table_remove(window_map, &self->frame); - g_hash_table_remove(window_map, &self->items); + g_hash_table_remove(window_map, &self->w_title); + g_hash_table_remove(window_map, &self->w_frame); + g_hash_table_remove(window_map, &self->w_items); stacking_remove(self); - appearance_free(self->a_title); - XDestroyWindow(ob_display, self->title); - XDestroyWindow(ob_display, self->frame); - XDestroyWindow(ob_display, self->items); + RrSurfaceFree(self->s_title); + RrSurfaceFree(self->s_items); + RrSurfaceFree(self->s_frame); + + XDestroyWindow(ob_display, self->w_frame); g_free(self); } @@ -52,12 +52,13 @@ void menu_entry_free(MenuEntry *self) g_free(self->label); action_free(self->action); - g_hash_table_remove(window_map, &self->item); + g_hash_table_remove(window_map, &self->w_item); + g_hash_table_remove(window_map, &self->w_disabled); + g_hash_table_remove(window_map, &self->w_hilite); - appearance_free(self->a_item); - appearance_free(self->a_disabled); - appearance_free(self->a_hilite); - XDestroyWindow(ob_display, self->item); + RrSurfaceFree(self->s_item); + RrSurfaceFree(self->s_disabled); + RrSurfaceFree(self->s_hilite); g_free(self); } @@ -65,12 +66,14 @@ void menu_entry_free(MenuEntry *self) void menu_startup() { Menu *m; +/* Menu *s; Menu *t; +*/ Action *a; menu_hash = g_hash_table_new_full(g_str_hash, g_str_equal, - menu_destroy_hash_key, + (GDestroyNotify)menu_destroy_hash_key, (GDestroyNotify)menu_destroy_hash_value); m = menu_new("sex menu", "root", NULL); @@ -125,7 +128,8 @@ static Window createWindow(Window parent, unsigned long mask, XSetWindowAttributes *attrib) { return XCreateWindow(ob_display, parent, 0, 0, 1, 1, 0, - render_depth, InputOutput, render_visual, + RrInstanceDepth(ob_render_inst), InputOutput, + RrInstanceVisual(ob_render_inst), mask, attrib); } @@ -159,26 +163,27 @@ Menu *menu_new_full(char *label, char *name, Menu *parent, attrib.override_redirect = TRUE; attrib.event_mask = FRAME_EVENTMASK; - self->frame = createWindow(ob_root, CWOverrideRedirect|CWEventMask, &attrib); - attrib.event_mask = TITLE_EVENTMASK; - self->title = createWindow(self->frame, CWEventMask, &attrib); - self->items = createWindow(self->frame, 0, &attrib); -/* - XSetWindowBorderWidth(ob_display, self->frame, theme_bwidth); - XSetWindowBackground(ob_display, self->frame, theme_b_color->pixel); - XSetWindowBorderWidth(ob_display, self->title, theme_bwidth); - XSetWindowBorder(ob_display, self->frame, theme_b_color->pixel); - XSetWindowBorder(ob_display, self->title, theme_b_color->pixel); -*/ - XMapWindow(ob_display, self->title); - XMapWindow(ob_display, self->items); - + self->w_frame = createWindow(ob_root, CWOverrideRedirect|CWEventMask, + &attrib), + self->s_frame = RrSurfaceNew(ob_render_inst, RR_SURFACE_PLANAR, + self->w_frame, 0); + + /* XXX COPY THESE FROM THE THEME@&#*(&!# */ + self->s_title = RrSurfaceNewChild(RR_SURFACE_PLANAR, self->s_frame, 1); + self->w_title = RrSurfaceWindow(self->s_title); + self->s_items = RrSurfaceNewChild(RR_SURFACE_PLANAR, self->s_frame, 0); + self->w_items = RrSurfaceWindow(self->s_items); + /* XXX LIKE THIS SORTA... self->a_title = appearance_copy(theme_a_menu_title); self->a_items = appearance_copy(theme_a_menu); + */ - g_hash_table_insert(window_map, &self->frame, self); - g_hash_table_insert(window_map, &self->title, self); - g_hash_table_insert(window_map, &self->items, self); + /* event masks */ + XSelectInput(ob_display, self->w_title, TITLE_EVENTMASK); + + g_hash_table_insert(window_map, &self->w_frame, self); + g_hash_table_insert(window_map, &self->w_title, self); + g_hash_table_insert(window_map, &self->w_items, self); g_hash_table_insert(menu_hash, g_strdup(name), self); stacking_add(MENU_AS_WINDOW(self)); @@ -226,21 +231,35 @@ void menu_add_entry(Menu *menu, MenuEntry *entry) g_assert(menu != NULL); g_assert(entry != NULL); - g_assert(entry->item == None); + g_assert(entry->s_item == NULL); menu->entries = g_list_append(menu->entries, entry); entry->parent = menu; attrib.event_mask = ENTRY_EVENTMASK; - entry->item = createWindow(menu->items, CWEventMask, &attrib); - XMapWindow(ob_display, entry->item); + /* XXX COPY FROM THEME SURFACES @#&!#&*!@ */ + entry->s_item = RrSurfaceNewChild(RR_SURFACE_PLANAR, menu->s_items, 1); + entry->w_item = RrSurfaceWindow(entry->s_item); + entry->s_disabled = RrSurfaceNewChild(RR_SURFACE_PLANAR, menu->s_items,1); + entry->w_disabled = RrSurfaceWindow(entry->s_disabled); + entry->s_hilite = RrSurfaceNewChild(RR_SURFACE_PLANAR, menu->s_items, 1); + entry->w_hilite = RrSurfaceWindow(entry->s_hilite); + /* XXX LIKE THIS SORTA.... entry->a_item = appearance_copy(theme_a_menu_item); entry->a_disabled = appearance_copy(theme_a_menu_disabled); entry->a_hilite = appearance_copy(theme_a_menu_hilite); + */ + + /* event masks */ + XSelectInput(ob_display, entry->w_item, ENTRY_EVENTMASK); + XSelectInput(ob_display, entry->w_disabled, ENTRY_EVENTMASK); + XSelectInput(ob_display, entry->w_hilite, ENTRY_EVENTMASK); menu->invalid = TRUE; - g_hash_table_insert(window_map, &entry->item, menu); + g_hash_table_insert(window_map, &entry->w_item, menu); + g_hash_table_insert(window_map, &entry->w_disabled, menu); + g_hash_table_insert(window_map, &entry->w_hilite, menu); } void menu_show(char *name, int x, int y, Client *client) @@ -274,7 +293,7 @@ void menu_show_full(Menu *self, int x, int y, Client *client) void menu_hide(Menu *self) { if (self->shown) { - XUnmapWindow(ob_display, self->frame); + RrSurfaceHide(self->s_frame); self->shown = FALSE; if (self->open_submenu) menu_hide(self->open_submenu); @@ -302,7 +321,9 @@ MenuEntry *menu_find_entry(Menu *menu, Window win) for (it = menu->entries; it; it = it->next) { MenuEntry *entry = it->data; - if (entry->item == win) + if (entry->w_item == win || + entry->w_disabled == win || + entry->w_hilite == win) return entry; } return NULL; @@ -329,16 +350,12 @@ void menu_entry_fire(MenuEntry *self) void menu_control_show(Menu *self, int x, int y, Client *client) { g_assert(!self->invalid); - - XMoveWindow(ob_display, self->frame, - MIN(x, screen_physical_size.width - self->size.width), - MIN(y, screen_physical_size.height - self->size.height)); - POINT_SET(self->location, - MIN(x, screen_physical_size.width - self->size.width), - MIN(y, screen_physical_size.height - self->size.height)); + + POINT_SET(self->location, x, y); + menu_render(self); if (!self->shown) { - XMapWindow(ob_display, self->frame); + RrSurfaceShow(self->s_frame); stacking_raise(MENU_AS_WINDOW(self)); self->shown = TRUE; } else if (self->shown && self->open_submenu) { @@ -362,15 +379,13 @@ void menu_control_mouseover(MenuEntry *self, gboolean enter) { g_assert(!self->parent->invalid); /* TODO: I don't understand why these bevels should be here. Something must be wrong in the width calculation */ - x = self->parent->location.x + self->parent->size.width + - theme_bevel; + x = self->parent->location.x + self->parent->size.width; /* need to get the width. is this bad?*/ menu_render(self->submenu); if (self->submenu->size.width + x > screen_physical_size.width) - x = self->parent->location.x - self->submenu->size.width - - theme_bevel; + x = self->parent->location.x - self->submenu->size.width; menu_show_full(self->submenu, x, self->parent->location.y + self->y, diff --git a/openbox/menu.h b/openbox/menu.h index 49a79fb4..fc16e4e1 100644 --- a/openbox/menu.h +++ b/openbox/menu.h @@ -2,8 +2,8 @@ #define __menu_h #include "action.h" -#include "render/render.h" #include "geom.h" +#include "render2/render.h" #include @@ -44,12 +44,13 @@ typedef struct Menu { /* render stuff */ Client *client; - Window frame; - Window title; - Appearance *a_title; + struct RrSurface *s_frame; + Window w_frame; + struct RrSurface *s_title; + Window w_title; + struct RrSurface *s_items; + Window w_items; int title_min_w, title_h; - Window items; - Appearance *a_items; int bullet_w; int item_h; Point location; @@ -69,7 +70,7 @@ typedef enum MenuEntryRenderType { MenuEntryRenderType_Other = 1 << 7 } MenuEntryRenderType; -typedef struct { +typedef struct MenuEntry { char *label; Menu *parent; @@ -83,10 +84,12 @@ typedef struct { Menu *submenu; /* render stuff */ - Window item; - Appearance *a_item; - Appearance *a_disabled; - Appearance *a_hilite; + struct RrSurface *s_item; + Window w_item; + struct RrSurface *s_disabled; + Window w_disabled; + struct RrSurface *s_hilite; + Window w_hilite; int y; int min_w; } MenuEntry; diff --git a/openbox/menu_render.c b/openbox/menu_render.c index 4df4e413..fbdff17d 100644 --- a/openbox/menu_render.c +++ b/openbox/menu_render.c @@ -2,7 +2,12 @@ #include "menu.h" #include "openbox.h" -#include "render/theme.h" +#include "screen.h" +#include "render2/render.h" + +/* XXX temp */ +static int theme_bevel = 1; +static int theme_bwidth = 0; void menu_render_full(Menu *self); @@ -24,32 +29,36 @@ void menu_render_full(Menu *self) { int item_y; self->size.width = 1; + self->size.height = 1; self->item_h = 1; /* set texture data and size them mofos out */ if (self->label) { - self->a_title->texture[0].data.text.string = self->label; - appearance_minsize(self->a_title, &self->title_min_w, &self->title_h); + RrTextureSetText(self->s_title, 0, NULL, RR_CENTER, + self->label); + RrSurfaceMinSize(self->s_title, &self->title_min_w, &self->title_h); self->title_min_w += theme_bevel * 2; self->title_h += theme_bevel * 2; self->size.width = MAX(self->size.width, self->title_min_w); + self->size.height = MAX(self->size.height, + self->title_h + theme_bwidth); } for (it = self->entries; it; it = it->next) { MenuEntry *e = it->data; int h; - e->a_item->texture[0].data.text.string = e->label; - appearance_minsize(e->a_item, &e->min_w, &self->item_h); + RrTextureSetText(e->s_item, 0, NULL, RR_LEFT, e->label); + RrSurfaceMinSize(e->s_item, &e->min_w, &self->item_h); self->size.width = MAX(self->size.width, e->min_w); - e->a_disabled->texture[0].data.text.string = e->label; - appearance_minsize(e->a_disabled, &e->min_w, &h); + RrTextureSetText(e->s_disabled, 0, NULL, RR_LEFT, e->label); + RrSurfaceMinSize(e->s_disabled, &e->min_w, &h); self->item_h = MAX(self->item_h, h); self->size.width = MAX(self->size.width, e->min_w); - e->a_hilite->texture[0].data.text.string = e->label; - appearance_minsize(e->a_hilite, &e->min_w, &h); + RrTextureSetText(e->s_hilite, 0, NULL, RR_LEFT, e->label); + RrSurfaceMinSize(e->s_hilite, &e->min_w, &h); self->item_h = MAX(self->item_h, h); self->size.width = MAX(self->size.width, e->min_w); @@ -57,85 +66,102 @@ void menu_render_full(Menu *self) { ++nitems; } self->bullet_w = self->item_h + theme_bevel; - self->size.width += 2 * self->bullet_w + 2 * theme_bevel; + self->size.width += 2*self->bullet_w + 2*theme_bevel + 2*theme_bwidth; self->item_h += theme_bevel * 2; items_h = self->item_h * MAX(nitems, 1); + self->size.height += items_h + theme_bwidth * 2; if (self->label) { - RECT_SET(self->a_title->area, 0, 0, self->size.width, - self->title_h); - RECT_SET(self->a_title->texture[0].position, 0, 0, self->size.width, - self->title_h); + RrSurfaceSetArea(self->s_title, theme_bwidth, theme_bwidth, + self->size.width - theme_bwidth * 2, + self->title_h); } - RECT_SET(self->a_items->area, 0, 0, self->size.width, items_h); - - XResizeWindow(ob_display, self->frame, self->size.width, - MAX(self->title_h + items_h, 1)); - if (self->label) - XMoveResizeWindow(ob_display, self->title, -theme_bwidth, - -theme_bwidth, self->size.width, self->title_h); - - XMoveResizeWindow(ob_display, self->items, 0, - self->title_h + theme_bwidth, self->size.width, - items_h); + RrSurfaceSetArea(self->s_items, theme_bwidth, + theme_bwidth * 2 + self->title_h, + self->size.width - theme_bwidth * 2, items_h); - if (self->label) - paint(self->title, self->a_title); - paint(self->items, self->a_items); + + RrSurfaceSetArea(self->s_frame, + MIN(self->location.x, + screen_physical_size.width - self->size.width), + MIN(self->location.y, + screen_physical_size.height - self->size.height), + self->size.width, + self->size.height); item_y = 0; for (it = self->entries; it; it = it->next) { - ((MenuEntry*)it->data)->y = item_y; + MenuEntry *e = it->data; + RrSurfaceSetArea(e->s_item, self->bullet_w, item_y, + self->size.width - 2*theme_bwidth - 2*self->bullet_w, + self->item_h); + RrSurfaceSetArea(e->s_disabled, self->bullet_w, item_y, + self->size.width - 2*theme_bwidth - 2*self->bullet_w, + self->item_h); + RrSurfaceSetArea(e->s_hilite, self->bullet_w, item_y, + self->size.width - 2*theme_bwidth - 2*self->bullet_w, + self->item_h); menu_entry_render(it->data); item_y += self->item_h; } - self->size.height = item_y; self->invalid = FALSE; } void menu_entry_render(MenuEntry *self) { - Menu *menu = self->parent; - Appearance *a; - switch (self->render_type) { case MenuEntryRenderType_Submenu: /* TODO: submenu mask */ case MenuEntryRenderType_Boolean: - /* TODO: boolean check */ - a = self->enabled ? (self->hilite ? self->a_hilite : self->a_item) - : self->a_disabled; - break; case MenuEntryRenderType_None: - a = self->enabled ? (self->hilite ? self->a_hilite : self->a_item ) - : self->a_disabled; + /* TODO: boolean check */ + if (self->enabled) { + if (self->hilite) { + RrSurfaceHide(self->s_disabled); + RrSurfaceHide(self->s_item); + RrSurfaceShow(self->s_hilite); + } else { + RrSurfaceHide(self->s_disabled); + RrSurfaceShow(self->s_item); + RrSurfaceHide(self->s_hilite); + } + } else { + RrSurfaceShow(self->s_disabled); + RrSurfaceHide(self->s_item); + RrSurfaceHide(self->s_hilite); + } break; case MenuEntryRenderType_Separator: - a = self->a_item; + RrSurfaceHide(self->s_disabled); + RrSurfaceShow(self->s_item); + RrSurfaceHide(self->s_hilite); break; default: g_message("unhandled render_type"); + if (self->enabled) { + if (self->hilite) { + RrSurfaceHide(self->s_disabled); + RrSurfaceHide(self->s_item); + RrSurfaceShow(self->s_hilite); + } else { + RrSurfaceHide(self->s_disabled); + RrSurfaceShow(self->s_item); + RrSurfaceHide(self->s_hilite); + } + } else { + RrSurfaceShow(self->s_disabled); + RrSurfaceHide(self->s_item); + RrSurfaceHide(self->s_hilite); + } +/* used to be this... looks repetative from above a = !self->enabled ? self->a_disabled : (self->hilite && (self->action || self->render_type == MenuEntryRenderType_Submenu) ? self->a_hilite : self->a_item); +*/ break; } - - RECT_SET(a->area, 0, 0, menu->size.width, - menu->item_h); - RECT_SET(a->texture[0].position, menu->bullet_w, - 0, menu->size.width - 2 * menu->bullet_w, - menu->item_h); - - XMoveResizeWindow(ob_display, self->item, 0, self->y, - menu->size.width, menu->item_h); - a->surface.data.planar.parent = menu->a_items; - a->surface.data.planar.parentx = 0; - a->surface.data.planar.parenty = self->y; - - paint(self->item, a); } diff --git a/openbox/moveresize.c b/openbox/moveresize.c index 871e9653..69884c84 100644 --- a/openbox/moveresize.c +++ b/openbox/moveresize.c @@ -7,12 +7,14 @@ #include "openbox.h" #include "popup.h" #include "config.h" -#include "render/render.h" -#include "render/theme.h" +#include "render2/render.h" #include #include +/* XXX temp */ +static int theme_bwidth = 1; + gboolean moveresize_in_progress = FALSE; Client *moveresize_client = NULL; @@ -53,7 +55,9 @@ void moveresize_startup() attrib.save_under = True; opaque_window.win = XCreateWindow(ob_display, ob_root, 0, 0, 1, 1, 0, - render_depth, InputOutput, render_visual, + RrInstanceDepth(ob_render_inst), + InputOutput, + RrInstanceVisual(ob_render_inst), CWSaveUnder, &attrib); stacking_add(INTERNAL_AS_WINDOW(&opaque_window)); stacking_raise(INTERNAL_AS_WINDOW(&opaque_window)); diff --git a/openbox/openbox.c b/openbox/openbox.c index 0455e88c..419fc499 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -19,9 +19,7 @@ #include "config.h" #include "gettext.h" #include "parser/parse.h" -#include "render/render.h" -#include "render/font.h" -#include "render/theme.h" +#include "render2/render.h" #ifdef HAVE_FCNTL_H # include @@ -48,6 +46,7 @@ Display *ob_display = NULL; int ob_screen; Window ob_root; +struct RrInstance *ob_render_inst = NULL; State ob_state; gboolean ob_shutdown = FALSE; gboolean ob_restart = FALSE; @@ -164,15 +163,14 @@ int main(int argc, char **argv) startup_save(); if (screen_annex()) { /* it will be ours! */ + ob_render_inst = RrInstanceNew(ob_display, ob_screen); + /* startup the parsing so everything can register sections of the rc */ parse_startup(); /* anything that is going to read data from the rc file needs to be in this group */ timer_startup(); - render_startup(); - font_startup(); - theme_startup(); event_startup(); grab_startup(); plugin_startup(); @@ -188,9 +186,11 @@ int main(int argc, char **argv) parse_shutdown(); /* load the theme specified in the rc file */ +/* theme = theme_load(config_theme); g_free(theme); if (!theme) return 1; +*/ window_startup(); menu_startup(); @@ -228,10 +228,10 @@ int main(int argc, char **argv) window_shutdown(); grab_shutdown(); event_shutdown(); - theme_shutdown(); - render_shutdown(); timer_shutdown(); config_shutdown(); + + RrInstanceFree(ob_render_inst); } dispatch_shutdown(); diff --git a/openbox/openbox.h b/openbox/openbox.h index 51f62079..073482ef 100644 --- a/openbox/openbox.h +++ b/openbox/openbox.h @@ -21,6 +21,9 @@ extern int ob_screen; /*! The root window */ extern Window ob_root; +struct RrInstance; +extern struct RrInstance *ob_render_inst; + /*! States of execution for Openbox */ typedef enum { State_Starting, diff --git a/openbox/popup.c b/openbox/popup.c index 6f2cd240..07331e5e 100644 --- a/openbox/popup.c +++ b/openbox/popup.c @@ -2,8 +2,11 @@ #include "frame.h" #include "window.h" #include "stacking.h" -#include "render/render.h" -#include "render/theme.h" +#include "render2/render.h" + +/* XXX temp */ +static int theme_bevel = 1; +static int theme_bwidth = 3; typedef struct Popup { ObWindow obwin; @@ -13,44 +16,58 @@ typedef struct Popup { Window text; gboolean hasicon; - Appearance *a_bg; - Appearance *a_icon; - Appearance *a_text; + struct RrSurface *s_bg; + struct RrSurface *s_icon; + struct RrSurface *s_text; int gravity; int x; int y; int w; int h; - gboolean mapped; } Popup; Popup *popup_new(gboolean hasicon) { - Popup *self = g_new(Popup, 1); + XSetWindowAttributes attrib; + Popup *self; + + self = g_new(Popup, 1); self->obwin.type = Window_Internal; self->hasicon = hasicon; - self->bg = None; - self->a_text = NULL; self->gravity = NorthWestGravity; self->x = self->y = self->w = self->h = 0; - self->mapped = FALSE; stacking_add(INTERNAL_AS_WINDOW(self)); stacking_raise(INTERNAL_AS_WINDOW(self)); + + attrib.override_redirect = True; + self->bg = XCreateWindow(ob_display, ob_root, + 0, 0, 1, 1, 0, RrInstanceDepth(ob_render_inst), + InputOutput, RrInstanceVisual(ob_render_inst), + CWOverrideRedirect, &attrib); + self->s_bg = RrSurfaceNew(ob_render_inst, RR_SURFACE_PLANAR, self->bg, 0); + self->s_text = RrSurfaceNewChild(RR_SURFACE_PLANAR, self->s_bg, 1); + self->text = RrSurfaceWindow(self->s_text); + if (self->hasicon) { + self->s_icon = RrSurfaceNewChild(RR_SURFACE_PLANAR, self->s_bg, 1); + self->icon = RrSurfaceWindow(self->s_icon); + } else { + self->s_icon = NULL; + self->icon = None; + } + + /* XXX COPY THE APPEARANCES FROM THE THEME...... LIKE THIS SORTA! + self->a_text = appearance_copy(theme_app_hilite_label); + */ + return self; } void popup_free(Popup *self) { - if (self->bg) { - XDestroyWindow(ob_display, self->bg); - XDestroyWindow(ob_display, self->text); - XDestroyWindow(ob_display, self->icon); - appearance_free(self->a_bg); - if (self->hasicon) - appearance_free(self->a_icon); - } - if (self->a_text) - appearance_free(self->a_text); + RrSurfaceFree(self->s_bg); + RrSurfaceFree(self->s_icon); + RrSurfaceFree(self->s_text); + XDestroyWindow(ob_display, self->bg); stacking_remove(self); g_free(self); } @@ -73,69 +90,27 @@ void popup_size_to_string(Popup *self, char *text) int textw, texth; int iconw; - if (!self->a_text) - self->a_text = appearance_copy(theme_app_hilite_label); - - self->a_text->texture[0].data.text.string = text; - appearance_minsize(self->a_text, &textw, &texth); + RrTextureSetText(self->s_text, 0, NULL, RR_LEFT, text); + RrSurfaceMinSize(self->s_text, &textw, &texth); textw += theme_bevel * 2; texth += theme_bevel * 2; - self->h = texth + theme_bevel * 2; - iconw = (self->hasicon ? texth : 0); - self->w = textw + iconw + theme_bevel * 3; + self->h = texth + theme_bevel * 2 + theme_bwidth * 2; + iconw = (self->hasicon ? texth + theme_bevel : 0); + self->w = textw + iconw + theme_bevel * 2 + theme_bwidth * 2; } void popup_show(Popup *self, char *text, Icon *icon) { - XSetWindowAttributes attrib; int x, y, w, h; int textw, texth; int iconw; - /* create the shit if needed */ - if (!self->bg) { - attrib.override_redirect = True; - self->bg = XCreateWindow(ob_display, ob_root, - 0, 0, 1, 1, 0, render_depth, InputOutput, - render_visual, CWOverrideRedirect, &attrib); -/* - XSetWindowBorderWidth(ob_display, self->bg, theme_bwidth); - XSetWindowBorder(ob_display, self->bg, theme_b_color->pixel); -*/ - self->text = XCreateWindow(ob_display, self->bg, - 0, 0, 1, 1, 0, render_depth, InputOutput, - render_visual, 0, NULL); - if (self->hasicon) - self->icon = XCreateWindow(ob_display, self->bg, - 0, 0, 1, 1, 0, - render_depth, InputOutput, - render_visual, 0, NULL); - - XMapWindow(ob_display, self->text); - XMapWindow(ob_display, self->icon); - - self->a_bg = appearance_copy(theme_app_hilite_bg); - if (self->hasicon) - self->a_icon = appearance_copy(theme_app_icon); - } - if (!self->a_text) - self->a_text = appearance_copy(theme_app_hilite_label); - /* set up the textures */ - self->a_text->texture[0].data.text.string = text; - if (self->hasicon) { - if (icon) { - self->a_icon->texture[0].type = RGBA; - self->a_icon->texture[0].data.rgba.width = icon->width; - self->a_icon->texture[0].data.rgba.height = icon->height; - self->a_icon->texture[0].data.rgba.data = icon->data; - } else - self->a_icon->texture[0].type = NoTexture; - } + RrTextureSetText(self->s_text, 0, NULL, RR_LEFT, text); /* measure the shit out */ - appearance_minsize(self->a_text, &textw, &texth); + RrSurfaceMinSize(self->s_text, &textw, &texth); textw += theme_bevel * 2; texth += theme_bevel * 2; @@ -149,9 +124,9 @@ void popup_show(Popup *self, char *text, Icon *icon) iconw = (self->hasicon ? texth : 0); if (self->w) { w = self->w; - textw = w - (iconw + theme_bevel * 3); + textw = w - (iconw + theme_bevel * (self->hasicon ? 3 : 2)); } else - w = textw + iconw + theme_bevel * 3; + w = textw + iconw + theme_bevel * (self->hasicon ? 3 : 2); /* sanity checks to avoid crashes! */ if (w < 1) w = 1; if (h < 1) h = 1; @@ -188,46 +163,34 @@ void popup_show(Popup *self, char *text, Icon *icon) break; } - /* set the windows/appearances up */ - RECT_SET(self->a_bg->area, 0, 0, w, h); - XMoveResizeWindow(ob_display, self->bg, x, y, w, h); + /* set the surfaces up */ + RrSurfaceSetArea(self->s_bg, x, y, w, h); - RECT_SET(self->a_text->area, 0, 0, textw, texth); - RECT_SET(self->a_text->texture[0].position, theme_bevel, theme_bevel, - textw - theme_bevel * 2, texth - theme_bevel * 2); - self->a_text->surface.data.planar.parent = self->a_bg; - self->a_text->surface.data.planar.parentx = iconw + theme_bevel * 2; - self->a_text->surface.data.planar.parenty = theme_bevel; - XMoveResizeWindow(ob_display, self->text, - iconw + theme_bevel * 2, theme_bevel, textw, texth); + RrSurfaceSetArea(self->s_text, + iconw + theme_bevel * (self->hasicon ? 3 : 2) + + theme_bwidth, + theme_bevel + theme_bwidth, + textw, texth); if (self->hasicon) { + RrTextureSetRGBA(self->s_icon, 0, icon->data, 0, 0, icon->width, + icon->height); if (iconw < 1) iconw = 1; /* sanity check for crashes */ - RECT_SET(self->a_icon->area, 0, 0, iconw, texth); - RECT_SET(self->a_icon->texture[0].position, 0, 0, iconw, texth); - self->a_icon->surface.data.planar.parent = self->a_bg; - self->a_icon->surface.data.planar.parentx = theme_bevel; - self->a_icon->surface.data.planar.parenty = theme_bevel; - XMoveResizeWindow(ob_display, self->icon, - theme_bevel, theme_bevel, iconw, texth); + RrSurfaceSetArea(self->s_icon, + theme_bwidth + theme_bevel, + theme_bwidth + theme_bevel, + iconw, iconw); } - paint(self->bg, self->a_bg); - paint(self->text, self->a_text); - if (self->hasicon) - paint(self->icon, self->a_icon); - - if (!self->mapped) { - XMapWindow(ob_display, self->bg); + if (!RrSurfaceVisible(self->s_bg)) { + RrSurfaceShow(self->s_bg); stacking_raise(INTERNAL_AS_WINDOW(self)); - self->mapped = TRUE; } } void popup_hide(Popup *self) { - if (self->mapped) { - XUnmapWindow(ob_display, self->bg); - self->mapped = FALSE; + if (RrSurfaceVisible(self->s_bg)) { + RrSurfaceHide(self->s_bg); } } diff --git a/openbox/screen.c b/openbox/screen.c index c65c23cd..63993995 100644 --- a/openbox/screen.c +++ b/openbox/screen.c @@ -11,7 +11,6 @@ #include "focus.h" #include "dispatch.h" #include "extensions.h" -#include "../render/render.h" #ifdef USE_LIBSN # define SN_API_NOT_YET_FROZEN diff --git a/openbox/window.c b/openbox/window.c index 9b8b91b0..c541c53a 100644 --- a/openbox/window.c +++ b/openbox/window.c @@ -21,7 +21,7 @@ Window window_top(ObWindow *self) { switch (self->type) { case Window_Menu: - return ((Menu*)self)->frame; + return ((Menu*)self)->w_frame; case Window_Dock: return ((Dock*)self)->frame; case Window_DockApp: diff --git a/plugins/menu/client_menu.c b/plugins/menu/client_menu.c index 40774bfd..3508f392 100644 --- a/plugins/menu/client_menu.c +++ b/plugins/menu/client_menu.c @@ -7,8 +7,6 @@ #include "kernel/frame.h" -#include "render/theme.h" - static char *PLUGIN_NAME = "client_menu"; static Menu *send_to_menu; @@ -47,25 +45,20 @@ void client_menu_show(Menu *self, int x, int y, Client *client) g_assert(!self->invalid); g_assert(client); -/* XXX - newy = MAX(client->frame->area.y + - client->frame->a_focused_title->area.height + theme_bwidth, - y - theme_bwidth); -XXX */ - + newy = MAX(client->frame->area.y + client->frame->size.top, y); + POINT_SET(self->location, - MIN(x, screen_physical_size.width - self->size.width - - theme_bwidth * 2), - MIN(newy, screen_physical_size.height - self->size.height - - theme_bwidth * 2)); - XMoveWindow(ob_display, self->frame, self->location.x, self->location.y); + MIN(x, screen_physical_size.width - self->size.width), + MIN(newy, screen_physical_size.height - self->size.height)); + menu_render(self); if (!self->shown) { - XMapWindow(ob_display, self->frame); + RrSurfaceShow(self->s_frame); stacking_raise(MENU_AS_WINDOW(self)); self->shown = TRUE; - } else if (self->shown && self->open_submenu) { - menu_hide(self->open_submenu); + } else if (self->shown && self->open_submenu) { /* XXX is this right? */ + RrSurfaceHide(self->s_frame); + self->shown = FALSE; } }