#!/usr/bin/perl -w
-# Copyright © 2008-2016 Jamie Zawinski <jwz@jwz.org>
+# Copyright © 2008-2017 Jamie Zawinski <jwz@jwz.org>
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
use strict;
my $progname = $0; $progname =~ s@.*/@@g;
-my ($version) = ('$Revision: 1.21 $' =~ m/\s(\d[.\d]+)\s/s);
+my ($version) = ('$Revision: 1.24 $' =~ m/\s(\d[.\d]+)\s/s);
my $verbose = 0;
my $debug_p = 0;
return (\%res_to_val, \%switch_to_res);
}
+my %video_dups;
+
# Returns a list of:
# "resource = default value"
# or "resource != non-default value"
$res = $res2;
$ctrl->{resource} = $res;
- $ctrl->{convert} = 'invert' if ($val =~ m/false/i);
+ $ctrl->{convert} = 'invert' if ($val =~ m/off|false|no/i);
$ctrl->{default} = ($ctrl->{convert} ? 'true' : 'false');
# $val = ($set ? "$res != $val" : "$res = $val");
# error ("$file: no video") unless $video;
print STDERR "\n$file: WARNING: no video\n\n" unless $video;
+ if ($video && $video_dups{$video} &&
+ $video_dups{$video} ne $saver_title) {
+ print STDERR "\n$file: WARNING: $saver_title: dup video with " .
+ $video_dups{$video} . "\n";
+ }
+ $video_dups{$video} = $saver_title if ($video);
+
return ($saver_title, $gl_p, \@result, \@widgets);
}
my $xml_header = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
my $manifest = '';
+ my $daydream_java = '';
+ my $settings_java = '';
+ my $wallpaper_java = '';
+ my $fntable_h2 = '';
+ my $fntable_h3 = '';
my $arrays = '';
my $strings = '';
my %write_files;
my ($saver_title, $gl_p, $xml_opts, $widgets) =
parse_xml ($saver, $switchmap, $src_opts);
- my $daydream_class = "${saver_title}Daydream";
- my $settings_class = "${saver_title}Settings";
- foreach ($settings_class, $daydream_class) {
- s/\s+//gs;
- s/^([a-z])/\U$1/gs; # upcase first letter
- }
+ my $saver_class = "${saver_title}";
+ $saver_class =~ s/\s+//gs;
+ $saver_class =~ s/^([a-z])/\U$1/gs; # upcase first letter
$saver_title =~ s/(.[a-z])([A-Z\d])/$1 $2/gs; # Spaces in InterCaps
$saver_title =~ s/^(GL|RD)[- ]?(.)/$1 \U$2/gs; # Space after "GL"
" android:summary=\"" .
$localize0->("${saver_underscore}_saver_desc",
$daydream_desc) . "\"\n" .
- " android:name=\".gen.$daydream_class\"\n" .
+ " android:name=\".gen.Daydream\$$saver_class\"\n" .
" android:permission=\"android.permission" .
".BIND_DREAM_SERVICE\"\n" .
" android:exported=\"true\"\n" .
" <meta-data android:name=\"android.service.dream\"\n" .
" android:resource=\"\@xml/${saver}_dream\" />\n" .
"</service>\n" .
- "<activity android:name=\"" .
- "$package.gen.$settings_class\" />\n"
+ "<service android:label=\"" .
+ $localize0->("${saver_underscore}_saver_title",
+ $saver_title) .
+ "\"\n" .
+ " android:summary=\"" .
+ $localize0->("${saver_underscore}_saver_desc",
+ $daydream_desc) . "\"\n" .
+ " android:name=\".gen.Wallpaper\$$saver_class\"\n" .
+ " android:permission=\"android.permission" .
+ ".BIND_WALLPAPER\">\n" .
+ " <intent-filter>\n" .
+ " <action android:name=\"android.service.wallpaper" .
+ ".WallpaperService\" />\n" .
+ " <category android:name=\"android.intent.category" .
+ ".DEFAULT\" />\n" . # TODO: Is the DEFAULT category needed?
+ " </intent-filter>\n" .
+ " <meta-data android:name=\"android.service.wallpaper\"\n" .
+ " android:resource=\"\@xml/${saver}_wallpaper\" />\n" .
+ "</service>\n" .
+ "<activity android:label=\"" .
+ $localize0->("${saver}_settings_title", $heading) . "\"\n" .
+ " android:name=\"$package.gen.Settings\$$saver_class\"\n" .
+ " android:exported=\"true\">\n" .
+ "</activity>\n"
);
my $dream = ("<dream xmlns:android=\"" .
"http://schemas.android.com/apk/res/android\"\n" .
" android:settingsActivity=\"" .
- "$package.gen.$settings_class\" />\n");
+ "$package.gen.Settings\$$saver_class\" />\n");
$write_files{"$xml_dir/${saver_underscore}_dream.xml"} = $dream;
- $write_files{"$java_dir/$daydream_class.java"} =
- read_template ("XScreenSaverDaydream.java.in",
- { CLASS => $daydream_class,
- API => ($gl_p ? 'GL' : 'XLIB') });
-
- $write_files{"$java_dir/$settings_class.java"} =
- read_template ("XScreenSaverSettings.java.in",
- { CLASS => $settings_class });
+ my $wallpaper = ("<wallpaper xmlns:android=\"" .
+ "http://schemas.android.com/apk/res/android\"\n" .
+ " android:settingsActivity=\"" .
+ "$package.gen.Settings\$$saver_class\"\n" .
+ " android:thumbnail=\"\@drawable/${saver_underscore}\" />\n");
+ $write_files{"$xml_dir/${saver_underscore}_wallpaper.xml"} = $wallpaper;
+
+ $daydream_java .=
+ (" public static class $saver_class extends XScreenSaverDaydream {\n" .
+ " }\n" .
+ "\n");
+
+ $wallpaper_java .=
+ (" public static class $saver_class extends XScreenSaverWallpaper {\n" .
+ " }\n" .
+ "\n");
+
+ $settings_java .=
+ (" public static class $saver_class extends XScreenSaverSettings\n" .
+ " implements SharedPreferences.OnSharedPreferenceChangeListener {\n" .
+ " }\n" .
+ "\n");
+
+ $fntable_h2 .= ",\n " if $fntable_h2 ne '';
+ $fntable_h3 .= ",\n " if $fntable_h3 ne '';
+
+ $fntable_h2 .= "${saver}_xscreensaver_function_table";
+ $fntable_h3 .= "{\"${saver}\", &${saver}_xscreensaver_function_table, " .
+ 'API_' . ($gl_p ? 'GL' : 'XLIB') . '}';
}
$arrays =~ s/^/ /gm;
" </application>\n" .
"</manifest>\n");
+ $daydream_java = ("package org.jwz.xscreensaver.gen;\n" .
+ "\n" .
+ "import org.jwz.xscreensaver.XScreenSaverDaydream;\n" .
+ "import org.jwz.xscreensaver.jwxyz;\n" .
+ "\n" .
+ "public class Daydream {\n" .
+ $daydream_java .
+ "}\n");
+
+ $wallpaper_java = ("package org.jwz.xscreensaver.gen;\n" .
+ "\n" .
+ "import org.jwz.xscreensaver.XScreenSaverWallpaper;\n" .
+ "import org.jwz.xscreensaver.jwxyz;\n" .
+ "\n" .
+ "public class Wallpaper {\n" .
+ $wallpaper_java .
+ "}\n");
+
+ $settings_java = ("package org.jwz.xscreensaver.gen;\n" .
+ "\n" .
+ "import android.content.SharedPreferences;\n" .
+ "import org.jwz.xscreensaver.XScreenSaverSettings;\n" .
+ "\n" .
+ "public class Settings {\n" .
+ $settings_java .
+ "}\n");
+
$write_files{"$project_dir/AndroidManifest.xml"} = $manifest;
$write_files{"$values_dir/settings.xml"} = $arrays;
$write_files{"$values_dir/strings.xml"} = $strings;
-
- my @s2 = ();
- foreach my $saver (sort @savers) {
- push @s2, $saver unless ($saver =~ m/(-helper)$/);
- }
- my @s3 = @s2;
-
- foreach (@s2) { s/^(.*)$/${1}_xscreensaver_function_table/s; }
- foreach (@s3) { s/^(.*)$/{"$1", &${1}_xscreensaver_function_table}/s; }
+ $write_files{"$java_dir/Daydream.java"} = $daydream_java;
+ $write_files{"$java_dir/Wallpaper.java"} = $wallpaper_java;
+ $write_files{"$java_dir/Settings.java"} = $settings_java;
my $fntable_h = ("extern struct xscreensaver_function_table\n" .
- " " . join(",\n ", @s2) . ";\n" .
+ " " . $fntable_h2 . ";\n" .
"\n" .
"static const struct function_table_entry" .
" function_table[] = {\n" .
- " " . join(",\n ", @s3) . "\n" .
+ " " . $fntable_h3 . "\n" .
"};\n");
$write_files{"$gen_dir/function-table.h"} = $fntable_h;
# if a hack is removed from $ANDROID_HACKS in android/Makefile but
# the old XML files remain behind, the build blows up.
#
- opendir (my $dirp, $xml_dir) || error ("$xml_dir: $!");
- my @files = readdir ($dirp);
- closedir $dirp;
- foreach my $f (sort @files) {
- next if ($f eq '.' || $f eq '..');
- $f = "$xml_dir/$f";
- next if (defined ($write_files{$f}));
- if ($f =~ m/_(settings|dream)\.xml$/s) {
- print STDERR "$progname: rm $f\n";
- unlink ($f) unless ($debug_p);
- } else {
- print STDERR "$progname: warning: unrecognised file: $f\n";
+ foreach my $dd ($xml_dir, $gen_dir, $java_dir) {
+ opendir (my $dirp, $dd) || error ("$dd: $!");
+ my @files = readdir ($dirp);
+ closedir $dirp;
+ foreach my $f (sort @files) {
+ next if ($f eq '.' || $f eq '..');
+ $f = "$dd/$f";
+ next if (defined ($write_files{$f}));
+ if ($f =~ m/_(settings|wallpaper|dream)\.xml$/s ||
+ $f =~ m/(Settings|Daydream)\.java$/s) {
+ print STDERR "$progname: rm $f\n";
+ unlink ($f) unless ($debug_p);
+ } else {
+ print STDERR "$progname: warning: unrecognised file: $f\n";
+ }
}
}
}