diff --git a/include/nana/gui/detail/general_events.hpp b/include/nana/gui/detail/general_events.hpp index 9ea5140e..507416bb 100644 --- a/include/nana/gui/detail/general_events.hpp +++ b/include/nana/gui/detail/general_events.hpp @@ -425,6 +425,8 @@ namespace nana event_code evt_code; ///< ::nana::window window_handle; ///< A handle to the event window ::nana::point pos; ///< cursor position in the event window + ::nana::mouse button; ///< indicates a button which triggers the event + bool left_button; ///< mouse left button is pressed? bool mid_button; ///< mouse middle button is pressed? bool right_button; ///< mouse right button is pressed? diff --git a/include/nana/gui/widgets/button.hpp b/include/nana/gui/widgets/button.hpp index e57f3b12..014a29f7 100644 --- a/include/nana/gui/widgets/button.hpp +++ b/include/nana/gui/widgets/button.hpp @@ -15,7 +15,6 @@ #include "widget.hpp" #include - namespace nana{ namespace drawerbase { diff --git a/source/gui/detail/linux_X11/bedrock.cpp b/source/gui/detail/linux_X11/bedrock.cpp index cedd1a41..f541f13a 100644 --- a/source/gui/detail/linux_X11/bedrock.cpp +++ b/source/gui/detail/linux_X11/bedrock.cpp @@ -442,62 +442,53 @@ namespace detail void assign_arg(arg_mouse& arg, basic_window* wd, unsigned msg, const XEvent& evt) { arg.window_handle = reinterpret_cast(wd); + arg.button = ::nana::mouse::any_button; + + int mask_state == 0; if (ButtonPress == msg || ButtonRelease == msg) { + mask_state = evt.xbutton.state; if (evt.xbutton.button != Button4 && evt.xbutton.button != Button5) { arg.evt_code = (ButtonPress == msg ? event_code::mouse_down : event_code::mouse_up); arg.pos.x = evt.xbutton.x - wd->pos_root.x; arg.pos.y = evt.xbutton.y - wd->pos_root.y; - arg.left_button = arg.mid_button = arg.right_button = false; - arg.shift = arg.ctrl = false; switch (evt.xbutton.button) { case Button1: - arg.left_button = true; + arg.button = ::nana::mouse::left_button; break; case Button2: - arg.mid_button = true; + arg.button = ::nana::mouse::middle_button; break; case Button3: - arg.right_button = true; + arg.button = ::nana::mouse::right_button; break; } } } else if (msg == MotionNotify) { + mask_state = evt.xmotion.state; arg.evt_code = event_code::mouse_move; arg.pos.x = evt.xmotion.x - wd->pos_root.x; arg.pos.y = evt.xmotion.y - wd->pos_root.y; - arg.left_button = arg.mid_button = arg.right_button = false; - - arg.shift = evt.xmotion.state & ShiftMask; - arg.ctrl = evt.xmotion.state & ControlMask; - if (evt.xmotion.state & Button1Mask) - arg.left_button = true; - else if (evt.xmotion.state & Button2Mask) - arg.right_button = true; - else if (evt.xmotion.state & Button3Mask) - arg.mid_button = true; } else if (EnterNotify == msg) { + mask_state = evt.xcrossing.state; arg.evt_code = event_code::mouse_enter; arg.pos.x = evt.xcrossing.x - wd->pos_root.x; arg.pos.y = evt.xcrossing.y - wd->pos_root.y; - arg.left_button = arg.mid_button = arg.right_button = false; - - arg.shift = evt.xcrossing.state & ShiftMask; - arg.ctrl = evt.xcrossing.state & ControlMask; - if (evt.xcrossing.state & Button1Mask) - arg.left_button = true; - else if (evt.xcrossing.state & Button2Mask) - arg.right_button = true; - else if (evt.xcrossing.state & Button3Mask) - arg.mid_button = true; } + + arg.left_button = (Button1Mask & state); + arg.right_button = (Button2Mask & state); + arg.mid_button = (Button3Mask & state); + arg.shift = (ShiftMask & state); + arg.ctrl = (ControlMask & state); + } void assign_arg(arg_focus& arg, basic_window* wd, native_window_type recv, bool getting) @@ -780,7 +771,7 @@ namespace detail bool fire_click = false; if(msgwnd == pressed_wd) { - if(msgwnd->flags.enabled && hit) + if((arg.button == ::nana::mouse::left_button) && hit) { msgwnd->flags.action = mouse_action::over; arg.evt_code = event_code::click; diff --git a/source/gui/detail/win32/bedrock.cpp b/source/gui/detail/win32/bedrock.cpp index 78609ac0..5475b227 100644 --- a/source/gui/detail/win32/bedrock.cpp +++ b/source/gui/detail/win32/bedrock.cpp @@ -485,46 +485,63 @@ namespace detail void assign_arg(nana::arg_mouse& arg, basic_window* wd, unsigned msg, const parameter_decoder& pmdec) { arg.window_handle = reinterpret_cast(wd); - //event code + + bool set_key_state = true; switch (msg) { - case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: + case WM_LBUTTONDOWN: + arg.button = ::nana::mouse::left_button; + arg.evt_code = event_code::mouse_down; + break; + case WM_RBUTTONDOWN: + arg.button = ::nana::mouse::right_button; + arg.evt_code = event_code::mouse_down; + break; + case WM_MBUTTONDOWN: + arg.button = ::nana::mouse::middle_button; + arg.evt_code = event_code::mouse_down; + break; + case WM_LBUTTONUP: + arg.button = ::nana::mouse::left_button; arg.evt_code = event_code::mouse_up; break; - case WM_LBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_RBUTTONDBLCLK: + case WM_RBUTTONUP: + arg.button = ::nana::mouse::right_button; + arg.evt_code = event_code::mouse_up; + break; + case WM_MBUTTONUP: + arg.button = ::nana::mouse::middle_button; + arg.evt_code = event_code::mouse_up; + break; + case WM_LBUTTONDBLCLK: + arg.button = ::nana::mouse::left_button; + arg.evt_code = (wd->flags.dbl_click ? event_code::dbl_click : event_code::mouse_down); + break; + case WM_MBUTTONDBLCLK: + arg.button = ::nana::mouse::middle_button; + arg.evt_code = (wd->flags.dbl_click ? event_code::dbl_click : event_code::mouse_down); + break; + case WM_RBUTTONDBLCLK: + arg.button = ::nana::mouse::right_button; arg.evt_code = (wd->flags.dbl_click ? event_code::dbl_click : event_code::mouse_down); break; case WM_MOUSEMOVE: + arg.button = ::nana::mouse::any_button; arg.evt_code = event_code::mouse_move; break; + default: + set_key_state = false; } - //event arguments - switch (msg) + if (set_key_state) { - case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: - arg.evt_code = event_code::mouse_down; - case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: - case WM_LBUTTONDBLCLK: case WM_MBUTTONDBLCLK: case WM_RBUTTONDBLCLK: - case WM_MOUSEMOVE: arg.pos.x = pmdec.mouse.x - wd->pos_root.x; arg.pos.y = pmdec.mouse.y - wd->pos_root.y; arg.shift = pmdec.mouse.button.shift; arg.ctrl = pmdec.mouse.button.ctrl; - - switch (msg) - { - case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: - arg.left_button = (WM_LBUTTONUP == msg); - arg.right_button = (WM_RBUTTONUP == msg); - arg.mid_button = (WM_MBUTTONUP == msg); - break; - default: - arg.left_button = pmdec.mouse.button.left; - arg.mid_button = pmdec.mouse.button.middle; - arg.right_button = pmdec.mouse.button.right; - } - break; + arg.left_button = pmdec.mouse.button.left; + arg.mid_button = pmdec.mouse.button.middle; + arg.right_button = pmdec.mouse.button.right; } } @@ -988,7 +1005,7 @@ namespace detail if (msgwnd->dimension.is_hit(arg.pos)) { msgwnd->flags.action = mouse_action::over; - if ((msgwnd == pressed_wd) && msgwnd->flags.enabled) + if (::nana::mouse::left_button == arg.button) { arg.evt_code = event_code::click; emit_drawer(&drawer::click, msgwnd, arg, &context); diff --git a/source/gui/widgets/button.cpp b/source/gui/widgets/button.cpp index 9a4c676e..fd007531 100644 --- a/source/gui/widgets/button.cpp +++ b/source/gui/widgets/button.cpp @@ -17,6 +17,7 @@ namespace nana{ namespace drawerbase { namespace button { + //trigger //@brief: draw the button trigger::trigger() @@ -118,8 +119,11 @@ namespace nana{ namespace drawerbase API::lazy_refresh(); } - void trigger::mouse_down(graph_reference graph, const arg_mouse&) + void trigger::mouse_down(graph_reference graph, const arg_mouse& arg) { + if (::nana::mouse::left_button != arg.button) + return; + attr_.e_state = element_state::pressed; attr_.keep_pressed = true; @@ -128,8 +132,11 @@ namespace nana{ namespace drawerbase API::lazy_refresh(); } - void trigger::mouse_up(graph_reference graph, const arg_mouse&) + void trigger::mouse_up(graph_reference graph, const arg_mouse& arg) { + if (::nana::mouse::left_button != arg.button) + return; + API::capture_window(*wdg_, false); attr_.keep_pressed = false; if(attr_.enable_pushed && (false == attr_.pushed)) @@ -340,6 +347,7 @@ namespace nana{ namespace drawerbase arg.evt_code = event_code::click; arg.window_handle = wdg_->handle(); arg.ctrl = arg.shift = false; + arg.button = ::nana::mouse::left_button; arg.mid_button = arg.right_button = false; arg.left_button = true; arg.pos.x = arg.pos.y = 1;