Georg Baum wrote:
This patch removes the empty LQApplication destructor, since the compiler
will generate one as needed. It makes my upcoming "QApplication exit
crash" patch a tiny bit smaller and goes in now.
Did you read my post Georg?
Here is what I have currently so if you think there will be conflict, I
think we should discuss before you apply this to qt4.
Thanks,
Abdel.
Index: Application.C
===================================================================
--- Application.C (revision 0)
+++ Application.C (revision 0)
@@ -0,0 +1,180 @@
+/**
+ * \file qt4/lyx_gui.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author unknown
+ * \author John Levon
+ * \author Abdelrazak Younes
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include "Application.h"
+#include "qt_helpers.h"
+#include "debug.h"
+#include "support/lstrings.h"
+
+#include <QApplication>
+#include <QEventLoop>
+#include <QTranslator>
+#include <QTextCodec>
+
+using lyx::support::subst;
+
+using std::map;
+using std::vector;
+using std::string;
+
+namespace {
+
+} // namespace anon
+
+///////////////////////////////////////////////////////////////
+// You can find other X11 and MACX specific stuff
+// at the end of this file...
+///////////////////////////////////////////////////////////////
+
+namespace lyx {
+namespace frontend {
+
+Application::Application(int & argc, char ** argv)
+ : QApplication(argc, argv)
+{
+#ifdef Q_WS_X11
+ // doubleClickInterval() is 400 ms on X11 witch is just too long.
+ // On Windows and Mac OS X, the operating system's value is used.
+ // On Microsoft Windows, calling this function sets the double
+ // click interval for all applications. So we don't!
+ QApplication::setDoubleClickInterval(300);
+#endif
+
+#ifdef Q_WS_MACX
+ AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
+ NewAEEventHandlerUPP(handleOpenDocuments),
+ 0, false);
+#endif
+}
+
+
+Application::~Application()
+{
+ size_t end = work_areas_.size();
+ for (size_t i = 0; i < end; ++i)
+ delete work_areas_[i];
+}
+
+
+QWorkArea * Application::newWorkArea(LyXView & owner, int w, int h)
+{
+ current_work_area_ = new QWorkArea(owner, w, h);
+ work_areas_.push_back(current_work_area_);
+}
+
+////////////////////////////////////////////////////////////////////////
+// X11 specific stuff goes here...
+#ifdef Q_WS_X11
+bool Application::x11EventFilter(XEvent * xev)
+{
+ switch (xev->type) {
+ case SelectionRequest:
+ lyxerr[Debug::GUI] << "X requested selection." << endl;
+ if (current_work_area_)
+ current_work_area_->view().view()->selectionRequested();
+ break;
+ case SelectionClear:
+ lyxerr[Debug::GUI] << "Lost selection." << endl;
+ if (current_work_area_)
+ current_work_area_->view().view()->selectionLost();
+ break;
+ }
+ return false;
+}
+#endif
+
+
+////////////////////////////////////////////////////////////////////////
+// Mac OSX specific stuff goes here...
+
+#ifdef Q_WS_MACX
+namespace{
+OSErr checkAppleEventForMissingParams(const AppleEvent& theAppleEvent)
+ {
+ DescType returnedType;
+ Size actualSize;
+ OSErr err = AEGetAttributePtr(&theAppleEvent, keyMissedKeywordAttr,
+ typeWildCard, &returnedType, nil, 0,
+ &actualSize);
+ switch (err) {
+ case errAEDescNotFound:
+ return noErr;
+ case noErr:
+ return errAEEventNotHandled;
+ default:
+ return err;
+ }
+ }
+} // namespace
+
+OSErr Application::handleOpenDocuments(const AppleEvent* inEvent,
+
AppleEvent* /*reply*/, long /*refCon*/)
+{
+ QString s_arg;
+ AEDescList documentList;
+ OSErr err = AEGetParamDesc(inEvent, keyDirectObject, typeAEList,
+ &documentList);
+ if (err != noErr)
+ return err;
+
+ err = checkAppleEventForMissingParams(*inEvent);
+ if (err == noErr) {
+ long documentCount;
+ err = AECountItems(&documentList, &documentCount);
+ for (long documentIndex = 1;
+ err == noErr && documentIndex <= documentCount;
+ documentIndex++) {
+ DescType returnedType;
+ Size actualSize;
+ AEKeyword keyword;
+ FSRef ref;
+ char qstr_buf[1024];
+ err = AESizeOfNthItem(&documentList, documentIndex,
+ &returnedType, &actualSize);
+ if (err == noErr) {
+ err = AEGetNthPtr(&documentList, documentIndex,
+ typeFSRef, &keyword,
+ &returnedType, (Ptr)&ref,
+ sizeof(FSRef), &actualSize);
+ if (err == noErr) {
+ FSRefMakePath(&ref, (UInt8*)qstr_buf,
+ 1024);
+ s_arg=QString::fromUtf8(qstr_buf);
+
current_work_area_->view().view()->workAreaDispatch(
+ FuncRequest(LFUN_FILE_OPEN,
+ fromqstr(s_arg)));
+ break;
+ }
+ }
+ } // for ...
+ }
+ AEDisposeDesc(&documentList);
+
+ return err;
+}
+
+bool Application::macEventFilter(EventRef event)
+{
+ if (GetEventClass(event) == kEventClassAppleEvent) {
+ EventRecord eventrec;
+ ConvertEventRefToEventRecord(event, &eventrec);
+ AEProcessAppleEvent(&eventrec);
+
+ return false;
+ }
+ return false;
+}
+
+#endif // Q_WS_MACX
+
+} // namespace frontend
+} // namespace lyx
Index: Application.h
===================================================================
--- Application.h (revision 0)
+++ Application.h (revision 0)
@@ -0,0 +1,64 @@
+/**
+ * \file qt4/lyx_gui.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author unknown
+ * \author John Levon
+ * \author Abdelrazak Younes
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef LYX_APPLICATION_H
+#define LYX_APPLICATION_H
+
+#include "QWorkArea.h"
+
+#include <QApplication>
+
+///////////////////////////////////////////////////////////////
+// Specific stuff
+#ifdef Q_WS_X11
+#include <X11/Xlib.h>
+#endif
+
+#ifdef Q_WS_MACX
+#include <Carbon/Carbon.h>
+#endif
+
+
+namespace lyx {
+namespace frontend {
+
+class Application : public QApplication
+{
+public:
+ Application(int & argc, char ** argv);
+ ~Application();
+
+ QWorkArea * newWorkArea(LyXView & owner, int w, int h);
+
+private:
+ std::vector<QWorkArea *> work_areas_;
+ QWorkArea * current_work_area_;
+
+#ifdef Q_WS_X11
+public:
+ bool x11EventFilter (XEvent * ev);
+#endif
+
+#ifdef Q_WS_MACX
+public:
+ bool macEventFilter(EventRef event);
+private:
+// static OSStatus handleOpenDocuments(
+ static pascal OSErr handleOpenDocuments(
+ const AppleEvent* inEvent, AppleEvent*, long);
+#endif
+}; // Application
+
+} // namespace frontend
+} // namespace lyx
+
+#endif // LYX_APPLICATION_H
Index: lyx_gui.C
===================================================================
--- lyx_gui.C (revision 13981)
+++ lyx_gui.C (working copy)
@@ -46,11 +46,8 @@
#include "QLImage.h"
#include "qt_helpers.h"
#include "socket_callback.h"
+#include "Application.h"
-#ifdef Q_WS_MACX
-#include <Carbon/Carbon.h>
-#endif
-
#include <QApplication>
#include <QEventLoop>
#include <QTranslator>
@@ -60,6 +57,7 @@
using lyx::support::package;
using lyx::frontend::QtView;
+using lyx::frontend::Application;
namespace os = lyx::support::os;
@@ -73,9 +71,6 @@
using std::vector;
using std::string;
-
-extern BufferList bufferlist;
-
namespace {
int getDPI()
@@ -95,64 +90,9 @@
// in QLyXKeySym.C
extern void initEncodings();
-#ifdef Q_WS_X11
-extern bool lyxX11EventFilter(XEvent * xev);
-#endif
-
-#ifdef Q_WS_MACX
-extern bool macEventFilter(EventRef event);
-extern pascal OSErr
-handleOpenDocuments(const AppleEvent* inEvent, AppleEvent* /*reply*/,
- long /*refCon*/);
-#endif
-
-class LQApplication : public QApplication
-{
-public:
- LQApplication(int & argc, char ** argv);
- ~LQApplication();
-#ifdef Q_WS_X11
- bool x11EventFilter (XEvent * ev) { return lyxX11EventFilter(ev); }
-#endif
-#ifdef Q_WS_MACX
- bool macEventFilter(EventRef event);
-#endif
-};
-
-
-LQApplication::LQApplication(int & argc, char ** argv)
- : QApplication(argc, argv)
-{
-#ifdef Q_WS_MACX
- AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments,
- NewAEEventHandlerUPP(handleOpenDocuments),
- 0, false);
-#endif
-}
-
-
-LQApplication::~LQApplication()
-{}
-
-
-#ifdef Q_WS_MACX
-bool LQApplication::macEventFilter(EventRef event)
-{
- if (GetEventClass(event) == kEventClassAppleEvent) {
- EventRecord eventrec;
- ConvertEventRefToEventRecord(event, &eventrec);
- AEProcessAppleEvent(&eventrec);
-
- return false;
- }
- return false;
-}
-#endif
-
-
namespace {
-LQApplication * app = 0;
+Application * app = 0;
}
@@ -185,11 +125,11 @@
// Force adding of font path _before_ QApplication is initialized
FontLoader::initFontPath();
-#ifdef Q_WS_WIN
- static QApplication win_app(argc, argv);
-#else
- app = new LQApplication(argc, argv);
-#endif
+//#ifdef Q_WS_WIN
+// static Application win_app(argc, argv);
+//#else
+ app = new Application(argc, argv);
+//#endif
// install translation file for Qt built-in dialogs
// These are only installed since Qt 3.2.x
Index: QWorkArea.C
===================================================================
--- QWorkArea.C (revision 13981)
+++ QWorkArea.C (working copy)
@@ -38,22 +38,6 @@
#include <boost/bind.hpp>
-///////////////////////////////////////////////////////////////
-// Specific stuff
-#ifdef Q_WS_X11
-#include <X11/Xlib.h>
-#endif
-
-#ifdef Q_WS_MACX
-#include <Carbon/Carbon.h>
-#include <support/lstrings.h>
-using lyx::support::subst;
-#endif
-
-// You can find other qt-immodule, X11 and MACX specific stuff
-// at the end of this file...
-///////////////////////////////////////////////////////////////
-
using std::endl;
using std::string;
@@ -61,8 +45,6 @@
namespace {
-QWorkArea * wa_ptr = 0;
-
/// return the LyX key state from Qt's
key_modifier::state q_key_state(Qt::ButtonState state)
{
@@ -186,17 +168,6 @@
setInputMethodEnabled(true);
#endif
-#ifdef Q_WS_X11
- // doubleClickInterval() is 400 ms on X11 witch is just too long.
- // On Windows and Mac OS X, the operating system's value is used.
- // On Microsoft Windows, calling this function sets the double
- // click interval for all applications. So we don't!
- QApplication::setDoubleClickInterval(300);
-#endif
-
-#ifdef Q_WS_MACX
- wa_ptr = this;
-#endif
}
QWorkArea::~QWorkArea()
@@ -232,9 +203,6 @@
void QWorkArea::haveSelection(bool own) const
{
- /// \todo ask X11 and MAC devels why this wa_ptr is useful.
- wa_ptr = const_cast<QWorkArea*>(this);
-
if (!QApplication::clipboard()->supportsSelection())
return;
@@ -674,96 +642,4 @@
#endif
-////////////////////////////////////////////////////////////////////////
-// X11 specific stuff goes here...
-
-#ifdef Q_WS_X11
-bool lyxX11EventFilter(XEvent * xev)
-{
- switch (xev->type) {
- case SelectionRequest:
- lyxerr[Debug::GUI] << "X requested selection." << endl;
- if (wa_ptr)
- wa_ptr->view().view()->selectionRequested();
- break;
- case SelectionClear:
- lyxerr[Debug::GUI] << "Lost selection." << endl;
- if (wa_ptr)
- wa_ptr->view().view()->selectionLost();
- break;
- }
- return false;
-}
-#endif
-
-
-////////////////////////////////////////////////////////////////////////
-// Mac OSX specific stuff goes here...
-
-#ifdef Q_WS_MACX
-namespace{
-OSErr checkAppleEventForMissingParams(const AppleEvent& theAppleEvent)
- {
- DescType returnedType;
- Size actualSize;
- OSErr err = AEGetAttributePtr(&theAppleEvent, keyMissedKeywordAttr,
- typeWildCard, &returnedType, nil, 0,
- &actualSize);
- switch (err) {
- case errAEDescNotFound:
- return noErr;
- case noErr:
- return errAEEventNotHandled;
- default:
- return err;
- }
- }
-}
-
-pascal OSErr handleOpenDocuments(const AppleEvent* inEvent,
- AppleEvent* /*reply*/, long /*refCon*/)
-{
- QString s_arg;
- AEDescList documentList;
- OSErr err = AEGetParamDesc(inEvent, keyDirectObject, typeAEList,
- &documentList);
- if (err != noErr)
- return err;
-
- err = checkAppleEventForMissingParams(*inEvent);
- if (err == noErr) {
- long documentCount;
- err = AECountItems(&documentList, &documentCount);
- for (long documentIndex = 1;
- err == noErr && documentIndex <= documentCount;
- documentIndex++) {
- DescType returnedType;
- Size actualSize;
- AEKeyword keyword;
- FSRef ref;
- char qstr_buf[1024];
- err = AESizeOfNthItem(&documentList, documentIndex,
- &returnedType, &actualSize);
- if (err == noErr) {
- err = AEGetNthPtr(&documentList, documentIndex,
- typeFSRef, &keyword,
- &returnedType, (Ptr)&ref,
- sizeof(FSRef), &actualSize);
- if (err == noErr) {
- FSRefMakePath(&ref, (UInt8*)qstr_buf,
- 1024);
- s_arg=QString::fromUtf8(qstr_buf);
- wa_ptr->view().view()->workAreaDispatch(
- FuncRequest(LFUN_FILE_OPEN,
- fromqstr(s_arg)));
- break;
- }
- }
- } // for ...
- }
- AEDisposeDesc(&documentList);
- return err;
-}
-#endif // Q_WS_MACX
-
#include "QWorkArea_moc.cpp"
Index: WorkAreaFactory.C
===================================================================
--- WorkAreaFactory.C (revision 13981)
+++ WorkAreaFactory.C (working copy)
@@ -11,13 +11,16 @@
#include <config.h>
#include "frontends/WorkAreaFactory.h"
-#include "QWorkArea.h"
+#include "Application.h"
+using lyx::frontend::Application;
+
namespace WorkAreaFactory {
WorkArea * create(LyXView & owner, int w, int h)
{
- return new QWorkArea(owner, w, h);
+ Application * theApp = static_cast<Application *> qApp;
+ return theApp->newWorkArea(owner, w, h);
}
} // namespace WorkAreaFactory