make focus/desktop popups wider based on the screen size with the old size as a minimum.
left-align the desktop dialog.. i think better dialogs would be nice. and to make them hide or something when you switch desktops while switching windows etc.
gint strw, strh;
Rect *a;
- RrMinsize(dock->a_frame, &minw, &minh);
+ RrMinSize(dock->a_frame, &minw, &minh);
dock->w = dock->h = 0;
a = screen_physical_area_monitor(0);
icon_popup_position(focus_cycle_popup, CenterGravity,
a->x + a->width / 2, a->y + a->height / 2);
-/* icon_popup_size(focus_cycle_popup, a->height/2, a->height/16);
- icon_popup_show(focus_cycle_popup, c->title,
- client_icon(c, a->height/16, a->height/16));
-*/
- /* XXX the size and the font extents need to be related on some level
- */
- icon_popup_size(focus_cycle_popup, POPUP_WIDTH, POPUP_HEIGHT);
+ icon_popup_width(focus_cycle_popup, MAX(a->width/3, POPUP_WIDTH));
+ icon_popup_height(focus_cycle_popup, POPUP_HEIGHT);
/* use the transient's parent's title/icon */
while (p->transient_for && p->transient_for != OB_TRAN_GROUP)
gint l, t, r, b;
e->a_text_normal->texture[0].data.text.string = "";
- RrMinsize(e->a_text_normal, &tw, &th);
+ RrMinSize(e->a_text_normal, &tw, &th);
tw += 2*PADDING;
th += 2*PADDING;
self->item_h = th;
switch (e->entry->type) {
case OB_MENU_ENTRY_TYPE_NORMAL:
text_a->texture[0].data.text.string = e->entry->data.normal.label;
- RrMinsize(text_a, &tw, &th);
+ RrMinSize(text_a, &tw, &th);
tw = MIN(tw, MAX_MENU_WIDTH);
if (e->entry->data.normal.icon_data ||
case OB_MENU_ENTRY_TYPE_SUBMENU:
sub = e->entry->data.submenu.submenu;
text_a->texture[0].data.text.string = sub ? sub->title : "";
- RrMinsize(text_a, &tw, &th);
+ RrMinSize(text_a, &tw, &th);
tw = MIN(tw, MAX_MENU_WIDTH);
if (e->entry->data.normal.icon_data ||
if (e->entry->data.separator.label != NULL) {
e->a_text_title->texture[0].data.text.string =
e->entry->data.separator.label;
- RrMinsize(e->a_text_title, &tw, &th);
+ RrMinSize(e->a_text_title, &tw, &th);
tw = MIN(tw, MAX_MENU_WIDTH);
th = ob_rr_theme->menu_title_height +
(ob_rr_theme->mbwidth - PADDING) *2;
self->y = y;
}
-void popup_size(ObPopup *self, gint w, gint h)
+void popup_width(ObPopup *self, gint w)
{
self->w = w;
- self->h = h;
}
-void popup_size_to_string(ObPopup *self, gchar *text)
+void popup_height(ObPopup *self, gint h)
{
- gint textw, texth;
- gint iconw;
+ gint texth;
- self->a_text->texture[0].data.text.string = text;
- RrMinsize(self->a_text, &textw, &texth);
- /*XXX textw += ob_rr_theme->bevel * 2;*/
- texth += ob_rr_theme->paddingy * 2;
+ /* don't let the height be smaller than the text */
+ texth = RrMinHeight(self->a_text) + ob_rr_theme->paddingy * 2;
+ self->h = MAX(h, texth);
+}
- self->h = texth + ob_rr_theme->paddingy * 2;
- iconw = (self->hasicon ? texth : 0);
+void popup_width_to_string(ObPopup *self, gchar *text, gint max)
+{
+ gint textw, iconw;
+
+ self->a_text->texture[0].data.text.string = text;
+ textw = RrMinWidth(self->a_text);
+ if (self->hasicon) {
+ gint texth = RrMinHeight(self->a_text) + ob_rr_theme->paddingy * 2;
+ iconw = texth;
+ } else
+ iconw = 0;
self->w = textw + iconw + ob_rr_theme->paddingx * (self->hasicon ? 3 : 2);
+ /* cap it at "max" */
+ if (max > 0)
+ self->w = MIN(self->w, max);
+}
+
+void popup_height_to_string(ObPopup *self, gchar *text)
+{
+ self->h = RrMinHeight(self->a_text) + ob_rr_theme->paddingy * 2;
+}
+
+void popup_width_to_strings(ObPopup *self, gchar **strings, gint max)
+{
+ gint i, maxw;
+
+ maxw = 0;
+ for (i = 0; strings[i] != NULL; ++i) {
+ popup_width_to_string(self, strings[i], max);
+ maxw = MAX(maxw, self->w);
+ }
+ self->w = maxw;
}
void popup_set_text_align(ObPopup *self, RrJustify align)
/* set up the textures */
self->a_text->texture[0].data.text.string = text;
- /* measure the shit out */
- RrMinsize(self->a_text, &textw, &texth);
- /*XXX textw += ob_rr_theme->padding * 2;*/
+ /* measure the text out */
+ RrMinSize(self->a_text, &textw, &texth);
texth += ob_rr_theme->paddingy * 2;
/* set the sizes up and reget the text sizes from the calculated
void popup_position(ObPopup *self, gint gravity, gint x, gint y);
/*! Set the sizes for the popup. When set to 0, the size will be based on
the text size. */
-void popup_size(ObPopup *self, gint w, gint h);
-void popup_size_to_string(ObPopup *self, gchar *text);
+void popup_width(ObPopup *self, gint w);
+void popup_height(ObPopup *self, gint w);
+void popup_width_to_string(ObPopup *self, gchar *text, gint max);
+void popup_height_to_string(ObPopup *self, gchar *text);
+void popup_width_to_strings(ObPopup *self, gchar **strings, gint max);
void popup_set_text_align(ObPopup *self, RrJustify align);
gchar *text, const struct _ObClientIcon *icon);
#define icon_popup_hide(p) popup_hide((p)->popup)
#define icon_popup_position(p, g, x, y) popup_position((p)->popup,(g),(x),(y))
-#define icon_popup_size(p, w, h) popup_size((p)->popup,(w),(h))
-#define icon_popup_size_to_string(p, s) popup_size_to_string((p)->popup,(s))
+#define icon_popup_width(p, w) popup_width((p)->popup,(w))
+#define icon_popup_height(p, h) popup_height((p)->popup,(h))
+#define icon_popup_width_to_string(p, s, m) \
+ popup_width_to_string((p)->popup,(s),(m))
+#define icon_popup_width_to_strings(p, s, m) \
+ popup_width_to_strings((p)->popup,(s),(m))
#define icon_popup_set_text_align(p, j) popup_set_text_align((p)->popup,(j))
ObPagerPopup *pager_popup_new();
void pager_popup_show(ObPagerPopup *self, gchar *text, guint desk);
#define pager_popup_hide(p) popup_hide((p)->popup)
#define pager_popup_position(p, g, x, y) popup_position((p)->popup,(g),(x),(y))
-#define pager_popup_size(p, w, h) popup_size((p)->popup,(w),(h))
-#define pager_popup_size_to_string(p, s) popup_size_to_string((p)->popup,(s))
+#define pager_popup_width(p, w) popup_width((p)->popup,(w))
+#define pager_popup_height(p, h) popup_height((p)->popup,(h))
+#define pager_popup_width_to_string(p, s, m) \
+ popup_width_to_string((p)->popup,(s),(m))
+#define pager_popup_width_to_strings(p, s, m) \
+ popup_width_to_strings((p)->popup,(s),(m))
#define pager_popup_set_text_align(p, j) popup_set_text_align((p)->popup,(j))
#endif
a = screen_physical_area_monitor(0);
pager_popup_position(desktop_cycle_popup, CenterGravity,
a->x + a->width / 2, a->y + a->height / 2);
- /* XXX the size and the font extents need to be related on some level
- */
- pager_popup_size(desktop_cycle_popup, POPUP_WIDTH, POPUP_HEIGHT);
-
- pager_popup_set_text_align(desktop_cycle_popup, RR_JUSTIFY_CENTER);
+ pager_popup_width(desktop_cycle_popup, MAX(a->width/3, POPUP_WIDTH));
+ pager_popup_height(desktop_cycle_popup, POPUP_HEIGHT);
pager_popup_show(desktop_cycle_popup, screen_desktop_names[d], d);
}
}
}
-void RrMinsize(RrAppearance *a, gint *w, gint *h)
+void RrMinSize(RrAppearance *a, gint *w, gint *h)
+{
+ *w = RrMinWidth(a);
+ *h = RrMinHeight(a);
+}
+
+gint RrMinWidth(RrAppearance *a)
{
gint i;
RrSize *m;
gint l, t, r, b;
- *w = *h = 0;
+ gint w = 0;
for (i = 0; i < a->textures; ++i) {
switch (a->texture[i].type) {
case RR_TEXTURE_NONE:
break;
case RR_TEXTURE_MASK:
- *w = MAX(*w, a->texture[i].data.mask.mask->width);
- *h = MAX(*h, a->texture[i].data.mask.mask->height);
+ w = MAX(w, a->texture[i].data.mask.mask->width);
break;
case RR_TEXTURE_TEXT:
m = RrFontMeasureString(a->texture[i].data.text.font,
a->texture[i].data.text.string,
a->texture[i].data.text.shadow_offset_x,
a->texture[i].data.text.shadow_offset_y);
- *w = MAX(*w, m->width + 4);
- m->height = RrFontHeight(a->texture[i].data.text.font,
- a->texture[i].data.text.shadow_offset_y);
- *h += MAX(*h, m->height);
+ w = MAX(w, m->width + 4);
g_free(m);
break;
case RR_TEXTURE_RGBA:
- *w += MAX(*w, a->texture[i].data.rgba.width);
- *h += MAX(*h, a->texture[i].data.rgba.height);
+ w += MAX(w, a->texture[i].data.rgba.width);
+ break;
+ case RR_TEXTURE_LINE_ART:
+ w += MAX(w, MAX(a->texture[i].data.lineart.x1,
+ a->texture[i].data.lineart.x2));
+ break;
+ }
+ }
+
+ RrMargins(a, &l, &t, &r, &b);
+
+ w += l + r;
+
+ if (w < 1) w = 1;
+ return w;
+}
+
+gint RrMinHeight(RrAppearance *a)
+{
+ gint i;
+ gint l, t, r, b;
+ gint h = 0;
+
+ for (i = 0; i < a->textures; ++i) {
+ switch (a->texture[i].type) {
+ case RR_TEXTURE_NONE:
+ break;
+ case RR_TEXTURE_MASK:
+ h = MAX(h, a->texture[i].data.mask.mask->height);
+ break;
+ case RR_TEXTURE_TEXT:
+ h += MAX(h, RrFontHeight(a->texture[i].data.text.font,
+ a->texture[i].data.text.shadow_offset_y));
+ break;
+ case RR_TEXTURE_RGBA:
+ h += MAX(h, a->texture[i].data.rgba.height);
break;
case RR_TEXTURE_LINE_ART:
- *w += MAX(*w, MAX(a->texture[i].data.lineart.x1,
- a->texture[i].data.lineart.x2));
- *h += MAX(*h, MAX(a->texture[i].data.lineart.y1,
- a->texture[i].data.lineart.y2));
+ h += MAX(h, MAX(a->texture[i].data.lineart.y1,
+ a->texture[i].data.lineart.y2));
break;
}
}
RrMargins(a, &l, &t, &r, &b);
- *w += l + r;
- *h += t + b;
+ h += t + b;
- if (*w < 1) *w = 1;
- if (*h < 1) *h = 1;
+ if (h < 1) h = 1;
+ return h;
}
static void reverse_bits(gchar *c, gint n)
it is non-null. */
Pixmap RrPaintPixmap (RrAppearance *a, gint w, gint h);
void RrPaint (RrAppearance *a, Window win, gint w, gint h);
-void RrMinsize (RrAppearance *a, gint *w, gint *h);
+void RrMinSize (RrAppearance *a, gint *w, gint *h);
+gint RrMinWidth (RrAppearance *a);
+gint RrMinHeight (RrAppearance *a);
void RrMargins (RrAppearance *a, gint *l, gint *t, gint *r, gint *b);
gboolean RrPixmapToRGBA(const RrInstance *inst,