pidgin/quail/quail-redux

3105e8a45d1d
Parents 2a23fb10576a
Children 077fc8c3776a
Continue to experiment with a more robust event system
--- a/.hgignore Sat Sep 21 09:20:52 2013 +0100
+++ b/.hgignore Mon Sep 23 16:03:31 2013 +0100
@@ -4,6 +4,7 @@
*.o
obj
moc
+bin
win32-bin
*.user
*.pro.user.*
--- a/Quail-redux.pro Sat Sep 21 09:20:52 2013 +0100
+++ b/Quail-redux.pro Mon Sep 23 16:03:31 2013 +0100
@@ -58,13 +58,15 @@
win32-g++* {
message("Using win32")
-# HEADERS += src/quailtimerinfolist.h \
-# src/qsystemlibrary.h \
-# src/QuailWinGlibEventLoop.h
+ HEADERS += src/quailtimerinfolist.h \
+ src/qsystemlibrary.h \
+ src/QuailWinGlibEventLoop.h \
+ src/quailglibthread.h
-# SOURCES += src/quailtimerinfolist.cpp \
-# src/qsystemlibrary.h \
-# src/QuailWinGlibEventLoop.cpp
+ SOURCES += src/quailtimerinfolist.cpp \
+ src/qsystemlibrary.h \
+ src/QuailWinGlibEventLoop.cpp \
+ src/quailglibthread.cpp
#RC_FILE = resource.rc
@@ -77,6 +79,7 @@
LIBS += -L"$(LIBPURPLE_ROOT)/../win32-dev/gtk-2.24.10/lib"
LIBS += -L"$(LIBPURPLE_ROOT)/libpurple"
LIBS += -L"$(QTDIR)/lib"
+ TARGET = bin/Quail
}
HEADERS += \
--- a/src/QuailAccountsWindow.cpp Sat Sep 21 09:20:52 2013 +0100
+++ b/src/QuailAccountsWindow.cpp Mon Sep 23 16:03:31 2013 +0100
@@ -545,7 +545,7 @@
qQuailConnConnectProgress(PurpleConnection *gc, const char *text,
size_t step, size_t step_count)
{
- qDebug() << "QQuailAccountsWindow::qQuailConnConnectProgress";
+ qDebug() << "QQuailAccountsWindow::qQuailConnConnectProgress" << gc->display_name;
QQuailConnectionMeters *meters;
QQuailConnectionMeter *meter;
@@ -561,7 +561,7 @@
static void
qQuailConnConnected(PurpleConnection *gc)
{
- qDebug() << "QQuailAccountsWindow::qQuailConnConnected";
+ qDebug() << "QQuailAccountsWindow::qQuailConnConnected" << gc->display_name;
QQuailConnectionMeters *meters = qQuailGetMainWindow()->getMeters();
QQuailConnectionMeter *meter;
@@ -574,7 +574,7 @@
static void
qQuailConnDisconnected(PurpleConnection *gc)
{
- qDebug() << "QQuailAccountsWindow::qQuailConnDisconnected";
+ qDebug() << "QQuailAccountsWindow::qQuailConnDisconnected" << gc->display_name;
QQuailConnectionMeters *meters = qQuailGetMainWindow()->getMeters();
QQuailConnectionMeter *meter;
@@ -603,6 +603,19 @@
qDebug() << text;
}
+static void
+qQuail_connection_network_disconnected(void)
+{
+ qDebug() << "QQuailAccountsWindow::qQuail_connection_network_disconnected";
+
+}
+
+static void
+qQuail_connection_network_connected(void)
+{
+ qDebug() << "QQuailAccountsWindow::qQuail_connection_network_connected";
+}
+
static PurpleConnectionUiOps connUiOps =
{
qQuailConnConnectProgress, /*connect_progress*/
@@ -610,8 +623,8 @@
qQuailConnDisconnected, /* disconnected */
qQuailConnNotice, /* notice */
NULL, /*report_disconnect */
- NULL, /* network_connected*/
- NULL, /* network_disconnected*/
+ qQuail_connection_network_connected, /* network_connected*/
+ qQuail_connection_network_disconnected, /* network_disconnected*/
qQuailConnectionReportDisconnectReason, /* report_disconnect_reason*/
NULL,
NULL,
--- a/src/QuailEventLoop.cpp Sat Sep 21 09:20:52 2013 +0100
+++ b/src/QuailEventLoop.cpp Mon Sep 23 16:03:31 2013 +0100
@@ -45,34 +45,31 @@
//static QThread *quailThread = new QThread();
QQuailTimer::QQuailTimer(guint sourceId, GSourceFunc func, gpointer data)
- : sourceId(sourceId), func(func), userData(data), t(0)
+ : QTimer(0), sourceId(sourceId), func(func), userData(data)
{
- qDebug() << "QQuailTimer::QQuailTimer.1";
+ //qDebug() << "QQuailTimer::QQuailTimer.1";
+// this->setSingleShot(true);
+ connect(this, SIGNAL(timeout()),
+ this, SLOT(update()));
}
void
QQuailTimer::update()
{
- qDebug() << "QQuailTimer::update()";
+ //qDebug() << "QQuailTimer::update()";
if (!func(userData))
qQuailSourceRemove(sourceId);
}
-void
-QQuailTimer::start(int msec)
-{
- qDebug() << "QQuailTimer::start.1";
-// if (mainWin == 0)
-// return;
-
- if (t == 0)
- {
- t = mainWin->getNewTimer();
- connect(t, SIGNAL(timeout()),
- this, SLOT(update()));
- }
- t->start(msec);
-}
+//void
+//QQuailTimer::start(int msec)
+//{
+// //qDebug() << "QQuailTimer::start.1";
+// if (msec == 0)
+// update();
+// else
+// this->start(msec);
+//}
QQuailInputNotifier::QQuailInputNotifier(int fd,
PurpleInputCondition cond,
@@ -81,24 +78,33 @@
: QObject(), func(func), userData(userData), readNotifier(NULL),
writeNotifier(NULL)
{
- //qDebug() << "QQuailInputNotifier::QQuailInputNotifier";
+ qDebug() << "QQuailInputNotifier::QQuailInputNotifier" << cond;
+ qDebug() << "QQuailInputNotifier::QQuailInputNotifier" << fd;
+ bool bRead = false;
+ bool bWrite = false;
+
if (cond & PURPLE_INPUT_READ)
{
- //qDebug() << "QQuailInputNotifier::QQuailInputNotifier::READ";
+ qDebug() << "QQuailInputNotifier::QQuailInputNotifier::READ";
readNotifier = new QSocketNotifier(fd, QSocketNotifier::Read);
connect(readNotifier, SIGNAL(activated(int)),
this, SLOT(ioInvoke(int)));
+ bRead = true;
}
if (cond & PURPLE_INPUT_WRITE)
{
- //qDebug() << "QQuailInputNotifier::QQuailInputNotifier::WRITE";
+ qDebug() << "QQuailInputNotifier::QQuailInputNotifier::WRITE";
writeNotifier = new QSocketNotifier(fd, QSocketNotifier::Write);
connect(writeNotifier, SIGNAL(activated(int)),
this, SLOT(ioInvoke(int)));
+ bWrite = true;
}
+
+ if (!bWrite && !bRead)
+ qWarning() << "QQuailInputNotifier::QQuailInputNotifier:Unknown QSocketNotifier type";
}
QQuailInputNotifier::~QQuailInputNotifier()
@@ -113,7 +119,7 @@
void
QQuailInputNotifier::ioInvoke(int fd)
{
- //qDebug() << "QQuailInputNotifier::ioInvoke";
+ qDebug() << "QQuailInputNotifier::ioInvoke";
int cond = 0;
if (readNotifier != NULL)
@@ -129,24 +135,26 @@
static guint
qQuailTimeoutAdd(guint interval, GSourceFunc func, gpointer data)
{
- //qDebug() << "QQuailInputNotifier::qQuailTimeoutAdd";
+ qDebug() << "qQuailTimeoutAdd" << interval;
QQuailSourceInfo *info = new QQuailSourceInfo;
info->handle = nextSourceId++;
info->timer = new QQuailTimer(info->handle, func, data);
//info->timer->moveToThread(quailThread);
- info->timer->start(interval);
-
m_sources.insert(info->handle, info);
-
+ if (interval > 0)
+ {
+ info->timer->start(interval);
+ }
+ info->timer->update();
return info->handle;
}
static gboolean
qQuailTimeoutRemove(guint handle)
{
- //qDebug() << "QQuailInputNotifier::qQuailTimeoutRemove";
+ qDebug() << "QQuailInputNotifier::qQuailTimeoutRemove";
qQuailSourceRemove(handle);
return 0;
@@ -158,7 +166,7 @@
PurpleInputFunction func,
gpointer userData)
{
- //qDebug() << "QQuailInputNotifier::qQuailInputAdd";
+ qDebug() << "QQuailInputNotifier::qQuailInputAdd";
QQuailSourceInfo *info = new QQuailSourceInfo;
info->handle = nextSourceId++;
@@ -166,14 +174,15 @@
info->notifier = new QQuailInputNotifier(fd, cond, func, userData);
m_sources.insert(info->handle, info);
-
+ qDebug() << "QQuailInputNotifier::qQuailInputAdd.end::" << info->handle;
+ qDebug() << "QQuailInputNotifier::qQuailInputAdd.end::" << m_sources.size();
return info->handle;
}
static gboolean
qQuailSourceRemove(guint handle)
{
- //qDebug() << "QQuailInputNotifier::qQuailSourceRemove";
+ qDebug() << "QQuailInputNotifier::qQuailSourceRemove";
QQuailSourceInfo *info;
info = m_sources.value(handle);
@@ -195,7 +204,7 @@
static int
qQuailInputGetError(int /*fd*/, int */*error*/)
{
- //qDebug() << "QQuailInputNotifier::qQuailInputGetError";
+ qDebug() << "QQuailInputNotifier::qQuailInputGetError";
return 0;
}
@@ -226,9 +235,3 @@
{
return &eventloop_ops;
}
-
-//QuailEventDispatcherMarkTwo::QuailEventDispatcherMarkTwo(QObject *parent)
-// : QAbstractEventDispatcher(parent)
-//{
-// mainEvent = this;
-//}
--- a/src/QuailEventLoop.h Sat Sep 21 09:20:52 2013 +0100
+++ b/src/QuailEventLoop.h Mon Sep 23 16:03:31 2013 +0100
@@ -26,28 +26,21 @@
#include <QTimer>
#include <QSocketNotifier>
-/* http://harmattan-dev.nokia.com/docs/library/html/qt4/qabstracteventdispatcher.html */
-//#include <QAbstractEventDispatcher>
-#include "QuailMainWindow.h"
-static QQuailMainWindow *mainWin = 0;
-
-class QQuailTimer : public QObject
+class QQuailTimer : public QTimer
{
Q_OBJECT
public:
QQuailTimer(guint sourceId, GSourceFunc func, gpointer data);
- void start(int interval);
- private slots:
+ public slots:
void update();
private:
guint sourceId;
GSourceFunc func;
gpointer userData;
- QTimer *t;
};
class QQuailInputNotifier : public QObject
@@ -69,8 +62,6 @@
QSocketNotifier *readNotifier, *writeNotifier;
};
-
-
/**
* Returns the Qt event loop UI operations structure.
*
@@ -88,29 +79,4 @@
*/
void qQuailEventLoopUninit(void);
-//class QuailEventDispatcherMarkTwo : public QAbstractEventDispatcher
-//{
-// Q_OBJECT
-
-//public:
-// QuailEventDispatcherMarkTwo(QObject *parent = 0);
-
-// virtual bool processEvents(QEventLoop::ProcessEventsFlags flags)
-// {; }
-// virtual bool hasPendingEvents() = 0;
-
-// virtual void registerSocketNotifier(QSocketNotifier *notifier) = 0;
-// virtual void unregisterSocketNotifier(QSocketNotifier *notifier) = 0;
-
-// virtual void registerTimer(int timerId, int interval, QObject *object) = 0;
-// virtual bool unregisterTimer(int timerId) = 0;
-// virtual bool unregisterTimers(QObject *object) = 0;
-// virtual QList<TimerInfo> registeredTimers(QObject *object) const = 0;
-
-// virtual void wakeUp() = 0;
-// virtual void interrupt() = 0;
-// virtual void flush() = 0;
-
-//};
-
#endif /* _QUAIL_EVENT_LOOP_H_ */
--- a/src/QuailMainWindow.cpp Sat Sep 21 09:20:52 2013 +0100
+++ b/src/QuailMainWindow.cpp Mon Sep 23 16:03:31 2013 +0100
@@ -58,6 +58,8 @@
#include "QuailPrefsDialog.h"
#include "QuailRequest.h"
+static QQuailMainWindow *mainWin = 0;
+
/**************************************************************************
* Core stuff
**************************************************************************/
@@ -330,12 +332,14 @@
purple_core_set_ui_ops(qQuailGetCoreUiOps());
qDebug() << "QQuailMainWindow::initCore().1";
purple_eventloop_set_ui_ops(qQuailGetEventLoopUiOps());
+ QApplication::processEvents();
qDebug() << "QQuailMainWindow::initCore().2";
if (!purple_core_init("quail")) {
qDebug() << tr("Initialization of the Quail core failed.\n"
"Please report this!\n");
}
- purple_debug_set_enabled(false);
+ QApplication::processEvents();
+ purple_debug_set_enabled(true);
qDebug() << "QQuailMainWindow::initCore().3";
path = g_build_filename(purple_user_dir(), "plugins", NULL);
qDebug() << "QQuailMainWindow::initCore().4";
--- a/src/QuailWinGlibEventLoop.cpp Sat Sep 21 09:20:52 2013 +0100
+++ b/src/QuailWinGlibEventLoop.cpp Mon Sep 23 16:03:31 2013 +0100
@@ -1,4 +1,4 @@
-#include "QuailWinGlibEventLoop.h"
+#include "QuailWinGlibEventLoop.h"
#include <QCoreApplication>
#include <glib.h>
@@ -29,6 +29,7 @@
static gboolean socketNotifierSourcePrepare(GSource *, gint *timeout)
{
+ qDebug() << "socketNotifierSourcePrepare";
if (timeout)
*timeout = -1;
return false;
@@ -36,6 +37,7 @@
static gboolean socketNotifierSourceCheck(GSource *source)
{
+ qDebug() << "socketNotifierSourceCheck";
GSocketNotifierSource *src = reinterpret_cast<GSocketNotifierSource *>(source);
bool pending = false;
@@ -59,6 +61,7 @@
static gboolean socketNotifierSourceDispatch(GSource *source, GSourceFunc, gpointer)
{
+ qDebug() << "socketNotifierSourceDispatch";
QEvent event(QEvent::SockAct);
GSocketNotifierSource *src = reinterpret_cast<GSocketNotifierSource *>(source);
@@ -163,6 +166,7 @@
static gboolean idleTimerSourcePrepare(GSource *source, gint *timeout)
{
+ qDebug() << "QuailEventDispatcherWinGlib::idleTimerSourcePrepare";
GIdleTimerSource *idleTimerSource = reinterpret_cast<GIdleTimerSource *>(source);
GTimerSource *timerSource = idleTimerSource->timerSource;
if (!timerSource->runWithIdlePriority) {
@@ -177,6 +181,7 @@
static gboolean idleTimerSourceCheck(GSource *source)
{
+ qDebug() << "QuailEventDispatcherWinGlib::idleTimerSourceCheck";
GIdleTimerSource *idleTimerSource = reinterpret_cast<GIdleTimerSource *>(source);
GTimerSource *timerSource = idleTimerSource->timerSource;
if (!timerSource->runWithIdlePriority) {
@@ -188,6 +193,7 @@
static gboolean idleTimerSourceDispatch(GSource *source, GSourceFunc, gpointer)
{
+
GTimerSource *timerSource = reinterpret_cast<GIdleTimerSource *>(source)->timerSource;
(void) timerSourceDispatch(&timerSource->source, 0, 0);
return true;
@@ -212,6 +218,7 @@
static gboolean postEventSourcePrepare(GSource *s, gint *timeout)
{
+ qDebug() << "QuailEventDispatcherWinGlib::postEventSourcePrepare";
// QThreadData *data = QThreadData::current();
// if (!data)
// return false;
@@ -236,6 +243,7 @@
static gboolean postEventSourceDispatch(GSource *s, GSourceFunc, gpointer)
{
+ qDebug() << "QuailEventDispatcherWinGlib::postEventSourceDispatch";
GPostEventSource *source = reinterpret_cast<GPostEventSource *>(s);
source->lastSerialNumber = source->serialNumber.load();
QCoreApplication::sendPostedEvents();
@@ -454,6 +462,7 @@
int WSAAsyncSelect(SOCKET sock, HWND handle, unsigned int msg, long ev)
{
+ qDebug() << "QuailEventDispatcherWinGlib::WSAAsyncSelect";
if (sock == 0 || handle == 0 || handle == INVALID_HANDLE_VALUE) {
WSASetLastError(WSAEINVAL);
return SOCKET_ERROR;
@@ -490,6 +499,7 @@
static void resolveTimerAPI()
{
+ qDebug() << "QuailEventDispatcherWinGlib::resolveTimerAPI";
static bool triedResolve = false;
if (!triedResolve) {
#ifndef QT_NO_THREAD
@@ -599,6 +609,7 @@
void QuailEventDispatcherWinGlib::activateEventNotifier(QWinEventNotifier * wen)
{
+ qDebug() << "QuailEventDispatcherWinGlib::activateEventNotifier";
QEvent event(QEvent::WinEventAct);
QCoreApplication::sendEvent((QObject*)wen, &event);
}
@@ -617,7 +628,7 @@
{
if (message == WM_NCCREATE)
return true;
-
+ qDebug() << "QuailEventDispatcherWinGlib::qt_internal_proc";
MSG msg;
msg.hwnd = hwnd;
msg.message = message;
@@ -855,6 +866,7 @@
void QuailEventDispatcherWinGlib::doWsaAsyncSelect(int socket)
{
+ qDebug() << "QuailEventDispatcherWinGlib::doWsaAsyncSelect";
Q_ASSERT(internalHwnd);
int sn_event = 0;
if (sn_read.contains(socket))
@@ -1048,6 +1060,7 @@
bool QuailEventDispatcherWinGlib::hasPendingEvents()
{
+ qDebug() << "QuailEventDispatcherWinGlib::hasPendingEvents";
MSG msg;
return qGlobalPostedEventsCount() || PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
}
--- a/src/quailglibthread.cpp Sat Sep 21 09:20:52 2013 +0100
+++ b/src/quailglibthread.cpp Mon Sep 23 16:03:31 2013 +0100
@@ -1,17 +1,17 @@
-#include "quailglibthread.h"
+#include "quailglibthread.h"
-QuailThread::QuailThread(QObject *parent) :
+QuailGlibThread::QuailGlibThread(QObject *parent) :
QThread(parent)
{
}
-QuailThread::~QuailThread()
+QuailGlibThread::~QuailGlibThread()
{
stop();
}
-bool QuailThread::start()
+bool QuailGlibThread::start()
{
QMutexLocker locker(&m);
QThread::start();
@@ -19,7 +19,7 @@
return success;
}
-void QuailThread::stop()
+void QuailGlibThread::stop()
{
QMutexLocker locker(&m);
if(mainLoop)
@@ -32,13 +32,13 @@
wait();
}
-GMainContext *QuailThread::mainContext()
+GMainContext *QuailGlibThread::getMainContext()
{
QMutexLocker locker(&m);
return mainContext;
}
-void QuailThread::run()
+void QuailGlibThread::run()
{
// this will be unlocked as soon as the mainloop runs
m.lock();
@@ -51,7 +51,7 @@
// deferred call to loop_started()
GSource *timer = g_timeout_source_new(0);
g_source_attach(timer, mainContext);
- g_source_set_callback(timer, cb_loop_started, d, NULL);
+ g_source_set_callback(timer, cb_loop_started, this, NULL);
// kick off the event loop
g_main_loop_run(mainLoop);
--- a/src/quailglibthread.h Sat Sep 21 09:20:52 2013 +0100
+++ b/src/quailglibthread.h Mon Sep 23 16:03:31 2013 +0100
@@ -1,25 +1,24 @@
-#ifndef QUAILGLIBTHREAD_H
+#ifndef QUAILGLIBTHREAD_H
#define QUAILGLIBTHREAD_H
#include <QThread>
#include <QMutex>
#include <QWaitCondition>
-#include <glib/gmain.h>
-
+#include <glib.h>
class QuailGlibThread : public QThread
{
Q_OBJECT
public:
- QuailThread(QObject *parent = 0);
- ~QuailThread();
+ QuailGlibThread(QObject *parent = 0);
+ ~QuailGlibThread();
bool start();
void stop();
void run();
- GMainContext *mainContext();
+ GMainContext *getMainContext();
protected:
bool success;
@@ -30,7 +29,7 @@
static gboolean cb_loop_started(gpointer data)
{
- return ((Private *)data)->loop_started();
+ return ((QuailGlibThread *)data)->loop_started();
}
gboolean loop_started()