changes to support the xlib window service
This commit is contained in:
Родитель
4c927725a1
Коммит
719a7b71c2
|
@ -271,6 +271,11 @@ nsAppShell::EventIsForModalWindow(PRBool aRealEvent, void *aEvent,
|
|||
|
||||
nsresult nsAppShell::DispatchNativeEvent(PRBool aRealEvent, void *aEvent)
|
||||
{
|
||||
if (aEvent == 0) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
XEvent *event = (XEvent *)aEvent;
|
||||
DispatchXEvent(event);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
@ -292,7 +297,6 @@ void
|
|||
nsAppShell::DispatchXEvent(XEvent *event)
|
||||
{
|
||||
nsWidget *widget;
|
||||
XEvent config_event;
|
||||
widget = nsWidget::GetWidgetForWindow(event->xany.window);
|
||||
|
||||
// switch on the type of event
|
||||
|
@ -312,26 +316,6 @@ nsAppShell::DispatchXEvent(XEvent *event)
|
|||
event->xconfigure.width,
|
||||
event->xconfigure.height));
|
||||
|
||||
while (XCheckWindowEvent(mDisplay,
|
||||
event->xany.window,
|
||||
StructureNotifyMask,
|
||||
&config_event) == True)
|
||||
{
|
||||
// make sure that we don't get other types of events.
|
||||
// StructureNotifyMask includes other kinds of events, too.
|
||||
if (config_event.type == ConfigureNotify)
|
||||
{
|
||||
*event = config_event;
|
||||
|
||||
PR_LOG(XlibWidgetsLM, PR_LOG_DEBUG, ("DispatchEvent: Extra ConfigureNotify event for window 0x%lx %d %d %d %d\n",
|
||||
event->xconfigure.window,
|
||||
event->xconfigure.x,
|
||||
event->xconfigure.y,
|
||||
event->xconfigure.width,
|
||||
event->xconfigure.height));
|
||||
}
|
||||
}
|
||||
|
||||
HandleConfigureNotifyEvent(event, widget);
|
||||
|
||||
break;
|
||||
|
@ -474,6 +458,26 @@ nsAppShell::HandleConfigureNotifyEvent(XEvent *event, nsWidget *aWidget)
|
|||
event->xconfigure.window,
|
||||
event->xconfigure.x, event->xconfigure.y,
|
||||
event->xconfigure.width, event->xconfigure.height));
|
||||
XEvent config_event;
|
||||
while (XCheckWindowEvent(event->xany.display,
|
||||
event->xany.window,
|
||||
StructureNotifyMask,
|
||||
&config_event) == True) {
|
||||
// make sure that we don't get other types of events.
|
||||
// StructureNotifyMask includes other kinds of events, too.
|
||||
if (config_event.type == ConfigureNotify)
|
||||
{
|
||||
*event = config_event;
|
||||
|
||||
PR_LOG(XlibWidgetsLM, PR_LOG_DEBUG, ("DispatchEvent: Extra ConfigureNotify event for window 0x%lx %d %d %d %d\n",
|
||||
event->xconfigure.window,
|
||||
event->xconfigure.x,
|
||||
event->xconfigure.y,
|
||||
event->xconfigure.width,
|
||||
event->xconfigure.height));
|
||||
}
|
||||
}
|
||||
|
||||
nsSizeEvent sevent;
|
||||
sevent.message = NS_SIZE;
|
||||
sevent.widget = aWidget;
|
||||
|
|
|
@ -44,10 +44,9 @@ class nsAppShell : public nsIAppShell
|
|||
NS_IMETHOD SetDispatchListener(nsDispatchListener* aDispatchListener);
|
||||
NS_IMETHOD Exit();
|
||||
virtual void * GetNativeData(PRUint32 aDataType);
|
||||
|
||||
static void DispatchXEvent(XEvent *event);
|
||||
private:
|
||||
nsDispatchListener* mDispatchListener;
|
||||
void DispatchXEvent(XEvent *event);
|
||||
static void HandleButtonEvent(XEvent *event, nsWidget *aWidget);
|
||||
static void HandleMotionNotifyEvent(XEvent *event, nsWidget *aWidget);
|
||||
static void HandleExposeEvent(XEvent *event, nsWidget *aWidget);
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
*/
|
||||
|
||||
#include <X11/cursorfont.h>
|
||||
#include "nsIXlibWindowService.h"
|
||||
|
||||
#include "nsWidget.h"
|
||||
#include "nsGfxCIID.h"
|
||||
|
@ -32,6 +33,11 @@ nsHashtable *nsWidget::window_list = nsnull;
|
|||
// this is a class for generating keys for
|
||||
// the list of windows managed by mozilla.
|
||||
|
||||
// this is possibly the class impl that will be
|
||||
// called whenever a new window is created/destroyed
|
||||
|
||||
nsXlibWindowCallback *nsWidget::mWindowCallback = nsnull;
|
||||
|
||||
class nsWindowKey : public nsHashKey {
|
||||
protected:
|
||||
Window mKey;
|
||||
|
@ -639,6 +645,11 @@ nsWidget::AddWindowCallback(Window aWindow, nsWidget *aWidget)
|
|||
window_list->Put(window_key, aWidget);
|
||||
// add a new ref to this widget
|
||||
NS_ADDREF(aWidget);
|
||||
// make sure that if someone is listening that we inform
|
||||
// them of the new window
|
||||
if (mWindowCallback) {
|
||||
mWindowCallback->WindowCreated(aWindow);
|
||||
}
|
||||
delete window_key;
|
||||
}
|
||||
|
||||
|
@ -649,6 +660,9 @@ nsWidget::DeleteWindowCallback(Window aWindow)
|
|||
nsWidget *widget = (nsWidget *)window_list->Get(window_key);
|
||||
NS_RELEASE(widget);
|
||||
window_list->Remove(window_key);
|
||||
if (mWindowCallback) {
|
||||
mWindowCallback->WindowDestroyed(aWindow);
|
||||
}
|
||||
delete window_key;
|
||||
}
|
||||
|
||||
|
@ -959,3 +973,31 @@ void nsWidget::SetMapStatus(PRBool aState)
|
|||
{
|
||||
mIsMapped = aState;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsWidget::SetXlibWindowCallback(nsXlibWindowCallback *aCallback)
|
||||
{
|
||||
if (aCallback == nsnull) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
else {
|
||||
mWindowCallback = aCallback;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsWidget::XWindowCreated(Window aWindow) {
|
||||
if (mWindowCallback) {
|
||||
mWindowCallback->WindowCreated(aWindow);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsWidget::XWindowDestroyed(Window aWindow) {
|
||||
if (mWindowCallback) {
|
||||
mWindowCallback->WindowDestroyed(aWindow);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#include "nsBaseWidget.h"
|
||||
#include "nsHashtable.h"
|
||||
#include "prlog.h"
|
||||
#include <nsIXlibWindowService.h>
|
||||
|
||||
#ifdef DEBUG_blizzard
|
||||
#define XLIB_WIDGET_NOISY
|
||||
|
@ -116,6 +117,10 @@ public:
|
|||
|
||||
PRBool DispatchWindowEvent(nsGUIEvent & aEvent);
|
||||
|
||||
static nsresult SetXlibWindowCallback(nsXlibWindowCallback *aCallback);
|
||||
static nsresult XWindowCreated(Window aWindow);
|
||||
static nsresult XWindowDestroyed(Window aWindow);
|
||||
|
||||
protected:
|
||||
|
||||
// private event functions
|
||||
|
@ -137,6 +142,7 @@ protected:
|
|||
static void AddWindowCallback (Window aWindow, nsWidget *aWidget);
|
||||
static void DeleteWindowCallback(Window aWindow);
|
||||
static nsHashtable *window_list;
|
||||
static nsXlibWindowCallback *mWindowCallback;
|
||||
|
||||
// here's how we add children
|
||||
// there's no geometry information here because that should be in the mBounds
|
||||
|
|
Загрузка…
Ссылка в новой задаче