make focus cycling work when not interactive
add focus_directional_cycle
This commit is contained in:
parent
0127812735
commit
0745e2ee0a
2 changed files with 59 additions and 9 deletions
|
@ -257,8 +257,8 @@ static void popup_cycle(ObClient *c, gboolean show)
|
|||
}
|
||||
}
|
||||
|
||||
ObClient *focus_cycle(gboolean forward, gboolean linear,
|
||||
gboolean dialog, gboolean done, gboolean cancel)
|
||||
void focus_cycle(gboolean forward, gboolean linear,
|
||||
gboolean dialog, gboolean done, gboolean cancel)
|
||||
{
|
||||
static ObClient *first = NULL;
|
||||
static ObClient *t = NULL;
|
||||
|
@ -271,10 +271,9 @@ ObClient *focus_cycle(gboolean forward, gboolean linear,
|
|||
frame_adjust_focus(focus_cycle_target->frame, FALSE);
|
||||
if (focus_client)
|
||||
frame_adjust_focus(focus_client->frame, TRUE);
|
||||
focus_cycle_target = NULL;
|
||||
goto done_cycle;
|
||||
} else if (done) {
|
||||
if (focus_cycle_target)
|
||||
client_activate(focus_cycle_target, FALSE);
|
||||
} else if (done && dialog) {
|
||||
goto done_cycle;
|
||||
}
|
||||
|
||||
|
@ -314,11 +313,14 @@ ObClient *focus_cycle(gboolean forward, gboolean linear,
|
|||
frame_adjust_focus(focus_cycle_target->frame, TRUE);
|
||||
}
|
||||
popup_cycle(ft, dialog);
|
||||
return ft;
|
||||
return;
|
||||
}
|
||||
} while (it != start);
|
||||
|
||||
done_cycle:
|
||||
if (done && focus_cycle_target)
|
||||
client_activate(focus_cycle_target, FALSE);
|
||||
|
||||
t = NULL;
|
||||
first = NULL;
|
||||
focus_cycle_target = NULL;
|
||||
|
@ -327,7 +329,51 @@ done_cycle:
|
|||
|
||||
popup_cycle(ft, FALSE);
|
||||
|
||||
return NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
void focus_directional_cycle(ObDirection dir,
|
||||
gboolean dialog, gboolean done, gboolean cancel)
|
||||
{
|
||||
static ObClient *first = NULL;
|
||||
ObClient *ft;
|
||||
|
||||
if (cancel) {
|
||||
if (focus_cycle_target)
|
||||
frame_adjust_focus(focus_cycle_target->frame, FALSE);
|
||||
if (focus_client)
|
||||
frame_adjust_focus(focus_client->frame, TRUE);
|
||||
focus_cycle_target = NULL;
|
||||
goto done_cycle;
|
||||
} else if (done && dialog) {
|
||||
goto done_cycle;
|
||||
}
|
||||
|
||||
if (!first) first = focus_client;
|
||||
if (!focus_cycle_target) focus_cycle_target = focus_client;
|
||||
|
||||
if ((ft = client_find_directional(focus_cycle_target, dir))) {
|
||||
if (ft != focus_cycle_target) {/* prevents flicker */
|
||||
if (focus_cycle_target)
|
||||
frame_adjust_focus(focus_cycle_target->frame, FALSE);
|
||||
focus_cycle_target = ft;
|
||||
frame_adjust_focus(focus_cycle_target->frame, TRUE);
|
||||
}
|
||||
popup_cycle(ft, dialog);
|
||||
}
|
||||
if (dialog)
|
||||
return;
|
||||
|
||||
done_cycle:
|
||||
if (done && focus_cycle_target)
|
||||
client_activate(focus_cycle_target, FALSE);
|
||||
|
||||
first = NULL;
|
||||
focus_cycle_target = NULL;
|
||||
|
||||
popup_cycle(ft, FALSE);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void focus_order_add_new(ObClient *c)
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef __focus_h
|
||||
#define __focus_h
|
||||
|
||||
#include "misc.h"
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <glib.h>
|
||||
|
||||
|
@ -31,8 +33,10 @@ void focus_fallback(ObFocusFallbackType type);
|
|||
|
||||
/*! Cycle focus amongst windows
|
||||
Returns the _ObClient to which focus has been cycled, or NULL if none. */
|
||||
struct _ObClient *focus_cycle(gboolean forward, gboolean linear,
|
||||
gboolean dialog, gboolean done, gboolean cancel);
|
||||
void focus_cycle(gboolean forward, gboolean linear,
|
||||
gboolean dialog, gboolean done, gboolean cancel);
|
||||
void focus_directional_cycle(ObDirection dir,
|
||||
gboolean dialog, gboolean done, gboolean cancel);
|
||||
|
||||
/*! Add a new client into the focus order */
|
||||
void focus_order_add_new(struct _ObClient *c);
|
||||
|
|
Loading…
Reference in a new issue