Skip to content

Commit 2899c78

Browse files
committed
win: add animation suppressions setting
This can be used to prevent another animation from interrupting the current running animation. Signed-off-by: Yuxuan Shui <yshuiv7@gmail.com>
1 parent bf6fc47 commit 2899c78

File tree

4 files changed

+69
-8
lines changed

4 files changed

+69
-8
lines changed

src/config.h

+3
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ static const char *animation_trigger_names[] attr_unused = {
110110
struct script;
111111
struct win_script {
112112
int output_indices[NUM_OF_WIN_SCRIPT_OUTPUTS];
113+
/// A running animation can be configured to prevent other animations from
114+
/// starting.
115+
uint64_t suppressions;
113116
struct script *script;
114117
};
115118

src/config_libconfig.c

+57-8
Original file line numberDiff line numberDiff line change
@@ -250,9 +250,10 @@ compile_win_script(config_setting_t *setting, int *output_indices, char **err) {
250250
return script;
251251
}
252252

253-
static bool set_animation(struct win_script *animations,
254-
const enum animation_trigger *triggers, int number_of_triggers,
255-
struct script *script, const int *output_indices, unsigned line) {
253+
static bool
254+
set_animation(struct win_script *animations, const enum animation_trigger *triggers,
255+
int number_of_triggers, struct script *script, const int *output_indices,
256+
uint64_t suppressions, unsigned line) {
256257
bool needed = false;
257258
for (int i = 0; i < number_of_triggers; i++) {
258259
if (triggers[i] == ANIMATION_TRIGGER_INVALID) {
@@ -268,6 +269,7 @@ static bool set_animation(struct win_script *animations,
268269
memcpy(animations[triggers[i]].output_indices, output_indices,
269270
sizeof(int[NUM_OF_WIN_SCRIPT_OUTPUTS]));
270271
animations[triggers[i]].script = script;
272+
animations[triggers[i]].suppressions = suppressions;
271273
needed = true;
272274
}
273275
return needed;
@@ -317,6 +319,52 @@ parse_animation_one(struct win_script *animations, config_setting_t *setting) {
317319
// script parser shouldn't see this.
318320
config_setting_remove(setting, "triggers");
319321

322+
uint64_t suppressions = 0;
323+
auto suppressions_setting = config_setting_lookup(setting, "suppressions");
324+
if (suppressions_setting != NULL) {
325+
auto single_suppression = config_setting_get_string(suppressions_setting);
326+
if (!config_setting_is_list(suppressions_setting) &&
327+
!config_setting_is_array(suppressions_setting) &&
328+
single_suppression == NULL) {
329+
log_error("The \"suppressions\" option must either be a string, "
330+
"a list, or an array, but is none of those at line %d",
331+
config_setting_source_line(suppressions_setting));
332+
return NULL;
333+
}
334+
if (single_suppression != NULL) {
335+
auto suppression = parse_animation_trigger(single_suppression);
336+
if (suppression == ANIMATION_TRIGGER_INVALID) {
337+
log_error("Invalid suppression defined at line %d",
338+
config_setting_source_line(suppressions_setting));
339+
return NULL;
340+
}
341+
suppressions = 1 << suppression;
342+
} else {
343+
auto len = config_setting_length(suppressions_setting);
344+
for (int i = 0; i < len; i++) {
345+
auto suppression_str =
346+
config_setting_get_string_elem(suppressions_setting, i);
347+
if (suppression_str == NULL) {
348+
log_error(
349+
"The \"suppressions\" option must only "
350+
"contain strings, but one of them is not at "
351+
"line %d",
352+
config_setting_source_line(suppressions_setting));
353+
return NULL;
354+
}
355+
auto suppression = parse_animation_trigger(suppression_str);
356+
if (suppression == ANIMATION_TRIGGER_INVALID) {
357+
log_error(
358+
"Invalid suppression defined at line %d",
359+
config_setting_source_line(suppressions_setting));
360+
return NULL;
361+
}
362+
suppressions |= 1 << suppression;
363+
}
364+
}
365+
config_setting_remove(setting, "suppressions");
366+
}
367+
320368
int output_indices[NUM_OF_WIN_SCRIPT_OUTPUTS];
321369
char *err;
322370
auto script = compile_win_script(setting, output_indices, &err);
@@ -328,7 +376,8 @@ parse_animation_one(struct win_script *animations, config_setting_t *setting) {
328376
}
329377

330378
bool needed = set_animation(animations, trigger_types, number_of_triggers, script,
331-
output_indices, config_setting_source_line(setting));
379+
output_indices, suppressions,
380+
config_setting_source_line(setting));
332381
if (!needed) {
333382
script_free(script);
334383
script = NULL;
@@ -409,7 +458,7 @@ void generate_fading_config(struct options *opt) {
409458
trigger[number_of_triggers++] = ANIMATION_TRIGGER_SHOW;
410459
}
411460
if (set_animation(opt->animations, trigger, number_of_triggers, fade_in1,
412-
output_indices, 0)) {
461+
output_indices, 0, 0)) {
413462
scripts[number_of_scripts++] = fade_in1;
414463
} else {
415464
script_free(fade_in1);
@@ -423,7 +472,7 @@ void generate_fading_config(struct options *opt) {
423472
trigger[number_of_triggers++] = ANIMATION_TRIGGER_INCREASE_OPACITY;
424473
}
425474
if (set_animation(opt->animations, trigger, number_of_triggers, fade_in2,
426-
output_indices, 0)) {
475+
output_indices, 0, 0)) {
427476
scripts[number_of_scripts++] = fade_in2;
428477
} else {
429478
script_free(fade_in2);
@@ -443,7 +492,7 @@ void generate_fading_config(struct options *opt) {
443492
trigger[number_of_triggers++] = ANIMATION_TRIGGER_HIDE;
444493
}
445494
if (set_animation(opt->animations, trigger, number_of_triggers, fade_out1,
446-
output_indices, 0)) {
495+
output_indices, 0, 0)) {
447496
scripts[number_of_scripts++] = fade_out1;
448497
} else {
449498
script_free(fade_out1);
@@ -457,7 +506,7 @@ void generate_fading_config(struct options *opt) {
457506
trigger[number_of_triggers++] = ANIMATION_TRIGGER_DECREASE_OPACITY;
458507
}
459508
if (set_animation(opt->animations, trigger, number_of_triggers, fade_out2,
460-
output_indices, 0)) {
509+
output_indices, 0, 0)) {
461510
scripts[number_of_scripts++] = fade_out2;
462511
} else {
463512
script_free(fade_out2);

src/win.c

+8
Original file line numberDiff line numberDiff line change
@@ -2343,6 +2343,13 @@ void win_process_animation_and_state_change(struct session *ps, struct managed_w
23432343
return;
23442344
}
23452345

2346+
if (w->running_animation && (w->running_animation_suppressions & (1 << trigger)) != 0) {
2347+
log_debug("Not starting animation %s for window %#010x (%s) because it "
2348+
"is being suppressed.",
2349+
animation_trigger_names[trigger], w->base.id, w->name);
2350+
return;
2351+
}
2352+
23462353
log_debug("Starting animation %s for window %#010x (%s)",
23472354
animation_trigger_names[trigger], w->base.id, w->name);
23482355

@@ -2353,6 +2360,7 @@ void win_process_animation_and_state_change(struct session *ps, struct managed_w
23532360
}
23542361
w->running_animation = new_animation;
23552362
w->running_animation_outputs = ps->o.animations[trigger].output_indices;
2363+
w->running_animation_suppressions = ps->o.animations[trigger].suppressions;
23562364
script_instance_evaluate(w->running_animation, &win_ctx);
23572365
}
23582366

src/win.h

+1
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ struct managed_win {
311311
struct win_state_change previous;
312312
struct script_instance *running_animation;
313313
const int *running_animation_outputs;
314+
uint64_t running_animation_suppressions;
314315
};
315316

316317
struct win_script_context {

0 commit comments

Comments
 (0)