From 8515fff8d054570030f462ce5ed0a5aa8692016c Mon Sep 17 00:00:00 2001 From: Jinhao Date: Wed, 20 May 2015 02:26:39 +0800 Subject: [PATCH 1/2] stop changing focus when dbl clicks on form/panel background --- source/gui/detail/linux_X11/bedrock.cpp | 18 ++++------- source/gui/detail/win32/bedrock.cpp | 27 ++++++++-------- source/gui/detail/window_manager.cpp | 42 ++++++++++--------------- 3 files changed, 36 insertions(+), 51 deletions(-) diff --git a/source/gui/detail/linux_X11/bedrock.cpp b/source/gui/detail/linux_X11/bedrock.cpp index d6ad0255..91c39612 100644 --- a/source/gui/detail/linux_X11/bedrock.cpp +++ b/source/gui/detail/linux_X11/bedrock.cpp @@ -726,7 +726,7 @@ namespace detail last_mouse_down_window = msgwnd; auto new_focus = (msgwnd->flags.take_active ? msgwnd : msgwnd->other.active_window); - if(new_focus) + if(new_focus && !new_focus->flags.ignore_mouse_focus) { context.event_window = new_focus; auto kill_focus = brock.wd_manager.set_focus(new_focus, false); @@ -1028,18 +1028,12 @@ namespace detail arg_keyboard argkey; brock.get_key_state(argkey); auto tstop_wd = brock.wd_manager.tabstop(msgwnd, argkey.shift); - while (tstop_wd) + if (tstop_wd) { - if (!tstop_wd->flags.ignore_mouse_focus) - { - brock.wd_manager.set_focus(tstop_wd, false); - brock.wd_manager.do_lazy_refresh(msgwnd, false); - brock.wd_manager.do_lazy_refresh(tstop_wd, true); - root_runtime->condition.tabstop_focus_changed = true; - break; - } - - tstop_wd = brock.wd_manager.tabstop(tstop_wd, is_forward); + brock.wd_manager.set_focus(tstop_wd, false); + brock.wd_manager.do_lazy_refresh(msgwnd, false); + brock.wd_manager.do_lazy_refresh(tstop_wd, true); + root_runtime->condition.tabstop_focus_changed = true; } } else if(keyboard::alt == keychar) diff --git a/source/gui/detail/win32/bedrock.cpp b/source/gui/detail/win32/bedrock.cpp index 1e44cb4e..fc35e790 100644 --- a/source/gui/detail/win32/bedrock.cpp +++ b/source/gui/detail/win32/bedrock.cpp @@ -905,8 +905,15 @@ namespace detail msgwnd = brock.wd_manager.find_window(native_window, pmdec.mouse.x, pmdec.mouse.y); if(msgwnd && msgwnd->flags.enabled) { - if(msgwnd->flags.take_active) - brock.wd_manager.set_focus(msgwnd, false); + if (msgwnd->flags.take_active && !msgwnd->flags.ignore_mouse_focus) + { + auto killed = brock.wd_manager.set_focus(msgwnd, false); + if (killed != msgwnd) + { + brock.wd_manager.do_lazy_refresh(killed, false); + msgwnd->root_widget->other.attribute.root->context.focus_changed = false; + } + } arg_mouse arg; assign_arg(arg, msgwnd, message, pmdec); @@ -1396,18 +1403,12 @@ namespace detail bool is_forward = (::GetKeyState(VK_SHIFT) >= 0); auto tstop_wd = brock.wd_manager.tabstop(msgwnd, is_forward); - while (tstop_wd) + if (tstop_wd) { - if (!tstop_wd->flags.ignore_mouse_focus) - { - brock.wd_manager.set_focus(tstop_wd, false); - brock.wd_manager.do_lazy_refresh(msgwnd, false); - brock.wd_manager.do_lazy_refresh(tstop_wd, true); - root_runtime->condition.tabstop_focus_changed = true; - break; - } - - tstop_wd = brock.wd_manager.tabstop(tstop_wd, is_forward); + brock.wd_manager.set_focus(tstop_wd, false); + brock.wd_manager.do_lazy_refresh(msgwnd, false); + brock.wd_manager.do_lazy_refresh(tstop_wd, true); + root_runtime->condition.tabstop_focus_changed = true; } } else diff --git a/source/gui/detail/window_manager.cpp b/source/gui/detail/window_manager.cpp index 8188a1cb..9ff2a187 100644 --- a/source/gui/detail/window_manager.cpp +++ b/source/gui/detail/window_manager.cpp @@ -1023,34 +1023,24 @@ namespace detail return nullptr; auto & tabs = wd->root_widget->other.attribute.root->tabstop; - if (tabs.size()) + if (tabs.empty()) + return nullptr; + + if ((detail::tab_type::none == wd->flags.tab) || !(detail::tab_type::tabstop & wd->flags.tab)) + return (forward ? tabs.front() : tabs.back()); + + auto i = std::find(tabs.cbegin(), tabs.cend(), wd); + if (tabs.cend() == i) + return (forward ? tabs.front() : tabs.back()); + + if (forward) { - if (forward) // - { - if (detail::tab_type::none == wd->flags.tab) - return (tabs.front()); - else if (detail::tab_type::tabstop & wd->flags.tab) - { - auto end = tabs.cend(); - auto i = std::find(tabs.cbegin(), end, wd); - if (i != end) - { - ++i; - core_window_t* ts = (i != end ? (*i) : tabs.front()); - return (ts != wd ? ts : nullptr); - } - else - return tabs.front(); - } - } - else if (tabs.size() > 1) //at least 2 elments in tabs is required when moving perviously. - { - auto i = std::find(tabs.cbegin(), tabs.cend(), wd); - if (i != tabs.cend()) - return (tabs.cbegin() == i ? tabs.back() : *(i - 1)); - } + ++i; + core_window_t* ts = (i != tabs.cend() ? (*i) : tabs.front()); + return (ts != wd ? ts : nullptr); } - return nullptr; + + return (tabs.cbegin() == i ? tabs.back() : *(i - 1)); } void window_manager::remove_trash_handle(unsigned tid) From ffe32e1bcb92b33625296e22e41b3d36474926ab Mon Sep 17 00:00:00 2001 From: Jinhao Date: Sat, 23 May 2015 08:47:12 +0800 Subject: [PATCH 2/2] remove focus_changed flag --- include/nana/gui/detail/basic_window.hpp | 8 +------- source/gui/detail/basic_window.cpp | 1 - source/gui/detail/linux_X11/bedrock.cpp | 5 ++--- source/gui/detail/win32/bedrock.cpp | 13 +------------ 4 files changed, 4 insertions(+), 23 deletions(-) diff --git a/include/nana/gui/detail/basic_window.hpp b/include/nana/gui/detail/basic_window.hpp index 5534e738..b0a5bfe7 100644 --- a/include/nana/gui/detail/basic_window.hpp +++ b/include/nana/gui/detail/basic_window.hpp @@ -76,11 +76,6 @@ namespace detail { using container = std::vector; - struct root_context - { - bool focus_changed; - }; - enum class update_state { none, lazy, refresh @@ -203,7 +198,6 @@ namespace detail std::vector effects_edge_nimbus; basic_window* focus{nullptr}; basic_window* menubar{nullptr}; - root_context context; bool ime_enabled{false}; #if defined(NANA_WINDOWS) cursor running_cursor{ nana::cursor::arrow }; @@ -211,7 +205,7 @@ namespace detail cursor state_cursor{nana::cursor::arrow}; basic_window* state_cursor_window{ nullptr }; - std::function draw_through; ///< A draw through renderer for root widgets. + std::function draw_through; // A draw through renderer for root widgets. }; const category::flags category; diff --git a/source/gui/detail/basic_window.cpp b/source/gui/detail/basic_window.cpp index 16889dff..91cb5db5 100644 --- a/source/gui/detail/basic_window.cpp +++ b/source/gui/detail/basic_window.cpp @@ -195,7 +195,6 @@ namespace nana { case category::root_tag::value: attribute.root = new attr_root_tag; - attribute.root->context.focus_changed = false; break; case category::frame_tag::value: attribute.frame = new attr_frame_tag; diff --git a/source/gui/detail/linux_X11/bedrock.cpp b/source/gui/detail/linux_X11/bedrock.cpp index 91c39612..f5bf3c14 100644 --- a/source/gui/detail/linux_X11/bedrock.cpp +++ b/source/gui/detail/linux_X11/bedrock.cpp @@ -664,7 +664,6 @@ namespace detail auto focus = msgwnd->other.attribute.root->focus; if(focus && focus->together.caret) focus->together.caret->set_active(true); - msgwnd->root_widget->other.attribute.root->context.focus_changed = true; arg_focus arg; arg.window_handle = reinterpret_cast(focus); @@ -733,8 +732,8 @@ namespace detail if(kill_focus != new_focus) brock.wd_manager.do_lazy_refresh(kill_focus, false); } + auto retain = msgwnd->together.events_ptr; - msgwnd->root_widget->other.attribute.root->context.focus_changed = false; context.event_window = msgwnd; pressed_wd = nullptr; @@ -748,7 +747,7 @@ namespace detail { pressed_wd = msgwnd; //If a root window is created during the mouse_down event, Nana.GUI will ignore the mouse_up event. - if(msgwnd->root_widget->other.attribute.root->context.focus_changed) + if (msgwnd->root != native_interface::get_focus_window()) { //call the drawer mouse up event for restoring the surface graphics msgwnd->flags.action = mouse_action::normal; diff --git a/source/gui/detail/win32/bedrock.cpp b/source/gui/detail/win32/bedrock.cpp index fc35e790..a1eb7c59 100644 --- a/source/gui/detail/win32/bedrock.cpp +++ b/source/gui/detail/win32/bedrock.cpp @@ -863,8 +863,6 @@ namespace detail if(focus && focus->together.caret) focus->together.caret->set_active(true); - msgwnd->root_widget->other.attribute.root->context.focus_changed = true; - arg_focus arg; assign_arg(arg, focus, native_window, true); if (!brock.emit(event_code::focus, focus, arg, true, &context)) @@ -888,9 +886,6 @@ namespace detail //wParam indicates a handle of window that receives the focus. brock.close_menu_if_focus_other_window(reinterpret_cast(wParam)); } - //focus_changed means that during an event procedure if the focus is changed - if(brock.wd_manager.available(msgwnd)) - msgwnd->root_widget->other.attribute.root->context.focus_changed = true; def_window_proc = true; break; @@ -909,10 +904,7 @@ namespace detail { auto killed = brock.wd_manager.set_focus(msgwnd, false); if (killed != msgwnd) - { brock.wd_manager.do_lazy_refresh(killed, false); - msgwnd->root_widget->other.attribute.root->context.focus_changed = false; - } } arg_mouse arg; @@ -946,10 +938,7 @@ namespace detail { auto kill_focus = brock.wd_manager.set_focus(new_focus, false); if(kill_focus != new_focus) - { brock.wd_manager.do_lazy_refresh(kill_focus, false); - msgwnd->root_widget->other.attribute.root->context.focus_changed = false; - } } arg_mouse arg; @@ -960,7 +949,7 @@ namespace detail if (brock.emit(event_code::mouse_down, msgwnd, arg, true, &context)) { //If a root_window is created during the mouse_down event, Nana.GUI will ignore the mouse_up event. - if(msgwnd->root_widget->other.attribute.root->context.focus_changed) + if (msgwnd->root != native_interface::get_focus_window()) { auto pos = native_interface::cursor_position(); auto rootwd = native_interface::find_window(pos.x, pos.y);