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,33 +26,53 @@ 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) {
|
||||||
|
|
Loading…
Reference in a new issue