⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kwqobject.cpp

📁 khtml在gtk上的移植版本
💻 CPP
字号:
/* * Copyright (C) 2001, 2002 Apple Computer, Inc.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */#include "KWQObject.h"#include "KWQVariant.h"#include "KWQAssertions.h"#include "KWQPtrList.h"#include "KWQPtrDict.h"class KWQObjectTimerTarget;typedef QPtrList<KWQObjectTimerTarget> PausedTimerList;const QObject *QObject::_sender;bool QObject::_defersTimers = false;static QPtrDict<PausedTimerList> allPausedTimers;static QPtrList<KWQObjectTimerTarget> deferredTimers;static bool deferringTimers = false;struct _initer {    _initer() {	allPausedTimers.setAutoDelete(true);    }};static _initer _hack_initer;class KWQObjectTimerTarget{    GTimeVal firesAt;    guint sid; // GSource idpublic:    QObject* target;    guint remainingTime;     int timerId;    guint interval; // in millisec    KWQObjectTimerTarget(QObject* target, int timerId);    ~KWQObjectTimerTarget();    // timer interface    void scheduleWithInterval(int intervalMS);    void scheduleWithFractionInterval(int firstIntervalMS, int intervalMS);    void invalidate();    GTimeVal* fireTime() { return &firesAt; }    void sendTimerEvent();    void timerFired();private:    void addTimeout(guint intervalMS, GSourceFunc func, gpointer data);};KWQSignal *QObject::findSignal(const char *signalName) const{    for (KWQSignal *signal = _signalListHead; signal; signal = signal->_next) {        if (KWQNamesMatch(signalName, signal->_name)) {            return signal;        }    }    return 0;}void QObject::connect(const QObject *sender, const char *signalName, const QObject *receiver, const char *member){    // FIXME: Assert that sender is not NULL rather than doing the if statement.    if (!sender) {        return;    }    KWQSignal *signal = sender->findSignal(signalName);    if (!signal) {#if !ERROR_DISABLED        if (1            && !KWQNamesMatch(member, SIGNAL(setStatusBarText(const QString &)))            && !KWQNamesMatch(member, SLOT(slotHistoryChanged()))            && !KWQNamesMatch(member, SLOT(slotJobPercent(KIO::Job *, unsigned long)))            && !KWQNamesMatch(member, SLOT(slotJobSpeed(KIO::Job *, unsigned long)))            && !KWQNamesMatch(member, SLOT(slotScrollBarMoved()))            && !KWQNamesMatch(member, SLOT(slotShowDocument(const QString &, const QString &)))            && !KWQNamesMatch(member, SLOT(slotViewCleared())) // FIXME: Should implement this one!            )	ERROR("connecting member %s to signal %s, but that signal was not found", member, signalName);#endif        return;    }            signal->connect(KWQSlot(const_cast<QObject *>(receiver), member));}void QObject::disconnect(const QObject *sender, const char *signalName, const QObject *receiver, const char *member){    // FIXME: Assert that sender is not NULL rather than doing the if statement.    if (!sender)        return;        KWQSignal *signal = sender->findSignal(signalName);    if (!signal) {        // FIXME: ERROR        return;    }    signal->disconnect(KWQSlot(const_cast<QObject *>(receiver), member));}KWQObjectSenderScope::KWQObjectSenderScope(const QObject *o)    : _savedSender(QObject::_sender){    QObject::_sender = o;}KWQObjectSenderScope::~KWQObjectSenderScope(){    QObject::_sender = _savedSender;}QObject::QObject(QObject *parent, const char *name)    : _signalListHead(0), _signalsBlocked(false)    , _destroyed(this, SIGNAL(destroyed()))    , _eventFilterObject(0)    , _class_type(0){    QOBJECT_TYPE(QObject);    _guardedPtrDummyList.append(this);    _timers.setAutoDelete(false);}QObject::~QObject(){    _destroyed.call();    ASSERT(_signalListHead == &_destroyed);    killTimers();}void QObject::timerEvent(QTimerEvent *te){}bool QObject::event(QEvent *){    return false;}KWQObjectTimerTarget* _find(QPtrList<KWQObjectTimerTarget> *l, int id){    QPtrListIterator<KWQObjectTimerTarget> it(*l);    KWQObjectTimerTarget *p = 0;    while((p=it.current())) {	if (p->timerId == id) 	    return p;		++it;    }    return p;    }void QObject::pauseTimer (int timerId, const void *key){    KWQObjectTimerTarget* target = _find(&_timers, timerId);    if (target) {	GTimeVal *tv = target->fireTime();	GTimeVal diff;	g_get_current_time(&diff);	diff.tv_sec = tv->tv_sec - diff.tv_sec;	diff.tv_usec = tv->tv_usec - diff.tv_usec;		PausedTimerList* pausedTimers = allPausedTimers.find(const_cast<void*>(key));	if (!pausedTimers) {	    pausedTimers = new PausedTimerList;	    allPausedTimers.insert(const_cast<void*>(key), pausedTimers);	}			if (diff.tv_sec < 0)	    diff.tv_sec = 0;	if (diff.tv_usec < 0)	    diff.tv_usec =0;	target->remainingTime = (diff.tv_sec*1000) + (diff.tv_usec/1000);		pausedTimers->append(target);	target->invalidate();	_timers.removeRef(target);    }   }static int nextTimerID = 1;void QObject::clearPausedTimers (const void *key){    PausedTimerList* pausedTimers = allPausedTimers.find(const_cast<void*>(key));    if (pausedTimers) {	pausedTimers->setAutoDelete(true); //delete all paused timers	allPausedTimers.remove(const_cast<void*>(key)); // pausedTimers entry deleted     }}void QObject::resumeTimers (const void *key, QObject *_target){    PausedTimerList* pausedTimers = allPausedTimers.find(const_cast<void*>(key));    if (!pausedTimers)	return;    int maxId = MAX(0, nextTimerID);    QPtrListIterator<KWQObjectTimerTarget> it(*pausedTimers);    KWQObjectTimerTarget *target = 0;    while((target=it.current())) {	target->target = _target;	target->scheduleWithFractionInterval(target->remainingTime, target->interval);	maxId = MAX(maxId, target->timerId);	_timers.append(target);	++it;    }    nextTimerID = maxId+1;    allPausedTimers.remove(const_cast<void*>(key));  // pausedTimers entry deleted, do not delete contents}int QObject::startTimer(int milliseconds){    KWQObjectTimerTarget *target = new KWQObjectTimerTarget(this, nextTimerID);       target->scheduleWithInterval(milliseconds);        _timers.append(target);    return nextTimerID++;}void QObject::killTimer(int timerId){    if (timerId == 0) {        return;    }    KWQObjectTimerTarget *p = _find(&_timers, timerId);    if (p) {	deferredTimers.removeRef(p);	_timers.removeRef(p); 	delete p;     } }void QObject::killTimers(){    deferredTimers.clear(); // not deleted    _timers.setAutoDelete(true);    _timers.clear();     _timers.setAutoDelete(false);}static void stopDeferringTimers(){    ASSERT(deferringTimers);    deferredTimers.first();    while (deferredTimers.current() != 0) {	// remove before sending the timer event, in case the timer	// callback cancels the timer - we don't want to remove too	// much in that case.	KWQObjectTimerTarget *timerTarget = deferredTimers.take();        timerTarget->sendTimerEvent();    }    deferringTimers = false;}void QObject::setDefersTimers(bool defers){    if (defers) {        _defersTimers = true;        deferringTimers = true;	// NOTE: apples version is async:        // [NSObject cancelPreviousPerformRequestsWithTarget:[KWQObjectTimerTarget class]];        return;    }        if (_defersTimers) {        _defersTimers = false;        if (deferringTimers) {	    // NOTE: Apples' version is async:	    // [KWQObjectTimerTarget performSelector:@selector(stopDeferringTimers) withObject:nil afterDelay:0];	    stopDeferringTimers();        }    }}extern "C" { static gboolean frac_interval_timeout(gpointer data){    KWQObjectTimerTarget *p = static_cast<KWQObjectTimerTarget*>(data);    p->scheduleWithInterval(p->interval);    p->timerFired();     return FALSE; // remove source    }static gboolean interval_timeout(gpointer data){    KWQObjectTimerTarget *p = static_cast<KWQObjectTimerTarget*>(data);    p->timerFired();     return TRUE; // don't remove source}}KWQObjectTimerTarget::KWQObjectTimerTarget(QObject* t, int _timerId)    :sid(0)     ,target(t)     ,timerId(_timerId)     ,interval(0){    }KWQObjectTimerTarget::~KWQObjectTimerTarget(){    invalidate();}void KWQObjectTimerTarget::addTimeout(guint intervalMS, GSourceFunc func, gpointer data){    glong secs = (glong) (intervalMS/1000);    glong usecs = (glong) ((intervalMS-(secs*1000)))*1000;    g_get_current_time(&firesAt);    firesAt.tv_sec +=secs;    firesAt.tv_usec +=usecs;    // "If interval is 0, then the timer event occurs once every time there are no     // more window system events to process." --QT API Reference    if (interval==0) 	sid = g_idle_add_full(G_PRIORITY_HIGH_IDLE, func, data, NULL);        else 	sid = g_timeout_add_full(G_PRIORITY_HIGH_IDLE, intervalMS, func, data, NULL);}void KWQObjectTimerTarget::scheduleWithInterval(int intervalMS){    invalidate();    interval = intervalMS;    addTimeout(intervalMS,  (GSourceFunc) ::interval_timeout, this);}void KWQObjectTimerTarget::scheduleWithFractionInterval(int firstIntervalMS, int intervalMS){    invalidate();    interval = intervalMS;    addTimeout(firstIntervalMS, (GSourceFunc)::frac_interval_timeout, this);    }void KWQObjectTimerTarget::invalidate(){    if (sid!=0)	g_source_remove(sid);    }void KWQObjectTimerTarget::sendTimerEvent(){    QTimerEvent event(timerId);    target->timerEvent(&event);}void KWQObjectTimerTarget::timerFired(){    if (deferringTimers) {	if (!deferredTimers.containsRef(this)) {	    deferredTimers.append(this);	}    } else {        sendTimerEvent();    }}bool QObject::inherits(const char *className) const{    if (this==0) return false;        if (strcmp(className, "KHTMLPart") == 0) {	return QOBJECT_IS_A(this, KHTMLPart);    }    if (strcmp(className, "KHTMLView") == 0) {	return QOBJECT_IS_A(this, KHTMLView);	    }    if (strcmp(className, "KParts::Factory") == 0) {	return QOBJECT_IS_A(this, KParts::Factory);    }    if (strcmp(className, "KParts::ReadOnlyPart") == 0) {	return QOBJECT_IS_A(this, KParts::ReadOnlyPart);    }        if (strcmp(className, "QFrame") == 0) {	return QOBJECT_IS_A(this, QFrame);    }    if (strcmp(className, "QScrollView") == 0) {	return QOBJECT_IS_A(this, QScrollView);    }        ERROR("class name %s not recognized", className);    return false;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -