return;
switch(event.type) {
- case SDL_MOUSEBUTTONDOWN:
- if(event.button.button == SDL_BUTTON_LEFT)
- {
- Vector mouse_pos = Renderer::instance()->to_logical(event.motion.x, event.motion.y);
- int x = int(mouse_pos.x);
- int y = int(mouse_pos.y);
-
- if(x > pos.x - get_width()/2 &&
- x < pos.x + get_width()/2 &&
- y > pos.y - get_height()/2 &&
- y < pos.y + get_height()/2)
+ case SDL_MOUSEBUTTONUP:
{
- menuaction = MENU_ACTION_HIT;
+ Vector mouse_pos = Renderer::instance()->to_logical(event.button.x, event.button.y);
+
+ if(MouseCursor::current())
+ {
+ MouseCursor::current()->set_pos(mouse_pos);
+ }
}
- }
- break;
+ break;
- case SDL_MOUSEMOTION:
- {
- Vector mouse_pos = Renderer::instance()->to_logical(event.motion.x, event.motion.y);
- float x = mouse_pos.x;
- float y = mouse_pos.y;
-
- if(x > pos.x - get_width()/2 &&
- x < pos.x + get_width()/2 &&
- y > pos.y - get_height()/2 &&
- y < pos.y + get_height()/2)
+ case SDL_MOUSEBUTTONDOWN:
{
- int new_active_item
- = static_cast<int> ((y - (pos.y - get_height()/2)) / 24);
-
- /* only change the mouse focus to a selectable item */
- if ((items[new_active_item]->kind != MN_HL)
- && (items[new_active_item]->kind != MN_LABEL)
- && (items[new_active_item]->kind != MN_INACTIVE))
- active_item = new_active_item;
+ Vector mouse_pos = Renderer::instance()->to_logical(event.button.x, event.button.y);
if(MouseCursor::current())
- MouseCursor::current()->set_state(MC_LINK);
+ {
+ MouseCursor::current()->set_pos(mouse_pos);
+ }
+
+ if(event.button.button == SDL_BUTTON_LEFT)
+ {
+ int x = int(mouse_pos.x);
+ int y = int(mouse_pos.y);
+
+ if(x > pos.x - get_width()/2 &&
+ x < pos.x + get_width()/2 &&
+ y > pos.y - get_height()/2 &&
+ y < pos.y + get_height()/2)
+ {
+ menuaction = MENU_ACTION_HIT;
+ }
+ }
}
- else
+ break;
+
+ case SDL_MOUSEMOTION:
{
+ Vector mouse_pos = Renderer::instance()->to_logical(event.motion.x, event.motion.y);
+
if(MouseCursor::current())
- MouseCursor::current()->set_state(MC_NORMAL);
+ {
+ MouseCursor::current()->set_pos(mouse_pos);
+ }
+
+ float x = mouse_pos.x;
+ float y = mouse_pos.y;
+
+ if(x > pos.x - get_width()/2 &&
+ x < pos.x + get_width()/2 &&
+ y > pos.y - get_height()/2 &&
+ y < pos.y + get_height()/2)
+ {
+ int new_active_item
+ = static_cast<int> ((y - (pos.y - get_height()/2)) / 24);
+
+ /* only change the mouse focus to a selectable item */
+ if ((items[new_active_item]->kind != MN_HL)
+ && (items[new_active_item]->kind != MN_LABEL)
+ && (items[new_active_item]->kind != MN_INACTIVE))
+ active_item = new_active_item;
+
+ if(MouseCursor::current())
+ MouseCursor::current()->set_state(MC_LINK);
+ }
+ else
+ {
+ if(MouseCursor::current())
+ MouseCursor::current()->set_state(MC_NORMAL);
+ }
}
- }
- break;
+ break;
default:
break;
MouseCursor* MouseCursor::current_ = 0;
MouseCursor::MouseCursor(std::string cursor_file) :
+ mouse_pos(),
mid_x(0),
mid_y(0),
state_before_click(),
cur_state = nstate;
}
+void
+MouseCursor::set_pos(const Vector& pos)
+{
+ mouse_pos = pos;
+}
+
void MouseCursor::set_mid(int x, int y)
{
mid_x = x;
if(cur_state == MC_HIDE)
return;
- int x,y,w,h;
- Uint8 ispressed = SDL_GetMouseState(&x,&y);
-
- Vector mouse_pos = Renderer::instance()->to_logical(x, y, true);
+ // Not using coordinates from mouse, as they are in the wrong
+ // coordinate system, see:
+ // https://bugzilla.libsdl.org/show_bug.cgi?id=2442
+ Uint8 ispressed = SDL_GetMouseState(NULL, NULL);
- x = int(mouse_pos.x);
- y = int(mouse_pos.y);
+ int x = int(mouse_pos.x);
+ int y = int(mouse_pos.y);
- w = (int) cursor->get_width();
- h = (int) (cursor->get_height() / MC_STATES_NB);
- if(ispressed &SDL_BUTTON(1) || ispressed &SDL_BUTTON(2)) {
+ int w = (int) cursor->get_width();
+ int h = (int) (cursor->get_height() / MC_STATES_NB);
+ if(ispressed & SDL_BUTTON(1) || ispressed & SDL_BUTTON(2)) {
if(cur_state != MC_CLICK) {
state_before_click = cur_state;
cur_state = MC_CLICK;