Bug fix #68: Possible fix for failure in client window detection
- Note I'm not in the best state today (bad cold & sleep-deprived). This commit is likely to introduce bugs. - Attempt to fix client window detection failures happening when compton searches for client window before it's ready. - Fix build failure with <libpcre-8.20. Thanks to @pvanek for reporting in #51. - Move client window detection to a new function win_recheck_client(). - Add win_unmark_client(), which unmarks a client window. - Rename a few functions. - Split fetching of values of type-Window properties to a new function wid_get_prop_window(). - Add extra safety checks and assert calls to various functions, to expose potential bugs. - Fix a memory leak that w->role is not freed on window destruction.
This commit is contained in:
@ -58,7 +58,10 @@
|
||||
|
||||
// For compatiblity with <libpcre-8.20
|
||||
#ifndef PCRE_STUDY_JIT_COMPILE
|
||||
#define PCRE_STUDY_JIT_COMPILE 0
|
||||
#define PCRE_STUDY_JIT_COMPILE 0
|
||||
#define LPCRE_FREE_STUDY(extra) pcre_free(extra)
|
||||
#else
|
||||
#define LPCRE_FREE_STUDY(extra) pcre_free_study(extra)
|
||||
#endif
|
||||
|
||||
#endif
|
||||
@ -1039,7 +1042,7 @@ free_wincond(wincond_t *cond) {
|
||||
free(cond->pattern);
|
||||
#ifdef CONFIG_REGEX_PCRE
|
||||
if (cond->regex_pcre_extra)
|
||||
pcre_free_study(cond->regex_pcre_extra);
|
||||
LPCRE_FREE_STUDY(cond->regex_pcre_extra);
|
||||
if (cond->regex_pcre)
|
||||
pcre_free(cond->regex_pcre);
|
||||
#endif
|
||||
@ -1077,6 +1080,7 @@ free_win_res(session_t *ps, win *w) {
|
||||
free(w->name);
|
||||
free(w->class_instance);
|
||||
free(w->class_general);
|
||||
free(w->role);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1149,15 +1153,15 @@ static inline bool is_normal_win(const win *w) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if a window has a specific attribute.
|
||||
* Determine if a window has a specific property.
|
||||
*
|
||||
* @param session_t current session
|
||||
* @param w window to check
|
||||
* @param atom atom of attribute to check
|
||||
* @param atom atom of property to check
|
||||
* @return 1 if it has the attribute, 0 otherwise
|
||||
*/
|
||||
static inline bool
|
||||
wid_has_attr(const session_t *ps, Window w, Atom atom) {
|
||||
wid_has_prop(const session_t *ps, Window w, Atom atom) {
|
||||
Atom type = None;
|
||||
int format;
|
||||
unsigned long nitems, after;
|
||||
@ -1451,6 +1455,10 @@ win_update_focused(session_t *ps, win *w) {
|
||||
*/
|
||||
static inline void
|
||||
win_set_focused(session_t *ps, win *w, bool focused) {
|
||||
// Unmapped windows will have their focused state reset on map
|
||||
if (IsUnmapped == w->a.map_state)
|
||||
return;
|
||||
|
||||
w->focused_real = focused;
|
||||
win_update_focused(ps, w);
|
||||
}
|
||||
@ -1480,7 +1488,13 @@ static void
|
||||
calc_shadow_geometry(session_t *ps, win *w);
|
||||
|
||||
static void
|
||||
mark_client_win(session_t *ps, win *w, Window client);
|
||||
win_mark_client(session_t *ps, win *w, Window client);
|
||||
|
||||
static void
|
||||
win_unmark_client(session_t *ps, win *w);
|
||||
|
||||
static void
|
||||
win_recheck_client(session_t *ps, win *w);
|
||||
|
||||
static void
|
||||
add_win(session_t *ps, Window id, Window prev);
|
||||
@ -1516,6 +1530,9 @@ static bool
|
||||
wid_get_text_prop(session_t *ps, Window wid, Atom prop,
|
||||
char ***pstrlst, int *pnstr);
|
||||
|
||||
static Window
|
||||
wid_get_prop_window(session_t *ps, Window wid, Atom aprop);
|
||||
|
||||
static bool
|
||||
wid_get_name(session_t *ps, Window w, char **name);
|
||||
|
||||
|
Reference in New Issue
Block a user