Mozilla/mozilla/widget/src/motif/nsAppShell.cpp
ramiro%netscape.com 041dc1ae54 One last tweak to make this thing work.
git-svn-id: svn://10.0.0.236/trunk@34413 18797224-902f-48f8-a5cc-f745e15eee43
1999-06-09 11:50:57 +00:00

303 lines
7.6 KiB
C++

/* -*- Mode: c++; tab-width: 2; indent-tabs-mode: nil; -*- */
/*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
#include "nsAppShell.h"
#include "nsIAppShell.h"
#include "nsIServiceManager.h"
#include "nsIEventQueueService.h"
#include "nsICmdLineService.h"
#include <stdlib.h>
#ifdef LINUX
#define DO_THE_EDITRES_THING
#endif
#ifdef DO_THE_EDITRES_THING
#include <X11/Xmu/Editres.h>
#endif
XtAppContext gAppContext;
//-------------------------------------------------------------------------
//
// XPCOM CIDs
//
//-------------------------------------------------------------------------
static NS_DEFINE_IID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
static NS_DEFINE_IID(kCmdLineServiceCID, NS_COMMANDLINE_SERVICE_CID);
//-------------------------------------------------------------------------
//
// nsISupports implementation macro
//
//-------------------------------------------------------------------------
NS_DEFINE_IID(kIAppShellIID, NS_IAPPSHELL_IID);
NS_IMPL_ISUPPORTS(nsAppShell,kIAppShellIID);
//-------------------------------------------------------------------------
NS_METHOD nsAppShell::SetDispatchListener(nsDispatchListener* aDispatchListener)
{
mDispatchListener = aDispatchListener;
return NS_OK;
}
//-------------------------------------------------------------------------
//
// Create the application shell
//
//-------------------------------------------------------------------------
NS_METHOD nsAppShell::Create(int* bac, char ** bav)
{
char *home=nsnull;
char *path=nsnull;
int argc = bac ? *bac : 0;
char **argv = bav;
#if 1
nsresult rv;
NS_WITH_SERVICE(nsICmdLineService, cmdLineArgs, kCmdLineServiceCID, &rv);
if (NS_SUCCEEDED(rv))
{
rv = cmdLineArgs->GetArgc(&argc);
if(NS_FAILED(rv))
argc = bac ? *bac : 0;
rv = cmdLineArgs->GetArgv(&argv);
if(NS_FAILED(rv))
argv = bav;
}
#endif
XtSetLanguageProc(NULL, NULL, NULL);
mTopLevel = XtAppInitialize(&mAppContext, // app_context_return
"nsAppShell", // application_class
NULL, // options
0, // num_options
&argc,
argv,
NULL, // fallback_resources
NULL, // args
0); // num_args
// XXX This is BAD -- needs to be fixed
gAppContext = mAppContext;
return NS_OK;
}
//-------------------------------------------------------------------------
//
// Enter a message handler loop
//
//-------------------------------------------------------------------------
// static void event_processor_callback(gpointer data,
// gint source,
// GdkInputCondition condition)
// {
// nsIEventQueue *eventQueue = (nsIEventQueue*)data;
// eventQueue->ProcessPendingEvents();
// }
static void nsUnixEventProcessorCallback(XtPointer aClosure,
int * aFd,
XtIntervalId * aId)
{
// NS_ASSERTION(*aFd==PR_GetEventQueueSelectFD(gUnixMainEventQueue), "Error in nsUnixMain.cpp:nsUnixEventProcessCallback");
// PR_ProcessPendingEvents(gUnixMainEventQueue);
nsIEventQueue *eventQueue = (nsIEventQueue*) aClosure;
eventQueue->ProcessPendingEvents();
}
// NS_METHOD nsAppShell::Run()
// {
// XtRealizeWidget(mTopLevel);
// XEvent event;
// for (;;) {
// XtAppNextEvent(mAppContext, &event);
// XtDispatchEvent(&event);
// if (mDispatchListener)
// mDispatchListener->AfterDispatch();
// }
// return NS_OK;
// }
NS_METHOD nsAppShell::Run()
{
NS_ADDREF_THIS();
nsresult rv = NS_OK;
nsIEventQueue * EQueue = nsnull;
// Get the event queue service
NS_WITH_SERVICE(nsIEventQueueService, eventQService, kEventQueueServiceCID, &rv);
if (NS_FAILED(rv)) {
NS_ASSERTION("Could not obtain event queue service", PR_FALSE);
return rv;
}
#ifdef DEBUG
printf("Got the event queue from the service\n");
#endif /* DEBUG */
//Get the event queue for the thread.
rv = eventQService->GetThreadEventQueue(PR_GetCurrentThread(), &EQueue);
// If a queue already present use it.
if (EQueue)
goto done;
// Create the event queue for the thread
rv = eventQService->CreateThreadEventQueue();
if (NS_OK != rv) {
NS_ASSERTION("Could not create the thread event queue", PR_FALSE);
return rv;
}
//Get the event queue for the thread
rv = eventQService->GetThreadEventQueue(PR_GetCurrentThread(), &EQueue);
if (NS_OK != rv) {
NS_ASSERTION("Could not obtain the thread event queue", PR_FALSE);
return rv;
}
done:
printf("Calling XtAppAddInput() with event queue\n");
XtAppAddInput(gAppContext,
EQueue->GetEventQueueSelectFD(),
(XtPointer)(XtInputReadMask),
nsUnixEventProcessorCallback,
0);
XtRealizeWidget(mTopLevel);
#ifdef DO_THE_EDITRES_THING
XtAddEventHandler(mTopLevel,
(EventMask) 0,
True,
(XtEventHandler) _XEditResCheckMessages,
(XtPointer)NULL);
#endif
XEvent event;
for (;;)
{
XtAppNextEvent(mAppContext, &event);
XtDispatchEvent(&event);
if (mDispatchListener)
mDispatchListener->AfterDispatch();
}
NS_IF_RELEASE(EQueue);
Release();
return NS_OK;
}
//This one put here by ZuperDee.
NS_METHOD nsAppShell::Spinup()
{
//FIXME: Need to implement. --ZuperDee
return NS_OK;
}
NS_METHOD nsAppShell::Spindown()
{
//FIXME: Need to implement. --ZuperDee
return NS_OK;
}
NS_METHOD nsAppShell::GetNativeEvent(PRBool &aRealEvent, void *&aEvent)
{
//FIXME: Need to implement. --ZuperDee
return NS_OK;
}
NS_METHOD nsAppShell::DispatchNativeEvent(PRBool aRealEvent, void * aEvent)
{
//FIXME: Need to implement. --ZuperDee
return NS_OK;
}
//-------------------------------------------------------------------------
//
// Exit a message handler loop
//
//-------------------------------------------------------------------------
NS_METHOD nsAppShell::Exit()
{
exit(0);
return NS_OK;
}
//-------------------------------------------------------------------------
//
// nsAppShell constructor
//
//-------------------------------------------------------------------------
nsAppShell::nsAppShell()
{
mRefCnt = 0;
mDispatchListener = 0;
}
//-------------------------------------------------------------------------
//
// nsAppShell destructor
//
//-------------------------------------------------------------------------
nsAppShell::~nsAppShell()
{
}
//-------------------------------------------------------------------------
//
// GetNativeData
//
//-------------------------------------------------------------------------
void* nsAppShell::GetNativeData(PRUint32 aDataType)
{
if (aDataType == NS_NATIVE_SHELL) {
return mTopLevel;
}
return nsnull;
}
NS_METHOD nsAppShell::EventIsForModalWindow(PRBool aRealEvent, void *aEvent, nsIWidget *aWidget,
PRBool *aForWindow)
{
//FIXME: Need to implement. --ZuperDee
return NS_OK;
}