make menu hiding-on-release based on a timer rather than on where it is released (on the frame border)
This commit is contained in:
parent
8d68a400d4
commit
0453a1dbed
1 changed files with 20 additions and 7 deletions
|
@ -45,6 +45,8 @@ static void event_handle_client(ObClient *c, XEvent *e);
|
|||
static gboolean focus_delay_func(gpointer data);
|
||||
static void focus_delay_client_dest(gpointer data);
|
||||
|
||||
static gboolean menu_hide_delay_func(gpointer data);
|
||||
|
||||
#define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \
|
||||
(e)->xfocus.detail == NotifyAncestor || \
|
||||
(e)->xfocus.detail > NotifyNonlinearVirtual)
|
||||
|
@ -70,6 +72,8 @@ static int mask_table_size;
|
|||
|
||||
static ObClient *focus_delay_client;
|
||||
|
||||
static gboolean menu_can_hide;
|
||||
|
||||
#ifdef USE_SM
|
||||
static void ice_handler(int fd, gpointer conn)
|
||||
{
|
||||
|
@ -492,6 +496,12 @@ static void event_process(const XEvent *ec, gpointer data)
|
|||
if (moveresize_in_progress)
|
||||
moveresize_event(e);
|
||||
|
||||
menu_can_hide = FALSE;
|
||||
ob_main_loop_timeout_add(ob_main_loop,
|
||||
G_USEC_PER_SEC / 4,
|
||||
menu_hide_delay_func,
|
||||
NULL, NULL);
|
||||
|
||||
if (e->type == ButtonPress || e->type == ButtonRelease ||
|
||||
e->type == MotionNotify)
|
||||
mouse_event(client, e);
|
||||
|
@ -1122,14 +1132,11 @@ static void event_handle_menu(XEvent *ev)
|
|||
|
||||
switch (ev->type) {
|
||||
case ButtonRelease:
|
||||
if (!(f = menu_frame_under(ev->xbutton.x_root,
|
||||
ev->xbutton.y_root)))
|
||||
if ((e = menu_entry_frame_under(ev->xbutton.x_root,
|
||||
ev->xbutton.y_root)))
|
||||
menu_entry_frame_execute(e, ev->xbutton.state);
|
||||
else if (menu_can_hide)
|
||||
menu_frame_hide_all();
|
||||
else {
|
||||
if ((e = menu_entry_frame_under(ev->xbutton.x_root,
|
||||
ev->xbutton.y_root)))
|
||||
menu_entry_frame_execute(e, ev->xbutton.state);
|
||||
}
|
||||
break;
|
||||
case MotionNotify:
|
||||
if ((f = menu_frame_under(ev->xmotion.x_root,
|
||||
|
@ -1168,6 +1175,12 @@ static void event_handle_menu(XEvent *ev)
|
|||
}
|
||||
}
|
||||
|
||||
static gboolean menu_hide_delay_func(gpointer data)
|
||||
{
|
||||
menu_can_hide = TRUE;
|
||||
return FALSE; /* no repeat */
|
||||
}
|
||||
|
||||
static gboolean focus_delay_func(gpointer data)
|
||||
{
|
||||
client_focus(focus_delay_client);
|
||||
|
|
Loading…
Reference in a new issue