X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fprompt.c;h=88c74b68d048baf3519a753303b547be07e4b7c0;hb=HEAD;hp=53ed2d7daa1dc38553d5512cf43921890b4b5c03;hpb=c716d1788bb4f4b9db403617023f06347ba48102;p=chaz%2Fopenbox diff --git a/openbox/prompt.c b/openbox/prompt.c index 53ed2d7d..88c74b68 100644 --- a/openbox/prompt.c +++ b/openbox/prompt.c @@ -19,12 +19,12 @@ #include "prompt.h" #include "openbox.h" #include "screen.h" -#include "openbox.h" #include "client.h" #include "group.h" -#include "prop.h" -#include "modkeys.h" #include "event.h" +#include "obt/display.h" +#include "obt/keyboard.h" +#include "obt/prop.h" #include "gettext.h" static GList *prompt_list = NULL; @@ -34,7 +34,6 @@ static RrAppearance *prompt_a_bg; static RrAppearance *prompt_a_button; static RrAppearance *prompt_a_focus; static RrAppearance *prompt_a_press; -static RrAppearance *prompt_a_pfocus; /* we change the max width which would screw with others */ static RrAppearance *prompt_a_msg; @@ -54,58 +53,12 @@ static void prompt_run_callback(ObPrompt *self, gint result); void prompt_startup(gboolean reconfig) { - RrColor *c_button, *c_focus, *c_press, *c_pfocus; - /* note: this is not a copy, don't free it */ - prompt_a_bg = ob_rr_theme->osd_hilite_bg; - - prompt_a_button = RrAppearanceCopy(ob_rr_theme->a_focused_unpressed_close); - prompt_a_focus = RrAppearanceCopy(ob_rr_theme->a_hover_focused_close); - prompt_a_press = RrAppearanceCopy(ob_rr_theme->a_focused_pressed_close); - prompt_a_pfocus = RrAppearanceCopy(ob_rr_theme->a_focused_pressed_close); - - c_button = prompt_a_button->texture[0].data.mask.color; - c_focus = prompt_a_focus->texture[0].data.mask.color; - c_press = prompt_a_press->texture[0].data.mask.color; - c_pfocus = prompt_a_press->texture[0].data.mask.color; - - RrAppearanceRemoveTextures(prompt_a_button); - RrAppearanceRemoveTextures(prompt_a_focus); - RrAppearanceRemoveTextures(prompt_a_press); - RrAppearanceRemoveTextures(prompt_a_pfocus); - - /* texture[0] is the text and texture[1-4] (for prompt_a_focus and - prompt_a_pfocus) is lineart to show where keyboard focus is */ - RrAppearanceAddTextures(prompt_a_button, 1); - RrAppearanceAddTextures(prompt_a_focus, 5); - RrAppearanceAddTextures(prompt_a_press, 1); - RrAppearanceAddTextures(prompt_a_pfocus, 5); - - /* totally cheating here.. */ - prompt_a_button->texture[0] = ob_rr_theme->osd_hilite_label->texture[0]; - prompt_a_focus->texture[0] = ob_rr_theme->osd_hilite_label->texture[0]; - prompt_a_press->texture[0] = ob_rr_theme->osd_hilite_label->texture[0]; - prompt_a_pfocus->texture[0] = ob_rr_theme->osd_hilite_label->texture[0]; - - prompt_a_button->texture[0].data.text.justify = RR_JUSTIFY_CENTER; - prompt_a_focus->texture[0].data.text.justify = RR_JUSTIFY_CENTER; - prompt_a_press->texture[0].data.text.justify = RR_JUSTIFY_CENTER; - prompt_a_pfocus->texture[0].data.text.justify = RR_JUSTIFY_CENTER; - - prompt_a_button->texture[0].data.text.color = c_button; - prompt_a_focus->texture[0].data.text.color = c_focus; - prompt_a_press->texture[0].data.text.color = c_press; - prompt_a_pfocus->texture[0].data.text.color = c_press; - - prompt_a_focus->texture[1].data.lineart.color = c_focus; - prompt_a_focus->texture[2].data.lineart.color = c_focus; - prompt_a_focus->texture[3].data.lineart.color = c_focus; - prompt_a_focus->texture[4].data.lineart.color = c_focus; - - prompt_a_pfocus->texture[1].data.lineart.color = c_press; - prompt_a_pfocus->texture[2].data.lineart.color = c_press; - prompt_a_pfocus->texture[3].data.lineart.color = c_press; - prompt_a_pfocus->texture[4].data.lineart.color = c_press; + prompt_a_bg = ob_rr_theme->osd_bg; + + prompt_a_button = RrAppearanceCopy(ob_rr_theme->osd_unpressed_button); + prompt_a_focus = RrAppearanceCopy(ob_rr_theme->osd_focused_button); + prompt_a_press = RrAppearanceCopy(ob_rr_theme->osd_pressed_button); prompt_a_msg = RrAppearanceCopy(ob_rr_theme->osd_hilite_label); prompt_a_msg->texture[0].data.text.flow = TRUE; @@ -122,11 +75,12 @@ void prompt_startup(gboolean reconfig) void prompt_shutdown(gboolean reconfig) { - GList *it; + GList *it, *next; if (!reconfig) { - for (it = prompt_list; it; it = g_list_next(it)) { + for (it = prompt_list; it; it = next) { ObPrompt *p = it->data; + next = it->next; if (p->cleanup) p->cleanup(p, p->data); } @@ -136,7 +90,6 @@ void prompt_shutdown(gboolean reconfig) RrAppearanceFree(prompt_a_button); RrAppearanceFree(prompt_a_focus); RrAppearanceFree(prompt_a_press); - RrAppearanceFree(prompt_a_pfocus); RrAppearanceFree(prompt_a_msg); } @@ -152,40 +105,41 @@ ObPrompt* prompt_new(const gchar *msg, const gchar *title, attrib.override_redirect = FALSE; - self = g_new0(ObPrompt, 1); + self = g_slice_new0(ObPrompt); self->ref = 1; self->func = func; self->cleanup = cleanup; 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, CWOverrideRedirect, &attrib); + self->ic = obt_keyboard_context_new(self->super.window, + self->super.window); /* 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)); /* set the window's title */ if (title) - PROP_SETS(self->super.window, net_wm_name, title); + OBT_PROP_SETS(self->super.window, NET_WM_NAME, title); /* 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 */ @@ -208,16 +162,15 @@ ObPrompt* prompt_new(const gchar *msg, const gchar *title, } 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); } @@ -241,14 +194,16 @@ void prompt_unref(ObPrompt *self) prompt_list = g_list_remove(prompt_list, self); + obt_keyboard_context_unref(self->ic); + 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); - g_free(self); + XDestroyWindow(obt_display, self->msg.window); + XDestroyWindow(obt_display, self->super.window); + g_slice_free(ObPrompt, self); } } @@ -267,9 +222,8 @@ static void prompt_layout(ObPrompt *self) b += OUTSIDE_MARGIN; { - Rect *area = screen_physical_area_all_monitors(); + const Rect *area = screen_physical_area_all_monitors(); maxw = MIN(MAX_WIDTH, area->width*4/5); - g_free(area); } /* find the button sizes and how much space we need for them */ @@ -280,7 +234,6 @@ static void prompt_layout(ObPrompt *self) prompt_a_button->texture[0].data.text.string = self->button[i].text; prompt_a_focus->texture[0].data.text.string = self->button[i].text; prompt_a_press->texture[0].data.text.string = self->button[i].text; - prompt_a_pfocus->texture[0].data.text.string = self->button[i].text; RrMinSize(prompt_a_button, &bw, &bh); self->button[i].width = bw; self->button[i].height = bh; @@ -290,9 +243,6 @@ static void prompt_layout(ObPrompt *self) RrMinSize(prompt_a_press, &bw, &bh); self->button[i].width = MAX(self->button[i].width, bw); self->button[i].height = MAX(self->button[i].height, bh); - RrMinSize(prompt_a_pfocus, &bw, &bh); - self->button[i].width = MAX(self->button[i].width, bw); - self->button[i].height = MAX(self->button[i].height, bh); self->button[i].width += BUTTON_HMARGIN * 2; self->button[i].height += BUTTON_VMARGIN * 2; @@ -329,11 +279,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); } @@ -350,13 +300,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; @@ -365,7 +315,7 @@ 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, @@ -413,17 +363,16 @@ static void render_button(ObPrompt *self, ObPromptElement *e) { RrAppearance *a; - if (e->pressed && self->focus == e) a = prompt_a_pfocus; - else if (self->focus == e) a = prompt_a_focus; - else if (e->pressed) a = prompt_a_press; - else a = prompt_a_button; + if (e->hover && e->pressed) a = prompt_a_press; + else if (self->focus == e) a = prompt_a_focus; + else a = prompt_a_button; a->surface.parent = prompt_a_bg; a->surface.parentx = e->x; a->surface.parenty = e->y; /* draw the keyfocus line */ - if (a == prompt_a_pfocus || a == prompt_a_focus) + if (self->focus == e) setup_button_focus_tex(e, a, TRUE); a->texture[0].data.text.string = e->text; @@ -431,7 +380,7 @@ static void render_button(ObPrompt *self, ObPromptElement *e) /* turn off the keyfocus line so that it doesn't affect size calculations */ - if (a == prompt_a_pfocus || a == prompt_a_focus) + if (self->focus == e) setup_button_focus_tex(e, a, FALSE); } @@ -459,11 +408,11 @@ void prompt_show(ObPrompt *self, ObClient *parent, gboolean modal) 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_time(), + 0, + 0, 0); return; } @@ -485,7 +434,7 @@ void prompt_show(ObPrompt *self, ObClient *parent, gboolean modal) /* make it transient for the window's group */ h.flags = WindowGroupHint; h.window_group = parent->group->leader; - p = RootWindow(ob_display, ob_screen); + p = obt_root(ob_screen); } else { /* make it transient for the window directly */ @@ -493,15 +442,16 @@ void prompt_show(ObPrompt *self, ObClient *parent, gboolean modal) p = parent->window; } - XSetWMHints(ob_display, self->super.window, &h); - PROP_SET32(self->super.window, wm_transient_for, window, p); + XSetWMHints(obt_display, self->super.window, &h); + OBT_PROP_SET32(self->super.window, WM_TRANSIENT_FOR, WINDOW, p); - states[0] = prop_atoms.net_wm_state_modal; + states[0] = OBT_PROP_ATOM(NET_WM_STATE_MODAL); nstates = (modal ? 1 : 0); - PROP_SETA32(self->super.window, net_wm_state, atom, states, nstates); + OBT_PROP_SETA32(self->super.window, NET_WM_STATE, ATOM, + states, nstates); } else - PROP_ERASE(self->super.window, wm_transient_for); + OBT_PROP_ERASE(self->super.window, WM_TRANSIENT_FOR); /* set up the dialog and render it */ prompt_layout(self); @@ -514,41 +464,38 @@ void prompt_show(ObPrompt *self, ObClient *parent, gboolean modal) void prompt_hide(ObPrompt *self) { - XUnmapWindow(ob_display, self->super.window); + XUnmapWindow(obt_display, self->super.window); self->mapped = FALSE; } gboolean prompt_key_event(ObPrompt *self, XEvent *e) { gboolean shift; - guint shift_mask; + guint shift_mask, mods; + KeySym sym; if (e->type != KeyPress) return FALSE; - shift_mask = modkeys_key_to_mask(OB_MODKEY_KEY_SHIFT); - shift = !!(e->xkey.state & shift_mask); + shift_mask = obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_SHIFT); + mods = obt_keyboard_only_modmasks(e->xkey.state); + shift = !!(mods & shift_mask); /* only accept shift */ - if (e->xkey.state != 0 && e->xkey.state != shift_mask) + if (mods != 0 && mods != shift_mask) return FALSE; - if (e->xkey.keycode == ob_keycode(OB_KEY_ESCAPE)) + sym = obt_keyboard_keypress_to_keysym(e); + + if (sym == XK_Escape) prompt_cancel(self); - else if (e->xkey.keycode == ob_keycode(OB_KEY_RETURN) || - e->xkey.keycode == ob_keycode(OB_KEY_SPACE)) - { + else if (sym == XK_Return || sym == XK_KP_Enter || sym == XK_space) prompt_run_callback(self, self->focus->result); - } - else if (e->xkey.keycode == ob_keycode(OB_KEY_TAB) || - e->xkey.keycode == ob_keycode(OB_KEY_LEFT) || - e->xkey.keycode == ob_keycode(OB_KEY_RIGHT)) - { + else if (sym == XK_Tab || sym == XK_Left || sym == XK_Right) { gint i; gboolean left; ObPromptElement *oldfocus; - left = e->xkey.keycode == ob_keycode(OB_KEY_LEFT) || - (e->xkey.keycode == ob_keycode(OB_KEY_TAB) && shift); + left = (sym == XK_Left) || ((sym == XK_Tab) && shift); oldfocus = self->focus; for (i = 0; i < self->n_buttons; ++i) @@ -588,25 +535,28 @@ gboolean prompt_mouse_event(ObPrompt *self, XEvent *e) oldfocus = self->focus; - but->pressed = TRUE; + but->pressed = but->hover = TRUE; self->focus = but; if (oldfocus != but) render_button(self, oldfocus); render_button(self, but); } else if (e->type == ButtonRelease) { - if (but->pressed) + if (but->hover) prompt_run_callback(self, but->result); + but->pressed = FALSE; } else if (e->type == MotionNotify) { - gboolean press; + if (but->pressed) { + gboolean hover; - press = (e->xmotion.x >= 0 && e->xmotion.y >= 0 && - e->xmotion.x < but->width && e->xmotion.y < but->height); + hover = (e->xmotion.x >= 0 && e->xmotion.y >= 0 && + e->xmotion.x < but->width && e->xmotion.y < but->height); - if (press != but->pressed) { - but->pressed = press; - render_button(self, but); + if (hover != but->hover) { + but->hover = hover; + render_button(self, but); + } } } return TRUE; @@ -645,7 +595,7 @@ static void prompt_run_callback(ObPrompt *self, gint result) { prompt_ref(self); if (self->func) { - gboolean clean = self->func(self, self->focus->result, self->data); + gboolean clean = self->func(self, result, self->data); if (clean && self->cleanup) self->cleanup(self, self->data); }