From 5826a92dd721fc0a88a3274036e33fe9cc226924 Mon Sep 17 00:00:00 2001 From: "blizzard%redhat.com" Date: Mon, 14 Jun 1999 01:53:52 +0000 Subject: [PATCH] let mouse events flow... git-svn-id: svn://10.0.0.236/trunk@35106 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/widget/src/xlib/nsAppShell.cpp | 70 ++++++++++++++++++++++++++ mozilla/widget/src/xlib/nsAppShell.h | 2 + mozilla/widget/src/xlib/nsWidget.cpp | 34 ++++++++++++- mozilla/widget/src/xlib/nsWidget.h | 1 + mozilla/widget/src/xlib/nsWindow.cpp | 2 +- 5 files changed, 107 insertions(+), 2 deletions(-) diff --git a/mozilla/widget/src/xlib/nsAppShell.cpp b/mozilla/widget/src/xlib/nsAppShell.cpp index 4ca81069f36..693f4ad51d0 100644 --- a/mozilla/widget/src/xlib/nsAppShell.cpp +++ b/mozilla/widget/src/xlib/nsAppShell.cpp @@ -325,6 +325,13 @@ nsAppShell::DispatchEvent(XEvent *event) case ConfigureNotify: HandleConfigureNotifyEvent(event, widget); break; + case ButtonPress: + case ButtonRelease: + HandleButtonEvent(event, widget); + break; + case MotionNotify: + HandleMotionNotifyEvent(event, widget); + break; default: printf("Unhandled window event: Window 0x%lxd Got a %s event\n", event->xany.window, event_names[event->type]); @@ -332,6 +339,69 @@ nsAppShell::DispatchEvent(XEvent *event) } } +void +nsAppShell::HandleMotionNotifyEvent(XEvent *event, nsWidget *aWidget) +{ + nsMouseEvent mevent; + mevent.message = NS_MOUSE_MOVE; + mevent.widget = aWidget; + mevent.eventStructType = NS_MOUSE_EVENT; + mevent.point.x = event->xmotion.x; + mevent.point.y = event->xmotion.y; + mevent.time = 0; + NS_ADDREF(aWidget); + aWidget->DispatchMouseEvent(mevent); + NS_RELEASE(aWidget); +} + +void +nsAppShell::HandleButtonEvent(XEvent *event, nsWidget *aWidget) +{ + nsMouseEvent mevent; + PRUint32 eventType = 0; + printf("Button event for window 0x%lxd button %d type %s\n", + event->xany.window, event->xbutton.button, (event->type == ButtonPress ? "ButtonPress" : "ButtonRelease")); + switch(event->type) { + case ButtonPress: + switch(event->xbutton.button) { + case 1: + eventType = NS_MOUSE_LEFT_BUTTON_DOWN; + break; + case 2: + eventType = NS_MOUSE_MIDDLE_BUTTON_DOWN; + break; + case 3: + eventType = NS_MOUSE_RIGHT_BUTTON_DOWN; + break; + } + break; + case ButtonRelease: + switch(event->xbutton.button) { + case 1: + eventType = NS_MOUSE_LEFT_BUTTON_UP; + break; + case 2: + eventType = NS_MOUSE_MIDDLE_BUTTON_UP; + break; + case 3: + eventType = NS_MOUSE_RIGHT_BUTTON_UP; + break; + } + break; + } + mevent.message = eventType; + mevent.widget = aWidget; + mevent.eventStructType = NS_MOUSE_EVENT; + mevent.point.x = event->xbutton.x; + mevent.point.y = event->xbutton.y; + // XXX fix this. We need clicks + mevent.clickCount = 1; + mevent.time = 0; + NS_ADDREF(aWidget); + aWidget->DispatchMouseEvent(mevent); + NS_ADDREF(aWidget); +} + void nsAppShell::HandleExposeEvent(XEvent *event, nsWidget *aWidget) { diff --git a/mozilla/widget/src/xlib/nsAppShell.h b/mozilla/widget/src/xlib/nsAppShell.h index f108f53b30a..461198c57c6 100644 --- a/mozilla/widget/src/xlib/nsAppShell.h +++ b/mozilla/widget/src/xlib/nsAppShell.h @@ -48,6 +48,8 @@ class nsAppShell : public nsIAppShell private: nsDispatchListener* mDispatchListener; void DispatchEvent(XEvent *event); + static void HandleButtonEvent(XEvent *event, nsWidget *aWidget); + static void HandleMotionNotifyEvent(XEvent *event, nsWidget *aWidget); static void HandleExposeEvent(XEvent *event, nsWidget *aWidget); static void HandleConfigureNotifyEvent(XEvent *event, nsWidget *aWidget); diff --git a/mozilla/widget/src/xlib/nsWidget.cpp b/mozilla/widget/src/xlib/nsWidget.cpp index 2202d324615..e5397633c8e 100644 --- a/mozilla/widget/src/xlib/nsWidget.cpp +++ b/mozilla/widget/src/xlib/nsWidget.cpp @@ -386,7 +386,7 @@ void nsWidget::CreateNative(Window aParent, nsRect aRect) // be discarded... attr.bit_gravity = NorthWestGravity; // make sure that we listen for events - attr.event_mask = StructureNotifyMask | ExposureMask; + attr.event_mask = StructureNotifyMask | ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask; // set the default background color and border to that awful gray attr.background_pixel = bg_pixel; attr.border_pixel = border_pixel; @@ -492,6 +492,38 @@ nsWidget::OnPaint(nsPaintEvent &event) return result; } +PRBool nsWidget::DispatchMouseEvent(nsMouseEvent& aEvent) +{ + PRBool result = PR_FALSE; + if (nsnull == mEventCallback && nsnull == mMouseListener) { + return result; + } + + if (nsnull != mEventCallback) { + result = DispatchWindowEvent(&aEvent); + return result; + } + if (nsnull != mMouseListener) { + switch (aEvent.message) { + case NS_MOUSE_MOVE: + // XXX this isn't handled in gtk for some reason. + break; + case NS_MOUSE_LEFT_BUTTON_DOWN: + case NS_MOUSE_MIDDLE_BUTTON_DOWN: + case NS_MOUSE_RIGHT_BUTTON_DOWN: + result = ConvertStatus(mMouseListener->MousePressed(aEvent)); + break; + case NS_MOUSE_LEFT_BUTTON_UP: + case NS_MOUSE_MIDDLE_BUTTON_UP: + case NS_MOUSE_RIGHT_BUTTON_UP: + result = ConvertStatus(mMouseListener->MouseReleased(aEvent)); + result = ConvertStatus(mMouseListener->MouseClicked(aEvent)); + break; + } + } + return result; +} + PRBool nsWidget::OnResize(nsSizeEvent &event) { diff --git a/mozilla/widget/src/xlib/nsWidget.h b/mozilla/widget/src/xlib/nsWidget.h index ef6414d9091..6fece7abb52 100644 --- a/mozilla/widget/src/xlib/nsWidget.h +++ b/mozilla/widget/src/xlib/nsWidget.h @@ -99,6 +99,7 @@ public: PRBool OnPaint(nsPaintEvent &event); PRBool OnResize(nsSizeEvent &event); + PRBool DispatchMouseEvent(nsMouseEvent &aEvent); static nsWidget *getWidgetForWindow(Window aWindow); protected: // create the native window for this class diff --git a/mozilla/widget/src/xlib/nsWindow.cpp b/mozilla/widget/src/xlib/nsWindow.cpp index 7d75290e67c..012128ba7af 100644 --- a/mozilla/widget/src/xlib/nsWindow.cpp +++ b/mozilla/widget/src/xlib/nsWindow.cpp @@ -53,7 +53,7 @@ nsWindow::CreateNative(Window aParent, nsRect aRect) // be discarded... attr.bit_gravity = NorthWestGravity; // make sure that we listen for events - attr.event_mask = StructureNotifyMask | ExposureMask; + attr.event_mask = StructureNotifyMask | ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask; // set the default background color and border to that awful gray attr.background_pixel = bg_pixel; attr.border_pixel = border_pixel;