X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fprompt.c;h=9e91d249416e4a5a3416b8f3b86975986ae2b5a3;hb=173b9b764887929b7ff5d30b3e33f0602b0afda6;hp=b964de29669f2ea35c3dd246ebcdee0d1acfffce;hpb=cd3aa44b6a78e84e75420d6cca2c32f117a096a4;p=chaz%2Fopenbox diff --git a/openbox/prompt.c b/openbox/prompt.c index b964de29..9e91d249 100644 --- a/openbox/prompt.c +++ b/openbox/prompt.c @@ -19,11 +19,12 @@ #include "prompt.h" #include "openbox.h" #include "screen.h" -#include "openbox.h" #include "client.h" -#include "prop.h" -#include "modkeys.h" +#include "group.h" #include "event.h" +#include "obt/display.h" +#include "obt/keyboard.h" +#include "obt/prop.h" #include "gettext.h" static GList *prompt_list = NULL; @@ -144,9 +145,8 @@ ObPrompt* prompt_new(const gchar *msg, self->data = data; self->default_result = default_result; self->cancel_result = cancel_result; - self->super.type = Window_Prompt; - self->super.window = XCreateWindow(ob_display, - RootWindow(ob_display, ob_screen), + self->super.type = OB_WINDOW_CLASS_PROMPT; + self->super.window = XCreateWindow(obt_display, obt_root(ob_screen), 0, 0, 1, 1, 0, CopyFromParent, InputOutput, CopyFromParent, @@ -154,19 +154,19 @@ ObPrompt* prompt_new(const gchar *msg, &attrib); /* make it a dialog type window */ - PROP_SET32(self->super.window, net_wm_window_type, atom, - prop_atoms.net_wm_window_type_dialog); + OBT_PROP_SET32(self->super.window, NET_WM_WINDOW_TYPE, ATOM, + OBT_PROP_ATOM(NET_WM_WINDOW_TYPE_DIALOG)); /* listen for key presses on the window */ self->event_mask = KeyPressMask; /* set up the text message widow */ self->msg.text = g_strdup(msg); - self->msg.window = XCreateWindow(ob_display, self->super.window, + self->msg.window = XCreateWindow(obt_display, self->super.window, 0, 0, 1, 1, 0, CopyFromParent, InputOutput, CopyFromParent, 0, NULL); - XMapWindow(ob_display, self->msg.window); + XMapWindow(obt_display, self->msg.window); /* set up the buttons from the answers */ @@ -189,16 +189,15 @@ ObPrompt* prompt_new(const gchar *msg, } for (i = 0; i < self->n_buttons; ++i) { - self->button[i].window = XCreateWindow(ob_display, self->super.window, + self->button[i].window = XCreateWindow(obt_display, self->super.window, 0, 0, 1, 1, 0, CopyFromParent, InputOutput, CopyFromParent, 0, NULL); - XMapWindow(ob_display, self->button[i].window); - g_hash_table_insert(window_map, &self->button[i].window, - PROMPT_AS_WINDOW(self)); + XMapWindow(obt_display, self->button[i].window); + window_add(&self->button[i].window, PROMPT_AS_WINDOW(self)); /* listen for button presses on the buttons */ - XSelectInput(ob_display, self->button[i].window, + XSelectInput(obt_display, self->button[i].window, ButtonPressMask | ButtonReleaseMask | ButtonMotionMask); } @@ -220,12 +219,12 @@ void prompt_unref(ObPrompt *self) prompt_list = g_list_remove(prompt_list, self); for (i = 0; i < self->n_buttons; ++i) { - g_hash_table_remove(window_map, &self->button[i].window); - XDestroyWindow(ob_display, self->button[i].window); + window_remove(self->button[i].window); + XDestroyWindow(obt_display, self->button[i].window); } - XDestroyWindow(ob_display, self->msg.window); - XDestroyWindow(ob_display, self->super.window); + XDestroyWindow(obt_display, self->msg.window); + XDestroyWindow(obt_display, self->super.window); g_free(self); } } @@ -309,11 +308,11 @@ static void prompt_layout(ObPrompt *self) prompt_resize(self, w + l + r, h + t + b); /* move and resize the internal windows */ - XMoveResizeWindow(ob_display, self->msg.window, + XMoveResizeWindow(obt_display, self->msg.window, self->msg.x, self->msg.y, self->msg.width, self->msg.height); for (i = 0; i < self->n_buttons; ++i) - XMoveResizeWindow(ob_display, self->button[i].window, + XMoveResizeWindow(obt_display, self->button[i].window, self->button[i].x, self->button[i].y, self->button[i].width, self->button[i].height); } @@ -330,13 +329,13 @@ static void prompt_resize(ObPrompt *self, gint w, gint h) hints.flags = PMinSize | PMaxSize; hints.min_width = hints.max_width = w; hints.min_height = hints.max_height = h; - XSetWMNormalHints(ob_display, self->super.window, &hints); + XSetWMNormalHints(obt_display, self->super.window, &hints); if (self->mapped) { /* send a configure request like a normal client would */ req.type = ConfigureRequest; - req.display = ob_display; - req.parent = RootWindow(ob_display, ob_screen); + req.display = obt_display; + req.parent = obt_root(ob_screen); req.window = self->super.window; req.width = w; req.height = h; @@ -345,20 +344,16 @@ static void prompt_resize(ObPrompt *self, gint w, gint h) (XEvent*)&req); } else - XResizeWindow(ob_display, self->super.window, w, h); + XResizeWindow(obt_display, self->super.window, w, h); } static void setup_button_focus_tex(ObPromptElement *e, RrAppearance *a, gboolean on) { - gint l, r, t, b; - - if (!on) { - gint i; + gint i, l, r, t, b; - 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; @@ -439,17 +434,17 @@ 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; if (self->mapped) { /* activate the prompt */ - PROP_MSG(self->super.window, net_active_window, - 1, /* from an application.. */ - event_curtime, - 0, - 0); + OBT_PROP_MSG(ob_screen, self->super.window, NET_ACTIVE_WINDOW, + 1, /* from an application.. */ + event_curtime, + 0, + 0, 0); return; } @@ -461,8 +456,34 @@ void prompt_show(ObPrompt *self, ObClient *parent) 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 = 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); @@ -475,7 +496,7 @@ void prompt_show(ObPrompt *self, ObClient *parent) void prompt_hide(ObPrompt *self) { - XUnmapWindow(ob_display, self->super.window); + XUnmapWindow(obt_display, self->super.window); self->mapped = FALSE; } @@ -486,9 +507,7 @@ gboolean prompt_key_event(ObPrompt *self, XEvent *e) if (e->type != KeyPress) return FALSE; - g_print("key 0x%x 0x%x\n", e->xkey.keycode, ob_keycode(OB_KEY_TAB)); - - shift_mask = modkeys_key_to_mask(OB_MODKEY_KEY_SHIFT); + shift_mask = obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_SHIFT); shift = !!(e->xkey.state & shift_mask); /* only accept shift */