Add tqt3integration

These files were originally taken from the GPLed OpenSUSE kdebase builds


git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdebase@1259731 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
v3.5.13-sru
tpearson 13 years ago
parent 1944004a4c
commit 337f18fe5d

@ -196,6 +196,7 @@ tde_conditional_add_subdirectory( BUILD_KSYSGUARD ksysguard )
tde_conditional_add_subdirectory( BUILD_KXKB kxkb )
add_subdirectory( tsak )
add_subdirectory( krootbacking )
add_subdirectory( tqt3integration )
##### install startkde & related stuff ##########

@ -0,0 +1,14 @@
#################################################
#
# (C) 2011 Timothy Pearson
# kb9vqf (AT) pearsoncomputing.net
#
# Improvements and feedback are welcome
#
# This file is released under GPL >= 2
#
#################################################
add_subdirectory( libqtkde )
add_subdirectory( module )
add_subdirectory( utils )

@ -0,0 +1 @@
SUBDIRS = libqtkde module utils

@ -0,0 +1,36 @@
Qt/KDE UI integration. Makes Qt-only apps use several KDE dialogs without any modifications
to these applications. Can be turned off by setting $QT_NO_KDE_INTEGRATION.
Installation:
Just plain make && make install.
Additionally 'make generate' needs to be done in utils/, and Qt needs to be patched using the sources
generated in utils/qt . Patch should be applied, the .cpp/.h files belong to src/kernel/ ,
the .h file additionally should go to include/private .
<l.lunak@suse.cz>
=====
- nastavovat WM_CLASS i vsem poddialogum tech, ktere se zobrazuji?
v kded nesmi byt nic, co znovu vstupuje do event loop
- udelat na to test
- spravit kwallet
blokovat uzivatelsky vstup, jako to dela kapp pro dcop
obcas se dela demand-attention v taskbaru
- navic je problem s focus stealing prevention, kdyz aplikace nejdriv zobrazi jen samotny dialog
- delat updateUserTimestamp?
filedialogs
- pamatovat si working directory pro kazdou dcop konexi, a pouzit, kdyz neni dano?
- vraceni selectedFilter uplne nefunguje, protoze KFileDialog nevraci cely filter (*.cpp|C++ File), alen jen *.cpp
getColor()
- KColorDialog neumi alpha channel - ale to mac taky ne
getFont()
- zmenil jsem QFont* def na const QFont& def, tj. vzdy je k dispozici, neexistence se da null hodnotou

@ -0,0 +1,5 @@
qtkdelibdir="\${kde_moduledir}/plugins/integration"
KDE_EXPAND_MAKEVAR(ac_qtkdelibdir,qtkdelibdir)
AC_SUBST(qtkdelibdir)
AC_SUBST(ac_qtkdelibdir)
dnl AC_OUTPUT(qtkdeintegration/utils/qt/in/qtkdeintegration_x11_0.cpp)

@ -0,0 +1,33 @@
#################################################
#
# (C) 2011 Timothy Pearson
# kb9vqf (AT) pearsoncomputing.net
#
# Improvements and feedback are welcome
#
# This file is released under GPL >= 2
#
#################################################
include_directories(
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}/tqt3integration/utils/
${TDE_INCLUDE_DIR}
${TQT_INCLUDE_DIRS}
)
link_directories(
${TQT_LIBRARY_DIRS}
)
##### libqtkde (shared) ####################
tde_add_library( qtkde SHARED AUTOMOC
SOURCES qtkde.cpp
VERSION 0.0.0
LINK kdeui-shared
DEPENDENCIES generate_tqt3_bindings
DESTINATION "${PLUGIN_INSTALL_DIR}/plugins/integration/"
)

@ -0,0 +1,15 @@
qtkdelib_LTLIBRARIES = libqtkde.la
libqtkde_la_SOURCES = qtkde.cpp
libqtkde_la_LIBADD = -lDCOP
libqtkde_la_LDFLAGS = $(all_libraries) -module -no-undefined -avoid-version
CLEANFILES = qtkde_functions.cpp
INCLUDES = $(all_includes)
METASOURCES = AUTO
qtkde.lo : qtkde_functions.cpp
qtkde_functions.cpp : ../utils/qtkde_functions.cpp
cp -f ../utils/qtkde_functions.cpp . || exit 1

@ -0,0 +1,147 @@
/*
* This file is part of the Trinity Desktop Environment
*
* Original file taken from the OpenSUSE kdebase builds
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "qtkde.h"
#include <assert.h>
#include <dcopclient.h>
#include <dcoptypes.h>
#include <qapplication.h>
#include <qregexp.h>
#include <qstringlist.h>
#include <qwidget.h>
#include <unistd.h>
#include <X11/Xlib.h>
extern Time qt_x_time;
static QString convertFileFilter( const QString& filter )
{
if( filter.isEmpty())
return filter;
QString f2 = filter;
f2.replace( '\n', ";;" ); // Qt says separator is ";;", but it also silently accepts newline
f2.replace( '/', "\\/" ); // escape /'s for KFileDialog
QStringList items = QStringList::split( ";;", f2 );
QRegExp reg( "\\((.*)\\)" );
for( QStringList::Iterator it = items.begin();
it != items.end();
++it )
{
if( reg.search( *it ))
*it = reg.cap( 1 ) + '|' + *it;
}
return items.join( "\n" );
}
static QString convertBackFileFilter( const QString& filter )
{
if( filter.isEmpty())
return filter;
QStringList items = QStringList::split( "\n", filter );
for( QStringList::Iterator it = items.begin();
it != items.end();
++it )
{
int pos = (*it).find( '|' );
if( pos >= 0 )
(*it) = (*it).mid( pos + 1 );
}
return items.join( ";;" );
}
static DCOPClient* dcopClient()
{
DCOPClient* dcop = DCOPClient::mainClient();
if( dcop == NULL )
{
static DCOPClient* dcop_private;
if( dcop_private == NULL )
{
dcop_private = new DCOPClient;
dcop_private->attach();
}
dcop = dcop_private;
}
static bool prepared = false;
if( !prepared )
{
assert( qApp != NULL ); // TODO
prepared = true;
dcop->bindToApp();
if( !qApp->inherits( "KApplication" )) // KApp takes care of input blocking
{
static qtkde_EventLoop* loop = new qtkde_EventLoop;
QObject::connect( dcop, SIGNAL( blockUserInput( bool )), loop, SLOT( block( bool )));
}
}
return dcop;
}
// defined in qapplication_x11.cpp
typedef int (*QX11EventFilter) (XEvent*);
extern QX11EventFilter qt_set_x11_event_filter (QX11EventFilter filter);
static QX11EventFilter old_filter;
static int input_filter( XEvent* e )
{
switch( e->type )
{
case ButtonPress:
case ButtonRelease:
case KeyPress:
case KeyRelease:
case MotionNotify:
case EnterNotify:
case LeaveNotify:
return true;
default:
break;
}
if( old_filter != NULL )
return old_filter( e );
return false;
}
void qtkde_EventLoop::block( bool b )
{
if( b )
old_filter = qt_set_x11_event_filter( input_filter );
else
qt_set_x11_event_filter( old_filter );
}
// duped in kded module
static QString getHostname()
{
char hostname[ 256 ];
if( gethostname( hostname, 255 ) == 0 )
{
hostname[ 255 ] = '\0';
return hostname;
}
return "";
}
#include "qtkde_functions.cpp"
#include "qtkde.moc"

@ -0,0 +1,34 @@
/*
* This file is part of the Trinity Desktop Environment
*
* Original file taken from the OpenSUSE kdebase builds
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef _QTKDE_H
#define _QTKDE_H
#include <qobject.h>
class qtkde_EventLoop
: public QObject
{
Q_OBJECT
public slots:
void block( bool );
};
#endif

@ -0,0 +1,42 @@
#################################################
#
# (C) 2011 Timothy Pearson
# kb9vqf (AT) pearsoncomputing.net
#
# Improvements and feedback are welcome
#
# This file is released under GPL >= 2
#
#################################################
include_directories(
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_BINARY_DIR}
${CMAKE_BINARY_DIR}/tqt3integration/utils/
${TDE_INCLUDE_DIR}
${TQT_INCLUDE_DIRS}
)
link_directories(
${TQT_LIBRARY_DIRS}
)
##### service desktop file(s) ##########################
install( FILES kdeintegration.desktop DESTINATION ${SERVICES_INSTALL_DIR}/kded )
##### kded_kdeintegration (module) #####################
set( target kded_kdeintegration )
set( ${target}_SRCS
module.cpp
)
tde_add_kpart( ${target} AUTOMOC
SOURCES ${${target}_SRCS}
LINK kdeinit_kded-shared
DEPENDENCIES generate_tqt3_bindings
DESTINATION ${PLUGIN_INSTALL_DIR}
)

@ -0,0 +1,21 @@
INCLUDES= $(all_includes)
kde_module_LTLIBRARIES = kded_kdeintegration.la
kded_kdeintegration_la_SOURCES = module.cpp
kded_kdeintegration_la_METASOURCES = AUTO
kded_kdeintegration_la_LDFLAGS = $(all_libraries) -module -avoid-version
kded_kdeintegration_la_LIBADD = $(LIB_KIO)
CLEANFILES = module_functions.cpp module_functions.h
servicesdir = $(kde_servicesdir)/kded
services_DATA = kdeintegration.desktop
module.lo : module_functions.cpp module_functions.h
module_functions.cpp : ../utils/module_functions.cpp
cp -f ../utils/module_functions.cpp . || exit 1
module_functions.h : ../utils/module_functions.h
cp -f ../utils/module_functions.h . || exit 1

@ -0,0 +1,13 @@
[Desktop Entry]
Encoding=UTF-8
Type=Service
ServiceTypes=KDEDModule
X-KDE-ModuleType=Library
X-KDE-Library=kdeintegration
X-KDE-Factory=kdeintegration
X-KDE-Kded-autoload=false
X-KDE-Kded-load-on-demand=true
Name=KDE Integration Module
Comment=Module for integrating UI of non-KDE applications

@ -0,0 +1,378 @@
/*
* This file is part of the Trinity Desktop Environment
*
* Original file taken from the OpenSUSE kdebase builds
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "module.h"
#include <assert.h>
#include <dcopclient.h>
#include <kapplication.h>
#include <kdebug.h>
#include <kfiledialog.h>
#include <kglobalsettings.h>
#include <klocale.h>
#include <krecentdocument.h>
#include <kwin.h>
#include <qtimer.h>
#include <stdlib.h>
#include <unistd.h>
#include <kmessagebox.h>
#include <X11/Xutil.h>
extern "C"
{
KDE_EXPORT KDEDModule *create_kdeintegration( const QCString& obj )
{
return new KDEIntegration::Module( obj );
}
};
namespace KDEIntegration
{
static void prepareDialog( QWidget* w, long parent, const QCString& wmclass1, const QCString& wmclass2 )
{
XClassHint hints;
hints.res_name = ( char* ) ( const char* ) wmclass1;
hints.res_class = ( char* ) ( const char* ) wmclass2;
XSetClassHint( qt_xdisplay(), w->winId(), &hints );
KWin::setMainWindow( w, parent );
KWin::setState( w->winId(), NET::Modal );
KWin::WindowInfo info = KWin::windowInfo( parent, (unsigned long)NET::WMGeometry );
if( info.valid())
w->move( info.geometry().x() + ( info.geometry().width() - w->width())/2,
info.geometry().y() + ( info.geometry().height()- w->height())/2 );
}
// duped in qtkde
static QString getHostname()
{
char hostname[ 256 ];
if( gethostname( hostname, 255 ) == 0 )
{
hostname[ 255 ] = '\0';
return hostname;
}
return "";
}
bool Module::initializeIntegration( const QString& hostname )
{
if( hostname != getHostname())
return false;
// multihead support in KDE is just a hack, it wouldn't work very well anyway
if( KGlobalSettings::isMultiHead())
return false;
return true;
}
void* Module::getOpenFileNames( const QString& filter, QString workingDirectory, long parent,
const QCString& name, const QString& caption, QString /*selectedFilter*/, bool multiple,
const QCString& wmclass1, const QCString& wmclass2 )
{
KFileDialog* dlg = new KFileDialog( workingDirectory, filter, 0, name.isEmpty() ? "filedialog" : name, false);
prepareDialog( dlg, parent, wmclass1, wmclass2 );
dlg->setOperationMode( KFileDialog::Opening );
dlg->setMode(( multiple ? KFile::Files : KFile::File ) | KFile::LocalOnly );
dlg->setPlainCaption( caption.isNull() ? i18n("Open") : caption );
// TODO dlg->ops->clearHistory();
connect( dlg, SIGNAL( dialogDone( int )), SLOT( dialogDone( int )));
dlg->show();
return dlg;
}
void* Module::getSaveFileName( const QString& initialSelection, const QString& filter,
QString workingDirectory, long parent, const QCString& name, const QString& caption, QString /*selectedFilter*/,
const QCString& wmclass1, const QCString& wmclass2 )
{
QString initial = workingDirectory;
if( !initialSelection.isEmpty())
{
if( initial.right( 1 ) != QChar( '/' ))
initial += '/';
initial += initialSelection;
}
bool specialDir = initial.at(0) == ':';
KFileDialog* dlg = new KFileDialog( specialDir ? initial : QString::null, filter, 0,
name.isEmpty() ? "filedialog" : name, false);
if ( !specialDir )
dlg->setSelection( initial ); // may also be a filename
prepareDialog( dlg, parent, wmclass1, wmclass2 );
dlg->setOperationMode( KFileDialog::Saving );
dlg->setPlainCaption( caption.isNull() ? i18n("Save As") : caption );
connect( dlg, SIGNAL( dialogDone( int )), SLOT( dialogDone( int )));
dlg->show();
return dlg;
}
void* Module::getExistingDirectory( const QString& initialDirectory, long parent,
const QCString& name, const QString& caption, const QCString& wmclass1, const QCString& wmclass2 )
{
KDirSelectDialog* dlg = new KDirSelectDialog( initialDirectory, true, 0,
name.isEmpty() ? name : "kdirselect dialog", false );
prepareDialog( dlg, parent, wmclass1, wmclass2 );
dlg->setPlainCaption( caption.isNull() ? i18n( "Select Folder" ) : caption );
connect( dlg, SIGNAL( dialogDone( int )), SLOT( dialogDone( int )));
dlg->show();
return dlg;
}
void* Module::getColor( const QColor& color, long parent, const QCString& name,
const QCString& wmclass1, const QCString& wmclass2 )
{
KColorDialog* dlg = new KColorDialog( NULL, name.isEmpty() ? name : "colordialog", true );
dlg->setModal( false ); // KColorDialog creates its buttons depending on modality :(
if( color.isValid())
dlg->setColor( color );
prepareDialog( dlg, parent, wmclass1, wmclass2 );
dlg->setPlainCaption( i18n( "Select Color" ));
connect( dlg, SIGNAL( dialogDone( int )), SLOT( dialogDone( int )));
dlg->show();
return dlg;
}
void* Module::getFont( bool /*ok*/, const QFont& def, long parent, const QCString& name,
const QCString& wmclass1, const QCString& wmclass2 )
{
KFontDialog* dlg = new KFontDialog( NULL, name.isEmpty() ? name : "Font Selector", false, false );
dlg->setFont( def, false );
prepareDialog( dlg, parent, wmclass1, wmclass2 );
dlg->setPlainCaption( i18n( "Select Font" ));
connect( dlg, SIGNAL( dialogDone( int )), SLOT( dialogDone( int )));
dlg->show();
return dlg;
}
namespace
{
struct btns
{
int buttons[ 3 ];
};
}
static QMap< KDialogBase*, btns > msgbox1_buttons;
void* Module::messageBox1( int type, long parent, const QString& caption, const QString& text,
int button0, int button1, int button2, const QCString& wmclass1, const QCString& wmclass2 )
{
static const char* const caps[ 4 ]
= { I18N_NOOP( "Information" ), I18N_NOOP( "Question" ), I18N_NOOP( "Warning" ), I18N_NOOP( "Error" )};
int buttons[ 3 ] = { button0 & QMessageBox::ButtonMask,
button1 & QMessageBox::ButtonMask, button2 & QMessageBox::ButtonMask };
KGuiItem buttonItems[ 3 ];
for( int i = 0;
i < 3;
++i )
switch( buttons[ i ] )
{
case QMessageBox::Ok:
buttonItems[ i ] = KStdGuiItem::ok();
break;
case QMessageBox::Cancel:
buttonItems[ i ] = KStdGuiItem::cancel();
break;
case QMessageBox::Yes:
buttonItems[ i ] = KStdGuiItem::yes();
break;
case QMessageBox::No:
buttonItems[ i ] = KStdGuiItem::no();
break;
case QMessageBox::Abort:
buttonItems[ i ] = KGuiItem( i18n( "&Abort" ));
break;
case QMessageBox::Retry:
buttonItems[ i ] = KGuiItem( "&Retry" );
break;
case QMessageBox::Ignore:
buttonItems[ i ] = KGuiItem( "&Ignore" );
break;
case QMessageBox::YesAll:
buttonItems[ i ] = KStdGuiItem::yes();
buttonItems[ i ].setText( i18n( "Yes to &All" ));
break;
case QMessageBox::NoAll:
buttonItems[ i ] = KStdGuiItem::no();
buttonItems[ i ].setText( i18n( "N&o to All" ));
break;
default:
break;
};
KDialogBase::ButtonCode defaultButton = KDialogBase::NoDefault;
if( button0 & QMessageBox::Default )
defaultButton = KDialogBase::Yes;
else if( button1 & QMessageBox::Default )
defaultButton = KDialogBase::No;
else if( button2 & QMessageBox::Default )
defaultButton = KDialogBase::Cancel;
else // TODO KDialogBase's handling of NoDefault has strange focus effects
defaultButton = KDialogBase::Yes;
KDialogBase::ButtonCode escapeButton = KDialogBase::Cancel;
if( button0 & QMessageBox::Escape )
escapeButton = KDialogBase::Yes;
else if( button1 & QMessageBox::Escape )
escapeButton = KDialogBase::No;
else if( button2 & QMessageBox::Escape )
escapeButton = KDialogBase::Cancel;
KDialogBase *dialog= new KDialogBase(
caption.isEmpty() ? i18n( caps[ type ] ) : caption,
KDialogBase::Yes
| ( buttons[ 1 ] == QMessageBox::NoButton ? 0 : int( KDialogBase::No ))
| ( buttons[ 2 ] == QMessageBox::NoButton ? 0 : int( KDialogBase::Cancel )),
defaultButton, escapeButton,
NULL, "messageBox2", true, true,
buttonItems[ 0 ], buttonItems[ 1 ],buttonItems[ 2 ] );
bool checkboxResult = false;
KMessageBox::createKMessageBox(dialog, static_cast< QMessageBox::Icon >( type ), text, QStringList(),
QString::null,
&checkboxResult, KMessageBox::Notify | KMessageBox::NoExec);
prepareDialog( dialog, parent, wmclass1, wmclass2 );
dialog->setPlainCaption( caption );
connect( dialog, SIGNAL( dialogDone( int )), SLOT( dialogDone( int )));
btns b;
b.buttons[ 0 ] = buttons[ 0 ];
b.buttons[ 1 ] = buttons[ 1 ];
b.buttons[ 2 ] = buttons[ 2 ];
msgbox1_buttons[ dialog ] = b;
dialog->show();
return dialog;
}
void* Module::messageBox2( int type, long parent, const QString& caption, const QString& text, const QString& button0Text,
const QString& button1Text, const QString& button2Text, int defaultButton, int escapeButton,
const QCString& wmclass1, const QCString& wmclass2 )
{
static KDialogBase::ButtonCode map[ 4 ]
= { KDialogBase::NoDefault, KDialogBase::Yes, KDialogBase::No, KDialogBase::Cancel };
static const char* const caps[ 4 ]
= { I18N_NOOP( "Information" ), I18N_NOOP( "Question" ), I18N_NOOP( "Warning" ), I18N_NOOP( "Error" )};
KDialogBase *dialog= new KDialogBase(
caption.isEmpty() ? i18n( caps[ type ] ) : caption,
KDialogBase::Yes
| ( button1Text.isEmpty() ? 0 : int( KDialogBase::No ))
| ( button2Text.isEmpty() ? 0 : int( KDialogBase::Cancel )),
map[ defaultButton + 1 ], map[ escapeButton + 1 ],
NULL, "messageBox2", true, true,
button0Text.isEmpty() ? KStdGuiItem::ok() : KGuiItem( button0Text ), button1Text,button2Text);
bool checkboxResult = false;
KMessageBox::createKMessageBox(dialog, static_cast< QMessageBox::Icon >( type ), text, QStringList(),
QString::null,
&checkboxResult, KMessageBox::Notify | KMessageBox::NoExec);
prepareDialog( dialog, parent, wmclass1, wmclass2 );
dialog->setPlainCaption( caption );
connect( dialog, SIGNAL( dialogDone( int )), SLOT( dialogDone( int )));
dialog->show();
return dialog;
}
void Module::dialogDone( int result )
{
void* handle = (void*)sender(); // TODO?
JobData job = jobs[ handle ];
switch( job.type )
{
case JobData::GetOpenFileNames:
{
KFileDialog* dlg = static_cast< KFileDialog* >( handle );
post_getOpenFileNames( dlg, result == QDialog::Accepted ? dlg->selectedFiles() : QStringList(),
dlg->baseURL().path(), dlg->currentFilter());
dlg->deleteLater();
break;
}
case JobData::GetSaveFileName:
{
KFileDialog* dlg = static_cast< KFileDialog* >( handle );
QString filename = result == QDialog::Accepted ? dlg->selectedFile() : QString();
if (!filename.isEmpty())
KRecentDocument::add(filename);
post_getSaveFileName( dlg, filename, dlg->baseURL().path(), dlg->currentFilter());
dlg->deleteLater();
break;
}
case JobData::GetExistingDirectory:
{
KDirSelectDialog* dlg = static_cast< KDirSelectDialog* >( handle );
post_getExistingDirectory( dlg, result == QDialog::Accepted ? dlg->url().path() : QString());
dlg->deleteLater();
break;
}
case JobData::GetColor:
{
KColorDialog* dlg = static_cast< KColorDialog* >( handle );
post_getColor( dlg, result == QDialog::Accepted ? dlg->color() : QColor());
dlg->deleteLater();
break;
}
case JobData::GetFont:
{
KFontDialog* dlg = static_cast< KFontDialog* >( handle );
post_getFont( dlg, result == QDialog::Accepted ? dlg->font() : QFont(), result == QDialog::Accepted );
dlg->deleteLater();
break;
}
case JobData::MessageBox1:
{
KDialogBase* dlg = static_cast< KDialogBase* >( handle );
btns b = msgbox1_buttons[ dlg ];
int res;
if( result == KDialogBase::Cancel )
res = b.buttons[ 2 ];
else if( result == KDialogBase::Yes )
res = b.buttons[ 0 ];
else
res = b.buttons[ 1 ];
msgbox1_buttons.remove( dlg );
post_messageBox1( dlg, res );
// if (checkboxResult)
// saveDontShowAgainYesNo(dontAskAgainName, res);
dlg->deleteLater();
break;
}
case JobData::MessageBox2:
{
KDialogBase* dlg = static_cast< KDialogBase* >( handle );
int res;
if( result == KDialogBase::Cancel )
res = 2;
else if( result == KDialogBase::Yes )
res = 0;
else if( result == KDialogBase::No )
res = 1;
else
res = -1;
post_messageBox2( dlg, res );
// if (checkboxResult)
// saveDontShowAgainYesNo(dontAskAgainName, res);
dlg->deleteLater();
break;
}
}
}
Module::Module( const QCString& obj )
: KDEDModule( obj )
{
}
#include "module_functions.cpp"
} // namespace
#include "module.moc"

@ -0,0 +1,154 @@
/*
* This file is part of the Trinity Desktop Environment
*
* Original file taken from the OpenSUSE kdebase builds
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef _INTEGRATION_MODULE_H_
#define _INTEGRATION_MODULE_H_
#include <kcolordialog.h>
#include <kdedmodule.h>
#include <kdirselectdialog.h>
#include <kfiledialog.h>
#include <kfontdialog.h>
#include <kdialogbase.h>
class DCOPClientTransaction;
namespace KDEIntegration
{
class Module
: public KDEDModule
{
Q_OBJECT
public:
Module( const QCString& obj );
// DCOP
virtual bool process(const QCString &fun, const QByteArray &data,
QCString &replyType, QByteArray &replyData);
virtual QCStringList functions();
virtual QCStringList interfaces();
private slots:
void dialogDone( int result );
private:
struct JobData
{
DCOPClientTransaction* transaction;
enum
{
GetOpenFileNames,
GetSaveFileName,
GetExistingDirectory,
GetColor,
GetFont,
MessageBox1,
MessageBox2
} type;
};
QMap< void*, JobData > jobs;
#include "module_functions.h"
};
class KFileDialog
: public ::KFileDialog
{
Q_OBJECT
public:
KFileDialog(const QString& startDir, const QString& filter,
QWidget *parent, const char *name, bool modal)
: ::KFileDialog( startDir, filter, parent, name, modal )
{}
signals:
void dialogDone( int result );
protected:
virtual void done( int r ) { ::KFileDialog::done( r ); emit dialogDone( r ); }
};
class KDirSelectDialog
: public ::KDirSelectDialog
{
Q_OBJECT
public:
KDirSelectDialog(const QString& startDir, bool localOnly,
QWidget *parent, const char *name, bool modal)
: ::KDirSelectDialog( startDir, localOnly, parent, name, modal )
{}
signals:
void dialogDone( int result );
protected:
virtual void done( int r ) { ::KDirSelectDialog::done( r ); emit dialogDone( r ); }
};
class KColorDialog
: public ::KColorDialog
{
Q_OBJECT
public:
KColorDialog( QWidget *parent, const char *name, bool modal )
: ::KColorDialog( parent, name, modal )
{}
signals:
void dialogDone( int result );
protected:
virtual void done( int r ) { ::KColorDialog::done( r ); emit dialogDone( r ); } // hmm?
};
class KFontDialog
: public ::KFontDialog
{
Q_OBJECT
public:
KFontDialog( QWidget *parent, const char *name, bool onlyFixed, bool modal,
const QStringList &fontlist = QStringList(), bool makeFrame = true,
bool diff = false, QButton::ToggleState *sizeIsRelativeState = 0L )
: ::KFontDialog( parent, name, onlyFixed, modal, fontlist, makeFrame, diff, sizeIsRelativeState )
{}
signals:
void dialogDone( int result );
protected:
virtual void done( int r ) { ::KFontDialog::done( r ); emit dialogDone( r ); }
};
class KDialogBase
: public ::KDialogBase
{
Q_OBJECT
public:
KDialogBase( const QString &caption, int buttonMask=Yes|No|Cancel,
ButtonCode defaultButton=Yes, ButtonCode escapeButton=Cancel,
QWidget *parent=0, const char *name=0,
bool modal=true, bool separator=false,
const KGuiItem &yes = KStdGuiItem::yes(), // i18n("&Yes")
const KGuiItem &no = KStdGuiItem::no(), // i18n("&No"),
const KGuiItem &cancel = KStdGuiItem::cancel()) // i18n("&Cancel")
: ::KDialogBase( caption, buttonMask, defaultButton, escapeButton, parent, name, modal, separator,
yes, no, cancel )
{}
signals:
void dialogDone( int result );
protected:
virtual void done( int r ) { ::KDialogBase::done( r ); emit dialogDone( r ); }
};
} // namespace
#endif

@ -0,0 +1,44 @@
#################################################
#
# (C) 2011 Timothy Pearson
# kb9vqf (AT) pearsoncomputing.net
#
# Improvements and feedback are welcome
#
# This file is released under GPL >= 2
#
#################################################
add_subdirectory( qt )
include_directories(
${CMAKE_CURRENT_BINARY_DIR}
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_BINARY_DIR}
${TDE_INCLUDE_DIR}
${TQT_INCLUDE_DIRS}
)
link_directories(
${TQT_LIBRARY_DIRS}
)
##### gen (internal executable) ########################
tde_add_executable( gen AUTOMOC
SOURCES
gen.cpp
LINK kdecore-shared
)
ADD_CUSTOM_COMMAND(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/qtkde_functions.cpp ${CMAKE_CURRENT_BINARY_DIR}/module_functions.cpp ${CMAKE_CURRENT_BINARY_DIR}/module_functions.h
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/qt
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/gen ${CMAKE_CURRENT_SOURCE_DIR}/gen.txt
COMMAND cat ${CMAKE_CURRENT_BINARY_DIR}/qt/in/qtkdeintegration_x11_0.cpp ${CMAKE_CURRENT_SOURCE_DIR}/qt/in/qtkdeintegration_x11_1.cpp ${CMAKE_CURRENT_BINARY_DIR}/qtkdeintegration_x11.cpp.gen ${CMAKE_CURRENT_SOURCE_DIR}/qt/in/qtkdeintegration_x11_2.cpp > ${CMAKE_CURRENT_BINARY_DIR}/qt/qtkdeintegration_x11.cpp
COMMAND cat ${CMAKE_CURRENT_SOURCE_DIR}/qt/in/qtkdeintegration_x11_p_1.h ${CMAKE_CURRENT_BINARY_DIR}/qtkdeintegration_x11_p.h.gen ${CMAKE_CURRENT_SOURCE_DIR}/qt/in/qtkdeintegration_x11_p_2.h > ${CMAKE_CURRENT_BINARY_DIR}/qt/qtkdeintegration_x11_p.h
COMMAND rm -f ${CMAKE_CURRENT_BINARY_DIR}/qtkdeintegration_x11.cpp.gen ${CMAKE_CURRENT_BINARY_DIR}/qtkdeintegration_x11_p.h.gen
# COMMAND cp -f ${CMAKE_CURRENT_SOURCE_DIR}/qt/in/qt.patch ${CMAKE_CURRENT_BINARY_DIR}/qt/
DEPENDS gen
)
ADD_CUSTOM_TARGET(generate_tqt3_bindings DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/qtkde_functions.cpp)

@ -0,0 +1,19 @@
noinst_PROGRAMS = gen
gen_SOURCES = gen.cpp
gen_LDADD = $(LIB_KDECORE)
gen_LDFLAGS = $(all_libraries)
INCLUDES = $(all_includes)
CLEANFILES = qtkde_functions.cpp module_functions.cpp module_functions.h generated
SUBDIRS = qt
generate: generated
generated: gen gen.txt
./gen || exit 1
cat qt/in/qtkdeintegration_x11_0.cpp qt/in/qtkdeintegration_x11_1.cpp qtkdeintegration_x11.cpp.gen qt/in/qtkdeintegration_x11_2.cpp >qt/qtkdeintegration_x11.cpp
cat qt/in/qtkdeintegration_x11_p_1.h qtkdeintegration_x11_p.h.gen qt/in/qtkdeintegration_x11_p_2.h >qt/qtkdeintegration_x11_p.h
rm -f qtkdeintegration_x11.cpp.gen qtkdeintegration_x11_p.h.gen
cp -f qt/in/qt.patch qt/
touch generated
qtkde_functions.cpp module_functions.cpp module_functions.h : generated

@ -0,0 +1,970 @@
/*
* This file is part of the Trinity Desktop Environment
*
* Original file taken from the OpenSUSE kdebase builds
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <qfile.h>
#include <qstring.h>
#include <qvaluelist.h>
#include <stdlib.h>
// TODO includes, forwards
/*
FUNCTION <name>
RETURN_TYPE <type>
DELAYED_RETURN - use DCOP transaction in kded module, function will take some time to finish
SKIP_QT - don't generate in qt file
ONLY_QT - generate only in qt file
ADD_APPINFO - generate wmclass arguments
ARG <name>
TYPE <type>
ORIG_TYPE <type> - for example when the function accepts QWidget*, but WId is really used
ORIG_CONVERSION <conversion>
IGNORE
NEEDS_DEREF
CONST_REF
OUT_ARGUMENT
CONVERSION <function>
BACK_CONVERSION <function> - for out arguments
CREATE <function> - doesn't exist in Qt, create in qtkde using function
PARENT - the argument is a parent window to be used for windows
ENDARG
ENDFUNCTION
*/
struct Arg
{
Arg() : ignore( false ), needs_deref( false ), const_ref( false ), out_argument( false ), parent( false ) {}
QString name;
QString type;
QString orig_type;
QString orig_conversion;
bool ignore;
bool needs_deref;
bool const_ref;
bool out_argument;
QString conversion;
QString back_conversion;
QString create;
bool parent;
};
struct Function
{
Function() : delayed_return( false ), skip_qt( false ), only_qt( false ), add_appinfo( false ) {}
QString name;
QString return_type;
bool delayed_return;
bool skip_qt;
bool only_qt;
bool add_appinfo;
QValueList< Arg > args;
void stripNonOutArguments();
void stripCreatedArguments();
};
void Function::stripNonOutArguments()
{
QValueList< Arg > new_args;
for( QValueList< Arg >::ConstIterator it = args.begin();
it != args.end();
++it )
{
const Arg& arg = (*it);
if( arg.out_argument )
new_args.append( arg );
}
args = new_args;
}
void Function::stripCreatedArguments()
{
QValueList< Arg > new_args;
for( QValueList< Arg >::ConstIterator it = args.begin();
it != args.end();
++it )
{
const Arg& arg = (*it);
if( arg.create.isEmpty())
new_args.append( arg );
}
args = new_args;
}
QValueList< Function > functions;
QFile* input_file = NULL;
QTextStream* input_stream = NULL;
static QString last_line;
int last_lineno = 0;
#define check( arg ) my_check( __FILE__, __LINE__, arg )
#define error() my_error( __FILE__, __LINE__ )
void my_error( const char* file, int line )
{
fprintf( stderr, "Error: %s: %d\n", file, line );
fprintf( stderr, "Line %d: %s\n", last_lineno, last_line.utf8().data());
abort();
}
void my_check( const char* file, int line, bool arg )
{
if( !arg )
my_error( file, line );
}
void openInputFile( const QString& filename )
{
check( input_file == NULL );
input_file = new QFile( filename );
printf("[INFO] Reading bindings definitions from file %s\n\r", filename.ascii());
if( !input_file->open( IO_ReadOnly ))
error();
input_stream = new QTextStream( input_file );
last_lineno = 0;
}
QString getInputLine()
{
while( !input_stream->atEnd())
{
QString line = input_stream->readLine().stripWhiteSpace();
++last_lineno;
last_line = line;
if( line.isEmpty() || line[ 0 ] == '#' )
continue;
return line;
}
return QString::null;
}
void closeInputFile()
{
delete input_stream;
delete input_file;
input_stream = NULL;
input_file = NULL;
}
void parseArg( Function& function, const QString& details )
{
Arg arg;
arg.name = details;
QString line = getInputLine();
while( !line.isNull() )
{
if( line.startsWith( "ENDARG" ))
{
check( !arg.type.isEmpty());
function.args.append( arg );
return;
}
else if( line.startsWith( "TYPE" ))
{
check( arg.type.isEmpty());
arg.type = line.mid( strlen( "TYPE" )).stripWhiteSpace();
}
else if( line.startsWith( "ORIG_TYPE" ))
{
check( arg.orig_type.isEmpty());
arg.orig_type = line.mid( strlen( "ORIG_TYPE" )).stripWhiteSpace();
}
else if( line.startsWith( "ORIG_CONVERSION" ))
{
check( arg.orig_conversion.isEmpty());
arg.orig_conversion = line.mid( strlen( "ORIG_CONVERSION" )).stripWhiteSpace();
}
else if( line.startsWith( "IGNORE" ))
{
check( !arg.out_argument );
arg.ignore = true;
}
else if( line.startsWith( "NEEDS_DEREF" ))
{
check( !arg.const_ref );
arg.needs_deref = true;
}
else if( line.startsWith( "CONST_REF" ))
{
check( !arg.needs_deref );
check( !arg.out_argument );
arg.const_ref = true;
}
else if( line.startsWith( "OUT_ARGUMENT" ))
{
check( !arg.ignore );
check( !arg.const_ref );
arg.out_argument = true;
}
else if( line.startsWith( "CONVERSION" ))
{
check( arg.conversion.isEmpty());
arg.conversion = line.mid( strlen( "CONVERSION" )).stripWhiteSpace();
}
else if( line.startsWith( "BACK_CONVERSION" ))
{
check( arg.back_conversion.isEmpty());
arg.back_conversion = line.mid( strlen( "BACK_CONVERSION" )).stripWhiteSpace();
}
else if( line.startsWith( "CREATE" ))
{
check( arg.create.isEmpty());
arg.create = line.mid( strlen( "CREATE" )).stripWhiteSpace();
}
else if( line.startsWith( "PARENT" ))
{
arg.parent = true;
}
else
error();
line = getInputLine();
}
error();
}
void parseFunction( const QString& details )
{
Function function;
function.name = details;
QString line = getInputLine();
while( !line.isNull() )
{
if( line.startsWith( "ENDFUNCTION" ))
{
if( function.add_appinfo )
{
Arg arg;
arg.name = "wmclass1";
arg.type = "QCString";
arg.const_ref = true;
arg.create = "qAppName";
function.args.append( arg );
arg.name = "wmclass2";
arg.create = "qAppClass";
function.args.append( arg );
}
check( !function.return_type.isEmpty());
functions.append( function );
return;
}
else if( line.startsWith( "RETURN_TYPE" ))
{
check( function.return_type.isEmpty());
function.return_type = line.mid( strlen( "RETURN_TYPE" )).stripWhiteSpace();
}
else if( line.startsWith( "DELAYED_RETURN" ))
function.delayed_return = true;
else if( line.startsWith( "SKIP_QT" ))
function.skip_qt = true;
else if( line.startsWith( "ONLY_QT" ))
function.only_qt = true;
else if( line.startsWith( "ADD_APPINFO" ))
function.add_appinfo = true;
else if( line.startsWith( "ARG" ))
{
parseArg( function, line.mid( strlen( "ARG" )).stripWhiteSpace());
}
else
error();
line = getInputLine();
}
error();
}
void parse(TQString filename)
{
openInputFile( filename );
QString line = getInputLine();
while( !line.isNull() )
{
if( line.startsWith( "FUNCTION" ))
{
parseFunction( line.mid( strlen( "FUNCTION" )).stripWhiteSpace());
}
else
error();
line = getInputLine();
}
closeInputFile();
}
QString makeIndent( int indent )
{
return indent > 0 ? QString().fill( ' ', indent ) : "";
}
void generateFunction( QTextStream& stream, const Function& function, const QString name,
int indent, bool staticf, bool orig_type, bool ignore_deref, int ignore_level )
{
QString line;
line += makeIndent( indent );
if( staticf )
line += "static ";
line += function.return_type + " " + name + "(";
bool need_comma = false;
for( QValueList< Arg >::ConstIterator it = function.args.begin();
it != function.args.end();
++it )
{
const Arg& arg = (*it);
if( ignore_level >= 2 && arg.ignore )
continue;
if( need_comma )
{
line += ",";
if( line.length() > 80 )
{
stream << line << "\n";
line = makeIndent( indent + 4 );
}
else
line += " ";
}
else
line += " ";
need_comma = true;
if( orig_type && !arg.orig_type.isEmpty())
line += arg.orig_type;
else
{
if( arg.const_ref )
line += "const ";
line += arg.type;
if( !ignore_deref && arg.needs_deref )
line += "*";
if( arg.const_ref )
line += "&";
}
if( ignore_level >= 1 && arg.ignore )
line += " /*" + arg.name + "*/";
else
line += " " + arg.name;
}
line += " )";
stream << line;
}
void generateQtH()
{
QFile file( "qtkdeintegration_x11_p.h.gen" );
if( !file.open( IO_WriteOnly ))
error();
QTextStream stream( &file );
for( QValueList< Function >::ConstIterator it = functions.begin();
it != functions.end();
++it )
{
Function f = *it;
if( f.skip_qt )
continue;
f.stripCreatedArguments();
generateFunction( stream, f, f.name, 8,
true /*static*/, true /*orig type*/, false /*ignore deref*/, 0 /*ignore level*/ );
stream << ";\n";
}
}
void generateQtCpp()
{
QFile file( "qtkdeintegration_x11.cpp.gen" );
if( !file.open( IO_WriteOnly ))
error();
QTextStream stream( &file );
for( QValueList< Function >::ConstIterator it = functions.begin();
it != functions.end();
++it )
{
Function f = *it;
if( f.only_qt )
continue;
f.stripCreatedArguments();
generateFunction( stream, f, "(*qtkde_" + f.name + ")", 0,
true /*static*/, false /*orig type*/, false /*ignore deref*/, 0 /*ignore level*/ );
stream << ";\n";
}
stream <<
"\n"
"void QKDEIntegration::initLibrary()\n"
" {\n"
" if( !inited )\n"
" {\n"
" enable = false;\n"
" inited = true;\n"
" QString libpath = findLibrary();\n"
" if( libpath.isEmpty())\n"
" return;\n"
" QLibrary lib( libpath );\n"
" if( !QFile::exists( lib.library())) // avoid stupid Qt warning\n"
" return;\n"
" lib.setAutoUnload( false );\n";
for( QValueList< Function >::ConstIterator it = functions.begin();
it != functions.end();
++it )
{
Function function = *it;
if( function.only_qt )
continue;
stream << makeIndent( 8 ) + "qtkde_" + function.name + " = (\n";
function.stripCreatedArguments();
generateFunction( stream, function, "(*)", 12,
false /*static*/, false /*orig type*/, false /*ignore deref*/, 0 /*ignore level*/ );
stream << "\n" + makeIndent( 12 ) + ")\n";
stream << makeIndent( 12 ) + "lib.resolve(\"" + (*it).name + "\");\n";
stream << makeIndent( 8 ) + "if( qtkde_" + (*it).name + " == NULL )\n";
stream << makeIndent( 12 ) + "return;\n";
}
stream <<
" enable = qtkde_initializeIntegration();\n"
" }\n"
" }\n"
"\n";
for( QValueList< Function >::ConstIterator it1 = functions.begin();
it1 != functions.end();
++it1 )
{
Function function = *it1;
if( function.skip_qt || function.only_qt )
continue;
function.stripCreatedArguments();
generateFunction( stream, function, "QKDEIntegration::" + function.name, 0,
false /*static*/, true /*orig type*/, false /*ignore deref*/, 0 /*ignore level*/ );
stream << "\n";
stream << makeIndent( 4 ) + "{\n";
stream << makeIndent( 4 ) + "return qtkde_" + function.name + "(\n";
stream << makeIndent( 8 );
bool need_comma = false;
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( need_comma )
stream << ", ";
need_comma = true;
if( !arg.orig_conversion.isEmpty())
{
stream << arg.orig_conversion + "( " + arg.name + " )";
}
else
stream << arg.name;
}
stream << " );\n";
stream << makeIndent( 4 ) + "}\n";
}
}
void generateQt()
{
generateQtH();
generateQtCpp();
}
void generateQtKde()
{
QFile file( "qtkde_functions.cpp" );
if( !file.open( IO_WriteOnly ))
error();
QTextStream stream( &file );
for( QValueList< Function >::ConstIterator it1 = functions.begin();
it1 != functions.end();
++it1 )
{
const Function& function = *it1;
if( function.only_qt )
continue;
Function stripped_function = function;
stripped_function.stripCreatedArguments();
stream << "extern \"C\"\n";
generateFunction( stream, stripped_function, stripped_function.name, 0,
false /*static*/, false /*orig type*/, false /*ignore deref*/, 1 /*ignore level*/ );
stream << "\n";
stream <<
" {\n"
" if( qt_xdisplay() != NULL )\n"
" XSync( qt_xdisplay(), False );\n";
QString parent_arg;
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.ignore )
continue;
if( arg.parent )
{
parent_arg = arg.name;
break;
}
}
if( !parent_arg.isEmpty())
{
stream << " if( " << parent_arg << " == 0 )\n";
stream << " DCOPRef( \"kded\", \"MainApplication-Interface\" ).call( \"updateUserTimestamp\", qt_x_time );\n";
}
stream <<
" QByteArray data, replyData;\n"
" QCString replyType;\n";
if( !function.args.isEmpty())
{
stream << " QDataStream datastream( data, IO_WriteOnly );\n";
stream << " datastream";
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.ignore )
continue;
stream << " << ";
if( !(arg.conversion).isNull() )
stream << arg.conversion + "( ";
if( !arg.create.isEmpty())
stream << arg.create + "()";
else
{
if( arg.needs_deref )
stream << "( " << arg.name << " != NULL ? *" << arg.name << " : " << arg.type << "())";
else
stream << arg.name;
}
if( !(arg.conversion).isNull() )
stream << " )";
}
stream << ";\n";
}
stream << " if( !dcopClient()->call( \"kded\", \"kdeintegration\",\"" + function.name + "(";
bool need_comma = false;
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.ignore )
continue;
if( need_comma )
stream << ",";
need_comma = true;
stream << arg.type;
}
stream << ")\", data, replyType, replyData, true ))\n";
stream << " {\n";
if( function.return_type != "void" )
{
stream << " " + function.return_type << " ret;\n";
stream << " dcopTypeInit( ret ); // set to false/0/whatever\n";
stream << " return ret;\n";
}
else
stream << " return;\n";
stream << " }\n";
bool return_data = false;
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
!return_data && it2 != function.args.end();
++it2 )
{
if( (*it2).out_argument )
return_data = true;
}
if( return_data || function.return_type != "void" )
stream << " QDataStream replystream( replyData, IO_ReadOnly );\n";
if( function.return_type != "void" )
{
stream << " " + function.return_type << " ret;\n";
stream << " replystream >> ret;\n";
}
if( return_data )
{
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.out_argument && arg.needs_deref )
stream << " " << arg.type << " " << arg.name + "_dummy;\n";
}
stream << " replystream";
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.out_argument )
{
stream << " >> ";
if( !(arg.back_conversion).isNull() )
stream << arg.name + "_dummy";
else
{
if( arg.needs_deref )
stream << "( " << arg.name << " != NULL ? *" << arg.name << " : " << arg.name << "_dummy )";
else
stream << arg.name;
}
}
}
stream << ";\n";
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.out_argument && (!(arg.back_conversion).isNull()) )
stream << " if( " << arg.name << " != NULL )\n"
<< makeIndent( 8 ) << "*" << arg.name << " = " << arg.back_conversion << "( " << arg.name + "_dummy );\n";
}
}
if( function.return_type != "void" )
stream << " return ret;\n";
stream << " }\n";
stream << "\n";
}
}
void generateKdeDcop( QTextStream& stream )
{
stream <<
"bool Module::process(const QCString &fun, const QByteArray &data,\n"
" QCString &replyType, QByteArray &replyData)\n"
" {\n";
for( QValueList< Function >::ConstIterator it1 = functions.begin();
it1 != functions.end();
++it1 )
{
const Function& function = *it1;
if( function.only_qt )
continue;
stream << " if( fun == \"" + function.name + "(";
bool need_comma = false;
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.ignore )
continue;
if( need_comma )
stream << ",";
need_comma = true;
stream << arg.type;
}
stream << ")\" )\n";
stream << " {\n";
if( function.delayed_return )
stream << " pre_" + function.name + "( data );\n";
else
{
stream << " pre_" + function.name + "( data, replyData );\n";
stream << " replyType = \"" << function.return_type << "\";\n";
}
stream << " return true;\n";
stream << " }\n";
}
stream <<
" return KDEDModule::process( fun, data, replyType, replyData );\n"
" }\n"
"\n";
stream <<
"QCStringList Module::functions()\n"
" {\n"
" QCStringList funcs = KDEDModule::functions();\n";
for( QValueList< Function >::ConstIterator it1 = functions.begin();
it1 != functions.end();
++it1 )
{
const Function& function = *it1;
if( function.only_qt )
continue;
stream << " funcs << \"" + function.name + "(";
bool need_comma = false;
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.ignore )
continue;
if( need_comma )
stream << ",";
need_comma = true;
stream << arg.type;
}
stream << ")\";\n";
}
stream <<
" return funcs;\n"
" }\n"
"\n"
"QCStringList Module::interfaces()\n"
" {\n"
" QCStringList ifaces = KDEDModule::interfaces();\n"
" ifaces << \"KDEIntegration\";\n"
" return ifaces;\n"
" }\n"
"\n";
}
void generateKdePreStub( QTextStream& stream )
{
for( QValueList< Function >::ConstIterator it1 = functions.begin();
it1 != functions.end();
++it1 )
{
const Function& function = *it1;
if( function.only_qt )
continue;
stream << "void Module::pre_" + function.name + "( const QByteArray& "
+ ( function.args.isEmpty() ? "" : "data" )
+ ( function.delayed_return ? "" : ", QByteArray& replyData" )
+ " )\n";
stream << " {\n";
if( function.delayed_return )
{
stream << " JobData job;\n";
stream << " job.transaction = kapp->dcopClient()->beginTransaction();\n";
stream << " job.type = JobData::" + QString( function.name[ 0 ].upper()) + function.name.mid( 1 ) + ";\n";
}
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.ignore )
continue;
stream << " " + arg.type + " " + arg.name + ";\n";
}
if( !function.args.isEmpty())
{
stream << " QDataStream datastream( data, IO_ReadOnly );\n";
stream << " datastream";
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.ignore )
continue;
stream << " >> " + arg.name;
}
stream << ";\n";
}
if( function.delayed_return )
stream << " void* handle = " + function.name + "( ";
else
stream << " post_" + function.name + "( " + function.name + "( ";
bool need_comma = false;
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.ignore )
continue;
if( need_comma )
stream << ", ";
need_comma = true;
stream << arg.name;
}
if( function.delayed_return )
{
stream << " );\n";
stream << " jobs[ handle ] = job;\n";
}
else
stream << " ), replyData );\n";
stream << " }\n";
stream << "\n";
}
}
void generateKdePostStub( QTextStream& stream )
{
for( QValueList< Function >::ConstIterator it1 = functions.begin();
it1 != functions.end();
++it1 )
{
const Function& function = *it1;
if( function.only_qt )
continue;
stream << "void Module::post_" + function.name + "( ";
bool needs_comma = false;
if( function.delayed_return )
{
stream << "void* handle";
needs_comma = true;
}
if( function.return_type != "void" )
{
if( needs_comma )
stream << ", ";
needs_comma = true;
stream << function.return_type + " ret";
}
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.out_argument )
{
if( needs_comma )
stream << ", ";
needs_comma = true;
stream << arg.type + " " + arg.name;
}
}
if( !function.delayed_return )
stream << ( needs_comma ? "," : "" ) << " QByteArray& replyData";
stream << " )\n";
stream << " {\n";
if( function.delayed_return )
{
stream << " assert( jobs.contains( handle ));\n";
stream << " JobData job = jobs[ handle ];\n";
stream << " jobs.remove( handle );\n";
stream << " QByteArray replyData;\n";
stream << " QCString replyType = \"qtkde\";\n";
}
bool return_data = false;
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
!return_data && it2 != function.args.end();
++it2 )
{
if( (*it2).out_argument )
return_data = true;
}
if( function.return_type != "void" || return_data )
stream << " QDataStream replystream( replyData, IO_WriteOnly );\n";
if( function.return_type != "void" )
stream << " replystream << ret;\n";
if( return_data )
{
stream << " replystream";
for( QValueList< Arg >::ConstIterator it2 = function.args.begin();
it2 != function.args.end();
++it2 )
{
const Arg& arg = (*it2);
if( arg.out_argument )
stream << " << " + arg.name;
}
stream << ";\n";
}
if( function.delayed_return )
stream << " kapp->dcopClient()->endTransaction( job.transaction, replyType, replyData );\n";
stream << " }\n";
stream << "\n";
}
}
void generateKdeStubs( QTextStream& stream )
{
generateKdePreStub( stream );
generateKdePostStub( stream );
// TODO udelat i predbezne deklarace pro skutecne funkce?
}
void generateKdeCpp()
{
QFile file( "module_functions.cpp" );
if( !file.open( IO_WriteOnly ))
error();
QTextStream stream( &file );
generateKdeDcop( stream );
generateKdeStubs( stream );
}
void generateKdeH()
{
QFile file( "module_functions.h" );
if( !file.open( IO_WriteOnly ))
error();
QTextStream stream( &file );
for( QValueList< Function >::ConstIterator it1 = functions.begin();
it1 != functions.end();
++it1 )
{
const Function& function = *it1;
if( function.only_qt )
continue;
Function real_function = function;
if( function.delayed_return )
real_function.return_type = "void*";
generateFunction( stream, real_function, real_function.name, 8,
false /*static*/, false /*orig type*/, true /*ignore deref*/, 2 /*ignore level*/ );
stream << ";\n";
stream << makeIndent( 8 ) + "void pre_" + function.name + "( const QByteArray& data"
+ ( function.delayed_return ? "" : ", QByteArray& replyData" ) + " );\n";
Function post_function = function;
post_function.stripNonOutArguments();
if( function.return_type != "void" )
{
Arg return_arg;
return_arg.name = "ret";
return_arg.type = function.return_type;
post_function.args.prepend( return_arg );
}
if( function.delayed_return )
{
Arg handle_arg;
handle_arg.name = "handle";
handle_arg.type = "void*";
post_function.args.prepend( handle_arg );
}
else
{
Arg handle_arg;
handle_arg.name = "replyData";
handle_arg.type = "QByteArray&";
post_function.args.append( handle_arg );
}
post_function.return_type = "void";
generateFunction( stream, post_function, "post_" + post_function.name, 8,
false /*static*/, false /*orig type*/, true /*ignore deref*/, 2 /*ignore level*/ );
stream << ";\n";
}
}
void generateKde()
{
generateKdeCpp();
generateKdeH();
}
void generate()
{
generateQt();
generateQtKde();
generateKde();
}
int main (int argc, char *argv[])
{
if (argc > 1) {
parse(TQString(argv[1]));
}
else {
parse(TQString("gen.txt"));
}
generate();
return 0;
}

@ -0,0 +1,546 @@
# bool initializeIntegration()
#
FUNCTION initializeIntegration
RETURN_TYPE bool
ARG hostname
TYPE QString
CONST_REF
CREATE getHostname
ENDARG
ENDFUNCTION
# QStringList getOpenFileNames( const QString &filter,
# QString* workingDirectory, QWidget *parent, const char* name,
# const QString& caption, QString* selectedFilter, bool multiple );
#
FUNCTION getOpenFileNames
RETURN_TYPE QStringList
DELAYED_RETURN
ADD_APPINFO
ARG filter
TYPE QString
CONST_REF
CONVERSION convertFileFilter
ENDARG
ARG workingDirectory
TYPE QString
NEEDS_DEREF
OUT_ARGUMENT
ENDARG
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG name
TYPE QCString
CONST_REF
ORIG_TYPE const char*
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ARG selectedFilter
TYPE QString
NEEDS_DEREF
OUT_ARGUMENT
CONVERSION convertFileFilter
BACK_CONVERSION convertBackFileFilter
ENDARG
ARG multiple
TYPE bool
ENDARG
ENDFUNCTION
# QString getSaveFileName( const QString &initialSelection,
# const QString &filter, QString* workingDirectory, QWidget *parent,
# const char* name, const QString& caption, QString* selectedFilter );
#
FUNCTION getSaveFileName
RETURN_TYPE QString
DELAYED_RETURN
ADD_APPINFO
ARG initialSelection
TYPE QString
CONST_REF
ENDARG
ARG filter
TYPE QString
CONST_REF
CONVERSION convertFileFilter
ENDARG
ARG workingDirectory
TYPE QString
NEEDS_DEREF
OUT_ARGUMENT
ENDARG
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG name
TYPE QCString
CONST_REF
ORIG_TYPE const char*
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ARG selectedFilter
TYPE QString
NEEDS_DEREF
OUT_ARGUMENT
CONVERSION convertFileFilter
BACK_CONVERSION convertBackFileFilter
ENDARG
ENDFUNCTION
# QString getExistingDirectory( const QString &initialDirectory,
# QWidget* parent, const char* name, const QString& caption );
#
FUNCTION getExistingDirectory
RETURN_TYPE QString
DELAYED_RETURN
ADD_APPINFO
ARG initialDirectory
TYPE QString
CONST_REF
ENDARG
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG name
TYPE QCString
CONST_REF
ORIG_TYPE const char*
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ENDFUNCTION
# QColor getColor( const QColor& color, QWidget* parent, const char* name );
#
FUNCTION getColor
RETURN_TYPE QColor
DELAYED_RETURN
ADD_APPINFO
ARG color
TYPE QColor
CONST_REF
ENDARG
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG name
TYPE QCString
CONST_REF
ORIG_TYPE const char*
ENDARG
ENDFUNCTION
# QFont getFont( bool* ok, const QFont* def, QWidget *parent, const char* name);
FUNCTION getFont
RETURN_TYPE QFont
DELAYED_RETURN
ADD_APPINFO
ARG ok
TYPE bool
NEEDS_DEREF
OUT_ARGUMENT
ENDARG
ARG def
TYPE QFont
ORIG_TYPE const QFont*
ORIG_CONVERSION fontPtrToFontRef
CONST_REF
ENDARG
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG name
TYPE QCString
CONST_REF
ORIG_TYPE const char*
ENDARG
ENDFUNCTION
# int messageBox1( int type, QWidget *parent, const QString& caption, const QString& text,
# int button0, int button1, int button2 );
FUNCTION messageBox1
RETURN_TYPE int
DELAYED_RETURN
ADD_APPINFO
ARG type
TYPE int
ENDARG
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ARG text
TYPE QString
CONST_REF
ENDARG
ARG button0
TYPE int
ENDARG
ARG button1
TYPE int
ENDARG
ARG button2
TYPE int
ENDARG
ENDFUNCTION
# int information( QWidget *parent, const QString& caption, const QString& text,
# int button0, int button1, int button2 );
FUNCTION information
RETURN_TYPE int
DELAYED_RETURN
ONLY_QT
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ARG text
TYPE QString
CONST_REF
ENDARG
ARG button0
TYPE int
ENDARG
ARG button1
TYPE int
ENDARG
ARG button2
TYPE int
ENDARG
ENDFUNCTION
# int question( QWidget *parent, const QString& caption, const QString& text,
# int button0, int button1, int button2 );
FUNCTION question
RETURN_TYPE int
DELAYED_RETURN
ONLY_QT
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ARG text
TYPE QString
CONST_REF
ENDARG
ARG button0
TYPE int
ENDARG
ARG button1
TYPE int
ENDARG
ARG button2
TYPE int
ENDARG
ENDFUNCTION
# int warning( QWidget *parent, const QString& caption, const QString& text,
# int button0, int button1, int button2 );
FUNCTION warning
RETURN_TYPE int
DELAYED_RETURN
ONLY_QT
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ARG text
TYPE QString
CONST_REF
ENDARG
ARG button0
TYPE int
ENDARG
ARG button1
TYPE int
ENDARG
ARG button2
TYPE int
ENDARG
ENDFUNCTION
# int critical( QWidget *parent, const QString& caption, const QString& text,
# int button0, int button1, int button2 );
FUNCTION critical
RETURN_TYPE int
DELAYED_RETURN
ONLY_QT
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ARG text
TYPE QString
CONST_REF
ENDARG
ARG button0
TYPE int
ENDARG
ARG button1
TYPE int
ENDARG
ARG button2
TYPE int
ENDARG
ENDFUNCTION
# int messageBox2( int type, QWidget* parent, const QString& caption, const QString& text,
# const QString& button0Text, const QString& button1Text, const QString& button2Text,
# int defaultButton, int escapeButton );
FUNCTION messageBox2
RETURN_TYPE int
DELAYED_RETURN
ADD_APPINFO
ARG type
TYPE int
ENDARG
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ARG text
TYPE QString
CONST_REF
ENDARG
ARG button0Text
TYPE QString
CONST_REF
ENDARG
ARG button1Text
TYPE QString
CONST_REF
ENDARG
ARG button2Text
TYPE QString
CONST_REF
ENDARG
ARG defaultButton
TYPE int
ENDARG
ARG escapeButton
TYPE int
ENDARG
ENDFUNCTION
# int information( QWidget* parent, const QString& caption, const QString& text,
# const QString& button0Text, const QString& button1Text, const QString& button2Text,
# int defaultButton, int escapeButton );
FUNCTION information
RETURN_TYPE int
DELAYED_RETURN
ONLY_QT
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ARG text
TYPE QString
CONST_REF
ENDARG
ARG button0Text
TYPE QString
CONST_REF
ENDARG
ARG button1Text
TYPE QString
CONST_REF
ENDARG
ARG button2Text
TYPE QString
CONST_REF
ENDARG
ARG defaultButton
TYPE int
ENDARG
ARG escapeButton
TYPE int
ENDARG
ENDFUNCTION
# int question( QWidget* parent, const QString& caption, const QString& text,
# const QString& button0Text, const QString& button1Text, const QString& button2Text,
# int defaultButton, int escapeButton );
FUNCTION question
RETURN_TYPE int
DELAYED_RETURN
ONLY_QT
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ARG text
TYPE QString
CONST_REF
ENDARG
ARG button0Text
TYPE QString
CONST_REF
ENDARG
ARG button1Text
TYPE QString
CONST_REF
ENDARG
ARG button2Text
TYPE QString
CONST_REF
ENDARG
ARG defaultButton
TYPE int
ENDARG
ARG escapeButton
TYPE int
ENDARG
ENDFUNCTION
# int warning( QWidget* parent, const QString& caption, const QString& text,
# const QString& button0Text, const QString& button1Text, const QString& button2Text,
# int defaultButton, int escapeButton );
FUNCTION warning
RETURN_TYPE int
DELAYED_RETURN
ONLY_QT
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ARG text
TYPE QString
CONST_REF
ENDARG
ARG button0Text
TYPE QString
CONST_REF
ENDARG
ARG button1Text
TYPE QString
CONST_REF
ENDARG
ARG button2Text
TYPE QString
CONST_REF
ENDARG
ARG defaultButton
TYPE int
ENDARG
ARG escapeButton
TYPE int
ENDARG
ENDFUNCTION
# int critical( QWidget* parent, const QString& caption, const QString& text,
# const QString& button0Text, const QString& button1Text, const QString& button2Text,
# int defaultButton, int escapeButton );
FUNCTION critical
RETURN_TYPE int
DELAYED_RETURN
ONLY_QT
ARG parent
TYPE long
ORIG_TYPE QWidget*
ORIG_CONVERSION parentToWinId
PARENT
ENDARG
ARG caption
TYPE QString
CONST_REF
ENDARG
ARG text
TYPE QString
CONST_REF
ENDARG
ARG button0Text
TYPE QString
CONST_REF
ENDARG
ARG button1Text
TYPE QString
CONST_REF
ENDARG
ARG button2Text
TYPE QString
CONST_REF
ENDARG
ARG defaultButton
TYPE int
ENDARG
ARG escapeButton
TYPE int
ENDARG
ENDFUNCTION

@ -0,0 +1,12 @@
#################################################
#
# (C) 2011 Timothy Pearson
# kb9vqf (AT) pearsoncomputing.net
#
# Improvements and feedback are welcome
#
# This file is released under GPL >= 2
#
#################################################
add_subdirectory( in )

@ -0,0 +1 @@
CLEANFILES = qt.patch qtkdeintegration_x11.cpp qtkdeintegration_x11_p.h

@ -0,0 +1,12 @@
#################################################
#
# (C) 2011 Timothy Pearson
# kb9vqf (AT) pearsoncomputing.net
#
# Improvements and feedback are welcome
#
# This file is released under GPL >= 2
#
#################################################
configure_file( qtkdeintegration_x11_0.cpp.cmake qtkdeintegration_x11_0.cpp @ONLY )

@ -0,0 +1,270 @@
--- src/dialogs/qfiledialog.cpp.sav 2004-12-08 15:39:41.000000000 +0100
+++ src/dialogs/qfiledialog.cpp 2004-12-13 16:53:40.000000000 +0100
@@ -92,6 +92,10 @@
#include "qvbox.h"
#include "qwidgetstack.h"
+#ifdef Q_WS_X11
+#include "private/qtkdeintegration_x11_p.h"
+#endif
+
#ifdef Q_WS_WIN
#ifdef QT_THREAD_SUPPORT
# include <private/qmutexpool_p.h>
@@ -3428,7 +3432,11 @@ QString QFileDialog::getOpenFileName( co
if ( workingDirectory->isNull() )
*workingDirectory = QDir::currentDirPath();
-#if defined(Q_WS_WIN)
+#if defined(Q_WS_X11)
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::getOpenFileNames( filter, workingDirectory, parent, name,
+ caption, selectedFilter, false ).first();
+#elif defined(Q_WS_WIN)
if ( qt_use_native_dialogs && qApp->style().styleHint( QStyle::SH_GUIStyle ) == WindowsStyle )
return winGetOpenFileName( initialSelection, filter, workingDirectory,
parent, name, caption, selectedFilter );
@@ -3546,7 +3554,11 @@ QString QFileDialog::getSaveFileName( co
if ( workingDirectory->isNull() )
*workingDirectory = QDir::currentDirPath();
-#if defined(Q_WS_WIN)
+#if defined(Q_WS_X11)
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::getSaveFileName( initialSelection, filter, workingDirectory,
+ parent, name, caption, selectedFilter );
+#elif defined(Q_WS_WIN)
if ( qt_use_native_dialogs && qApp->style().styleHint( QStyle::SH_GUIStyle ) == WindowsStyle )
return winGetSaveFileName( initialSelection, filter, workingDirectory,
parent, name, caption, selectedFilter );
@@ -4433,7 +4445,17 @@ QString QFileDialog::getExistingDirector
if ( workingDirectory )
wd = *workingDirectory;
-#if defined(Q_WS_WIN)
+#if defined(Q_WS_X11)
+ QString initialDir;
+ if ( !dir.isEmpty() ) {
+ QUrlOperator u( dir );
+ if ( QFileInfo( u.path() ).isDir() )
+ initialDir = dir;
+ } else
+ initialDir = QString::null;
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::getExistingDirectory( initialDir, parent, name, caption );
+#elif defined(Q_WS_WIN)
QString initialDir;
if ( !dir.isEmpty() ) {
QUrlOperator u( dir );
@@ -5586,7 +5608,10 @@ QStringList QFileDialog::getOpenFileName
}
}
-#if defined(Q_WS_WIN)
+#if defined(Q_WS_X11)
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::getOpenFileNames( filter, workingDirectory, parent, name, caption, selectedFilter, true );
+#elif defined(Q_WS_WIN)
if ( qt_use_native_dialogs && qApp->style().styleHint( QStyle::SH_GUIStyle ) == WindowsStyle )
return winGetOpenFileNames( filter, workingDirectory, parent, name, caption, selectedFilter );
#elif defined(Q_WS_MAC)
--- src/dialogs/qmessagebox.cpp.sav 2003-12-22 12:24:32.000000000 +0100
+++ src/dialogs/qmessagebox.cpp 2005-01-05 18:05:29.638723917 +0100
@@ -54,6 +54,12 @@
#endif
+#ifdef Q_WS_X11
+#include "private/qtkdeintegration_x11_p.h"
+#endif
+
+extern bool qt_use_native_dialogs;
+
// Internal class - don't touch
class QMessageBoxLabel : public QLabel
@@ -1104,6 +1110,10 @@ int QMessageBox::information( QWidget *p
const QString& caption, const QString& text,
int button0, int button1, int button2 )
{
+#if defined(Q_WS_X11)
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::information( parent, caption, text, button0, button1, button2 );
+#endif
QMessageBox *mb = new QMessageBox( caption, text, Information,
button0, button1, button2,
parent, "qt_msgbox_information", TRUE,
@@ -1151,6 +1161,10 @@ int QMessageBox::question( QWidget *pare
const QString& caption, const QString& text,
int button0, int button1, int button2 )
{
+#if defined(Q_WS_X11)
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::question( parent, caption, text, button0, button1, button2 );
+#endif
QMessageBox *mb = new QMessageBox( caption, text, Question,
button0, button1, button2,
parent, "qt_msgbox_information", TRUE,
@@ -1199,6 +1213,10 @@ int QMessageBox::warning( QWidget *paren
const QString& caption, const QString& text,
int button0, int button1, int button2 )
{
+#if defined(Q_WS_X11)
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::warning( parent, caption, text, button0, button1, button2 );
+#endif
QMessageBox *mb = new QMessageBox( caption, text, Warning,
button0, button1, button2,
parent, "qt_msgbox_warning", TRUE,
@@ -1247,6 +1265,10 @@ int QMessageBox::critical( QWidget *pare
const QString& caption, const QString& text,
int button0, int button1, int button2 )
{
+#if defined(Q_WS_X11)
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::critical( parent, caption, text, button0, button1, button2 );
+#endif
QMessageBox *mb = new QMessageBox( caption, text, Critical,
button0, button1, button2,
parent, "qt_msgbox_critical", TRUE,
@@ -1394,6 +1416,11 @@ int QMessageBox::information( QWidget *p
int defaultButtonNumber,
int escapeButtonNumber )
{
+#if defined(Q_WS_X11)
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::information( parent, caption, text,
+ button0Text, button1Text, button2Text, defaultButtonNumber, escapeButtonNumber );
+#endif
return textBox( parent, Information, caption, text,
button0Text, button1Text, button2Text,
defaultButtonNumber, escapeButtonNumber );
@@ -1436,6 +1463,11 @@ int QMessageBox::question( QWidget *pare
int defaultButtonNumber,
int escapeButtonNumber )
{
+#if defined(Q_WS_X11)
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::question( parent, caption, text,
+ button0Text, button1Text, button2Text, defaultButtonNumber, escapeButtonNumber );
+#endif
return textBox( parent, Question, caption, text,
button0Text, button1Text, button2Text,
defaultButtonNumber, escapeButtonNumber );
@@ -1480,6 +1512,11 @@ int QMessageBox::warning( QWidget *paren
int defaultButtonNumber,
int escapeButtonNumber )
{
+#if defined(Q_WS_X11)
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::warning( parent, caption, text,
+ button0Text, button1Text, button2Text, defaultButtonNumber, escapeButtonNumber );
+#endif
return textBox( parent, Warning, caption, text,
button0Text, button1Text, button2Text,
defaultButtonNumber, escapeButtonNumber );
@@ -1520,6 +1557,11 @@ int QMessageBox::critical( QWidget *pare
int defaultButtonNumber,
int escapeButtonNumber )
{
+#if defined(Q_WS_X11)
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::critical( parent, caption, text,
+ button0Text, button1Text, button2Text, defaultButtonNumber, escapeButtonNumber );
+#endif
return textBox( parent, Critical, caption, text,
button0Text, button1Text, button2Text,
defaultButtonNumber, escapeButtonNumber );
--- src/dialogs/qfontdialog.cpp.sav 2004-08-12 14:32:06.000000000 +0200
+++ src/dialogs/qfontdialog.cpp 2004-12-13 19:02:31.000000000 +0100
@@ -56,6 +56,10 @@
#include <private/qfontdata_p.h>
#include <qvalidator.h>
+#ifdef Q_WS_X11
+#include "private/qtkdeintegration_x11_p.h"
+#endif
+
/*!
\class QFontDialog qfontdialog.h
\ingroup dialogs
@@ -384,9 +388,15 @@ QFont QFontDialog::getFont( bool *ok, QW
return getFont( ok, 0, parent, name );
}
+extern bool qt_use_native_dialogs;
+
QFont QFontDialog::getFont( bool *ok, const QFont *def,
QWidget *parent, const char* name)
{
+#if defined(Q_WS_X11)
+ if ( qt_use_native_dialogs && QKDEIntegration::enabled())
+ return QKDEIntegration::getFont( ok, def, parent, name );
+#endif
QFont result;
if ( def )
result = *def;
--- src/dialogs/qcolordialog.cpp.sav 2004-04-30 12:00:05.000000000 +0200
+++ src/dialogs/qcolordialog.cpp 2004-12-13 16:53:40.000000000 +0100
@@ -60,6 +60,10 @@ QRgb macGetRgba( QRgb initial, bool *ok,
QColor macGetColor( const QColor& initial, QWidget *parent, const char *name );
#endif
+#ifdef Q_WS_X11
+#include "private/qtkdeintegration_x11_p.h"
+#endif
+
//////////// QWellArray BEGIN
struct QWellArrayData;
@@ -1478,7 +1482,10 @@ QColorDialog::QColorDialog(QWidget* pare
QColor QColorDialog::getColor( const QColor& initial, QWidget *parent,
const char *name )
{
-#if defined(Q_WS_MAC)
+#if defined(Q_WS_X11)
+ if( QKDEIntegration::enabled())
+ return QKDEIntegration::getColor( initial, parent, name );
+#elif defined(Q_WS_MAC)
return macGetColor(initial, parent, name);
#endif
@@ -1516,6 +1523,13 @@ QRgb QColorDialog::getRgba( QRgb initial
QWidget *parent, const char* name )
{
#if defined(Q_WS_MAC)
+ if( QKDEIntegration::enabled()) {
+ QColor color = QKDEIntegration::getColor( QColor( initial ), parent, name );
+ if( ok )
+ *ok = color.isValid();
+ return color.rgba();
+ }
+#elif defined(Q_WS_MAC)
return macGetRgba(initial, ok, parent, name);
#endif
--- src/kernel/qt_x11.pri.sav 2004-11-15 17:51:45.000000000 +0100
+++ src/kernel/qt_x11.pri 2004-12-13 16:53:40.000000000 +0100
@@ -10,6 +10,9 @@ unix {
SOURCES += $$KERNEL_CPP/qtaddons_x11.cpp
PRECOMPILED_HEADER = kernel/qt_pch.h
+
+ SOURCES += $$KERNEL_CPP/qtkdeintegration_x11.cpp
+ HEADERS += $$KERNEL_H/qtkdeintegration_x11_p.h
}
nas {
--- src/kernel/qt.h.sav 2004-02-16 15:05:19.000000000 +0100
+++ src/kernel/qt.h 2004-12-13 16:53:40.000000000 +0100
@@ -313,6 +313,10 @@
#endif // Private headers
+#ifdef Q_WS_X11
+#include "private/qtkdeintegration_x11_p.h"
+#endif
+
#ifdef Q_WS_MAC
#include <qaquastyle.h>
#include <qmacstyle_mac.h>

@ -0,0 +1 @@
#define QTKDELIBDIR @PLUGIN_INSTALL_DIR@/plugins/integration

@ -0,0 +1,73 @@
/*
* This file is part of the Trinity Desktop Environment
*
* Original file taken from the OpenSUSE kdebase builds
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "qtkdeintegration_x11_p.h"
#include <qcolordialog.h>
#include <qfiledialog.h>
#include <qfontdialog.h>
#include <qlibrary.h>
#include <qregexp.h>
#include <qmessagebox.h>
#include <qapplication.h>
#include <stdlib.h>
bool QKDEIntegration::inited = false;
bool QKDEIntegration::enable = false;
bool QKDEIntegration::enabled()
{
if( !inited )
initLibrary();
return enable;
}
static QCString findLibrary()
{
if( getenv( "KDE_FULL_SESSION" ) == NULL )
return "";
if( getenv( "KDE_FULL_SESSION" )[ 0 ] != 't' && getenv( "KDE_FULL_SESSION" )[ 0 ] != '1' )
return "";
if( getenv( "QT_NO_KDE_INTEGRATION" ) == NULL
|| getenv( "QT_NO_KDE_INTEGRATION" )[ 0 ] == '0' )
{
return QCString( QTKDELIBDIR ) + "/libqtkde";
}
return "";
}
static long parentToWinId( const QWidget* w )
{
if( w != NULL )
return w->topLevelWidget()->winId();
// try to find some usable parent
if( qApp->activeWindow() && w != qApp->activeWindow())
return qApp->activeWindow()->winId();
if( qApp->mainWidget() && w != qApp->mainWidget())
return qApp->mainWidget()->winId();
return 0;
}
inline static QFont fontPtrToFontRef( const QFont* f )
{
return f != NULL ? *f : QFont();
}
// ---

@ -0,0 +1,81 @@
/*
* This file is part of the Trinity Desktop Environment
*
* Original file taken from the OpenSUSE kdebase builds
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
// ---
int QKDEIntegration::information( QWidget* parent, const QString& caption,
const QString& text, int button0, int button1, int button2 )
{
return qtkde_messageBox1(
QMessageBox::Information, parentToWinId( parent ), caption, text, button0, button1, button2 );
}
int QKDEIntegration::question( QWidget* parent, const QString& caption,
const QString& text, int button0, int button1, int button2 )
{
return qtkde_messageBox1(
QMessageBox::Question, parentToWinId( parent ), caption, text, button0, button1, button2 );
}
int QKDEIntegration::warning( QWidget* parent, const QString& caption,
const QString& text, int button0, int button1, int button2 )
{
return qtkde_messageBox1(
QMessageBox::Warning, parentToWinId( parent ), caption, text, button0, button1, button2 );
}
int QKDEIntegration::critical( QWidget* parent, const QString& caption,
const QString& text, int button0, int button1, int button2 )
{
return qtkde_messageBox1(
QMessageBox::Critical, parentToWinId( parent ), caption, text, button0, button1, button2 );
}
int QKDEIntegration::information( QWidget* parent, const QString& caption,
const QString& text, const QString& button0Text, const QString& button1Text, const QString& button2Text,
int defaultButton, int escapeButton )
{
return qtkde_messageBox2(
QMessageBox::Information, parentToWinId( parent ), caption, text, button0Text, button1Text, button2Text, defaultButton, escapeButton );
}
int QKDEIntegration::question( QWidget* parent, const QString& caption,
const QString& text, const QString& button0Text, const QString& button1Text, const QString& button2Text,
int defaultButton, int escapeButton )
{
return qtkde_messageBox2(
QMessageBox::Question, parentToWinId( parent ), caption, text, button0Text, button1Text, button2Text, defaultButton, escapeButton );
}
int QKDEIntegration::warning( QWidget* parent, const QString& caption,
const QString& text, const QString& button0Text, const QString& button1Text, const QString& button2Text,
int defaultButton, int escapeButton )
{
return qtkde_messageBox2(
QMessageBox::Warning, parentToWinId( parent ), caption, text, button0Text, button1Text, button2Text, defaultButton, escapeButton );
}
int QKDEIntegration::critical( QWidget* parent, const QString& caption,
const QString& text, const QString& button0Text, const QString& button1Text, const QString& button2Text,
int defaultButton, int escapeButton )
{
return qtkde_messageBox2(
QMessageBox::Critical, parentToWinId( parent ), caption, text, button0Text, button1Text, button2Text, defaultButton, escapeButton );
}

@ -0,0 +1,35 @@
/*
* This file is part of the Trinity Desktop Environment
*
* Original file taken from the OpenSUSE kdebase builds
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef QKDEINTEGRATION_H
#define QKDEINTEGRATION_H
#include <qstringlist.h>
class QLibrary;
class QWidget;
class QColor;
class QFont;
class QKDEIntegration
{
public:
static bool enabled();
// ---

@ -0,0 +1,28 @@
/*
* This file is part of the Trinity Desktop Environment
*
* Original file taken from the OpenSUSE kdebase builds
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
// ---
private:
static void initLibrary();
static bool inited;
static bool enable;
};
#endif
Loading…
Cancel
Save