1
0
mirror of https://github.com/simh/simh.git synced 2026-01-25 19:56:25 +00:00

QVSS/VIDEO: Fix for mouse tracking on Ultrix from Mike Burke for issue #88

This commit is contained in:
Mark Pizzolato
2013-11-08 17:15:02 -08:00
parent 30cd103a14
commit b57201b88b
3 changed files with 93 additions and 47 deletions

View File

@@ -23,12 +23,18 @@
used in advertising or otherwise to promote the sale, use or other dealings
in this Software without prior written authorization from the author.
08-Nov-2013 MB Added globals for current mouse status
11-Jun-2013 MB First version
*/
#include "sim_video.h"
t_bool vid_active = FALSE;
int32 vid_mouse_xrel = 0;
int32 vid_mouse_yrel = 0;
t_bool vid_mouse_b1 = FALSE;
t_bool vid_mouse_b2 = FALSE;
t_bool vid_mouse_b3 = FALSE;
#if HAVE_LIBSDL
#include <SDL.h>
@@ -54,9 +60,6 @@ typedef struct {
int32 head;
int32 tail;
int32 count;
t_bool b1_state;
t_bool b2_state;
t_bool b3_state;
} MOUSE_EVENT_QUEUE;
int vid_thread (void* arg);
@@ -93,6 +96,8 @@ if (!vid_active) {
vid_width = width;
vid_height = height;
vid_mouse_captured = FALSE;
vid_mouse_xrel = 0;
vid_mouse_yrel = 0;
vid_key_events.head = 0;
vid_key_events.tail = 0;
@@ -605,17 +610,19 @@ if ((event->x == 0) ||
}
if (!sim_is_running)
return;
vid_mouse_xrel += event->xrel; /* update cumulative x rel */
vid_mouse_yrel -= event->yrel; /* update cumulative y rel */
vid_mouse_b1 = (event->state & SDL_BUTTON(SDL_BUTTON_LEFT)) ? TRUE : FALSE;
vid_mouse_b2 = (event->state & SDL_BUTTON(SDL_BUTTON_MIDDLE)) ? TRUE : FALSE;
vid_mouse_b3 = (event->state & SDL_BUTTON(SDL_BUTTON_RIGHT)) ? TRUE : FALSE;
if (SDL_SemWait (vid_mouse_events.sem) == 0) {
sim_debug (SIM_VID_DBG_MOUSE, vid_dev, "Mouse Move Event: (%d,%d)\n", event->xrel, event->yrel);
if (vid_mouse_events.count < MAX_EVENTS) {
ev.x_rel = event->xrel;
ev.y_rel = (-event->yrel);
ev.b1_state = (event->state & SDL_BUTTON(SDL_BUTTON_LEFT)) ? TRUE : FALSE;
ev.b2_state = (event->state & SDL_BUTTON(SDL_BUTTON_MIDDLE)) ? TRUE : FALSE;
ev.b3_state = (event->state & SDL_BUTTON(SDL_BUTTON_RIGHT)) ? TRUE : FALSE;
vid_mouse_events.b1_state = ev.b1_state;
vid_mouse_events.b2_state = ev.b2_state;
vid_mouse_events.b3_state = ev.b3_state;
ev.b1_state = vid_mouse_b1;
ev.b2_state = vid_mouse_b2;
ev.b3_state = vid_mouse_b3;
vid_mouse_events.events[vid_mouse_events.tail++] = ev;
vid_mouse_events.count++;
if (vid_mouse_events.tail == MAX_EVENTS)
@@ -650,26 +657,26 @@ if (!vid_mouse_captured) {
}
if (!sim_is_running)
return;
state = (event->state == SDL_PRESSED) ? TRUE : FALSE;
switch (event->button) {
case SDL_BUTTON_LEFT:
vid_mouse_b1 = state;
break;
case SDL_BUTTON_MIDDLE:
vid_mouse_b2 = state;
break;
case SDL_BUTTON_RIGHT:
vid_mouse_b3 = state;
break;
}
if (SDL_SemWait (vid_mouse_events.sem) == 0) {
sim_debug (SIM_VID_DBG_MOUSE, vid_dev, "Mouse Button Event: State: %d, Button: %d, (%d,%d)\n", event->state, event->button, event->x, event->y);
if (vid_mouse_events.count < MAX_EVENTS) {
state = (event->state == SDL_PRESSED) ? TRUE : FALSE;
ev.x_rel = 0;
ev.y_rel = 0;
switch (event->button) {
case SDL_BUTTON_LEFT:
vid_mouse_events.b1_state = state;
break;
case SDL_BUTTON_MIDDLE:
vid_mouse_events.b2_state = state;
break;
case SDL_BUTTON_RIGHT:
vid_mouse_events.b3_state = state;
break;
}
ev.b1_state = vid_mouse_events.b1_state;
ev.b2_state = vid_mouse_events.b2_state;
ev.b3_state = vid_mouse_events.b3_state;
ev.b1_state = vid_mouse_b1;
ev.b2_state = vid_mouse_b2;
ev.b3_state = vid_mouse_b3;
vid_mouse_events.events[vid_mouse_events.tail++] = ev;
vid_mouse_events.count++;
if (vid_mouse_events.tail == MAX_EVENTS)
@@ -811,6 +818,8 @@ if (!vid_active) {
vid_width = width;
vid_height = height;
vid_mouse_captured = FALSE;
vid_mouse_xrel = 0;
vid_mouse_yrel = 0;
vid_key_events.head = 0;
vid_key_events.tail = 0;
@@ -1318,17 +1327,19 @@ if ((event->x == 0) ||
}
if (!sim_is_running)
return;
vid_mouse_xrel += event->xrel; /* update cumulative x rel */
vid_mouse_yrel -= event->yrel; /* update cumulative y rel */
vid_mouse_b1 = (event->state & SDL_BUTTON(SDL_BUTTON_LEFT)) ? TRUE : FALSE;
vid_mouse_b2 = (event->state & SDL_BUTTON(SDL_BUTTON_MIDDLE)) ? TRUE : FALSE;
vid_mouse_b3 = (event->state & SDL_BUTTON(SDL_BUTTON_RIGHT)) ? TRUE : FALSE;
if (SDL_SemWait (vid_mouse_events.sem) == 0) {
sim_debug (SIM_VID_DBG_MOUSE, vid_dev, "Mouse Move Event: (%d,%d)\n", event->xrel, event->yrel);
if (vid_mouse_events.count < MAX_EVENTS) {
ev.x_rel = event->xrel;
ev.y_rel = (-event->yrel);
ev.b1_state = (event->state & SDL_BUTTON(SDL_BUTTON_LEFT)) ? TRUE : FALSE;
ev.b2_state = (event->state & SDL_BUTTON(SDL_BUTTON_MIDDLE)) ? TRUE : FALSE;
ev.b3_state = (event->state & SDL_BUTTON(SDL_BUTTON_RIGHT)) ? TRUE : FALSE;
vid_mouse_events.b1_state = ev.b1_state;
vid_mouse_events.b2_state = ev.b2_state;
vid_mouse_events.b3_state = ev.b3_state;
ev.b1_state = vid_mouse_b1;
ev.b2_state = vid_mouse_b2;
ev.b3_state = vid_mouse_b3;
vid_mouse_events.events[vid_mouse_events.tail++] = ev;
vid_mouse_events.count++;
if (vid_mouse_events.tail == MAX_EVENTS)
@@ -1362,26 +1373,26 @@ if (!vid_mouse_captured) {
}
if (!sim_is_running)
return;
state = (event->state == SDL_PRESSED) ? TRUE : FALSE;
switch (event->button) {
case SDL_BUTTON_LEFT:
vid_mouse_b1 = state;
break;
case SDL_BUTTON_MIDDLE:
vid_mouse_b2 = state;
break;
case SDL_BUTTON_RIGHT:
vid_mouse_b3 = state;
break;
}
if (SDL_SemWait (vid_mouse_events.sem) == 0) {
sim_debug (SIM_VID_DBG_MOUSE, vid_dev, "Mouse Button Event: State: %d, Button: %d, (%d,%d)\n", event->state, event->button, event->x, event->y);
if (vid_mouse_events.count < MAX_EVENTS) {
state = (event->state == SDL_PRESSED) ? TRUE : FALSE;
ev.x_rel = 0;
ev.y_rel = 0;
switch (event->button) {
case SDL_BUTTON_LEFT:
vid_mouse_events.b1_state = state;
break;
case SDL_BUTTON_MIDDLE:
vid_mouse_events.b2_state = state;
break;
case SDL_BUTTON_RIGHT:
vid_mouse_events.b3_state = state;
break;
}
ev.b1_state = vid_mouse_events.b1_state;
ev.b2_state = vid_mouse_events.b2_state;
ev.b3_state = vid_mouse_events.b3_state;
ev.b1_state = vid_mouse_b1;
ev.b2_state = vid_mouse_b2;
ev.b3_state = vid_mouse_b3;
vid_mouse_events.events[vid_mouse_events.tail++] = ev;
vid_mouse_events.count++;
if (vid_mouse_events.tail == MAX_EVENTS)