Feature: Wintype-based focus exclusion
- Add "focus" to the wintypes settings in compton.conf, to mark windows of certain window types to be always focused. Replaces the ugly is_normal_win(). - Add a ON/OFF/UNSET switch_t type, but it's unused currently. - Mark client_win if the window client detection hasn't been performed when we detect WM_STATE's presence in ev_property_notify(), for performance.
This commit is contained in:
@ -162,6 +162,13 @@ typedef enum {
|
||||
NUM_WINTYPES
|
||||
} wintype_t;
|
||||
|
||||
/// Enumeration type to represent switches.
|
||||
typedef enum {
|
||||
OFF, // false
|
||||
ON, // true
|
||||
UNSET
|
||||
} switch_t;
|
||||
|
||||
typedef enum {
|
||||
WINDOW_SOLID,
|
||||
WINDOW_TRANS,
|
||||
@ -266,6 +273,7 @@ typedef struct {
|
||||
bool vsync_aggressive;
|
||||
|
||||
// === Shadow ===
|
||||
/// Enable/disable shadow for specific window types.
|
||||
bool wintype_shadow[NUM_WINTYPES];
|
||||
/// Red, green and blue tone of the shadow.
|
||||
double shadow_red, shadow_green, shadow_blue;
|
||||
@ -281,6 +289,7 @@ typedef struct {
|
||||
bool respect_prop_shadow;
|
||||
|
||||
// === Fading ===
|
||||
/// Enable/disable fading for specific window types.
|
||||
bool wintype_fade[NUM_WINTYPES];
|
||||
/// How much to fade in in a single fading step.
|
||||
opacity_t fade_in_step;
|
||||
@ -293,6 +302,7 @@ typedef struct {
|
||||
wincond_t *fade_blacklist;
|
||||
|
||||
// === Opacity ===
|
||||
/// Default opacity for specific window types
|
||||
double wintype_opacity[NUM_WINTYPES];
|
||||
/// Default opacity for inactive windows.
|
||||
/// 32-bit integer with the format of _NET_WM_OPACITY. 0 stands for
|
||||
@ -316,6 +326,8 @@ typedef struct {
|
||||
double alpha_step;
|
||||
|
||||
// === Focus related ===
|
||||
/// Consider windows of specific types to be always focused.
|
||||
bool wintype_focus[NUM_WINTYPES];
|
||||
/// Whether to use EWMH _NET_ACTIVE_WINDOW to find active window.
|
||||
bool use_ewmh_active_win;
|
||||
/// A list of windows always to be considered focused.
|
||||
@ -764,7 +776,7 @@ sub_unslong(unsigned long a, unsigned long b) {
|
||||
/**
|
||||
* Set a <code>bool</code> array of all wintypes to true.
|
||||
*/
|
||||
static void
|
||||
static inline void
|
||||
wintype_arr_enable(bool arr[]) {
|
||||
wintype_t i;
|
||||
|
||||
@ -773,6 +785,18 @@ wintype_arr_enable(bool arr[]) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a <code>switch_t</code> array of all unset wintypes to true.
|
||||
*/
|
||||
static inline void
|
||||
wintype_arr_enable_unset(switch_t arr[]) {
|
||||
wintype_t i;
|
||||
|
||||
for (i = 0; i < NUM_WINTYPES; ++i)
|
||||
if (UNSET == arr[i])
|
||||
arr[i] = ON;
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocate the space and copy a string.
|
||||
*/
|
||||
@ -1147,11 +1171,6 @@ static Picture
|
||||
solid_picture(session_t *ps, bool argb, double a,
|
||||
double r, double g, double b);
|
||||
|
||||
static inline bool is_normal_win(const win *w) {
|
||||
return (WINTYPE_NORMAL == w->window_type
|
||||
|| WINTYPE_UTILITY == w->window_type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a window has a specific property.
|
||||
*
|
||||
@ -1439,8 +1458,10 @@ win_update_focused(session_t *ps, win *w) {
|
||||
|
||||
w->focused = w->focused_real;
|
||||
|
||||
// Treat WM windows and override-redirected windows specially
|
||||
if ((ps->o.mark_wmwin_focused && w->wmwin)
|
||||
// Use wintype_focus, and treat WM windows and override-redirected
|
||||
// windows specially
|
||||
if (ps->o.wintype_focus[w->window_type]
|
||||
|| (ps->o.mark_wmwin_focused && w->wmwin)
|
||||
|| (ps->o.mark_ovredir_focused
|
||||
&& w->id == w->client_win && !w->wmwin)
|
||||
|| win_match(w, ps->o.focus_blacklist, &w->cache_fcblst))
|
||||
|
Reference in New Issue
Block a user