kdecore Library API Documentation

kclipboard.cpp

00001 /* This file is part of the KDE libraries 00002 Copyright (C) 2002 Carsten Pfeiffer <pfeiffer@kde.org> 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License version 2, as published by the Free Software Foundation. 00007 00008 This library is distributed in the hope that it will be useful, 00009 but WITHOUT ANY WARRANTY; without even the implied warranty of 00010 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00011 Library General Public License for more details. 00012 00013 You should have received a copy of the GNU Library General Public License 00014 along with this library; see the file COPYING.LIB. If not, write to 00015 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00016 Boston, MA 02111-1307, USA. 00017 */ 00018 00019 #include <kapplication.h> 00020 #include <kconfig.h> 00021 #include <kglobal.h> 00022 00023 #include "kclipboard.h" 00024 00025 /* 00026 * This class provides an automatic synchronization of the X11 Clipboard and Selection 00027 * buffers. There are two configuration options in the kdeglobals configuration file, 00028 * in the [General] section: 00029 * - SynchronizeClipboardAndSelection - whenever the Selection changes, Clipboard is 00030 * set to the same value. This can be also enabled in Klipper. 00031 * - ClipboardSetSelection - whenever the Clipboard changes, Selection is set 00032 * to the same value. This setting is only for die-hard fans of the old broken 00033 * KDE1/2 behavior, which can potentionally lead to unexpected problems, 00034 * and this setting therefore can be enabled only in the configuration file. 00035 * 00036 * Whenever reporting any bug only remotely related to clipboard, first make 00037 * sure you can reproduce it when both these two options are turned off, 00038 * especially the second one. 00039 */ 00040 00041 class KClipboardSynchronizer::MimeSource : public QMimeSource 00042 { 00043 public: 00044 MimeSource( const QMimeSource * src ) 00045 : QMimeSource(), 00046 m_formats( true ) // deep copies! 00047 { 00048 m_formats.setAutoDelete( true ); 00049 m_data.setAutoDelete( true ); 00050 00051 if ( src ) 00052 { 00053 QByteArray *byteArray; 00054 const char *format; 00055 int i = 0; 00056 while ( (format = src->format( i++ )) ) 00057 { 00058 byteArray = new QByteArray(); 00059 *byteArray = src->encodedData( format ).copy(); 00060 m_data.append( byteArray ); 00061 m_formats.append( format ); 00062 } 00063 } 00064 } 00065 00066 ~MimeSource() {} 00067 00068 virtual const char *format( int i ) const { 00069 if ( i < (int) m_formats.count() ) 00070 return m_formats.at( i ); 00071 else 00072 return 0L; 00073 } 00074 virtual bool provides( const char *mimeType ) const { 00075 return ( m_formats.find( mimeType ) > -1 ); 00076 } 00077 virtual QByteArray encodedData( const char *format ) const 00078 { 00079 int index = m_formats.find( format ); 00080 if ( index > -1 ) 00081 return *(m_data.at( index )); 00082 00083 return QByteArray(); 00084 } 00085 00086 private: 00087 mutable QStrList m_formats; 00088 mutable QPtrList<QByteArray> m_data; 00089 }; 00090 00091 00092 KClipboardSynchronizer * KClipboardSynchronizer::s_self = 0L; 00093 bool KClipboardSynchronizer::s_sync = false; 00094 bool KClipboardSynchronizer::s_reverse_sync = false; 00095 bool KClipboardSynchronizer::s_blocked = false; 00096 00097 KClipboardSynchronizer * KClipboardSynchronizer::self() 00098 { 00099 if ( !s_self ) 00100 s_self = new KClipboardSynchronizer( kapp, "KDE Clipboard" ); 00101 00102 return s_self; 00103 } 00104 00105 KClipboardSynchronizer::KClipboardSynchronizer( QObject *parent, const char *name ) 00106 : QObject( parent, name ) 00107 { 00108 s_self = this; 00109 00110 KConfigGroup config( KGlobal::config(), "General" ); 00111 s_sync = config.readBoolEntry( "SynchronizeClipboardAndSelection", s_sync); 00112 s_reverse_sync = config.readBoolEntry( "ClipboardSetSelection", 00113 s_reverse_sync ); 00114 00115 setupSignals(); 00116 } 00117 00118 KClipboardSynchronizer::~KClipboardSynchronizer() 00119 { 00120 if ( s_self == this ) 00121 s_self = 0L; 00122 } 00123 00124 void KClipboardSynchronizer::setupSignals() 00125 { 00126 QClipboard *clip = QApplication::clipboard(); 00127 disconnect( clip, NULL, this, NULL ); 00128 if( s_sync ) 00129 connect( clip, SIGNAL( selectionChanged() ), 00130 SLOT( slotSelectionChanged() )); 00131 if( s_reverse_sync ) 00132 connect( clip, SIGNAL( dataChanged() ), 00133 SLOT( slotClipboardChanged() )); 00134 } 00135 00136 void KClipboardSynchronizer::slotSelectionChanged() 00137 { 00138 QClipboard *clip = QApplication::clipboard(); 00139 00140 // qDebug("*** sel changed: %i", s_blocked); 00141 if ( s_blocked || !clip->ownsSelection() ) 00142 return; 00143 00144 setClipboard( new MimeSource( clip->data( QClipboard::Selection) ), 00145 QClipboard::Clipboard ); 00146 } 00147 00148 void KClipboardSynchronizer::slotClipboardChanged() 00149 { 00150 QClipboard *clip = QApplication::clipboard(); 00151 00152 // qDebug("*** clip changed : %i (implicit: %i, ownz: clip: %i, selection: %i)", s_blocked, s_implicitSelection, clip->ownsClipboard(), clip->ownsSelection()); 00153 if ( s_blocked || !clip->ownsClipboard() ) 00154 return; 00155 00156 setClipboard( new MimeSource( clip->data( QClipboard::Clipboard ) ), 00157 QClipboard::Selection ); 00158 } 00159 00160 void KClipboardSynchronizer::setClipboard( QMimeSource *data, QClipboard::Mode mode ) 00161 { 00162 // qDebug("---> setting clipboard: %p", data); 00163 00164 QClipboard *clip = QApplication::clipboard(); 00165 00166 s_blocked = true; 00167 00168 if ( mode == QClipboard::Clipboard ) 00169 { 00170 clip->setData( data, QClipboard::Clipboard ); 00171 } 00172 else if ( mode == QClipboard::Selection ) 00173 { 00174 clip->setData( data, QClipboard::Selection ); 00175 } 00176 00177 s_blocked = false; 00178 } 00179 00180 void KClipboardSynchronizer::setSynchronizing( bool sync ) 00181 { 00182 s_sync = sync; 00183 self()->setupSignals(); 00184 } 00185 00186 void KClipboardSynchronizer::setReverseSynchronizing( bool enable ) 00187 { 00188 s_reverse_sync = enable; 00189 self()->setupSignals(); 00190 } 00191 00192 // private, called by KApplication 00193 void KClipboardSynchronizer::newConfiguration( int config ) 00194 { 00195 s_sync = (config & Synchronize); 00196 self()->setupSignals(); 00197 } 00198 00199 #include "kclipboard.moc"
KDE Logo
This file is part of the documentation for kdecore Library Version 3.4.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Apr 12 22:47:31 2005 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003