diff options
Diffstat (limited to 'kdesktop')
-rw-r--r-- | kdesktop/bgmanager.cc | 104 | ||||
-rw-r--r-- | kdesktop/bgmanager.h | 17 | ||||
-rw-r--r-- | kdesktop/kdesktop.kcfg | 31 | ||||
-rw-r--r-- | kdesktop/lock/lockdlg.cc | 56 | ||||
-rw-r--r-- | kdesktop/lock/lockprocess.cc | 1 | ||||
-rw-r--r-- | kdesktop/lock/main.cc | 14 |
6 files changed, 161 insertions, 62 deletions
diff --git a/kdesktop/bgmanager.cc b/kdesktop/bgmanager.cc index ddb95c9e7..32f774357 100644 --- a/kdesktop/bgmanager.cc +++ b/kdesktop/bgmanager.cc @@ -16,10 +16,15 @@ #include "bgsettings.h" #include "kdesktopapp.h" +#include "KCrossBGRender.h" +#include "crossfade.h" + #include <assert.h> #include <tqtimer.h> #include <tqscrollview.h> +#include <tqpainter.h> +#include <tqdesktopwidget.h> #include <kiconloader.h> #include <tdeconfig.h> @@ -34,6 +39,8 @@ #include <X11/X.h> #include <X11/Xlib.h> #include <X11/Xatom.h> +#include <X11/extensions/Xrender.h> +#include <unistd.h> #ifndef None #define None 0L @@ -47,7 +54,7 @@ #include "pixmapserver.h" -template class TQPtrVector<KBackgroundRenderer>; +template class TQPtrVector<KCrossBGRender>; template class TQPtrVector<KBackgroundCacheEntry>; template class TQMemArray<int>; @@ -108,6 +115,12 @@ KBackgroundManager::KBackgroundManager(TQWidget *desktop, KWinModule* twinModule connect(m_pTimer, TQT_SIGNAL(timeout()), TQT_SLOT(slotTimeout())); m_pTimer->start( 60000 ); + /*CrossFade's config*/ + m_crossTimer = new TQTimer(this); + connect(m_crossTimer, TQT_SIGNAL(timeout()), TQT_SLOT(slotCrossFadeTimeout())); + /*Ends here*/ + + connect(m_pKwinmodule, TQT_SIGNAL(currentDesktopChanged(int)), TQT_SLOT(slotChangeDesktop(int))); connect(m_pKwinmodule, TQT_SIGNAL(numberOfDesktopsChanged(int)), @@ -577,6 +590,36 @@ void KBackgroundManager::renderBackground(int desk) /* + * This slot is called when the Timeout is executed + */ +void KBackgroundManager::slotCrossFadeTimeout() +{ + KVirtualBGRenderer *r = m_Renderer[fadeDesk]; + if (crossInit) { + mBenchmark.start(); + } + + if (mAlpha <= 0.0 || mBenchmark.elapsed() > 300 ) { + bool do_cleanup = true; + mAlpha = 1; + m_crossTimer->stop(); + KPixmap pixm(mNextScreen); + setPixmap(&pixm, r->hash(), fadeDesk); + return; + } + // Reset Timer + mBenchmark.start(); + + TQPixmap dst = crossFade(*mOldScreen, mNextScreen, mAlpha, crossInit); + KPixmap pixm(dst); + setPixmap(&pixm, r->hash(), fadeDesk); + + mAlpha -=0.03; + crossInit = false; +} + + +/* * This slot is called when a renderer is done. */ void KBackgroundManager::slotImageDone(int desk) @@ -592,18 +635,49 @@ void KBackgroundManager::slotImageDone(int desk) KPixmap *pm = new KPixmap(); KVirtualBGRenderer *r = m_Renderer[desk]; bool do_cleanup = true; + fadeDesk = desk; + mAlpha = 1.0; + int width,height; + *pm = r->pixmap(); // If current: paint it bool current = (r->hash() == m_Renderer[effectiveDesktop()]->hash()); if (current) { - //KPixmap * viewport_background = new KPixmap(TQPixmap(pm->width()*s.width(), pm->height()*s.height())); - //printf("slotImageDone(): x: %d y: %d\n", viewport_background->size().width(), viewport_background->size().height()); - //setPixmap(viewport_background, r->hash(), desk); - //delete viewport_background; - - setPixmap(pm, r->hash(), desk); + //START + if (m_Renderer[effectiveDesktop()]->renderer(0)->crossFadeBg() && !m_Renderer[effectiveDesktop()]->renderer(0)->usingCrossXml()){ + int mode = m_Renderer[effectiveDesktop()]->renderer(0)->wallpaperMode(); + width = TQApplication::desktop()->screenGeometry().width(); + height = TQApplication::desktop()->screenGeometry().height(); + + if (mode == KBackgroundSettings::NoWallpaper || mode == KBackgroundSettings::Tiled || mode == KBackgroundSettings::CenterTiled ){ + mNextScreen = TQPixmap(width,height); + TQPainter p (&mNextScreen); + p.drawTiledPixmap(0,0,width,height,*pm); + } else { + mNextScreen = TQPixmap(*pm); + } + + if (m_pDesktop){ + mOldScreen = const_cast<TQPixmap *>( m_pDesktop->backgroundPixmap() ); + }else{ + mOldScreen = const_cast<TQPixmap *>( + TQApplication::desktop()->screen()->backgroundPixmap() ); + } + + //TODO Find a way to discover if CrossFade effect needs to run + if (mOldScreen){ + crossInit = true; + m_crossTimer->start(70); + } else{ + setPixmap(pm, r->hash(), desk); + } + }else{ + setPixmap(pm, r->hash(), desk); + } + //ENDS HERE */ + if (!m_bBgInitDone) { m_bBgInitDone = true; @@ -801,7 +875,7 @@ int KBackgroundManager::validateDesk(int desk) TQString KBackgroundManager::currentWallpaper(int desk) { //TODO Is the behaviour of this function appropriate for multiple screens? - KBackgroundRenderer *r = m_Renderer[validateDesk(desk)]->renderer(0); + KCrossBGRender *r = m_Renderer[validateDesk(desk)]->renderer(0); return r->currentWallpaper(); } @@ -818,7 +892,7 @@ void KBackgroundManager::changeWallpaper() // DCOP exported void KBackgroundManager::setExport(int _export) { - kdDebug() << "KBackgroundManager enabling exports.\n"; +// kdDebug() << "KBackgroundManager enabling exports.\n"; applyExport(_export); slotChangeDesktop(0); } @@ -843,7 +917,7 @@ void KBackgroundManager::setWallpaper(TQString wallpaper, int mode) //TODO Is the behaviour of this function appropriate for multiple screens? for (unsigned i=0; i < m_Renderer[effectiveDesktop()]->numRenderers(); ++i) { - KBackgroundRenderer *r = m_Renderer[effectiveDesktop()]->renderer(i); + KCrossBGRender *r = m_Renderer[effectiveDesktop()]->renderer(i); r->stop(); r->setWallpaperMode(mode); r->setMultiWallpaperMode(KBackgroundSettings::NoMulti); @@ -856,7 +930,7 @@ void KBackgroundManager::setWallpaper(TQString wallpaper, int mode) void KBackgroundManager::setWallpaper(TQString wallpaper) { //TODO Is the behaviour of this function appropriate for multiple screens? - KBackgroundRenderer *r = m_Renderer[effectiveDesktop()]->renderer(0); + KCrossBGRender *r = m_Renderer[effectiveDesktop()]->renderer(0); int mode = r->wallpaperMode(); if (mode == KBackgroundSettings::NoWallpaper) mode = KBackgroundSettings::Tiled; @@ -869,7 +943,7 @@ void KBackgroundManager::setWallpaper(TQString wallpaper) TQStringList KBackgroundManager::wallpaperFiles(int desk) { //TODO Is the behaviour of this function appropriate for multiple screens? - KBackgroundRenderer *r = m_Renderer[validateDesk(desk)]->renderer(0); + KCrossBGRender *r = m_Renderer[validateDesk(desk)]->renderer(0); return r->wallpaperFiles(); } @@ -880,7 +954,7 @@ TQStringList KBackgroundManager::wallpaperFiles(int desk) TQStringList KBackgroundManager::wallpaperList(int desk) { //TODO Is the behaviour of this function appropriate for multiple screens? - KBackgroundRenderer *r = m_Renderer[validateDesk(desk)]->renderer(0);; + KCrossBGRender *r = m_Renderer[validateDesk(desk)]->renderer(0);; return r->wallpaperList(); } @@ -907,7 +981,7 @@ void KBackgroundManager::setWallpaper(int desk, TQString wallpaper, int mode) //TODO Is the behaviour of this function appropriate for multiple screens? for (unsigned i=0; i < m_Renderer[sdesk]->numRenderers(); ++i) { - KBackgroundRenderer *r = m_Renderer[sdesk]->renderer(i); + KCrossBGRender *r = m_Renderer[sdesk]->renderer(i); setCommon(false); // Force each desktop to have it's own wallpaper @@ -974,7 +1048,7 @@ void KBackgroundManager::setColor(const TQColor & c, bool isColorA) //TODO Is the behaviour of this function appropriate for multiple screens? for (unsigned i=0; i < m_Renderer[effectiveDesktop()]->numRenderers(); ++i) { - KBackgroundRenderer *r = m_Renderer[effectiveDesktop()]->renderer(i); + KCrossBGRender *r = m_Renderer[effectiveDesktop()]->renderer(i); r->stop(); if (isColorA) diff --git a/kdesktop/bgmanager.h b/kdesktop/bgmanager.h index 2d29278f7..71ca6c1bb 100644 --- a/kdesktop/bgmanager.h +++ b/kdesktop/bgmanager.h @@ -7,12 +7,13 @@ * License. See the file "COPYING" for the exact licensing terms. */ -#ifndef __BGManager_h_Included__ -#define __BGManager_h_Included__ +#ifndef __BGMANAGER_H__ +#define __BGMANAGER_H__ #include <tqstring.h> #include <tqptrvector.h> +#include <tqdatetime.h> #include <KBackgroundIface.h> #if defined(Q_WS_X11) && defined(HAVE_XRENDER) && TQT_VERSION >= 0x030300 @@ -89,6 +90,7 @@ private slots: void desktopResized(); void clearRoot(); void saveImages(); + void slotCrossFadeTimeout(); void slotCmBackgroundChanged(bool); private: @@ -131,6 +133,15 @@ private: KPixmapServer *m_pPixmapServer; unsigned long m_xrootpmap; + + /*CrossFade vars*/ + TQTimer * m_crossTimer; + double mAlpha; + TQPixmap mNextScreen; + TQPixmap * mOldScreen; + int fadeDesk; + TQTime mBenchmark; + bool crossInit; }; -#endif // __BGManager_h_Included__ +#endif // __BGMANAGER_H__ diff --git a/kdesktop/kdesktop.kcfg b/kdesktop/kdesktop.kcfg index 2298e16c5..f2226f79d 100644 --- a/kdesktop/kdesktop.kcfg +++ b/kdesktop/kdesktop.kcfg @@ -271,92 +271,71 @@ <default>false</default> <label></label> <whatsthis></whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:308 --> - <!-- if(config.readBoolEntry("Lock", false)) --> </entry> <entry key="LockGrace" type="Int"> <default>5000</default> <label></label> <whatsthis></whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:310 --> - <!-- mLockGrace = config.readNumEntry("LockGrace", LOCK_GRACE_DEFAULT); --> </entry> <entry key="AutoLogout" type="Bool"> <default>false</default> <label></label> <whatsthis></whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:319 --> - <!-- if (config.readBoolEntry("AutoLogout", false)) --> </entry> <entry key="AutoLogoutTimeout" type="Int"> <default>600</default> <label></label> <whatsthis></whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:322 --> - <!-- mAutoLogoutTimeout = config.readNumEntry("AutoLogoutTimeout", AUTOLOGOUT_DEFAULT); --> </entry> <entry key="Priority" type="Int"> <default>19</default> <label></label> <whatsthis></whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:332 --> - <!-- mPriority = config.readNumEntry("Priority", 19); --> </entry> <entry key="Saver" type="String"> <default></default> <label></label> <whatsthis></whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:336 --> - <!-- mSaver = config.readEntry("Saver"); --> </entry> <entry key="UseUnmanagedLockWindows" type="Bool"> <default>false</default> <label></label> <whatsthis>When enabled this restores the old style unmanaged window behavior of desktop locking.</whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:336 --> - <!-- mSaver = config.readEntry("UseUnmanagedLockWindows"); --> </entry> <entry key="ShowLockDateTime" type="Bool"> <default>true</default> <label></label> <whatsthis>When enabled the date and time when the desktop was locked is displayed as an additional intrusion detection measure.</whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:336 --> - <!-- mSaver = config.readEntry("ShowLockDateTime"); --> </entry> <entry key="DelaySaverStart" type="Bool"> <default>true</default> <label></label> <whatsthis>When disabled the screensaver starts immediately when locking the desktop.</whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:336 --> - <!-- mSaver = config.readEntry("DelaySaverStart"); --> </entry> <entry key="HideActiveWindowsFromSaver" type="Bool"> <default>true</default> <label></label> <whatsthis>When enabled all active windows are hidden from the screensaver, showing only the desktop background as a result.</whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:336 --> - <!-- mSaver = config.readEntry("HideActiveWindowsFromSaver"); --> + </entry> + <entry key="HideCancelButton" type="Bool"> + <default>false</default> + <label></label> + <whatsthis>Hide Cancel button from the "Desktop Session Locked" dialog.</whatsthis> </entry> <entry key="UseTDESAK" type="Bool"> <default>true</default> <label></label> <whatsthis>When enabled, the Trinity Secure Attention Key (TSAK) system will be used to secure the screen locker. This requires system wide TSAK support to be enabled prior to use.</whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:336 --> - <!-- mSaver = config.readEntry("UseTDESAK"); --> </entry> <entry key="PluginsUnlock" type="StringList"> <default></default> <label></label> <whatsthis></whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:342 --> - <!-- mPlugins = config.readListEntry("PluginsUnlock"); --> </entry> <entry key="PluginOptions" type="StringList"> <default></default> <label></label> <whatsthis></whatsthis> - <!-- /home/paco/cvsroot/tdebase/kdesktop/lock/lockprocess.cc:345 --> - <!-- mPluginOptions = config.readListEntry("PluginOptions"); --> </entry> </group> <group name="MiniCli"> diff --git a/kdesktop/lock/lockdlg.cc b/kdesktop/lock/lockdlg.cc index 163a03e43..bfa727678 100644 --- a/kdesktop/lock/lockdlg.cc +++ b/kdesktop/lock/lockdlg.cc @@ -66,6 +66,7 @@ extern bool trinity_desktop_lock_autohide_lockdlg; extern bool trinity_desktop_lock_delay_screensaver_start; extern bool trinity_desktop_lock_use_system_modal_dialogs; extern bool trinity_desktop_lock_use_sak; +extern bool trinity_desktop_lock_hide_cancel_button; int dialogHideTimeout = 10*1000; @@ -149,13 +150,19 @@ void PasswordDlg::init(GreeterPluginHandle *plugin) mNewSessButton = new KPushButton( KGuiItem(i18n("Sw&itch User..."), "fork"), frame ); ok = new KPushButton( i18n("Unl&ock"), frame ); - cancel = new KPushButton( KStdGuiItem::cancel(), frame ); - if (!trinity_desktop_lock_autohide_lockdlg && !trinity_desktop_lock_use_sak) cancel->setEnabled(false); + ok->setDefault(true); + + bool show_cancel_button = !trinity_desktop_lock_hide_cancel_button || + trinity_desktop_lock_use_sak || + !trinity_desktop_lock_use_system_modal_dialogs; + if (show_cancel_button) + cancel = new KPushButton( KStdGuiItem::cancel(), frame ); + else + cancel = NULL; greet = plugin->info->create( this, 0, this, mLayoutButton, TQString::null, KGreeterPlugin::Authenticate, KGreeterPlugin::ExUnlock ); - TQVBoxLayout *unlockDialogLayout = new TQVBoxLayout( this ); unlockDialogLayout->addWidget( frame ); @@ -166,8 +173,9 @@ void PasswordDlg::init(GreeterPluginHandle *plugin) TQHBoxLayout *layButtons = new TQHBoxLayout( 0, 0, KDialog::spacingHint()); layButtons->addWidget( mNewSessButton ); layButtons->addStretch(); - layButtons->addWidget( ok ); - layButtons->addWidget( cancel ); + layButtons->addWidget(ok); + if (show_cancel_button) + layButtons->addWidget(cancel); if (trinity_desktop_lock_use_system_modal_dialogs) { KSMModalDialogHeader* theader = new KSMModalDialogHeader( frame ); @@ -202,12 +210,22 @@ void PasswordDlg::init(GreeterPluginHandle *plugin) frameLayout->addMultiCellLayout( layButtons, 4, 4, 0, 1 ); } - setTabOrder( ok, cancel ); - setTabOrder( cancel, mNewSessButton ); + if (show_cancel_button) + { + setTabOrder( ok, cancel ); + setTabOrder( cancel, mNewSessButton ); + } + else + { + setTabOrder( ok, mNewSessButton ); + } setTabOrder( mNewSessButton, mLayoutButton ); connect(mLayoutButton, TQT_SIGNAL(clicked()), this, TQT_SLOT(layoutClicked())); - connect(cancel, TQT_SIGNAL(clicked()), TQT_SLOT(reject())); + if (show_cancel_button) + { + connect(cancel, TQT_SIGNAL(clicked()), TQT_SLOT(reject())); + } connect(ok, TQT_SIGNAL(clicked()), TQT_SLOT(slotOK())); connect(mNewSessButton, TQT_SIGNAL(clicked()), TQT_SLOT(slotSwitchUser())); @@ -257,9 +275,12 @@ PasswordDlg::~PasswordDlg() void PasswordDlg::reject() { - if (trinity_desktop_lock_autohide_lockdlg || trinity_desktop_lock_use_sak) - TQDialog::reject(); -} + if (!trinity_desktop_lock_hide_cancel_button || trinity_desktop_lock_use_sak || + !trinity_desktop_lock_use_system_modal_dialogs || trinity_desktop_lock_autohide_lockdlg) + { + TQDialog::reject(); + } +} void PasswordDlg::layoutClicked() { @@ -310,11 +331,14 @@ void PasswordDlg::timerEvent(TQTimerEvent *ev) { if (ev->timerId() == mTimeoutTimerId) { - if (trinity_desktop_lock_autohide_lockdlg) { - reject(); + if (trinity_desktop_lock_autohide_lockdlg) + { + // Force dialog rejection regardless of the value of trinity_desktop_lock_hide_cancel_button + TQDialog::reject(); } - else { - slotActivity(); + else + { + slotActivity(); } } else if (ev->timerId() == mFailedTimerId) @@ -325,7 +349,6 @@ void PasswordDlg::timerEvent(TQTimerEvent *ev) mUnlockingFailed = false; updateLabel(); ok->setEnabled(true); - if (trinity_desktop_lock_autohide_lockdlg || trinity_desktop_lock_use_sak) cancel->setEnabled(true); mNewSessButton->setEnabled( true ); greet->revive(); greet->start(); @@ -440,7 +463,6 @@ void PasswordDlg::reapVerify() updateLabel(); mFailedTimerId = startTimer(1500); ok->setEnabled(false); - cancel->setEnabled(false); mNewSessButton->setEnabled( false ); return; case AuthAbort: diff --git a/kdesktop/lock/lockprocess.cc b/kdesktop/lock/lockprocess.cc index f7dc1c25a..773a0710a 100644 --- a/kdesktop/lock/lockprocess.cc +++ b/kdesktop/lock/lockprocess.cc @@ -154,6 +154,7 @@ extern bool trinity_desktop_lock_use_system_modal_dialogs; extern bool trinity_desktop_lock_delay_screensaver_start; extern bool trinity_desktop_lock_use_sak; extern bool trinity_desktop_lock_hide_active_windows; +extern bool trinity_desktop_lock_hide_cancel_button; extern bool trinity_desktop_lock_forced; extern bool argb_visual; diff --git a/kdesktop/lock/main.cc b/kdesktop/lock/main.cc index c90c2ef6b..d5f037f56 100644 --- a/kdesktop/lock/main.cc +++ b/kdesktop/lock/main.cc @@ -70,7 +70,7 @@ bool trinity_desktop_lock_use_system_modal_dialogs = FALSE; bool trinity_desktop_lock_delay_screensaver_start = FALSE; bool trinity_desktop_lock_use_sak = FALSE; bool trinity_desktop_lock_hide_active_windows = FALSE; - +bool trinity_desktop_lock_hide_cancel_button = FALSE; bool trinity_desktop_lock_forced = FALSE; bool signalled_forcelock; @@ -422,8 +422,19 @@ int main( int argc, char **argv ) return 12; } + // Get root window attributes + XWindowAttributes rootAttr; + XGetWindowAttributes(tqt_xdisplay(), RootWindow(tqt_xdisplay(), tqt_xscreen()), &rootAttr); + + // Disable reception of all X11 events on the root window + XSelectInput( tqt_xdisplay(), tqt_xrootwin(), 0 ); + app.processEvents(); + // wait for SIGUSR1, SIGUSR2, SIGWINCH, SIGTTIN, or SIGTTOU sigsuspend(&new_mask); + + // Reenable reception of X11 events on the root window + XSelectInput( tqt_xdisplay(), tqt_xrootwin(), rootAttr.your_event_mask ); } } @@ -445,6 +456,7 @@ int main( int argc, char **argv ) trinity_desktop_lock_delay_screensaver_start = false; // If trinity_desktop_lock_delay_screensaver_start is true with unmanaged windows, the lock dialog may never appear } trinity_desktop_lock_hide_active_windows = KDesktopSettings::hideActiveWindowsFromSaver(); + trinity_desktop_lock_hide_cancel_button = KDesktopSettings::hideCancelButton(); delete tdmconfig; |