diff -r -U4 psi-0.12/src/psiaccount.cpp psi-0.12+byte/src/psiaccount.cpp --- psi-0.12/src/psiaccount.cpp 2008-05-14 22:33:03.000000000 +0100 +++ psi-0.12+byte/src/psiaccount.cpp 2008-11-15 22:43:33.000000000 +0000 @@ -552,8 +552,9 @@ enum AutoAway { AutoAway_None = 0, AutoAway_Away, AutoAway_XA, + AutoAway_DND, AutoAway_Offline }; void setAutoAway(AutoAway autoAway) @@ -583,8 +584,10 @@ case AutoAway_Away: return Status(XMPP::Status::Away, PsiOptions::instance()->getOption("options.status.auto-away.message").toString(), acc.priority); case AutoAway_XA: return Status(XMPP::Status::XA, PsiOptions::instance()->getOption("options.status.auto-away.message").toString(), acc.priority); + case AutoAway_DND: + return Status(XMPP::Status::DND, PsiOptions::instance()->getOption("options.status.auto-away.message").toString(), acc.priority); case AutoAway_Offline: return Status(Status::Offline, loginStatus.status(), acc.priority); default: ; @@ -2450,13 +2453,15 @@ d->lastTune = tune; d->pepManager->publish("http://jabber.org/protocol/tune",PubSubItem("current",t)); } -void PsiAccount::secondsIdle(int seconds) +void PsiAccount::secondsIdle(int seconds, bool fs) { int minutes = seconds / 60; - if(PsiOptions::instance()->getOption("options.status.auto-away.use-offline").toBool() && PsiOptions::instance()->getOption("options.status.auto-away.offline-after").toInt() > 0 && minutes >= PsiOptions::instance()->getOption("options.status.auto-away.offline-after").toInt()) + if(fs) + d->setAutoAway(Private::AutoAway_DND); + else if(PsiOptions::instance()->getOption("options.status.auto-away.use-offline").toBool() && PsiOptions::instance()->getOption("options.status.auto-away.offline-after").toInt() > 0 && minutes >= PsiOptions::instance()->getOption("options.status.auto-away.offline-after").toInt()) d->setAutoAway(Private::AutoAway_Offline); else if(PsiOptions::instance()->getOption("options.status.auto-away.use-not-availible").toBool() && PsiOptions::instance()->getOption("options.ui.menu.status.xa").toBool() && PsiOptions::instance()->getOption("options.status.auto-away.not-availible-after").toInt() > 0 && minutes >= PsiOptions::instance()->getOption("options.status.auto-away.not-availible-after").toInt()) d->setAutoAway(Private::AutoAway_XA); else if(PsiOptions::instance()->getOption("options.status.auto-away.use-away").toBool() && PsiOptions::instance()->getOption("options.status.auto-away.away-after").toInt() > 0 && minutes >= PsiOptions::instance()->getOption("options.status.auto-away.away-after").toInt()) diff -r -U4 psi-0.12/src/psiaccount.h psi-0.12+byte/src/psiaccount.h --- psi-0.12/src/psiaccount.h 2008-02-01 01:52:05.000000000 +0000 +++ psi-0.12+byte/src/psiaccount.h 2008-11-08 20:24:41.000000000 +0000 @@ -215,9 +215,9 @@ void tunePlaying(const Tune&); void incomingVoiceCall(const Jid&); - void secondsIdle(int); + void secondsIdle(int, bool); void openNextEvent(ActivationType activationType); int forwardPendingEvents(const Jid &jid); void autoLogin(); diff -r -U4 psi-0.12/src/psicon.cpp psi-0.12+byte/src/psicon.cpp --- psi-0.12/src/psicon.cpp 2008-04-25 00:56:10.000000000 +0100 +++ psi-0.12+byte/src/psicon.cpp 2008-11-08 20:24:25.000000000 +0000 @@ -797,9 +797,9 @@ PsiAccount *PsiCon::createAccount(const UserAccount& acc) { PsiAccount *pa = new PsiAccount(acc, d->contactList, d->capsRegistry, d->tabManager); - 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())); connect(pa, SIGNAL(startBounce()), SLOT(startBounce())); diff -r -U4 psi-0.12/src/tools/idle/idle.cpp psi-0.12+byte/src/tools/idle/idle.cpp --- psi-0.12/src/tools/idle/idle.cpp 2007-04-08 09:11:44.000000000 +0100 +++ psi-0.12+byte/src/tools/idle/idle.cpp 2008-11-08 20:19:37.000000000 +0000 @@ -135,6 +135,6 @@ // how long have we been idle? int idleTime = d->startTime.secsTo(QDateTime::currentDateTime()); - secondsIdle(idleTime); + secondsIdle(idleTime, platform->fullScreen()); } diff -r -U4 psi-0.12/src/tools/idle/idle.h psi-0.12+byte/src/tools/idle/idle.h --- psi-0.12/src/tools/idle/idle.h 2007-04-08 09:11:44.000000000 +0100 +++ psi-0.12+byte/src/tools/idle/idle.h 2008-11-08 20:19:37.000000000 +0000 @@ -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 -r -U4 psi-0.12/src/tools/idle/idle_mac.cpp psi-0.12+byte/src/tools/idle/idle_mac.cpp --- psi-0.12/src/tools/idle/idle_mac.cpp 2007-04-08 09:11:44.000000000 +0100 +++ psi-0.12+byte/src/tools/idle/idle_mac.cpp 2008-11-08 20:19:37.000000000 +0000 @@ -157,4 +157,9 @@ int IdlePlatform::secondsIdle() { return d->mSecondsIdle; } + + +bool IdlePlatform::fullScreen() { + return false; +} diff -r -U4 psi-0.12/src/tools/idle/idle_win.cpp psi-0.12+byte/src/tools/idle/idle_win.cpp --- psi-0.12/src/tools/idle/idle_win.cpp 2008-02-09 00:31:30.000000000 +0000 +++ psi-0.12+byte/src/tools/idle/idle_win.cpp 2008-11-08 20:19:37.000000000 +0000 @@ -105,4 +105,9 @@ return 0; return (GetTickCount() - i) / 1000; } + +bool IdlePlatform::fullScreen() +{ + return false; +} diff -r -U4 psi-0.12/src/tools/idle/idle_x11.cpp psi-0.12+byte/src/tools/idle/idle_x11.cpp --- psi-0.12/src/tools/idle/idle_x11.cpp 2008-02-21 09:35:33.000000000 +0000 +++ psi-0.12+byte/src/tools/idle/idle_x11.cpp 2008-11-08 20:19:37.000000000 +0000 @@ -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