diff -U4 -r psi-0.11/src/psiaccount.cpp psi-0.11+byte/src/psiaccount.cpp --- psi-0.11/src/psiaccount.cpp 2007-10-14 15:00:53.000000000 +0100 +++ psi-0.11+byte/src/psiaccount.cpp 2008-05-15 22:14:57.000000000 +0100 @@ -2213,9 +2213,9 @@ d->lastTune = tune; d->pepManager->publish("http://jabber.org/protocol/tune",PubSubItem("current",t)); } -void PsiAccount::secondsIdle(int x) +void PsiAccount::secondsIdle(int x, bool fs) { if(!loggedIn()) return; @@ -2234,9 +2234,9 @@ return; if(ls.isAvailable()) { // no longer idle? - if(lastIdle > x) { + if(!fs && lastIdle > x) { if(ls.isAway() && usingAutoStatus) { lastStatus = d->origStatus; setStatusDirect(lastStatus); usingAutoStatus = false; @@ -2249,8 +2249,17 @@ lastStatus = Status("", "", d->acc.priority, false); usingAutoStatus = false; logout(); } + else if(fs) { + if (ls.type() != XMPP::Status::DND && lastStatus.type() != XMPP::Status::DND) { + lastStatus = Status(XMPP::Status::DND, option.asMessage, d->acc.priority); + if(!usingAutoStatus) + d->origStatus = d->loginStatus; + setStatusDirect(lastStatus); + usingAutoStatus = true; + } + } else if(option.use_asXa && option.asXa > 0 && minutes >= option.asXa) { if(ls.type() != XMPP::Status::XA && lastStatus.type() != XMPP::Status::XA) { lastStatus = Status(XMPP::Status::XA, option.asMessage, d->acc.priority); if(!usingAutoStatus) diff -U4 -r psi-0.11/src/psiaccount.h psi-0.11+byte/src/psiaccount.h --- psi-0.11/src/psiaccount.h 2007-10-14 15:00:53.000000000 +0100 +++ psi-0.11+byte/src/psiaccount.h 2008-05-14 19:50:04.000000000 +0100 @@ -204,9 +204,9 @@ void tunePlaying(const Tune&); void incomingVoiceCall(const Jid&); - void secondsIdle(int); + void secondsIdle(int, bool); void openNextEvent(); int forwardPendingEvents(const Jid &jid); void autoLogin(); diff -U4 -r psi-0.11/src/psicon.cpp psi-0.11+byte/src/psicon.cpp --- psi-0.11/src/psicon.cpp 2007-10-14 15:00:53.000000000 +0100 +++ psi-0.11+byte/src/psicon.cpp 2008-05-14 19:49:53.000000000 +0100 @@ -794,9 +794,9 @@ PsiAccount *PsiCon::createAccount(const UserAccount& acc) { PsiAccount *pa = new PsiAccount(acc, d->contactList); - connect(&d->idle, SIGNAL(secondsIdle(int)), pa, SLOT(secondsIdle(int))); + connect(&d->idle, SIGNAL(secondsIdle(int, bool)), pa, SLOT(secondsIdle(int, bool))); connect(pa, SIGNAL(updatedActivity()), SLOT(pa_updatedActivity())); connect(pa, SIGNAL(updatedAccount()), SLOT(pa_updatedAccount())); connect(pa, SIGNAL(queueChanged()), SLOT(queueChanged())); if(d->s5bServer) diff -U4 -r psi-0.11/src/tools/idle/idle.cpp psi-0.11+byte/src/tools/idle/idle.cpp --- psi-0.11/src/tools/idle/idle.cpp 2007-10-14 15:00:55.000000000 +0100 +++ psi-0.11+byte/src/tools/idle/idle.cpp 2008-05-14 19:51:26.000000000 +0100 @@ -135,6 +135,6 @@ // how long have we been idle? int idleTime = d->startTime.secsTo(QDateTime::currentDateTime()); - secondsIdle(idleTime); + secondsIdle(idleTime, platform->fullScreen()); } diff -U4 -r psi-0.11/src/tools/idle/idle.h psi-0.11+byte/src/tools/idle/idle.h --- psi-0.11/src/tools/idle/idle.h 2007-10-14 15:00:55.000000000 +0100 +++ psi-0.11+byte/src/tools/idle/idle.h 2008-05-14 19:51:12.000000000 +0100 @@ -37,9 +37,9 @@ void start(); void stop(); signals: - void secondsIdle(int); + void secondsIdle(int, bool); private slots: void doCheck(); @@ -55,8 +55,9 @@ ~IdlePlatform(); bool init(); int secondsIdle(); + bool fullScreen(); private: class Private; Private *d; diff -U4 -r psi-0.11/src/tools/idle/idle_mac.cpp psi-0.11+byte/src/tools/idle/idle_mac.cpp --- psi-0.11/src/tools/idle/idle_mac.cpp 2007-10-14 15:00:55.000000000 +0100 +++ psi-0.11+byte/src/tools/idle/idle_mac.cpp 2008-05-14 19:51:55.000000000 +0100 @@ -157,4 +157,9 @@ int IdlePlatform::secondsIdle() { return d->mSecondsIdle; } + + +bool IdlePlatform::fullScreen() { + return false; +} diff -U4 -r psi-0.11/src/tools/idle/idle_win.cpp psi-0.11+byte/src/tools/idle/idle_win.cpp --- psi-0.11/src/tools/idle/idle_win.cpp 2007-10-14 15:00:55.000000000 +0100 +++ psi-0.11+byte/src/tools/idle/idle_win.cpp 2008-05-14 19:52:17.000000000 +0100 @@ -105,4 +105,9 @@ return 0; return (GetTickCount() - i) / 1000; } + +bool IdlePlatform::fullScreen() +{ + return false; +} diff -U4 -r psi-0.11/src/tools/idle/idle_x11.cpp psi-0.11+byte/src/tools/idle/idle_x11.cpp --- psi-0.11/src/tools/idle/idle_x11.cpp 2007-10-14 15:00:55.000000000 +0100 +++ psi-0.11+byte/src/tools/idle/idle_x11.cpp 2008-05-15 01:27:17.000000000 +0100 @@ -25,8 +25,9 @@ IdlePlatform::IdlePlatform() {} IdlePlatform::~IdlePlatform() {} bool IdlePlatform::init() { return false; } int IdlePlatform::secondsIdle() { return 0; } +bool IdlePlatform::fullScreen() { return false; } #else #include @@ -94,5 +95,48 @@ return 0; return d->ss_info->idle / 1000; } +bool IdlePlatform::fullScreen() +{ + Display *dpy = QApplication::desktop()->screen()->x11Display(); + int i, j; + + if (dpy == NULL) + return false; + + for (i = 0; i < XScreenCount(dpy); i++) { + Window parent_win; + Window root_win; + Window *child_windows; + unsigned int num_child_windows = 0; + XWindowAttributes root_attrs; + bool fullscreen = false; + + if (!XQueryTree(dpy, XRootWindow(dpy, i), &root_win, &parent_win, &child_windows, &num_child_windows)) + continue; + + if (!XGetWindowAttributes(dpy, root_win, &root_attrs)) + continue; + + for (j = 0; j < num_child_windows; j++) { + XWindowAttributes attrs; + + if (!XGetWindowAttributes(dpy, child_windows[j], &attrs)) + continue; + + /* find the top-most visible window and compare its size to the root window */ + if (attrs.map_state == IsViewable && !attrs.override_redirect) + fullscreen = (attrs.x == root_attrs.x && attrs.y == root_attrs.y + && attrs.width == root_attrs.width && attrs.height == root_attrs.height); + } + + XFree(child_windows); + + if (fullscreen) + return true; + } + + return false; +} + #endif