#include "openbox.h"
#include "frame.h"
+#include "window.h"
+#include "stacking.h"
#include "render/render.h"
#include "render/theme.h"
typedef struct Popup {
- gboolean hasicon;
+ ObWindow obwin;
Window bg;
+
Window icon;
Window text;
+
+ gboolean hasicon;
Appearance *a_bg;
Appearance *a_icon;
Appearance *a_text;
int y;
int w;
int h;
+ gboolean mapped;
} Popup;
Popup *popup_new(gboolean hasicon)
{
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;
+ stacking_add(INTERNAL_AS_WINDOW(self));
+ stacking_raise(INTERNAL_AS_WINDOW(self));
return self;
}
}
if (self->a_text)
appearance_free(self->a_text);
+ stacking_remove(self);
g_free(self);
}
self->h = texth + theme_bevel * 2;
iconw = (self->hasicon ? texth : 0);
- self->w = textw + iconw + theme_bevel * 3;
+ self->w = textw + iconw + theme_bevel * (self->hasicon ? 3 : 2);
}
void popup_show(Popup *self, char *text, Icon *icon)
iconw = (self->hasicon ? texth : 0);
if (self->w) {
w = self->w;
- textw = w - (iconw + theme_bevel * 3);
+ textw = w - (iconw + theme_bevel * (self->hasicon ? 3 : 2));
} else
- w = textw + iconw + theme_bevel * 3;
+ w = textw + iconw + theme_bevel * (self->hasicon ? 3 : 2);
/* sanity checks to avoid crashes! */
if (w < 1) w = 1;
if (h < 1) h = 1;
RECT_SET(self->a_text->texture[0].position, theme_bevel, theme_bevel,
textw - theme_bevel * 2, texth - theme_bevel * 2);
self->a_text->surface.data.planar.parent = self->a_bg;
- self->a_text->surface.data.planar.parentx = iconw + theme_bevel * 2;
+ self->a_text->surface.data.planar.parentx = iconw +
+ theme_bevel * (self->hasicon ? 2 : 1);
self->a_text->surface.data.planar.parenty = theme_bevel;
XMoveResizeWindow(ob_display, self->text,
- iconw + theme_bevel * 2, theme_bevel, textw, texth);
+ iconw + theme_bevel * (self->hasicon ? 2 : 1),
+ theme_bevel, textw, texth);
if (self->hasicon) {
if (iconw < 1) iconw = 1; /* sanity check for crashes */
if (self->hasicon)
paint(self->icon, self->a_icon);
- XMapWindow(ob_display, self->bg);
+ if (!self->mapped) {
+ XMapWindow(ob_display, self->bg);
+ stacking_raise(INTERNAL_AS_WINDOW(self));
+ self->mapped = TRUE;
+ }
}
void popup_hide(Popup *self)
{
- XUnmapWindow(ob_display, self->bg);
+ if (self->mapped) {
+ XUnmapWindow(ob_display, self->bg);
+ self->mapped = FALSE;
+ }
}