diff --git a/mozilla/widget/src/xlib/nsAppShell.cpp b/mozilla/widget/src/xlib/nsAppShell.cpp index cbba57f3699..91add2bb92a 100644 --- a/mozilla/widget/src/xlib/nsAppShell.cpp +++ b/mozilla/widget/src/xlib/nsAppShell.cpp @@ -270,6 +270,7 @@ NS_METHOD nsAppShell::SetDispatchListener(nsDispatchListener* aDispatchListener) nsresult nsAppShell::Run() { + NS_ADDREF_THIS(); nsresult rv = NS_OK; nsIEventQueue *EQueue = nsnull; int xlib_fd = -1; @@ -369,6 +370,8 @@ nsresult nsAppShell::Run() } NS_IF_RELEASE(EQueue); + NS_IF_RELEASE(mEventQueueService); + Release(); return rv; } @@ -599,12 +602,27 @@ nsAppShell::HandleExposeEvent(XEvent *event, nsWidget *aWidget) { PR_LOG(XlibWidgetsLM, PR_LOG_DEBUG, ("Expose event for window 0x%lx %d %d %d %d\n", event->xany.window, event->xexpose.x, event->xexpose.y, event->xexpose.width, event->xexpose.height)); + + nsRect *dirtyRect = new nsRect(event->xexpose.x, event->xexpose.y, + event->xexpose.width, event->xexpose.height); + + /* compress expose events... + */ + if (event->xexpose.count!=0) { + XEvent txe; + do { + XWindowEvent(event->xany.display, event->xany.window, ExposureMask, (XEvent *)&txe); + dirtyRect->UnionRect(*dirtyRect, nsRect(txe.xexpose.x, txe.xexpose.y, + txe.xexpose.width, txe.xexpose.height)); + } while (txe.xexpose.count>0); + } + nsPaintEvent pevent; pevent.message = NS_PAINT; pevent.widget = aWidget; pevent.eventStructType = NS_PAINT_EVENT; - pevent.rect = new nsRect (event->xexpose.x, event->xexpose.y, - event->xexpose.width, event->xexpose.height); + pevent.rect = dirtyRect; + // XXX fix this pevent.time = 0; NS_ADDREF(aWidget); diff --git a/mozilla/widget/src/xlib/nsPopUpMenu.cpp b/mozilla/widget/src/xlib/nsPopUpMenu.cpp index 663c6b9058f..32b55a416ab 100644 --- a/mozilla/widget/src/xlib/nsPopUpMenu.cpp +++ b/mozilla/widget/src/xlib/nsPopUpMenu.cpp @@ -23,6 +23,7 @@ NS_IMPL_ISUPPORTS(nsPopUpMenu, kPopUpMenuIID) nsPopUpMenu::nsPopUpMenu() : nsIPopUpMenu() { NS_INIT_REFCNT(); + mParent = nsnull; } nsPopUpMenu::~nsPopUpMenu() @@ -31,6 +32,8 @@ nsPopUpMenu::~nsPopUpMenu() NS_METHOD nsPopUpMenu::Create(nsIWidget *aParent) { + mParent = aParent; + NS_ADDREF(mParent); return NS_OK; } @@ -101,5 +104,6 @@ NS_METHOD nsPopUpMenu::GetNativeData(void *& aData) NS_METHOD nsPopUpMenu::GetParent(nsIWidget *& aParent) { + aParent = mParent; return NS_OK; } diff --git a/mozilla/widget/src/xlib/nsPopUpMenu.h b/mozilla/widget/src/xlib/nsPopUpMenu.h index c33fe7ddf7b..602541df6e4 100644 --- a/mozilla/widget/src/xlib/nsPopUpMenu.h +++ b/mozilla/widget/src/xlib/nsPopUpMenu.h @@ -49,6 +49,9 @@ public: NS_IMETHOD GetNativeData(void*& aData); NS_IMETHOD GetParent(nsIWidget*& aParent); +protected: + nsIWidget * mParent; + }; #endif // nsPopUpMenu_h__