summaryrefslogtreecommitdiffstats
path: root/kghostview/kgvconfigdialog.cpp
blob: 6159a6f273dd531a4bc9cc41775185e6e4ebb0f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/**
 * Copyright (C) 2000-2002 the KGhostView authors. See file AUTHORS.
 *
 * 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.
 */


// Add header files alphabetically

#include <tqlayout.h>

#include <kconfig.h>
#include <kdebug.h>
#include <kglobal.h>
#include <kiconloader.h>
#include <kinstance.h>
#include <klocale.h>
#include <kmessagebox.h>
#include <kprocess.h>
#include <kstandarddirs.h>
#include <kconfigdialog.h>

#include "configuration.h"
#include "kgv_view.h"
#include "kgvfactory.h"

#include "generalsettingswidget.h"
#include "gssettingswidget.h"

#include "kgvconfigdialog.h"


namespace {
    TQString getGSVersion( TQString fullPathToExec )
    {
	TQString res;
	TQString chkVersion = KProcess::quote(fullPathToExec) + " --version";
	FILE* p = popen( TQFile::encodeName(chkVersion), "r" );
	if( p ) {
	    // FIXME: a badly configured interpreter can hang us
	    TQFile qp;
	    qp.open( IO_ReadOnly, p );
	    qp.readLine( res, 80 );
	    qp.close();
	    pclose( p );
	    res = res.stripWhiteSpace();
	}
	kdDebug(4500) << "kgvconfigdialog.cpp::{unamed}::getGSVersion() returning " << res <<  endl;
	return res;
    }


    /* A mechanism for triggering redetection of gs versions:
     *
     * The idea is that whenever we find we need to workaround a certain version of gs,
     * we cannot rely that there will solelly be a new kghostviewrc, but that users will
     * upgrade kghostview. Therefore, whenever we want to trigger redection on a new version,
     * we increment the counter below. It should have the old value from the previous version
     * of kghostview and this function will get called.
     * 
     */

    /* On a related note:
     * We don't detect upgrades (or downgrades, for that matter) of gs.
     * I am seeing if I can get the version out of gs as a side effect to displaying a file.
     * This way, using kconfig:/Ghostscript/GS Version we will see whether the version has changed
     * and trigger a redetection without the trouble of running "gs --version" on each launch.
     *
     * LPC (9 April 2003)
     */
    /* currentRedetection value log:
     * 
     * 1- remove -dMaxBitmap for gs 6.5x
     * 2- see if it supports .setsafe ( see bug:57291 ).
     */
    const int currentRedetection = 2;


    /* Here are the issues we found so far in version of gs:
     *
     * - gs before 6.50 uses device x11alpha instead of x11
     * - gs 6.5x does not work well with -dMaxBitmap=...
     * - gs 6.52 and earlier as well as 7.0x for x < 4 don't support the .setsafe operator
     *
     */

    TQString recommendSetSafe( TQString version )
    {
	if ( version < TQString::number( 6.53 ) ) return TQString::number( 6.53 );
	if ( version[ 0 ] == '7' && version < TQString::number( 7.04 ) ) return TQString::number( 7.05 );
	return TQString();
    }
    // This function should contain all the gs version specific workarounds.
    void redoGSDetection() 
    {
	kdDebug(4500) << "kgvconfigdialog.cpp::{unnamed}::redoGSDetection()" << endl;
	TQString version = getGSVersion( Configuration::interpreter() );
	TQString recommended = recommendSetSafe( version );
	if ( !recommended.isNull() ) {
	    KMessageBox::sorry( 0,
		    i18n( "Your version of gs (version %1) is too old, since it has security issues "
			"which are impossible to resolve. Please upgrade to a newer version.\n"
			"KGhostView will try to work with it, but it may not display any files at all.\n"
			"Version %2 seems to be appropriate on your system, although newer versions will work as well." )
		    .tqarg( version )
		    .tqarg( recommended ) );
	}
	if ( version < TQString::number( 7.00 ) ) 
	{
	    TQStringList arguments = TQStringList::split( ' ', Configuration::antialiasingArguments() );
	    arguments.remove( TQString::tqfromLatin1( "-dMaxBitmap=10000000" ) );
	    TQString antiAliasArgs = arguments.join( " " );

	    Configuration::setAntialiasingArguments( antiAliasArgs );
	}

	Configuration::setRedetectionCounter( currentRedetection );
	Configuration::setVersion( version );
    }
} // namespace

void  ConfigDialog::showSettings( KGVPart* main ) {
    const char* name = "kghostview-settings";
    if ( KConfigDialog::showDialog( name ) ) return;

    if ( Configuration::redetectionCounter() < currentRedetection ) redoGSDetection();

    KConfigDialog* dialog = new KConfigDialog( 0, name,
	    Configuration::self(), KDialogBase::IconList );
    dialog->addPage( new GeneralSettingsWidget( 0, "general-settings" ),
	    i18n( "General" ), TQString::tqfromLatin1( "kghostview" ) );
    GSSettingsWidget *gssw = new GSSettingsWidget( 0, "gs-settings" );
    dialog->addPage( gssw, i18n( "Ghostscript\nConfiguration" ), TQString::tqfromLatin1( "pdf" ) );

    gssw->setDetectedVersion(Configuration::version());

    TQObject::connect( dialog, TQT_SIGNAL( settingsChanged() ), main, TQT_SLOT( slotConfigurationChanged() ) );
    dialog->show();
}


// vim:sw=4:sts=4:ts=8:noet