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:
Dana Jansens 2003-09-10 19:37:52 +00:00
parent 8d68a400d4
commit 0453a1dbed

View file

@ -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);