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:
Richard Grenville
2012-12-07 22:38:10 +08:00
parent a7189263e1
commit 812ba93516
2 changed files with 176 additions and 58 deletions

View File

@ -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);