Browse Source

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
tags/v3.5.13
tpearson 8 years ago
parent
commit
337f18fe5d
27 changed files with 2986 additions and 0 deletions
  1. +1
    -0
      CMakeLists.txt
  2. +14
    -0
      tqt3integration/CMakeLists.txt
  3. +1
    -0
      tqt3integration/Makefile.am
  4. +36
    -0
      tqt3integration/README
  5. +5
    -0
      tqt3integration/configure.in.in
  6. +33
    -0
      tqt3integration/libqtkde/CMakeLists.txt
  7. +15
    -0
      tqt3integration/libqtkde/Makefile.am
  8. +147
    -0
      tqt3integration/libqtkde/qtkde.cpp
  9. +34
    -0
      tqt3integration/libqtkde/qtkde.h
  10. +42
    -0
      tqt3integration/module/CMakeLists.txt
  11. +21
    -0
      tqt3integration/module/Makefile.am
  12. +13
    -0
      tqt3integration/module/kdeintegration.desktop
  13. +378
    -0
      tqt3integration/module/module.cpp
  14. +154
    -0
      tqt3integration/module/module.h
  15. +44
    -0
      tqt3integration/utils/CMakeLists.txt
  16. +19
    -0
      tqt3integration/utils/Makefile.am
  17. +970
    -0
      tqt3integration/utils/gen.cpp
  18. +546
    -0
      tqt3integration/utils/gen.txt
  19. +12
    -0
      tqt3integration/utils/qt/CMakeLists.txt
  20. +1
    -0
      tqt3integration/utils/qt/Makefile.am
  21. +12
    -0
      tqt3integration/utils/qt/in/CMakeLists.txt
  22. +270
    -0
      tqt3integration/utils/qt/in/qt.patch
  23. +1
    -0
      tqt3integration/utils/qt/in/qtkdeintegration_x11_0.cpp.cmake
  24. +73
    -0
      tqt3integration/utils/qt/in/qtkdeintegration_x11_1.cpp
  25. +81
    -0
      tqt3integration/utils/qt/in/qtkdeintegration_x11_2.cpp
  26. +35
    -0
      tqt3integration/utils/qt/in/qtkdeintegration_x11_p_1.h
  27. +28
    -0
      tqt3integration/utils/qt/in/qtkdeintegration_x11_p_2.h

+ 1
- 0
CMakeLists.txt View File

@@ -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 ##########



+ 14
- 0
tqt3integration/CMakeLists.txt View File

@@ -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 )

+ 1
- 0
tqt3integration/Makefile.am View File

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

+ 36
- 0
tqt3integration/README View File

@@ -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

+ 5
- 0
tqt3integration/configure.in.in View File

@@ -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)

+ 33
- 0
tqt3integration/libqtkde/CMakeLists.txt View File

@@ -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/"
)

+ 15
- 0
tqt3integration/libqtkde/Makefile.am View File

@@ -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

+ 147
- 0
tqt3integration/libqtkde/qtkde.cpp View File

@@ -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"

+ 34
- 0
tqt3integration/libqtkde/qtkde.h View File

@@ -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

+ 42
- 0
tqt3integration/module/CMakeLists.txt View File

@@ -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}
)

+ 21
- 0
tqt3integration/module/Makefile.am View File

@@ -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

+ 13
- 0
tqt3integration/module/kdeintegration.desktop View File

@@ -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

+ 378
- 0
tqt3integration/module/module.cpp View File

@@ -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"

+ 154
- 0
tqt3integration/module/module.h View File

@@ -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

+ 44
- 0
tqt3integration/utils/CMakeLists.txt View File

@@ -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)

+ 19
- 0
tqt3integration/utils/Makefile.am View File

@@ -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

+ 970
- 0
tqt3integration/utils/gen.cpp View File

@@ -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;
}

+ 546
- 0
tqt3integration/utils/gen.txt View File

@@ -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