yay for simplifying code. if we check for errors we dont need the "focus_tried" stuff
This commit is contained in:
parent
1b2c6f609d
commit
ec21f8c9ec
3 changed files with 4 additions and 89 deletions
|
@ -65,7 +65,6 @@ typedef struct
|
||||||
GList *client_list = NULL;
|
GList *client_list = NULL;
|
||||||
|
|
||||||
static GSList *client_destroy_notifies = NULL;
|
static GSList *client_destroy_notifies = NULL;
|
||||||
static GSList *client_hide_notifies = NULL;
|
|
||||||
|
|
||||||
static void client_get_all(ObClient *self, gboolean real);
|
static void client_get_all(ObClient *self, gboolean real);
|
||||||
static void client_toggle_border(ObClient *self, gboolean show);
|
static void client_toggle_border(ObClient *self, gboolean show);
|
||||||
|
@ -139,29 +138,6 @@ void client_remove_destroy_notify(ObClientCallback func)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void client_add_hide_notify(ObClientCallback func, gpointer data)
|
|
||||||
{
|
|
||||||
ClientCallback *d = g_new(ClientCallback, 1);
|
|
||||||
d->func = func;
|
|
||||||
d->data = data;
|
|
||||||
client_hide_notifies = g_slist_prepend(client_hide_notifies, d);
|
|
||||||
}
|
|
||||||
|
|
||||||
void client_remove_hide_notify(ObClientCallback func)
|
|
||||||
{
|
|
||||||
GSList *it;
|
|
||||||
|
|
||||||
for (it = client_hide_notifies; it; it = g_slist_next(it)) {
|
|
||||||
ClientCallback *d = it->data;
|
|
||||||
if (d->func == func) {
|
|
||||||
g_free(d);
|
|
||||||
client_hide_notifies =
|
|
||||||
g_slist_delete_link(client_hide_notifies, it);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void client_set_list()
|
void client_set_list()
|
||||||
{
|
{
|
||||||
Window *windows, *win_it;
|
Window *windows, *win_it;
|
||||||
|
@ -2442,12 +2418,9 @@ void client_show(ObClient *self)
|
||||||
|
|
||||||
void client_hide(ObClient *self)
|
void client_hide(ObClient *self)
|
||||||
{
|
{
|
||||||
if (!client_should_show(self)) {
|
if (!client_should_show(self))
|
||||||
frame_hide(self->frame);
|
frame_hide(self->frame);
|
||||||
|
|
||||||
client_call_notifies(self, client_hide_notifies);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
|
/* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
|
||||||
needs to be in IconicState. This includes when it is on another
|
needs to be in IconicState. This includes when it is on another
|
||||||
desktop!
|
desktop!
|
||||||
|
@ -2458,15 +2431,11 @@ void client_hide(ObClient *self)
|
||||||
void client_showhide(ObClient *self)
|
void client_showhide(ObClient *self)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (client_should_show(self)) {
|
if (client_should_show(self))
|
||||||
frame_show(self->frame);
|
frame_show(self->frame);
|
||||||
}
|
else
|
||||||
else {
|
|
||||||
frame_hide(self->frame);
|
frame_hide(self->frame);
|
||||||
|
|
||||||
client_call_notifies(self, client_hide_notifies);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
|
/* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
|
||||||
needs to be in IconicState. This includes when it is on another
|
needs to be in IconicState. This includes when it is on another
|
||||||
desktop!
|
desktop!
|
||||||
|
|
|
@ -314,10 +314,6 @@ typedef void (*ObClientCallback)(ObClient *client, gpointer data);
|
||||||
void client_add_destroy_notify(ObClientCallback func, gpointer data);
|
void client_add_destroy_notify(ObClientCallback func, gpointer data);
|
||||||
void client_remove_destroy_notify(ObClientCallback func);
|
void client_remove_destroy_notify(ObClientCallback func);
|
||||||
|
|
||||||
/*! Get notified when the client is hidden */
|
|
||||||
void client_add_hide_notify(ObClientCallback func, gpointer data);
|
|
||||||
void client_remove_hide_notify(ObClientCallback func);
|
|
||||||
|
|
||||||
/*! Manages all existing windows */
|
/*! Manages all existing windows */
|
||||||
void client_manage_all();
|
void client_manage_all();
|
||||||
/*! Manages a given window
|
/*! Manages a given window
|
||||||
|
|
|
@ -44,14 +44,6 @@ ObClient *focus_client = NULL;
|
||||||
GList *focus_order = NULL;
|
GList *focus_order = NULL;
|
||||||
ObClient *focus_cycle_target = NULL;
|
ObClient *focus_cycle_target = NULL;
|
||||||
|
|
||||||
/*! This variable is used for focus fallback. If we fallback to a window, we
|
|
||||||
set this to the window. And when focus goes somewhere after that, it will
|
|
||||||
be set to NULL. If between falling back to that window and something
|
|
||||||
getting focused, the window gets unmanaged, then if there are no incoming
|
|
||||||
FocusIn events, we fallback again because focus has just gotten itself lost.
|
|
||||||
*/
|
|
||||||
static ObClient *focus_tried = NULL;
|
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
InternalWindow top;
|
InternalWindow top;
|
||||||
InternalWindow left;
|
InternalWindow left;
|
||||||
|
@ -69,7 +61,6 @@ static gboolean valid_focus_target(ObClient *ft,
|
||||||
gboolean dock_windows,
|
gboolean dock_windows,
|
||||||
gboolean desktop_windows);
|
gboolean desktop_windows);
|
||||||
static void focus_cycle_destroy_notify(ObClient *client, gpointer data);
|
static void focus_cycle_destroy_notify(ObClient *client, gpointer data);
|
||||||
static void focus_tried_hide_notify(ObClient *client, gpointer data);
|
|
||||||
|
|
||||||
static Window createWindow(Window parent, gulong mask,
|
static Window createWindow(Window parent, gulong mask,
|
||||||
XSetWindowAttributes *attrib)
|
XSetWindowAttributes *attrib)
|
||||||
|
@ -88,8 +79,6 @@ void focus_startup(gboolean reconfig)
|
||||||
XSetWindowAttributes attr;
|
XSetWindowAttributes attr;
|
||||||
|
|
||||||
client_add_destroy_notify(focus_cycle_destroy_notify, NULL);
|
client_add_destroy_notify(focus_cycle_destroy_notify, NULL);
|
||||||
client_add_destroy_notify(focus_tried_hide_notify, NULL);
|
|
||||||
client_add_hide_notify(focus_tried_hide_notify, NULL);
|
|
||||||
|
|
||||||
/* start with nothing focused */
|
/* start with nothing focused */
|
||||||
focus_nothing();
|
focus_nothing();
|
||||||
|
@ -143,8 +132,6 @@ void focus_shutdown(gboolean reconfig)
|
||||||
|
|
||||||
if (!reconfig) {
|
if (!reconfig) {
|
||||||
client_remove_destroy_notify(focus_cycle_destroy_notify);
|
client_remove_destroy_notify(focus_cycle_destroy_notify);
|
||||||
client_remove_destroy_notify(focus_tried_hide_notify);
|
|
||||||
client_remove_hide_notify(focus_tried_hide_notify);
|
|
||||||
|
|
||||||
/* reset focus to root */
|
/* reset focus to root */
|
||||||
XSetInputFocus(ob_display, PointerRoot, RevertToNone, CurrentTime);
|
XSetInputFocus(ob_display, PointerRoot, RevertToNone, CurrentTime);
|
||||||
|
@ -198,10 +185,6 @@ void focus_set_client(ObClient *client)
|
||||||
PROP_SET32(RootWindow(ob_display, ob_screen),
|
PROP_SET32(RootWindow(ob_display, ob_screen),
|
||||||
net_active_window, window, active);
|
net_active_window, window, active);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
focus_tried = NULL; /* focus isn't "trying" to go anywhere now */
|
|
||||||
ob_debug_type(OB_DEBUG_FOCUS, "focus tried = NULL\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old)
|
static ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old)
|
||||||
|
@ -287,13 +270,8 @@ ObClient* focus_fallback(gboolean allow_refocus)
|
||||||
event at all for them. */
|
event at all for them. */
|
||||||
focus_nothing();
|
focus_nothing();
|
||||||
|
|
||||||
if (new) {
|
if (new)
|
||||||
client_focus(new);
|
client_focus(new);
|
||||||
/* remember that we tried to send focus here */
|
|
||||||
focus_tried = new;
|
|
||||||
|
|
||||||
ob_debug_type(OB_DEBUG_FOCUS, "focus tried = %s\n", new->title);
|
|
||||||
}
|
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
@ -313,9 +291,6 @@ void focus_nothing()
|
||||||
focus_client = NULL;
|
focus_client = NULL;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
focus_tried = NULL; /* focus isn't "trying" to go anywhere now */
|
|
||||||
ob_debug_type(OB_DEBUG_FOCUS, "focus tried = NULL\n");
|
|
||||||
|
|
||||||
/* if there is a grab going on, then we need to cancel it. if we move
|
/* if there is a grab going on, then we need to cancel it. if we move
|
||||||
focus during the grab, applications will get NotifyWhileGrabbed events
|
focus during the grab, applications will get NotifyWhileGrabbed events
|
||||||
and ignore them !
|
and ignore them !
|
||||||
|
@ -963,28 +938,3 @@ ObClient *focus_order_find_first(guint desktop)
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void focus_tried_hide_notify(ObClient *client, gpointer data)
|
|
||||||
{
|
|
||||||
XEvent ce;
|
|
||||||
|
|
||||||
ob_debug_type(OB_DEBUG_FOCUS, "checking focus tried (%s) against %s\n",
|
|
||||||
(focus_tried?focus_tried->title:"(null)"), client->title);
|
|
||||||
|
|
||||||
if (client == focus_tried) {
|
|
||||||
/* we were trying to focus this window but it's gone */
|
|
||||||
|
|
||||||
focus_tried = NULL;
|
|
||||||
|
|
||||||
ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x and it "
|
|
||||||
"is being unmanaged:\n");
|
|
||||||
if (XCheckIfEvent(ob_display, &ce, event_look_for_focusin_client,NULL))
|
|
||||||
{
|
|
||||||
XPutBackEvent(ob_display, &ce);
|
|
||||||
ob_debug_type(OB_DEBUG_FOCUS, " but another FocusIn is coming\n");
|
|
||||||
} else {
|
|
||||||
ob_debug_type(OB_DEBUG_FOCUS, " so falling back focus again.\n");
|
|
||||||
focus_fallback(TRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue