First commit
This commit is contained in:
commit
47aea394ea
2 changed files with 352 additions and 0 deletions
77
README.md
Normal file
77
README.md
Normal file
|
@ -0,0 +1,77 @@
|
|||
```text
|
||||
SYNOPSIS
|
||||
|
||||
xstoxfces [options]
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
This is xstoxfces v0.1, a CLI php script that makes xscreensaver’s
|
||||
screensavers available to «Xfce screensaver»’s users.
|
||||
Currently, «Xfce screensaver» supports xscreensaver’s screensavers, but does
|
||||
not automatically make them available to users. This script just converts
|
||||
xscreensaver’s screensavers «.xml» definition files to «.desktop» files and
|
||||
saves these «.desktop» files in a directory where «Xfce screensaver» will
|
||||
consider them (by default «$HOME/.local/share/applications/screensavers»).
|
||||
|
||||
OPTIONS
|
||||
|
||||
-h, --help
|
||||
Show this help text and exit.
|
||||
|
||||
-p, --preserve_xscreensaver_exclusions
|
||||
With this option xstoxfces will exclude those screensavers which the user
|
||||
may have excluded using xscreensaver-settings’s «Random Screen Saver»
|
||||
option, by detecting them from xscreensaver’s user configuration file
|
||||
(«$HOME/.xscreensaver» by default).
|
||||
|
||||
-P, --preserve_xscreensaver_arguments
|
||||
With this option xstoxfces will preserve every screensaver’s arguments which
|
||||
the user may have set using xscreensaver-settings, by detecting them from
|
||||
xscreensaver’s user configuration file («$HOME/.xscreensaver» by default).
|
||||
|
||||
-C, --xscreensaver_user_conf_file <file path>
|
||||
If xstoxfces is invoked with «--preserve_xscreensaver_exclusions»
|
||||
or «--preserve_xscreensaver_arguments» (see the previous two options’
|
||||
descriptions), it will try to automatically detect xscreensaver’s user
|
||||
configuration file’s path («$HOME/.xscreensaver» by default). If it fails,
|
||||
or if you want to specify a different xscreensaver configuration file, you
|
||||
can do it explicitly with this option.
|
||||
|
||||
-c, --xscreensaver_conf_dir <directory path>
|
||||
With this option you can explicitly specify the xscreensaver configuration
|
||||
directory, that is the system directory where xscreensaver stores all the
|
||||
«.xml» files defining its screensavers.
|
||||
DEFAULT: «/usr/share/xscreensaver/config»
|
||||
|
||||
-e, --xscreensaver_exec_dir <directory path>
|
||||
With this option you can explicitly specify the xscreensaver executables
|
||||
directory, that is the system directory where xscreensaver stores all its
|
||||
screensavers’ executable files.
|
||||
DEFAULT: «/usr/lib/xscreensaver»
|
||||
|
||||
-d, --xfce_screensaver_desktop_files_dir <directory path>
|
||||
With this option you can explicitly specify xstoxfces’s «output directory»
|
||||
path, that should be the path to a directory where «Xfce screensaver» expects
|
||||
to find «.desktop» files defining screensavers (by default
|
||||
«$HOME/.local/share/applications/screensavers»).
|
||||
|
||||
NOTES
|
||||
|
||||
You can use xstoxfces to make xscreensaver’s screensavers available to every
|
||||
user of «Xfce screensaver» by running xstoxfces as root and setting
|
||||
«--xfce_screensaver_desktop_files_dir» (see above) to the system directory
|
||||
where «Xfce screensaver» expects to find the «.desktop» files defining all the
|
||||
screensavers and their configurations (usually
|
||||
«usr/share/applications/screensavers»).
|
||||
|
||||
EXIT VALUES
|
||||
|
||||
0: regular run
|
||||
1: fatal error
|
||||
|
||||
DISCLAIMER AND LICENSE
|
||||
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details see the source.
|
||||
This is free software, and you are welcome to redistribute it under certain
|
||||
conditions; see <http://www.gnu.org/licenses/> for details.
|
||||
```
|
275
xstoxfces
Executable file
275
xstoxfces
Executable file
|
@ -0,0 +1,275 @@
|
|||
#!/bin/php
|
||||
<?php
|
||||
|
||||
const N="\n";
|
||||
const SNAME='xstoxfces';
|
||||
const SVERS='0.1';
|
||||
|
||||
$opts=[
|
||||
'xscreensaver_user_conf_file'=>null,
|
||||
'xscreensaver_conf_dir'=>'/usr/share/xscreensaver/config',
|
||||
'xscreensaver_exec_dir'=>'/usr/lib/xscreensaver',
|
||||
'xfce_screensaver_desktop_files_dir'=>null,
|
||||
'preserve_xscreensaver_exclusions'=>false,
|
||||
'preserve_xscreensaver_arguments'=>false
|
||||
];
|
||||
|
||||
$help=
|
||||
'SYNOPSIS
|
||||
|
||||
'.SNAME.' [options]
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
This is '.SNAME.' v'.SVERS.', a CLI php script that makes xscreensaver’s
|
||||
screensavers available to «Xfce screensaver»’s users.
|
||||
Currently, «Xfce screensaver» supports xscreensaver’s screensavers, but does
|
||||
not automatically make them available to users. This script just converts
|
||||
xscreensaver’s screensavers «.xml» definition files to «.desktop» files and
|
||||
saves these «.desktop» files in a directory where «Xfce screensaver» will
|
||||
consider them (by default «$HOME/.local/share/applications/screensavers»).
|
||||
|
||||
OPTIONS
|
||||
|
||||
-h, --help
|
||||
Show this help text and exit.
|
||||
|
||||
-p, --preserve_xscreensaver_exclusions
|
||||
With this option '.SNAME.' will exclude those screensavers which the user
|
||||
may have excluded using xscreensaver-settings’s «Random Screen Saver»
|
||||
option, by detecting them from xscreensaver’s user configuration file
|
||||
(«$HOME/.xscreensaver» by default).
|
||||
|
||||
-P, --preserve_xscreensaver_arguments
|
||||
With this option '.SNAME.' will preserve every screensaver’s arguments which
|
||||
the user may have set using xscreensaver-settings, by detecting them from
|
||||
xscreensaver’s user configuration file («$HOME/.xscreensaver» by default).
|
||||
|
||||
-C, --xscreensaver_user_conf_file <file path>
|
||||
If '.SNAME.' is invoked with «--preserve_xscreensaver_exclusions»
|
||||
or «--preserve_xscreensaver_arguments» (see the previous two options’
|
||||
descriptions), it will try to automatically detect xscreensaver’s user
|
||||
configuration file’s path («$HOME/.xscreensaver» by default). If it fails,
|
||||
or if you want to specify a different xscreensaver configuration file, you
|
||||
can do it explicitly with this option.
|
||||
|
||||
-c, --xscreensaver_conf_dir <directory path>
|
||||
With this option you can explicitly specify the xscreensaver configuration
|
||||
directory, that is the system directory where xscreensaver stores all the
|
||||
«.xml» files defining its screensavers.
|
||||
DEFAULT: «'.$opts['xscreensaver_conf_dir'].'»
|
||||
|
||||
-e, --xscreensaver_exec_dir <directory path>
|
||||
With this option you can explicitly specify the xscreensaver executables
|
||||
directory, that is the system directory where xscreensaver stores all its
|
||||
screensavers’ executable files.
|
||||
DEFAULT: «'.$opts['xscreensaver_exec_dir'].'»
|
||||
|
||||
-d, --xfce_screensaver_desktop_files_dir <directory path>
|
||||
With this option you can explicitly specify '.SNAME.'’s «output directory»
|
||||
path, that should be the path to a directory where «Xfce screensaver» expects
|
||||
to find «.desktop» files defining screensavers (by default
|
||||
«$HOME/.local/share/applications/screensavers»).
|
||||
|
||||
NOTES
|
||||
|
||||
You can use '.SNAME.' to make xscreensaver’s screensavers available to every
|
||||
user of «Xfce screensaver» by running '.SNAME.' as root and setting
|
||||
«--xfce_screensaver_desktop_files_dir» (see above) to the system directory
|
||||
where «Xfce screensaver» expects to find the «.desktop» files defining all the
|
||||
screensavers and their configurations (usually
|
||||
«usr/share/applications/screensavers»).
|
||||
|
||||
EXIT VALUES
|
||||
|
||||
0: regular run
|
||||
1: fatal error
|
||||
|
||||
DISCLAIMER AND LICENSE
|
||||
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details see the source.
|
||||
This is free software, and you are welcome to redistribute it under certain
|
||||
conditions; see <http://www.gnu.org/licenses/> for details.'.N;
|
||||
|
||||
/*$chome=getenv('XDG_CONFIG_HOME',true);
|
||||
echo($chome.N);*/
|
||||
|
||||
for ($i=1; $i<$argc; $i++) {
|
||||
if ($argv[$i][0]=='-') {
|
||||
switch ($argv[$i]) {
|
||||
case '--makereadme':
|
||||
file_put_contents(__DIR__.'/README.md','```text'.N.$help.'```'.N);
|
||||
exit(0);
|
||||
break;
|
||||
case '-h':
|
||||
case '--help':
|
||||
echo($help);
|
||||
exit(0);
|
||||
break;
|
||||
case '-C':
|
||||
case '--xscreensaver_user_conf_file':
|
||||
if (isset($argv[$i+1])) {
|
||||
$i++;
|
||||
$opts['xscreensaver_user_conf_file']=preg_replace('#^(.*)/*$#uU','$1',$argv[$i]);
|
||||
} else {
|
||||
fwrite(STDERR,'Error: option «'.$argv[$i].'» requires an argument (use «-h» or «--help» for more info).'.N);
|
||||
exit(0);
|
||||
}
|
||||
break;
|
||||
case '-c':
|
||||
case '--xscreensaver_conf_dir':
|
||||
if (isset($argv[$i+1])) {
|
||||
$i++;
|
||||
$opts['xscreensaver_conf_dir']=preg_replace('#^(.*)/*$#uU','$1',$argv[$i]);
|
||||
} else {
|
||||
fwrite(STDERR,'Error: option «'.$argv[$i].'» requires an argument (use «-h» or «--help» for more info).'.N);
|
||||
exit(0);
|
||||
}
|
||||
break;
|
||||
case '-e':
|
||||
case '--xscreensaver_exec_dir':
|
||||
if (isset($argv[$i+1])) {
|
||||
$i++;
|
||||
$opts['xscreensaver_exec_dir']=preg_replace('#^(.*)/*$#uU','$1',$argv[$i]);
|
||||
} else {
|
||||
fwrite(STDERR,'Error: option «'.$argv[$i].'» requires an argument (use «-h» or «--help» for more info).'.N);
|
||||
exit(0);
|
||||
}
|
||||
break;
|
||||
case '-d':
|
||||
case '--xfce_screensaver_desktop_files_dir':
|
||||
if (isset($argv[$i+1])) {
|
||||
$i++;
|
||||
$opts['xfce_screensaver_desktop_files_dir']=preg_replace('#^(.*)/*$#uU','$1',$argv[$i]);
|
||||
} else {
|
||||
fwrite(STDERR,'Error: option «'.$argv[$i].'» requires an argument (use «-h» or «--help» for more info).'.N);
|
||||
exit(0);
|
||||
}
|
||||
break;
|
||||
case '-p':
|
||||
case '--preserve_xscreensaver_exclusions':
|
||||
$opts['preserve_xscreensaver_exclusions']=true;
|
||||
break;
|
||||
case '-P':
|
||||
case '--preserve_xscreensaver_arguments':
|
||||
$opts['preserve_xscreensaver_arguments']=true;
|
||||
break;
|
||||
default:
|
||||
fwrite(STDERR,'Error: «'.$argv[$i].'» is not a valid option.'.N);
|
||||
exit(1);
|
||||
}
|
||||
} else {
|
||||
fwrite(STDERR,'Error: «'.$argv[$i].'» is not a valid option.'.N);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
//print_r($opts); exit(0);
|
||||
|
||||
if (is_null($opts['xfce_screensaver_desktop_files_dir'])) {
|
||||
$home=@getenv('HOME');
|
||||
if ($home===false) {
|
||||
fwrite(STDERR,'Error: could not get «HOME» environment variable, you’ll have to specify «xfce_screensaver_desktop_files_dir» by yourself (use «-h» or «--help» for more info).'.N);
|
||||
exit(1);
|
||||
} else {
|
||||
$opts['xfce_screensaver_desktop_files_dir']=$home.'/.local/share/applications/screensavers';
|
||||
}
|
||||
}
|
||||
|
||||
if (is_null($opts['xscreensaver_user_conf_file']) && ($opts['preserve_xscreensaver_exclusions'] || $opts['preserve_xscreensaver_arguments'])) {
|
||||
$home=@getenv('HOME');
|
||||
if ($home===false) {
|
||||
fwrite(STDERR,'Error: could not get «HOME» environment variable, you’ll have to specify «xscreensaver_user_conf_file» by yourself (use «-h» or «--help» for more info).'.N);
|
||||
exit(1);
|
||||
} else {
|
||||
$opts['xscreensaver_user_conf_file']=$home.'/.xscreensaver';
|
||||
}
|
||||
}
|
||||
|
||||
if ($opts['preserve_xscreensaver_exclusions'] || $opts['preserve_xscreensaver_arguments']) {
|
||||
$buff=@file($opts['xscreensaver_user_conf_file'],FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
|
||||
if ($buff===false) {
|
||||
fwrite(STDERR,'Error: could not open «'.$opts['xscreensaver_user_conf_file'].'».'.N);
|
||||
exit(1);
|
||||
}
|
||||
$xscrs=[];
|
||||
$i=0;
|
||||
$c=count($buff);
|
||||
while ($i<$c) {
|
||||
if (preg_match('/^([\-\d\S ]+)?\t{4}([\S\d \-_]+)\s+(\\\n)?\\\$/uU',$buff[$i],$matches)===1) {
|
||||
//print_r($matches);
|
||||
$cmd=$matches[2];
|
||||
//echo($cmd.'|'.N);
|
||||
($matches[1]!='' && $matches[1][0]==='-') ? $active=false : $active=true;
|
||||
preg_match('/^(\S+).*$/',$matches[2],$matches);
|
||||
//print_r($matches);
|
||||
$fn=$matches[1];
|
||||
//echo($buff[$i].N);
|
||||
//echo($matches[2].N);
|
||||
while (substr($buff[$i],-3)!=="\\n\\") {
|
||||
$i++;
|
||||
//echo('`-> '.$buff[$i].N);
|
||||
preg_match('/^\s+([\S\d \-_]+)\s+.*$/u',$buff[$i],$matches);
|
||||
//print_r($matches);
|
||||
$cmd.=' '.$matches[1];
|
||||
}
|
||||
$xscrs[$fn]=['cmd'=>$cmd,'active'=>$active];
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
//print_r($xscrs);
|
||||
}
|
||||
|
||||
$dh=@opendir($opts['xscreensaver_conf_dir']);
|
||||
|
||||
if ($dh===false) {
|
||||
fwrite(STDERR,'Error: could not open «'.$opts['xscreensaver_conf_dir'].'».'.N);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!file_exists($opts['xfce_screensaver_desktop_files_dir'])) {
|
||||
if (mkdir($opts['xfce_screensaver_desktop_files_dir'],0755,true)===false) {
|
||||
fwrite(STDERR,'Error: could not create «'.$opts['xfce_screensaver_desktop_files_dir'].'».'.N);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
while (($fp=readdir($dh))!==false) {
|
||||
if (preg_match('/.xml$/iu',$fp)===1) {
|
||||
$fp=$opts['xscreensaver_conf_dir'].'/'.$fp;
|
||||
$xml=@simplexml_load_file($fp);
|
||||
if ($xml!==false) {
|
||||
if (isset($xml['name']) && isset($xml['_label']) && isset($xml->command['arg'])) {
|
||||
$ofp=$opts['xfce_screensaver_desktop_files_dir'].'/'.$xml['name'].'.desktop';
|
||||
if (is_file($ofp) && @unlink($ofp)===false)
|
||||
fwrite(STDERR,'Warning: could not delete «'.$ofp.'».'.N);
|
||||
$cmd=$xml['name'].' '.$xml->command['arg'];
|
||||
if ($opts['preserve_xscreensaver_arguments'] && isset($xscrs[(string)$xml['name']]['cmd']))
|
||||
$cmd=$xscrs[(string)$xml['name']]['cmd'];
|
||||
if (!$opts['preserve_xscreensaver_exclusions'] || $xscrs[(string)$xml['name']]['active']) {
|
||||
$cont=
|
||||
'[Desktop Entry]
|
||||
Type=Application
|
||||
Name='.$xml['_label'].'
|
||||
TryExec='.$opts['xscreensaver_exec_dir'].'/'.$xml['name'].'
|
||||
Exec='.$opts['xscreensaver_exec_dir'].'/'.$cmd.'
|
||||
Categories=Screensaver;
|
||||
Hidden=true'.N;
|
||||
echo('Added «'.$xml['name'].'»'.N);
|
||||
if (@file_put_contents($ofp,$cont)===false)
|
||||
fwrite(STDERR,'Warning: could not write into «'.$ofp.'».'.N);
|
||||
} else {
|
||||
echo('Ignored «'.$xml['name'].'»'.N);
|
||||
}
|
||||
} else {
|
||||
fwrite(STDERR,'Warning: «'.$fp.'» does not contain one or more required info.'.N);
|
||||
}
|
||||
} else {
|
||||
fwrite(STDERR,'Warning: could not parse «'.$fp.'».'.N);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
closedir($dh);
|
||||
exit(0);
|
||||
|
||||
?>
|
Loading…
Add table
Reference in a new issue