summaryrefslogtreecommitdiff
path: root/hw/darwin
diff options
context:
space:
mode:
authorBen Byer <bbyer@bbyer.(none)>2007-03-05 03:48:27 -0800
committerBen Byer <bbyer@bbyer.(none)>2007-03-05 03:48:27 -0800
commitfe7b8f4237874e3e45fe25a6bf06faddfa1ab8e1 (patch)
treea77a3b26110dfbf14254bab3675b5950382ddf7c /hw/darwin
parent537dc5ecde46d0525c503d1d2b39b6eb89a1298e (diff)
began to factor out code to move to darwinEvents.c
Diffstat (limited to 'hw/darwin')
-rw-r--r--hw/darwin/apple/X11Application.m94
-rw-r--r--hw/darwin/darwin.h4
-rw-r--r--hw/darwin/darwinEvents.c6
3 files changed, 63 insertions, 41 deletions
diff --git a/hw/darwin/apple/X11Application.m b/hw/darwin/apple/X11Application.m
index c50f70482..cfc975037 100644
--- a/hw/darwin/apple/X11Application.m
+++ b/hw/darwin/apple/X11Application.m
@@ -855,21 +855,58 @@ convert_flags (unsigned int nsflags) {
return xflags;
}
+/* Sends a null byte down darwinEventWriteFD, which will cause the
+ Dispatch() event loop to check out event queue */
+void DarwinPokeEQ(void) {
+ char nullbyte=0;
+ input_check_flag++;
+ // <daniels> bushing: oh, i ... er ... christ.
+ write(darwinEventWriteFD, &nullbyte, 1);
+}
+
+void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int pointer_y) {
+ int i;
+ int valuators[2] = {pointer_x, pointer_y};
+ int num_events = GetPointerEvents(darwinEvents, darwinPointer, ev_type, ev_button,
+ POINTER_ABSOLUTE, 0, 2, valuators);
+
+ for(i=0; i<num_events; i++) mieqEnqueue (darwinPointer,&darwinEvents[i]);
+ DarwinPokeEQ();
+}
+
+void DarwinSendKeyboardEvents(int ev_type, int keycode) {
+ int i;
+ int num_events = GetKeyboardEvents(darwinEvents, darwinKeyboard, ev_type, keycode + MIN_KEYCODE);
+ for(i=0; i<num_events; i++) mieqEnqueue(darwinKeyboard,&darwinEvents[i]);
+ DarwinPokeEQ();
+}
+
+/* Send the appropriate number of button 4 / 5 clicks to emulate scroll wheel */
+void DarwinSendScrollEvents(float count, int pointer_x, int pointer_y) {
+ int i;
+ int ev_button = count > 0.0f ? 4 : 5;
+ int valuators[2] = {pointer_x, pointer_y};
+
+ for (count = fabs(count); count > 0.0; count = count - 1.0f) {
+ int num_events = GetPointerEvents(darwinEvents, darwinPointer, ButtonPress, ev_button,
+ POINTER_ABSOLUTE, 0, 2, valuators);
+ for(i=0; i<num_events; i++) mieqEnqueue(darwinPointer,&darwinEvents[i]);
+ num_events = GetPointerEvents(darwinEvents, darwinPointer, ButtonRelease, ev_button,
+ POINTER_ABSOLUTE, 0, 2, valuators);
+ for(i=0; i<num_events; i++) mieqEnqueue(darwinPointer,&darwinEvents[i]);
+ }
+ DarwinPokeEQ();
+}
+
// This code should probably be merged with that in XDarwin's XServer.m - BB
static void send_nsevent (NSEventType type, NSEvent *e) {
- static unsigned int button_state = 0;
+ // static unsigned int button_state = 0;
NSRect screen;
NSPoint location;
NSWindow *window;
int pointer_x, pointer_y, ev_button, ev_type;
- int num_events=0, i=0, state;
- int valuators[2];
- float count;
+ // int num_events=0, i=0, state;
xEvent xe;
- char nullbyte=0;
-
- bzero(&xe, sizeof(xe));
- input_check_flag++;
/* convert location to global top-left coordinates */
location = [e locationInWindow];
@@ -886,11 +923,8 @@ static void send_nsevent (NSEventType type, NSEvent *e) {
pointer_y = (screen.origin.y + screen.size.height) - location.y;
}
-// ErrorF("send_nsevent: type=%d pointer=(%d,%d)\n", type, pointer_x, pointer_y);
-
- valuators[0] = pointer_x;
- valuators[1] = pointer_y - aquaMenuBarHeight;
- state = convert_flags ([e modifierFlags]);
+ pointer_y -= aquaMenuBarHeight;
+ // state = convert_flags ([e modifierFlags]);
switch (type) {
case NSLeftMouseDown: ev_button=1; ev_type=ButtonPress; goto handle_mouse;
@@ -905,50 +939,34 @@ static void send_nsevent (NSEventType type, NSEvent *e) {
case NSMouseMoved: ev_button=0; ev_type=MotionNotify; goto handle_mouse;
handle_mouse:
- if(ev_type==ButtonPress) {
+ /* I'm not sure the below code is necessary or useful (-bb)
+ if(ev_type==ButtonPress) {
if (!quartzProcs->IsX11Window([e window], [e windowNumber])) {
fprintf(stderr, "Dropping event because it's not a window\n");
break;
}
button_state |= (1 << ev_button);
+ DarwinSendPointerEvents(ev_type, ev_button, pointer_x, pointer_y);
} else if (ev_type==ButtonRelease && (button_state & (1 << ev_button)) == 0) break;
-
- num_events = GetPointerEvents(darwinEvents, darwinPointer, ev_type, ev_button,
- POINTER_ABSOLUTE, 0, 2, valuators);
-
- for(i=0; i<num_events; i++)
- mieqEnqueue (darwinPointer,&darwinEvents[i]);
+ */
+ DarwinSendPointerEvents(ev_type, ev_button, pointer_x, pointer_y);
break;
case NSScrollWheel:
- count = [e deltaY];
- ev_button = count > 0.0f ? 4 : 5;
- for (count = fabs(count); count > 0.0; count = count - 1.0f) {
- num_events = GetPointerEvents(darwinEvents, darwinPointer, ButtonPress, ev_button,
- POINTER_ABSOLUTE, 0, 2, valuators);
- for(i=0; i<num_events; i++)
- mieqEnqueue(darwinPointer,&darwinEvents[i]);
- num_events = GetPointerEvents(darwinEvents, darwinPointer, ButtonRelease, ev_button,
- POINTER_ABSOLUTE, 0, 2, valuators);
- for(i=0; i<num_events; i++)
- mieqEnqueue(darwinPointer,&darwinEvents[i]);
- }
+ DarwinSendScrollEvents([e deltaY], pointer_x, pointer_y);
break;
case NSKeyDown: // do we need to translate these keyCodes?
case NSKeyUp:
- num_events = GetKeyboardEvents(darwinEvents, darwinKeyboard,
- (type == NSKeyDown)?KeyPress:KeyRelease, [e keyCode]);
- for(i=0; i<num_events; i++)
- mieqEnqueue(darwinKeyboard,&darwinEvents[i]);
+ DarwinSendKeyboardEvents((type == NSKeyDown)?KeyPress:KeyRelease, [e keyCode]);
break;
case NSFlagsChanged:
+ bzero(&xe, sizeof(xe));
xe.u.u.type = kXDarwinUpdateModifiers;
xe.u.clientMessage.u.l.longs0 = [e modifierFlags];
DarwinEQEnqueue (&xe);
+ DarwinPokeEQ();
break;
default: break; /* for gcc */
}
- // <daniels> bushing: oh, i ... er ... christ.
- write(darwinEventWriteFD, &nullbyte, 1);
}
diff --git a/hw/darwin/darwin.h b/hw/darwin/darwin.h
index 48a2224f1..fc4a58a95 100644
--- a/hw/darwin/darwin.h
+++ b/hw/darwin/darwin.h
@@ -58,6 +58,10 @@ Bool DarwinEQInit(DevicePtr pKbd, DevicePtr pPtr);
void DarwinEQEnqueue(const xEvent *e);
void DarwinEQPointerPost(xEvent *e);
void DarwinEQSwitchScreen(ScreenPtr pScreen, Bool fromDIX);
+void DarwinPokeEQ(void);
+void DarwinSendPointerEvents(int ev_type, int ev_button, int pointer_x, int pointer_y);
+void DarwinSendKeyboardEvents(int ev_type, int keycode);
+void DarwinSendScrollEvents(float count, int pointer_x, int pointer_y);
// From darwinKeyboard.c
int DarwinModifierNXKeyToNXKeycode(int key, int side);
diff --git a/hw/darwin/darwinEvents.c b/hw/darwin/darwinEvents.c
index 1eb2336fd..ac03e5a70 100644
--- a/hw/darwin/darwinEvents.c
+++ b/hw/darwin/darwinEvents.c
@@ -269,7 +269,7 @@ void ProcessInputEvents(void) {
static int darwinFakeMouseButtonMask = 0;
input_check_flag=0;
- ErrorF("calling mieqProcessInputEvents\n");
+ // ErrorF("calling mieqProcessInputEvents\n");
mieqProcessInputEvents();
// Empty the signaling pipe
@@ -292,12 +292,12 @@ void ProcessInputEvents(void) {
xe.u.keyButtonPointer.rootY -= darwinMainScreenY +
dixScreenOrigins[miPointerCurrentScreen()->myNum].y;
- ErrorF("old rootX = (%d,%d) darwinMainScreen = (%d,%d) dixScreenOrigins[%d]=(%d,%d)\n",
+ /* ErrorF("old rootX = (%d,%d) darwinMainScreen = (%d,%d) dixScreenOrigins[%d]=(%d,%d)\n",
xe.u.keyButtonPointer.rootX, xe.u.keyButtonPointer.rootY,
darwinMainScreenX, darwinMainScreenY,
miPointerCurrentScreen()->myNum,
dixScreenOrigins[miPointerCurrentScreen()->myNum].x,
- dixScreenOrigins[miPointerCurrentScreen()->myNum].y);
+ dixScreenOrigins[miPointerCurrentScreen()->myNum].y); */
//Assumption - screen switching can only occur on motion events