X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=engines%2Fopenbox%2Fopenbox.c;h=7981e8014ab4158e3019396aee899f2b29497827;hb=83508a2ad227464b84e9cd84f7172ac69bf85230;hp=a661931fff1fe9e9eb98da9d9d611cf9d25c3e81;hpb=436c85576e99f4df81273f8b510a94605e676cab;p=chaz%2Fopenbox diff --git a/engines/openbox/openbox.c b/engines/openbox/openbox.c index a661931f..7981e801 100644 --- a/engines/openbox/openbox.c +++ b/engines/openbox/openbox.c @@ -19,7 +19,6 @@ f->cbwidth) #define BUTTON_SIZE (LABEL_HEIGHT - 2) #define GRIP_WIDTH (BUTTON_SIZE * 2) -#define HANDLE_WIDTH(f) (f->width - (GRIP_WIDTH + f->bwidth) * 2) #define PLATE_EVENTMASK (SubstructureRedirectMask | ButtonPressMask) #define FRAME_EVENTMASK (EnterWindowMask | LeaveWindowMask) @@ -122,12 +121,12 @@ typedef struct ObFrame { 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); @@ -176,7 +175,7 @@ gboolean startup() 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); @@ -471,23 +470,6 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized) 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, @@ -511,10 +493,25 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized) RECT_SET_SIZE(self->frame.area, self->frame.client->area.width + self->frame.size.left + self->frame.size.right, - (self->frame.client->shaded ? TITLE_HEIGHT : + (self->frame.client->shaded ? TITLE_HEIGHT + self->bwidth*2: 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); @@ -524,8 +521,7 @@ void frame_adjust_area(ObFrame *self, gboolean moved, gboolean resized) void frame_adjust_state(ObFrame *self) { - render_max(self); - render_desk(self); + render(self); } void frame_adjust_focus(ObFrame *self) @@ -535,12 +531,12 @@ 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) @@ -570,18 +566,18 @@ 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) @@ -605,18 +601,18 @@ 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); } @@ -741,118 +737,161 @@ static void render(ObFrame *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) { - paint(self->handle, (client_focused(self->frame.client) ? - self->a_focused_handle : - self->a_unfocused_handle), - GRIP_WIDTH + self->bwidth, 0, - HANDLE_WIDTH(self), s_handle_height); - paint(self->lgrip, (client_focused(self->frame.client) ? - a_focused_grip : - a_unfocused_grip), - 0, 0, GRIP_WIDTH, s_handle_height); - paint(self->rgrip, (client_focused(self->frame.client) ? - a_focused_grip : - a_unfocused_grip), - 0, 0, GRIP_WIDTH, s_handle_height); + Appearance *h, *g; + + h = (client_focused(self->frame.client) ? + self->a_focused_handle : self->a_unfocused_handle); + g = (client_focused(self->frame.client) ? + a_focused_grip : a_unfocused_grip); + + if (g->surface.data.planar.grad == Background_ParentRelative) { + g->surface.data.planar.parent = h; + paint(self->handle, h, 0, 0, self->width, s_handle_height); + } else { + paint(self->handle, h, + GRIP_WIDTH + self->bwidth, 0, + self->width - (GRIP_WIDTH + self->bwidth) * 2, + s_handle_height); + } + + g->surface.data.planar.parentx = 0; + g->surface.data.planar.parenty = 0; + + paint(self->lgrip, g, 0, 0, GRIP_WIDTH, s_handle_height); + + g->surface.data.planar.parentx = self->width - GRIP_WIDTH; + g->surface.data.planar.parenty = 0; + + paint(self->rgrip, g, 0, 0, GRIP_WIDTH, s_handle_height); } } -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) @@ -885,16 +924,16 @@ static void frame_mouse_press(const ObEvent *e, ObFrame *self) 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); } } @@ -903,15 +942,15 @@ static void frame_mouse_release(const ObEvent *e, ObFrame *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); } }