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,
|
void focus_cycle(gboolean forward, gboolean linear,
|
||||||
gboolean dialog, gboolean done, gboolean cancel)
|
gboolean dialog, gboolean done, gboolean cancel)
|
||||||
{
|
{
|
||||||
static ObClient *first = NULL;
|
static ObClient *first = NULL;
|
||||||
static ObClient *t = NULL;
|
static ObClient *t = NULL;
|
||||||
|
@ -271,10 +271,9 @@ ObClient *focus_cycle(gboolean forward, gboolean linear,
|
||||||
frame_adjust_focus(focus_cycle_target->frame, FALSE);
|
frame_adjust_focus(focus_cycle_target->frame, FALSE);
|
||||||
if (focus_client)
|
if (focus_client)
|
||||||
frame_adjust_focus(focus_client->frame, TRUE);
|
frame_adjust_focus(focus_client->frame, TRUE);
|
||||||
|
focus_cycle_target = NULL;
|
||||||
goto done_cycle;
|
goto done_cycle;
|
||||||
} else if (done) {
|
} else if (done && dialog) {
|
||||||
if (focus_cycle_target)
|
|
||||||
client_activate(focus_cycle_target, FALSE);
|
|
||||||
goto done_cycle;
|
goto done_cycle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,11 +313,14 @@ ObClient *focus_cycle(gboolean forward, gboolean linear,
|
||||||
frame_adjust_focus(focus_cycle_target->frame, TRUE);
|
frame_adjust_focus(focus_cycle_target->frame, TRUE);
|
||||||
}
|
}
|
||||||
popup_cycle(ft, dialog);
|
popup_cycle(ft, dialog);
|
||||||
return ft;
|
return;
|
||||||
}
|
}
|
||||||
} while (it != start);
|
} while (it != start);
|
||||||
|
|
||||||
done_cycle:
|
done_cycle:
|
||||||
|
if (done && focus_cycle_target)
|
||||||
|
client_activate(focus_cycle_target, FALSE);
|
||||||
|
|
||||||
t = NULL;
|
t = NULL;
|
||||||
first = NULL;
|
first = NULL;
|
||||||
focus_cycle_target = NULL;
|
focus_cycle_target = NULL;
|
||||||
|
@ -327,7 +329,51 @@ done_cycle:
|
||||||
|
|
||||||
popup_cycle(ft, FALSE);
|
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)
|
void focus_order_add_new(ObClient *c)
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef __focus_h
|
#ifndef __focus_h
|
||||||
#define __focus_h
|
#define __focus_h
|
||||||
|
|
||||||
|
#include "misc.h"
|
||||||
|
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
|
@ -31,8 +33,10 @@ void focus_fallback(ObFocusFallbackType type);
|
||||||
|
|
||||||
/*! Cycle focus amongst windows
|
/*! Cycle focus amongst windows
|
||||||
Returns the _ObClient to which focus has been cycled, or NULL if none. */
|
Returns the _ObClient to which focus has been cycled, or NULL if none. */
|
||||||
struct _ObClient *focus_cycle(gboolean forward, gboolean linear,
|
void focus_cycle(gboolean forward, gboolean linear,
|
||||||
gboolean dialog, gboolean done, gboolean cancel);
|
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 */
|
/*! Add a new client into the focus order */
|
||||||
void focus_order_add_new(struct _ObClient *c);
|
void focus_order_add_new(struct _ObClient *c);
|
||||||
|
|
Loading…
Reference in a new issue