mirror of
https://github.com/edeproject/ede.git
synced 2023-08-10 21:13:03 +03:00
Do not run .desktop files which has OnlyShowIn/NotShowIn without 'EDE' as key.
This commit is contained in:
parent
229914358a
commit
c8323b386d
@ -19,6 +19,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
#include <FL/Fl.H>
|
#include <FL/Fl.H>
|
||||||
#include <FL/Fl_Check_Browser.H>
|
#include <FL/Fl_Check_Browser.H>
|
||||||
@ -41,7 +42,7 @@
|
|||||||
#include <edelib/Ede.h>
|
#include <edelib/Ede.h>
|
||||||
|
|
||||||
EDELIB_NS_USING_AS(Window, AppWindow)
|
EDELIB_NS_USING_AS(Window, AppWindow)
|
||||||
EDELIB_NS_USING_LIST(15, (String,
|
EDELIB_NS_USING_LIST(17, (String,
|
||||||
DesktopFile,
|
DesktopFile,
|
||||||
IconLoader,
|
IconLoader,
|
||||||
list,
|
list,
|
||||||
@ -49,8 +50,10 @@ EDELIB_NS_USING_LIST(15, (String,
|
|||||||
system_config_dirs,
|
system_config_dirs,
|
||||||
user_config_dir,
|
user_config_dir,
|
||||||
str_ends,
|
str_ends,
|
||||||
|
str_tolower,
|
||||||
run_async,
|
run_async,
|
||||||
ask,
|
ask,
|
||||||
|
alert,
|
||||||
file_test,
|
file_test,
|
||||||
window_center_on_screen,
|
window_center_on_screen,
|
||||||
FILE_TEST_IS_REGULAR,
|
FILE_TEST_IS_REGULAR,
|
||||||
@ -135,8 +138,8 @@ static void unique_by_basename(StringList& lst) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void entry_list_run_clear(DialogEntryList& l, bool run) {
|
static void entry_list_run_clear(DialogEntryList& l, bool run) {
|
||||||
DialogEntryListIter dit = l.begin(), dit_end = l.end();
|
DialogEntryListIter dit = l.begin(), dite = l.end();
|
||||||
for(; dit != dit_end; ++dit) {
|
for(; dit != dite; ++dit) {
|
||||||
if(run)
|
if(run)
|
||||||
AUTOSTART_RUN((*dit)->exec.c_str());
|
AUTOSTART_RUN((*dit)->exec.c_str());
|
||||||
delete *dit;
|
delete *dit;
|
||||||
@ -188,8 +191,8 @@ static void run_autostart_dialog(DialogEntryList& l) {
|
|||||||
txt->align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT | FL_ALIGN_WRAP);
|
txt->align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT | FL_ALIGN_WRAP);
|
||||||
cbrowser = new Fl_Check_Browser(10, 75, 350, 185);
|
cbrowser = new Fl_Check_Browser(10, 75, 350, 185);
|
||||||
|
|
||||||
DialogEntryListIter it = l.begin(), it_end = l.end();
|
DialogEntryListIter it = l.begin(), ite = l.end();
|
||||||
for(; it != it_end; ++it) {
|
for(; it != ite; ++it) {
|
||||||
if((*it)->comment.empty())
|
if((*it)->comment.empty())
|
||||||
cbrowser->add((*it)->name.c_str());
|
cbrowser->add((*it)->name.c_str());
|
||||||
else {
|
else {
|
||||||
@ -222,13 +225,13 @@ static void perform_autostart(bool safe) {
|
|||||||
adir += AUTOSTART_DIRNAME;
|
adir += AUTOSTART_DIRNAME;
|
||||||
|
|
||||||
StringList dfiles, sysdirs, tmp;
|
StringList dfiles, sysdirs, tmp;
|
||||||
StringListIter it, it_end, tmp_it, tmp_it_end;
|
StringListIter it, ite, tmp_it, tmp_ite;
|
||||||
|
|
||||||
dir_list(adir.c_str(), dfiles, true);
|
dir_list(adir.c_str(), dfiles, true);
|
||||||
|
|
||||||
system_config_dirs(sysdirs);
|
system_config_dirs(sysdirs);
|
||||||
if(!sysdirs.empty()) {
|
if(!sysdirs.empty()) {
|
||||||
for(it = sysdirs.begin(), it_end = sysdirs.end(); it != it_end; ++it) {
|
for(it = sysdirs.begin(), ite = sysdirs.end(); it != ite; ++it) {
|
||||||
*it += AUTOSTART_DIRNAME;
|
*it += AUTOSTART_DIRNAME;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -237,22 +240,18 @@ static void perform_autostart(bool safe) {
|
|||||||
* probably via merge() member
|
* probably via merge() member
|
||||||
*/
|
*/
|
||||||
dir_list((*it).c_str(), tmp, true);
|
dir_list((*it).c_str(), tmp, true);
|
||||||
for(tmp_it = tmp.begin(), tmp_it_end = tmp.end(); tmp_it != tmp_it_end; ++tmp_it)
|
for(tmp_it = tmp.begin(), tmp_ite = tmp.end(); tmp_it != tmp_ite; ++tmp_it)
|
||||||
dfiles.push_back(*tmp_it);
|
dfiles.push_back(*tmp_it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(dfiles.empty())
|
if(dfiles.empty()) return;
|
||||||
return;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Remove duplicates where first one seen have priority to be keept.
|
* Remove duplicates where first one seen have priority to be keept. This way is required by spec.
|
||||||
* This way is required by spec.
|
|
||||||
*
|
*
|
||||||
* Also handle this case (noted in spec):
|
* Also handle this case (noted in spec): * if $XDG_CONFIG_HOME/autostart/foo.desktop and $XDG_CONFIG_DIRS/autostart/foo.desktop
|
||||||
* if $XDG_CONFIG_HOME/autostart/foo.desktop and $XDG_CONFIG_DIRS/autostart/foo.desktop
|
* exists, but $XDG_CONFIG_HOME/autostart/foo.desktop have 'Hidden = true', * $XDG_CONFIG_DIRS/autostart/foo.autostart is ignored too.
|
||||||
* exists, but $XDG_CONFIG_HOME/autostart/foo.desktop have 'Hidden = true',
|
|
||||||
* $XDG_CONFIG_DIRS/autostart/foo.autostart is ignored too.
|
|
||||||
*
|
*
|
||||||
* Later is implied via unique_by_basename().
|
* Later is implied via unique_by_basename().
|
||||||
*/
|
*/
|
||||||
@ -263,7 +262,7 @@ static void perform_autostart(bool safe) {
|
|||||||
DesktopFile df;
|
DesktopFile df;
|
||||||
DialogEntryList entry_list;
|
DialogEntryList entry_list;
|
||||||
|
|
||||||
for(it = dfiles.begin(), it_end = dfiles.end(); it != it_end; ++it) {
|
for(it = dfiles.begin(), ite = dfiles.end(); it != ite; ++it) {
|
||||||
if((*it).empty())
|
if((*it).empty())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -277,11 +276,22 @@ static void perform_autostart(bool safe) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* files marked as hidden must be skipped */
|
/* obey to OnlyShowIn rule */
|
||||||
if(df.hidden())
|
if(df.only_show_in(buf, sizeof(buf))) {
|
||||||
|
str_tolower((unsigned char*)buf);
|
||||||
|
if(strstr(buf, "ede") == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if(!df.exec(buf, sizeof(buf)))
|
/* obey to NotShowIn rule */
|
||||||
|
if(df.not_show_in(buf, sizeof(buf))) {
|
||||||
|
str_tolower((unsigned char*)buf);
|
||||||
|
if(strstr(buf, "ede") != NULL)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* files marked as hidden must be skipped */
|
||||||
|
if(df.hidden() || !df.exec(buf, sizeof(buf)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
DialogEntry* en = new DialogEntry;
|
DialogEntry* en = new DialogEntry;
|
||||||
@ -321,8 +331,11 @@ static void perform_autostart_scripts(const char* dir) {
|
|||||||
"Would you like to start them?"), dir))
|
"Would you like to start them?"), dir))
|
||||||
{
|
{
|
||||||
/* spec said how we must chdir to the root of the medium */
|
/* spec said how we must chdir to the root of the medium */
|
||||||
chdir(dir);
|
errno = 0;
|
||||||
|
if(chdir(dir) == 0)
|
||||||
AUTOSTART_RUN(path);
|
AUTOSTART_RUN(path);
|
||||||
|
else
|
||||||
|
alert(_("Unable to change folder: %s"), strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we only match the one file */
|
/* we only match the one file */
|
||||||
|
Loading…
Reference in New Issue
Block a user