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 gboolean focus_delay_func(gpointer data);
|
||||||
static void focus_delay_client_dest(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 || \
|
#define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \
|
||||||
(e)->xfocus.detail == NotifyAncestor || \
|
(e)->xfocus.detail == NotifyAncestor || \
|
||||||
(e)->xfocus.detail > NotifyNonlinearVirtual)
|
(e)->xfocus.detail > NotifyNonlinearVirtual)
|
||||||
|
@ -70,6 +72,8 @@ static int mask_table_size;
|
||||||
|
|
||||||
static ObClient *focus_delay_client;
|
static ObClient *focus_delay_client;
|
||||||
|
|
||||||
|
static gboolean menu_can_hide;
|
||||||
|
|
||||||
#ifdef USE_SM
|
#ifdef USE_SM
|
||||||
static void ice_handler(int fd, gpointer conn)
|
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)
|
if (moveresize_in_progress)
|
||||||
moveresize_event(e);
|
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 ||
|
if (e->type == ButtonPress || e->type == ButtonRelease ||
|
||||||
e->type == MotionNotify)
|
e->type == MotionNotify)
|
||||||
mouse_event(client, e);
|
mouse_event(client, e);
|
||||||
|
@ -1122,14 +1132,11 @@ static void event_handle_menu(XEvent *ev)
|
||||||
|
|
||||||
switch (ev->type) {
|
switch (ev->type) {
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
if (!(f = menu_frame_under(ev->xbutton.x_root,
|
|
||||||
ev->xbutton.y_root)))
|
|
||||||
menu_frame_hide_all();
|
|
||||||
else {
|
|
||||||
if ((e = menu_entry_frame_under(ev->xbutton.x_root,
|
if ((e = menu_entry_frame_under(ev->xbutton.x_root,
|
||||||
ev->xbutton.y_root)))
|
ev->xbutton.y_root)))
|
||||||
menu_entry_frame_execute(e, ev->xbutton.state);
|
menu_entry_frame_execute(e, ev->xbutton.state);
|
||||||
}
|
else if (menu_can_hide)
|
||||||
|
menu_frame_hide_all();
|
||||||
break;
|
break;
|
||||||
case MotionNotify:
|
case MotionNotify:
|
||||||
if ((f = menu_frame_under(ev->xmotion.x_root,
|
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)
|
static gboolean focus_delay_func(gpointer data)
|
||||||
{
|
{
|
||||||
client_focus(focus_delay_client);
|
client_focus(focus_delay_client);
|
||||||
|
|
Loading…
Reference in a new issue