Fossil SCM

Add audio prompts to captchas so that they can be completed by visually impaired users.

drh 2020-03-14 12:43 trunk merge
Commit dcf441077d52bae84f7a1d70c879002b71d584ff5437ceb14ec26a83bea346f2
+6 -3
--- src/alerts.c
+++ src/alerts.c
@@ -1461,11 +1461,12 @@
14611461
@ </table>
14621462
if( needCaptcha ){
14631463
@ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha">
14641464
@ %h(zCaptcha)
14651465
@ </pre>
1466
- @ Enter the 8 characters above in the "Security Code" box
1466
+ @ Enter the 8 characters above in the "Security Code" box<br/>
1467
+ captcha_speakit_button(uSeed);
14671468
@ </td></tr></table></div>
14681469
}
14691470
@ </form>
14701471
fossil_free(zErr);
14711472
style_footer();
@@ -1874,11 +1875,12 @@
18741875
@ </tr>
18751876
@ </table>
18761877
@ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha">
18771878
@ %h(zCaptcha)
18781879
@ </pre>
1879
- @ Enter the 8 characters above in the "Security Code" box
1880
+ @ Enter the 8 characters above in the "Security Code" box<br/>
1881
+ captcha_speakit_button(uSeed);
18801882
@ </td></tr></table></div>
18811883
@ </form>
18821884
fossil_free(zErr);
18831885
style_footer();
18841886
}
@@ -2620,11 +2622,12 @@
26202622
@ </table>
26212623
if( zCaptcha ){
26222624
@ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha">
26232625
@ %h(zCaptcha)
26242626
@ </pre>
2625
- @ Enter the 8 characters above in the "Security Code" box
2627
+ @ Enter the 8 characters above in the "Security Code" box<br/>
2628
+ captcha_speakit_button(uSeed);
26262629
@ </td></tr></table></div>
26272630
}
26282631
@ </form>
26292632
style_footer();
26302633
}
26312634
--- src/alerts.c
+++ src/alerts.c
@@ -1461,11 +1461,12 @@
1461 @ </table>
1462 if( needCaptcha ){
1463 @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha">
1464 @ %h(zCaptcha)
1465 @ </pre>
1466 @ Enter the 8 characters above in the "Security Code" box
 
1467 @ </td></tr></table></div>
1468 }
1469 @ </form>
1470 fossil_free(zErr);
1471 style_footer();
@@ -1874,11 +1875,12 @@
1874 @ </tr>
1875 @ </table>
1876 @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha">
1877 @ %h(zCaptcha)
1878 @ </pre>
1879 @ Enter the 8 characters above in the "Security Code" box
 
1880 @ </td></tr></table></div>
1881 @ </form>
1882 fossil_free(zErr);
1883 style_footer();
1884 }
@@ -2620,11 +2622,12 @@
2620 @ </table>
2621 if( zCaptcha ){
2622 @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha">
2623 @ %h(zCaptcha)
2624 @ </pre>
2625 @ Enter the 8 characters above in the "Security Code" box
 
2626 @ </td></tr></table></div>
2627 }
2628 @ </form>
2629 style_footer();
2630 }
2631
--- src/alerts.c
+++ src/alerts.c
@@ -1461,11 +1461,12 @@
1461 @ </table>
1462 if( needCaptcha ){
1463 @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha">
1464 @ %h(zCaptcha)
1465 @ </pre>
1466 @ Enter the 8 characters above in the "Security Code" box<br/>
1467 captcha_speakit_button(uSeed);
1468 @ </td></tr></table></div>
1469 }
1470 @ </form>
1471 fossil_free(zErr);
1472 style_footer();
@@ -1874,11 +1875,12 @@
1875 @ </tr>
1876 @ </table>
1877 @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha">
1878 @ %h(zCaptcha)
1879 @ </pre>
1880 @ Enter the 8 characters above in the "Security Code" box<br/>
1881 captcha_speakit_button(uSeed);
1882 @ </td></tr></table></div>
1883 @ </form>
1884 fossil_free(zErr);
1885 style_footer();
1886 }
@@ -2620,11 +2622,12 @@
2622 @ </table>
2623 if( zCaptcha ){
2624 @ <div class="captcha"><table class="captcha"><tr><td><pre class="captcha">
2625 @ %h(zCaptcha)
2626 @ </pre>
2627 @ Enter the 8 characters above in the "Security Code" box<br/>
2628 captcha_speakit_button(uSeed);
2629 @ </td></tr></table></div>
2630 }
2631 @ </form>
2632 style_footer();
2633 }
2634
--- src/captcha.c
+++ src/captcha.c
@@ -548,12 +548,29 @@
548548
@ <input type="hidden" name="captchaseed" value="%u(uSeed)" />
549549
@ <input type="text" name="captcha" size=8 />
550550
if( showButton ){
551551
@ <input type="submit" value="Submit">
552552
}
553
+ @ <br/>\
554
+ captcha_speakit_button(uSeed);
553555
@ </td></tr></table></div>
554556
}
557
+
558
+/*
559
+** Add a "Speak the captcha" button.
560
+*/
561
+void captcha_speakit_button(unsigned int uSeed){
562
+ @ <input type="button" value="Speak the text" id="speakthetext">
563
+ @ <audio id="spokencaptcha" src="%R/captcha-audio/%u(uSeed)" />
564
+ @ <script nonce="%h(style_nonce())">
565
+ @ var x = document.getElementById("speakthetext")
566
+ @ x.onclick = function(){
567
+ @ var audio = document.getElementById("spokencaptcha");
568
+ @ audio.play();
569
+ @ }
570
+ @ </script>
571
+}
555572
556573
/*
557574
** WEBPAGE: test-captcha
558575
** Test the captcha-generator by rendering the value of the name= query
559576
** parameter using ascii-art. If name= is omitted, show a random 16-digit
@@ -608,5 +625,74 @@
608625
captcha_generate(1);
609626
@ </form>
610627
style_footer();
611628
return 1;
612629
}
630
+
631
+/*
632
+** Generate a WAV file that reads aloud the hex digits given by
633
+** zHex.
634
+*/
635
+static void captcha_wav(const char *zHex, Blob *pOut){
636
+ int i;
637
+ const int szWavHdr = 44;
638
+ blob_init(pOut, 0, 0);
639
+ blob_resize(pOut, szWavHdr); /* Space for the WAV header */
640
+ pOut->nUsed = szWavHdr;
641
+ memset(pOut->aData, 0, szWavHdr);
642
+ if( zHex==0 || zHex[0]==0 ) zHex = "0";
643
+ for(i=0; zHex[i]; i++){
644
+ int v = hex_digit_value(zHex[i]);
645
+ int sz;
646
+ int nData;
647
+ const unsigned char *pData;
648
+ char zSoundName[50];
649
+ sqlite3_snprintf(sizeof(zSoundName),zSoundName,"sounds/%c.wav",
650
+ "0123456789abcdef"[v]);
651
+ pData = builtin_file(zSoundName, &sz);
652
+ nData = sz - szWavHdr;
653
+ blob_resize(pOut, pOut->nUsed+nData);
654
+ memcpy(pOut->aData+pOut->nUsed-nData, pData+szWavHdr, nData);
655
+ if( zHex[i+1]==0 ){
656
+ int len = pOut->nUsed + 36;
657
+ memcpy(pOut->aData, pData, szWavHdr);
658
+ pOut->aData[4] = (char)(len&0xff);
659
+ pOut->aData[5] = (char)((len>>8)&0xff);
660
+ pOut->aData[6] = (char)((len>>16)&0xff);
661
+ pOut->aData[7] = (char)((len>>24)&0xff);
662
+ len = pOut->nUsed;
663
+ pOut->aData[40] = (char)(len&0xff);
664
+ pOut->aData[41] = (char)((len>>8)&0xff);
665
+ pOut->aData[42] = (char)((len>>16)&0xff);
666
+ pOut->aData[43] = (char)((len>>24)&0xff);
667
+ }
668
+ }
669
+}
670
+
671
+/*
672
+** WEBPAGE: /captcha-audio
673
+**
674
+** Return a WAV file that pronounces the digits of the captcha that
675
+** is determined by the seed given in the name= query parameter.
676
+*/
677
+void captcha_wav_page(void){
678
+ const char *zSeed = P("name");
679
+ const char *zDecode = captcha_decode((unsigned int)atoi(zSeed));
680
+ Blob audio;
681
+ captcha_wav(zDecode, &audio);
682
+ cgi_set_content_type("audio/wav");
683
+ cgi_set_content(&audio);
684
+}
685
+
686
+/*
687
+** WEBPAGE: /test-captcha-audio
688
+**
689
+** Return a WAV file that pronounces the hex digits of the name=
690
+** query parameter.
691
+*/
692
+void captcha_test_wav_page(void){
693
+ const char *zSeed = P("name");
694
+ Blob audio;
695
+ captcha_wav(zSeed, &audio);
696
+ cgi_set_content_type("audio/wav");
697
+ cgi_set_content(&audio);
698
+}
613699
--- src/captcha.c
+++ src/captcha.c
@@ -548,12 +548,29 @@
548 @ <input type="hidden" name="captchaseed" value="%u(uSeed)" />
549 @ <input type="text" name="captcha" size=8 />
550 if( showButton ){
551 @ <input type="submit" value="Submit">
552 }
 
 
553 @ </td></tr></table></div>
554 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
555
556 /*
557 ** WEBPAGE: test-captcha
558 ** Test the captcha-generator by rendering the value of the name= query
559 ** parameter using ascii-art. If name= is omitted, show a random 16-digit
@@ -608,5 +625,74 @@
608 captcha_generate(1);
609 @ </form>
610 style_footer();
611 return 1;
612 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
613
--- src/captcha.c
+++ src/captcha.c
@@ -548,12 +548,29 @@
548 @ <input type="hidden" name="captchaseed" value="%u(uSeed)" />
549 @ <input type="text" name="captcha" size=8 />
550 if( showButton ){
551 @ <input type="submit" value="Submit">
552 }
553 @ <br/>\
554 captcha_speakit_button(uSeed);
555 @ </td></tr></table></div>
556 }
557
558 /*
559 ** Add a "Speak the captcha" button.
560 */
561 void captcha_speakit_button(unsigned int uSeed){
562 @ <input type="button" value="Speak the text" id="speakthetext">
563 @ <audio id="spokencaptcha" src="%R/captcha-audio/%u(uSeed)" />
564 @ <script nonce="%h(style_nonce())">
565 @ var x = document.getElementById("speakthetext")
566 @ x.onclick = function(){
567 @ var audio = document.getElementById("spokencaptcha");
568 @ audio.play();
569 @ }
570 @ </script>
571 }
572
573 /*
574 ** WEBPAGE: test-captcha
575 ** Test the captcha-generator by rendering the value of the name= query
576 ** parameter using ascii-art. If name= is omitted, show a random 16-digit
@@ -608,5 +625,74 @@
625 captcha_generate(1);
626 @ </form>
627 style_footer();
628 return 1;
629 }
630
631 /*
632 ** Generate a WAV file that reads aloud the hex digits given by
633 ** zHex.
634 */
635 static void captcha_wav(const char *zHex, Blob *pOut){
636 int i;
637 const int szWavHdr = 44;
638 blob_init(pOut, 0, 0);
639 blob_resize(pOut, szWavHdr); /* Space for the WAV header */
640 pOut->nUsed = szWavHdr;
641 memset(pOut->aData, 0, szWavHdr);
642 if( zHex==0 || zHex[0]==0 ) zHex = "0";
643 for(i=0; zHex[i]; i++){
644 int v = hex_digit_value(zHex[i]);
645 int sz;
646 int nData;
647 const unsigned char *pData;
648 char zSoundName[50];
649 sqlite3_snprintf(sizeof(zSoundName),zSoundName,"sounds/%c.wav",
650 "0123456789abcdef"[v]);
651 pData = builtin_file(zSoundName, &sz);
652 nData = sz - szWavHdr;
653 blob_resize(pOut, pOut->nUsed+nData);
654 memcpy(pOut->aData+pOut->nUsed-nData, pData+szWavHdr, nData);
655 if( zHex[i+1]==0 ){
656 int len = pOut->nUsed + 36;
657 memcpy(pOut->aData, pData, szWavHdr);
658 pOut->aData[4] = (char)(len&0xff);
659 pOut->aData[5] = (char)((len>>8)&0xff);
660 pOut->aData[6] = (char)((len>>16)&0xff);
661 pOut->aData[7] = (char)((len>>24)&0xff);
662 len = pOut->nUsed;
663 pOut->aData[40] = (char)(len&0xff);
664 pOut->aData[41] = (char)((len>>8)&0xff);
665 pOut->aData[42] = (char)((len>>16)&0xff);
666 pOut->aData[43] = (char)((len>>24)&0xff);
667 }
668 }
669 }
670
671 /*
672 ** WEBPAGE: /captcha-audio
673 **
674 ** Return a WAV file that pronounces the digits of the captcha that
675 ** is determined by the seed given in the name= query parameter.
676 */
677 void captcha_wav_page(void){
678 const char *zSeed = P("name");
679 const char *zDecode = captcha_decode((unsigned int)atoi(zSeed));
680 Blob audio;
681 captcha_wav(zDecode, &audio);
682 cgi_set_content_type("audio/wav");
683 cgi_set_content(&audio);
684 }
685
686 /*
687 ** WEBPAGE: /test-captcha-audio
688 **
689 ** Return a WAV file that pronounces the hex digits of the name=
690 ** query parameter.
691 */
692 void captcha_test_wav_page(void){
693 const char *zSeed = P("name");
694 Blob audio;
695 captcha_wav(zSeed, &audio);
696 cgi_set_content_type("audio/wav");
697 cgi_set_content(&audio);
698 }
699
--- src/login.c
+++ src/login.c
@@ -757,10 +757,11 @@
757757
@ the 8-character hexadecimal password shown below:</p>
758758
@ <div class="captcha"><table class="captcha"><tr><td>\
759759
@ <pre class="captcha">
760760
@ %h(zCaptcha)
761761
@ </pre></td></tr></table>
762
+ captcha_speakit_button(uSeed);
762763
if( bAutoCaptcha ) {
763764
@ <input type="button" value="Fill out captcha" id='autofillButton' \
764765
@ data-af='%s(zDecoded)' />
765766
style_load_one_js_file("login.js");
766767
}
767768
--- src/login.c
+++ src/login.c
@@ -757,10 +757,11 @@
757 @ the 8-character hexadecimal password shown below:</p>
758 @ <div class="captcha"><table class="captcha"><tr><td>\
759 @ <pre class="captcha">
760 @ %h(zCaptcha)
761 @ </pre></td></tr></table>
 
762 if( bAutoCaptcha ) {
763 @ <input type="button" value="Fill out captcha" id='autofillButton' \
764 @ data-af='%s(zDecoded)' />
765 style_load_one_js_file("login.js");
766 }
767
--- src/login.c
+++ src/login.c
@@ -757,10 +757,11 @@
757 @ the 8-character hexadecimal password shown below:</p>
758 @ <div class="captcha"><table class="captcha"><tr><td>\
759 @ <pre class="captcha">
760 @ %h(zCaptcha)
761 @ </pre></td></tr></table>
762 captcha_speakit_button(uSeed);
763 if( bAutoCaptcha ) {
764 @ <input type="button" value="Fill out captcha" id='autofillButton' \
765 @ data-af='%s(zDecoded)' />
766 style_load_one_js_file("login.js");
767 }
768
+16
--- src/main.mk
+++ src/main.mk
@@ -224,10 +224,26 @@
224224
$(SRCDIR)/menu.js \
225225
$(SRCDIR)/sbsdiff.js \
226226
$(SRCDIR)/scroll.js \
227227
$(SRCDIR)/skin.js \
228228
$(SRCDIR)/sorttable.js \
229
+ $(SRCDIR)/sounds/0.wav \
230
+ $(SRCDIR)/sounds/1.wav \
231
+ $(SRCDIR)/sounds/2.wav \
232
+ $(SRCDIR)/sounds/3.wav \
233
+ $(SRCDIR)/sounds/4.wav \
234
+ $(SRCDIR)/sounds/5.wav \
235
+ $(SRCDIR)/sounds/6.wav \
236
+ $(SRCDIR)/sounds/7.wav \
237
+ $(SRCDIR)/sounds/8.wav \
238
+ $(SRCDIR)/sounds/9.wav \
239
+ $(SRCDIR)/sounds/a.wav \
240
+ $(SRCDIR)/sounds/b.wav \
241
+ $(SRCDIR)/sounds/c.wav \
242
+ $(SRCDIR)/sounds/d.wav \
243
+ $(SRCDIR)/sounds/e.wav \
244
+ $(SRCDIR)/sounds/f.wav \
229245
$(SRCDIR)/tree.js \
230246
$(SRCDIR)/useredit.js \
231247
$(SRCDIR)/wiki.wiki
232248
233249
TRANS_SRC = \
234250
--- src/main.mk
+++ src/main.mk
@@ -224,10 +224,26 @@
224 $(SRCDIR)/menu.js \
225 $(SRCDIR)/sbsdiff.js \
226 $(SRCDIR)/scroll.js \
227 $(SRCDIR)/skin.js \
228 $(SRCDIR)/sorttable.js \
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229 $(SRCDIR)/tree.js \
230 $(SRCDIR)/useredit.js \
231 $(SRCDIR)/wiki.wiki
232
233 TRANS_SRC = \
234
--- src/main.mk
+++ src/main.mk
@@ -224,10 +224,26 @@
224 $(SRCDIR)/menu.js \
225 $(SRCDIR)/sbsdiff.js \
226 $(SRCDIR)/scroll.js \
227 $(SRCDIR)/skin.js \
228 $(SRCDIR)/sorttable.js \
229 $(SRCDIR)/sounds/0.wav \
230 $(SRCDIR)/sounds/1.wav \
231 $(SRCDIR)/sounds/2.wav \
232 $(SRCDIR)/sounds/3.wav \
233 $(SRCDIR)/sounds/4.wav \
234 $(SRCDIR)/sounds/5.wav \
235 $(SRCDIR)/sounds/6.wav \
236 $(SRCDIR)/sounds/7.wav \
237 $(SRCDIR)/sounds/8.wav \
238 $(SRCDIR)/sounds/9.wav \
239 $(SRCDIR)/sounds/a.wav \
240 $(SRCDIR)/sounds/b.wav \
241 $(SRCDIR)/sounds/c.wav \
242 $(SRCDIR)/sounds/d.wav \
243 $(SRCDIR)/sounds/e.wav \
244 $(SRCDIR)/sounds/f.wav \
245 $(SRCDIR)/tree.js \
246 $(SRCDIR)/useredit.js \
247 $(SRCDIR)/wiki.wiki
248
249 TRANS_SRC = \
250
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -174,10 +174,11 @@
174174
diff.tcl
175175
markdown.md
176176
wiki.wiki
177177
*.js
178178
../skins/*/*.txt
179
+ sounds/*.wav
179180
}
180181
181182
# Options used to compile the included SQLite library.
182183
#
183184
set SQLITE_OPTIONS {
184185
185186
ADDED src/sounds/0.wav
186187
ADDED src/sounds/1.wav
187188
ADDED src/sounds/2.wav
188189
ADDED src/sounds/3.wav
189190
ADDED src/sounds/4.wav
190191
ADDED src/sounds/5.wav
191192
ADDED src/sounds/6.wav
192193
ADDED src/sounds/7.wav
193194
ADDED src/sounds/8.wav
194195
ADDED src/sounds/9.wav
195196
ADDED src/sounds/README.md
196197
ADDED src/sounds/a.wav
197198
ADDED src/sounds/b.wav
198199
ADDED src/sounds/c.wav
199200
ADDED src/sounds/d.wav
200201
ADDED src/sounds/e.wav
201202
ADDED src/sounds/f.wav
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -174,10 +174,11 @@
174 diff.tcl
175 markdown.md
176 wiki.wiki
177 *.js
178 ../skins/*/*.txt
 
179 }
180
181 # Options used to compile the included SQLite library.
182 #
183 set SQLITE_OPTIONS {
184
185 DDED src/sounds/0.wav
186 DDED src/sounds/1.wav
187 DDED src/sounds/2.wav
188 DDED src/sounds/3.wav
189 DDED src/sounds/4.wav
190 DDED src/sounds/5.wav
191 DDED src/sounds/6.wav
192 DDED src/sounds/7.wav
193 DDED src/sounds/8.wav
194 DDED src/sounds/9.wav
195 DDED src/sounds/README.md
196 DDED src/sounds/a.wav
197 DDED src/sounds/b.wav
198 DDED src/sounds/c.wav
199 DDED src/sounds/d.wav
200 DDED src/sounds/e.wav
201 DDED src/sounds/f.wav
--- src/makemake.tcl
+++ src/makemake.tcl
@@ -174,10 +174,11 @@
174 diff.tcl
175 markdown.md
176 wiki.wiki
177 *.js
178 ../skins/*/*.txt
179 sounds/*.wav
180 }
181
182 # Options used to compile the included SQLite library.
183 #
184 set SQLITE_OPTIONS {
185
186 DDED src/sounds/0.wav
187 DDED src/sounds/1.wav
188 DDED src/sounds/2.wav
189 DDED src/sounds/3.wav
190 DDED src/sounds/4.wav
191 DDED src/sounds/5.wav
192 DDED src/sounds/6.wav
193 DDED src/sounds/7.wav
194 DDED src/sounds/8.wav
195 DDED src/sounds/9.wav
196 DDED src/sounds/README.md
197 DDED src/sounds/a.wav
198 DDED src/sounds/b.wav
199 DDED src/sounds/c.wav
200 DDED src/sounds/d.wav
201 DDED src/sounds/e.wav
202 DDED src/sounds/f.wav

Binary file

Binary file

Binary file

Binary file

Binary file

Binary file

Binary file

Binary file

Binary file

Binary file

--- a/src/sounds/README.md
+++ b/src/sounds/README.md
@@ -0,0 +1,15 @@
1
+The *.wav files in this dire speaking each
2
+of the 16 hexadecimal d consists of just
3
+hexadecimal digits ( generated by the
4
+[../captcha.c module](.. files can be
5
+hen these WAV
6
+files can be con captcha, which
7
+ding of the
8
+captcha, ired users to complete the
9
+captcha.
10
+
11
+Each of the WAV files uses 8000 samples per second, 8 bits per sample
12
+and are 6000 samples in length.
13
+
14
+The recordings are made by Philip Bennefall and are of his own voice.
15
+Mr. Bennefall is ytemself blind and uses this system implemented w
--- a/src/sounds/README.md
+++ b/src/sounds/README.md
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/src/sounds/README.md
+++ b/src/sounds/README.md
@@ -0,0 +1,15 @@
1 The *.wav files in this dire speaking each
2 of the 16 hexadecimal d consists of just
3 hexadecimal digits ( generated by the
4 [../captcha.c module](.. files can be
5 hen these WAV
6 files can be con captcha, which
7 ding of the
8 captcha, ired users to complete the
9 captcha.
10
11 Each of the WAV files uses 8000 samples per second, 8 bits per sample
12 and are 6000 samples in length.
13
14 The recordings are made by Philip Bennefall and are of his own voice.
15 Mr. Bennefall is ytemself blind and uses this system implemented w

Binary file

Binary file

Binary file

Binary file

Binary file

Binary file

--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -646,10 +646,26 @@
646646
$(SRCDIR)/menu.js \
647647
$(SRCDIR)/sbsdiff.js \
648648
$(SRCDIR)/scroll.js \
649649
$(SRCDIR)/skin.js \
650650
$(SRCDIR)/sorttable.js \
651
+ $(SRCDIR)/sounds/0.wav \
652
+ $(SRCDIR)/sounds/1.wav \
653
+ $(SRCDIR)/sounds/2.wav \
654
+ $(SRCDIR)/sounds/3.wav \
655
+ $(SRCDIR)/sounds/4.wav \
656
+ $(SRCDIR)/sounds/5.wav \
657
+ $(SRCDIR)/sounds/6.wav \
658
+ $(SRCDIR)/sounds/7.wav \
659
+ $(SRCDIR)/sounds/8.wav \
660
+ $(SRCDIR)/sounds/9.wav \
661
+ $(SRCDIR)/sounds/a.wav \
662
+ $(SRCDIR)/sounds/b.wav \
663
+ $(SRCDIR)/sounds/c.wav \
664
+ $(SRCDIR)/sounds/d.wav \
665
+ $(SRCDIR)/sounds/e.wav \
666
+ $(SRCDIR)/sounds/f.wav \
651667
$(SRCDIR)/tree.js \
652668
$(SRCDIR)/useredit.js \
653669
$(SRCDIR)/wiki.wiki
654670
655671
TRANS_SRC = \
656672
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -646,10 +646,26 @@
646 $(SRCDIR)/menu.js \
647 $(SRCDIR)/sbsdiff.js \
648 $(SRCDIR)/scroll.js \
649 $(SRCDIR)/skin.js \
650 $(SRCDIR)/sorttable.js \
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
651 $(SRCDIR)/tree.js \
652 $(SRCDIR)/useredit.js \
653 $(SRCDIR)/wiki.wiki
654
655 TRANS_SRC = \
656
--- win/Makefile.mingw
+++ win/Makefile.mingw
@@ -646,10 +646,26 @@
646 $(SRCDIR)/menu.js \
647 $(SRCDIR)/sbsdiff.js \
648 $(SRCDIR)/scroll.js \
649 $(SRCDIR)/skin.js \
650 $(SRCDIR)/sorttable.js \
651 $(SRCDIR)/sounds/0.wav \
652 $(SRCDIR)/sounds/1.wav \
653 $(SRCDIR)/sounds/2.wav \
654 $(SRCDIR)/sounds/3.wav \
655 $(SRCDIR)/sounds/4.wav \
656 $(SRCDIR)/sounds/5.wav \
657 $(SRCDIR)/sounds/6.wav \
658 $(SRCDIR)/sounds/7.wav \
659 $(SRCDIR)/sounds/8.wav \
660 $(SRCDIR)/sounds/9.wav \
661 $(SRCDIR)/sounds/a.wav \
662 $(SRCDIR)/sounds/b.wav \
663 $(SRCDIR)/sounds/c.wav \
664 $(SRCDIR)/sounds/d.wav \
665 $(SRCDIR)/sounds/e.wav \
666 $(SRCDIR)/sounds/f.wav \
667 $(SRCDIR)/tree.js \
668 $(SRCDIR)/useredit.js \
669 $(SRCDIR)/wiki.wiki
670
671 TRANS_SRC = \
672
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -553,10 +553,26 @@
553553
$(SRCDIR)\menu.js \
554554
$(SRCDIR)\sbsdiff.js \
555555
$(SRCDIR)\scroll.js \
556556
$(SRCDIR)\skin.js \
557557
$(SRCDIR)\sorttable.js \
558
+ $(SRCDIR)\sounds\0.wav \
559
+ $(SRCDIR)\sounds\1.wav \
560
+ $(SRCDIR)\sounds\2.wav \
561
+ $(SRCDIR)\sounds\3.wav \
562
+ $(SRCDIR)\sounds\4.wav \
563
+ $(SRCDIR)\sounds\5.wav \
564
+ $(SRCDIR)\sounds\6.wav \
565
+ $(SRCDIR)\sounds\7.wav \
566
+ $(SRCDIR)\sounds\8.wav \
567
+ $(SRCDIR)\sounds\9.wav \
568
+ $(SRCDIR)\sounds\a.wav \
569
+ $(SRCDIR)\sounds\b.wav \
570
+ $(SRCDIR)\sounds\c.wav \
571
+ $(SRCDIR)\sounds\d.wav \
572
+ $(SRCDIR)\sounds\e.wav \
573
+ $(SRCDIR)\sounds\f.wav \
558574
$(SRCDIR)\tree.js \
559575
$(SRCDIR)\useredit.js \
560576
$(SRCDIR)\wiki.wiki
561577
562578
OBJ = $(OX)\add$O \
563579
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -553,10 +553,26 @@
553 $(SRCDIR)\menu.js \
554 $(SRCDIR)\sbsdiff.js \
555 $(SRCDIR)\scroll.js \
556 $(SRCDIR)\skin.js \
557 $(SRCDIR)\sorttable.js \
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
558 $(SRCDIR)\tree.js \
559 $(SRCDIR)\useredit.js \
560 $(SRCDIR)\wiki.wiki
561
562 OBJ = $(OX)\add$O \
563
--- win/Makefile.msc
+++ win/Makefile.msc
@@ -553,10 +553,26 @@
553 $(SRCDIR)\menu.js \
554 $(SRCDIR)\sbsdiff.js \
555 $(SRCDIR)\scroll.js \
556 $(SRCDIR)\skin.js \
557 $(SRCDIR)\sorttable.js \
558 $(SRCDIR)\sounds\0.wav \
559 $(SRCDIR)\sounds\1.wav \
560 $(SRCDIR)\sounds\2.wav \
561 $(SRCDIR)\sounds\3.wav \
562 $(SRCDIR)\sounds\4.wav \
563 $(SRCDIR)\sounds\5.wav \
564 $(SRCDIR)\sounds\6.wav \
565 $(SRCDIR)\sounds\7.wav \
566 $(SRCDIR)\sounds\8.wav \
567 $(SRCDIR)\sounds\9.wav \
568 $(SRCDIR)\sounds\a.wav \
569 $(SRCDIR)\sounds\b.wav \
570 $(SRCDIR)\sounds\c.wav \
571 $(SRCDIR)\sounds\d.wav \
572 $(SRCDIR)\sounds\e.wav \
573 $(SRCDIR)\sounds\f.wav \
574 $(SRCDIR)\tree.js \
575 $(SRCDIR)\useredit.js \
576 $(SRCDIR)\wiki.wiki
577
578 OBJ = $(OX)\add$O \
579

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button