fix arg_mouse issue(#67)

This commit is contained in:
Jinhao 2015-07-19 20:07:27 +08:00
parent 358c0f662e
commit 628266adb4
5 changed files with 71 additions and 54 deletions

View File

@ -425,6 +425,8 @@ namespace nana
event_code evt_code; ///< event_code evt_code; ///<
::nana::window window_handle; ///< A handle to the event window ::nana::window window_handle; ///< A handle to the event window
::nana::point pos; ///< cursor position in 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 left_button; ///< mouse left button is pressed?
bool mid_button; ///< mouse middle button is pressed? bool mid_button; ///< mouse middle button is pressed?
bool right_button; ///< mouse right button is pressed? bool right_button; ///< mouse right button is pressed?

View File

@ -15,7 +15,6 @@
#include "widget.hpp" #include "widget.hpp"
#include <nana/gui/element.hpp> #include <nana/gui/element.hpp>
namespace nana{ namespace nana{
namespace drawerbase namespace drawerbase
{ {

View File

@ -442,62 +442,53 @@ namespace detail
void assign_arg(arg_mouse& arg, basic_window* wd, unsigned msg, const XEvent& evt) void assign_arg(arg_mouse& arg, basic_window* wd, unsigned msg, const XEvent& evt)
{ {
arg.window_handle = reinterpret_cast<window>(wd); arg.window_handle = reinterpret_cast<window>(wd);
arg.button = ::nana::mouse::any_button;
int mask_state == 0;
if (ButtonPress == msg || ButtonRelease == msg) if (ButtonPress == msg || ButtonRelease == msg)
{ {
mask_state = evt.xbutton.state;
if (evt.xbutton.button != Button4 && evt.xbutton.button != Button5) if (evt.xbutton.button != Button4 && evt.xbutton.button != Button5)
{ {
arg.evt_code = (ButtonPress == msg ? event_code::mouse_down : event_code::mouse_up); 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.x = evt.xbutton.x - wd->pos_root.x;
arg.pos.y = evt.xbutton.y - wd->pos_root.y; 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) switch (evt.xbutton.button)
{ {
case Button1: case Button1:
arg.left_button = true; arg.button = ::nana::mouse::left_button;
break; break;
case Button2: case Button2:
arg.mid_button = true; arg.button = ::nana::mouse::middle_button;
break; break;
case Button3: case Button3:
arg.right_button = true; arg.button = ::nana::mouse::right_button;
break; break;
} }
} }
} }
else if (msg == MotionNotify) else if (msg == MotionNotify)
{ {
mask_state = evt.xmotion.state;
arg.evt_code = event_code::mouse_move; arg.evt_code = event_code::mouse_move;
arg.pos.x = evt.xmotion.x - wd->pos_root.x; arg.pos.x = evt.xmotion.x - wd->pos_root.x;
arg.pos.y = evt.xmotion.y - wd->pos_root.y; 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) else if (EnterNotify == msg)
{ {
mask_state = evt.xcrossing.state;
arg.evt_code = event_code::mouse_enter; arg.evt_code = event_code::mouse_enter;
arg.pos.x = evt.xcrossing.x - wd->pos_root.x; arg.pos.x = evt.xcrossing.x - wd->pos_root.x;
arg.pos.y = evt.xcrossing.y - wd->pos_root.y; 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) 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; bool fire_click = false;
if(msgwnd == pressed_wd) if(msgwnd == pressed_wd)
{ {
if(msgwnd->flags.enabled && hit) if((arg.button == ::nana::mouse::left_button) && hit)
{ {
msgwnd->flags.action = mouse_action::over; msgwnd->flags.action = mouse_action::over;
arg.evt_code = event_code::click; arg.evt_code = event_code::click;

View File

@ -485,46 +485,63 @@ namespace detail
void assign_arg(nana::arg_mouse& arg, basic_window* wd, unsigned msg, const parameter_decoder& pmdec) void assign_arg(nana::arg_mouse& arg, basic_window* wd, unsigned msg, const parameter_decoder& pmdec)
{ {
arg.window_handle = reinterpret_cast<window>(wd); arg.window_handle = reinterpret_cast<window>(wd);
//event code
bool set_key_state = true;
switch (msg) 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; arg.evt_code = event_code::mouse_up;
break; 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); arg.evt_code = (wd->flags.dbl_click ? event_code::dbl_click : event_code::mouse_down);
break; break;
case WM_MOUSEMOVE: case WM_MOUSEMOVE:
arg.button = ::nana::mouse::any_button;
arg.evt_code = event_code::mouse_move; arg.evt_code = event_code::mouse_move;
break; break;
default:
set_key_state = false;
} }
//event arguments if (set_key_state)
switch (msg)
{ {
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.x = pmdec.mouse.x - wd->pos_root.x;
arg.pos.y = pmdec.mouse.y - wd->pos_root.y; arg.pos.y = pmdec.mouse.y - wd->pos_root.y;
arg.shift = pmdec.mouse.button.shift; arg.shift = pmdec.mouse.button.shift;
arg.ctrl = pmdec.mouse.button.ctrl; arg.ctrl = pmdec.mouse.button.ctrl;
arg.left_button = pmdec.mouse.button.left;
switch (msg) arg.mid_button = pmdec.mouse.button.middle;
{ arg.right_button = pmdec.mouse.button.right;
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;
} }
} }
@ -988,7 +1005,7 @@ namespace detail
if (msgwnd->dimension.is_hit(arg.pos)) if (msgwnd->dimension.is_hit(arg.pos))
{ {
msgwnd->flags.action = mouse_action::over; 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; arg.evt_code = event_code::click;
emit_drawer(&drawer::click, msgwnd, arg, &context); emit_drawer(&drawer::click, msgwnd, arg, &context);

View File

@ -17,6 +17,7 @@ namespace nana{ namespace drawerbase
{ {
namespace button namespace button
{ {
//trigger //trigger
//@brief: draw the button //@brief: draw the button
trigger::trigger() trigger::trigger()
@ -118,8 +119,11 @@ namespace nana{ namespace drawerbase
API::lazy_refresh(); 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_.e_state = element_state::pressed;
attr_.keep_pressed = true; attr_.keep_pressed = true;
@ -128,8 +132,11 @@ namespace nana{ namespace drawerbase
API::lazy_refresh(); 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); API::capture_window(*wdg_, false);
attr_.keep_pressed = false; attr_.keep_pressed = false;
if(attr_.enable_pushed && (false == attr_.pushed)) if(attr_.enable_pushed && (false == attr_.pushed))
@ -340,6 +347,7 @@ namespace nana{ namespace drawerbase
arg.evt_code = event_code::click; arg.evt_code = event_code::click;
arg.window_handle = wdg_->handle(); arg.window_handle = wdg_->handle();
arg.ctrl = arg.shift = false; arg.ctrl = arg.shift = false;
arg.button = ::nana::mouse::left_button;
arg.mid_button = arg.right_button = false; arg.mid_button = arg.right_button = false;
arg.left_button = true; arg.left_button = true;
arg.pos.x = arg.pos.y = 1; arg.pos.x = arg.pos.y = 1;