+#include "popup.h"
+
#include "openbox.h"
#include "frame.h"
+#include "client.h"
#include "window.h"
#include "stacking.h"
#include "render/render.h"
#include "render/theme.h"
-typedef struct Popup {
+struct _ObPopup
+{
ObWindow obwin;
Window bg;
RrAppearance *a_bg;
RrAppearance *a_icon;
RrAppearance *a_text;
- int gravity;
- int x;
- int y;
- int w;
- int h;
+ gint gravity;
+ gint x;
+ gint y;
+ gint w;
+ gint h;
gboolean mapped;
-} Popup;
+};
Popup *popup_new(gboolean hasicon)
{
self->a_bg = self->a_icon = self->a_text = NULL;
attrib.override_redirect = True;
- self->bg = XCreateWindow(ob_display, ob_root,
+ self->bg = XCreateWindow(ob_display, RootWindow(ob_display, ob_screen),
0, 0, 1, 1, 0, RrDepth(ob_rr_inst),
InputOutput, RrVisual(ob_rr_inst),
CWOverrideRedirect, &attrib);
}
}
-void popup_position(Popup *self, int gravity, int x, int y)
+void popup_position(Popup *self, gint gravity, gint x, gint y)
{
self->gravity = gravity;
self->x = x;
self->y = y;
}
-void popup_size(Popup *self, int w, int h)
+void popup_size(Popup *self, gint w, gint h)
{
self->w = w;
self->h = h;
}
-void popup_size_to_string(Popup *self, char *text)
+void popup_size_to_string(Popup *self, gchar *text)
{
- int textw, texth;
- int iconw;
+ gint textw, texth;
+ gint iconw;
if (!self->a_text)
self->a_text = RrAppearanceCopy(ob_rr_theme->app_hilite_label);
self->a_text->texture[0].data.text.string = text;
RrMinsize(self->a_text, &textw, &texth);
- textw += ob_rr_theme->bevel * 2;
- texth += ob_rr_theme->bevel * 2;
+ /*XXX textw += ob_rr_theme->bevel * 2;*/
+ texth += ob_rr_theme->padding * 2;
- self->h = texth + ob_rr_theme->bevel * 2;
+ self->h = texth + ob_rr_theme->padding * 2;
iconw = (self->hasicon ? texth : 0);
- self->w = textw + iconw + ob_rr_theme->bevel * (self->hasicon ? 3 : 2);
+ self->w = textw + iconw + ob_rr_theme->padding * (self->hasicon ? 3 : 2);
}
-void popup_show(Popup *self, char *text, ObClientIcon *icon)
+void popup_set_text_align(Popup *self, RrJustify align)
{
- int x, y, w, h;
- int textw, texth;
- int iconw;
+ if (!self->a_text)
+ self->a_text = RrAppearanceCopy(ob_rr_theme->app_hilite_label);
+
+ self->a_text->texture[0].data.text.justify = align;
+}
+
+void popup_show(Popup *self, gchar *text, ObClientIcon *icon)
+{
+ gint l, t, r, b;
+ gint x, y, w, h;
+ gint textw, texth;
+ gint iconw;
/* create the shit if needed */
if (!self->a_bg)
self->a_bg = RrAppearanceCopy(ob_rr_theme->app_hilite_bg);
if (self->hasicon && !self->a_icon)
- self->a_icon = RrAppearanceCopy(ob_rr_theme->app_icon);
+ self->a_icon = RrAppearanceCopy(ob_rr_theme->a_clear_tex);
if (!self->a_text)
self->a_text = RrAppearanceCopy(ob_rr_theme->app_hilite_label);
+ RrMargins(self->a_bg, &l, &t, &r, &b);
+
XSetWindowBorderWidth(ob_display, self->bg, ob_rr_theme->bwidth);
XSetWindowBorder(ob_display, self->bg, ob_rr_theme->b_color->pixel);
/* measure the shit out */
RrMinsize(self->a_text, &textw, &texth);
- textw += ob_rr_theme->bevel * 2;
- texth += ob_rr_theme->bevel * 2;
+ /*XXX textw += ob_rr_theme->padding * 2;*/
+ texth += ob_rr_theme->padding * 2;
/* set the sizes up and reget the text sizes from the calculated
outer sizes */
if (self->h) {
h = self->h;
- texth = h - (ob_rr_theme->bevel * 2);
+ texth = h - (t+b + ob_rr_theme->padding * 2);
} else
- h = texth + ob_rr_theme->bevel * 2;
+ h = t+b + texth + ob_rr_theme->padding * 2;
iconw = (self->hasicon ? texth : 0);
if (self->w) {
w = self->w;
- textw = w - (iconw + ob_rr_theme->bevel * (self->hasicon ? 3 : 2));
+ textw = w - (l+r + iconw + ob_rr_theme->padding *
+ (self->hasicon ? 3 : 2));
} else
- w = textw + iconw + ob_rr_theme->bevel * (self->hasicon ? 3 : 2);
+ w = l+r + textw + iconw + ob_rr_theme->padding * (self->hasicon ? 3 : 2);
/* sanity checks to avoid crashes! */
if (w < 1) w = 1;
if (h < 1) h = 1;
XMoveResizeWindow(ob_display, self->bg, x, y, w, h);
self->a_text->surface.parent = self->a_bg;
- self->a_text->surface.parentx = iconw +
- ob_rr_theme->bevel * (self->hasicon ? 2 : 1);
- self->a_text->surface.parenty = ob_rr_theme->bevel;
+ self->a_text->surface.parentx = l + iconw +
+ ob_rr_theme->padding * (self->hasicon ? 2 : 1);
+ self->a_text->surface.parenty = t + ob_rr_theme->padding;
XMoveResizeWindow(ob_display, self->text,
- iconw + ob_rr_theme->bevel * (self->hasicon ? 2 : 1),
- ob_rr_theme->bevel, textw, texth);
+ l + iconw + ob_rr_theme->padding * (self->hasicon ? 2 : 1),
+ t + ob_rr_theme->padding, textw, texth);
if (self->hasicon) {
if (iconw < 1) iconw = 1; /* sanity check for crashes */
self->a_icon->surface.parent = self->a_bg;
- self->a_icon->surface.parentx = ob_rr_theme->bevel;
- self->a_icon->surface.parenty = ob_rr_theme->bevel;
+ self->a_icon->surface.parentx = l + ob_rr_theme->padding;
+ self->a_icon->surface.parenty = t + ob_rr_theme->padding;
XMoveResizeWindow(ob_display, self->icon,
- ob_rr_theme->bevel, ob_rr_theme->bevel,
+ l + ob_rr_theme->padding, t + ob_rr_theme->padding,
iconw, texth);
}