key input works for ObPrompt windows now
This commit is contained in:
parent
a5005506a8
commit
deca45dada
4 changed files with 21 additions and 6 deletions
|
@ -270,10 +270,10 @@ void client_manage(Window window, ObPrompt *prompt)
|
|||
|
||||
map_time = event_get_server_time();
|
||||
|
||||
/* choose the events we want to receive on the CLIENT window */
|
||||
attrib_set.event_mask = CLIENT_EVENTMASK;
|
||||
if (prompt)
|
||||
attrib_set.event_mask |= KeyPressMask;
|
||||
/* choose the events we want to receive on the CLIENT window
|
||||
(ObPrompt windows can request events too) */
|
||||
attrib_set.event_mask = CLIENT_EVENTMASK |
|
||||
(prompt ? prompt->event_mask : 0);
|
||||
attrib_set.do_not_propagate_mask = CLIENT_NOPROPAGATEMASK;
|
||||
XChangeWindowAttributes(ob_display, window,
|
||||
CWEventMask|CWDontPropagate, &attrib_set);
|
||||
|
|
|
@ -478,6 +478,8 @@ static void event_process(const XEvent *ec, gpointer data)
|
|||
break;
|
||||
case Window_Client:
|
||||
client = WINDOW_AS_CLIENT(obwin);
|
||||
/* events on clients can be events on prompt windows too */
|
||||
prompt = client->prompt;
|
||||
break;
|
||||
case Window_Menu:
|
||||
/* not to be used for events */
|
||||
|
@ -1677,7 +1679,6 @@ static ObMenuFrame* find_active_or_last_menu(void)
|
|||
|
||||
static void event_handle_prompt(ObPrompt *p, XEvent *e)
|
||||
{
|
||||
g_print("prompt event\n");
|
||||
switch (e->type) {
|
||||
case ButtonPress:
|
||||
case ButtonRelease:
|
||||
|
|
|
@ -63,6 +63,10 @@ void prompt_startup(gboolean reconfig)
|
|||
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_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_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;
|
||||
|
@ -113,6 +117,9 @@ ObPrompt* prompt_new(const gchar *msg, const gchar *const *answers)
|
|||
PROP_SET32(self->super.window, net_wm_window_type, atom,
|
||||
prop_atoms.net_wm_window_type_dialog);
|
||||
|
||||
/* listen for key presses on the window */
|
||||
self->event_mask = KeyPressMask;
|
||||
|
||||
self->a_bg = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg);
|
||||
|
||||
self->msg.text = g_strdup(msg);
|
||||
|
@ -200,6 +207,8 @@ static void prompt_layout(ObPrompt *self)
|
|||
const gint OUTSIDE_MARGIN = 4;
|
||||
const gint MSG_BUTTON_SEPARATION = 4;
|
||||
const gint BUTTON_SEPARATION = 4;
|
||||
const gint BUTTON_VMARGIN = 4;
|
||||
const gint BUTTON_HMARGIN = 12;
|
||||
const gint MAX_WIDTH = 600;
|
||||
|
||||
RrMargins(self->a_bg, &l, &t, &r, &b);
|
||||
|
@ -232,6 +241,9 @@ static void prompt_layout(ObPrompt *self)
|
|||
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;
|
||||
|
||||
allbuttonsw += self->button[i].width + (i > 0 ? BUTTON_SEPARATION : 0);
|
||||
allbuttonsh = MAX(allbuttonsh, self->button[i].height);
|
||||
}
|
||||
|
@ -280,7 +292,7 @@ static void render_button(ObPrompt *self, ObPromptElement *e)
|
|||
RrAppearance *a;
|
||||
|
||||
if (e->pressed) a = prompt_a_press;
|
||||
else if (self->focus == e) a = prompt_a_focus, g_print("focus!\n");
|
||||
else if (self->focus == e) a = prompt_a_focus;
|
||||
else a = prompt_a_button;
|
||||
|
||||
a->surface.parent = self->a_bg;
|
||||
|
|
|
@ -41,6 +41,8 @@ struct _ObPrompt
|
|||
InternalWindow super;
|
||||
gint ref;
|
||||
|
||||
guint event_mask;
|
||||
|
||||
/* keep a copy of this because we re-render things that may need it
|
||||
(i.e. the buttons) */
|
||||
RrAppearance *a_bg;
|
||||
|
|
Loading…
Reference in a new issue