all repos — openbox @ cd4f325ee7a3a64eb986931a0575e5f1c3c587c3

openbox fork - make it a bit more like ryudo

Let ObPrompts be modal dialogs, and when they are transient for a window, make it transient for its entire group, so it can be stacked at the highest level above other transients
Dana Jansens danakj@orodu.net
commit

cd4f325ee7a3a64eb986931a0575e5f1c3c587c3

parent

c49c2a8e408f7482f2b977d6cf97517684476ed7

5 files changed, 33 insertions(+), 5 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -3442,7 +3442,7 @@ client_kill_requested, self);

g_free(m); } - prompt_show(self->kill_prompt, self); + prompt_show(self->kill_prompt, self, TRUE); } void client_kill(ObClient *self)
M openbox/prompt.copenbox/prompt.c

@@ -21,6 +21,7 @@ #include "openbox.h"

#include "screen.h" #include "openbox.h" #include "client.h" +#include "group.h" #include "prop.h" #include "modkeys.h" #include "event.h"

@@ -435,7 +436,7 @@ for (i = 0; i < self->n_buttons; ++i)

render_button(self, &self->button[i]); } -void prompt_show(ObPrompt *self, ObClient *parent) +void prompt_show(ObPrompt *self, ObClient *parent, gboolean modal) { gint i;

@@ -457,8 +458,33 @@ self->focus = &self->button[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);
M openbox/prompt.hopenbox/prompt.h

@@ -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);
M openbox/prop.copenbox/prop.c

@@ -51,6 +51,7 @@ CREATE(wm_window_role, "WM_WINDOW_ROLE");

CREATE(wm_client_machine, "WM_CLIENT_MACHINE"); CREATE(wm_command, "WM_COMMAND"); CREATE(wm_client_leader, "WM_CLIENT_LEADER"); + CREATE(wm_transient_for, "WM_TRANSIENT_FOR"); CREATE(motif_wm_hints, "_MOTIF_WM_HINTS"); CREATE(sm_client_id, "SM_CLIENT_ID");
M openbox/prop.hopenbox/prop.h

@@ -53,6 +53,7 @@ Atom wm_window_role;

Atom wm_client_machine; Atom wm_command; Atom wm_client_leader; + Atom wm_transient_for; Atom motif_wm_hints; /* SM atoms */