case Context_Maximize:
client->frame->max_press = (e->type == ButtonPress);
framerender_frame(client->frame);
+ RrPaint(client->frame->s_max, 1);
break;
case Context_Close:
client->frame->close_press = (e->type == ButtonPress);
framerender_frame(client->frame);
+ RrPaint(client->frame->s_close, 1);
break;
case Context_Iconify:
client->frame->iconify_press = (e->type == ButtonPress);
framerender_frame(client->frame);
+ RrPaint(client->frame->s_iconify, 1);
break;
case Context_AllDesktops:
client->frame->desk_press = (e->type == ButtonPress);
framerender_frame(client->frame);
- break;
+ RrPaint(client->frame->s_desk, 1);
+ break;
case Context_Shade:
client->frame->shade_press = (e->type == ButtonPress);
framerender_frame(client->frame);
+ RrPaint(client->frame->s_shade, 1);
break;
default:
/* nothing changes with clicks for any other contexts */
#include "framerender.h"
#include "render2/theme.h"
-#define PLATE_EVENTMASK (SubstructureRedirectMask | ButtonPressMask)
+#define PLATE_EVENTMASK (SubstructureRedirectMask | ButtonPressMask | \
+ ExposureMask)
#define FRAME_EVENTMASK (EnterWindowMask | LeaveWindowMask | \
ButtonPressMask | ButtonReleaseMask | ExposureMask)
#define ELEMENT_EVENTMASK (ButtonPressMask | ButtonReleaseMask | \
attrib.override_redirect = TRUE;
self->window = createWindow(ob_root, mask, &attrib);
- mask = 0;
- self->plate = createWindow(self->window, mask, &attrib);
-
self->s_frame = RrSurfaceNew(ob_render_inst, 0, self->window, 0);
+ self->s_plate = RrSurfaceNewChild(0, self->s_frame, 0);
self->s_title = RrSurfaceNewChild(0, self->s_frame, 0);
self->s_label = RrSurfaceNewChild(0, self->s_title, 0);
self->s_max = RrSurfaceNewChild(0, self->s_title, 0);
self->s_lgrip = RrSurfaceNewChild(0, self->s_handle, 0);
self->s_rgrip = RrSurfaceNewChild(0, self->s_handle, 0);
+ self->plate = RrSurfaceWindow(self->s_plate);
self->w_title = RrSurfaceWindow(self->s_title);
self->w_label = RrSurfaceWindow(self->s_label);
self->w_max = RrSurfaceWindow(self->s_max);
self->focused = FALSE;
/* the other stuff is shown based on decor settings */
- XMapWindow(ob_display, self->plate);
+ RrSurfaceShow(self->s_plate);
RrSurfaceShow(self->s_label);
RrSurfaceShow(self->s_lgrip);
RrSurfaceShow(self->s_rgrip);
RrSurfaceFree(self->s_max);
RrSurfaceFree(self->s_label);
RrSurfaceFree(self->s_title);
+ RrSurfaceFree(self->s_plate);
RrSurfaceFree(self->s_frame);
- XDestroyWindow(ob_display, self->plate);
XDestroyWindow(ob_display, self->window);
g_free(self);
if (resized) {
/* move and resize the plate */
- XMoveResizeWindow(ob_display, self->plate,
- self->size.left, self->size.top,
- self->client->area.width,
- self->client->area.height);
+ RrSurfaceSetArea(self->s_plate,
+ self->size.left - self->cbwidth,
+ self->size.top - self->cbwidth,
+ self->client->area.width - self->cbwidth * 2,
+ self->client->area.height - self->cbwidth * 2);
/* when the client has StaticGravity, it likes to move around. */
- XMoveWindow(ob_display, self->client->window, 0, 0);
+ XMoveWindow(ob_display, self->client->window,
+ self->cbwidth, self->cbwidth);
}
/* shading can change without being moved or resized */
void frame_adjust_state(Frame *self)
{
framerender_frame(self);
+ RrPaint(self->s_frame, 1);
}
void frame_adjust_focus(Frame *self, gboolean hilite)
{
self->focused = hilite;
framerender_frame(self);
+ RrPaint(self->s_frame, 1);
}
void frame_adjust_title(Frame *self)
{
framerender_frame(self);
+ RrPaint(self->s_label, 1);
}
void frame_adjust_icon(Frame *self)
{
framerender_frame(self);
+ RrPaint(self->s_icon, 1);
}
void frame_grab_client(Frame *self, Client *client)
/* XXX plate, client border */
if (self->client->decorations & Decor_Titlebar) {
- struct RrSurface *t, *l, *m, *n, *i, *d, *s, *c;
+ struct RrSurface *t, *l, *p, *m, *n, *i, *d, *s, *c;
t = (self->focused ?
ob_theme->title_f : ob_theme->title);
l = (self->focused ?
ob_theme->label_f : ob_theme->label);
+ p = (self->focused ?
+ ob_theme->plate_f : ob_theme->plate);
m = (self->focused ?
(self->client->max_vert || self->client->max_horz ?
ob_theme->max_p_f : (self->max_press ?
RrSurfaceCopy(self->s_title, t);
RrSurfaceCopy(self->s_label, l);
+ RrSurfaceCopy(self->s_plate, p);
RrTextureSetText(self->s_label, 0, ob_theme->title_font,
ob_theme->title_justify,
RrSurfaceCopy(self->s_lgrip, g);
RrSurfaceCopy(self->s_rgrip, g);
}
- /* XXX this could be more efficient */
- RrPaint(self->s_frame);
}
int textw, texth;
int iconw;
- RrTextureSetText(self->s_text, 0, NULL, RR_LEFT,
+ RrTextureSetText(self->s_text, 0, ob_theme->title_font, RR_LEFT,
&ob_theme->app_label_color_h, text);
RrSurfaceMinSize(self->s_text, &textw, &texth);
textw += ob_theme->bevel * 2;
if (!RrSurfaceVisible(self->s_bg)) {
RrSurfaceShow(self->s_bg);
stacking_raise(INTERNAL_AS_WINDOW(self));
- } else
- RrPaint(self->s_bg);
+ } else {
+ RrPaint(self->s_text, 1);
+ if (self->hasicon)
+ RrPaint(self->s_icon, 1);
+ }
}
void popup_hide(Popup *self)