all repos — openbox @ b026bd2eccf433465d8ce36d96dbfb77fa6d9400

openbox fork - make it a bit more like ryudo

make ObPrompts resize and redraw correctly when reconfiguring and changing themes with them open
Dana Jansens danakj@orodu.net
commit

b026bd2eccf433465d8ce36d96dbfb77fa6d9400

parent

c8ef10a0e1d8b75a8ae6027383a5081a9a1b0ea0

1 files changed, 43 insertions(+), 24 deletions(-)

jump to
M openbox/prompt.copenbox/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,10 +39,14 @@

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);

@@ -103,7 +108,6 @@ XSetWindowAttributes attrib;

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 @@ self->default_result = default_result;

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 */

@@ -125,9 +129,6 @@ OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DIALOG));

/* 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);

@@ -193,9 +194,6 @@ XDestroyWindow(obt_display, self->button[i].window);

} XDestroyWindow(obt_display, self->msg.window); - - RrAppearanceFree(self->a_bg); - XDestroyWindow(obt_display, self->super.window); g_free(self); }

@@ -216,7 +214,7 @@ const gint BUTTON_VMARGIN = 4;

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 @@ self->button[i].y += (allbuttonsh - self->button[i].height) / 2;

} /* 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 @@ self->button[i].x, self->button[i].y,

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 @@ if (e->pressed) a = prompt_a_press;

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 @@ }

void prompt_show(ObPrompt *self, ObClient *parent) { - XSizeHints hints; gint i; if (self->mapped) {

@@ -348,12 +373,6 @@ if (self->button[i].result == self->default_result) {

self->focus = &self->button[i]; 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));