From 6a791f4c475f8b72dbce6f0cee9d120204ff46a2 Mon Sep 17 00:00:00 2001 From: lixianjing Date: Tue, 5 Dec 2023 15:41:28 +0800 Subject: [PATCH] improve dialog highlighter --- docs/changes.md | 1 + src/window_manager/window_manager_default.c | 39 +++++++++++++++------ 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/docs/changes.md b/docs/changes.md index 728e53dbf..ff56e9344 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -2,6 +2,7 @@ 2023/12/05 * 完善fscript部分数学函数。 + * 修复上一个高亮对话框影响下一个普通窗口播放窗口动画的问题(感谢智明提供补丁) 2023/12/04 * 完善combobox的options,如果选项第一个字符不是数字,里面存在':',也不视为分隔符。比如http://localhost视为一个整体。 diff --git a/src/window_manager/window_manager_default.c b/src/window_manager/window_manager_default.c index 37d813cea..b4d71f30e 100644 --- a/src/window_manager/window_manager_default.c +++ b/src/window_manager/window_manager_default.c @@ -434,6 +434,24 @@ static dialog_highlighter_t* window_manager_default_get_dialog_highlighter(widge return wm->dialog_highlighter; } +static ret_t window_manager_default_dialog_highlighter_destroy(widget_t* widget) { + dialog_highlighter_t* dialog_highlighter = NULL; + window_manager_default_t* wm = WINDOW_MANAGER_DEFAULT(widget); + return_value_if_fail(wm != NULL, RET_BAD_PARAMS); + dialog_highlighter = wm->dialog_highlighter; + + if (dialog_highlighter != NULL) { + widget_t* dialog = dialog_highlighter->dialog; + if (dialog != NULL) { + widget_off_by_func(dialog, EVT_DESTROY, dialog_highlighter_on_dialog_destroy, + dialog_highlighter); + } + dialog_highlighter_destroy(dialog_highlighter); + wm->dialog_highlighter = NULL; + } + return RET_OK; +} + static ret_t window_manager_default_create_dialog_highlighter(widget_t* widget, widget_t* curr_win) { ret_t ret = RET_FAIL; @@ -445,13 +463,8 @@ static ret_t window_manager_default_create_dialog_highlighter(widget_t* widget, if (dialog_highlighter != NULL && curr_highlight != NULL && (dialog_highlighter->dialog != curr_win || dialog_highlighter->used_by_others)) { /* dialog_highlighter被其他窗口使用过,需重新生成 */ - widget_t* dialog = dialog_highlighter->dialog; - if (dialog != NULL) { - widget_off_by_func(dialog, EVT_DESTROY, dialog_highlighter_on_dialog_destroy, - dialog_highlighter); - } - dialog_highlighter_destroy(dialog_highlighter); - wm->dialog_highlighter = dialog_highlighter = NULL; + window_manager_default_dialog_highlighter_destroy(widget); + dialog_highlighter = NULL; } if (dialog_highlighter == NULL && widget_is_support_highlighter(curr_win) && @@ -487,9 +500,11 @@ static ret_t window_manager_prepare_dialog_highlighter(widget_t* widget, widget_ widget_t* curr_win) { if (window_manager_default_create_dialog_highlighter(widget, curr_win) == RET_OK) { bitmap_t img = {0}; - window_manager_default_snap_prev_window(widget, prev_win, &img); - - return RET_OK; + ret_t ret = window_manager_default_snap_prev_window(widget, prev_win, &img); + if (ret != RET_OK) { + window_manager_default_dialog_highlighter_destroy(widget); + } + return ret; } return RET_FAIL; @@ -588,6 +603,10 @@ static ret_t window_manager_check_if_need_open_animation(const idle_info_t* info window_manager_default_t* wm = WINDOW_MANAGER_DEFAULT(curr_win->parent); return_value_if_fail(wm != NULL, RET_BAD_PARAMS); + if (wm->dialog_highlighter != NULL && widget_is_normal_window(curr_win)) { + window_manager_default_dialog_highlighter_destroy(WIDGET(wm)); + } + window_manager_dispatch_window_event(curr_win, EVT_WINDOW_WILL_OPEN); wm->ready_animator = FALSE; if (window_manager_create_animator(wm, curr_win, TRUE) != RET_OK) {