fix arg_mouse issue(#67)
This commit is contained in:
parent
358c0f662e
commit
628266adb4
@ -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?
|
||||
|
@ -15,7 +15,6 @@
|
||||
#include "widget.hpp"
|
||||
#include <nana/gui/element.hpp>
|
||||
|
||||
|
||||
namespace nana{
|
||||
namespace drawerbase
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user