static void layout_title(ObFrame *self);
static void render(ObFrame *self);
-static void render_label(ObFrame *self);
-static void render_max(ObFrame *self);
-static void render_icon(ObFrame *self);
-static void render_iconify(ObFrame *self);
-static void render_desk(ObFrame *self);
-static void render_close(ObFrame *self);
+static void render_label(ObFrame *self, Appearance *a);
+static void render_max(ObFrame *self, Appearance *a);
+static void render_icon(ObFrame *self, Appearance *a);
+static void render_iconify(ObFrame *self, Appearance *a);
+static void render_desk(ObFrame *self, Appearance *a);
+static void render_close(ObFrame *self, Appearance *a);
static void frame_mouse_press(const ObEvent *e, ObFrame *self);
static void frame_mouse_release(const ObEvent *e, ObFrame *self);
a_unfocused_title = appearance_new(Surface_Planar, 0);
a_focused_label = appearance_new(Surface_Planar, 1);
a_unfocused_label = appearance_new(Surface_Planar, 1);
- a_icon = appearance_new(Surface_Planar, 0);/*1);*/
+ a_icon = appearance_new(Surface_Planar, 1);
a_focused_handle = appearance_new(Surface_Planar, 0);
a_unfocused_handle = appearance_new(Surface_Planar, 0);
void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized)
{
- g_message("adjust_area: %d %d", moved, resized);
if (resized) {
if (self->frame.client->decorations & Decor_Border) {
self->bwidth = s_bwidth;
XUnmapWindow(ob_display, self->handle);
}
- if (moved) {
- /* find the new coordinates */
- self->frame.area.x = self->frame.client->area.x;
- self->frame.area.y = self->frame.client->area.y;
- frame_client_gravity((Frame*)self,
- &self->frame.area.x, &self->frame.area.y);
- }
-
- /* move and resize the top level frame.
- shading can change without being moved or resized */
- XMoveResizeWindow(ob_display, self->frame.window,
- self->frame.area.x, self->frame.area.y,
- self->width,
- (self->frame.client->shaded ? TITLE_HEIGHT :
- self->innersize.top + self->innersize.bottom +
- self->frame.client->area.height));
-
if (resized) {
/* move and resize the plate */
XMoveResizeWindow(ob_display, self->frame.plate,
self->frame.client->area.height +
self->frame.size.top + self->frame.size.bottom));
+ if (moved) {
+ /* find the new coordinates, done after setting the frame.size, for
+ frame_client_gravity. */
+ self->frame.area.x = self->frame.client->area.x;
+ self->frame.area.y = self->frame.client->area.y;
+ frame_client_gravity((Frame*)self,
+ &self->frame.area.x, &self->frame.area.y);
+ }
+
+ /* move and resize the top level frame.
+ shading can change without being moved or resized */
+ XMoveResizeWindow(ob_display, self->frame.window,
+ self->frame.area.x, self->frame.area.y,
+ self->width, self->frame.area.height - self->bwidth * 2);
+
if (resized) {
render(self);
void frame_adjust_state(ObFrame *self)
{
- render_max(self);
- render_desk(self);
+ render(self);
}
void frame_adjust_focus(ObFrame *self)
void frame_adjust_title(ObFrame *self)
{
- render_label(self);
+ render(self);
}
void frame_adjust_icon(ObFrame *self)
{
- render_icon(self);
+ render(self);
}
void frame_grab_client(ObFrame *self, Client *client)
frame_adjust_area(self, TRUE, TRUE);
/* set all the windows for the frame in the client_map */
- g_hash_table_insert(client_map, (gpointer)self->frame.window, client);
- g_hash_table_insert(client_map, (gpointer)self->frame.plate, client);
- g_hash_table_insert(client_map, (gpointer)self->title, client);
- g_hash_table_insert(client_map, (gpointer)self->label, client);
- g_hash_table_insert(client_map, (gpointer)self->max, client);
- g_hash_table_insert(client_map, (gpointer)self->close, client);
- g_hash_table_insert(client_map, (gpointer)self->desk, client);
- g_hash_table_insert(client_map, (gpointer)self->icon, client);
- g_hash_table_insert(client_map, (gpointer)self->iconify, client);
- g_hash_table_insert(client_map, (gpointer)self->handle, client);
- g_hash_table_insert(client_map, (gpointer)self->lgrip, client);
- g_hash_table_insert(client_map, (gpointer)self->rgrip, client);
+ g_hash_table_insert(client_map, &self->frame.window, client);
+ g_hash_table_insert(client_map, &self->frame.plate, client);
+ g_hash_table_insert(client_map, &self->title, client);
+ g_hash_table_insert(client_map, &self->label, client);
+ g_hash_table_insert(client_map, &self->max, client);
+ g_hash_table_insert(client_map, &self->close, client);
+ g_hash_table_insert(client_map, &self->desk, client);
+ g_hash_table_insert(client_map, &self->icon, client);
+ g_hash_table_insert(client_map, &self->iconify, client);
+ g_hash_table_insert(client_map, &self->handle, client);
+ g_hash_table_insert(client_map, &self->lgrip, client);
+ g_hash_table_insert(client_map, &self->rgrip, client);
}
void frame_release_client(ObFrame *self, Client *client)
}
/* remove all the windows for the frame from the client_map */
- g_hash_table_remove(client_map, (gpointer)self->frame.window);
- g_hash_table_remove(client_map, (gpointer)self->frame.plate);
- g_hash_table_remove(client_map, (gpointer)self->title);
- g_hash_table_remove(client_map, (gpointer)self->label);
- g_hash_table_remove(client_map, (gpointer)self->max);
- g_hash_table_remove(client_map, (gpointer)self->close);
- g_hash_table_remove(client_map, (gpointer)self->desk);
- g_hash_table_remove(client_map, (gpointer)self->icon);
- g_hash_table_remove(client_map, (gpointer)self->iconify);
- g_hash_table_remove(client_map, (gpointer)self->handle);
- g_hash_table_remove(client_map, (gpointer)self->lgrip);
- g_hash_table_remove(client_map, (gpointer)self->rgrip);
+ g_hash_table_remove(client_map, &self->frame.window);
+ g_hash_table_remove(client_map, &self->frame.plate);
+ g_hash_table_remove(client_map, &self->title);
+ g_hash_table_remove(client_map, &self->label);
+ g_hash_table_remove(client_map, &self->max);
+ g_hash_table_remove(client_map, &self->close);
+ g_hash_table_remove(client_map, &self->desk);
+ g_hash_table_remove(client_map, &self->icon);
+ g_hash_table_remove(client_map, &self->iconify);
+ g_hash_table_remove(client_map, &self->handle);
+ g_hash_table_remove(client_map, &self->lgrip);
+ g_hash_table_remove(client_map, &self->rgrip);
frame_free(self);
}
}
if (self->frame.client->decorations & Decor_Titlebar) {
- paint(self->title, (client_focused(self->frame.client) ?
- self->a_focused_title :
- self->a_unfocused_title),
- 0, 0, self->width, TITLE_HEIGHT);
- render_label(self);
- render_max(self);
- render_icon(self);
- render_iconify(self);
- render_desk(self);
- render_close(self);
+ Appearance *t, *l, *m, *n, *i, *d, *c;
+
+ t = (client_focused(self->frame.client) ?
+ self->a_focused_title : self->a_unfocused_title);
+ l = (client_focused(self->frame.client) ?
+ self->a_focused_label : self->a_unfocused_label);
+ m = (client_focused(self->frame.client) ?
+ ((self->max_press ||
+ self->frame.client->max_vert || self->frame.client->max_horz) ?
+ a_focused_pressed_max : a_focused_unpressed_max) :
+ ((self->max_press ||
+ self->frame.client->max_vert || self->frame.client->max_horz) ?
+ a_unfocused_pressed_max : a_unfocused_unpressed_max));
+ n = self->a_icon;
+ i = (client_focused(self->frame.client) ?
+ (self->iconify_press ?
+ a_focused_pressed_iconify : a_focused_unpressed_iconify) :
+ (self->iconify_press ?
+ a_unfocused_pressed_iconify : a_unfocused_unpressed_iconify));
+ d = (client_focused(self->frame.client) ?
+ (self->desk_press || self->frame.client->desktop == DESKTOP_ALL ?
+ a_focused_pressed_desk : a_focused_unpressed_desk) :
+ (self->desk_press || self->frame.client->desktop == DESKTOP_ALL ?
+ a_unfocused_pressed_desk : a_unfocused_unpressed_desk));
+ c = (client_focused(self->frame.client) ?
+ (self->close_press ?
+ a_focused_pressed_close : a_focused_unpressed_close) :
+ (self->close_press ?
+ a_unfocused_pressed_close : a_unfocused_unpressed_close));
+
+ paint(self->title, t, 0, 0, self->width, TITLE_HEIGHT);
+
+ /* 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 = s_bevel;
+
+ m->surface.data.planar.parent = t;
+ m->surface.data.planar.parentx = self->max_x;
+ m->surface.data.planar.parenty = s_bevel + 1;
+
+ n->surface.data.planar.parent = t;
+ n->surface.data.planar.parentx = self->icon_x;
+ n->surface.data.planar.parenty = s_bevel + 1;
+
+ i->surface.data.planar.parent = t;
+ i->surface.data.planar.parentx = self->iconify_x;
+ i->surface.data.planar.parenty = s_bevel + 1;
+
+ d->surface.data.planar.parent = t;
+ d->surface.data.planar.parentx = self->desk_x;
+ d->surface.data.planar.parenty = s_bevel + 1;
+
+ c->surface.data.planar.parent = t;
+ c->surface.data.planar.parentx = self->close_x;
+ c->surface.data.planar.parenty = s_bevel + 1;
+
+ render_label(self, l);
+ render_max(self, m);
+ render_icon(self, n);
+ render_iconify(self, i);
+ render_desk(self, d);
+ render_close(self, c);
}
if (self->frame.client->decorations & Decor_Handle) {
}
}
-static void render_label(ObFrame *self)
+static void render_label(ObFrame *self, Appearance *a)
{
- Appearance *a;
-
if (self->label_x < 0) return;
- a = (client_focused(self->frame.client) ?
- self->a_focused_label : self->a_unfocused_label);
/* set the texture's text! */
a->texture[0].data.text.string = self->frame.client->title;
+ RECT_SET(a->texture[0].position, 0, 0, self->label_width, LABEL_HEIGHT);
paint(self->label, a, 0, 0, self->label_width, LABEL_HEIGHT);
}
-static void render_icon(ObFrame *self)
+static void render_icon(ObFrame *self, Appearance *a)
{
if (self->icon_x < 0) return;
- /* XXX set the texture's icon picture! */
- paint(self->icon, self->a_icon, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
+ if (self->frame.client->nicons) {
+ Icon *icon = client_icon(self->frame.client, BUTTON_SIZE, BUTTON_SIZE);
+ 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,
+ BUTTON_SIZE,BUTTON_SIZE);
+ } else
+ a->texture[0].type = NoTexture;
+
+ paint(self->icon, a, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
}
-static void render_max(ObFrame *self)
+static void render_max(ObFrame *self, Appearance *a)
{
- gboolean press = self->max_press ||
- self->frame.client->max_vert || self->frame.client->max_horz;
-
if (self->max_x < 0) return;
- paint(self->max, (client_focused(self->frame.client) ?
- (press ?
- a_focused_pressed_max :
- a_focused_unpressed_max) :
- (press ?
- a_unfocused_pressed_max :
- a_unfocused_unpressed_max)),
- 0, 0, BUTTON_SIZE, BUTTON_SIZE);
+ RECT_SET(a->texture[0].position, 0, 0, BUTTON_SIZE,BUTTON_SIZE);
+ paint(self->max, a, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
}
-static void render_iconify(ObFrame *self)
+static void render_iconify(ObFrame *self, Appearance *a)
{
if (self->iconify_x < 0) return;
- paint(self->iconify, (client_focused(self->frame.client) ?
- (self->iconify_press ?
- a_focused_pressed_iconify :
- a_focused_unpressed_iconify) :
- (self->iconify_press ?
- a_unfocused_pressed_iconify :
- a_unfocused_unpressed_iconify)),
- 0, 0, BUTTON_SIZE, BUTTON_SIZE);
+ RECT_SET(a->texture[0].position, 0, 0, BUTTON_SIZE,BUTTON_SIZE);
+ paint(self->iconify, a, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
}
-static void render_desk(ObFrame *self)
+static void render_desk(ObFrame *self, Appearance *a)
{
- gboolean press = self->desk_press ||
- self->frame.client->desktop == DESKTOP_ALL;
-
if (self->desk_x < 0) return;
- paint(self->desk, (client_focused(self->frame.client) ?
- (press ?
- a_focused_pressed_desk :
- a_focused_unpressed_desk) :
- (press ?
- a_unfocused_pressed_desk :
- a_unfocused_unpressed_desk)),
- 0, 0, BUTTON_SIZE, BUTTON_SIZE);
+ RECT_SET(a->texture[0].position, 0, 0, BUTTON_SIZE,BUTTON_SIZE);
+ paint(self->desk, a, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
}
-static void render_close(ObFrame *self)
+static void render_close(ObFrame *self, Appearance *a)
{
if (self->close_x < 0) return;
- paint(self->close, (client_focused(self->frame.client) ?
- (self->close_press ?
- a_focused_pressed_close :
- a_focused_unpressed_close) :
- (self->close_press ?
- a_unfocused_pressed_close :
- a_unfocused_unpressed_close)),
- 0, 0, BUTTON_SIZE, BUTTON_SIZE);
+ RECT_SET(a->texture[0].position, 0, 0, BUTTON_SIZE,BUTTON_SIZE);
+ paint(self->close, a, 0, 0, BUTTON_SIZE, BUTTON_SIZE);
}
GQuark get_context(Client *client, Window win)
Window win = e->data.x.e->xbutton.window;
if (win == self->max) {
self->max_press = TRUE;
- render_max(self);
+ render(self);
} else if (win == self->close) {
self->close_press = TRUE;
- render_close(self);
+ render(self);
} else if (win == self->iconify) {
self->iconify_press = TRUE;
- render_iconify(self);
+ render(self);
} else if (win == self->desk) {
self->desk_press = TRUE;
- render_desk(self);
+ render(self);
}
}
Window win = e->data.x.e->xbutton.window;
if (win == self->max) {
self->max_press = FALSE;
- render_max(self);
+ render(self);
} else if (win == self->close) {
self->close_press = FALSE;
- render_close(self);
+ render(self);
} else if (win == self->iconify) {
self->iconify_press = FALSE;
- render_iconify(self);
+ render(self);
} else if (win == self->desk) {
self->desk_press = FALSE;
- render_desk(self);
+ render(self);
}
}