CREATE(WM_CLIENT_MACHINE);
CREATE(WM_COMMAND);
CREATE(WM_CLIENT_LEADER);
+ CREATE(WM_TRANSIENT_FOR);
CREATE_(MOTIF_WM_HINTS);
CREATE(SM_CLIENT_ID);
OBT_PROP_WM_CLIENT_MACHINE,
OBT_PROP_WM_COMMAND,
OBT_PROP_WM_CLIENT_LEADER,
+ OBT_PROP_WM_TRANSIENT_FOR,
OBT_PROP_MOTIF_WM_HINTS,
/* SM atoms */
self->min_ratio = 0.0f;
self->max_ratio = 0.0f;
SIZE_SET(self->size_inc, 1, 1);
- SIZE_SET(self->base_size, 0, 0);
+ SIZE_SET(self->base_size, -1, -1);
SIZE_SET(self->min_size, 0, 0);
SIZE_SET(self->max_size, G_MAXINT, G_MAXINT);
0 : self->max_ratio;
/* base size is substituted with min size if not specified */
- if (self->base_size.width || self->base_size.height) {
+ if (self->base_size.width >= 0 || self->base_size.height >= 0) {
basew = self->base_size.width;
baseh = self->base_size.height;
} else {
g_free(m);
}
- prompt_show(self->kill_prompt, self);
+ prompt_show(self->kill_prompt, self, TRUE);
}
void client_kill(ObClient *self)
#include "render/theme.h"
#define PADDING 2
-#define SEPARATOR_HEIGHT 3
#define MAX_MENU_WIDTH 400
#define ITEM_HEIGHT (ob_rr_theme->menu_font_height + 2*PADDING)
ButtonPressMask | ButtonReleaseMask)
GList *menu_frame_visible;
+GHashTable *menu_frame_map;
+
+static RrAppearance *a_sep;
static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry,
ObMenuFrame *frame);
RrVisual(ob_rr_inst), mask, attrib);
}
-GHashTable *menu_frame_map;
-
void menu_frame_startup(gboolean reconfig)
{
+ gint i;
+
+ a_sep = RrAppearanceCopy(ob_rr_theme->a_clear);
+ RrAppearanceAddTextures(a_sep, ob_rr_theme->menu_sep_width);
+ for (i = 0; i < ob_rr_theme->menu_sep_width; ++i) {
+ a_sep->texture[i].type = RR_TEXTURE_LINE_ART;
+ a_sep->texture[i].data.lineart.color =
+ ob_rr_theme->menu_sep_color;
+ }
+
if (reconfig) return;
menu_frame_map = g_hash_table_new(g_int_hash, g_int_equal);
void menu_frame_shutdown(gboolean reconfig)
{
+ RrAppearanceFree(a_sep);
+
if (reconfig) return;
g_hash_table_destroy(menu_frame_map);
th = ob_rr_theme->menu_title_height;
} else {
item_a = ob_rr_theme->a_menu_normal;
- th = SEPARATOR_HEIGHT + 2*PADDING;
+ th = ob_rr_theme->menu_sep_width +
+ 2*ob_rr_theme->menu_sep_paddingy;
}
break;
default:
ob_rr_theme->menu_title_height -
2*ob_rr_theme->paddingy);
} else {
- RrAppearance *clear;
-
- /* unlabeled separaator */
- XMoveResizeWindow(obt_display, self->text, PADDING, PADDING,
- self->area.width - 2*PADDING, SEPARATOR_HEIGHT);
-
- clear = ob_rr_theme->a_clear_tex;
- RrAppearanceClearTextures(clear);
- clear->texture[0].type = RR_TEXTURE_LINE_ART;
- clear->surface.parent = item_a;
- clear->surface.parentx = PADDING;
- clear->surface.parenty = PADDING;
- clear->texture[0].data.lineart.color =
- text_a->texture[0].data.text.color;
- clear->texture[0].data.lineart.x1 = 2*PADDING;
- clear->texture[0].data.lineart.y1 = SEPARATOR_HEIGHT/2;
- clear->texture[0].data.lineart.x2 = self->area.width - 4*PADDING;
- clear->texture[0].data.lineart.y2 = SEPARATOR_HEIGHT/2;
- RrPaint(clear, self->text,
- self->area.width - 2*PADDING, SEPARATOR_HEIGHT);
+ gint i;
+
+ /* unlabeled separator */
+ XMoveResizeWindow(obt_display, self->text, 0, 0,
+ self->area.width,
+ ob_rr_theme->menu_sep_width +
+ 2*ob_rr_theme->menu_sep_paddingy);
+
+ a_sep->surface.parent = item_a;
+ a_sep->surface.parentx = 0;
+ a_sep->surface.parenty = 0;
+ for (i = 0; i < ob_rr_theme->menu_sep_width; ++i) {
+ a_sep->texture[i].data.lineart.x1 =
+ ob_rr_theme->menu_sep_paddingx;
+ a_sep->texture[i].data.lineart.y1 =
+ ob_rr_theme->menu_sep_paddingy + i;
+ a_sep->texture[i].data.lineart.x2 =
+ self->area.width - ob_rr_theme->menu_sep_paddingx - 1;
+ a_sep->texture[i].data.lineart.y2 =
+ ob_rr_theme->menu_sep_paddingy + i;
+ }
+
+ RrPaint(a_sep, self->text, self->area.width,
+ ob_rr_theme->menu_sep_width +
+ 2*ob_rr_theme->menu_sep_paddingy);
}
break;
}
if (last_entry)
h -= ob_rr_theme->mbwidth;
} else {
- h += SEPARATOR_HEIGHT;
+ h += ob_rr_theme->menu_sep_width +
+ 2*ob_rr_theme->menu_sep_paddingy - PADDING * 2;
}
break;
}
(ob_rr_theme->mbwidth - PADDING) *2;
} else {
tw = 0;
- th = SEPARATOR_HEIGHT;
+ th = ob_rr_theme->menu_sep_width +
+ 2*ob_rr_theme->menu_sep_paddingy - 2*PADDING;
}
break;
}
#include "openbox.h"
#include "screen.h"
#include "client.h"
+#include "group.h"
#include "event.h"
#include "obt/display.h"
#include "obt/keyboard.h"
render_button(self, &self->button[i]);
}
-void prompt_show(ObPrompt *self, ObClient *parent)
+void prompt_show(ObPrompt *self, ObClient *parent, gboolean modal)
{
gint i;
break;
}
- XSetTransientForHint(obt_display, self->super.window,
- (parent ? parent->window : 0));
+ if (parent) {
+ Atom states[1];
+ gint nstates;
+ Window p;
+ XWMHints h;
+
+ if (parent->group) {
+ /* make it transient for the window's group */
+ h.flags = WindowGroupHint;
+ h.window_group = parent->group->leader;
+ p = obt_root(ob_screen);
+ }
+ else {
+ /* make it transient for the window directly */
+ h.flags = 0;
+ p = parent->window;
+ }
+
+ XSetWMHints(obt_display, self->super.window, &h);
+ OBT_PROP_SET32(self->super.window, WM_TRANSIENT_FOR, WINDOW, p);
+
+ states[0] = OBT_PROP_ATOM(NET_WM_STATE_MODAL);
+ nstates = (modal ? 1 : 0);
+ OBT_PROP_SETA32(self->super.window, NET_WM_STATE, ATOM,
+ states, nstates);
+ }
+ else
+ OBT_PROP_ERASE(self->super.window, WM_TRANSIENT_FOR);
/* set up the dialog and render it */
prompt_layout(self);
void prompt_unref(ObPrompt *self);
/*! Show the prompt. It will be centered within the given area rectangle */
-void prompt_show(ObPrompt *self, struct _ObClient *parent);
+void prompt_show(ObPrompt *self, struct _ObClient *parent, gboolean modal);
void prompt_hide(ObPrompt *self);
gboolean prompt_key_event(ObPrompt *self, XEvent *e);
if (!read_int(db, "window.client.padding.height", &theme->cbwidthy) ||
theme->cbwidthy < 0 || theme->cbwidthy > 100)
theme->cbwidthy = theme->cbwidthx;
+ if (!read_int(db, "menu.separator.width", &theme->menu_sep_width) ||
+ theme->menu_sep_width < 1 || theme->menu_sep_width > 100)
+ theme->menu_sep_width = 1;
+ if (!read_int(db, "menu.separator.padding.width",
+ &theme->menu_sep_paddingx) ||
+ theme->menu_sep_paddingx < 0 || theme->menu_sep_paddingx > 100)
+ theme->menu_sep_paddingx = 6;
+ if (!read_int(db, "menu.separator.padding.height",
+ &theme->menu_sep_paddingy) ||
+ theme->menu_sep_paddingy < 0 || theme->menu_sep_paddingy > 100)
+ theme->menu_sep_paddingy = 3;
/* load colors */
if (!read_color(db, inst,
"menu.items.active.text.color",
&theme->menu_selected_color))
theme->menu_selected_color = RrColorNew(inst, 0, 0, 0);
+ if (!read_color(db, inst,
+ "menu.separator.color", &theme->menu_sep_color))
+ theme->menu_sep_color = RrColorNew(inst,
+ theme->menu_color->r,
+ theme->menu_color->g,
+ theme->menu_color->b);
/* load the image masks */
RrColorFree(theme->titlebut_focused_unpressed_color);
RrColorFree(theme->titlebut_unfocused_unpressed_color);
RrColorFree(theme->menu_title_color);
+ RrColorFree(theme->menu_sep_color);
RrColorFree(theme->menu_color);
RrColorFree(theme->menu_selected_color);
RrColorFree(theme->menu_disabled_color);
gint cbwidthy;
gint menu_overlap_x;
gint menu_overlap_y;
+ gint menu_sep_width;
+ gint menu_sep_paddingx;
+ gint menu_sep_paddingy;
/* these ones are calculated, not set directly by the theme file */
gint win_font_height;
gint menu_title_font_height;
RrColor *titlebut_focused_unpressed_color;
RrColor *titlebut_unfocused_unpressed_color;
RrColor *menu_title_color;
+ RrColor *menu_sep_color;
RrColor *menu_color;
RrColor *menu_selected_color;
RrColor *menu_disabled_color;