create the popup's window before adding it to the stacking list, so that it is stacked properly and doesnt wreck everything
This commit is contained in:
parent
2f9efb384d
commit
dd80df31c4
1 changed files with 34 additions and 34 deletions
|
@ -26,32 +26,52 @@ typedef struct Popup {
|
|||
|
||||
Popup *popup_new(gboolean hasicon)
|
||||
{
|
||||
XSetWindowAttributes attrib;
|
||||
Popup *self = g_new(Popup, 1);
|
||||
|
||||
self->obwin.type = Window_Internal;
|
||||
self->hasicon = hasicon;
|
||||
self->bg = None;
|
||||
self->a_text = NULL;
|
||||
self->gravity = NorthWestGravity;
|
||||
self->x = self->y = self->w = self->h = 0;
|
||||
self->mapped = FALSE;
|
||||
self->a_bg = self->a_icon = self->a_text = NULL;
|
||||
|
||||
attrib.override_redirect = True;
|
||||
self->bg = XCreateWindow(ob_display, ob_root,
|
||||
0, 0, 1, 1, 0, RrDepth(ob_rr_inst),
|
||||
InputOutput, RrVisual(ob_rr_inst),
|
||||
CWOverrideRedirect, &attrib);
|
||||
|
||||
self->text = XCreateWindow(ob_display, self->bg,
|
||||
0, 0, 1, 1, 0, RrDepth(ob_rr_inst),
|
||||
InputOutput, RrVisual(ob_rr_inst), 0, NULL);
|
||||
|
||||
if (self->hasicon)
|
||||
self->icon = XCreateWindow(ob_display, self->bg,
|
||||
0, 0, 1, 1, 0,
|
||||
RrDepth(ob_rr_inst), InputOutput,
|
||||
RrVisual(ob_rr_inst), 0, NULL);
|
||||
|
||||
XMapWindow(ob_display, self->text);
|
||||
XMapWindow(ob_display, self->icon);
|
||||
|
||||
stacking_add(INTERNAL_AS_WINDOW(self));
|
||||
return self;
|
||||
}
|
||||
|
||||
void popup_free(Popup *self)
|
||||
{
|
||||
if (self->bg) {
|
||||
if (self) {
|
||||
XDestroyWindow(ob_display, self->bg);
|
||||
XDestroyWindow(ob_display, self->text);
|
||||
XDestroyWindow(ob_display, self->icon);
|
||||
RrAppearanceFree(self->a_bg);
|
||||
if (self->hasicon)
|
||||
RrAppearanceFree(self->a_icon);
|
||||
}
|
||||
if (self->a_text)
|
||||
RrAppearanceFree(self->a_icon);
|
||||
RrAppearanceFree(self->a_text);
|
||||
stacking_remove(self);
|
||||
g_free(self);
|
||||
stacking_remove(self);
|
||||
g_free(self);
|
||||
}
|
||||
}
|
||||
|
||||
void popup_position(Popup *self, int gravity, int x, int y)
|
||||
|
@ -87,41 +107,21 @@ void popup_size_to_string(Popup *self, char *text)
|
|||
|
||||
void popup_show(Popup *self, char *text, Icon *icon)
|
||||
{
|
||||
XSetWindowAttributes attrib;
|
||||
int x, y, w, h;
|
||||
int textw, texth;
|
||||
int iconw;
|
||||
|
||||
/* create the shit if needed */
|
||||
if (!self->bg) {
|
||||
attrib.override_redirect = True;
|
||||
self->bg = XCreateWindow(ob_display, ob_root,
|
||||
0, 0, 1, 1, 0, RrDepth(ob_rr_inst),
|
||||
InputOutput, RrVisual(ob_rr_inst),
|
||||
CWOverrideRedirect, &attrib);
|
||||
|
||||
XSetWindowBorderWidth(ob_display, self->bg, ob_rr_theme->bwidth);
|
||||
XSetWindowBorder(ob_display, self->bg, ob_rr_theme->b_color->pixel);
|
||||
|
||||
self->text = XCreateWindow(ob_display, self->bg,
|
||||
0, 0, 1, 1, 0, RrDepth(ob_rr_inst),
|
||||
InputOutput, RrVisual(ob_rr_inst), 0, NULL);
|
||||
if (self->hasicon)
|
||||
self->icon = XCreateWindow(ob_display, self->bg,
|
||||
0, 0, 1, 1, 0,
|
||||
RrDepth(ob_rr_inst), InputOutput,
|
||||
RrVisual(ob_rr_inst), 0, NULL);
|
||||
|
||||
XMapWindow(ob_display, self->text);
|
||||
XMapWindow(ob_display, self->icon);
|
||||
|
||||
if (!self->a_bg)
|
||||
self->a_bg = RrAppearanceCopy(ob_rr_theme->app_hilite_bg);
|
||||
if (self->hasicon)
|
||||
self->a_icon = RrAppearanceCopy(ob_rr_theme->app_icon);
|
||||
}
|
||||
if (self->hasicon && !self->a_icon)
|
||||
self->a_icon = RrAppearanceCopy(ob_rr_theme->app_icon);
|
||||
if (!self->a_text)
|
||||
self->a_text = RrAppearanceCopy(ob_rr_theme->app_hilite_label);
|
||||
|
||||
XSetWindowBorderWidth(ob_display, self->bg, ob_rr_theme->bwidth);
|
||||
XSetWindowBorder(ob_display, self->bg, ob_rr_theme->b_color->pixel);
|
||||
|
||||
/* set up the textures */
|
||||
self->a_text->texture[0].data.text.string = text;
|
||||
if (self->hasicon) {
|
||||
|
|
Loading…
Reference in a new issue