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:
Dana Jansens 2003-06-29 17:18:19 +00:00
parent 2f9efb384d
commit dd80df31c4

View file

@ -26,32 +26,52 @@ typedef struct Popup {
Popup *popup_new(gboolean hasicon) Popup *popup_new(gboolean hasicon)
{ {
XSetWindowAttributes attrib;
Popup *self = g_new(Popup, 1); Popup *self = g_new(Popup, 1);
self->obwin.type = Window_Internal; self->obwin.type = Window_Internal;
self->hasicon = hasicon; self->hasicon = hasicon;
self->bg = None;
self->a_text = NULL; self->a_text = NULL;
self->gravity = NorthWestGravity; self->gravity = NorthWestGravity;
self->x = self->y = self->w = self->h = 0; self->x = self->y = self->w = self->h = 0;
self->mapped = FALSE; 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)); stacking_add(INTERNAL_AS_WINDOW(self));
return self; return self;
} }
void popup_free(Popup *self) void popup_free(Popup *self)
{ {
if (self->bg) { if (self) {
XDestroyWindow(ob_display, self->bg); XDestroyWindow(ob_display, self->bg);
XDestroyWindow(ob_display, self->text); XDestroyWindow(ob_display, self->text);
XDestroyWindow(ob_display, self->icon); XDestroyWindow(ob_display, self->icon);
RrAppearanceFree(self->a_bg); RrAppearanceFree(self->a_bg);
if (self->hasicon)
RrAppearanceFree(self->a_icon); RrAppearanceFree(self->a_icon);
}
if (self->a_text)
RrAppearanceFree(self->a_text); RrAppearanceFree(self->a_text);
stacking_remove(self); stacking_remove(self);
g_free(self); g_free(self);
}
} }
void popup_position(Popup *self, int gravity, int x, int y) 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) void popup_show(Popup *self, char *text, Icon *icon)
{ {
XSetWindowAttributes attrib;
int x, y, w, h; int x, y, w, h;
int textw, texth; int textw, texth;
int iconw; int iconw;
/* create the shit if needed */ /* create the shit if needed */
if (!self->bg) { if (!self->a_bg)
attrib.override_redirect = True; self->a_bg = RrAppearanceCopy(ob_rr_theme->app_hilite_bg);
self->bg = XCreateWindow(ob_display, ob_root, if (self->hasicon && !self->a_icon)
0, 0, 1, 1, 0, RrDepth(ob_rr_inst), self->a_icon = RrAppearanceCopy(ob_rr_theme->app_icon);
InputOutput, RrVisual(ob_rr_inst), if (!self->a_text)
CWOverrideRedirect, &attrib); self->a_text = RrAppearanceCopy(ob_rr_theme->app_hilite_label);
XSetWindowBorderWidth(ob_display, self->bg, ob_rr_theme->bwidth); XSetWindowBorderWidth(ob_display, self->bg, ob_rr_theme->bwidth);
XSetWindowBorder(ob_display, self->bg, ob_rr_theme->b_color->pixel); 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);
self->a_bg = RrAppearanceCopy(ob_rr_theme->app_hilite_bg);
if (self->hasicon)
self->a_icon = RrAppearanceCopy(ob_rr_theme->app_icon);
}
if (!self->a_text)
self->a_text = RrAppearanceCopy(ob_rr_theme->app_hilite_label);
/* set up the textures */ /* set up the textures */
self->a_text->texture[0].data.text.string = text; self->a_text->texture[0].data.text.string = text;
if (self->hasicon) { if (self->hasicon) {