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-ecb5cbfe19dav3.5.13-sru
@ -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*/ ); | |||