do the menu_can_hide thing properly. was such a hack before? and the variable was getting set from all kinds of events like motion notify. totally not reliable. now it works all nice.
This commit is contained in:
parent
1091e38908
commit
b0aa29db69
3 changed files with 26 additions and 17 deletions
|
@ -93,13 +93,10 @@ static gboolean focus_delay_cmp(gconstpointer d1, gconstpointer d2);
|
||||||
static gboolean focus_delay_func(gpointer data);
|
static gboolean focus_delay_func(gpointer data);
|
||||||
static void focus_delay_client_dest(ObClient *client, gpointer data);
|
static void focus_delay_client_dest(ObClient *client, gpointer data);
|
||||||
|
|
||||||
static gboolean menu_hide_delay_func(gpointer data);
|
|
||||||
|
|
||||||
/* The time for the current event being processed */
|
/* The time for the current event being processed */
|
||||||
Time event_curtime = CurrentTime;
|
Time event_curtime = CurrentTime;
|
||||||
|
|
||||||
static guint ignore_enter_focus = 0;
|
static guint ignore_enter_focus = 0;
|
||||||
static gboolean menu_can_hide;
|
|
||||||
static gboolean focus_left_screen = FALSE;
|
static gboolean focus_left_screen = FALSE;
|
||||||
|
|
||||||
#ifdef USE_SM
|
#ifdef USE_SM
|
||||||
|
@ -1706,8 +1703,8 @@ static gboolean event_handle_menu(XEvent *ev)
|
||||||
|
|
||||||
switch (ev->type) {
|
switch (ev->type) {
|
||||||
case ButtonRelease:
|
case ButtonRelease:
|
||||||
if ((ev->xbutton.button < 4 || ev->xbutton.button > 5)
|
if (menu_hide_delay_reached() &&
|
||||||
&& menu_can_hide)
|
(ev->xbutton.button < 4 || ev->xbutton.button > 5))
|
||||||
{
|
{
|
||||||
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)))
|
||||||
|
@ -1783,12 +1780,6 @@ static void event_handle_user_input(ObClient *client, XEvent *e)
|
||||||
moved/resized */
|
moved/resized */
|
||||||
client = moveresize_client;
|
client = moveresize_client;
|
||||||
|
|
||||||
menu_can_hide = FALSE;
|
|
||||||
ob_main_loop_timeout_add(ob_main_loop,
|
|
||||||
config_menu_hide_delay * 1000,
|
|
||||||
menu_hide_delay_func,
|
|
||||||
NULL, g_direct_equal, NULL);
|
|
||||||
|
|
||||||
if (e->type == ButtonPress ||
|
if (e->type == ButtonPress ||
|
||||||
e->type == ButtonRelease ||
|
e->type == ButtonRelease ||
|
||||||
e->type == MotionNotify)
|
e->type == MotionNotify)
|
||||||
|
@ -1804,12 +1795,6 @@ static void event_handle_user_input(ObClient *client, XEvent *e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean menu_hide_delay_func(gpointer data)
|
|
||||||
{
|
|
||||||
menu_can_hide = TRUE;
|
|
||||||
return FALSE; /* no repeat */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void focus_delay_dest(gpointer data)
|
static void focus_delay_dest(gpointer data)
|
||||||
{
|
{
|
||||||
g_free(data);
|
g_free(data);
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
#include "openbox.h"
|
#include "openbox.h"
|
||||||
|
#include "mainloop.h"
|
||||||
#include "stacking.h"
|
#include "stacking.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
@ -45,6 +46,7 @@ struct _ObMenuParseState
|
||||||
static GHashTable *menu_hash = NULL;
|
static GHashTable *menu_hash = NULL;
|
||||||
static ObParseInst *menu_parse_inst;
|
static ObParseInst *menu_parse_inst;
|
||||||
static ObMenuParseState menu_parse_state;
|
static ObMenuParseState menu_parse_state;
|
||||||
|
static gboolean menu_can_hide = FALSE;
|
||||||
|
|
||||||
static void menu_destroy_hash_value(ObMenu *self);
|
static void menu_destroy_hash_value(ObMenu *self);
|
||||||
static void parse_menu_item(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
|
static void parse_menu_item(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
|
||||||
|
@ -384,6 +386,12 @@ void menu_free(ObMenu *menu)
|
||||||
g_hash_table_remove(menu_hash, menu->name);
|
g_hash_table_remove(menu_hash, menu->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean menu_hide_delay_func(gpointer data)
|
||||||
|
{
|
||||||
|
menu_can_hide = TRUE;
|
||||||
|
return FALSE; /* no repeat */
|
||||||
|
}
|
||||||
|
|
||||||
void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
|
void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
|
||||||
{
|
{
|
||||||
ObMenu *self;
|
ObMenu *self;
|
||||||
|
@ -420,6 +428,21 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!button)
|
||||||
|
menu_can_hide = TRUE;
|
||||||
|
else {
|
||||||
|
menu_can_hide = FALSE;
|
||||||
|
ob_main_loop_timeout_add(ob_main_loop,
|
||||||
|
config_menu_hide_delay * 1000,
|
||||||
|
menu_hide_delay_func,
|
||||||
|
NULL, g_direct_equal, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean menu_hide_delay_reached()
|
||||||
|
{
|
||||||
|
return menu_can_hide;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ObMenuEntry* menu_entry_new(ObMenu *menu, ObMenuEntryType type, gint id)
|
static ObMenuEntry* menu_entry_new(ObMenu *menu, ObMenuEntryType type, gint id)
|
||||||
|
|
|
@ -172,6 +172,7 @@ void menu_show_all_shortcuts(ObMenu *self, gboolean show);
|
||||||
|
|
||||||
void menu_show(gchar *name, gint x, gint y, gint button,
|
void menu_show(gchar *name, gint x, gint y, gint button,
|
||||||
struct _ObClient *client);
|
struct _ObClient *client);
|
||||||
|
gboolean menu_hide_delay_reached();
|
||||||
|
|
||||||
void menu_set_show_func(ObMenu *menu, ObMenuShowFunc func);
|
void menu_set_show_func(ObMenu *menu, ObMenuShowFunc func);
|
||||||
void menu_set_hide_func(ObMenu *menu, ObMenuHideFunc func);
|
void menu_set_hide_func(ObMenu *menu, ObMenuHideFunc func);
|
||||||
|
|
Loading…
Reference in a new issue