Merge branch 'backport' into work
Conflicts: openbox/menuframe.c openbox/prompt.c openbox/prop.c openbox/prop.h
This commit is contained in:
commit
97de737767
8 changed files with 102 additions and 31 deletions
|
@ -62,6 +62,7 @@ void obt_prop_startup(void)
|
|||
CREATE(WM_CLIENT_MACHINE);
|
||||
CREATE(WM_COMMAND);
|
||||
CREATE(WM_CLIENT_LEADER);
|
||||
CREATE(WM_TRANSIENT_FOR);
|
||||
CREATE_(MOTIF_WM_HINTS);
|
||||
|
||||
CREATE(SM_CLIENT_ID);
|
||||
|
|
|
@ -51,6 +51,7 @@ typedef enum {
|
|||
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 */
|
||||
|
|
|
@ -1541,7 +1541,7 @@ void client_update_normal_hints(ObClient *self)
|
|||
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);
|
||||
|
||||
|
@ -2817,7 +2817,7 @@ void client_try_configure(ObClient *self, gint *x, gint *y, gint *w, gint *h,
|
|||
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 {
|
||||
|
@ -3364,7 +3364,7 @@ static void client_prompt_kill(ObClient *self)
|
|||
g_free(m);
|
||||
}
|
||||
|
||||
prompt_show(self->kill_prompt, self);
|
||||
prompt_show(self->kill_prompt, self, TRUE);
|
||||
}
|
||||
|
||||
void client_kill(ObClient *self)
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
#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)
|
||||
|
@ -40,6 +39,9 @@
|
|||
ButtonPressMask | ButtonReleaseMask)
|
||||
|
||||
GList *menu_frame_visible;
|
||||
GHashTable *menu_frame_map;
|
||||
|
||||
static RrAppearance *a_sep;
|
||||
|
||||
static ObMenuEntryFrame* menu_entry_frame_new(ObMenuEntry *entry,
|
||||
ObMenuFrame *frame);
|
||||
|
@ -56,10 +58,18 @@ static Window createWindow(Window parent, gulong mask,
|
|||
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);
|
||||
|
@ -67,6 +77,8 @@ void menu_frame_startup(gboolean reconfig)
|
|||
|
||||
void menu_frame_shutdown(gboolean reconfig)
|
||||
{
|
||||
RrAppearanceFree(a_sep);
|
||||
|
||||
if (reconfig) return;
|
||||
|
||||
g_hash_table_destroy(menu_frame_map);
|
||||
|
@ -338,7 +350,8 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self)
|
|||
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:
|
||||
|
@ -442,26 +455,31 @@ static void menu_entry_frame_render(ObMenuEntryFrame *self)
|
|||
ob_rr_theme->menu_title_height -
|
||||
2*ob_rr_theme->paddingy);
|
||||
} else {
|
||||
RrAppearance *clear;
|
||||
gint i;
|
||||
|
||||
/* unlabeled separaator */
|
||||
XMoveResizeWindow(obt_display, self->text, PADDING, PADDING,
|
||||
self->area.width - 2*PADDING, SEPARATOR_HEIGHT);
|
||||
/* 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);
|
||||
|
||||
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);
|
||||
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;
|
||||
}
|
||||
|
@ -597,7 +615,8 @@ static gint menu_entry_frame_get_height(ObMenuEntryFrame *self,
|
|||
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;
|
||||
}
|
||||
|
@ -728,7 +747,8 @@ void menu_frame_render(ObMenuFrame *self)
|
|||
(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;
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "openbox.h"
|
||||
#include "screen.h"
|
||||
#include "client.h"
|
||||
#include "group.h"
|
||||
#include "event.h"
|
||||
#include "obt/display.h"
|
||||
#include "obt/keyboard.h"
|
||||
|
@ -433,7 +434,7 @@ static void render_all(ObPrompt *self)
|
|||
render_button(self, &self->button[i]);
|
||||
}
|
||||
|
||||
void prompt_show(ObPrompt *self, ObClient *parent)
|
||||
void prompt_show(ObPrompt *self, ObClient *parent, gboolean modal)
|
||||
{
|
||||
gint i;
|
||||
|
||||
|
@ -455,8 +456,34 @@ void prompt_show(ObPrompt *self, ObClient *parent)
|
|||
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);
|
||||
|
|
|
@ -100,7 +100,7 @@ void prompt_ref(ObPrompt *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);
|
||||
|
|
|
@ -211,6 +211,17 @@ RrTheme* RrThemeNew(const RrInstance *inst, const gchar *name,
|
|||
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,
|
||||
|
@ -408,6 +419,12 @@ RrTheme* RrThemeNew(const RrInstance *inst, const gchar *name,
|
|||
"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 */
|
||||
|
||||
|
@ -1418,6 +1435,7 @@ void RrThemeFree(RrTheme *theme)
|
|||
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);
|
||||
|
|
|
@ -47,6 +47,9 @@ struct _RrTheme {
|
|||
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;
|
||||
|
@ -84,6 +87,7 @@ struct _RrTheme {
|
|||
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;
|
||||
|
|
Loading…
Reference in a new issue