X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fframe.c;h=a9e287dcad0a7c68f4bdaf290711f828a2b1e620;hb=276b2be581c6cb138b439537761ff2ca42201805;hp=f344f9e5c79afa08e782e6b94323e385e67972d3;hpb=16a9ac018ed77e245e873be60729be509fa1ce92;p=chaz%2Fopenbox diff --git a/openbox/frame.c b/openbox/frame.c index f344f9e5..a9e287dc 100644 --- a/openbox/frame.c +++ b/openbox/frame.c @@ -14,65 +14,6 @@ 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() @@ -83,8 +24,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, - mask, attrib); + RrDepth(ob_rr_inst), InputOutput, + RrVisual(ob_rr_inst), mask, attrib); } @@ -97,6 +38,7 @@ Frame *frame_new() self = g_new(Frame, 1); self->visible = FALSE; + self->decorations = 0; /* create all of the decor windows */ mask = CWOverrideRedirect | CWEventMask; @@ -119,9 +61,9 @@ Frame *frame_new() self->iconify = createWindow(self->title, mask, &attrib); self->handle = createWindow(self->window, mask, &attrib); mask |= CWCursor; - attrib.cursor = ob_cursors.bl; + attrib.cursor = ob_cursor(OB_CURSOR_SOUTHWEST); self->lgrip = createWindow(self->handle, mask, &attrib); - attrib.cursor = ob_cursors.br; + attrib.cursor = ob_cursor(OB_CURSOR_SOUTHEAST); self->rgrip = createWindow(self->handle, mask, &attrib); self->focused = FALSE; @@ -133,35 +75,37 @@ Frame *frame_new() XMapWindow(ob_display, self->label); /* set colors/appearance/sizes for stuff that doesn't change */ - XSetWindowBorder(ob_display, self->window, theme_b_color->pixel); - XSetWindowBorder(ob_display, self->label, theme_b_color->pixel); - XSetWindowBorder(ob_display, self->rgrip, theme_b_color->pixel); - XSetWindowBorder(ob_display, self->lgrip, theme_b_color->pixel); + XSetWindowBorder(ob_display, self->window, ob_rr_theme->b_color->pixel); + XSetWindowBorder(ob_display, self->label, ob_rr_theme->b_color->pixel); + XSetWindowBorder(ob_display, self->rgrip, ob_rr_theme->b_color->pixel); + XSetWindowBorder(ob_display, self->lgrip, ob_rr_theme->b_color->pixel); - XResizeWindow(ob_display, self->max, theme_button_size, theme_button_size); + XResizeWindow(ob_display, self->max, + ob_rr_theme->button_size, ob_rr_theme->button_size); XResizeWindow(ob_display, self->iconify, - theme_button_size, theme_button_size); + ob_rr_theme->button_size, ob_rr_theme->button_size); XResizeWindow(ob_display, self->icon, - theme_button_size + 2, theme_button_size + 2); + ob_rr_theme->button_size + 2, ob_rr_theme->button_size + 2); XResizeWindow(ob_display, self->close, - theme_button_size, theme_button_size); + ob_rr_theme->button_size, ob_rr_theme->button_size); XResizeWindow(ob_display, self->desk, - theme_button_size, theme_button_size); + ob_rr_theme->button_size, ob_rr_theme->button_size); XResizeWindow(ob_display, self->shade, - theme_button_size, theme_button_size); + ob_rr_theme->button_size, ob_rr_theme->button_size); XResizeWindow(ob_display, self->lgrip, - theme_grip_width, theme_handle_height); + ob_rr_theme->grip_width, ob_rr_theme->handle_height); XResizeWindow(ob_display, self->rgrip, - theme_grip_width, theme_handle_height); + ob_rr_theme->grip_width, ob_rr_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->a_unfocused_title = RrAppearanceCopy(ob_rr_theme->a_unfocused_title); + self->a_focused_title = RrAppearanceCopy(ob_rr_theme->a_focused_title); + self->a_unfocused_label = RrAppearanceCopy(ob_rr_theme->a_unfocused_label); + self->a_focused_label = RrAppearanceCopy(ob_rr_theme->a_focused_label); + self->a_unfocused_handle = + RrAppearanceCopy(ob_rr_theme->a_unfocused_handle); + self->a_focused_handle = RrAppearanceCopy(ob_rr_theme->a_focused_handle); + self->a_icon = RrAppearanceCopy(ob_rr_theme->a_icon); self->max_press = self->close_press = self->desk_press = self->iconify_press = self->shade_press = FALSE; @@ -171,13 +115,13 @@ 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); + RrAppearanceFree(self->a_unfocused_title); + RrAppearanceFree(self->a_focused_title); + RrAppearanceFree(self->a_unfocused_label); + RrAppearanceFree(self->a_focused_label); + RrAppearanceFree(self->a_unfocused_handle); + RrAppearanceFree(self->a_focused_handle); + RrAppearanceFree(self->a_icon); XDestroyWindow(ob_display, self->window); @@ -222,20 +166,20 @@ void frame_adjust_shape(Frame *self) ShapeBounding, ShapeSet); num = 0; - if (self->client->decorations & Decor_Titlebar) { - xrect[0].x = -theme_bevel; - xrect[0].y = -theme_bevel; + if (self->decorations & Decor_Titlebar) { + xrect[0].x = -ob_rr_theme->bevel; + xrect[0].y = -ob_rr_theme->bevel; xrect[0].width = self->width + self->bwidth * 2; - xrect[0].height = theme_title_height + + xrect[0].height = ob_rr_theme->title_height + self->bwidth * 2; ++num; } - if (self->client->decorations & Decor_Handle) { - xrect[1].x = -theme_bevel; + if (self->decorations & Decor_Handle) { + xrect[1].x = -ob_rr_theme->bevel; xrect[1].y = FRAME_HANDLE_Y(self); xrect[1].width = self->width + self->bwidth * 2; - xrect[1].height = theme_handle_height + + xrect[1].height = ob_rr_theme->handle_height + self->bwidth * 2; ++num; } @@ -250,9 +194,10 @@ 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; + self->decorations = self->client->decorations; + if (self->decorations & Decor_Border) { + self->bwidth = ob_rr_theme->bwidth; + self->cbwidth = ob_rr_theme->cbwidth; } else { self->bwidth = self->cbwidth = 0; } @@ -280,55 +225,36 @@ void frame_adjust_area(Frame *self, gboolean moved, gboolean resized) self->max_x = -1; self->close_x = -1; - if (self->client->decorations & Decor_Titlebar) { + if (self->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; + self->width, ob_rr_theme->title_height); + self->innersize.top += ob_rr_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) { + if (self->decorations & Decor_Handle) { XMoveResizeWindow(ob_display, self->handle, -self->bwidth, FRAME_HANDLE_Y(self), - self->width, theme_handle_height); + self->width, ob_rr_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 + + ob_rr_theme->grip_width, -self->bwidth); + self->innersize.bottom += ob_rr_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); - + /* XXX make a subwindow with these dimentions? + ob_rr_theme->grip_width + self->bwidth, 0, + self->width - (ob_rr_theme->grip_width + self->bwidth) * 2, + ob_rr_theme->handle_height); + */ } else XUnmapWindow(ob_display, self->handle); } @@ -356,7 +282,7 @@ void frame_adjust_area(Frame *self, gboolean moved, gboolean 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->shaded ? ob_rr_theme->title_height + self->bwidth*2: self->client->area.height + self->size.top + self->size.bottom)); @@ -418,7 +344,7 @@ void frame_grab_client(Frame *self, Client *client) member set the root window, and one set to the client, but both get handled and need to be ignored. */ - if (ob_state == State_Starting) + if (ob_state == OB_STATE_STARTING) client->ignore_unmaps += 2; /* select the event mask on the client's parent (to receive config/map @@ -430,20 +356,20 @@ void frame_grab_client(Frame *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, &self->window, client); - g_hash_table_insert(client_map, &self->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->shade, 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); + /* 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); } void frame_release_client(Frame *self, Client *client) @@ -456,8 +382,12 @@ void frame_release_client(Frame *self, Client *client) if (XCheckTypedWindowEvent(ob_display, client->window, ReparentNotify, &ev)) { XPutBackEvent(ob_display, &ev); + /* re-map the window since the unmanaging process unmaps it */ - XMapWindow(ob_display, client->window); + + /* XXX ... um no it doesnt it unmaps its parent, the window itself + retains its mapped state, no?! XXX + XMapWindow(ob_display, client->window); */ } else { /* according to the ICCCM - if the client doesn't reparent itself, then we will reparent the window to root for them */ @@ -466,20 +396,20 @@ void frame_release_client(Frame *self, Client *client) client->area.y); } - /* remove all the windows for the frame from the client_map */ - g_hash_table_remove(client_map, &self->window); - g_hash_table_remove(client_map, &self->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->shade); - 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); + /* 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); } @@ -493,55 +423,61 @@ static void layout_title(Frame *self) 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) { + self->label_width = self->width - (ob_rr_theme->bevel + 1) * 2; + for (lc = ob_rr_theme->title_layout; *lc != '\0'; ++lc) { switch (*lc) { case 'N': - if (!(self->client->decorations & Decor_Icon)) break; + if (!(self->decorations & Decor_Icon)) break; if (n) { *lc = ' '; break; } /* rm duplicates */ n = TRUE; - self->label_width -= theme_button_size + 2 + theme_bevel + 1; + self->label_width -= (ob_rr_theme->button_size + 2 + + ob_rr_theme->bevel + 1); break; case 'D': - if (!(self->client->decorations & Decor_AllDesktops)) break; + if (!(self->decorations & Decor_AllDesktops)) break; if (d) { *lc = ' '; break; } /* rm duplicates */ d = TRUE; - self->label_width -= theme_button_size + theme_bevel + 1; + self->label_width -= (ob_rr_theme->button_size + + ob_rr_theme->bevel + 1); break; case 'S': - if (!(self->client->decorations & Decor_Shade)) break; + if (!(self->decorations & Decor_Shade)) break; if (s) { *lc = ' '; break; } /* rm duplicates */ s = TRUE; - self->label_width -= theme_button_size + theme_bevel + 1; + self->label_width -= (ob_rr_theme->button_size + + ob_rr_theme->bevel + 1); break; case 'I': - if (!(self->client->decorations & Decor_Iconify)) break; + if (!(self->decorations & Decor_Iconify)) break; if (i) { *lc = ' '; break; } /* rm duplicates */ i = TRUE; - self->label_width -= theme_button_size + theme_bevel + 1; + self->label_width -= (ob_rr_theme->button_size + + ob_rr_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 (!(self->decorations & Decor_Maximize)) break; if (m) { *lc = ' '; break; } /* rm duplicates */ m = TRUE; - self->label_width -= theme_button_size + theme_bevel + 1; + self->label_width -= (ob_rr_theme->button_size + + ob_rr_theme->bevel + 1); break; case 'C': - if (!(self->client->decorations & Decor_Close)) break; + if (!(self->decorations & Decor_Close)) break; if (c) { *lc = ' '; break; } /* rm duplicates */ c = TRUE; - self->label_width -= theme_button_size + theme_bevel + 1; + self->label_width -= (ob_rr_theme->button_size + + ob_rr_theme->bevel + 1); break; } } if (self->label_width < 1) self->label_width = 1; XResizeWindow(ob_display, self->label, self->label_width, - theme_label_height); + ob_rr_theme->label_height); if (!n) XUnmapWindow(ob_display, self->icon); if (!d) XUnmapWindow(ob_display, self->desk); @@ -551,67 +487,60 @@ static void layout_title(Frame *self) 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) { + x = ob_rr_theme->bevel + 1; + for (lc = ob_rr_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; + XMoveWindow(ob_display, self->icon, x, ob_rr_theme->bevel); + x += ob_rr_theme->button_size + 2 + ob_rr_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; + XMoveWindow(ob_display, self->desk, x, ob_rr_theme->bevel + 1); + x += ob_rr_theme->button_size + ob_rr_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; + XMoveWindow(ob_display, self->shade, x, ob_rr_theme->bevel + 1); + x += ob_rr_theme->button_size + ob_rr_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; + XMoveWindow(ob_display, self->iconify, x, ob_rr_theme->bevel + 1); + x += ob_rr_theme->button_size + ob_rr_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; + XMoveWindow(ob_display, self->label, x, ob_rr_theme->bevel); + x += self->label_width + ob_rr_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; + XMoveWindow(ob_display, self->max, x, ob_rr_theme->bevel + 1); + x += ob_rr_theme->button_size + ob_rr_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; + XMoveWindow(ob_display, self->close, x, ob_rr_theme->bevel + 1); + x += ob_rr_theme->button_size + ob_rr_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); } Context frame_context_from_string(char *name)