本文适用于想把自己收藏的图片放到系统目录中的同学,因为如果直接把图片放系统目录中,在设置界面中是看不到新添加的图片的。
环境及相关目录文件说明:
系统:centos7(这个应该不是重点,基本所有的系统应该都适用的)。
linux默认背景图片存放位置:/usr/share/backgrounds/gnome目录
背景图片的配置文件目录:/usr/share/gnome-background-properties
用于生成配置的脚本文件名:create_back_ground.sh
简单介绍:
用以识别出背景图片的配置文件目录:/usr/share/gnome-background-properties,系统自带的背景图片都在该目录的gnome-backgrounds.xml文件中有登记。我们可以按照相应的格式,创建新的配置文件,添加自己收藏图片的相关定义。下面会提供一个脚本,用于生成这种文件。
示例:
在/usr/share/backgrounds/目录中创建一个文件夹,比如Wallpapers,把自己收藏的图片放到这个文件夹中,然后执行./create_back_ground.sh /usr/share/backgrounds/Wallpapers > windows.xml,生成配置文件。本示例中从windows系统中拷贝相关图片,你也可以从mac中拷贝壁纸,放到Wallpaper目录中。然后把生成的windows.xml文件移动到/usr/share/gnome-background-properties目录中,之后打开系统设置,就应该可以找到新添加的图片了。
用到的脚本create_back_ground.sh:
#!/bin/bash
if [ $# -ge 1 ];then
paths=$1
length=`expr length $paths`
endwith=`echo $paths |cut -c $length-$length`
if [ ! $endwith = "/" ];then
paths=$paths/
fi
else
paths="/usr/share/backgrounds/gnome/"
fi
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
echo "<!DOCTYPE wallpapers SYSTEM \"gnome-wp-list.dtd\">"
echo -n "<wallpapers>"
for i in $paths* ;do
fnamext=`basename $i`
ext=`echo $fnamext |awk -F \. '{print $NF}'`
fname=`basename $i .$ext`
echo -n "
<wallpaper deleted=\"false\">
<name>$fname</name>
<name xml:lang=\"en_GB\">$fname</name>
<name xml:lang=\"zh_CN\">$fname</name>
<filename>$paths$fnamext</filename>
<options>zoom</options>
<pcolor>#ffffff</pcolor>
<scolor>#000000</scolor>
</wallpaper>"
done
echo ""
echo "</wallpapers>"
如果不指定目录,默认根据/usr/share/backgrounds/gnome目录中的图片,生成配置文件。
脚本自适应扩展名,如果你放一个*.txt的文档,脚本同样会生成相关记录,这肯定不是你想要的,所以要避免放非图片格式到相应文件夹中。
目录要使用绝对路径指定。
如果有需要设置动态切换壁纸,可以修改/usr/share/backgrounds/default.xml文件,指定在那些图片中切换,及持续时间。我们可以用来指定上午、下午和晚上使用的桌面背景,以适应环境,还是很不错的。同样完成之后,可以在系统设置界面中,选择设定的自动切换方案。右下角带有时钟图标,说明选中后,会根据时间变化自动更新壁纸,如图:
另附一个C语言实现的小程序,功能、用法和脚本完全相同,需要在linux系统中编译,大致计算了下运算时间,比脚本要快35倍左右。
#include <stdio.h>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/types.h>
typedef struct name_ext{
char* name;
char* ext;
}name_ext;
char* path;
name_ext* splitstr(const char* str)
{
if(str[0] == '.' || strlen(str)<=2)
return NULL;
int len,sublen,n;
name_ext* basic=(name_ext*)malloc(sizeof(name_ext));
basic->ext=rindex(str,'.');
if(basic->ext == NULL)
return NULL;
else{
len=strlen(str);
sublen=strlen(basic->ext);
n=len-sublen;
basic->name=(char*)malloc(n+1);
strncpy(basic->name,str,n);
basic->name[++n]='\0';
return basic;
}
return NULL;
}
void formatdata(name_ext* afile)
{
printf(" <wallpaper deleted=\"false\">\n");
printf("\t<name>%s</name>\n",afile->name);
printf("\t<name xml:lang=\"en_GB\">%s</name>\n",afile->name);
printf("\t<name xml:lang=\"zh_CN\">%s</name>\n",afile->name);
printf("\t<filename>%s%s%s</filename>\n",path,afile->name,afile->ext);
printf("\t<options>zoom</options>\n");
printf("\t<pcolor>#ffffff</pcolor>\n");
printf("\t<scolor>#000000</scolor>\n");
printf(" </wallpaper>\n");
}
int main(int argc,char* argv[])
{
char* newpath;
name_ext* af;
struct dirent *dircontent;
if(argc >= 2)
path=argv[1];
else
path="/usr/share/backgrounds/gnome/";
int length=strlen(path);
if(path[length-1] != '/'){
newpath=(char*)malloc(length+1);
strcpy(newpath,path);
path=strcat(newpath,"/");
}
DIR* dir=opendir(path);
if(dir == NULL){
if(newpath)free(newpath);
return;
}
printf("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
printf("<!DOCTYPE wallpapers SYSTEM \"gnome-wp-list.dtd\">\n");
printf("<wallpapers>\n");
while(dircontent=readdir(dir))
{
af=splitstr(dircontent->d_name);
if(af){
formatdata(af);
free(af->name);
}
}
printf("</wallpapers>\n");
closedir(dir);
if(newpath)free(newpath);
return 0;
}
所有评论(0)