#include "screen.h"
#include "openbox.h"
#include "client.h"
+#include "group.h"
#include "prop.h"
#include "modkeys.h"
#include "event.h"
static void setup_button_focus_tex(ObPromptElement *e, RrAppearance *a,
gboolean on)
{
- gint l, r, t, b;
+ gint i, l, r, t, b;
- if (!on) {
- gint i;
-
- for (i = 1; i < 5; ++i)
- a->texture[i].type = on ? RR_TEXTURE_LINE_ART : RR_TEXTURE_NONE;
- }
+ for (i = 1; i < 5; ++i)
+ a->texture[i].type = on ? RR_TEXTURE_LINE_ART : RR_TEXTURE_NONE;
if (!on) return;
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(ob_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 = RootWindow(ob_display, ob_screen);
+ }
+ else {
+ /* make it transient for the window directly */
+ h.flags = 0;
+ p = parent->window;
+ }
+
+ XSetWMHints(ob_display, self->super.window, &h);
+ PROP_SET32(self->super.window, wm_transient_for, window, p);
+
+ states[0] = prop_atoms.net_wm_state_modal;
+ nstates = (modal ? 1 : 0);
+ PROP_SETA32(self->super.window, net_wm_state, atom, states, nstates);
+ }
+ else
+ PROP_ERASE(self->super.window, wm_transient_for);
/* set up the dialog and render it */
prompt_layout(self);