123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- #!/bin/php
- <?php
- /*
- 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 3 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, see <http://www.gnu.org/licenses/>.
- */
- const N="\n";
- const SNAME='xstoxfces';
- const SVERS='0.1.3';
- $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»);
- in addition, it can optionally exclude screensavers and preserve their
- configuration (that is, their arguments) according to an xscreensaver’s
- user configuration file («$HOME/.xscreensaver» by default).
- 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;
- if (@file_put_contents($ofp,$cont)===false)
- fwrite(STDERR,'Warning: trying to add «'.$xml['name'].'», could not write into «'.$ofp.'».'.N);
- else
- echo('Added «'.$xml['name'].'»'.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);
- ?>
|