pidgin/quail/quail-redux

Compile on windows
advanced-eventloop
2013-09-17, Phil Hannent
692b90938442
Parents 581cc29f93e5
Children cddacbd44ba2
Compile on windows
--- a/Quail-redux.pro Mon Sep 16 16:27:25 2013 +0100
+++ b/Quail-redux.pro Tue Sep 17 13:59:34 2013 +0100
@@ -30,6 +30,46 @@
QT += webkitwidgets
}
+
+DISTFILES = \
+ AUTHORS \
+ ChangeLog \
+ NEWS \
+ README \
+ quail.png \
+ make.sh \
+ mkstuff.conf \
+ mkipk.sh \
+ mktarball.sh
+
+linux-g++* {
+ message("Using unix")
+ CONFIG += link_pkgconfig
+ PKGCONFIG += purple glib-2.0 gmodule-2.0
+}
+
+win32-g++ {
+ message("Using win32")
+ HEADERS += src/QuailWinGlibEventLoop.h
+ SOURCES += src/QuailWinGlibEventLoop.cpp
+
+ INCLUDEPATH += /cygdrive/c/dev/win32-dev/gtk_2_0-2.14/include/glib-2.0 \
+ /cygdrive/c/dev/win32-dev/gtk_2_0-2.14/include/glib-2.0/include \
+ /cygdrive/c/dev/pidgin-main \
+ c:/dev/pidgin-main \
+ c:/dev/win32-dev/gtk_2_0-2.14/include/glib-2.0 \
+ C:/dev/win32-dev/gtk_2_0-2.14/lib/glib-2.0/include
+
+ LIBS += -L"C:/dev/win32-dev/gtk-2.24.10/lib"
+ LIBS += -L"C:/dev/pidgin-main/libpurple"
+ LIBS += -L"C:/Qt/4.8.5/lib"
+ LIBS += -L"/cygdrive/c/Qt/4.8.5/lib"
+
+ #RC_FILE = resource.rc
+
+ LIBS += -llibpurple -lglib-2.0 -lgmodule-2.0
+}
+
HEADERS = \
src/QuailAccountBox.h \
src/QuailAccountEditor.h \
@@ -83,50 +123,12 @@
src/QuailRequest.cpp \
src/QuailTabBar.cpp \
src/QuailTabWidget.cpp \
- src/main.cpp \
+ src/main.cpp \
src/QuailConvDisplay.cpp \
src/QuailStatusSelector.cpp \
src/QuailBlistItem.cpp
-DISTFILES = \
- AUTHORS \
- ChangeLog \
- NEWS \
- README \
- quail.png \
- make.sh \
- mkstuff.conf \
- mkipk.sh \
- mktarball.sh
-
-linux-g++* {
- message("Using unix")
- CONFIG += link_pkgconfig
- PKGCONFIG += purple glib-2.0 gmodule-2.0
-}
-
-win32-g++ {
- message("Using win32")
- HEADERS += src/QuailWinGlibEventLoop.h
- SOURCES += src/QuailWinGlibEventLoop.cpp
-
- INCLUDEPATH += /cygdrive/c/dev/win32-dev/gtk_2_0-2.14/include/glib-2.0 \
- /cygdrive/c/dev/win32-dev/gtk_2_0-2.14/include/glib-2.0/include \
- /cygdrive/c/dev/pidgin-main \
- c:/dev/pidgin-main \
- c:/dev/win32-dev/gtk_2_0-2.14/include/glib-2.0 \
- C:/dev/win32-dev/gtk_2_0-2.14/lib/glib-2.0/include
-
- LIBS += -L"C:/dev/win32-dev/gtk-2.24.10/lib"
- LIBS += -L"C:/dev/pidgin-main/libpurple"
- LIBS += -L"C:/Qt/4.8.5/lib"
- LIBS += -L"/cygdrive/c/Qt/4.8.5/lib"
-
- #RC_FILE = resource.rc
-
- LIBS += -llibpurple -lglib-2.0 -lgmodule-2.0
-}
INCLUDEPATH += $$(LIBPURPLE_ROOT)
#INCLUDEPATH += $$(QTDIR)
--- a/src/QuailWinGlibEventLoop.cpp Mon Sep 16 16:27:25 2013 +0100
+++ b/src/QuailWinGlibEventLoop.cpp Tue Sep 17 13:59:34 2013 +0100
@@ -195,7 +195,7 @@
GSource source;
QAtomicInt serialNumber;
int lastSerialNumber;
- QuailEventDispatcherWinGlibPrivate *d;
+ QuailEventDispatcherWinGlib *d;
};
static gboolean postEventSourcePrepare(GSource *s, gint *timeout)
@@ -462,8 +462,6 @@
#endif
#endif // Q_OS_WINCE
-class QuailEventDispatcherWinGlibPrivate;
-
#if !defined(DWORD_PTR) && !defined(Q_OS_WIN64)
#define DWORD_PTR DWORD
#endif
@@ -502,8 +500,8 @@
}
}
-QuailEventDispatcherWinGlibPrivate::QuailEventDispatcherWinGlibPrivate(GMainContext *context = 0)
- : mainContext(context), threadId(GetCurrentThreadId()), interrupt(false), internalHwnd(0), getMessageHook(0),
+QuailEventDispatcherWinGlib::QuailEventDispatcherWinGlib(GMainContext *context = 0, QObject parent = 0)
+ : mainContext(context), threadId(GetCurrentThreadId()), interruptFlag(false), internalHwnd(0), getMessageHook(0),
serialNumber(0), lastSerialNumber(0), sendPostedEventsWindowsTimerId(0), wakeUps(0)
{
resolveTimerAPI();
@@ -566,12 +564,12 @@
}
-void QuailEventDispatcherWinGlibPrivate::runTimersOnceWithNormalPriority()
+void QuailEventDispatcherWinGlib::runTimersOnceWithNormalPriority()
{
timerSource->runWithIdlePriority = false;
}
-QuailEventDispatcherWinGlibPrivate::~QuailEventDispatcherWinGlibPrivate()
+QuailEventDispatcherWinGlib::~QuailEventDispatcherWinGlib()
{
if (internalHwnd)
DestroyWindow(internalHwnd);
@@ -579,7 +577,7 @@
UnregisterClass((wchar_t*)className.utf16(), qWinAppInst());
}
-void QuailEventDispatcherWinGlibPrivate::activateEventNotifier(QWinEventNotifier * wen)
+void QuailEventDispatcherWinGlib::activateEventNotifier(QWinEventNotifier * wen)
{
QEvent event(QEvent::WinEventAct);
QCoreApplication::sendEvent(wen, &event);
@@ -620,7 +618,7 @@
#else
QuailEventDispatcherWinGlib *q = (QuailEventDispatcherWinGlib *) GetWindowLong(hwnd, GWL_USERDATA);
#endif
- QuailEventDispatcherWinGlibPrivate *d = 0;
+ QuailEventDispatcherWinGlib *d = 0;
if (q != 0)
d = q->d_func();
@@ -687,7 +685,7 @@
Q_ASSERT(q != 0);
if (q) {
MSG *msg = (MSG *) lp;
- QuailEventDispatcherWinGlibPrivate *d = q->d_func();
+ QuailEventDispatcherWinGlib *d = q->d_func();
const int localSerialNumber = d->serialNumber.load();
if (HIWORD(GetQueueStatus(QS_TIMER | QS_INPUT | QS_RAWINPUT)) == 0) {
// no more input or timer events in the message queue, we can allow posted events to be sent normally now
@@ -768,7 +766,7 @@
return wnd;
}
-void QuailEventDispatcherWinGlibPrivate::registerTimer(WinTimerInfo *t)
+void QuailEventDispatcherWinGlib::registerTimer(WinTimerInfo *t)
{
Q_ASSERT(internalHwnd);
@@ -798,7 +796,7 @@
qErrnoWarning("QuailEventDispatcherWinGlib::registerTimer: Failed to create a timer");
}
-void QuailEventDispatcherWinGlibPrivate::unregisterTimer(WinTimerInfo *t)
+void QuailEventDispatcherWinGlib::unregisterTimer(WinTimerInfo *t)
{
if (t->interval == 0) {
QCoreApplicationPrivate::removePostedTimerEvent(t->dispatcher, t->timerId);
@@ -811,7 +809,7 @@
delete t;
}
-void QuailEventDispatcherWinGlibPrivate::sendTimerEvent(int timerId)
+void QuailEventDispatcherWinGlib::sendTimerEvent(int timerId)
{
WinTimerInfo *t = timerDict.value(timerId);
if (t && !t->inTimerEvent) {
@@ -829,7 +827,7 @@
}
}
-void QuailEventDispatcherWinGlibPrivate::doWsaAsyncSelect(int socket)
+void QuailEventDispatcherWinGlib::doWsaAsyncSelect(int socket)
{
Q_ASSERT(internalHwnd);
int sn_event = 0;
@@ -876,19 +874,6 @@
wakeUp();
}
-QuailEventDispatcherWinGlib::QuailEventDispatcherWinGlib(QObject *parent)
- : QAbstractEventDispatcher(*new QuailEventDispatcherWinGlibPrivate, parent)
-{
-}
-
-QuailEventDispatcherWinGlib::QuailEventDispatcherWinGlib(QuailEventDispatcherWinGlibPrivate &dd, QObject *parent)
- : QAbstractEventDispatcher(dd, parent)
-{ }
-
-QuailEventDispatcherWinGlib::~QuailEventDispatcherWinGlib()
-{
-}
-
bool QuailEventDispatcherWinGlib::processEvents(QEventLoop::ProcessEventsFlags flags)
{
Q_D(QuailEventDispatcherWinGlib);
@@ -896,7 +881,7 @@
if (!d->internalHwnd)
createInternalHwnd();
- d->interrupt = false;
+ d->interruptFlag = false;
emit awake();
bool canWait;
@@ -907,7 +892,7 @@
DWORD waitRet = 0;
HANDLE pHandles[MAXIMUM_WAIT_OBJECTS - 1];
QVarLengthArray<MSG> processedTimers;
- while (!d->interrupt) {
+ while (!d->interruptFlag) {
DWORD nCount = d->winEventNotifierList.count();
Q_ASSERT(nCount < MAXIMUM_WAIT_OBJECTS - 1);
@@ -1003,7 +988,7 @@
// still nothing - wait for message or signalled objects
canWait = (!retVal
- && !d->interrupt
+ && !d->interruptFlag
&& (flags & QEventLoop::WaitForMoreEvents));
if (canWait) {
DWORD nCount = d->winEventNotifierList.count();
@@ -1309,7 +1294,7 @@
void QuailEventDispatcherWinGlib::interrupt()
{
Q_D(QuailEventDispatcherWinGlib);
- d->interrupt = true;
+ d->interruptFlag = true;
wakeUp();
}
--- a/src/QuailWinGlibEventLoop.h Mon Sep 16 16:27:25 2013 +0100
+++ b/src/QuailWinGlibEventLoop.h Tue Sep 17 13:59:34 2013 +0100
@@ -2,6 +2,7 @@
#define QUAILWINGLIBEVENTLOOP_H
#include "QtCore/qt_windows.h"
+#include "QtCore/qcoreevent.h"
#include <QAbstractEventDispatcher>
#include <QHash>
@@ -14,56 +15,6 @@
LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp);
int qt_msectime();
-
-class QuailEventDispatcherWinGlib : public QAbstractEventDispatcher
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QuailEventDispatcherWinGlib)
- void createInternalHwnd();
-
-public:
- explicit QuailEventDispatcherWinGlib(QObject parent = 0);
- explicit QuailEventDispatcherWinGlib(GMainContext *context, QObject *parent = 0);
- ~QuailEventDispatcherWinGlib();
-
- bool QT_ENSURE_STACK_ALIGNED_FOR_SSE processEvents(QEventLoop::ProcessEventsFlags flags);
- bool hasPendingEvents();
-
- void registerSocketNotifier(QSocketNotifier *notifier);
- void unregisterSocketNotifier(QSocketNotifier *notifier);
-
- void registerTimer(int timerId, int interval, Qt::TimerType timerType, QObject *object);
- bool unregisterTimer(int timerId);
- bool unregisterTimers(QObject *object);
- QList<TimerInfo> registeredTimers(QObject *object) const;
-
- bool registerEventNotifier(QWinEventNotifier *notifier);
- void unregisterEventNotifier(QWinEventNotifier *notifier);
- void activateEventNotifiers();
-
- int remainingTime(int timerId);
-
- void wakeUp();
- void interrupt();
- void flush();
-
- void startingUp();
- void closingDown();
-
- bool event(QEvent *e);
-
- /* Glib */
- static bool versionSupported();
-
-protected:
- QuailEventDispatcherWinGlib(QuailEventDispatcherWinGlibPrivate &dd, QObject *parent = 0);
- virtual void sendPostedEvents();
-
-private:
- friend LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp);
- friend LRESULT QT_WIN_CALLBACK qt_GetMessageHook(int, WPARAM, LPARAM);
-};
-
struct GPostEventSource;
struct GSocketNotifierSource;
struct GTimerSource;
@@ -98,12 +49,43 @@
typedef QList<WinTimerInfo*> WinTimerVec; // vector of TimerInfo structs
typedef QHash<int, WinTimerInfo*> WinTimerDict; // fast dict of timers
-class Q_CORE_EXPORT QuailEventDispatcherWinGlibPrivate : public QAbstractEventDispatcherPrivate
+class QuailEventDispatcherWinGlib : public QAbstractEventDispatcher
{
- Q_DECLARE_PUBLIC(QuailEventDispatcherWinGlib)
+ Q_OBJECT
+ void createInternalHwnd();
+
public:
- QuailEventDispatcherWinGlibPrivate(GMainContext *context = 0);
- ~QuailEventDispatcherWinGlibPrivate();
+ explicit QuailEventDispatcherWinGlib(GMainContext *context = 0, QObject *parent = 0);
+ ~QuailEventDispatcherWinGlib();
+
+ bool QT_ENSURE_STACK_ALIGNED_FOR_SSE processEvents(QEventLoop::ProcessEventsFlags flags);
+ bool hasPendingEvents();
+
+ void registerSocketNotifier(QSocketNotifier *notifier);
+ void unregisterSocketNotifier(QSocketNotifier *notifier);
+
+ void registerTimer(int timerId, int interval, Qt::TimerType timerType, QObject *object);
+ bool unregisterTimer(int timerId);
+ bool unregisterTimers(QObject *object);
+ QList<TimerInfo> registeredTimers(QObject *object) const;
+
+ bool registerEventNotifier(QWinEventNotifier *notifier);
+ void unregisterEventNotifier(QWinEventNotifier *notifier);
+ void activateEventNotifiers();
+
+ int remainingTime(int timerId);
+
+ void wakeUp();
+ void interrupt();
+ void flush();
+
+ void startingUp();
+ void closingDown();
+
+ bool event(QEvent *e);
+
+ /* Glib */
+ static bool versionSupported();
GMainContext *mainContext;
GPostEventSource *postEventSource;
@@ -115,7 +97,7 @@
DWORD threadId;
- bool interrupt;
+ bool interruptFlag;
// internal window handle used for socketnotifiers/timers/etc
HWND internalHwnd;
@@ -144,6 +126,14 @@
QList<MSG> queuedUserInputEvents;
QList<MSG> queuedSocketEvents;
+
+protected:
+ virtual void sendPostedEvents();
+
+private:
+ friend LRESULT QT_WIN_CALLBACK qt_internal_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp);
+ friend LRESULT QT_WIN_CALLBACK qt_GetMessageHook(int, WPARAM, LPARAM);
};
+
#endif // QUAILWINGLIBEVENTLOOP_H
--- a/src/main.cpp Mon Sep 16 16:27:25 2013 +0100
+++ b/src/main.cpp Tue Sep 17 13:59:34 2013 +0100
@@ -20,10 +20,10 @@
* MA 02111-1307 USA
*/
-#ifdef Q_OS_WIN
-#include "QuailEventLoop.h"
+#ifndef Q_OS_WIN
#include "QuailWinGlibEventLoop.h"
#endif
+
#include "QuailMainWindow.h"
#include <QApplication>
@@ -31,7 +31,7 @@
int main(int argc, char *argv[])
{
#ifdef Q_OS_WIN
- QuailWinGlibEventLoop quailEventLoop;
+ QuailEventDispatcherWinGlib quailEventLoop;
#endif
QApplication a(argc, argv);
QQuailMainWindow w;