c2: Fix scope of predefined target in leaf-matching

Keeping pointers to variables with smaller scope is unsafe as the
compiler might choose to optimize them out.
This commit is contained in:
Bernd Busse 2020-12-17 11:35:10 +01:00
parent 2e2b1eeeb1
commit a335eed0b5
No known key found for this signature in database
GPG Key ID: 6DD2A3C48E63A5AB
1 changed files with 34 additions and 28 deletions

View File

@ -1330,36 +1330,40 @@ static inline void c2_match_once_leaf(session_t *ps, const struct managed_win *w
// Get the value // Get the value
// A predefined target // A predefined target
long predef_target = 0;
if (pleaf->predef != C2_L_PUNDEFINED) { if (pleaf->predef != C2_L_PUNDEFINED) {
long tgt = 0;
*perr = false; *perr = false;
switch (pleaf->predef) { switch (pleaf->predef) {
case C2_L_PID: tgt = wid; break; case C2_L_PID: predef_target = wid; break;
case C2_L_PX: tgt = w->g.x; break; case C2_L_PX: predef_target = w->g.x; break;
case C2_L_PY: tgt = w->g.y; break; case C2_L_PY: predef_target = w->g.y; break;
case C2_L_PX2: tgt = w->g.x + w->widthb; break; case C2_L_PX2: predef_target = w->g.x + w->widthb; break;
case C2_L_PY2: tgt = w->g.y + w->heightb; break; case C2_L_PY2: predef_target = w->g.y + w->heightb; break;
case C2_L_PWIDTH: tgt = w->g.width; break; case C2_L_PWIDTH: predef_target = w->g.width; break;
case C2_L_PHEIGHT: tgt = w->g.height; break; case C2_L_PHEIGHT: predef_target = w->g.height; break;
case C2_L_PWIDTHB: tgt = w->widthb; break; case C2_L_PWIDTHB: predef_target = w->widthb; break;
case C2_L_PHEIGHTB: tgt = w->heightb; break; case C2_L_PHEIGHTB: predef_target = w->heightb; break;
case C2_L_PBDW: tgt = w->g.border_width; break; case C2_L_PBDW: predef_target = w->g.border_width; break;
case C2_L_PFULLSCREEN: tgt = win_is_fullscreen(ps, w); break; case C2_L_PFULLSCREEN:
case C2_L_POVREDIR: tgt = w->a.override_redirect; break; predef_target = win_is_fullscreen(ps, w);
case C2_L_PARGB: tgt = win_has_alpha(w); break; break;
case C2_L_PFOCUSED: tgt = win_is_focused_raw(ps, w); break; case C2_L_POVREDIR: predef_target = w->a.override_redirect; break;
case C2_L_PWMWIN: tgt = w->wmwin; break; case C2_L_PARGB: predef_target = win_has_alpha(w); break;
case C2_L_PBSHAPED: tgt = w->bounding_shaped; break; case C2_L_PFOCUSED:
case C2_L_PROUNDED: tgt = w->rounded_corners; break; predef_target = win_is_focused_raw(ps, w);
case C2_L_PCLIENT: tgt = w->client_win; break; break;
case C2_L_PLEADER: tgt = w->leader; break; case C2_L_PWMWIN: predef_target = w->wmwin; break;
case C2_L_PBSHAPED: predef_target = w->bounding_shaped; break;
case C2_L_PROUNDED: predef_target = w->rounded_corners; break;
case C2_L_PCLIENT: predef_target = w->client_win; break;
case C2_L_PLEADER: predef_target = w->leader; break;
default: default:
*perr = true; *perr = true;
assert(0); assert(0);
break; break;
} }
ntargets = 1; ntargets = 1;
targets = &tgt; targets = &predef_target;
} }
// A raw window property // A raw window property
else { else {
@ -1423,18 +1427,20 @@ static inline void c2_match_once_leaf(session_t *ps, const struct managed_win *w
size_t ntargets = 0; size_t ntargets = 0;
// A predefined target // A predefined target
const char *predef_target = NULL;
if (pleaf->predef != C2_L_PUNDEFINED) { if (pleaf->predef != C2_L_PUNDEFINED) {
const char *tgt = NULL;
switch (pleaf->predef) { switch (pleaf->predef) {
case C2_L_PWINDOWTYPE: tgt = WINTYPES[w->window_type]; break; case C2_L_PWINDOWTYPE:
case C2_L_PNAME: tgt = w->name; break; predef_target = WINTYPES[w->window_type];
case C2_L_PCLASSG: tgt = w->class_general; break; break;
case C2_L_PCLASSI: tgt = w->class_instance; break; case C2_L_PNAME: predef_target = w->name; break;
case C2_L_PROLE: tgt = w->role; break; case C2_L_PCLASSG: predef_target = w->class_general; break;
case C2_L_PCLASSI: predef_target = w->class_instance; break;
case C2_L_PROLE: predef_target = w->role; break;
default: assert(0); break; default: assert(0); break;
} }
ntargets = 1; ntargets = 1;
targets = &tgt; targets = &predef_target;
} }
// An atom type property, convert it to string // An atom type property, convert it to string
else if (pleaf->type == C2_L_TATOM) { else if (pleaf->type == C2_L_TATOM) {