From b026bd2eccf433465d8ce36d96dbfb77fa6d9400 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Thu, 14 Feb 2008 12:15:30 -0500 Subject: [PATCH] make ObPrompts resize and redraw correctly when reconfiguring and changing themes with them open --- openbox/prompt.c | 67 ++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/openbox/prompt.c b/openbox/prompt.c index aa5eb06..71825b1 100644 --- a/openbox/prompt.c +++ b/openbox/prompt.c @@ -29,6 +29,7 @@ static GList *prompt_list = NULL; /* we construct these */ +static RrAppearance *prompt_a_bg; static RrAppearance *prompt_a_button; static RrAppearance *prompt_a_focus; static RrAppearance *prompt_a_press; @@ -38,11 +39,15 @@ static RrAppearance *prompt_a_msg; static void prompt_layout(ObPrompt *self); static void render_all(ObPrompt *self); static void render_button(ObPrompt *self, ObPromptElement *e); +static void prompt_resize(ObPrompt *self, gint w, gint h); void prompt_startup(gboolean reconfig) { RrColor *c_button, *c_focus, *c_press; + /* note: this is not a copy, don't free it */ + prompt_a_bg = ob_rr_theme->osd_hilite_bg; + prompt_a_button = RrAppearanceCopy(ob_rr_theme->a_focused_unpressed_close); prompt_a_focus = RrAppearanceCopy(ob_rr_theme->a_hover_focused_close); prompt_a_press = RrAppearanceCopy(ob_rr_theme->a_focused_pressed_close); @@ -103,7 +108,6 @@ ObPrompt* prompt_new(const gchar *msg, gint i; attrib.override_redirect = FALSE; - attrib.border_pixel = RrColorPixel(ob_rr_theme->osd_border_color); self = g_new0(ObPrompt, 1); self->ref = 1; @@ -113,10 +117,10 @@ ObPrompt* prompt_new(const gchar *msg, self->cancel_result = cancel_result; self->super.type = OB_WINDOW_CLASS_PROMPT; self->super.window = XCreateWindow(obt_display, obt_root(ob_screen), - 0, 0, 1, 1, ob_rr_theme->obwidth, + 0, 0, 1, 1, 0, CopyFromParent, InputOutput, CopyFromParent, - CWOverrideRedirect | CWBorderPixel, + CWOverrideRedirect, &attrib); /* make it a dialog type window */ @@ -126,9 +130,6 @@ ObPrompt* prompt_new(const gchar *msg, /* listen for key presses on the window */ self->event_mask = KeyPressMask; - /* we make a copy of this appearance for each prompt */ - self->a_bg = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg); - /* set up the text message widow */ self->msg.text = g_strdup(msg); self->msg.window = XCreateWindow(obt_display, self->super.window, @@ -193,9 +194,6 @@ void prompt_unref(ObPrompt *self) } XDestroyWindow(obt_display, self->msg.window); - - RrAppearanceFree(self->a_bg); - XDestroyWindow(obt_display, self->super.window); g_free(self); } @@ -216,7 +214,7 @@ static void prompt_layout(ObPrompt *self) const gint BUTTON_HMARGIN = 12; const gint MAX_WIDTH = 600; - RrMargins(self->a_bg, &l, &t, &r, &b); + RrMargins(prompt_a_bg, &l, &t, &r, &b); l += OUTSIDE_MARGIN; t += OUTSIDE_MARGIN; r += OUTSIDE_MARGIN; @@ -278,11 +276,9 @@ static void prompt_layout(ObPrompt *self) } /* size and position the toplevel window */ - self->width = w + l + r; - self->height = h + t + b; + prompt_resize(self, w + l + r, h + t + b); - /* move and resize the actual windows */ - XResizeWindow(obt_display, self->super.window, self->width, self->height); + /* move and resize the internal windows */ XMoveResizeWindow(obt_display, self->msg.window, self->msg.x, self->msg.y, self->msg.width, self->msg.height); @@ -292,6 +288,36 @@ static void prompt_layout(ObPrompt *self) self->button[i].width, self->button[i].height); } +static void prompt_resize(ObPrompt *self, gint w, gint h) +{ + XConfigureRequestEvent req; + XSizeHints hints; + + self->width = w; + self->height = h; + + /* the user can't resize the prompt */ + hints.flags = PMinSize | PMaxSize; + hints.min_width = hints.max_width = w; + hints.min_height = hints.max_height = h; + XSetWMNormalHints(obt_display, self->super.window, &hints); + + if (self->mapped) { + /* send a configure request like a normal client would */ + req.type = ConfigureRequest; + req.display = obt_display; + req.parent = obt_root(ob_screen); + req.window = self->super.window; + req.width = w; + req.height = h; + req.value_mask = CWWidth | CWHeight; + XSendEvent(req.display, req.window, FALSE, StructureNotifyMask, + (XEvent*)&req); + } + else + XResizeWindow(obt_display, self->super.window, w, h); +} + static void render_button(ObPrompt *self, ObPromptElement *e) { RrAppearance *a; @@ -300,7 +326,7 @@ static void render_button(ObPrompt *self, ObPromptElement *e) else if (self->focus == e) a = prompt_a_focus; else a = prompt_a_button; - a->surface.parent = self->a_bg; + a->surface.parent = prompt_a_bg; a->surface.parentx = e->x; a->surface.parentx = e->y; @@ -312,9 +338,9 @@ static void render_all(ObPrompt *self) { gint i; - RrPaint(self->a_bg, self->super.window, self->width, self->height); + RrPaint(prompt_a_bg, self->super.window, self->width, self->height); - prompt_a_msg->surface.parent = self->a_bg; + prompt_a_msg->surface.parent = prompt_a_bg; prompt_a_msg->surface.parentx = self->msg.x; prompt_a_msg->surface.parenty = self->msg.y; @@ -328,7 +354,6 @@ static void render_all(ObPrompt *self) void prompt_show(ObPrompt *self, ObClient *parent) { - XSizeHints hints; gint i; if (self->mapped) { @@ -349,12 +374,6 @@ void prompt_show(ObPrompt *self, ObClient *parent) break; } - /* you can't resize the prompt */ - hints.flags = PMinSize | PMaxSize; - hints.min_width = hints.max_width = self->width; - hints.min_height = hints.max_height = self->height; - XSetWMNormalHints(obt_display, self->super.window, &hints); - XSetTransientForHint(obt_display, self->super.window, (parent ? parent->window : 0)); -- 1.9.1