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; ///<
::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?

View File

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

View File

@ -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<window>(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;

View File

@ -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<window>(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);

View File

@ -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;