GUI: fix some questionable uses of url_encode and use path2qs in places

This commit is contained in:
Jean-Francois Dockes 2020-04-19 09:21:40 +02:00
parent dce3bff5d7
commit 19c8c50fb1
5 changed files with 253 additions and 258 deletions

View File

@ -37,6 +37,12 @@
using namespace std;
// Browser list used if xdg-open fails for opening the help doc
static const vector<string> browser_list{
"opera", "google-chrome", "chromium-browser",
"palemoon", "iceweasel", "firefox", "konqueror", "epiphany"};
// Start native viewer or preview for input Doc. This is used to allow
// using recoll from another app (e.g. Unity Scope) to view embedded
// result docs (docs with an ipath). . We act as a proxy to extract
@ -45,12 +51,11 @@ using namespace std;
void RclMain::viewUrl()
{
if (m_urltoview.isEmpty() || !rcldb)
return;
return;
QUrl qurl(m_urltoview);
LOGDEB("RclMain::viewUrl: Path [" <<
((const char *)qurl.path().toLocal8Bit()) << "] fragment ["
<< ((const char *)qurl.fragment().toLocal8Bit()) << "]\n");
LOGDEB("RclMain::viewUrl: Path [" << qs2path(qurl.path()) <<
"] fragment [" << qs2path(qurl.fragment()) << "]\n");
/* In theory, the url might not be for a file managed by the fs
indexer so that the make_udi() call here would be
@ -58,13 +63,12 @@ void RclMain::viewUrl()
inside internfile and have some url magic to indicate the
appropriate indexer/identification scheme */
string udi;
make_udi((const char *)qurl.path().toLocal8Bit(),
(const char *)qurl.fragment().toLocal8Bit(), udi);
make_udi(qs2path(qurl.path()), qs2path(qurl.fragment()), udi);
Rcl::Doc doc;
Rcl::Doc idxdoc; // idxdoc.idxi == 0 -> works with base index only
if (!rcldb->getDoc(udi, idxdoc, doc) || doc.pc == -1)
return;
return;
// StartNativeViewer needs a db source to call getEnclosing() on.
Rcl::Query *query = new Rcl::Query(rcldb.get());
@ -79,22 +83,22 @@ void RclMain::viewUrl()
string apptag;
doc.getmeta(Rcl::Doc::keyapptg, &apptag);
string viewer = theconfig->getMimeViewerDef(doc.mimetype, apptag,
prefs.useDesktopOpen);
prefs.useDesktopOpen);
if (viewer.empty()) {
startPreview(doc);
startPreview(doc);
} else {
hide();
startNativeViewer(doc);
// We have a problem here because xdg-open will exit
// immediately after starting the command instead of waiting
// for it, so we can't wait either and we don't know when we
// can exit (deleting the temp file). As a bad workaround we
// sleep some time then exit. The alternative would be to just
// prevent the temp file deletion completely, leaving it
// around forever. Better to let the user save a copy if he
// wants I think.
sleep(30);
fileExit();
hide();
startNativeViewer(doc);
// We have a problem here because xdg-open will exit
// immediately after starting the command instead of waiting
// for it, so we can't wait either and we don't know when we
// can exit (deleting the temp file). As a bad workaround we
// sleep some time then exit. The alternative would be to just
// prevent the temp file deletion completely, leaving it
// around forever. Better to let the user save a copy if he
// wants I think.
sleep(30);
fileExit();
}
}
@ -103,17 +107,14 @@ void RclMain::viewUrl()
* (xdg-open etc.) failed */
static bool lookForHtmlBrowser(string &exefile)
{
vector<string> blist{"opera", "google-chrome", "chromium-browser",
"palemoon", "iceweasel", "firefox", "konqueror", "epiphany"};
const char *path = getenv("PATH");
if (path == 0) {
path = "/usr/local/bin:/usr/bin:/bin";
path = "/usr/local/bin:/usr/bin:/bin";
}
// Look for each browser
for (const auto& entry : blist) {
if (ExecCmd::which(entry, exefile, path))
return true;
for (const auto& entry : browser_list) {
if (ExecCmd::which(entry, exefile, path))
return true;
}
exefile.clear();
return false;
@ -126,11 +127,11 @@ void RclMain::openWith(Rcl::Doc doc, string cmdspec)
// Split the command line
vector<string> lcmd;
if (!stringToStrings(cmdspec, lcmd)) {
QMessageBox::warning(
QMessageBox::warning(
0, "Recoll", tr("Bad desktop app spec for %1: [%2]\n"
"Please check the desktop file")
.arg(u8s2qs(doc.mimetype)).arg(path2qs(cmdspec)));
return;
return;
}
// Look for the command to execute in the exec path and the filters
@ -165,12 +166,12 @@ void RclMain::startNativeViewer(Rcl::Doc doc, int pagenum, QString term)
// Look for appropriate viewer
string cmdplusattr = theconfig->getMimeViewerDef(doc.mimetype, apptag,
prefs.useDesktopOpen);
prefs.useDesktopOpen);
if (cmdplusattr.empty()) {
QMessageBox::warning(0, "Recoll",
tr("No external viewer configured for mime type [")
+ doc.mimetype.c_str() + "]");
return;
QMessageBox::warning(0, "Recoll",
tr("No external viewer configured for mime type [")
+ doc.mimetype.c_str() + "]");
return;
}
LOGDEB("StartNativeViewer: viewerdef from config: " << cmdplusattr << endl);
@ -191,59 +192,59 @@ void RclMain::startNativeViewer(Rcl::Doc doc, int pagenum, QString term)
// Split the command line
vector<string> lcmd;
if (!stringToStrings(cmd, lcmd)) {
QMessageBox::warning(
QMessageBox::warning(
0, "Recoll", tr("Bad viewer command line for %1: [%2]\n"
"Please check the mimeview file")
.arg(u8s2qs(doc.mimetype)).arg(path2qs(cmd)));
return;
return;
}
// Look for the command to execute in the exec path and the filters
// directory
string execpath;
if (!ExecCmd::which(lcmd.front(), execpath)) {
execpath = theconfig->findFilter(lcmd.front());
// findFilter returns its input param if the filter is not in
// the normal places. As we already looked in the path, we
// have no use for a simple command name here (as opposed to
// mimehandler which will just let execvp do its thing). Erase
// execpath so that the user dialog will be started further
// down.
if (!execpath.compare(lcmd.front()))
execpath.erase();
execpath = theconfig->findFilter(lcmd.front());
// findFilter returns its input param if the filter is not in
// the normal places. As we already looked in the path, we
// have no use for a simple command name here (as opposed to
// mimehandler which will just let execvp do its thing). Erase
// execpath so that the user dialog will be started further
// down.
if (!execpath.compare(lcmd.front()))
execpath.erase();
// Specialcase text/html because of the help browser need
if (execpath.empty() && !doc.mimetype.compare("text/html") &&
apptag.empty()) {
if (lookForHtmlBrowser(execpath)) {
lcmd.clear();
lcmd.push_back(execpath);
lcmd.push_back("%u");
}
}
// Specialcase text/html because of the help browser need
if (execpath.empty() && !doc.mimetype.compare("text/html") &&
apptag.empty()) {
if (lookForHtmlBrowser(execpath)) {
lcmd.clear();
lcmd.push_back(execpath);
lcmd.push_back("%u");
}
}
}
// Command not found: start the user dialog to help find another one:
if (execpath.empty()) {
QString mt = QString::fromUtf8(doc.mimetype.c_str());
QString message = tr("The viewer specified in mimeview for %1: %2"
" is not found.\nDo you want to start the "
" preferences dialog ?")
QString mt = QString::fromUtf8(doc.mimetype.c_str());
QString message = tr("The viewer specified in mimeview for %1: %2"
" is not found.\nDo you want to start the "
" preferences dialog ?")
.arg(mt).arg(path2qs(lcmd.front()));
switch(QMessageBox::warning(0, "Recoll", message,
"Yes", "No", 0, 0, 1)) {
case 0:
showUIPrefs();
if (uiprefs)
uiprefs->showViewAction(mt);
break;
case 1:
break;
}
switch(QMessageBox::warning(0, "Recoll", message,
"Yes", "No", 0, 0, 1)) {
case 0:
showUIPrefs();
if (uiprefs)
uiprefs->showViewAction(mt);
break;
case 1:
break;
}
// The user will have to click on the link again to try the
// new command.
return;
return;
}
// Get rid of the command name. lcmd is now argv[1...n]
lcmd.erase(lcmd.begin());
@ -270,42 +271,42 @@ void RclMain::startNativeViewer(Rcl::Doc doc, int pagenum, QString term)
}
if (wantsparentfile && !urlisfileurl(doc.url)) {
QMessageBox::warning(0, "Recoll",
tr("Viewer command line for %1 specifies "
"parent file but URL is http[s]: unsupported")
.arg(QString::fromUtf8(doc.mimetype.c_str())));
return;
QMessageBox::warning(0, "Recoll",
tr("Viewer command line for %1 specifies "
"parent file but URL is http[s]: unsupported")
.arg(QString::fromUtf8(doc.mimetype.c_str())));
return;
}
if (wantsfile && wantsparentfile) {
QMessageBox::warning(0, "Recoll",
tr("Viewer command line for %1 specifies both "
"file and parent file value: unsupported")
.arg(QString::fromUtf8(doc.mimetype.c_str())));
return;
QMessageBox::warning(0, "Recoll",
tr("Viewer command line for %1 specifies both "
"file and parent file value: unsupported")
.arg(QString::fromUtf8(doc.mimetype.c_str())));
return;
}
string url = doc.url;
string fn = fileurltolocalpath(doc.url);
Rcl::Doc pdoc;
if (wantsparentfile) {
// We want the path for the parent document. For example to
// open the chm file, not the internal page. Note that we just
// override the other file name in this case.
if (!m_source || !m_source->getEnclosing(doc, pdoc)) {
QMessageBox::warning(0, "Recoll",
tr("Cannot find parent document"));
return;
}
// Override fn with the parent's :
fn = fileurltolocalpath(pdoc.url);
// We want the path for the parent document. For example to
// open the chm file, not the internal page. Note that we just
// override the other file name in this case.
if (!m_source || !m_source->getEnclosing(doc, pdoc)) {
QMessageBox::warning(0, "Recoll",
tr("Cannot find parent document"));
return;
}
// Override fn with the parent's :
fn = fileurltolocalpath(pdoc.url);
// If the parent document has an ipath too, we need to create
// a temp file even if the command takes an ipath
// parameter. We have no viewer which could handle a double
// embedding. Will have to change if such a one appears.
if (!pdoc.ipath.empty()) {
groksipath = false;
}
// If the parent document has an ipath too, we need to create
// a temp file even if the command takes an ipath
// parameter. We have no viewer which could handle a double
// embedding. Will have to change if such a one appears.
if (!pdoc.ipath.empty()) {
groksipath = false;
}
}
// Can't remember what enterHistory was actually for. Set it to
@ -320,20 +321,20 @@ void RclMain::startNativeViewer(Rcl::Doc doc, int pagenum, QString term)
// there is an ipath that it won't understand, we need a temp file:
theconfig->setKeyDir(fn.empty() ? "" : path_getfather(fn));
if (((wantsfile || wantsparentfile) && fn.empty()) ||
(!groksipath && !doc.ipath.empty()) ) {
TempFile temp;
Rcl::Doc& thedoc = wantsparentfile ? pdoc : doc;
if (!FileInterner::idocToFile(temp, string(), theconfig, thedoc)) {
QMessageBox::warning(0, "Recoll",
tr("Cannot extract document or create "
"temporary file"));
return;
}
enterHistory = true;
(!groksipath && !doc.ipath.empty()) ) {
TempFile temp;
Rcl::Doc& thedoc = wantsparentfile ? pdoc : doc;
if (!FileInterner::idocToFile(temp, string(), theconfig, thedoc)) {
QMessageBox::warning(0, "Recoll",
tr("Cannot extract document or create "
"temporary file"));
return;
}
enterHistory = true;
istempfile = true;
rememberTempFile(temp);
fn = temp.filename();
url = path_pathtofileurl(fn);
rememberTempFile(temp);
fn = temp.filename();
url = path_pathtofileurl(fn);
}
// If using an actual file, check that it exists, and if it is
@ -354,7 +355,7 @@ void RclMain::startNativeViewer(Rcl::Doc doc, int pagenum, QString term)
}
if (temp.ok()) {
istempfile = true;
rememberTempFile(temp);
rememberTempFile(temp);
fn = temp.filename();
url = path_pathtofileurl(fn);
}
@ -381,14 +382,14 @@ void RclMain::startNativeViewer(Rcl::Doc doc, int pagenum, QString term)
// If we are not called with a page number (which would happen for a call
// from the snippets window), see if we can compute a page number anyway.
if (pagenum == -1) {
pagenum = 1;
string lterm;
if (m_source)
pagenum = m_source->getFirstMatchPage(doc, lterm);
if (pagenum == -1)
pagenum = 1;
else // We get the match term used to compute the page
term = QString::fromUtf8(lterm.c_str());
pagenum = 1;
string lterm;
if (m_source)
pagenum = m_source->getFirstMatchPage(doc, lterm);
if (pagenum == -1)
pagenum = 1;
else // We get the match term used to compute the page
term = QString::fromUtf8(lterm.c_str());
}
char cpagenum[20];
sprintf(cpagenum, "%d", pagenum);
@ -445,20 +446,20 @@ void RclMain::execViewer(const map<string, string>& subs, bool enterHistory,
#endif
QStatusBar *stb = statusBar();
if (stb) {
string prcmd;
string prcmd;
#ifdef _WIN32
prcmd = ncmd;
#else
string fcharset = theconfig->getDefCharset(true);
transcode(ncmd, prcmd, fcharset, "UTF-8");
string fcharset = theconfig->getDefCharset(true);
transcode(ncmd, prcmd, fcharset, "UTF-8");
#endif
QString msg = tr("Executing: [") +
QString::fromUtf8(prcmd.c_str()) + "]";
stb->showMessage(msg, 10000);
QString msg = tr("Executing: [") +
QString::fromUtf8(prcmd.c_str()) + "]";
stb->showMessage(msg, 10000);
}
if (enterHistory)
historyEnterDoc(rcldb.get(), g_dynconf, doc);
historyEnterDoc(rcldb.get(), g_dynconf, doc);
// Do the zeitgeist thing
zg_send_event(ZGSEND_OPEN, doc);
@ -497,8 +498,8 @@ void RclMain::startManual(const string& index)
#endif
if (!indexempty) {
usermanual += "#";
usermanual += index;
usermanual += "#";
usermanual += index;
}
Rcl::Doc doc;
if (has_wh && indexempty) {

View File

@ -37,7 +37,7 @@ QMenu *create(QWidget *me, int opts, std::shared_ptr<DocSequence> source,
LOGDEB("ResultPopup::create: opts " << opts << " haspages " <<
doc.haspages << " " <<(source ? "Source not null" : "Source is Null")
<< " " << (source ? (source->snippetsCapable() ?
"snippetsCapable" : "not snippetsCapable") : "")
"snippetsCapable":"not snippetsCapable") : "")
<< "\n");
string apptag;
@ -46,7 +46,7 @@ QMenu *create(QWidget *me, int opts, std::shared_ptr<DocSequence> source,
popup->addAction(QWidget::tr("&Preview"), me, SLOT(menuPreview()));
if (!theconfig->getMimeViewerDef(doc.mimetype, apptag, 0).empty()) {
popup->addAction(QWidget::tr("&Open"), me, SLOT(menuEdit()));
popup->addAction(QWidget::tr("&Open"), me, SLOT(menuEdit()));
}
bool needopenwith = true;
@ -105,17 +105,17 @@ QMenu *create(QWidget *me, int opts, std::shared_ptr<DocSequence> source,
popup->addAction(QWidget::tr("Copy &URL"), me, SLOT(menuCopyURL()));
if ((opts&showSaveOne) && (!doc.isFsFile() || !doc.ipath.empty()))
popup->addAction(QWidget::tr("&Write to File"), me,
popup->addAction(QWidget::tr("&Write to File"), me,
SLOT(menuSaveToFile()));
if ((opts&showSaveSel))
popup->addAction(QWidget::tr("Save selection to files"),
me, SLOT(menuSaveSelection()));
popup->addAction(QWidget::tr("Save selection to files"),
me, SLOT(menuSaveSelection()));
Rcl::Doc pdoc;
if (source && source->getEnclosing(doc, pdoc)) {
popup->addAction(QWidget::tr("Preview P&arent document/folder"),
me, SLOT(menuPreviewParent()));
popup->addAction(QWidget::tr("Preview P&arent document/folder"),
me, SLOT(menuPreviewParent()));
}
// Open parent is useful even if there is no parent because we open
// the enclosing folder.
@ -124,16 +124,16 @@ QMenu *create(QWidget *me, int opts, std::shared_ptr<DocSequence> source,
me, SLOT(menuOpenParent()));
if (opts & showExpand)
popup->addAction(QWidget::tr("Find &similar documents"),
me, SLOT(menuExpand()));
popup->addAction(QWidget::tr("Find &similar documents"),
me, SLOT(menuExpand()));
if (doc.haspages && source && source->snippetsCapable())
popup->addAction(QWidget::tr("Open &Snippets window"),
me, SLOT(menuShowSnippets()));
popup->addAction(QWidget::tr("Open &Snippets window"),
me, SLOT(menuShowSnippets()));
if ((opts & showSubs) && rcldb && rcldb->hasSubDocs(doc))
popup->addAction(QWidget::tr("Show subdocuments / attachments"),
me, SLOT(menuShowSubDocs()));
popup->addAction(QWidget::tr("Show subdocuments / attachments"),
me, SLOT(menuShowSubDocs()));
return popup;
}
@ -142,12 +142,12 @@ Rcl::Doc getParent(std::shared_ptr<DocSequence> source, Rcl::Doc& doc)
{
Rcl::Doc pdoc;
if (!source || !source->getEnclosing(doc, pdoc)) {
// No parent doc: show enclosing folder with app configured for
// directories
// No parent doc: show enclosing folder with app configured for
// directories
pdoc.url = url_parentfolder(doc.url);
pdoc.meta[Rcl::Doc::keychildurl] = doc.url;
pdoc.meta[Rcl::Doc::keyapptg] = "parentopen";
pdoc.mimetype = "inode/directory";
pdoc.meta[Rcl::Doc::keychildurl] = doc.url;
pdoc.meta[Rcl::Doc::keyapptg] = "parentopen";
pdoc.mimetype = "inode/directory";
}
return pdoc;
}
@ -169,12 +169,9 @@ void copyFN(const Rcl::Doc &doc)
void copyURL(const Rcl::Doc &doc)
{
string url = url_encode(doc.url, 7);
QApplication::clipboard()->setText(url.c_str(),
QClipboard::Selection);
QApplication::clipboard()->setText(url.c_str(),
QClipboard::Clipboard);
QString url = path2qs(doc.url);
QApplication::clipboard()->setText(url, QClipboard::Selection);
QApplication::clipboard()->setText(url, QClipboard::Clipboard);
}
}

View File

@ -405,14 +405,14 @@ QVariant RecollModel::data(const QModelIndex& index, int role) const
int ecnt;
string data1;
if (!transcode(data, data1, "UTF-8", "UTF-8", &ecnt) || ecnt > 0) {
data = url_encode(data);
data = url_encode(data, 7);
}
}
#endif
list<string> lr;
g_hiliter.plaintorich(data, lr, m_hdata);
return QString::fromUtf8(lr.front().c_str());
return u8s2qs(lr.front());
}
void RecollModel::saveAsCSV(std::fstream& fp)

View File

@ -45,7 +45,7 @@ static const char *desktopfiletext =
"[Desktop Entry]\n"
"Name=Recoll real time indexer\n"
"Comment=Runs in background to extract and index text from modified "
"documents\n"
"documents\n"
"Icon=system-run\n"
"Exec=recollindex -w 60 -m\n"
"Terminal=false\n"
@ -61,10 +61,10 @@ static const char *desktopfiletext =
void RTIToolW::init()
{
connect(this->sesCB, SIGNAL(clicked(bool)),
this, SLOT(sesclicked(bool)));
this, SLOT(sesclicked(bool)));
string autostartfile = path_cat(path_home(), rautostartfile);
if (path_exists(autostartfile)) {
sesCB->setChecked(true);
sesCB->setChecked(true);
}
}
@ -72,7 +72,7 @@ void RTIToolW::sesclicked(bool on)
{
nowCB->setEnabled(on);
if (!on)
nowCB->setChecked(false);
nowCB->setChecked(false);
}
void RTIToolW::accept()
@ -81,98 +81,95 @@ void RTIToolW::accept()
string autostartfile = path_cat(path_home(), rautostartfile);
if (sesCB->isChecked()) {
// Setting up daemon indexing autostart
// Setting up daemon indexing autostart
if (path_exists(autostartfile)) {
QString msg = tr("Replacing: ") +
QString::fromLocal8Bit(autostartfile.c_str());
QMessageBox::Button rep =
QMessageBox::question(this, tr("Replacing file"), msg,
QMessageBox::Ok | QMessageBox::Cancel);
if (rep != QMessageBox::Ok) {
goto out;
}
}
if (path_exists(autostartfile)) {
QString msg = tr("Replacing: ") + path2qs(autostartfile);
QMessageBox::Button rep =
QMessageBox::question(this, tr("Replacing file"), msg,
QMessageBox::Ok | QMessageBox::Cancel);
if (rep != QMessageBox::Ok) {
goto out;
}
}
string text;
if (theconfig) {
string sourcefile = path_cat(theconfig->getDatadir(), "examples");
sourcefile = path_cat(sourcefile, "recollindex.desktop");
if (path_exists(sourcefile)) {
file_to_string(sourcefile, text);
}
}
if (text.empty())
text = desktopfiletext;
string text;
if (theconfig) {
string sourcefile = path_cat(theconfig->getDatadir(), "examples");
sourcefile = path_cat(sourcefile, "recollindex.desktop");
if (path_exists(sourcefile)) {
file_to_string(sourcefile, text);
}
}
if (text.empty())
text = desktopfiletext;
// Try to create .config and autostart anyway. If they exists this will
// do nothing. An error will be detected when we try to create the file
string dir = path_cat(path_home(), ".config");
mkdir(dir.c_str(), 0700);
dir = path_cat(dir, "autostart");
mkdir(dir.c_str(), 0700);
// Try to create .config and autostart anyway. If they exists this will
// do nothing. An error will be detected when we try to create the file
string dir = path_cat(path_home(), ".config");
mkdir(dir.c_str(), 0700);
dir = path_cat(dir, "autostart");
mkdir(dir.c_str(), 0700);
string reason;
if (!stringtofile(text, autostartfile.c_str(), reason)) {
QString msg = tr("Can't create: ") +
QString::fromLocal8Bit(autostartfile.c_str());
QMessageBox::warning(0, tr("Warning"), msg, QMessageBox::Ok);
return;
}
QString msg = tr("Can't create: ") + path2qs(autostartfile);
QMessageBox::warning(0, tr("Warning"), msg, QMessageBox::Ok);
return;
}
if (nowCB->isChecked()) {
ExecCmd cmd;
vector<string> args;
int status;
if (nowCB->isChecked()) {
ExecCmd cmd;
vector<string> args;
int status;
args.push_back("-m");
args.push_back("-w");
args.push_back("0");
status = cmd.doexec("recollindex", args, 0, 0);
if (status) {
QMessageBox::warning(0, tr("Warning"),
tr("Could not execute recollindex"),
QMessageBox::Ok);
goto out;
}
}
args.push_back("-m");
args.push_back("-w");
args.push_back("0");
status = cmd.doexec("recollindex", args, 0, 0);
if (status) {
QMessageBox::warning(0, tr("Warning"),
tr("Could not execute recollindex"),
QMessageBox::Ok);
goto out;
}
}
exitdial = true;
exitdial = true;
} else {
// Turning autostart off
if (path_exists(autostartfile)) {
QString msg = tr("Deleting: ") +
QString::fromLocal8Bit(autostartfile.c_str());
QMessageBox::Button rep =
QMessageBox::question(this, tr("Deleting file"), msg,
QMessageBox::Ok | QMessageBox::Cancel);
if (rep == QMessageBox::Ok) {
exitdial = true;
unlink(autostartfile.c_str());
if (theconfig) {
Pidfile pidfile(theconfig->getPidfile());
pid_t pid;
if ((pid = pidfile.open()) != 0) {
QMessageBox::Button rep =
QMessageBox::question(this,
tr("Removing autostart"),
tr("Autostart file deleted. Kill current process too ?"),
QMessageBox::Yes | QMessageBox::No);
if (rep == QMessageBox::Yes) {
kill(pid, SIGTERM);
}
}
}
}
} else {
exitdial = true;
}
// Turning autostart off
if (path_exists(autostartfile)) {
QString msg = tr("Deleting: ") + path2qs(autostartfile);
QMessageBox::Button rep =
QMessageBox::question(this, tr("Deleting file"), msg,
QMessageBox::Ok | QMessageBox::Cancel);
if (rep == QMessageBox::Ok) {
exitdial = true;
unlink(autostartfile.c_str());
if (theconfig) {
Pidfile pidfile(theconfig->getPidfile());
pid_t pid;
if ((pid = pidfile.open()) != 0) {
QMessageBox::Button rep =
QMessageBox::question(
this, tr("Removing autostart"),
tr("Autostart file deleted. Kill current process too ?"),
QMessageBox::Yes | QMessageBox::No);
if (rep == QMessageBox::Yes) {
kill(pid, SIGTERM);
}
}
}
}
} else {
exitdial = true;
}
}
out:
if (exitdial)
QDialog::accept();
QDialog::accept();
}
#endif

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2016 J.F.Dockes
/* Copyright (C) 2016-2020 J.F.Dockes
* 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
@ -37,6 +37,7 @@
#include "conftree.h"
#include "rclmain_w.h"
#include "smallut.h"
#include "log.h"
using namespace std;
@ -160,15 +161,16 @@ QVariant WebcacheModel::data(const QModelIndex& index, int role) const
void WebcacheModel::setSearchFilter(const QString& _txt)
{
SimpleRegexp re(qs2utf8s(_txt), SimpleRegexp::SRE_NOSUB);
SimpleRegexp re(
qs2utf8s(_txt), SimpleRegexp::SRE_NOSUB|SimpleRegexp::SRE_ICASE);
m->disp.clear();
for (unsigned int i = 0; i < m->all.size(); i++) {
if (re(m->all[i].url)) {
m->disp.push_back(m->all[i]);
} else {
//qDebug() << "match failed. exp" << _txt << "data" <<
// m->all[i].url.c_str();
LOGDEB1(" WebcacheMOdel::filter: match failed. exp" <<
qs2utf8s(_txt) << "data" << m->all[i].url);
}
}
emit dataChanged(createIndex(0,0), createIndex(1, m->all.size()));
@ -197,19 +199,19 @@ WebcacheEdit::WebcacheEdit(RclMain *parent)
wl = settings.value(cwnm).toStringList();
QHeaderView *header = tableview->horizontalHeader();
if (header) {
if (int(wl.size()) == header->count()) {
for (int i = 0; i < header->count(); i++) {
header->resizeSection(i, wl[i].toInt());
}
}
if (int(wl.size()) == header->count()) {
for (int i = 0; i < header->count(); i++) {
header->resizeSection(i, wl[i].toInt());
}
}
}
connect(header, SIGNAL(sectionResized(int,int,int)),
this, SLOT(saveColState()));
header = tableview->verticalHeader();
if (header) {
header->setDefaultSectionSize(QApplication::fontMetrics().height() +
ROWHEIGHTPAD);
header->setDefaultSectionSize(QApplication::fontMetrics().height() +
ROWHEIGHTPAD);
}
int width = settings.value(wwnm, 0).toInt();
@ -223,7 +225,7 @@ WebcacheEdit::WebcacheEdit(RclMain *parent)
connect(new QShortcut(closeKS, this), SIGNAL (activated()),
this, SLOT (close()));
connect(tableview, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(createPopupMenu(const QPoint&)));
this, SLOT(createPopupMenu(const QPoint&)));
}
@ -279,13 +281,11 @@ void WebcacheEdit::copyURL()
QModelIndexList selection = tableview->selectionModel()->selectedRows();
if (selection.size() != 1)
return;
string url = m_model->getURL(selection[0].row());
const string& url = m_model->getURL(selection[0].row());
if (!url.empty()) {
url = url_encode(url, 7);
QApplication::clipboard()->setText(url.c_str(),
QClipboard::Selection);
QApplication::clipboard()->setText(url.c_str(),
QClipboard::Clipboard);
QString qurl = path2qs(url);
QApplication::clipboard()->setText(qurl, QClipboard::Selection);
QApplication::clipboard()->setText(qurl, QClipboard::Clipboard);
}
}
@ -295,8 +295,8 @@ void WebcacheEdit::saveColState()
QHeaderView *header = tableview->horizontalHeader();
QStringList newwidths;
for (int vi = 0; vi < header->count(); vi++) {
int li = header->logicalIndex(vi);
newwidths.push_back(lltodecstr(header->sectionSize(li)).c_str());
int li = header->logicalIndex(vi);
newwidths.push_back(lltodecstr(header->sectionSize(li)).c_str());
}
QSettings settings;