All modules will be merged into `t-gnus-6_15' branch, later...
+2002-01-07 Katsumi Yamaoka <yamaoka@jpl.org>
+
+ * lisp/gnus-vers.el (gnus-revision-number): Increment to 10.
+
+ * lisp/gnus-picon.el: Require `mail-parse'.
+
+ * lisp/gnus-fun.el: Autoload "compface" for `uncompface'.
+
+ * lisp/sha1-el.el (sha1-use-external): Replace `executable-find'
+ with `exec-installed-p'.
+
2002-01-06 TSUCHIYA Masatoshi <tsuchiya@namazu.org>
* lisp/gnus-namazu.el: Update comments.
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 43 1",
-" c Gray0",
-". c #099909990999",
-"X c Gray6",
-"o c #133313331333",
-"O c Gray9",
-"+ c Gray11",
-"@ c Gray12",
-"# c #23f323f323f3",
-"$ c Gray15",
-"% c #2ff12ff12ff1",
-"& c #3fff3fff3fff",
-"* c Gray25",
-"= c #4ccc4ccc4ccc",
-"- c #519151915191",
-"; c #53ed53ed53ed",
-": c #565b565b565b",
-"> c Gray35",
-", c #5b1a5b1a5b1a",
-"< c #5fe95fe95fe9",
-"1 c #626262626262",
-"2 c Gray40",
-"3 c #67e767e767e7",
-"4 c Gray42",
-"5 c #6fff6fff6fff",
-"6 c Gray45",
-"7 c Gray46",
-"8 c #77e977e977e9",
-"9 c #7bdb7bdb7bdb",
-"0 c #7ccc7ccc7ccc",
-"q c Gray50",
-"w c #866586658665",
-"e c Gray56",
-"r c Gray60",
-"t c #9bcb9bcb9bcb",
-"y c #9fff9fff9fff",
-"u c #a7c7a7c7a7c7",
-"i c #af0eaf0eaf0e",
-"p c Gray70",
-"a c Gray75",
-"s c Gray81",
-"d c #dfffdfffdfff",
-"f c #efffefffefff",
-"g c Gray100",
-/* pixels */
-"aaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaa7$$*uaaaaaaaaareep",
-"aaaaaa$rr6<aaaaaaaae;==>",
-"aaaaaa7<r6<aaaaaaaa<6rr$",
-"9&&&&&&>6;aaaareeeee#rw*",
-"&aqqagga@<<<7e7qqqqqq=:u",
-"33e4qgggsaa%1Oa&&&ggge<a",
-"17a9ygf7%%%%#=$aa%ggga<a",
-"7aa&gga<aaaae$>ae7ggya<a",
-"aa;sgg;uaaaapepa<agg&a<a",
-"au;&&&%aaaaaaaae<aaa;a6.",
-"a<aggg%aaaaaaaa3qqq&e<:o",
-"r7<5gg%aaaaaaaaXyggqeaue",
-"6gs$6fa=re6666=s@egy3rrr",
-"ga>r=aa=r6 <qqdd3=yg&rrr",
-"&>er=aa=r6 aggg=wr&g&rrr",
-"rrrrr$a<:6 @$$$rri=d5qrr",
-"rrrrr<===6$wrrrrrr6&qo6r",
-"rrrrrrrrrewrrrrrrr6 oq",
-"rrrrrrrrrrrrrrrrrrrrrrrr",
-"rrrrrrrrrrrrrrrrrrrrrrrr",
-"rrrrrrrrrrrrrrrrrrrrrrrr"
-};
+static char * catchup_xpm[] = {
+"24 24 6 1",
+" c None",
+". c #FFFFFFFFFFFF",
+"X c #E1E1E0E0E0E0",
+"o c #A5A5A5A59595",
+"O c #999999999999",
+"+ c #000000000000",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" . ",
+" . .X ",
+" ... .oX . ",
+" ..oooX.oXo .X ",
+" .oooXXXX..oXXoXX ",
+" .oXXXX.XoX.oXooX ",
+" X...X.X.XX.XoXX ",
+" Xo..X.XXX.XXXX ",
+" . Xo.oXX..XXXXXX ",
+"OOOOXoXXXXXo.XXXXX++OOOO",
+"OOOOOX..X.XXXXXXXX++OOOO",
+"OOOOOX..XXXXXXXXX++OOOOO",
+"OOOOOOXXXXXXXXX+++OOOOOO",
+"OOOOOOOOOXXXX++++OOOOOOO",
+"OOOOOOOOO+++++OOOOOOOOOO",
+"OOOOOOOOOO+OOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOOOOOOOOOO"};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 34 1",
-" c Gray0",
-". c #0bfb0bfb0bfb",
-"X c Gray6",
-"o c Gray9",
-"O c Gray11",
-"+ c Gray12",
-"@ c #23f323f323f3",
-"# c Gray15",
-"$ c #2ff52ff52ff5",
-"% c #3fff3fff3fff",
-"& c Gray25",
-"* c Gray28",
-"= c #4ccc4ccc4ccc",
-"- c #53e853e853e8",
-"; c #5b1a5b1a5b1a",
-": c #5fef5fef5fef",
-"> c #67e767e767e7",
-", c Gray42",
-"< c #6ff76ff76ff7",
-"1 c #77dc77dc77dc",
-"2 c Gray50",
-"3 c #866586658665",
-"4 c #88a888a888a8",
-"5 c Gray56",
-"6 c Gray60",
-"7 c #9bcb9bcb9bcb",
-"8 c #9fff9fff9fff",
-"9 c #a7d7a7d7a7d7",
-"0 c Gray70",
-"q c #b635b635b635",
-"w c Gray75",
-"e c Gray78",
-"r c #dfffdfffdfff",
-"t c Gray100",
-/* pixels */
-"wwwwwwwwwwwwwwwwwwwwwwww",
-"wwwwwwwwwwwwwwwwwwwwwwww",
-"wwwwwwwwwwwwwwwwwwwwwwww",
-"wwwwwwwwwwwwwwwwwwwwwwww",
-"wwwwwwwwwwwwwwwwwwwwwwww",
-"wwwwwwwwwww-$$$-wwwwwwww",
-"wwwwwww9-$w$ttt$wwwwwwww",
-"wwwwww:<ro:1ttto::wwwwww",
-"wwww1$wrt5 wttt$w$$1wwww",
-"wwww1.ttt5 5ww$ttt.1wwww",
-"wwwww$8tt+222% 222$wwwww",
-"wwwww$%tt%ttt2 ww$6wwwww",
-"wwwww$52t%ttt2wtt%wwwwww",
-"wwwww1 %r%ttt2w22>wwwwww",
-"wwwwww,::X%%%+$w:5wwwwww",
-"qqqqqq4*5%t%t255;qqqqqqq",
-"6666663#*+2+2%**=6666666",
-"6666666=0$w$0*0&36666666",
-"6666666=,$9@5*,#66666666",
-"6666666= +% 2% #66666666",
-"6666666= %e@<2 #66666666",
-"6666666:# +666666666",
-"666666666=====3666666666",
-"666666666666666666666666"
-};
+static char * cu_exit_xpm[] = {
+"24 24 4 1",
+" c None",
+". c #000000000000",
+"X c #FFFFFFFFFFFF",
+"o c #999999999999",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ..... ",
+" .. .XXX. ",
+" ..X..XXXX... ",
+" .XXXX.XXXX.X... ",
+" ..XXXX.XXX.XXX.. ",
+" .XXX.......... ",
+" .XXX.XXX.XXX.. ",
+" .XX.XXX.XXX. ",
+" .XX.XXX.XX.. ",
+" ............ ",
+" .X.X.X.X.. ",
+"ooooooo..........ooooooo",
+"ooooooo.X.X.X.X.oooooooo",
+"ooooooo.........oooooooo",
+"ooooooo..X...X..oooooooo",
+"ooooooo...X.X...oooooooo",
+"ooooooo........ooooooooo",
+"ooooooooo.....oooooooooo",
+"oooooooooooooooooooooooo"};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 42 1",
-" c Gray0",
-". c #099909990999",
-"X c #0bfb0bfb0bfb",
-"o c #133313331333",
-"O c Gray9",
-"+ c Gray11",
-"@ c #23f323f323f3",
-"# c Gray15",
-"$ c #2d8d2d8d2d8d",
-"% c #399939993999",
-"& c #433243324332",
-"* c #4ccc4ccc4ccc",
-"= c #519151915191",
-"- c #53e353e353e3",
-"; c #565656565656",
-": c Gray36",
-"> c #5fdf5fdf5fdf",
-", c Gray42",
-"< c #6fff6fff6fff",
-"1 c Gray45",
-"2 c #77f777f777f7",
-"3 c #7ccc7ccc7ccc",
-"4 c Gray50",
-"5 c #865a865a865a",
-"6 c Gray58",
-"7 c Gray60",
-"8 c #9bfb9bfb9bfb",
-"9 c Gray62",
-"0 c #9fff9fff9fff",
-"q c #a0c0a0c0a0c0",
-"w c Gray64",
-"e c Gray65",
-"r c Gray70",
-"t c #b635b635b635",
-"y c Gray73",
-"u c Gray75",
-"i c #d332d332d332",
-"p c Gray85",
-"a c #e665e665e665",
-"s c #eccbeccbeccb",
-"d c #f998f998f998",
-"f c Gray100",
-/* pixels */
-"&77&77&77&77&77&77&77&77",
-"777777777777777777777777",
-"77777777777777777iaaa777",
-"&77&77&77&77&77<ff<fffp0",
-"77777777777777uffffffffp",
-"7777777777777udfffffffff",
-"&77&77&77&77<ff<ff<ff<ff",
-"777777777777ffffffffffff",
-"777777777777ffffffffffff",
-"&77&77&77&77<ff<ff<ff<ff",
-"777777777777ffffffffffff",
-"777777777777ffffffffffff",
-"&77&77&77&77:ff<ff<ff<ff",
-"777777777777rfffffffffff",
-"77777&##37770pffffffffff",
-"&77%-6ty-#77&7i<ff<ff<fs",
-"777*5w7wy*17777pffffffae",
-"777$13&7w+*77770rsfffre7",
-"&73X:@3*1 *7&77&77&77&77",
-"71o2;o***o17777777777777",
-"3o,**X%*X377777777777777",
-"XO, +##3&77&77&77&77&77",
-":;o #50w7777777777777777",
-"@oX+57707777777777777777"
-};
+static char * describe_group_xpm[] = {
+"24 24 5 1",
+". c None",
+" c #000000000000",
+"o c #FFFFF5F5ACAC",
+"+ c #E1E1E0E0E0E0",
+"@ c #C7C7C6C6C6C6",
+" .. .. .. .. .. .. .. ..",
+"........................",
+".................oooo...",
+" .. .. .. .. .. oo oo o.",
+"..............oooooooooo",
+".............ooooooooooo",
+" .. .. .. .. oo oo oo oo",
+"............oooooooooooo",
+"............oooooooooooo",
+" .. .. .. .. oo oo oo oo",
+"............oooooooooooo",
+"............oooooooooooo",
+" .. .. .. .. oo oo oo oo",
+"............oooooooooooo",
+"..... ...oooooooooooo",
+" .. ++ .. .o oo oo oo",
+"... @@@+ ....ooooooooo",
+"... @ ....oooooooo.",
+" . . .. .. .. ..",
+". ..............",
+" ................",
+" .. .. .. .. .. ..",
+" ..................",
+" ...................."};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 46 1",
-" c Gray0",
-". c Gray6",
-"X c #133313331333",
-"o c Gray11",
-"O c Gray12",
-"+ c Gray15",
-"@ c #2ff82ff82ff8",
-"# c Gray20",
-"$ c #399939993999",
-"% c #3fff3fff3fff",
-"& c Gray25",
-"* c Gray28",
-"= c #4ccc4ccc4ccc",
-"- c #53e353e353e3",
-"; c #565e565e565e",
-": c #5b1a5b1a5b1a",
-"> c #5ff55ff55ff5",
-", c #626262626262",
-"< c Gray40",
-"1 c #67e767e767e7",
-"2 c Gray42",
-"3 c #6ff96ff96ff9",
-"4 c Gray45",
-"5 c #77d777d777d7",
-"6 c #7ccc7ccc7ccc",
-"7 c Gray50",
-"8 c Gray56",
-"9 c #97f797f797f7",
-"0 c Gray60",
-"q c #9bd19bd19bd1",
-"w c #9ff29ff29ff2",
-"e c #a7cba7cba7cb",
-"r c Gray67",
-"t c #afd5afd5afd5",
-"y c Gray70",
-"u c Gray75",
-"i c #c3c3c3c3c3c3",
-"p c Gray78",
-"a c #cbcbcbcbcbcb",
-"s c Gray81",
-"d c #d7d8d7d8d7d8",
-"f c #dff2dff2dff2",
-"g c Gray89",
-"h c #e7e7e7e7e7e7",
-"j c #eff8eff8eff8",
-"k c Gray100",
-/* pixels */
-"kkkkkkkkkufkkkku7skkkkkk",
-"kkkkkkkkw>%fkkw 7kkkkkkk",
-"kk3%wkkksu ukk%u7skkkkkk",
-"kww>>@@uu3f@8 @@7.@Owskk",
-"kkwf777%>77O> >>%7777wkk",
-"kkkkkss7j8O.@ 8jujsfjkkk",
-"kkkjuuwO @> @>@@ujkkkkkk",
-"kkk>%O77O$ > %f >kkkkkk",
-"kkk87sj7<=u>@7s8>@%wkkkk",
-"kkkkkkq==u>>u ukk3u7kkkk",
-"7uwfuw+=>u u> >fuw7uwwuf",
-"8twut#>:8q q8* uprwswwtu",
-"ipuge&,5uq5uau-@uuuuuadu",
-"psuu>4@uuuuuduu5uuduuuuu",
-"uugu>4@uuguuuuuuuuauuuuu",
-"uuuy:>-uuuuuuugguaaugguu",
-"psu8=+uuuuspuuuuudduuuuu",
-"ipu8=+uuujfhguuuuuudauuu",
-"ue82=+8euuuuishspujdgguu",
-"e@$$+X=;>uu5ttp9sduuuuuu",
-"&4$8$ 7=4@@5y>qejdjduuuu",
-";$4O4444444O@eye5@uuusfd",
-">>>>3<>@*<3>@wp9f7uuufsd",
-"uuujfhgedhfjqpswsiuuuuuu"
-};
+static char * exit_gnus_xpm[] = {
+"24 24 6 1",
+" c None",
+". c #8686ADAD7D7D",
+"X c #919187876969",
+"o c #C2C2B9B99C9C",
+"O c #A8A8F0F0ECEC",
+"+ c #EFEFEFEFEFEF",
+" ",
+" .... . ",
+" .. .. . ",
+" ............. ",
+" . . . .... ",
+" ............. ",
+" .............. .. ",
+" . . .......... . ",
+" .XXXX... .. ",
+" o.XXX. . .. ",
+" oo.X. .. ... ",
+" ooX. . ... ",
+" oXo. .. ",
+" ooX . . ",
+" ooX ",
+"OOOOoXXOOOOOOOOOOOOOOOOO",
+"OOOoXoXOOOOOOOOOOOOOOOOO",
+"OOOooXXOOOO+OOOOOOOOOOOO",
+"O+OoooXOO+OOO+OO+OOO+OOO",
+"OXXoXoXoXOO++O++OO++OO+O",
+"XXXXXXXXXXXX+OOOOOOOOOOO",
+"XXXXXXXXXXXXXX+O++OO++OO",
+"XXXXXXXXXXXXXXXXOOOOOOOO",
+"O++O++++O+OO++OOOO++OOO+"};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 15 1",
-" c Gray0",
-". c #0bfb0bfb0bfb",
-"X c Gray9",
-"o c #23f323f323f3",
-"O c #2fef2fef2fef",
-"+ c Gray28",
-"@ c #53e353e353e3",
-"# c #5fdf5fdf5fdf",
-"$ c Gray42",
-"% c #77d777d777d7",
-"& c Gray56",
-"* c #9bcb9bcb9bcb",
-"= c #a7c7a7c7a7c7",
-"- c Gray70",
-"; c Gray75",
-/* pixels */
-"@;;@;;@;;@;;@;;@;;@;;@;;",
-";;;;;;;;;;;;;;;;;;;;;;;;",
-";;;;;;;;;;;;;;;;;;;;;;;;",
-"@;;@;;&=@OOOo O;;@;;",
-";;;;;;X&;;;;=## O;;;;;",
-";;;;;;.%;;;;;;; O;;;;;",
-"@;;@;;@;;@;;*;; O;;@;;",
-";;;;;;;;;;;;%;; O;;;;;",
-";;;;;;O%;;;;;;; O;;;;;",
-"@;;@;;o=;@;;-&- O;;@;;",
-";;;;;;X&;;;;+ & O;;;;;",
-";;;;;;.%;;;;$ & O;;;;;",
-"@;;@;;o=;@;;;;; O;;@;;",
-";;;;;;X&;;;;;;; O;;;;;",
-";;;;;;*;;;;;@;; O;;;;;",
-"@;;@;;&=;@;;;;; O;;@;;",
-";;;;;; #;;;;;&#XO+O;;;;;",
-";;;;;;o=;*OO*#o%#+*;;;;;",
-"@;;@;@;%OOOO@%*@%*@;;@;;",
-";;;;;;;;;;;;;;;;;;;;;;;;",
-";;;;;;;;;;;;;;;;;;;;;;;;",
-"@;;@;;@;;@;;@;;@;;@;;@;;",
-";;;;;;;;;;;;;;;;;;;;;;;;",
-";;;;;;;;;;;;;;;;;;;;;;;;"
-};
+static char * exit_summ_xpm[] = {
+"24 24 3 1",
+". c None",
+" c #000000000000",
+"X c #E1E1E0E0E0E0",
+" .. .. .. .. .. .. .. ..",
+"........................",
+"........................",
+" .. .. .. ..",
+"...... XXXX .....",
+"...... XXXXXXX .....",
+" .. .. XX XX XX .. ..",
+"...... XXXXXXXX .....",
+"...... XXXXXXX .....",
+" .. .. X XX .. ..",
+"...... XXXX .....",
+"...... XXXX .....",
+" .. .. X XXXXX .. ..",
+"...... XXXXXXX .....",
+"...... XXXXX XX .....",
+" .. .. X XXXXX .. ..",
+"...... XXXXX .....",
+"...... X .....",
+" .. . . .. ..",
+"........................",
+"........................",
+" .. .. .. .. .. .. .. ..",
+"........................",
+"........................"};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 24 1",
-" c Gray0",
-". c Gray6",
-"X c Gray9",
-"o c Gray12",
-"O c #2ff22ff22ff2",
-"+ c #3fff3fff3fff",
-"@ c Gray28",
-"# c #53ed53ed53ed",
-"$ c #5fee5fee5fee",
-"% c #67e767e767e7",
-"& c #6fff6fff6fff",
-"* c #77f077f077f0",
-"= c #7bdb7bdb7bdb",
-"- c Gray50",
-"; c Gray56",
-": c #9bd79bd79bd7",
-"> c #9fff9fff9fff",
-", c #a7c7a7c7a7c7",
-"< c Gray70",
-"1 c Gray75",
-"2 c Gray81",
-"3 c #dfffdfffdfff",
-"4 c #efffefffefff",
-"5 c Gray100",
-/* pixels */
-"<,1<,1<,1<,1<,1<,1<,1<,1",
-",;1,;1,;1,;1,;1,;1,;1,;1",
-"111111111111111111111111",
-"<,1<,1<,1<,:=+.<,1<,1<,1",
-",;1,;1,;1;O*>5+$;1,;1,;1",
-"11111111##142+>O11111111",
-"<,1<,:=+2555 o2#,1<,1<,1",
-",;1;O*>5555>-151$1,;1,;1",
-"111<@15555525554*:111111",
-"<,1<$:5555555555>=<,1<,1",
-",;1,;*>553--55555+,;1,;1",
-"111111=>&$1O555552#11111",
-"<,111:=+241$+55555#,1<,1",
-",;1,$*>55$ 1+555551$1,;1",
-"11##14555 $4>>55554*:111",
-"<@155555&5551-55555>=<,1",
-",O15555555553-355551o,;1",
-"1,#55555555553$555+%;111",
-"<,#25555555555&1*O<,1<,1",
-",;1+55555555555X;1,;1,;1",
-"111=>5555555555:*1111111",
-"<,1:*45555555552%<<,1<,1",
-",;11$15555555555-;,;1,;1",
-"1111,#55555555553#111111"
-};
+static char * followup_xpm[] = {
+"24 24 4 1",
+" c None",
+". c #A5A5A5A59595",
+"X c #C7C7C6C6C6C6",
+"o c #E1E1E0E0E0E0",
+" ",
+" . ",
+" ..X. ",
+" ..XXX. ",
+" ..XXXXXo. ",
+" ...XXXXXXooo. . ",
+" .o.XXXXXooooo..X. ",
+" .oo.XXXoooo..XXX. ",
+" .oo..Xooo..XXXXXo. ",
+" .oo.XX...XXXXXXooo. ",
+" .o.Xoo.o.XXXXXoooo. ",
+" .XXoo.oo.XXXoooooo. ",
+" .Xooo.oo..XXooooooo. ",
+" .ooo.oo.XXooooooooo. ",
+" .ooo.o.XoooooooooooX.",
+" .ooo.XXoooooooooooo.",
+" .ooo.Xoooooooooooo. ",
+" .ooo.ooooooooooo. ",
+" .oo..oooooooooo. ",
+" .. .ooooooo.. ",
+" .oooooo. ",
+" .ooo.. ",
+" .oo. ",
+" .. "};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 23 1",
-" c Gray0",
-". c Gray6",
-"X c Gray9",
-"o c Gray12",
-"O c #2fef2fef2fef",
-"+ c #3fff3fff3fff",
-"@ c #53ee53ee53ee",
-"# c #5fe85fe85fe8",
-"$ c #67e767e767e7",
-"% c #6fff6fff6fff",
-"& c #77ea77ea77ea",
-"* c #7bdb7bdb7bdb",
-"= c Gray50",
-"- c Gray56",
-"; c #9bd69bd69bd6",
-": c #9fff9fff9fff",
-"> c #a7c7a7c7a7c7",
-", c Gray70",
-"< c Gray75",
-"1 c Gray81",
-"2 c #dfffdfffdfff",
-"3 c #efffefffefff",
-"4 c Gray100",
-/* pixels */
-",><,><,><,><,><,><,><,><",
-">-<>-<>-<>-<>-<>-<>-<>-<",
-"<<<<<<<<<<<<<<<<<<<<<<<<",
-",><,><,><,><,><,><,><,><",
-">-<>-<>-<>-<>-<>-<>-<>-<",
-"<<<<<<<<<<<<;O;<<<<<<<<<",
-",><,><,><,>< X;,><,><,><",
-">-<>-<>-<>-&#-<>-<>-<>-<",
-"<<<<<<<<<<<;<<<<<<<<<<<<",
-",><,><,><,><,><,><,><,><",
-">-<>-<>-<-O>>-<>-<>-<>-<",
-"<<<<<<<<@@<@<<<<<<<<<<<<",
-",><<<;*+1<<#;<<,><,><,><",
-">-<>#&:<==+#&-<>-<>-<>-<",
-"<<@@<3+=<1o <#<<<<<<<<<<",
-",>O<=+444:+.4=-,><,><,><",
-">-O=<4444:4::<$>-<>-<>-<",
-"<&;444444444+4+<<<<<<<<<",
-",#;444444444<=4O<<,><,><",
-">-O4444444442=2&-<>-<>-<",
-"<<;%444444444=<<#<<<<<<<",
-",><@2444444444+4=-,><,><",
-">-<-=444444444::<$>-<>-<",
-"<<<,$1444444444+4+<<<<<<"
-};
+static char * fuwo_xpm[] = {
+"24 24 4 1",
+" c None",
+". c #A5A5A5A59595",
+"X c #C7C7C6C6C6C6",
+"o c #E1E1E0E0E0E0",
+" ",
+" . ",
+" .. . ",
+" .. . ",
+" .. . ",
+" ... . . ",
+" . . ..X. ",
+" . . ..XXX. ",
+" . .. ..XXXXXo. ",
+" . . ...XXXXXXooo. ",
+" . .X .o.XXXXXoooo. ",
+" .XX .oo.XXXoooooo. ",
+" .X .oo..XXooooooo. ",
+" . .oo.XXooooooooo. ",
+" . .o.XoooooooooooX.",
+" . .XXoooooooooooo.",
+" . .Xoooooooooooo. ",
+" . .ooooooooooo. ",
+" . ..oooooooooo. ",
+" .. .ooooooo.. ",
+" .oooooo. ",
+" .ooo.. ",
+" .oo. ",
+" .. "};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 38 1",
-" c Gray0",
-". c #0bfb0bfb0bfb",
-"X c Gray6",
-"o c #133313331333",
-"O c Gray9",
-"+ c Gray11",
-"@ c Gray12",
-"# c #23f323f323f3",
-"$ c Gray15",
-"% c #2ff32ff32ff3",
-"& c #399939993999",
-"* c #3fff3fff3fff",
-"= c Gray25",
-"- c #433243324332",
-"; c Gray28",
-": c #4ccc4ccc4ccc",
-"> c #519151915191",
-", c #53e753e753e7",
-"< c #565a565a565a",
-"1 c Gray35",
-"2 c #5b1a5b1a5b1a",
-"3 c #5fe55fe55fe5",
-"4 c Gray45",
-"5 c Gray46",
-"6 c #77d777d777d7",
-"7 c #7ccc7ccc7ccc",
-"8 c Gray50",
-"9 c #866586658665",
-"0 c Gray56",
-"q c Gray60",
-"w c #9bcb9bcb9bcb",
-"e c #9fff9fff9fff",
-"r c #a7c7a7c7a7c7",
-"t c Gray70",
-"y c Gray75",
-"u c Gray81",
-"i c #dfffdfffdfff",
-"p c Gray100",
-/* pixels */
-"0000000ryyyyyyyyyyyyyyyy",
-"@8888833yyyyyyyyyyyyyyyy",
-"*pppppy3yyyyyyyyyyyyyyyy",
-"*pppppy3yyyyyr=$$6yyyyyy",
-"*ppppp3%3yyyr<9qq36yyyyy",
-"*ppppp ;0>yy0:qqqq%yyyyy",
-"*pppppy @82tq>0qq8>yyyyy",
-"*pppppy%>q42y0>q42yyyyyy",
-"*pppppy3q=q8%%.=:#%6yyyy",
-"%yyyyy03y0:qqqqqqqq:0yyy",
-"33333330yr<9qqqqqqq42yyy",
-"yyyyyyyyyyr=qqqqqqqq$yyy",
-"yyyyyyyyyyyy$:%***$q$**X",
-"yyyyyyyyyyyy$:yppe3q$pp*",
-"yyyyyyyyyyyy$:ypp*q3qpp*",
-"yyyyyyyyyyyy$:yp8402upp*",
-"yyyyyyyyyyyyo$yi*&48ppp*",
-"yyyyyyyyyyy>4&u>00:ippp*",
-"yyyyyyyyyyy%q:00Oq%yyyy%",
-"yyyyyyyyyyy%q4:o<3&%3333",
-"yyyyyyyyyyy%qqq$9443yyyy",
-"yyyyyyyyyyy%44@0&4<3yyyy",
-"yyyyyyyyyyy6o$;r%&O0yyyy",
-"yyyyyyyyyyyy$:0y34%yyyyy"
-};
+static char * get_news_xpm[] = {
+"24 24 4 1",
+". c None",
+"X c #A5A5A5A59595",
+"o c #E1E1E0E0E0E0",
+"O c #C7C7C6C6C6C6",
+"........................",
+"........................",
+"........................",
+".....XXX................",
+"...XXoooXXXXX...........",
+"XXXoooooXXoooX.XXX......",
+"XoXooXXXooooXXXoooX.....",
+"XooXoXoXooXXXoooooX.....",
+"XooXXXooXoXoXooooooX....",
+"XooXOXooXXXooXooooooX...",
+"XoXOOXooXOXooXXooooooX..",
+"OXOOOXoXOOXooXoooooooX..",
+"OXOooOXOOOXoXOooooooooX.",
+".OXooOXOooOXOOooooooooX.",
+".OXoooOXooOXOooooooooooX",
+"..OXooOXoooOXooooooooooX",
+"..OXooOOXooOXooooooooooX",
+"...OXooOXoooOXoooooooXXX",
+"...OXooXOXooOXooooooXOO.",
+"....OXXOOXooXOXoooXXO...",
+".....OO..OXXOOXooXOO....",
+"..........OO..OXXO......",
+"...............OO.......",
+"........................"};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 34 1",
-" c Gray0",
-". c #099909990999",
-"X c #0bfb0bfb0bfb",
-"o c #133313331333",
-"O c Gray9",
-"+ c Gray11",
-"@ c #23f323f323f3",
-"# c Gray15",
-"$ c #2fef2fef2fef",
-"% c #399939993999",
-"& c #3fff3fff3fff",
-"* c Gray25",
-"= c #433243324332",
-"- c Gray28",
-"; c #4ccc4ccc4ccc",
-": c #519151915191",
-"> c #566656665666",
-", c #5fed5fed5fed",
-"< c #626262626262",
-"1 c Gray42",
-"2 c Gray45",
-"3 c Gray46",
-"4 c #77d777d777d7",
-"5 c #7ccc7ccc7ccc",
-"6 c Gray50",
-"7 c #866586658665",
-"8 c Gray56",
-"9 c Gray60",
-"0 c #9bcb9bcb9bcb",
-"q c #a7c7a7c7a7c7",
-"w c Gray70",
-"e c Gray75",
-"r c #dfffdfffdfff",
-"t c Gray100",
-/* pixels */
-"w8888888weeeeeeeeeeeeeee",
-"8&66666&8eeeeeeeeeeeeeee",
-"86ttttt68eeeeeeeeeeeeeee",
-"86ttttt68eeeee0###0eeeee",
-"86ttttr&-4eee8:000:8eeee",
-"86tttte 144ee,20002,eeee",
-"86ttttt6 =,4e4<000<4eeee",
-"86ttttt6-,0,4e4,0,4eeeee",
-"86ttttt684,0<$$.,#$$0eee",
-"8,eeeee,8e,200000000#eee",
-"q,,,,,,,qe8:00000000,4ee",
-"eeeeeeeeeee0=000006,0$ee",
-"eeeeeeeeeeee8;00002;0$ee",
-"eeeeeeeeeeee8;00002;0$ee",
-"eeeeeeeeeeee8;00002;0$ee",
-"eeeeeeeeeeee8;00002;0$ee",
-"eeeeeeeeeeee8#;;;;%#;$ee",
-"eeeeeeeeeeee=2222+88@0ee",
-"eeeeeeeeeeee#00000.4$eee",
-"eeeeeeeeeeee#00720O,,eee",
-"eeeeeeeeeeee#002;02%8eee",
-"eeeeeeeeeeee+22$,>2%8eee",
-"eeeeeeeeeeee-#o48O%$qeee",
-"eeeeeeeeeeee8;#ee$2,eeee"
-};
+static char * gnntg_xpm[] = {
+"24 24 4 1",
+" c None",
+". c #000000000000",
+"X c #FFFFFFFFFFFF",
+"o c #C7C7C6C6C6C6",
+" ",
+" ....... ",
+" .XXXXX. ",
+" .XXXXX. ... ",
+" .XXXXX... .ooo. ",
+" .XXXXX.... ..ooo.. ",
+" .XXXXX..o.. ..ooo.. ",
+" .XXXXX...o.. ..o.. ",
+" .XXXXX. ..o........ ",
+" .XXXXX. ..oooooooo. ",
+" ....... .oooooooo.. ",
+" .ooooo..o. ",
+" .oooo..o. ",
+" .oooo..o. ",
+" .oooo..o. ",
+" .oooo..o. ",
+" ......... ",
+" ......oo. ",
+" .ooooo... ",
+" .oo..o... ",
+" .oo..o.. ",
+" ........ ",
+" .... ... ",
+" ... ... "};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 20 1",
-" c Gray0",
-". c Gray6",
-"X c Gray12",
-"o c #2ff42ff42ff4",
-"O c #3fff3fff3fff",
-"+ c Gray28",
-"@ c #53e353e353e3",
-"# c #5fe25fe25fe2",
-"$ c #67e767e767e7",
-"% c #6fff6fff6fff",
-"& c #77d777d777d7",
-"* c Gray50",
-"= c Gray56",
-"- c #9fff9fff9fff",
-"; c Gray70",
-": c Gray75",
-"> c Gray81",
-", c #dfffdfffdfff",
-"< c #efffefffefff",
-"1 c Gray100",
-/* pixels */
-"::::::::::::::::::::::::",
-"::::::::::::::::::::::::",
-"::::::::::::::::::::::::",
-"::::#oOOOOOOOOOo+;::::::",
-"::::#:111111111:O$::::::",
-"::::#:1111-O%11:*>@:::::",
-"::::#:111=X.o#<>OOo#::::",
-"::::#:111 OX# :111:#::::",
-"::::#:111 = :111:#::::",
-"::::#:111>Xo.-1111:#::::",
-"::::#:1111*:O11111:#::::",
-"::::#:11%1*oO->111:#::::",
-"::::#:1-O:,1:*O111:#::::",
-"::::#:111****:1111:#::::",
-"::::#:1111* 111111:#::::",
-"::::#:1,:O-1O*:111:#::::",
-"::::#:1:X1111*#111:#::::",
-"::::#:11>1111,<111:#::::",
-"::::#:111111111111:#::::",
-"::::#:111111111111:#::::",
-"::::#:111111111111:#::::",
-"::::&oooooooooooooo&::::",
-"::::::::::::::::::::::::",
-"::::::::::::::::::::::::"
-};
+static char * kill_group_xpm[] = {
+"24 24 3 1",
+". c None",
+"o c #000000000000",
+"+ c #9A9A6C6C4E4E",
+"o..o..o..o..o..o..o..o..",
+"........................",
+"........................",
+"o..o..o..o..o..o..o..o..",
+"........................",
+"........................",
+"o..o..o..o..++.o..o..o..",
+".......++..++++.........",
+"........++.+++..........",
+"o..o..o.+++++..o..o..o..",
+".........+++............",
+".........++++...........",
+"o..o..o.++++++.o..o..o..",
+"........++.++++.........",
+".......++...++++........",
+"o..o...+.o...++o..o..o..",
+"........................",
+"........................",
+"o..o..o..o..o..o..o..o..",
+"........................",
+"........................",
+"o..o..o..o..o..o..o..o..",
+"........................",
+"........................"};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 21 1",
-" c Gray0",
-". c Gray6",
-"X c Gray12",
-"o c #2ff02ff02ff0",
-"O c #3fff3fff3fff",
-"+ c Gray28",
-"@ c #53f353f353f3",
-"# c #5ff95ff95ff9",
-"$ c #67e767e767e7",
-"% c #6fff6fff6fff",
-"& c #77dc77dc77dc",
-"* c Gray50",
-"= c Gray56",
-"- c #9beb9beb9beb",
-"; c #9fff9fff9fff",
-": c Gray70",
-"> c Gray75",
-", c Gray81",
-"< c #dfffdfffdfff",
-"1 c #efffefffefff",
-"2 c Gray100",
-/* pixels */
-">>>>>>>>>>>>>>>==:>>>>>>",
-">>>>>>>>>>>>>>&**$&>>>>>",
-">>>>>>>>>>>>>&-22,-o->>>",
-">>>>>>>>>=$O@$,,2222O>>>",
-">>>>>>>=#*>2*>2O222>$>>>",
-">>>>>>o&>222O2%,22,$:>>>",
-">>>:$O2222<#2*>222=+:>>>",
-">>&$>;;2;2*>2><22;**$&>>",
-">>o.;,,2,,*1%222;;,O;o>>",
-">>o2;O><2O2,%221#o%22o>>",
-">>o222***O2;22;**<222o>>",
-">>o2222<>.;2,O;,22222o>>",
-">>o2221>#2;O%;;,22222o>>",
-">>o222**<22222;*>2222o>>",
-">>o22%,222222221*,222o>>",
-">>o;O,22222222222%#<2o>>",
-">>o;22222222222222<**o>>",
-">>oOOOOOOOOOOOOOOOOX o>>",
-">>>>>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>",
-">>>>>>>>>>>>>>>>>>>>>>>>"
-};
+static char * mail_reply_xpm[] = {
+"24 24 5 1",
+" c None",
+". c #000000000000",
+"X c #E1E1E0E0E0E0",
+"O c #FFFFFFFFFFFF",
+"o c #C7C7C6C6C6C6",
+" .. ",
+" .X. ",
+" ..XX. ",
+" ......XoXX.. ",
+" ...OOO.XooXXX. ",
+" ..OOOO.XooXXX. ",
+" ...OOOOO.XooXXX... ",
+" ..OOOOOO.XXooXX.OO.. ",
+" ...OOOO.oooXXX...... ",
+" .O...O.oXooXXX...OO. ",
+" .OOO...oXoXX...OOOO. ",
+" .OOOOO...X...OOOOOO. ",
+" .OOOOO.O...OO.OOOOO. ",
+" .OOO..OOOOOOOO..OOO. ",
+" .OO.OOOOOOOOOOOO.OO. ",
+" .O.OOOOOOOOOOOOOO.O. ",
+" ..OOOOOOOOOOOOOOOO.. ",
+" .................... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 36 1",
-" c Gray0",
-". c Gray6",
-"X c Gray9",
-"o c Gray12",
-"O c #23f323f323f3",
-"+ c Gray15",
-"@ c #2ff32ff32ff3",
-"# c #399939993999",
-"$ c #3fff3fff3fff",
-"% c #433243324332",
-"& c Gray28",
-"* c #4ccc4ccc4ccc",
-"= c #53ed53ed53ed",
-"- c #5ff05ff05ff0",
-"; c Gray40",
-": c #67e767e767e7",
-"> c #6ccc6ccc6ccc",
-", c #6fff6fff6fff",
-"< c Gray45",
-"1 c #77f277f277f2",
-"2 c #7bdb7bdb7bdb",
-"3 c #7ccc7ccc7ccc",
-"4 c Gray50",
-"5 c #866586658665",
-"6 c Gray56",
-"7 c Gray60",
-"8 c #9bd39bd39bd3",
-"9 c #9fff9fff9fff",
-"0 c Gray65",
-"q c #a7c7a7c7a7c7",
-"w c Gray70",
-"e c Gray75",
-"r c Gray81",
-"t c #dfffdfffdfff",
-"y c #efffefffefff",
-"u c Gray100",
-/* pixels */
-"wqewqewqewqewqewqewqewqe",
-"q6eq6eq6eq6eq6eq6eq6eq6e",
-"eeeeeeeeeeeeeeeeeeeeeeee",
-"wqewqewqewq82$.wqewqewqe",
-"q6eq6eq6e6@19u$-6eq6eq6e",
-"eeeeeeee==eyr$9@eeeeeeee",
-"wqewq82$ruuu or=qewqewqe",
-"q6e6@19uuuu94eue-eq6eq6e",
-"eeew&euuuuuruuuy18eeeeee",
-"wqew-8uuuuuuuuuu92wqewqe",
-"q6eq619uut44uuuuu$q6eq6e",
-"eeeeee29,-e@uuuuur=eeeee",
-"wqeee82$rye-$uuuuu=qewqe",
-"q6eq-19uu- e$uuuuue-eq6e",
-"ee==eyuuu -y99uuuuy18eee",
-"w&euuuuu,uuue4uuuuu92wqe",
-"q@euuuuuuuuut4tuuuueoq6e",
-"eq=u9$$$ruuuu4@$$r$;6eee",
-"wq=8,988%ruu8,98-+6qewqe",
-"q6e+wq888$et+wq888X6eq6e",
-"eee+88888.4-+88888@eeeee",
-"wqeO#6884,uu*5885<&qewqe",
-"q6eq@#**<uuut;**+&q6eq6e",
-"eeeeqOeeyuuuuteee=eeeeee"
-};
+static char * next_ur_xpm[] = {
+"24 24 8 1",
+". c None",
+" c #000000000000",
+"X c #A5A5A5A59595",
+"o c #C7C7C6C6C6C6",
+"O c #FFFF00000000",
+"+ c #9A9A6C6C4E4E",
+"@ c #E1E1E0E0E0E0",
+"# c #FFFFFFFFFFFF",
+" .. .. .. .. .. .. .. ..",
+"........................",
+"............X...........",
+" .. .. .. .XXX. .. .. ..",
+".........XXooOX.........",
+".......XXooo+O@X........",
+" .. XXXoooo++@@@X. .. ..",
+"....X@Xoooooo@@@X.......",
+"....X@@Xooo@@@@@@X......",
+" .. X@@XXoo@@@@@@@X.. ..",
+"....X@@Xoo@@@@@@@@@X....",
+"....X@Xo@@@XX@@@@@@oX...",
+" .. oXoo@XXooO@@@@@@X ..",
+"....oXoXXooo+OX@@@@Xo...",
+"....XXXoooo++@@X@@Xo....",
+" .. X@Xoooooo@@@XX .. ..",
+"....X@@Xooo@@@@@@X......",
+"....X@@XXoo@@@@@@@X.....",
+" .. X@@Xoo@@@@@@@@@X. ..",
+"....X@Xo@ @@@@@@@ X...",
+"... oXoo ## @@ @@ ## ...",
+" .. oXo #### @ #### ..",
+".....oX #### @@@ #### ..",
+".....oX@ ## @@@@X ## ..."};
--- /dev/null
+X-Face: $BP*2z+\?fNM."!*~JsIgw(Y]n?WG!KMc;^jL$SLrt@X4%uMguO/$3HO<5@43P@[~'kE'fG
+ #YdP[sb6IJ5|Sm[z#9sI|)iJ})U5;Rt-?jI3i24zoJmonTV}kTVOm/5wMCnc3P~d#+BF1c&N6mdF{u
+ CE+<;lN!v~JRyR"q0d5<\y]faXpTC4,wpQ{=<==?LRA`}3qqIgr
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 23 1",
-" c Gray0",
-". c Gray6",
-"X c Gray12",
-"o c #2ff22ff22ff2",
-"O c #3fff3fff3fff",
-"+ c Gray28",
-"@ c #53ee53ee53ee",
-"# c #5fdf5fdf5fdf",
-"$ c #67e767e767e7",
-"% c #6fff6fff6fff",
-"& c #77f777f777f7",
-"* c #7bdb7bdb7bdb",
-"= c Gray50",
-"- c Gray56",
-"; c #9bd69bd69bd6",
-": c #9fff9fff9fff",
-"> c #a7c7a7c7a7c7",
-", c Gray70",
-"< c Gray75",
-"1 c Gray81",
-"2 c #dfffdfffdfff",
-"3 c #efffefffefff",
-"4 c Gray100",
-/* pixels */
-",><,><,><,><,><,><,><,><",
-">-<>-<>-<>-<>-<>-<>-<>-<",
-"<<<<<<<<<<<<<<<<<<<<<<<<",
-",><,><,><,>;*O.,><,><,><",
-">-<>-<>-<-o&:4O#-<>-<>-<",
-"<<<<<<<<@@<31O:o<<<<<<<<",
-",><,>;*O1444 X1@><,><,><",
-">-<-o&:4444:=<4<#<>-<>-<",
-"<<<,+<4444414443&;<<<<<<",
-",><,#;4444444444:*,><,><",
-">-<>-o44444444444O>-<>-<",
-"<<<<<;%44444444441@<<<<<",
-",><,><@24444444444@><,><",
-">-<>-<-=4444444444<#<>-<",
-"<<<<<<,$14444444443&;<<<",
-",><,><,#;4444444444:*,><",
-">-<>-<>-o4444444444<X>-<",
-"<<<<<<<<;%4444444%O$-<<<",
-",><,><,><@24444<&;,><,><",
-">-<>-<>-<-=42==#-<>-<>-<",
-"<<<<<<<<<,$Oo+-<<<<<<<<<",
-",><,><,><,><,><,><,><,><",
-">-<>-<>-<>-<>-<>-<>-<>-<",
-"<<<<<<<<<<<<<<<<<<<<<<<<"
-};
+static char * post_xpm[] = {
+"24 24 8 1",
+". c None",
+" c #434343434343",
+"X c #A5A5A5A59595",
+"O c #000000000000",
+"+ c #C7C7C6C6C6C6",
+"@ c #FFFF00000000",
+"# c #9A9A6C6C4E4E",
+"$ c #E1E1E0E0E0E0",
+"O..O..O..O..O..O..O..O..",
+"........................",
+"............X...........",
+"O..O..O..O.XXX.O..O..O..",
+".........XX++@X.........",
+".......XX+++#@$X........",
+"O..OXXX++++##$$$X.O..O..",
+"....X$X++++++$$$X.......",
+"....X$$X+++$$$$$$X......",
+"O..OX$$XX++$$$$$$$X..O..",
+"....X$$X++$$$$$$$$$X....",
+"....X$X+$$$$$$$$$$$+X...",
+"O..O+X++$$$$$$$$$$$$XO..",
+"....+X+$$$$$$$$$$$$X+...",
+".....+X$$$$$$$$$$$X+....",
+"O..O.+X$$$$$$$$$XXO..O..",
+"......+X$$$$$$$X++......",
+"......+X$$$$$XX+........",
+"O..O..O+X$$$X++O..O..O..",
+".......+X$$X++..........",
+"........+XX+............",
+"O..O..O..O+.O..O..O..O..",
+"........................",
+"........................"};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 35 1",
-" c Gray0",
-". c Gray6",
-"X c Gray9",
-"o c Gray12",
-"O c #23f323f323f3",
-"+ c Gray15",
-"@ c #2ff22ff22ff2",
-"# c #399939993999",
-"$ c #3fff3fff3fff",
-"% c Gray28",
-"& c #53ed53ed53ed",
-"* c Gray35",
-"= c #5b1a5b1a5b1a",
-"- c Gray36",
-"; c #5fef5fef5fef",
-": c Gray40",
-"> c #67e767e767e7",
-", c #6ffa6ffa6ffa",
-"< c Gray45",
-"1 c #77ea77ea77ea",
-"2 c #799979997999",
-"3 c #7bdb7bdb7bdb",
-"4 c Gray50",
-"5 c Gray56",
-"6 c Gray60",
-"7 c #9bde9bde9bde",
-"8 c #9fff9fff9fff",
-"9 c #a7c7a7c7a7c7",
-"0 c #acccacccaccc",
-"q c Gray70",
-"w c Gray75",
-"e c Gray81",
-"r c #dfffdfffdfff",
-"t c #efffefffefff",
-"y c Gray100",
-/* pixels */
-"q9wq9wq9wq9wq9wq9wq9wq9w",
-"95w95w95w95w95w95w95w95w",
-"wwwwwwwwwwwwwwwwwwwwwwww",
-"q9wq9wq9wq973$.q9wq9wq9w",
-"95w95w95w5@18y$;5w95w95w",
-"wwwwwwww&&wte$8@wwwwwwww",
-"q9wq973$eyyy oe&9wq9wq9w",
-"95w5@18yyyy84wyw;w95w95w",
-"wwwq%wyyyyyeyyyt17wwwwww",
-"q9wq;7yyyyyyyyyy45q9wq9w",
-"95w9518yyr44yyyy4%%@995w",
-"wwwww&.3;;w@yyye=<<#Owww",
-"q9wq=;:$etw;$rt+w0777O9w",
-"95w5+<8yy; wo44+77777X5w",
-"ww&&wtyyy ;t@re+77777@ww",
-"q%wyyyyy,yyyw4ye=<<#Oq9w",
-"9@wyyyyyyyyyr4rywo;;995w",
-"w9&yyyyyyyyyy4we$3wwwwww",
-"q9&eyyyyyyyyyy,@wwq9wq9w",
-"95w$yyyyyyyyyyy@ww95w95w",
-"www38yyyyyyyyyy71wwwwwww",
-"q9w54yyyyyyyyyye:qq9wq9w",
-"95w9,ryyyyyyyyyy4595w95w",
-"wwww9&yyyyyyyyyyr&wwwwww"
-};
+static char * prev_ur_xpm[] = {
+"24 24 8 1",
+". c None",
+" c #000000000000",
+"X c #A5A5A5A59595",
+"o c #C7C7C6C6C6C6",
+"O c #FFFF00000000",
+"+ c #9A9A6C6C4E4E",
+"@ c #E1E1E0E0E0E0",
+"# c #FFFFFFFFFFFF",
+" .. .. .. .. .. .. .. ..",
+"........................",
+"............X...........",
+" .. .. .. .XXX. .. .. ..",
+".........XXooOX.........",
+".......XXooo+O@X........",
+" .. XXXoooo++@@@X. .. ..",
+"....X@Xoooooo@@@X.......",
+"....X@@Xooo@@@@@@X......",
+" .. X@@XXoo@@@@@@@X.. ..",
+"....X@@Xo @@@@@@ X....",
+"....X@Xo ## X @ ## X...",
+" .. oXo #XXXoO@ #### ..",
+"....oXoXXooo+OX #### ...",
+"....XXXoooo++@@X ## ....",
+" .. X@Xoooooo@@@X .. ..",
+"....X@@Xooo@@@@@@X......",
+"....X@@XXoo@@@@@@@X.....",
+" .. X@@Xoo@@@@@@@@@X. ..",
+"....X@Xo@@@@@@@@@@@@X...",
+"... oXoo@@@@@@@@@@@@X...",
+" .. oXo@@@@@@@@@@@@X....",
+".....oX@@@@@@@@@@@X.....",
+".....oX@@@@@@@@@@X......"};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 35 1",
-" c Gray0",
-". c Gray6",
-"X c Gray9",
-"o c Gray12",
-"O c #23f323f323f3",
-"+ c #2ffe2ffe2ffe",
-"@ c #399939993999",
-"# c #3fff3fff3fff",
-"$ c Gray25",
-"% c #499949994999",
-"& c #4ccc4ccc4ccc",
-"* c #519151915191",
-"= c #53f353f353f3",
-"- c Gray35",
-"; c #5feb5feb5feb",
-": c #67e767e767e7",
-"> c #6fff6fff6fff",
-", c Gray45",
-"< c #77ef77ef77ef",
-"1 c #7bdb7bdb7bdb",
-"2 c Gray50",
-"3 c Gray56",
-"4 c Gray60",
-"5 c #9bd39bd39bd3",
-"6 c #9fff9fff9fff",
-"7 c Gray64",
-"8 c #a7c7a7c7a7c7",
-"9 c Gray70",
-"0 c #b998b998b998",
-"q c #bcccbcccbccc",
-"w c Gray75",
-"e c Gray81",
-"r c #dfffdfffdfff",
-"t c #efffefffefff",
-"y c Gray100",
-/* pixels */
-"wwwwwwwwwwwwwwwwwwwwwwww",
-"wwwwwwwwwwwwwwwwwwwwwwww",
-"wwwwwwwwwwwwwwwwwwwwwwww",
-"wwwwwwwwwww5+o1wwwwwwwww",
-"wwwwwwwwww3<w26;3wwwwwww",
-"wwwwwwwww5<tw2yw<5wwwwww",
-"wwwwww93=#yy#yyyy>O8wwww",
-"wwwww<:226yy#yyyw2 ;wwww",
-"www5+5e66yyy#6##2w X5www",
-"w8=>ye#6yy2+#6yyr+9y>$8w",
-"w;;yw2yw22#wyyyr#@9yy@;w",
-"w;3#o+#2w3;tyyy+@3w##3;w",
-"w;wyy>wry66yyr+%0;>yyw;w",
-"w;wyyy222#yyr#;-2ryyyw;w",
-"7=wyyyyrw.6y+ +wryyyyw=7",
-"5&wyyyyye#o3.#6yyyyyyw&5",
-"5&wyyyyw2yw26y66yyyyyw&5",
-"5&wyyye2tyyyyyy66yyyyw&5",
-"5&wyr;>yyyyyyyyy6#eyyw&5",
-"5&wr2ryyyyyyyyyyyy2wyw&5",
-"5&+;ryyyyyyyyyyyyyt2#+&5",
-"5& wwwwwwwwwwwwwwwwww &5",
-"5,&&&&&&&&&&&&&&&&&&&&,5",
-"555555555555555555555555"
-};
+static char * reply_wo_xpm[] = {
+"24 24 4 1",
+" c None",
+". c #000000000000",
+"X c #E1E1E0E0E0E0",
+"O c #FFFFFFFFFFFF",
+" ",
+" ",
+" ",
+" .... ",
+" ..X.... ",
+" ..XX.XX.. ",
+" .O.XX.XXXX.. ",
+" ..O.XXX.XXXX... ",
+" .OO.XXXX.X....... ",
+" .OO.XXXX...XXX.OO.. ",
+" ..OO.XX....XXXX.OOOO.. ",
+" .......XX.XXXX.OOO.... ",
+" .OOO.XXX.XXXX.OO..OOO. ",
+" .OOOO....XXX....OOOOO. ",
+" .OOOOOOO..XX..OOOOOOO. ",
+" .OOOOOOO......OOOOOOO. ",
+" .OOOOOO.OO..O..OOOOOO. ",
+" .OOOOO.OOOOOOOO.OOOOO. ",
+" .OOOO.OOOOOOOOOO.OOOO. ",
+" .OOO.OOOOOOOOOOOO.OOO. ",
+" .O..OOOOOOOOOOOOOO..O. ",
+" ..OOOOOOOOOOOOOOOOOO.. ",
+" ...................... ",
+" "};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 34 1",
-" c Gray0",
-". c Gray6",
-"X c Gray9",
-"o c Gray12",
-"O c #2ffb2ffb2ffb",
-"+ c #399939993999",
-"@ c #3fff3fff3fff",
-"# c Gray25",
-"$ c #499949994999",
-"% c #4ccc4ccc4ccc",
-"& c #519151915191",
-"* c #53f353f353f3",
-"= c Gray35",
-"- c #5feb5feb5feb",
-"; c #67e767e767e7",
-": c #6fff6fff6fff",
-"> c Gray45",
-", c #77ef77ef77ef",
-"< c Gray50",
-"1 c Gray56",
-"2 c #933293329332",
-"3 c Gray60",
-"4 c #9bd29bd29bd2",
-"5 c #9fff9fff9fff",
-"6 c Gray64",
-"7 c #a7c7a7c7a7c7",
-"8 c Gray70",
-"9 c #b998b998b998",
-"0 c #bcccbcccbccc",
-"q c Gray75",
-"w c Gray81",
-"e c #dfffdfffdfff",
-"r c #efffefffefff",
-"t c Gray100",
-/* pixels */
-"qqqqqqqqqqqqqqqqqqqqqqqq",
-"qqqqqqqqqqqqqqqqqqqqqqqq",
-"qqqqqqqqqqqqqqqqqqqqqqqq",
-"qqqqqqqqqqqqqq4qqqqqqqqq",
-"qqqqqqqqqqqqq1,-1qqqqqqq",
-"qqqqqqqqq4OO4,rq,4qqqqqq",
-"qqqqqq81*:tw:tttt:*7qqqq",
-"qqqqq,;<etq<tttttt--qqqq",
-"qqq4O4wttt<qttttt: X4qqq",
-"q7*Oewrew55ttttteO6qO#7q",
-"q--<q5eq@5ttttte@+2<<+-q",
-"q-1@@wtt@ttttttO+1q@@1-q",
-"q-qtt:q<wtttteO$9-:ttq-q",
-"q-qttt<<<ttte@-=<etttq-q",
-"6*qtttteq:ttO Oqettttq*6",
-"4%qtttttw@o1.@5ttttttq%4",
-"4%qttttq<tq<5t55tttttq%4",
-"4%qtttw<rtttttt55ttttq%4",
-"4%qte-:ttttttttt5@wttq%4",
-"4%qe<etttttttttttt<qtq%4",
-"4%O-etttttttttttttr<@O%4",
-"4% qqqqqqqqqqqqqqqqqq %4",
-"4>%%%%%%%%%%%%%%%%%%%%>4",
-"444444444444444444444444"
-};
+static char * reply_xpm[] = {
+"24 24 4 1",
+" c None",
+". c #000000000000",
+"X c #E1E1E0E0E0E0",
+"O c #FFFFFFFFFFFF",
+" ",
+" ",
+" ",
+" .... ",
+" ..XXX.. ",
+" ..XXXXX.. ",
+" .O.XXXXXXX.. ",
+" ..O.XXXXXXXXX.. ",
+" .OO.XXXXXXXXXX... ",
+" .OO.XXXXXXXXXX.OO.. ",
+" ..OO.XXXXXXXXXX.OOOO.. ",
+" .....XXXXXXXXX.OOO.... ",
+" .OOO.XXXXXXXX.OO..OOO. ",
+" .OOOO...XXXXX...OOOOO. ",
+" .OOOOOOO..XX..OOOOOOO. ",
+" .OOOOOOO......OOOOOOO. ",
+" .OOOOOO.OO..O..OOOOOO. ",
+" .OOOOO.OOOOOOOO.OOOOO. ",
+" .OOOO.OOOOOOOOOO.OOOO. ",
+" .OOO.OOOOOOOOOOOO.OOO. ",
+" .O..OOOOOOOOOOOOOO..O. ",
+" ..OOOOOOOOOOOOOOOOOO.. ",
+" ...................... ",
+" "};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 20 1",
-" c Gray0",
-". c Gray6",
-"X c Gray12",
-"o c #2ff52ff52ff5",
-"O c #3fff3fff3fff",
-"+ c Gray28",
-"@ c #53e353e353e3",
-"# c #5fe45fe45fe4",
-"$ c #67e767e767e7",
-"% c #6fff6fff6fff",
-"& c #77d777d777d7",
-"* c Gray50",
-"= c Gray56",
-"- c #9fff9fff9fff",
-"; c Gray70",
-": c Gray75",
-"> c Gray81",
-", c #dfffdfffdfff",
-"< c #efffefffefff",
-"1 c Gray100",
-/* pixels */
-"::::::::::::::::::::::::",
-"::::::::::::::::::::::::",
-"::::::::::::::::::::::::",
-"::::#oOOOOOOOOOo+;::::::",
-"::::#:,*,,**11-#O$::::::",
-"::::#:#:#:#:%--=*>@:::::",
-"::::#:o:o:*%>*:>OOo#::::",
-"::::#:X*X:O*-:**:1:#::::",
-"::::#:>1><::11>:,1:#::::",
-"::::#:>-111%111%11:#::::",
-"::::#:*:-1:*1:*-11:#::::",
-"::::#: *O>*:%*=--1:#::::",
-"::::#:O* :*1O*o%11:#::::",
-"::::#:O:X,**-*:111:#::::",
-"::::#:>1>1,:1,<111:#::::",
-"::::#:1,oo,1111111:#::::",
-"::::#:,O##O*****:1:#::::",
-"::::#:: :: *1:#::::",
-"::::#:1-..-1:*O:*1:#::::",
-"::::#:11--11,:O,:1:#::::",
-"::::#:11111111>111:#::::",
-"::::&oooooooooooooo&::::",
-"::::::::::::::::::::::::",
-"::::::::::::::::::::::::"
-};
+static char * rot13_xpm[] = {
+"24 24 5 1",
+" c None",
+". c #A5A5A5A59595",
+"X c #C7C7C6C6C6C6",
+"o c #E1E1E0E0E0E0",
+"O c #919187876969",
+" ",
+" ",
+" ",
+" . ",
+" ..X. ",
+" ..XXX. ",
+" ..XXXXXo. ",
+" ...XXXXXXooo. ",
+" .o.XXXXXoooo. ",
+" .oo.XXXooOooo. ",
+" .oo..XXoOXOOoo. ",
+" .oo.XXoOXooOXoo. ",
+" .o.XoooOOXXOXooX. ",
+" .XXooOOXOOXoooo. ",
+" .XooOOOooooooo. ",
+" .oOOXOXooooo. ",
+" .oOOXoooooo. ",
+" .oOOXooo.. ",
+" .oooooo. ",
+" .ooo.. ",
+" .oo. ",
+" .. ",
+" ",
+" "};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 25 1",
-" c Gray6",
-". c #133313331333",
-"X c #199919991999",
-"o c Gray15",
-"O c #2fef2fef2fef",
-"+ c Gray20",
-"@ c #398739873987",
-"# c #3fff3fff3fff",
-"$ c Gray28",
-"% c #4ccc4ccc4ccc",
-"& c #5fdf5fdf5fdf",
-"* c #626262626262",
-"= c Gray40",
-"- c #72f272f272f2",
-"; c Gray45",
-": c #77d777d777d7",
-"> c #7bdb7bdb7bdb",
-", c #7ccc7ccc7ccc",
-"< c Gray56",
-"1 c Gray60",
-"2 c #9fff9fff9fff",
-"3 c #a7c7a7c7a7c7",
-"4 c Gray75",
-"5 c Gray90",
-"6 c Gray100",
-/* pixels */
-"444444444444444444444444",
-"444444444444444444444444",
-"4444444:OOOOOOOOOOO:4444",
-"4444444&4666666666#2>444",
-"4444444&4666666666#62:44",
-"4444444&4666666666 ##O44",
-"4444444&4666666666666O44",
-"4444444&4666666666666O44",
-"4444444&4666666666666O44",
-"43<<<<<$<444444666666O44",
-"4&@@@-------.%.666666O44",
-"4&---5555555o1o666666O44",
-"4&---5555555o1o666666O44",
-"4&---5555555o1o666666O44",
-"4&---5555555o1o666666O44",
-"4&---5555555o1o666666O44",
-"4&--@-------o1o666666O44",
-"4&-<--------,1o666666O44",
-"4&-<--------,1o444444O44",
-"4&--X++++o@-o1o&&&&&&:44",
-"4&--+====%-5o1o444444444",
-"4:*-+====%-5o1o444444444",
-"44:@X++++o@-.%.444444444",
-"444<<<<<<<<<<<<444444444"
-};
+static char * save_aif_xpm[] = {
+"24 24 6 1",
+" c None",
+". c #999999999999",
+"X c #E1E1E0E0E0E0",
+"o c #C7C7C6C6C6C6",
+"O c #000000000000",
+"+ c #FFFFFFFFFFFF",
+" ",
+" ",
+" ............. ",
+" .XXXXXXXXXX.X.. ",
+" .XXXXXXXXXX.XX. ",
+" .XXXXXXXXXX.... ",
+" .XXXXXXXXXXooo. ",
+" .XXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXX. ",
+" .XXXXXXXXXXXXX. ",
+" OOOOOOOOOOOOOOXXXXXX. ",
+" O..O+++++++O.OXXXXXX. ",
+" O..O+++++++O.OXXXXXX. ",
+" O..O+++++++O.OXXXXXX. ",
+" O..O+++++++O.OXXXXXX. ",
+" O..O+++++++O.OXXXXXX. ",
+" O..OOOOOOOOO.OXXXXXX. ",
+" O............OXXXXXX. ",
+" O............OXXXXXX. ",
+" O..OOOOOOOOO.O....... ",
+" O..OoooooO++.O ",
+" O..OoooooO++.O ",
+" O.OoooooO++.O ",
+" OOOOOOOOOOOO "};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 32 1",
-" c Gray0",
-". c #133313331333",
-"X c #199919991999",
-"o c Gray12",
-"O c #23f323f323f3",
-"+ c Gray15",
-"@ c #2fef2fef2fef",
-"# c Gray20",
-"$ c #398739873987",
-"% c #3fff3fff3fff",
-"& c #4ccc4ccc4ccc",
-"* c #53e353e353e3",
-"= c #5fe65fe65fe6",
-"- c #626262626262",
-"; c Gray40",
-": c #6fff6fff6fff",
-"> c #72f272f272f2",
-", c Gray45",
-"< c #77d777d777d7",
-"1 c #7ccc7ccc7ccc",
-"2 c Gray50",
-"3 c Gray56",
-"4 c Gray60",
-"5 c #9bcb9bcb9bcb",
-"6 c #9fff9fff9fff",
-"7 c #a7c7a7c7a7c7",
-"8 c Gray75",
-"9 c Gray81",
-"0 c #dfffdfffdfff",
-"q c Gray90",
-"w c #efffefffefff",
-"e c Gray100",
-/* pixels */
-"888888888888888888888888",
-"888888888888888888888888",
-"88888*@@@@@@@@@@@@@@@@@4",
-"88888@%28eeeeeeeeee08%o3",
-"88888@e8228eeeeeee222e23",
-"88888@eee82%eeee6%80ee23",
-"88888@eeew8=%28%28eeee23",
-"88888@eee220e82e826eee23",
-"88888@ee:9eeeeeeee6%9e23",
-"87333O3 3888888eeeee:==3",
-"8=$$$>>>>>>>.&.eeeeee0%3",
-"8=>>>qqqqqqq+4+%%%%%%%o3",
-"8=>>>qqqqqqq+4+888888888",
-"8=>>>qqqqqqq+4+888888888",
-"8=>>>qqqqqqq+4+888888888",
-"8=>>>qqqqqqq+4+888888888",
-"8=>>$>>>>>>>+4+888888888",
-"8=>3>>>>>>>>24+888888888",
-"8=>3>>>>>>>>24+888888888",
-"8=>>X####+$>+4+888888888",
-"8=>>#;;;;&>q+4+888888888",
-"8<->#;;;;&>q+4+888888888",
-"88<$X####+$>.&.888888888",
-"888333333333333888888888"
-};
+static char * save_art_xpm[] = {
+"24 24 5 1",
+" c None",
+". c #000000000000",
+"X c #FFFFFFFFFFFF",
+"o c #999999999999",
+"O c #C7C7C6C6C6C6",
+" ",
+" ",
+" .................. ",
+" ...XXXXXXXXXXXXX.. ",
+" .XX..XXXXXXXXX..X. ",
+" .XXXX..XXXXX..XXX. ",
+" .XXXXX......XXXXX. ",
+" .XXX..XX..XX..XXX. ",
+" .XX..XXXXXXXX..XX. ",
+" ...XXXXXXXXXXXX... ",
+" ..............XXXXXXX. ",
+" .oo.XXXXXXX.o......... ",
+" .oo.XXXXXXX.o. ",
+" .oo.XXXXXXX.o. ",
+" .oo.XXXXXXX.o. ",
+" .oo.XXXXXXX.o. ",
+" .oo.........o. ",
+" .oooooooooooo. ",
+" .oooooooooooo. ",
+" .oo.........o. ",
+" .oo.OOOOO.XXo. ",
+" .oo.OOOOO.XXo. ",
+" .o.OOOOO.XXo. ",
+" ............ "};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 19 1",
-" c Gray6",
-". c Gray12",
-"X c #2ff42ff42ff4",
-"o c #3fff3fff3fff",
-"O c Gray28",
-"+ c #53e353e353e3",
-"@ c #5fe25fe25fe2",
-"# c #67e767e767e7",
-"$ c #6fff6fff6fff",
-"% c #77d777d777d7",
-"& c Gray50",
-"* c Gray56",
-"= c #9fff9fff9fff",
-"- c Gray70",
-"; c Gray75",
-": c Gray81",
-"> c #dfffdfffdfff",
-", c #efffefffefff",
-"< c Gray100",
-/* pixels */
-";;;;;;;;;;;;;;;;;;;;;;;;",
-";;;;;;;;;;;;;;;;;;;;;;;;",
-";;;;;;;;;;;;;;;;;;;;;;;;",
-";;;;@Xooooo oooXO-;;;;;;",
-";;;;@;>;=<<o<<<;o#;;;;;;",
-";;;;@;,&=<<o<<<;&:+;;;;;",
-";;;;@;:=$<<o<<<:ooX@;;;;",
-";;;;@@&&&&&.<<<<<<;@;;;;",
-";;;;@*;;;;;X<<<<<<;@;;;;",
-";;;;@;:&@<<o<<<<<<;@;;;;",
-";;;;@;>&&<<o<<<<<<;@;;;;",
-";;;;@;,>:<<o<<<<<<;@;;;;",
-";;;;@Xooooo <<<<<<;@;;;;",
-";;;;@;>;=<<o<<<<<<;@;;;;",
-";;;;@;,&=<<o<<<<<<;@;;;;",
-";;;;@;:=$<<o<<<<<<;@;;;;",
-";;;;@@&&&&&.<<<<<<;@;;;;",
-";;;;@*;;;;;X<<<<<<;@;;;;",
-";;;;@;<<<<<o<<<<<<;@;;;;",
-";;;;@;<<<<<o<<<<<<;@;;;;",
-";;;;@;<<<<<o<<<<<<;@;;;;",
-";;;;%XXXXXXXXXXXXXX%;;;;",
-";;;;;;;;;;;;;;;;;;;;;;;;",
-";;;;;;;;;;;;;;;;;;;;;;;;"
-};
+static char * subscribe_xpm[] = {
+"24 24 5 1",
+" c None",
+". c #A5A5A5A59595",
+"X c #E1E1E0E0E0E0",
+"o c #C7C7C6C6C6C6",
+"O c #8686ADAD7D7D",
+" ",
+" ",
+" ",
+" ... ",
+" ..XXX..... ",
+"...XXXXX..XXX. ... ",
+".X.XX...XXXX...XXX. ",
+".XX.X.X.XX...XXXXX. ",
+".XX...XX.X.X.XXXXXX. ",
+".XX.o.XX...XX.XXXXXX. ",
+".X.oo.XX.o.XX..XXXXXX. ",
+"o.ooo.X.oo.XX.XXXOXXX. ",
+"o.oXXo.ooo.X.oXXOXXXXX. ",
+" o.XXo.oXXo.ooXXOXXXXX. ",
+" o.XXXo.XXo.oXXXOXXXXXX.",
+" o.XXo.XXXo.XOOOOXXXXX.",
+" o.XXoo.XXo.XXXOOXXXXX.",
+" o.XXo.XXXo.XXXXXXX...",
+" o.XX.o.XXo.XXXXXX.oo ",
+" o..oo.XX.o.XXX..o ",
+" oo o..oo.XX.oo ",
+" oo o..o ",
+" oo ",
+" "};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 18 1",
-" c Gray6",
-". c Gray12",
-"X c #2ff42ff42ff4",
-"o c #3fff3fff3fff",
-"O c Gray28",
-"+ c #53e353e353e3",
-"@ c #5fe55fe55fe5",
-"# c #67e767e767e7",
-"$ c #77d777d777d7",
-"% c Gray50",
-"& c Gray56",
-"* c #9fff9fff9fff",
-"= c Gray70",
-"- c Gray75",
-"; c Gray81",
-": c #dfffdfffdfff",
-"> c #efffefffefff",
-", c Gray100",
-/* pixels */
-"------------------------",
-"------------------------",
-"------------------------",
-"----@Xooooo oooXO=------",
-"----@-,,,:-o,,,-o#------",
-"----@-,,,@:o,,,-%;+-----",
-"----@-;%@,,o,,,;ooX@----",
-"----@@%o@%%.,,,,,,-@----",
-"----@&-----X,,,,,,-@----",
-"----@-,,,**o,,,,,,-@----",
-"----@-:-**,o,,,,,,-@----",
-"----@->%*,,o,,,,,,-@----",
-"----@Xooooo ,,,,,,-@----",
-"----@-,,,:-o,,,,,,-@----",
-"----@-,,,@:o,,,,,,-@----",
-"----@-;%@,,o,,,,,,-@----",
-"----@@%o@%%.,,,,,,-@----",
-"----@&-----X,,,,,,-@----",
-"----@-,,,,,o,,,,,,-@----",
-"----@-,,,,,o,,,,,,-@----",
-"----@-,,,,,o,,,,,,-@----",
-"----$XXXXXXXXXXXXXX$----",
-"------------------------",
-"------------------------"
-};
+static char * unsubscribe_xpm[] = {
+"24 24 5 1",
+" c None",
+". c #A5A5A5A59595",
+"X c #E1E1E0E0E0E0",
+"o c #C7C7C6C6C6C6",
+"O c #FFFF00000000",
+" ",
+" ",
+" ",
+" ... ",
+" ..XXX..... ",
+"...XXXXX..XXX. ... ",
+".X.XX...XXXX...XXX. ",
+".XX.X.X.XX...XXXXX. ",
+".XX...XX.X.X.XXXXXX. ",
+".XX.o.XX...XX.XXXXXX. ",
+".X.oo.XX.o.XX..XXXXXX. ",
+"o.ooo.X.oo.XX.XXXXXXX. ",
+"o.oXXo.ooo.X.oXXXXXXXX. ",
+" o.XXo.oXXo.ooXXOXXXXX. ",
+" o.XXXo.XXo.oXXXOXXXXXX.",
+" o.XXo.XXXo.XOOOXXXXXX.",
+" o.XXoo.XXo.XoOOOXXXXX.",
+" o.XXo.XXXo.XOoOXXX...",
+" o.XX.o.XXo.XOXoXX.oo ",
+" o..oo.XX.o.oXX..o ",
+" oo o..oo.XX.oo ",
+" oo o..o ",
+" oo ",
+" "};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 18 1",
-" c #2fef2fef2fef",
-". c #3fff3fff3fff",
-"X c #4ccc4ccc4ccc",
-"o c #53e353e353e3",
-"O c #566656665666",
-"+ c #5fe35fe35fe3",
-"@ c Gray45",
-"# c #77d777d777d7",
-"$ c Gray50",
-"% c #866586658665",
-"& c Gray56",
-"* c Gray60",
-"= c #9fff9fff9fff",
-"- c Gray75",
-"; c Gray81",
-": c #dfffdfffdfff",
-"> c #efffefffefff",
-", c Gray100",
-/* pixels */
-"------------------------",
-"------------------------",
-"------------------------",
-"------------------------",
-"-----#+++++++++++++&----",
-"----- @@@@@@@@@@@@O+----",
-"----- *%@@@@@@@@@&@+----",
-"----- *X+$$$$$$$.@@+----",
-"----- *X-,,,,,,,$@@+----",
-"----- *X-,,;,,,,$@@+----",
-"----- *X-:$$$-=,$@@+----",
-"----- *X-+-+-$=,$@@+----",
-"----- *X->$;;,,,$@@+----",
-"----- *X--.$.,,,$@@+----",
-"----- *X->--==,,$@@+----",
-"----- *X-,,,,=;,$@@+----",
-"----- *X-,,,,,,,$@@+----",
-"----- *X-,,,,,,,$@@+----",
-"----- *X&-------+@@+----",
-"----- *@XXXXXXXXX%@+----",
-"----- ************@+----",
-"-----o #----",
-"------------------------",
-"------------------------"
-};
+static char * uu_decode_xpm[] = {
+"24 24 9 1",
+" c None",
+". c #919187876969",
+"X c #C2C2B9B99C9C",
+"o c #868686868686",
+"O c #8F8F8F8F8F8F",
+"+ c #000000000000",
+"@ c #4C4C4C4C4C4C",
+"# c #E9E9EFEFE8E8",
+"$ c #8686ADAD7D7D",
+" ",
+" ",
+" ",
+" .............. ",
+" X.o.........O.++ ",
+" XX++++++++++..++ ",
+" XX@########+..++ ",
+" XX@########+..++ ",
+" XX@$#$$$#$#+..++ ",
+" XX@#$$$$$$#+..++ ",
+" XX@##$#####+..++ ",
+" XX@##$#$$##+..++ ",
+" XX@##$#$$##+..++ ",
+" XX@##$$#$$#+..++ ",
+" XX@######$#+..++ ",
+" XX@########+..++ ",
+" XX@########+..++ ",
+" XX.@@@@@@@@@..++ ",
+" X.XXXXXXXXXX..++ ",
+" .XXXXXXXXXXXX.++ ",
+" +++++++++++++++ ",
+" +++++++++++++++ ",
+" ",
+" "};
/* XPM */
-static char *magick[] = {
-/* columns rows colors chars-per-pixel */
-"24 24 27 1",
-" c Gray0",
-". c #0bfb0bfb0bfb",
-"X c Gray9",
-"o c Gray12",
-"O c #2fef2fef2fef",
-"+ c #3fff3fff3fff",
-"@ c Gray28",
-"# c #4ccc4ccc4ccc",
-"$ c #53e353e353e3",
-"% c #566656665666",
-"& c #5fe25fe25fe2",
-"* c #6fff6fff6fff",
-"= c Gray45",
-"- c #77d777d777d7",
-"; c Gray50",
-": c #866586658665",
-"> c Gray56",
-", c Gray60",
-"< c #9bcb9bcb9bcb",
-"1 c #9fff9fff9fff",
-"2 c #a7c7a7c7a7c7",
-"3 c Gray70",
-"4 c Gray75",
-"5 c Gray81",
-"6 c #dfffdfffdfff",
-"7 c #efffefffefff",
-"8 c Gray100",
-/* pixels */
-"$44$44$44$44$44$44$44$44",
-"444444444444-44444444444",
-"4444444444-O-O,444444444",
-"$44$44$2>O-4$4$@>3$44$44",
-"444444&&&4444442&&-44444",
-"44444$ XOOOOOOOOO..-4444",
-"$44$4O,,,,,,,,,,,,=&4$44",
-"44444O,=#########:=&4444",
-"44444O,#>4444444&==&4444",
-"$44$4O,#48888888;==&4$44",
-"44444O,#48818888;==&4444",
-"44444O,#45+1+1*8;==&4444",
-"$44$4O,#4*6&8158;==&4$44",
-"44444O,#46;61888;==&4444",
-"44444O,#44o++888;==&4444",
-"$44$4O,#48885;78;==&4$44",
-"44444O,#48888468;==&4444",
-"44444O,#48888888;==&4444",
-"$44$4O,#48888888;==&4$44",
-"44444O,#&;;;;;;;+==&4444",
-"44444O,:=========>=&4444",
-"$44$4O============%&4$44",
-"44444-&&&&&&&&&&&&&>4444",
-"444444444444444444444444"
-};
+static char * uu_post_xpm[] = {
+"24 24 8 1",
+". c None",
+"X c #000000000000",
+"+ c #C2C2B9B99C9C",
+"@ c #919187876969",
+"# c #868686868686",
+"% c #4C4C4C4C4C4C",
+"& c #E9E9EFEFE8E8",
+"* c #8686ADAD7D7D",
+"X..X..X..X.XX..X..X..X..",
+"..........X.X...........",
+".........X...X..........",
+"X..X..X.XX..X.XX..X..X..",
+".......X.......X........",
+"......X.........X.......",
+"X..X+X@@@@@@@@@@@XX..X..",
+"....+@@@@@@@@@@@@@......",
+"....++XXXXXXXXXX@@......",
+"X..X++%&&&&&&&&X@@X..X..",
+"....++%&&&&&&&&X@@......",
+"....++%*&***&*&X@@......",
+"X..X++%&******&X@@X..X..",
+"....++%&&*&&&&&X@@......",
+"....++%&&*&**&&X@@......",
+"X..X++%&&*&**&&X@@X..X..",
+"....++%&&**&**&X@@......",
+"....++%&&&&&&*&X@@......",
+"X..X++%&&&&&&&&X@@X..X..",
+"....++%&&&&&&&&X@@......",
+"....++@%%%%%%%%%@@......",
+"X..X+@++++++++++@@X..X..",
+"....+++++++++++++@......",
+"........................"};
+2002-01-04 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-xmas.el (gnus-xmas-create-image): Convert pbm to xbm.
+ (gnus-xmas-create-image): Take pbm files.
+
+2002-01-03 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-xmas.el (gnus-xmas-create-image): Take optional
+ parameters.
+ (gnus-xmas-put-image): Allow non-strings to be passed.
+
+ * gnus-ems.el (gnus-create-image): Take optional parameters.
+
+2002-01-02 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ Display picons in XEmacs without showing text.
+
+ * gnus-xmas.el (gnus-xmas-create-image): Don't use
+ mm-create-image-xemacs to create xbm glyph, because it deletes
+ temporary files.
+ (gnus-xmas-put-image): Use end-glyph. Make text invisible.
+ (gnus-xmas-remove-image): Make text visible, remove glyph.
+
+2002-01-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-delay.el (gnus-delay-send-queue): Renamed.
+
+ * gnus-art.el (gnus-ignored-headers): More headers,
+
+ * ietf-drums.el (ietf-drums-parse-addresses): Use `error' instead
+ of `scan-error', since XEmacs doesn't seem to support that.
+
+2001-12-31 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-summary-best-unread-article): Take a prefix
+ arg.
+ (gnus-summary-best-unread-subject): Ditto.
+ (gnus-summary-best-unread-subject): No, don't.
+ (gnus-summary-better-unread-subject): New command.
+
+ * gnus-xmas.el (gnus-xmas-put-image): Insert the string itself.
+
+ * lpath.el ((featurep 'xemacs)): fbind url function.
+
+ * gnus-xmas.el (gnus-xmas-article-display-xface): Use data, not
+ buffer.
+ (gnus-xmas-remove-image): Implementation that does something.
+ (gnus-xmas-article-display-xface): Mark images properly.
+
+ * gnus-art.el (gnus-mime-print-part): Use mm-temp-directory.
+
+2001-12-31 Florian Weimer <fw@deneb.enyo.de>
+
+ * gnus.el (gnus): Warn if trying to run Gnus un-byte-compiled.
+
+2001-12-31 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-group.el (gnus-group-line-format): Added %O to the default
+ value.
+
+ * gnus-util.el (gnus-text-with-property): The smallest point is
+ point-min.
+
+ * smiley-ems.el (smiley-region): Return images.
+ (gnus-smiley-display): Allow toggling.
+ (smiley-region): Use text properties, not overlays.
+
+ * gnus-xmas.el (gnus-xmas-remove-image): New function, not
+ implemented yet.
+
+ * smiley-ems.el (smiley-update-cache): Check for valid types.
+
+ * gnus-art.el (gnus-with-article-buffer): New macro.
+
+ * gnus-picon.el (gnus-picon-transform-newsgroups): Keep the
+ strings as well as the glyphs.
+ (gnus-picon-transform-address): Ditto.
+ (gnus-picon-insert-glyph): Ditto.
+ (gnus-picon-transform-newsgroups): Toggle.
+ (gnus-picon-transform-address): Toggle.
+
+ * gnus-ems.el (gnus-remove-image): New function.
+ (gnus-put-image): Take an optional string.
+
+ * gnus-util.el (gnus-text-with-property): New function.
+
+ * gnus-art.el (gnus-delete-images): New function.
+
+ * gnus-ems.el (gnus-article-display-xface): Mark and store image.
+
+ * gnus-art.el (gnus-article-wash-status-entry): Renamed.
+ (gnus-article-wash-status): Use it.
+ (gnus-signature-toggle): Clean up.
+ (gnus-add-wash-status): New function.
+ (gnus-delete-wash-status): New function.
+ (gnus-article-hide-text-type): Use them throughout.
+ (gnus-add-image): New function.
+
+ * gnus-ems.el (gnus-article-display-xface): Use new interface.
+
+ * gnus-xmas.el (gnus-xmas-article-display-xface): Use new
+ interface.
+
+ * gnus-art.el (article-display-x-face): Cleaned up.
+
+ * rfc2047.el (rfc2047-field-value): New function.
+
+ * mail-parse.el (mail-header-field-value): New alias.
+
+ * gnus-art.el (gnus-mime-print-part): Fix typos.
+
+ * smiley-ems.el (gnus-smiley-file-types): New variable.
+ (smiley-update-cache): Use it.
+ (smiley-regexp-alist): Suffix-less smiley names.
+ (smiley-regexp-alist): Added more smileys.
+
+ * gnus-sum.el (gnus-print-buffer): Made into own function.
+ (gnus-summary-print-article): Use it.
+
+ * mailcap.el (mailcap-mime-info): Actually return the bit that we
+ looked for when REQUEST is a string.
+
+ * gnus-art.el (gnus-mime-button-commands): Add printing
+ keystroke.
+ (gnus-mime-copy-part): Doc fix.
+ (gnus-mime-print-part): New command.
+
+2001-12-31 Simon Josefsson <jas@extundo.com>
+
+ * imap.el (imap-parse-fetch): Notice empty flags responses. From
+ Nic Ferrier <nferrier@tf1.tapsellferrier.co.uk>.
+
+2001-12-30 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * gnus-picon.el (gnus-treat-from-picon): Autoload.
+ (picon): Fix doc.
+
+ * gnus-win.el (gnus-window-to-buffer): gnus-picon-buffer-name no
+ longer exists. Remove those codes.
+ * gnus.el (gnus-use-picons): Ditto.
+
+2001-12-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-article-treat-fold-newsgroups): Don't
+ infloop.
+
+ * gnus-sum.el (t): New `W D' map.
+
+ * gnus-art.el (gnus-treat-fold-newsgroups): New variable.
+ (gnus-article-treat-body-boundary): Clean up.
+ (gnus-body-boundary-face): Removed.
+ (gnus-article-goto-header): Moved here.
+ (gnus-article-goto-header): Allow better regexps.
+ (gnus-article-treat-fold-newsgroups): New command.
+
+ * gnus-sum.el (gnus-summary-move-article): We have to select an
+ article to give `gnus-read-move-group-name' an opportunity to
+ suggest an appropriate default.
+
+ * rfc2047.el (rfc2047-fold-line): New function.
+ (rfc2047-unfold-line): Ditto.
+ (rfc2047-fold-region): Don't fold just after the header name.
+
+ * mail-parse.el (mail-header-fold-line): New alias.
+ (mail-header-unfold-line): Ditto.
+
+ * gnus-art.el (gnus-body-boundary-face): Renamed.
+ (gnus-article-treat-body-boundary): Use it.
+ (gnus-article-treat-body-boundary): Use an invisible header and a
+ line of underline characters.
+
+2001-12-30 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * ietf-drums.el (ietf-drums-parse-addresses): Recover from errors.
+
+ * gnus-picon.el (gnus-picon-transform-address): Skip bad addresses.
+ (gnus-picon-split-address): New function.
+ (gnus-picon-find-face): Use it.
+ (gnus-picon-transform-address): Use it. Set first to t for each
+ address.
+
+ * gnus-art.el (gnus-with-article-headers): Move to here. Define
+ the macro then use it.
+ (gnus-treatment-function-alist): Treat picons earlier.
+
+2001-12-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-body-separator-face): New variable.
+ (gnus-article-treat-body-boundary): Use a blank, colored line.
+
+ * gnus-picon.el (gnus-picon-find-face): Look into misc/MISC as
+ well.
+
+ * gnus-art.el (gnus-treat-body-boundary): New variable.
+ (gnus-article-treat-unfold-headers): Use helper macro.
+ (gnus-article-treat-body-boundary): New command.
+
+ * gnus.el (gnus-logo-color-style): Change the default color.
+ (gnus-splash-face): Gray, gray.
+
+ * gnus-xmas.el (gnus-xmas-group-startup-message): Use general
+ colors.
+
+ * gnus.el (gnus-logo-color-alist): Moved here and renamed.
+ (gnus-logo-color-style): Ditto.
+ (gnus-logo-colors): Ditto.
+
+ * gnus-picon.el (gnus-picon-create-glyph): Cache glyphs.
+
+ * gnus-art.el (gnus-treat-newsgroups-picon): New variable.
+
+ * gnus-picon.el (gnus-treat-newsgroups-picon): New function.
+ (gnus-picon-transform-newsgroups): New function.
+
+ * ietf-drums.el (ietf-drums-parse-addresses): Accept a nil
+ string.
+
+ * gnus-picon.el (gnus-treat-mail-picon): Renamed.
+
+ * gnus-art.el (gnus-treat-cc-picon): New variable.
+ (gnus-treat-mail-picon): Renamed.
+
+ * gnus-picon.el: New implementation.
+ (gnus-picon-find-face): Renamed.
+ (gnus-treat-from-picon): Use it.
+ (gnus-picon-transform-address): Renamed.
+ (gnus-treat-from-picon): Use it.
+ (gnus-picon-create-glyph): Renamed.
+ (gnus-picon-transform-address): Use it.
+ (gnus-treat-cc-picon): New command.
+
+ * mm-decode.el (mm-create-image-xemacs): Separated out into
+ function.
+ (mm-get-image): Use it.
+
+ * gnus-art.el (gnus-treat-display-picons): Simplify.
+ (gnus-treat-from-picon): Renamed.
+
+ * gnus-ems.el (gnus-create-image): New function.
+ (gnus-put-image): New function.
+
+ * gnus-art.el (gnus-article-treat-unfold-headers): Doc fix.
+ (gnus-with-article-headers): New macro.
+ (gnus-article-goto-header): New function.
+
+ * gnus-xmas.el (gnus-image-type-available-p): New function.
+
+ * gnus-ems.el (gnus-image-type-available-p): New function.
+
+2001-12-30 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * nnrss.el (nnrss-check-group): Find the correct tag, because
+ xml.el is changed.
+
+2001-12-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-article-treat-unfold-headers): Only fold when
+ lines are shorter than the window width.
+ (gnus-ignored-headers): More headers.
+
+2001-12-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-treat-unfold-lines): New variable.
+ (gnus-treat-unfold-headers): Remamed.
+ (gnus-article-treat-unfold-headers): New command and keystroke.
+
+ * rfc2047.el (rfc2047-encode-message-header): Clean up.
+
+ * gnus-int.el (gnus-open-server): Mark quit-ed server as denied.
+
+2001-12-29 ShengHuo ZHU <zsh@cs.rochester.edu>
+
+ * sha1-el.el (sha1-use-external): New variable.
+ (sha1-region): Use it.
+ (sha1-string): Ditto.
+
+ * dgnushack.el (dgnushack-compile): Compile gnus-picon for Emacs.
+ * gnus-picon.el: Less warnings when compile.
+
+2001-12-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-picon.el (gnus-picons-news-directories): Removed obsolete
+ alias.
+ (gnus-picons-database): Default to list.
+ (gnus-picons-lookup-internal): Use it.
+
+ * nnmail.el (nnmail-article-group): Default nnmail-split-methods
+ to "bogus".
+
+ * gnus-win.el (gnus-configure-windows-hook): New hook.
+
+2001-12-29 Sascha L\e,A|\e(Bdecke <sascha@meta-x.de>
+
+ * gnus-win.el (gnus-configure-windows): Minimize tree buffer.
+
+2001-12-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-update-marks): Don't uncompress the seen
+ lists.
+ (gnus-select-newsgroup): Don't append; push.
+ (gnus-adjust-marked-articles): Remove obsolete ranges from
+ `seen'.
+ (gnus-update-marks): Clean up.
+ (gnus-select-newsgroup): Don't stomp gnus-newsgroup-seen.
+
+2001-12-29 Frank Schmitt <usereplyto@Frank-Schmitt.net>
+
+ * gnus-sum.el (gnus-summary-limit-to-age): Allow negative days.
+
+2001-12-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-sum.el (gnus-auto-select-subject): New variable.
+ (gnus-summary-best-unread-subject): New function.
+ (gnus-summary-best-unread-article): Use it.
+ (gnus-summary-first-unseen-subject): New function and command.
+
+ * gnus-art.el (gnus-treatment-function-alist): Emphasize after
+ other treatments.
+
+ * gnus-util.el (gnus-put-overlay-excluding-newlines): New
+ function.
+
+ * gnus-art.el (gnus-article-show-hidden-text): Remove the type
+ from the list of hidden types.
+
+ * mm-view.el (mm-inline-text): Ditto.
+ (mm-inline-text): Ditto.
+ (mm-w3-prepare-buffer): Ditto.
+
+ * gnus-art.el (article-wash-html): Inhibit more remote fetching.
+
+2001-12-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-art.el (gnus-ignored-headers): Added more headers.
+
+2001-12-29 Jesper Harder <harder@ifa.au.dk>
+
+ * gnus-srvr.el (gnus-browse-foreign-server): Compute the prefix
+ once.
+
+2001-12-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus-srvr.el (gnus-server-browse-in-group-buffer): Doc fix.
+
+2001-12-28 Simon Josefsson <jas@extundo.com>
+
+ * gnus-srvr.el (gnus-browse-foreign-server): Fix typo. From
+ Jesper Harder <harder@ifa.au.dk>.
+
2001-12-27 Simon Josefsson <jas@extundo.com>
* gnus-sum.el (gnus-select-newsgroup): Make
--- /dev/null
+;;; compface.el --- functions for converting X-Face headers
+;; Copyright (C) 2002 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: news
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+;;;###
+(defun uncompface (face)
+ "Convert FACE to pbm.
+Requires the external programs `uncompface', and `icontopbm'. On a
+GNU/Linux system these might be in packages with names like `compface'
+or `faces-xface' and `netpbm' or `libgr-progs', for instance."
+ (with-temp-buffer
+ (insert face)
+ (and (eq 0 (apply 'call-process-region (point-min) (point-max)
+ "uncompface"
+ 'delete '(t nil) nil))
+ (progn
+ (goto-char (point-min))
+ (insert "/* Width=48, Height=48 */\n")
+ ;; I just can't get "icontopbm" to work correctly on its
+ ;; own in XEmacs. And Emacs doesn't understand un-raw pbm
+ ;; files.
+ (if (not (featurep 'xemacs))
+ (eq 0 (call-process-region (point-min) (point-max)
+ "icontopbm"
+ 'delete '(t nil)))
+ (shell-command-on-region (point-min) (point-max)
+ "icontopbm | pnmnoraw"
+ (current-buffer) t)
+ t))
+ (buffer-string))))
+
+(provide 'compface)
+
+;;; compface.el ends here
(message "No bbdb: %s %s (ignored)" code (locate-library "bbdb"))
'("gnus-bbdb.el")))
(unless (featurep 'xemacs)
- '("gnus-xmas.el" "gnus-picon.el" "messagexmas.el"
- "nnheaderxm.el" "smiley.el"))
+ '("gnus-xmas.el" "messagexmas.el" "nnheaderxm.el" "smiley.el"))
(when (or (featurep 'xemacs) (<= emacs-major-version 20))
'("smiley-ems.el"))
(when (and (fboundp 'base64-decode-string)
;;; gnus-agent.el --- unplugged support for Semi-gnus
-;; Copyright (C) 1997, 1998, 1999, 2000, 2001
+;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
;; Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
"Jj" gnus-agent-toggle-plugged
"Js" gnus-agent-fetch-session
"JY" gnus-agent-synchronize-flags
- "JS" gnus-group-send-drafts
+ "JS" gnus-group-send-queue
"Ja" gnus-agent-add-group
"Jr" gnus-agent-remove-group)
'("Agent"
["Toggle plugged" gnus-agent-toggle-plugged t]
["List categories" gnus-enter-category-buffer t]
- ["Send drafts" gnus-group-send-drafts gnus-plugged]
+ ["Send queue" gnus-group-send-queue gnus-plugged]
("Fetch"
["All" gnus-agent-fetch-session gnus-plugged]
["Group" gnus-agent-fetch-group gnus-plugged])))))
(let ((init-file-user "")
(gnus-always-read-dribble-file t))
(gnus))
- (gnus-group-send-drafts)
+ (gnus-group-send-queue)
(gnus-agent-fetch-session))
(provide 'gnus-agent)
;;; gnus-art.el --- article mode commands for Semi-gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
;; Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
"^X-Abuse-Info:" "^X-From_:" "^X-Accept-Language:" "^Errors-To:"
"^X-BeenThere:" "^X-Mailman-Version:" "^List-Help:" "^List-Post:"
"^List-Subscribe:" "^List-Id:" "^List-Unsubscribe:" "^List-Archive:"
- "^X-Content-length:" "^X-Posting-Agent:" "^Original-Received:")
+ "^X-Content-length:" "^X-Posting-Agent:" "^Original-Received:"
+ "^X-Request-PGP:" "^X-Fingerprint:" "^X-WRIEnvto:" "^X-WRIEnvfrom:"
+ "^X-Virus-Scanned:" "^X-Delivery-Agent:" "^Posted-Date:" "^X-Gateway:"
+ "^X-Local-Origin:" "^X-Local-Destination:" "^X-UserInfo1:")
"*All headers that start with this regexp will be hidden.
This variable can also be a list of regexps of headers to be ignored.
If `gnus-visible-headers' is non-nil, this variable will be ignored."
(defcustom gnus-article-x-face-command
(cond
((featurep 'xemacs)
- (if (or (featurep 'xface)
- (featurep 'xpm))
+ (if (or (gnus-image-type-available-p 'xface)
+ (gnus-image-type-available-p 'xpm))
'gnus-xmas-article-display-xface
"{ echo '/* Width=48, Height=48 */'; uncompface; } | icontopbm | ee -"))
((and (fboundp 'image-type-available-p)
(module-installed-p 'x-face-e21))
'x-face-decode-message-header)
- ((and (fboundp 'image-type-available-p)
- (image-type-available-p 'xbm))
+ ((gnus-image-type-available-p 'xbm)
'gnus-article-display-xface)
((and window-system
(module-installed-p 'x-face-mule))
:group 'gnus-article-treat
:type gnus-article-treat-custom)
+(defcustom gnus-treat-unfold-headers 'head
+ "Unfold folded header lines.
+Valid values are nil, t, `head', `last', an integer or a predicate.
+See the manual for details."
+ :group 'gnus-article-treat
+ :type gnus-article-treat-custom)
+
+(defcustom gnus-treat-fold-newsgroups 'head
+ "Fold the Newsgroups and Followup-To headers.
+Valid values are nil, t, `head', `last', an integer or a predicate.
+See the manual for details."
+ :group 'gnus-article-treat
+ :type gnus-article-treat-custom)
+
(defcustom gnus-treat-overstrike t
"Treat overstrike highlighting.
Valid values are nil, t, `head', `last', an integer or a predicate.
(and (or (and (fboundp 'image-type-available-p)
(image-type-available-p 'xbm)
(string-match "^0x" (shell-command-to-string "uncompface")))
- (and (featurep 'xemacs) (featurep 'xface))
+ (and (featurep 'xemacs)
+ (featurep 'xface))
(eq 'x-face-mule-gnus-article-display-x-face
gnus-article-x-face-command))
'head)
:type gnus-article-treat-custom)
(put 'gnus-treat-display-smileys 'highlight t)
-(defcustom gnus-treat-display-picons (if (featurep 'xemacs) 'head nil)
- "Display picons.
+(defcustom gnus-treat-from-picon
+ (if (gnus-image-type-available-p 'xpm)
+ 'head nil)
+ "Display picons in the From header.
+Valid values are nil, t, `head', `last', an integer or a predicate.
+See the manual for details."
+ :group 'gnus-article-treat
+ :type gnus-article-treat-head-custom)
+(put 'gnus-treat-from-picon 'highlight t)
+
+(defcustom gnus-treat-mail-picon
+ (if (gnus-image-type-available-p 'xpm)
+ 'head nil)
+ "Display picons in To and Cc headers.
+Valid values are nil, t, `head', `last', an integer or a predicate.
+See the manual for details."
+ :group 'gnus-article-treat
+ :type gnus-article-treat-head-custom)
+(put 'gnus-treat-mail-picon 'highlight t)
+
+(defcustom gnus-treat-newsgroups-picon
+ (if (gnus-image-type-available-p 'xpm)
+ 'head nil)
+ "Display picons in the Newsgroups and Followup-To headers.
Valid values are nil, t, `head', `last', an integer or a predicate.
See the manual for details."
:group 'gnus-article-treat
:type gnus-article-treat-head-custom)
-(put 'gnus-treat-display-picons 'highlight t)
+(put 'gnus-treat-newsgroups-picon 'highlight t)
+
+(defcustom gnus-treat-body-boundary
+ (if (or gnus-treat-newsgroups-picon
+ gnus-treat-mail-picon
+ gnus-treat-from-picon)
+ 'head nil)
+ "Draw a boundary at the end of the headers.
+Valid values are nil, t, `head', `last', an integer or a predicate.
+See the manual for details."
+ :version "21.1"
+ :group 'gnus-article-treat
+ :type gnus-article-treat-custom)
(defcustom gnus-treat-capitalize-sentences nil
"Capitalize sentence-starting words.
(defvar article-goto-body-goes-to-point-min-p nil)
(defvar gnus-article-wash-types nil)
(defvar gnus-article-emphasis-alist nil)
+(defvar gnus-article-image-alist nil)
(defvar gnus-article-mime-handle-alist-1 nil)
(defvar gnus-treatment-function-alist
(gnus-treat-fill-article gnus-article-fill-cited-article)
(gnus-treat-fill-long-lines gnus-article-fill-long-lines)
(gnus-treat-strip-cr gnus-article-remove-cr)
- (gnus-treat-display-xface gnus-article-display-x-face)
(gnus-treat-date-ut gnus-article-date-ut)
(gnus-treat-date-local gnus-article-date-local)
(gnus-treat-date-english gnus-article-date-english)
(gnus-treat-leading-whitespace gnus-article-remove-leading-whitespace)
(gnus-treat-strip-pgp gnus-article-hide-pgp)
(gnus-treat-strip-pem gnus-article-hide-pem)
+ (gnus-treat-from-picon gnus-treat-from-picon)
+ (gnus-treat-mail-picon gnus-treat-mail-picon)
+ (gnus-treat-newsgroups-picon gnus-treat-newsgroups-picon)
(gnus-treat-highlight-headers gnus-article-highlight-headers)
- (gnus-treat-emphasize gnus-article-emphasize)
(gnus-treat-highlight-citation gnus-article-highlight-citation)
(gnus-treat-highlight-signature gnus-article-highlight-signature)
(gnus-treat-strip-trailing-blank-lines
(gnus-treat-strip-multiple-blank-lines
gnus-article-strip-multiple-blank-lines)
(gnus-treat-overstrike gnus-article-treat-overstrike)
+ (gnus-treat-unfold-headers gnus-article-treat-unfold-headers)
+ (gnus-treat-fold-newsgroups gnus-article-treat-fold-newsgroups)
(gnus-treat-buttonize-head gnus-article-add-buttons-to-head)
(gnus-treat-display-smileys ,(if (or (featurep 'xemacs)
(>= emacs-major-version 21))
'gnus-smiley-display
'gnus-article-smiley-display))
(gnus-treat-capitalize-sentences gnus-article-capitalize-sentences)
- (gnus-treat-display-picons gnus-article-display-picons)
+ (gnus-treat-emphasize gnus-article-emphasize)
+ (gnus-treat-display-xface gnus-article-display-x-face)
+ (gnus-treat-body-boundary gnus-article-treat-body-boundary)
(gnus-treat-play-sounds gnus-earcon-display)))
(defvar gnus-article-mime-handle-alist nil)
(defvar gnus-inhibit-hiding nil)
+;;; Macros for dealing with the article buffer.
+
+(defmacro gnus-with-article-headers (&rest forms)
+ `(save-excursion
+ (set-buffer gnus-article-buffer)
+ (save-restriction
+ (let ((buffer-read-only nil)
+ (inhibit-point-motion-hooks t)
+ (case-fold-search t))
+ (article-narrow-to-head)
+ ,@forms))))
+
+(put 'gnus-with-article-headers 'lisp-indent-function 0)
+(put 'gnus-with-article-headers 'edebug-form-spec '(body))
+
+(defmacro gnus-with-article-buffer (&rest forms)
+ `(save-excursion
+ (set-buffer gnus-article-buffer)
+ (let ((buffer-read-only nil))
+ ,@forms)))
+
+(put 'gnus-with-article-buffer 'lisp-indent-function 0)
+(put 'gnus-with-article-buffer 'edebug-form-spec '(body))
+
+(defun gnus-article-goto-header (header)
+ "Go to HEADER, which is a regular expression."
+ (re-search-forward (concat "^\\(" header "\\):") nil t))
+
(defsubst gnus-article-hide-text (b e props)
"Set text PROPS on the B to E region, extending `intangible' 1 past B."
(gnus-add-text-properties-when 'article-type nil b e props)
(defun gnus-article-hide-text-type (b e type)
"Hide text of TYPE between B and E."
- (push type gnus-article-wash-types)
+ (gnus-add-wash-type type)
(gnus-article-hide-text
b e (cons 'article-type (cons type gnus-hidden-properties))))
(defun gnus-article-unhide-text-type (b e type)
"Unhide text of TYPE between B and E."
- (setq gnus-article-wash-types
- (delq type gnus-article-wash-types))
+ (gnus-delete-wash-type type)
(remove-text-properties
b e (cons 'article-type (cons type gnus-hidden-properties)))
(when (memq 'intangible gnus-hidden-properties)
(when (setq beg (text-property-any
(point-min) (point-max) 'message-rank (+ 2 max)))
;; We delete or make invisible the unwanted headers.
- (push 'headers gnus-article-wash-types)
+ (gnus-add-wash-type 'headers)
(if delete
(progn
(add-text-properties
(point-min) (+ 5 (point-min))
'(article-type headers dummy-invisible t))
(delete-region beg (point-max)))
- (gnus-article-hide-text-type beg (point-max) 'headers))))))))
- )
+ (gnus-article-hide-text-type beg (point-max) 'headers)))))))))
(defun article-hide-boring-headers (&optional arg)
"Toggle hiding of headers that aren't very interesting.
(put-text-property
(point) end 'face 'underline)))))))))
+(defun gnus-article-treat-unfold-headers ()
+ "Unfold folded message headers.
+Only the headers that fit into the current window width will be
+unfolded."
+ (interactive)
+ (gnus-with-article-headers
+ (let (length)
+ (while (not (eobp))
+ (save-restriction
+ (mail-header-narrow-to-field)
+ (let ((header (buffer-substring (point-min) (point-max))))
+ (with-temp-buffer
+ (insert header)
+ (goto-char (point-min))
+ (while (re-search-forward "[\t ]*\n[\t ]+" nil t)
+ (replace-match " " t t)))
+ (setq length (- (point-max) (point-min) 1)))
+ (when (< length (window-width))
+ (while (re-search-forward "[\t ]*\n[\t ]+" nil t)
+ (replace-match " " t t)))
+ (goto-char (point-max)))))))
+
+(defun gnus-article-treat-fold-newsgroups ()
+ "Unfold folded message headers.
+Only the headers that fit into the current window width will be
+unfolded."
+ (interactive)
+ (gnus-with-article-headers
+ (while (gnus-article-goto-header "newsgroups\\|followup-to")
+ (save-restriction
+ (mail-header-narrow-to-field)
+ (while (search-forward "," nil t)
+ (replace-match ", " t t))
+ (mail-header-fold-field)
+ (goto-char (point-max))))))
+
+(defun gnus-article-treat-body-boundary ()
+ "Place a boundary line at the end of the headers."
+ (interactive)
+ (gnus-with-article-headers
+ (goto-char (point-max))
+ (let ((start (point)))
+ (insert "X-Boundary: ")
+ (gnus-add-text-properties start (point) '(invisible t intangible t))
+ (insert (make-string (1- (window-width)) ?-)
+ "\n"))))
+
(defun article-fill-long-lines ()
"Fill lines that are wider than the window width."
(interactive)
(defun article-display-x-face (&optional force)
"Look for an X-Face header and display it if present."
(interactive (list 'force))
- (save-excursion
- ;; Delete the old process, if any.
- (when (process-status "article-x-face")
- (delete-process "article-x-face"))
- (let ((inhibit-point-motion-hooks t)
- x-faces
- (case-fold-search t)
- from last)
- (save-restriction
- (article-narrow-to-head)
-;; (when (and buffer-read-only ;; When type `W f'
-;; (progn
-;; (goto-char (point-min))
-;; (not (re-search-forward "^X-Face:[\t ]*" nil t)))
-;; (gnus-buffer-live-p gnus-original-article-buffer))
-;; (with-current-buffer gnus-original-article-buffer
-;; (save-restriction
-;; (article-narrow-to-head)
-;; (while (re-search-forward "^X-Face:" nil t)
-;; (setq x-faces
-;; (concat
-;; (or x-faces "")
-;; (buffer-substring
-;; (match-beginning 0)
-;; (1- (re-search-forward
-;; "^\\($\\|[^ \t]\\)" nil t))))))))
-;; (if x-faces
-;; (let (point start bface eface buffer-read-only)
-;; (goto-char (point-max))
-;; (forward-line -1)
-;; (setq bface (get-text-property (gnus-point-at-bol) 'face)
-;; eface (get-text-property (1- (gnus-point-at-eol)) 'face))
-;; (goto-char (point-max))
-;; (setq point (point))
-;; (insert x-faces)
-;; (goto-char point)
-;; (while (looking-at "\\([^:]+\\): *")
-;; (put-text-property (match-beginning 1) (1+ (match-end 1))
-;; 'face bface)
-;; (setq start (match-end 0))
-;; (forward-line 1)
-;; (while (looking-at "[\t ]")
-;; (forward-line 1))
-;; (put-text-property start (point)
-;; 'face eface)))))
- (goto-char (point-min))
- (setq from (message-fetch-field "from"))
- (goto-char (point-min))
- (while (and gnus-article-x-face-command
- (not last)
- (or force
- ;; Check whether this face is censored.
- (not gnus-article-x-face-too-ugly)
- (and gnus-article-x-face-too-ugly from
- (not (string-match gnus-article-x-face-too-ugly
- from))))
- ;; Has to be present.
- (re-search-forward "^X-Face:[\t ]*" nil t))
- ;; This used to try to do multiple faces (`while' instead of
- ;; `when' above), but (a) sending multiple EOFs to xv doesn't
- ;; work (b) it can crash some versions of Emacs (c) are
- ;; multiple faces really something to encourage?
- (when (stringp gnus-article-x-face-command)
- (setq last t))
- ;; We now have the area of the buffer where the X-Face is stored.
- (save-excursion
- (let ((beg (point))
- (end (1- (re-search-forward "^\\($\\|[^ \t]\\)" nil t)))
- buffer-read-only)
- ;; We display the face.
- (if (symbolp gnus-article-x-face-command)
- ;; The command is a lisp function, so we call it.
- (if (gnus-functionp gnus-article-x-face-command)
- (funcall gnus-article-x-face-command beg end)
- (error "%s is not a function" gnus-article-x-face-command))
- ;; The command is a string, so we interpret the command
- ;; as a, well, command, and fork it off.
- (let ((process-connection-type nil))
- (process-kill-without-query
- (start-process
- "article-x-face" nil shell-file-name shell-command-switch
- gnus-article-x-face-command))
- (process-send-region "article-x-face" beg end)
- (process-send-eof "article-x-face"))))))))))
+ (gnus-with-article-headers
+ ;; Delete the old process, if any.
+ (when (process-status "article-x-face")
+ (delete-process "article-x-face"))
+ (if (memq 'xface gnus-article-wash-types)
+ ;; We have already displayed X-Faces, so we remove them
+ ;; instead.
+ (gnus-delete-images 'xface)
+ ;; Display X-Faces.
+ (let (x-faces from face)
+ (save-excursion
+ (set-buffer gnus-original-article-buffer)
+ (save-restriction
+ (mail-narrow-to-head)
+ (while (gnus-article-goto-header "x-face")
+ (push (mail-header-field-value) x-faces))
+ (setq from (message-fetch-field "from"))))
+ ;; Sending multiple EOFs to xv doesn't work, so we only do a
+ ;; single external face.
+ (when (stringp gnus-article-x-face-command)
+ (setq x-faces (list (car x-faces))))
+ (while (and (setq face (pop x-faces))
+ gnus-article-x-face-command
+ (or force
+ ;; Check whether this face is censored.
+ (not gnus-article-x-face-too-ugly)
+ (and gnus-article-x-face-too-ugly from
+ (not (string-match gnus-article-x-face-too-ugly
+ from)))))
+ ;; We display the face.
+ (if (symbolp gnus-article-x-face-command)
+ ;; The command is a lisp function, so we call it.
+ (if (gnus-functionp gnus-article-x-face-command)
+ (funcall gnus-article-x-face-command face)
+ (error "%s is not a function" gnus-article-x-face-command))
+ ;; The command is a string, so we interpret the command
+ ;; as a, well, command, and fork it off.
+ (let ((process-connection-type nil))
+ (process-kill-without-query
+ (start-process
+ "article-x-face" nil shell-file-name shell-command-switch
+ gnus-article-x-face-command))
+ (with-temp-buffer
+ (insert face)
+ (process-send-region "article-x-face" (point-min) (point-max)))
+ (process-send-eof "article-x-face"))))))))
(defun article-decode-mime-words ()
"Decode all MIME-encoded words in the article."
(narrow-to-region (point) (point-max))
(mm-setup-w3)
(let ((w3-strict-width (window-width))
- (url-standalone-mode t))
+ (url-standalone-mode t)
+ (w3-honor-stylesheets nil)
+ (w3-delay-image-loads t))
(condition-case var
(w3-region (point-min) (point-max))
(error))))))))
(article-goto-body)
;; Hide the "header".
(when (re-search-forward "^-----BEGIN PGP SIGNED MESSAGE-----\n" nil t)
- (push 'pgp gnus-article-wash-types)
+ (gnus-add-wash-type 'pgp)
(delete-region (match-beginning 0) (match-end 0))
;; Remove armor headers (rfc2440 6.2)
(delete-region (point) (or (re-search-forward "^[ \t]*\n" nil t)
"\n-----BEGIN PRIVACY-ENHANCED MESSAGE-----\n"
nil t)
(setq end (1+ (match-beginning 0))))
- (push 'pem gnus-article-wash-types)
+ (gnus-add-wash-type 'pem)
(gnus-article-hide-text-type
end
(if (search-forward "\n\n" nil t)
(1+ button)
(next-single-property-change (1+ button) 'mime-view-entity
nil (point-max))
- 'signature))))))))
+ 'signature)))))))
+ (gnus-set-mode-line 'article))
(defun article-strip-headers-in-body ()
"Strip offensive headers from bodies."
'article-type type
(point-min) (point-max)
(cons 'article-type (cons type
- gnus-hidden-properties)))))
+ gnus-hidden-properties)))
+ (gnus-delete-wash-type type)))
(defconst article-time-units
`((year . ,(* 365.25 24 60 60))
(match-beginning invisible) (match-end invisible) props)
(gnus-article-unhide-text-type
(match-beginning visible) (match-end visible) 'emphasis)
- (gnus-put-text-property-excluding-newlines
+ (gnus-put-overlay-excluding-newlines
(match-beginning visible) (match-end visible) 'face face)
- (push 'emphasis gnus-article-wash-types)
+ (gnus-add-wash-type 'emphasis)
(goto-char (match-end invisible)))))))))
(defun gnus-article-setup-highlight-words (&optional highlight-words)
(setq afunc func
gfunc (intern (format "gnus-%s" func))))
(defalias gfunc
- (if (fboundp afunc)
- `(lambda (&optional interactive &rest args)
- ,(documentation afunc t)
- (interactive (list t))
- (save-excursion
- (set-buffer gnus-article-buffer)
- (if interactive
- (call-interactively ',afunc)
- (apply ',afunc args))))))))
+ (when (fboundp afunc)
+ `(lambda (&optional interactive &rest args)
+ ,(documentation afunc t)
+ (interactive (list t))
+ (save-excursion
+ (set-buffer gnus-article-buffer)
+ (if interactive
+ (call-interactively ',afunc)
+ (apply ',afunc args))))))))
'(article-hide-headers
article-verify-x-pgp-sig
article-verify-cancel-lock
(make-local-variable 'gnus-article-decoded-p)
(make-local-variable 'gnus-article-mime-handle-alist)
(make-local-variable 'gnus-article-wash-types)
+ (make-local-variable 'gnus-article-image-alist)
(make-local-variable 'gnus-article-charset)
(make-local-variable 'gnus-article-ignored-charsets)
(gnus-set-default-directory)
(gnus-article-mode))
(setq buffer-read-only nil
gnus-button-marker-list nil
- gnus-article-wash-types nil)
+ gnus-article-wash-types nil
+ gnus-article-image-alist nil)
(save-restriction
(widen)
(static-if (featurep 'xemacs)
(gnus-mime-inline-part "i" "View As Text, In This Buffer")
(gnus-mime-internalize-part "E" "View Internally")
(gnus-mime-externalize-part "e" "View Externally")
+ (gnus-mime-print-part "p" "Print")
(gnus-mime-pipe-part "|" "Pipe To Command...")
(gnus-mime-action-on-part "." "Take action on the part")))
(gnus-mm-display-part handle))))
(defun gnus-mime-copy-part (&optional handle)
- "Put the the MIME part under point into a new buffer."
+ "Put the MIME part under point into a new buffer."
(interactive)
(gnus-article-check-buffer)
(let* ((handle (or handle (get-text-property (point) 'gnus-data)))
(setq buffer-file-name nil))
(goto-char (point-min)))))
+(defun gnus-mime-print-part (&optional handle)
+ "Print the MIME part under point."
+ (interactive)
+ (gnus-article-check-buffer)
+ (let* ((handle (or handle (get-text-property (point) 'gnus-data)))
+ (contents (and handle (mm-get-part handle)))
+ (file (make-temp-name (expand-file-name "mm." mm-tmp-directory)))
+ (printer (mailcap-mime-info (mm-handle-type handle) "print")))
+ (when contents
+ (if printer
+ (unwind-protect
+ (progn
+ (with-temp-file file
+ (insert contents))
+ (call-process shell-file-name nil
+ (generate-new-buffer " *mm*")
+ nil
+ shell-command-switch
+ (mm-mailcap-command
+ printer file (mm-handle-type handle))))
+ (delete-file file))
+ (with-temp-buffer
+ (insert contents)
+ (gnus-print-buffer))))))
+
(defun gnus-mime-inline-part (&optional handle arg)
"Insert the MIME part under point into the current buffer."
(interactive (list nil current-prefix-arg))
;;;!!! No, w3 can display everything just fine.
(gnus-mime-display-part (cadr handle)))
((equal (car handle) "multipart/signed")
- (or (memq 'signed gnus-article-wash-types)
- (push 'signed gnus-article-wash-types))
+ (gnus-add-wash-type 'signed)
(gnus-mime-display-security handle))
((equal (car handle) "multipart/encrypted")
- (or (memq 'encrypted gnus-article-wash-types)
- (push 'encrypted gnus-article-wash-types))
+ (gnus-add-wash-type 'encrypted)
(gnus-mime-display-security handle))
;; Other multiparts are handled like multipart/mixed.
(t
in the article mode line when the washing function is active, and OFF
is the string to use when it is inactive.")
-(defun gnus-gnus-article-wash-status-entry (key value)
+(defun gnus-article-wash-status-entry (key value)
(let ((entry (assoc key gnus-article-wash-status-strings)))
(if value (nth 1 entry) (nth 2 entry))))
(signature (memq 'signature gnus-article-wash-types))
(overstrike (memq 'overstrike gnus-article-wash-types))
(emphasis (memq 'emphasis gnus-article-wash-types)))
- (concat (gnus-gnus-article-wash-status-entry 'cite cite)
- (gnus-gnus-article-wash-status-entry 'headers
- (or headers boring))
- (gnus-gnus-article-wash-status-entry
- 'pgp (or pgp pem signed encrypted))
- (gnus-gnus-article-wash-status-entry 'signature signature)
- (gnus-gnus-article-wash-status-entry 'overstrike overstrike)
- (gnus-gnus-article-wash-status-entry 'gnus-show-mime
- gnus-show-mime)
- (gnus-gnus-article-wash-status-entry 'emphasis emphasis)))))
+ (concat
+ (gnus-article-wash-status-entry 'cite cite)
+ (gnus-article-wash-status-entry 'headers (or headers boring))
+ (gnus-article-wash-status-entry 'pgp (or pgp pem signed encrypted))
+ (gnus-article-wash-status-entry 'signature signature)
+ (gnus-article-wash-status-entry 'overstrike overstrike)
+ (gnus-article-wash-status-entry 'gnus-show-mime gnus-show-mime)
+ (gnus-article-wash-status-entry 'emphasis emphasis)))))
+
+(defun gnus-add-wash-type (type)
+ "Add a washing of TYPE to the current status."
+ (push type gnus-article-wash-types))
+
+(defun gnus-delete-wash-type (type)
+ "Add a washing of TYPE to the current status."
+ (setq gnus-article-wash-types (delq type gnus-article-wash-types)))
+
+(defun gnus-add-image (category image)
+ "Add IMAGE of CATEGORY to the list of displayed images."
+ (let ((entry (assq category gnus-article-image-alist)))
+ (unless entry
+ (setq entry (list category))
+ (push entry gnus-article-image-alist))
+ (nconc entry (list image))))
+
+(defun gnus-delete-images (category)
+ "Delete all images in CATEGORY."
+ (let ((entry (assq category gnus-article-image-alist)))
+ (dolist (image (cdr entry))
+ (gnus-remove-image image))
+ (setq gnus-article-image-alist (delq entry gnus-article-image-alist))
+ (gnus-delete-wash-type category)))
(defalias 'gnus-article-hide-headers-if-wanted 'gnus-article-maybe-hide-headers)
nil (point-max))))
(if (text-property-any end limit 'article-type 'signature)
(progn
- (setq gnus-article-wash-types
- (delq 'signature gnus-article-wash-types))
+ (gnus-delete-wash-type 'signature)
(gnus-remove-text-properties-when
'article-type 'signature end limit
(cons 'article-type (cons 'signature
gnus-hidden-properties))))
- (or (memq 'signature gnus-article-wash-types)
- (push 'signature gnus-article-wash-types))
+ (gnus-add-wash-type 'signature)
(gnus-add-text-properties-when
'article-type nil end limit
(cons 'article-type (cons 'signature
(setq beg nil)
(setq end (point-marker))))))
(when (and beg end)
- (or (memq 'cite gnus-article-wash-types)
- (push 'cite gnus-article-wash-types))
+ (gnus-add-wash-type 'cite)
;; We use markers for the end-points to facilitate later
;; wrapping and mangling of text.
(setq beg (set-marker (make-marker) beg)
'article-type 'cite beg end
(cons 'article-type (cons 'cite
gnus-hidden-properties))))
- (or (memq 'cite gnus-article-wash-types)
- (push 'cite gnus-article-wash-types))
+ (gnus-add-wash-type 'cite)
(gnus-add-text-properties-when
'article-type nil beg end
(cons 'article-type (cons 'cite
gnus-hidden-properties))
((assq number gnus-cite-attribution-alist))
(t
- (or (memq 'cite gnus-article-wash-types)
- (push 'cite gnus-article-wash-types))
+ (gnus-add-wash-type 'cite)
(gnus-add-text-properties
(point) (progn (forward-line 1) (point))
(nconc (list 'article-type 'cite)
;;; gnus-delay.el --- Delayed posting of articles
-;; Copyright (C) 2001 Free Software Foundation, Inc.
+;; Copyright (C) 2001, 2002 Free Software Foundation, Inc.
;; Author: Kai Großjohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
;; Keywords: mail, news, extensions
;;; Todo:
-;; * `gnus-delay-send-drafts' barfs when group does not exist.
+;; * `gnus-delay-send-queue' barfs when group does not exist.
;; * Integrate gnus-delay.el into the rest of Gnus automatically. How
;; should this be done? Basically, we need to do what
;; `gnus-delay-initialize' does. But in which files?
(message-do-actions message-postpone-actions))
;;;###autoload
-(defun gnus-delay-send-drafts ()
+(defun gnus-delay-send-queue ()
"Send all the delayed messages that are due now."
(interactive)
(save-excursion
The optional arg NO-KEYMAP is ignored.
Checking delayed messages is skipped if optional arg NO-CHECK is non-nil."
(unless no-check
- (add-hook 'gnus-get-new-news-hook 'gnus-delay-send-drafts)))
+ (add-hook 'gnus-get-new-news-hook 'gnus-delay-send-queue)))
(provide 'gnus-delay)
;;; gnus-draft.el --- draft message support for Semi-gnus
-;; Copyright (C) 1997, 1998, 1999, 2000, 2001
+;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002
;; Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
(gnus-uu-mark-buffer)
(gnus-draft-send-message))
-(defun gnus-group-send-drafts ()
+(defun gnus-group-send-queue ()
"Send all sendable articles from the queue group."
(interactive)
(gnus-activate-group "nndraft:queue")
"Non-nil means the compface program supports the -X option.
That produces XBM output.")
-(defun gnus-article-display-xface (beg end &optional buffer)
- "Display an XFace header from between BEG and END in BUFFER.
+(defun gnus-article-display-xface (data)
+ "Display the XFace header FACE in the current buffer.
Requires support for images in your Emacs and the external programs
`uncompface', and `icontopbm'. On a GNU/Linux system these
might be in packages with names like `compface' or `faces-xface' and
(make-ring gnus-article-xface-ring-size)))
(save-excursion
(let* ((cur (current-buffer))
- (data (if buffer
- (with-current-buffer buffer
- (buffer-substring beg end))
- (buffer-substring beg end)))
(image (cdr-safe (assoc data (ring-elements
gnus-article-xface-ring-internal))))
default-enable-multibyte-characters)
(re-search-forward "^From:" nil 'move)
(while (get-text-property (point) 'display)
(goto-char (next-single-property-change (point) 'display)))
+ (gnus-add-wash-type 'xface)
+ (gnus-add-image 'xface image)
(insert-image image))))))
+;;; Image functions.
+
+(defun gnus-image-type-available-p (type)
+ (and (fboundp 'image-type-available-p)
+ (image-type-available-p type)))
+
+(defun gnus-create-image (file &optional type data-p &rest props)
+ (let ((face (plist-get props :face)))
+ (when face
+ (setq props (plist-put props :foreground (face-foreground face)))
+ (setq props (plist-put props :background (face-background face))))
+ (apply 'create-image file type data-p props)))
+
+(defun gnus-put-image (glyph &optional string)
+ (insert-image glyph string))
+
+(defun gnus-remove-image (image)
+ (dolist (position (gnus-text-with-property 'display))
+ (when (equal (get-text-property position 'display) image)
+ (put-text-property position (1+ position) 'display nil))))
+
(defun-maybe assoc-ignore-case (key alist)
"Like `assoc', but assumes KEY is a string and ignores case when comparing."
(setq key (downcase key))
--- /dev/null
+;;; gnus-fun.el --- various frivoluos extension functions to Gnus
+;; Copyright (C) 2002 Free Software Foundation, Inc.
+
+;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
+;; Keywords: news
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs 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 2, or (at your option)
+;; any later version.
+
+;; GNU Emacs 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 GNU Emacs; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+;;; Commentary:
+
+;;; Code:
+
+(eval-and-compile
+ (autoload 'uncompface "compface"))
+
+(defcustom gnus-x-face-directory (expand-file-name "x-faces" gnus-directory)
+ "*Directory where X-Face PBM files are stored."
+ :group 'gnus-fun
+ :type 'directory)
+
+(defcustom gnus-convert-pbm-to-x-face-command "pbmtoxbm %s | compface"
+ "Command for converting a PBM to an X-Face."
+ :group 'gnus-fun
+ :type 'string)
+
+(defcustom gnus-convert-image-to-x-face-command "giftopnm %s | ppmnorm 2>/dev/null | pnmscale -width 48 -height 48 | ppmtopgm | pgmtopbm | pbmtoxbm | compface"
+ "Command for converting a GIF to an X-Face."
+ :group 'gnus-fun
+ :type 'string)
+
+;;;###autoload
+(defun gnus-random-x-face ()
+ "Insert a random X-Face header from `gnus-x-face-directory'."
+ (interactive)
+ (when (file-exists-p gnus-x-face-directory)
+ (let* ((files (directory-files gnus-x-face-directory t "\\.pbm$"))
+ (file (nth (random (length files)) files)))
+ (when file
+ (shell-command-to-string
+ (format gnus-convert-pbm-to-x-face-command
+ (shell-quote-argument file)))))))
+
+;;;###autoload
+(defun gnus-x-face-from-file (file)
+ "Insert an X-Face header based on an image file."
+ (interactive "fImage file name:" )
+ (when (file-exists-p file)
+ (shell-command-to-string
+ (format gnus-convert-image-to-x-face-command
+ (shell-quote-argument file)))))
+
+(defun gnus-convert-image-to-gray-x-face (file depth)
+ (let* ((mapfile (make-temp-name (expand-file-name "gnus." mm-tmp-directory)))
+ (levels (expt 2 depth))
+ (step (/ 255 (1- levels)))
+ color-alist bits bits-list mask pixel x-faces)
+ (with-temp-file mapfile
+ (insert "P3\n")
+ (insert (format "%d 1\n" levels))
+ (insert "255\n")
+ (dotimes (i levels)
+ (insert (format "%d %d %d\n"
+ (* step i) (* step i) (* step i)))
+ (push (cons (* step i) i) color-alist)))
+ (when (file-exists-p file)
+ (with-temp-buffer
+ (insert (shell-command-to-string
+ (format "giftopnm %s | ppmnorm 2>/dev/null | pnmscale -width 48 -height 48 | ppmquant -fs -map %s 2>/dev/null | ppmtopgm | pnmnoraw"
+ (shell-quote-argument file)
+ mapfile)))
+ (goto-char (point-min))
+ (forward-line 3)
+ (while (setq pixel (ignore-errors (read (current-buffer))))
+ (push (cdr (assq pixel color-alist)) bits-list))
+ (setq bits-list (nreverse bits-list))
+ (dotimes (bit-number depth)
+ (setq mask (expt 2 bit-number))
+ (with-temp-buffer
+ (insert "P1\n48 48\n")
+ (dolist (bits bits-list)
+ (insert (if (zerop (logand bits mask)) "0 " "1 ")))
+ (shell-command-on-region
+ (point-min) (point-max)
+ "pbmtoxbm | compface"
+ (current-buffer) t)
+ (push (buffer-string) x-faces))))
+ (dotimes (i (length x-faces))
+ (insert (if (zerop i) "X-Face:" (format "X-Face-%s:" i))
+ (nth i x-faces))))
+ (delete-file mapfile)))
+
+;;;###autoload
+(defun gnus-convert-gray-x-face-to-xpm (faces)
+ (let* ((depth (length faces))
+ (scale (/ 255 (1- (expt 2 depth))))
+ (ok-p t)
+ bit-list bit-lists pixels pixel)
+ (dolist (face faces)
+ (setq bit-list nil)
+ (with-temp-buffer
+ (insert (uncompface face))
+ (shell-command-on-region
+ (point-min) (point-max)
+ "pnmnoraw 2>/dev/null"
+ (current-buffer) t)
+ (goto-char (point-min))
+ (forward-line 2)
+ (while (not (eobp))
+ (cond
+ ((eq (following-char) ?0)
+ (push 0 bit-list))
+ ((eq (following-char) ?1)
+ (push 1 bit-list)))
+ (forward-char 1)))
+ (unless (= (length bit-list) (* 48 48))
+ (setq ok-p nil))
+ (push bit-list bit-lists))
+ (when ok-p
+ (dotimes (i (* 48 48))
+ (setq pixel 0)
+ (dotimes (plane depth)
+ (setq pixel (+ (* pixel 2) (nth i (nth plane bit-lists)))))
+ (push pixel pixels))
+ (with-temp-buffer
+ (insert "P2\n48 48\n255\n")
+ (dolist (pixel pixels)
+ (insert (number-to-string (* scale pixel)) " "))
+ (shell-command-on-region
+ (point-min) (point-max)
+ "ppmtoxpm 2>/dev/null"
+ (current-buffer) t)
+ (buffer-string)))))
+
+;;;###autoload
+(defun gnus-convert-gray-x-face-region (beg end)
+ "Convert the X-Faces in region to a PPM file."
+ (interactive "r")
+ (let ((input (buffer-substring beg end))
+ faces)
+ (with-temp-buffer
+ (insert input)
+ (goto-char (point-min))
+ (while (not (eobp))
+ (save-restriction
+ (mail-header-narrow-to-field)
+ (push (mail-header-field-value) faces)
+ (goto-char (point-max)))))
+ (gnus-convert-gray-x-face-to-xpm faces)))
+
+(defface gnus-x-face '((t (:foreground "black" :background "white")))
+ "Face to show X-Face.
+The colors from this face are used as the foreground and background
+colors of the displayed X-Faces."
+ :group 'gnus-article-headers)
+
+(defun gnus-display-x-face-in-from (data)
+ "Display the X-Face DATA in the From header."
+ (let ((default-enable-multibyte-characters nil)
+ pbm)
+ (when (or (gnus-image-type-available-p 'xface)
+ (and (gnus-image-type-available-p 'pbm)
+ (setq pbm (uncompface data))))
+ (save-excursion
+ (save-restriction
+ (article-narrow-to-head)
+ (gnus-article-goto-header "from")
+ (gnus-add-image
+ 'xface
+ (gnus-put-image
+ (if (gnus-image-type-available-p 'xface)
+ (gnus-create-image
+ (concat "X-Face: " data)
+ 'xface t :ascent 'center :face 'gnus-x-face)
+ (gnus-create-image
+ pbm 'pbm t :ascent 'center :face 'gnus-x-face))))
+ (gnus-add-wash-type 'xface))))))
+
+(provide 'gnus-fun)
+
+;;; gnus-fun.el ends here
;;; gnus-group.el --- group mode commands for Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002
;; Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
(function-item gnus-group-sort-by-rank)
(function :tag "other" nil))))
-(defcustom gnus-group-line-format "%M\%S\%p\%P\%5y: %(%g%)%l\n"
+(defcustom gnus-group-line-format "%M\%S\%p\%P\%5y: %(%g%)%l %O\n"
"*Format of group lines.
It works along the same lines as a normal formatting string,
with some simple extensions.
,@(if (featurep 'xemacs) '(t)
'(:help "Get newly arrived articles"))
]
- ["Send delayed articles" gnus-delay-send-drafts
+ ["Send queued messages" gnus-delay-send-queue
,@(if (featurep 'xemacs) '(t)
- '(:help "Send all articles that are scheduled to be sent now"))
+ '(:help "Send all messages that are scheduled to be sent now"))
]
["Activate all groups" gnus-activate-all-groups t]
["Restart Gnus" gnus-group-restart t]
nil)
;; Open the server.
(let ((result
- (funcall (gnus-get-function gnus-command-method 'open-server)
- (nth 1 gnus-command-method)
- (nthcdr 2 gnus-command-method))))
+ (condition-case ()
+ (funcall (gnus-get-function gnus-command-method 'open-server)
+ (nth 1 gnus-command-method)
+ (nthcdr 2 gnus-command-method))
+ (quit
+ (message "Quit trying to open server")
+ nil))))
;; If this hasn't been opened before, we add it to the list.
(unless elem
(setq elem (list gnus-command-method nil)
((or (null request) (equal request ""))
(mailcap-unescape-mime-test (cdr (assq 'viewer viewer)) info))
((stringp request)
- (if (or (eq request 'test) (eq request 'viewer))
- (mailcap-unescape-mime-test
- (cdr-safe (assoc request viewer)) info)))
+ (mailcap-unescape-mime-test
+ (cdr-safe (assoc request viewer)) info))
((eq request 'all)
passed)
(t
(message "%s" (gnus-offline-gettext 'empting-spool-4)))
;; Send queued message by gnus-agent
(message "%s" (gnus-offline-gettext 'empting-spool-5))
- (gnus-group-send-drafts)
+ (gnus-group-send-queue)
(message "%s" (gnus-offline-gettext 'empting-spool-6)))
;;
(run-hooks 'gnus-offline-after-empting-spool-hook))
;;; gnus-picon.el --- displaying pretty icons in Gnus
-;; Copyright (C) 1996, 1997, 1998, 1999, 2000
+;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
;; Free Software Foundation, Inc.
;; Author: Wes Hardaker <hardaker@ece.ucdavis.edu>
;;; Commentary:
+;; There are three picon types relevant to Gnus:
+;;
+;; Persons: person@subdomain.dom
+;; users/dom/subdomain/person/face.gif
+;; usenix/dom/subdomain/person/face.gif
+;; misc/MISC/person/face.gif
+;; Domains: subdomain.dom
+;; domain/dom/subdomain/unknown/face.gif
+;; Groups: comp.lang.lisp
+;; news/comp/lang/lisp/unknown/face.gif
+
;;; Code:
(eval-when-compile (require 'cl))
(require 'gnus)
-;; (require 'xpm)
-(require 'annotations)
(require 'custom)
(require 'gnus-art)
-(require 'gnus-win)
+(require 'mail-parse)
;;; User variables:
-(defgroup picons nil
- "Show pictures of people, domains, and newsgroups (XEmacs).
-For this to work, you must switch on the `gnus-treat-display-picons'
-variable."
+(defgroup picon nil
+ "Show pictures of people, domains, and newsgroups."
:group 'gnus-visual)
-(defcustom gnus-picons-display-where 'picons
- "Where to display the group and article icons.
-Valid values are `article' and `picons'."
- :type '(choice symbol string)
- :group 'picons)
-
-(defcustom gnus-picons-has-modeline-p t
- "*Whether the picons window should have a modeline.
-This is only useful if `gnus-picons-display-where' is `picons'."
- :type 'boolean
- :group 'picons)
-
-(defcustom gnus-picons-database "/usr/local/faces"
+(defcustom gnus-picon-databases '("/usr/lib/picon" "/usr/local/faces")
"*Defines the location of the faces database.
For information on obtaining this database of pretty pictures, please
see http://www.cs.indiana.edu/picons/ftp/index.html"
:type 'directory
- :group 'picons)
+ :group 'picon)
-(defcustom gnus-picons-news-directories '("news")
+(defcustom gnus-picon-news-directories '("news")
"*List of directories to search for newsgroups faces."
:type '(repeat string)
- :group 'picons)
-(define-obsolete-variable-alias 'gnus-picons-news-directory
- 'gnus-picons-news-directories)
+ :group 'picon)
-(defcustom gnus-picons-user-directories '("local" "users" "usenix" "misc")
+(defcustom gnus-picon-user-directories '("users" "usenix" "local" "misc")
"*List of directories to search for user faces."
:type '(repeat string)
- :group 'picons)
+ :group 'picon)
-(defcustom gnus-picons-domain-directories '("domains")
+(defcustom gnus-picon-domain-directories '("domains")
"*List of directories to search for domain faces.
Some people may want to add \"unknown\" to this list."
:type '(repeat string)
- :group 'picons)
-
-(defcustom gnus-picons-refresh-before-display nil
- "*If non-nil, display the article buffer before computing the picons."
- :type 'boolean
- :group 'picons)
-
-(defcustom gnus-picons-group-excluded-groups nil
- "*If this regexp matches the group name, group picons will be disabled."
- :type 'regexp
- :group 'picons)
-
-(defcustom gnus-picons-display-as-address t
- "*If t display textual email addresses along with pictures."
- :type 'boolean
- :group 'picons)
-
-(defcustom gnus-picons-file-suffixes
- (when (featurep 'x)
- (let ((types (list "xbm")))
- (when (featurep 'gif)
+ :group 'picon)
+
+(defcustom gnus-picon-file-types
+ (let ((types (list "xbm")))
+ (if (gnus-image-type-available-p 'gif)
(setq types (cons "gif" types)))
- (when (featurep 'xpm)
+ (if (gnus-image-type-available-p 'xpm)
(setq types (cons "xpm" types)))
- types))
+ types)
"*List of suffixes on picon file names to try."
:type '(repeat string)
- :group 'picons)
-
-(defcustom gnus-picons-display-article-move-p nil
- "*Whether to move point to first empty line when displaying picons.
-This has only an effect if `gnus-picons-display-where' has value `article'."
- :type 'boolean
- :group 'picons)
-
-(defcustom gnus-picons-clear-cache-on-shutdown t
- "*Whether to clear the picons cache when exiting gnus.
-Gnus caches every picons it finds while it is running. This saves
-some time in the search process but eats some memory. If this
-variable is set to nil, Gnus will never clear the cache itself; you
-will have to manually call `gnus-picons-clear-cache' to clear it.
-Otherwise the cache will be cleared every time you exit Gnus."
- :type 'boolean
- :group 'picons)
-
-(defcustom gnus-picons-piconsearch-url nil
- "*The url to query for picons. Setting this to nil will disable it.
-The only publicly available address currently known is
-http://www.cs.indiana.edu:800/piconsearch. If you know of any other,
-please tell me so that we can list it."
- :type '(choice (const :tag "Disable" :value nil)
- (const :tag "www.cs.indiana.edu"
- :value "http://www.cs.indiana.edu:800/piconsearch")
- (string))
- :group 'picons)
-
-(defface gnus-picons-xbm-face '((t (:foreground "black" :background "white")))
- "Face to show xbm picons in."
- :group 'picons)
-
-(defface gnus-picons-face '((t (:foreground "black" :background "white")))
- "Face to show picons in."
- :group 'picons)
-
-(defcustom gnus-picons-setup-hook nil
- "Hook run in Picons buffers."
- :group 'picons
- :type 'hook)
+ :group 'picon)
-;;; Internal variables:
+(defface gnus-picon-xbm-face '((t (:foreground "black" :background "white")))
+ "Face to show xbm picon in."
+ :group 'picon)
-(defvar gnus-picons-setup-p nil)
-(defvar gnus-picons-processes-alist nil
- "Picons processes currently running and their environment.")
-(defvar gnus-picons-glyph-alist nil
- "Picons glyphs cache.
-List of pairs (KEY . GLYPH) where KEY is either a filename or an URL.")
-(defvar gnus-picons-url-alist nil
- "Picons file names cache.
-List of pairs (KEY . NAME) where KEY is (USER HOST DBS) and NAME is an URL.")
+(defface gnus-picon-face '((t (:foreground "black" :background "white")))
+ "Face to show picon in."
+ :group 'picon)
-(defvar gnus-picons-jobs-alist nil
- "List of jobs that still need be done.
-This is a list of (SYM-ANN TAG ARGS...) where SYM-ANN three annotations list,
-TAG is one of `picon' or `search' indicating that the job should query a
-picon or do a search for picons file names, and ARGS is some additionnal
-arguments necessary for the job.")
+;;; Internal variables:
-(defvar gnus-picons-job-already-running nil
- "Lock to ensure only one stream of http requests is running.")
+(defvar gnus-picon-setup-p nil)
+(defvar gnus-picon-glyph-alist nil
+ "Picon glyphs cache.
+List of pairs (KEY . GLYPH) where KEY is either a filename or an URL.")
;;; Functions:
-(defun gnus-picons-remove-all ()
- "Removes all picons from the Gnus display(s)."
+(defsubst gnus-picon-split-address (address)
+ (setq address (split-string address "@"))
+ (if (stringp (cadr address))
+ (cons (car address) (split-string (cadr address) "\\."))
+ (if (stringp (car address))
+ (split-string (car address) "\\."))))
+
+(defun gnus-picon-find-face (address directories &optional exact)
+ (let* ((databases gnus-picon-databases)
+ (address (gnus-picon-split-address address))
+ (user (pop address))
+ database directory found instance base)
+ (while (and (not found)
+ (setq database (pop databases)))
+ (while (and (not found)
+ (setq directory (pop directories)))
+ (setq base (expand-file-name directory database))
+ ;; Kludge to search misc/MISC for users.
+ (when (string= directory "misc")
+ (setq address '("MISC")))
+ (while (and (not found)
+ address)
+ (setq found (gnus-picon-find-image
+ (concat base "/" (mapconcat 'identity
+ (reverse address)
+ "/")
+ "/" user "/")))
+ (if exact
+ (setq address nil)
+ (pop address)))))
+ found))
+
+(defun gnus-picon-find-image (directory)
+ (let ((types gnus-picon-file-types)
+ found type file)
+ (while (and (not found)
+ (setq type (pop types)))
+ (setq found (file-exists-p (setq file (concat directory "face." type)))))
+ (if found
+ file
+ nil)))
+
+(defun gnus-picon-insert-glyph (glyph category)
+ "Insert GLYPH into the buffer.
+GLYPH can be either a glyph or a string."
+ (if (stringp glyph)
+ (insert glyph)
+ (gnus-add-wash-type category)
+ (gnus-add-image category (car glyph))
+ (gnus-put-image (car glyph) (cdr glyph))))
+
+(defun gnus-picon-create-glyph (file)
+ (or (cdr (assoc file gnus-picon-glyph-alist))
+ (cdar (push (cons file (gnus-create-image file))
+ gnus-picon-glyph-alist))))
+
+;;; Functions that does picon transformations:
+
+(defun gnus-picon-transform-address (header category)
+ (gnus-with-article-headers
+ (let ((addresses
+ (mail-header-parse-addresses (mail-fetch-field header)))
+ first spec file)
+ (dolist (address addresses)
+ (setq address (car address)
+ first t)
+ (when (and (stringp address)
+ (setq spec (gnus-picon-split-address address)))
+ (when (setq file (gnus-picon-find-face
+ address gnus-picon-user-directories))
+ (setcar spec (cons (gnus-picon-create-glyph file)
+ (car spec))))
+ (dotimes (i (1- (length spec)))
+ (when (setq file (gnus-picon-find-face
+ (concat "unknown@"
+ (mapconcat
+ 'identity (nthcdr (1+ i) spec) "."))
+ gnus-picon-domain-directories t))
+ (setcar (nthcdr (1+ i) spec)
+ (cons (gnus-picon-create-glyph file)
+ (nth (1+ i) spec)))))
+
+ (gnus-article-goto-header header)
+ (mail-header-narrow-to-field)
+ (when (search-forward address nil t)
+ (delete-region (match-beginning 0) (match-end 0))
+ (while spec
+ (gnus-picon-insert-glyph (pop spec) category)
+ (when spec
+ (if (not first)
+ (insert ".")
+ (insert "@")
+ (setq first nil))))))))))
+
+(defun gnus-picon-transform-newsgroups (header)
(interactive)
- (map-extents (function (lambda (ext unused) (delete-annotation ext) nil))
- nil nil nil nil nil 'gnus-picon)
- (setq gnus-picons-jobs-alist '())
- ;; notify running job that it may have been preempted
- (if (and (listp gnus-picons-job-already-running)
- gnus-picons-job-already-running)
- (setq gnus-picons-job-already-running t)))
-
-(defun gnus-get-buffer-name (variable)
- "Returns the buffer name associated with the contents of a variable."
- (let ((buf (gnus-get-buffer-create
- (gnus-window-to-buffer-helper
- (cdr (assq variable gnus-window-to-buffer))))))
- (and buf
- (buffer-name buf))))
-
-(defun gnus-picons-buffer-name ()
- (cond ((or (stringp gnus-picons-display-where)
- (bufferp gnus-picons-display-where))
- gnus-picons-display-where)
- ((eq gnus-picons-display-where 'picons)
- (if gnus-single-article-buffer
- "*Picons*"
- (concat "*Picons " gnus-newsgroup-name "*")))
- (t
- (gnus-get-buffer-name gnus-picons-display-where))))
-
-(defun gnus-picons-kill-buffer ()
- (let ((buf (get-buffer (gnus-picons-buffer-name))))
- (when (and (buffer-live-p buf)
- (string-match "Picons" (buffer-name buf)))
- (kill-buffer buf))))
-
-(defun gnus-picons-setup-buffer ()
- (let ((name (gnus-picons-buffer-name)))
- (save-excursion
- (if (and (get-buffer name)
- (with-current-buffer name
- gnus-picons-setup-p))
- (set-buffer name)
- (set-buffer (gnus-get-buffer-create name))
- (buffer-disable-undo)
- (setq buffer-read-only t)
- (run-hooks 'gnus-picons-setup-hook)
- (set (make-local-variable 'gnus-picons-setup-p) t)
- (add-hook 'gnus-summary-prepare-exit-hook 'gnus-picons-kill-buffer))
- (current-buffer))))
-
-(defun gnus-picons-set-buffer ()
- (set-buffer (gnus-picons-setup-buffer))
- (goto-char (point-min))
- (if (and (eq gnus-picons-display-where 'article)
- gnus-picons-display-article-move-p)
- (if (search-forward "\n\n" nil t)
- (forward-line -1)
- (goto-char (point-max)))
- (setq buffer-read-only t)
- (unless gnus-picons-has-modeline-p
- (set-specifier has-modeline-p
- (list (list (current-buffer)
- (cons nil gnus-picons-has-modeline-p)))))))
-
-(defun gnus-picons-prepare-for-annotations ()
- "Prepare picons buffer for putting annotations."
- ;; let drawing catch up
- (when gnus-picons-refresh-before-display
- (sit-for 0))
- (gnus-picons-set-buffer)
- (gnus-picons-remove-all))
-
-(defun gnus-picons-make-annotation (&rest args)
- (let ((annot (apply 'make-annotation args)))
- (set-extent-property annot 'gnus-picon t)
- (set-extent-property annot 'duplicable t)
- annot))
-
-(defun gnus-article-display-picons ()
- "Display faces for an author and her domain in gnus-picons-display-where."
+ (gnus-with-article-headers
+ (let ((groups
+ (sort
+ (message-tokenize-header (mail-fetch-field header))
+ (lambda (g1 g2) (> (length g1) (length g2)))))
+ spec file)
+ (dolist (group groups)
+ (setq spec (nreverse (split-string group "[.]")))
+ (dotimes (i (length spec))
+ (when (setq file (gnus-picon-find-face
+ (concat "unknown@"
+ (mapconcat
+ 'identity (nthcdr i spec) "."))
+ gnus-picon-news-directories t))
+ (setcar (nthcdr i spec)
+ (cons (gnus-picon-create-glyph file)
+ (nth i spec)))))
+
+ (gnus-article-goto-header header)
+ (mail-header-narrow-to-field)
+ (when (search-forward group nil t)
+ (delete-region (match-beginning 0) (match-end 0))
+ (setq spec (nreverse spec))
+ (while spec
+ (gnus-picon-insert-glyph (pop spec) 'newsgroups-picon)
+ (when spec
+ (insert "."))))))))
+
+;;; Commands:
+
+;;;###autoload
+(defun gnus-treat-from-picon ()
+ "Display picons in the From header.
+If picons are already displayed, remove them."
(interactive)
- (let (from at-idx)
- (when (and (featurep 'xpm)
- (or (not (fboundp 'device-type)) (equal (device-type) 'x))
- (setq from (mail-fetch-field "from"))
- (setq from (downcase (or (cadr
- (funcall gnus-extract-address-components
- from))
- "")))
- (or (setq at-idx (string-match "@" from))
- (setq at-idx (length from))))
- (save-excursion
- (let ((username (downcase (substring from 0 at-idx)))
- (addrs (if (eq at-idx (length from))
- (if gnus-local-domain
- (message-tokenize-header gnus-local-domain "."))
- (message-tokenize-header (substring from (1+ at-idx))
- "."))))
- (gnus-picons-prepare-for-annotations)
- (gnus-group-display-picons)
- (unless gnus-picons-display-article-move-p
- (let ((buffer-read-only nil)
- (case-fold-search t))
- (when (re-search-forward "^From *: *" nil t)
- (when (search-forward from (gnus-point-at-eol) t)
- (gnus-put-text-property
- (match-beginning 0) (match-end 0)
- 'invisible t)))))
- (if (null gnus-picons-piconsearch-url)
- (progn
- (gnus-picons-display-pairs (gnus-picons-lookup-pairs
- addrs
- gnus-picons-domain-directories)
- gnus-picons-display-as-address
- "." t)
- (if (and gnus-picons-display-as-address addrs)
- (gnus-picons-make-annotation
- [string :data "@"] nil 'text nil nil nil t))
- (gnus-picons-display-picon-or-name
- (gnus-picons-lookup-user username addrs)
- username t))
- (push (list 'gnus-article-annotations 'search username addrs
- gnus-picons-domain-directories t (point-marker))
- gnus-picons-jobs-alist)
- (gnus-picons-next-job)))))))
-
-(defun gnus-group-display-picons ()
- "Display icons for the group in the `gnus-picons-display-where' buffer."
+ (gnus-with-article-buffer
+ (if (memq 'from-picon gnus-article-wash-types)
+ (gnus-delete-images 'from-picon)
+ (gnus-picon-transform-address "from" 'from-picon))))
+
+;;;###autoload
+(defun gnus-treat-mail-picon ()
+ "Display picons in the Cc and To headers.
+If picons are already displayed, remove them."
(interactive)
- (when (and (featurep 'xpm)
- (or (not (fboundp 'device-type)) (equal (device-type) 'x))
- (or (null gnus-picons-group-excluded-groups)
- (not (string-match gnus-picons-group-excluded-groups
- gnus-newsgroup-name))))
- (let* ((newsgroups (mail-fetch-field "newsgroups"))
- (groups
- (if (or gnus-picons-display-article-move-p
- (not newsgroups))
- (list (gnus-group-real-name gnus-newsgroup-name))
- (split-string newsgroups ",")))
- group)
- (save-excursion
- (gnus-picons-prepare-for-annotations)
- (while (setq group (pop groups))
- (unless gnus-picons-display-article-move-p
- (let ((buffer-read-only nil)
- (case-fold-search t))
- (goto-char (point-min))
- (if (and (re-search-forward "^Newsgroups *: *" nil t)
- (search-forward group (gnus-point-at-eol) t))
- (gnus-put-text-property
- (match-beginning 0) (match-end 0)
- 'invisible t)
- (let ((article-goto-body-goes-to-point-min-p nil))
- (article-goto-body))
- (unless (bobp)
- (backward-char 1)))))
- (if (null gnus-picons-piconsearch-url)
- (gnus-picons-display-pairs
- (gnus-picons-lookup-pairs
- (reverse (split-string group "\\."))
- gnus-picons-news-directories)
- t ".")
- (push (list 'gnus-group-annotations 'search nil
- (split-string group "\\.")
- (if (listp gnus-picons-news-directories)
- gnus-picons-news-directories
- (list gnus-picons-news-directories))
- nil (point-marker))
- gnus-picons-jobs-alist)
- (gnus-picons-next-job))
-
- (add-hook 'gnus-summary-exit-hook 'gnus-picons-remove-all))))))
-
-(defun gnus-picons-lookup-internal (addrs dir)
- (setq dir (expand-file-name dir gnus-picons-database))
- (gnus-picons-try-face (dolist (part (reverse addrs) dir)
- (setq dir (expand-file-name part dir)))))
-
-(defun gnus-picons-lookup (addrs dirs)
- "Lookup the picon for ADDRS in databases DIRS.
-Returns the picon filename or nil if none found."
- (let (result)
- (while (and dirs (null result))
- (setq result (gnus-picons-lookup-internal addrs (pop dirs))))
- result))
-
-(defun gnus-picons-lookup-user-internal (user domains)
- (let ((dirs gnus-picons-user-directories)
- domains-tmp dir picon)
- (while (and dirs (null picon))
- (setq domains-tmp domains
- dir (pop dirs))
- (while (and domains-tmp
- (null (setq picon (gnus-picons-lookup-internal
- (cons user domains-tmp) dir))))
- (pop domains-tmp))
- ;; Also make a try in MISC subdir
- (unless picon
- (setq picon (gnus-picons-lookup-internal (list user "MISC") dir))))
- picon))
-
-(defun gnus-picons-lookup-user (user domains)
- "Lookup the picon for USER at DOMAINS.
-USER is a string containing a name.
-DOMAINS is a list of strings from the fully qualified domain name."
- (or (gnus-picons-lookup-user-internal user domains)
- (gnus-picons-lookup-user-internal "unknown" domains)))
-
-(defun gnus-picons-lookup-pairs (domains directories)
- "Lookup picons for DOMAINS and all its parents in DIRECTORIES.
-Returns a list of PAIRS whose CAR is the picon filename or nil if
-none, and whose CDR is the corresponding element of DOMAINS."
- (let (picons)
- (setq directories (if (listp directories)
- directories
- (list directories)))
- (while domains
- (push (list (gnus-picons-lookup (cons "unknown" domains) directories)
- (pop domains))
- picons))
- picons))
-
-(defun gnus-picons-display-picon-or-name (picon name &optional right-p)
- (cond (picon (gnus-picons-display-glyph picon name right-p))
- (gnus-picons-display-as-address (list (gnus-picons-make-annotation
- (vector 'string :data name)
- nil 'text
- nil nil nil right-p)))))
-
-(defun gnus-picons-display-pairs (pairs &optional bar-p dot-p right-p)
- "Display picons in list PAIRS."
- (let ((domain-p (and gnus-picons-display-as-address dot-p))
- pair picons)
- (when (and bar-p domain-p right-p
- gnus-picons-display-article-move-p)
- (setq picons (gnus-picons-display-glyph
- (let ((gnus-picons-file-suffixes '("xbm")))
- (gnus-picons-try-face
- gnus-xmas-glyph-directory "bar."))
- nil right-p)))
- (while (setq pair (pop pairs))
- (setq picons (nconc picons
- (gnus-picons-display-picon-or-name
- (car pair) (cadr pair) right-p)
- (if (and domain-p pairs)
- (list (gnus-picons-make-annotation
- (vector 'string :data dot-p)
- nil 'text nil nil nil right-p))))))
- picons))
-
-(defun gnus-picons-try-face (dir &optional filebase)
- (let* ((dir (file-name-as-directory dir))
- (filebase (or filebase "face."))
- (key (concat dir filebase))
- (glyph (cdr (assoc key gnus-picons-glyph-alist)))
- (suffixes gnus-picons-file-suffixes)
- f suf)
- (while (setq suf (pop suffixes))
- (when (file-exists-p (setq f (expand-file-name
- (concat filebase suf)
- dir)))
- (setq suffixes nil
- glyph (make-glyph f))
- (if (equal suf "xbm")
- (set-glyph-face glyph 'gnus-picons-xbm-face)
- (set-glyph-face glyph 'gnus-picons-face))
- (push (cons key glyph) gnus-picons-glyph-alist)))
- glyph))
-
-(defun gnus-picons-display-glyph (glyph &optional part rightp)
- (set-glyph-baseline glyph 70)
- (let ((new (gnus-picons-make-annotation
- glyph (point) 'text nil nil nil rightp)))
- (when (and part gnus-picons-display-as-address)
- (set-annotation-data
- new (cons new (make-glyph (vector 'string :data part))))
- (set-annotation-action new 'gnus-picons-action-toggle))
- (nconc
- (list new)
- (if (and (eq major-mode 'gnus-article-mode)
- (not gnus-picons-display-as-address)
- (not part))
- (list (gnus-picons-make-annotation [string :data " "] (point)
- 'text nil nil nil rightp))))))
-
-(defun gnus-picons-action-toggle (data)
- "Toggle annotation."
- (interactive "e")
- (let* ((annot (car data))
- (glyph (annotation-glyph annot)))
- (set-annotation-glyph annot (cdr data))
- (set-annotation-data annot (cons annot glyph))))
-
-(defun gnus-picons-clear-cache ()
- "Clear the picons cache."
+ (gnus-with-article-buffer
+ (if (memq 'mail-picon gnus-article-wash-types)
+ (gnus-delete-images 'mail-picon)
+ (gnus-picon-transform-address "cc" 'mail-picon)
+ (gnus-picon-transform-address "to" 'mail-picon))))
+
+;;;###autoload
+(defun gnus-treat-newsgroups-picon ()
+ "Display picons in the Newsgroups and Followup-To headers.
+If picons are already displayed, remove them."
(interactive)
- (setq gnus-picons-glyph-alist nil
- gnus-picons-url-alist nil))
-
-(gnus-add-shutdown 'gnus-picons-close 'gnus)
-
-(defun gnus-picons-close ()
- "Shut down the picons."
- (if gnus-picons-clear-cache-on-shutdown
- (gnus-picons-clear-cache)))
-
-;;; Query a remote DB. This requires some stuff from w3 !
-
-(eval-and-compile
- (ignore-errors
- (require 'url)
- (require 'w3-forms)))
-
-(defun gnus-picons-url-retrieve (url fn arg)
- (let ((old-asynch (default-value 'url-be-asynchronous))
- (url-working-buffer (generate-new-buffer " *picons*"))
- (url-package-name "Gnus")
- (url-package-version gnus-version-number)
- url-request-method)
- (setq-default url-be-asynchronous t)
- (save-excursion
- (set-buffer url-working-buffer)
- (setq url-be-asynchronous t
- url-current-callback-data arg
- url-current-callback-func fn)
- (url-retrieve url t))
- (setq-default url-be-asynchronous old-asynch)))
-
-(defun gnus-picons-make-glyph (type)
- "Make a TYPE glyph using current buffer as data. Handles xbm nicely."
- (cond ((null type) nil)
- ((eq type 'xbm) (let ((fname (make-temp-name "/tmp/picon")))
- (write-region (point-min) (point-max) fname
- nil 'quiet)
- (prog1 (make-glyph (vector 'xbm :file fname))
- (delete-file fname))))
- (t (make-glyph (vector type :data (buffer-string))))))
-
-;;; Parsing of piconsearch result page.
-
-;; Assumes:
-;; 1 - each value field has the form: "<strong>key</strong> = <kbd>value</kbd>"
-;; 2 - a "<p>" separates the keywords from the results
-;; 3 - every results begins by the path within the database at the beginning
-;; of the line in raw text.
-;; 3b - and the href following it is the preferred image type.
-
-;; if 1 or 2 is not met, it will probably cause an error. The other
-;; will go undetected
-
-(defun gnus-picons-parse-value (name)
- (goto-char (point-min))
- (if (re-search-forward (concat "<strong>"
- (regexp-quote name)
- "</strong> *= *<kbd> *\\([^ <][^<]*\\) *</kbd>")
- nil t)
- (buffer-substring (match-beginning 1) (match-end 1))))
-
-(defun gnus-picons-parse-filenames ()
- ;; returns an alist of ((USER ADDRS DB) . URL)
- (let ((case-fold-search t)
- (user (gnus-picons-parse-value "user"))
- (host (gnus-picons-parse-value "host"))
- (dbs (message-tokenize-header (gnus-picons-parse-value "db") " "))
- start-re cur-db cur-host cur-user types res)
- ;; now point will be somewhere in the header. Find beginning of
- ;; entries
- (when (and user host dbs)
- (setq start-re
- (concat
- ;; dbs
- "^\\(" (mapconcat 'regexp-quote dbs "\\|") "\\)/"
- ;; host
- "\\(\\(" (mapconcat 'regexp-quote
- (message-tokenize-header host ".") "/\\|")
- "/\\|MISC/\\)*\\)"
- ;; user
- "\\(" (regexp-quote user) "\\|unknown\\)/"
- "face\\."))
- (re-search-forward "<p>[ \t\n]*")
- (while (re-search-forward start-re nil t)
- (setq cur-db (buffer-substring (match-beginning 1) (match-end 1))
- cur-host (buffer-substring (match-beginning 2) (match-end 2))
- cur-user (buffer-substring (match-beginning 4) (match-end 4))
- cur-host (nreverse (message-tokenize-header cur-host "/")))
- ;; XXX - KLUDGE: there is a blank picon in news/MISC/unknown
- (unless (and (string-equal cur-db "news")
- (string-equal cur-user "unknown")
- (equal cur-host '("MISC")))
- ;; ok now we have found an entry (USER HOST DB), find the
- ;; corresponding picon URL
- (save-restriction
- ;; restrict region to this entry
- (narrow-to-region (point) (search-forward "<br>"))
- (goto-char (point-min))
- (setq types gnus-picons-file-suffixes)
- (while (and types
- (not (re-search-forward
- (concat "<a[ \t\n]+href=\"\\([^\"]*\\."
- (regexp-quote (car types)) "\\)\"")
- nil t)))
- (pop types))
- (push (cons (list cur-user cur-host cur-db)
- (buffer-substring (match-beginning 1) (match-end 1)))
- res))))
- (nreverse res))))
-
-;;; picon network display functions :
-
-(defun gnus-picons-network-display-internal (sym-ann glyph part right-p marker)
- (let ((buf (marker-buffer marker))
- (pos (marker-position marker)))
- (if (and buf pos)
- (save-excursion
- (set-buffer buf)
- (goto-char pos)
- (gnus-picons-display-picon-or-name glyph part right-p))))
- (gnus-picons-next-job-internal))
-
-(defun gnus-picons-network-display-callback (url part sym-ann right-p marker)
- (let ((glyph (gnus-picons-make-glyph (cdr (assoc url-current-mime-type
- w3-image-mappings)))))
- (kill-buffer (current-buffer))
- (push (cons url glyph) gnus-picons-glyph-alist)
- ;; only do the job if it has not been preempted.
- (if (equal gnus-picons-job-already-running
- (list sym-ann 'picon url part right-p marker))
- (gnus-picons-network-display-internal
- sym-ann glyph part right-p marker)
- (gnus-picons-next-job-internal))))
-
-(defun gnus-picons-network-display (url part sym-ann right-p marker)
- (let ((cache (assoc url gnus-picons-glyph-alist)))
- (if (or cache (null url))
- (gnus-picons-network-display-internal
- sym-ann (cdr cache) part right-p marker)
- (gnus-picons-url-retrieve url 'gnus-picons-network-display-callback
- (list url part sym-ann right-p marker)))))
-
-;;; search job functions
-
-(defun gnus-picons-display-bar-p ()
- (if (eq gnus-picons-display-where 'article)
- gnus-picons-display-article-move-p
- gnus-picons-display-as-address))
-
-(defun gnus-picons-network-search-internal (user addrs dbs sym-ann right-p
- marker &optional fnames)
- (let (curkey dom pfx url dbs-tmp cache new-jobs)
- ;; First do the domain search
- (dolist (part (if right-p
- (reverse addrs)
- addrs))
- (setq pfx (nconc (list part) pfx)
- dom (cond ((and dom right-p) (concat part "." dom))
- (dom (concat dom "." part))
- (t part))
- curkey (list "unknown" dom dbs))
- (when (null (setq cache (assoc curkey gnus-picons-url-alist)))
- ;; This one is not yet in the cache, create a new entry
- ;; Search for an entry
- (setq dbs-tmp dbs
- url nil)
- (while (and dbs-tmp (null url))
- (setq url (or (cdr (assoc (list "unknown" pfx (car dbs-tmp)) fnames))
- (and (eq dom part)
- ;; This is the first component. Try the
- ;; catch-all MISC component
- (cdr (assoc (list "unknown"
- '("MISC")
- (car dbs-tmp))
- fnames)))))
- (pop dbs-tmp))
- (push (setq cache (cons curkey url)) gnus-picons-url-alist))
- ;; Put this glyph in the job list
- (if (and (not (eq dom part)) gnus-picons-display-as-address)
- (push (list sym-ann "." right-p marker) new-jobs))
- (push (list sym-ann 'picon (cdr cache) part right-p marker) new-jobs))
- ;; next, the user search
- (when user
- (setq curkey (list user dom gnus-picons-user-directories))
- (if (null (setq cache (assoc curkey gnus-picons-url-alist)))
- (let ((users (list user "unknown"))
- dirs usr domains-tmp dir picon)
- (while (and users (null picon))
- (setq dirs gnus-picons-user-directories
- usr (pop users))
- (while (and dirs (null picon))
- (setq domains-tmp addrs
- dir (pop dirs))
- (while (and domains-tmp
- (null (setq picon (assoc (list usr domains-tmp dir)
- fnames))))
- (pop domains-tmp))
- (unless picon
- (setq picon (assoc (list usr '("MISC") dir) fnames)))))
- (push (setq cache (cons curkey (cdr picon)))
- gnus-picons-url-alist)))
- (if (and gnus-picons-display-as-address new-jobs)
- (push (list sym-ann "@" right-p marker) new-jobs))
- (push (list sym-ann 'picon (cdr cache) user right-p marker) new-jobs))
- (if (and (gnus-picons-display-bar-p) (not right-p))
- (push (list sym-ann 'bar right-p marker) new-jobs))
- ;; only put the jobs in the queue if this job has not been preempted.
- (if (equal gnus-picons-job-already-running
- (list sym-ann 'search user addrs dbs right-p marker))
- (setq gnus-picons-jobs-alist
- (nconc (if (and (gnus-picons-display-bar-p) right-p)
- (list (list sym-ann 'bar right-p marker)))
- (nreverse new-jobs)
- gnus-picons-jobs-alist)))
- (gnus-picons-next-job-internal)))
-
-(defun gnus-picons-network-search-callback (user addrs dbs sym-ann right-p
- marker)
- (gnus-picons-network-search-internal
- user addrs dbs sym-ann right-p marker
- (prog1
- (gnus-picons-parse-filenames)
- (kill-buffer (current-buffer)))))
-
-;; Initiate a query on the picon database
-(defun gnus-picons-network-search (user addrs dbs sym-ann right-p marker)
- (let* ((host (mapconcat 'identity addrs "."))
- (key (list (or user "unknown") host (if user
- gnus-picons-user-directories
- dbs)))
- (cache (assoc key gnus-picons-url-alist)))
- (if (null cache)
- (gnus-picons-url-retrieve
- (concat gnus-picons-piconsearch-url
- "?user=" (w3-form-encode-xwfu (or user "unknown"))
- "&host=" (w3-form-encode-xwfu host)
- "&db=" (mapconcat 'w3-form-encode-xwfu
- (if user
- (append dbs
- gnus-picons-user-directories)
- dbs)
- "+"))
- 'gnus-picons-network-search-callback
- (list user addrs dbs sym-ann right-p marker))
- (gnus-picons-network-search-internal
- user addrs dbs sym-ann right-p marker))))
-
-;;; Main jobs dispatcher function
-
-(defun gnus-picons-next-job-internal ()
- (when (setq gnus-picons-job-already-running (pop gnus-picons-jobs-alist))
- (let* ((job gnus-picons-job-already-running)
- (sym-ann (pop job))
- (tag (pop job)))
- (when tag
- (cond
- ((stringp tag);; (SYM-ANN "..." RIGHT-P MARKER)
- (gnus-picons-network-display-internal
- sym-ann nil tag (pop job) (pop job)))
- ((eq 'bar tag);; (SYM-ANN 'bar RIGHT-P MARKER)
- (gnus-picons-network-display-internal
- sym-ann
- (let ((gnus-picons-file-suffixes '("xbm")))
- (gnus-picons-try-face
- gnus-xmas-glyph-directory "bar."))
- nil (pop job) (pop job)))
- ((eq 'search tag);; (SYM-ANN 'search USER ADDRS DBS RIGHT-P MARKER)
- (gnus-picons-network-search
- (pop job) (pop job) (pop job) sym-ann (pop job) (pop job)))
- ((eq 'picon tag);; (SYM-ANN 'picon URL PART RIGHT-P MARKER)
- (gnus-picons-network-display
- (pop job) (pop job) sym-ann (pop job) (pop job)))
- (t
- (setq gnus-picons-job-already-running nil)
- (error "Unknown picon job tag %s" tag)))))))
-
-(defun gnus-picons-next-job ()
- "Start processing the job queue if it is not in progress."
- (unless gnus-picons-job-already-running
- (gnus-picons-next-job-internal)))
+ (gnus-with-article-buffer
+ (if (memq 'newsgroups-picon gnus-article-wash-types)
+ (gnus-delete-images 'newsgroups-picon)
+ (gnus-picon-transform-newsgroups "newsgroups")
+ (gnus-picon-transform-newsgroups "followup-to"))))
(provide 'gnus-picon)
(defun gnus-tree-close (group)
(gnus-kill-buffer gnus-tree-buffer))
+(defun gnus-tree-perhaps-minimize ()
+ (when (and gnus-tree-minimize-window
+ (get-buffer gnus-tree-buffer))
+ (save-excursion
+ (set-buffer gnus-tree-buffer)
+ (gnus-tree-minimize))))
+
(defun gnus-highlight-selected-tree (article)
"Highlight the selected article in the tree."
(let ((buf (current-buffer))
:type 'string)
(defcustom gnus-server-browse-in-group-buffer nil
- "Whether browse server in group buffer."
+ "Whether server browsing should take place in the group buffer.
+If nil, a faster, but more primitive, buffer is used instead."
:group 'gnus-server-visual
:type 'string)
groups)))
(gnus-configure-windows 'group)
(funcall gnus-group-prepare-function
- gnus-level-killed 'ignore 1 'ingore))
+ gnus-level-killed 'ignore 1 'ignore))
(gnus-get-buffer-create gnus-browse-buffer)
(when gnus-carpal
(gnus-carpal-setup-buffer 'browse))
(list
(format
"Gnus: %%b {%s:%s}" (car method) (cadr method))))
- (let ((buffer-read-only nil) charset)
+ (let ((buffer-read-only nil) charset
+ (prefix (let ((gnus-select-method orig-select-method))
+ (gnus-group-prefixed-name "" method))))
(while groups
(setq group (car groups))
(setq charset (gnus-group-name-charset method (car group)))
(prog1 (1+ (point))
(insert
(format "%c%7d: %s\n"
- (let ((level
- (let ((gnus-select-method orig-select-method))
- (gnus-group-level
- (gnus-group-prefixed-name (car group)
- method)))))
+ (let ((level (gnus-group-level (concat prefix (car group)))))
(cond
((<= level gnus-level-subscribed) ? )
((<= level gnus-level-unsubscribed) ?U)
(require 'gnus-int)
(require 'gnus-undo)
(require 'gnus-util)
-;; Recursive :-(.
-;; (require 'gnus-art)
(require 'nnoo)
(require 'mime-view)
:type 'boolean)
(defcustom gnus-auto-select-first t
- "*If nil, don't select the first unread article when entering a group.
-If this variable is `best', select the highest-scored unread article
-in the group. If t, select the first unread article.
-
-This variable can also be a function to place point on a likely
-subject line. Useful values include `gnus-summary-first-unread-subject',
-`gnus-summary-first-unread-article' and
-`gnus-summary-best-unread-article'.
-
-If you want to prevent automatic selection of the first unread article
-in some newsgroups, set the variable to nil in
-`gnus-select-group-hook'."
+ "*If non-nil, select the article under point.
+Which article this is is controlled by the `gnus-auto-select-subject'
+variable.
+
+If you want to prevent automatic selection of articles in some
+newsgroups, set the variable to nil in `gnus-select-group-hook'."
:group 'gnus-group-select
:type '(choice (const :tag "none" nil)
- (const best)
- (sexp :menu-tag "first" t)
- (function-item gnus-summary-first-unread-subject)
- (function-item gnus-summary-first-unread-article)
- (function-item gnus-summary-best-unread-article)))
+ (sexp :menu-tag "first" t)))
+
+(defcustom gnus-auto-select-subject 'unread
+ "*Says what subject to place under point when entering a group.
+
+This variable can either be the symbols `first' (place point on the
+first subject), `unread' (place point on the subject line of the first
+unread article), `best' (place point on the subject line of the
+higest-scored article), `unseen' (place point on the subject line of
+the first unseen article), or a function to be called to place point on
+some subject line.."
+ :group 'gnus-group-select
+ :type '(choice (const best)
+ (const unread)
+ (const first)
+ (const unseen)))
(defcustom gnus-dont-select-after-jump-to-other-group nil
"If non-nil, don't select the first unread article after entering the
"r" gnus-summary-caesar-message
"t" gnus-article-toggle-headers
"g" gnus-summary-toggle-smiley
+ "u" gnus-article-treat-unfold-headers
+ "n" gnus-article-treat-fold-newsgroups
"v" gnus-summary-verbose-headers
"m" gnus-summary-toggle-mime
"a" gnus-article-strip-headers-in-body ;; mnemonic: wash archive
"c" gnus-article-highlight-citation
"s" gnus-article-highlight-signature)
+ (gnus-define-keys (gnus-summary-wash-display-map "D" gnus-summary-wash-map)
+ "x" gnus-article-display-x-face
+ "s" gnus-summary-toggle-smiley
+ "f" gnus-treat-from-picon
+ "m" gnus-treat-mail-picon
+ "n" gnus-treat-newsgroups-picon)
+
(gnus-define-keys (gnus-summary-wash-time-map "T" gnus-summary-wash-map)
"z" gnus-article-date-ut
"u" gnus-article-date-ut
["Original" gnus-article-date-original t]
["Lapsed" gnus-article-date-lapsed t]
["User-defined" gnus-article-date-user t])
+ ("Display"
+ ["Toggle smiley" gnus-summary-toggle-smiley t]
+ ["Show X-Face" gnus-article-display-x-face t]
+ ["Show picons in From" gnus-treat-from-picon t]
+ ["Show picons in mail headers" gnus-treat-mail-picon t]
+ ["Show picons in news headers" gnus-treat-newsgroups-picon t])
("Washing"
("Remove Blanks"
["Leading" gnus-article-strip-leading-blank-lines t]
["Fill long lines" gnus-article-fill-long-lines t]
["Capitalize sentences" gnus-article-capitalize-sentences t]
["CR" gnus-article-remove-cr t]
- ["Show X-Face" gnus-article-display-x-face t]
["Rot 13" gnus-summary-caesar-message
,@(if (featurep 'xemacs) '(t)
'(:help "\"Caesar rotate\" article by 13"))]
["Toggle MIME" gnus-summary-toggle-mime t]
["Verbose header" gnus-summary-verbose-headers t]
["Toggle header" gnus-summary-toggle-header t]
- ["Toggle smiley" gnus-summary-toggle-smiley t]
+ ["Unfold headers" gnus-article-treat-unfold-headers t]
+ ["Fold newsgroups" gnus-article-treat-fold-newsgroups t]
["Verify X-PGP-Sig" gnus-article-verify-x-pgp-sig t]
["HZ" gnus-article-decode-HZ t])
("Output"
["Set expirable mark" gnus-summary-mark-as-expirable t]
["Set bookmark" gnus-summary-set-bookmark t]
["Remove bookmark" gnus-summary-remove-bookmark t])
- ("Mark Limit"
+ ("Limit to"
["Marks..." gnus-summary-limit-to-marks t]
["Subject..." gnus-summary-limit-to-subject t]
["Author..." gnus-summary-limit-to-author t]
;; Saving hidden threads.
-(put 'gnus-save-hidden-threads 'lisp-indent-function 0)
-(put 'gnus-save-hidden-threads 'edebug-form-spec '(body))
-
(defmacro gnus-save-hidden-threads (&rest forms)
"Save hidden threads, eval FORMS, and restore the hidden threads."
(let ((config (make-symbol "config")))
(save-excursion
,@forms)
(gnus-restore-hidden-threads-configuration ,config)))))
+(put 'gnus-save-hidden-threads 'lisp-indent-function 0)
+(put 'gnus-save-hidden-threads 'edebug-form-spec '(body))
(defun gnus-data-compute-positions ()
"Compute the positions of all articles."
(gnus-summary-hide-all-threads))
(when kill-buffer
(gnus-kill-or-deaden-summary kill-buffer))
+ (gnus-summary-auto-select-subject)
;; Show first unread article if requested.
(if (and (not no-article)
(not no-display)
gnus-auto-select-first)
(progn
(gnus-configure-windows 'summary)
- (cond
- ((eq gnus-auto-select-first 'best)
- (gnus-summary-best-unread-article))
- ((eq gnus-auto-select-first t)
- (gnus-summary-first-unread-article))
- ((gnus-functionp gnus-auto-select-first)
- (funcall gnus-auto-select-first))))
- ;; Don't select any articles, just move point to the first
- ;; article in the group.
- (goto-char (point-min))
+ (gnus-summary-goto-article (gnus-summary-article-number)))
+ ;; Don't select any articles.
(gnus-summary-position-point)
(gnus-configure-windows 'summary 'force)
(gnus-set-mode-line 'summary))
(gnus-run-hooks 'gnus-summary-prepared-hook)
t)))))
+(defun gnus-summary-auto-select-subject ()
+ "Select the subject line on initial group entry."
+ (goto-char (point-min))
+ (cond
+ ((eq gnus-auto-select-subject 'best)
+ (gnus-summary-best-unread-subject))
+ ((eq gnus-auto-select-subject 'unread)
+ (gnus-summary-first-unread-subject))
+ ((eq gnus-auto-select-subject 'unseen)
+ (gnus-summary-first-unseen-subject))
+ ((eq gnus-auto-select-subject 'first)
+ ;; Do nothing.
+ )
+ ((gnus-functionp gnus-auto-select-subject)
+ (funcall gnus-auto-select-subject))))
+
(defun gnus-summary-prepare ()
"Generate the summary buffer."
(interactive)
(gnus-set-sorted-intersection
gnus-newsgroup-unreads fetched-articles))
- (let ((marks (assq 'seen (gnus-info-marks info))))
- ;; The `seen' marks are treated specially.
- (if (setq gnus-newsgroup-seen (cdr marks))
- (dolist (article gnus-newsgroup-articles)
- (unless (gnus-member-of-range article gnus-newsgroup-seen)
- (setq gnus-newsgroup-unseen
- (append gnus-newsgroup-unseen (list article)))))
- (setq gnus-newsgroup-unseen gnus-newsgroup-articles)))
+ ;; The `seen' marks are treated specially.
+ (if (not gnus-newsgroup-seen)
+ (setq gnus-newsgroup-unseen gnus-newsgroup-articles)
+ (dolist (article gnus-newsgroup-articles)
+ (unless (gnus-member-of-range article gnus-newsgroup-seen)
+ (push article gnus-newsgroup-unseen)))
+ (setq gnus-newsgroup-unseen (nreverse gnus-newsgroup-unseen)))
;; Removed marked articles that do not exist.
(gnus-update-missing-marks
(< (car article) min)
(> (car article) max))
(set var (delq article (symbol-value var))))))
+ ;; Adjust ranges (sloppily).
((eq mark-type 'range)
(cond
- ((eq mark 'seen))))))))
+ ((eq mark 'seen)
+ (setq articles (cdr marks))
+ (while (and articles
+ (or (and (consp (car articles))
+ (> min (cdar articles)))
+ (and (numberp (car articles))
+ (> min (car articles)))))
+ (pop articles))
+ (set var articles))))))))
(defun gnus-update-missing-marks (missing)
"Go through the list of MISSING articles and remove them from the mark lists."
(setq list (cdr all)))))
(when (eq (cdr type) 'seen)
- (setq list
- (if list
- (gnus-range-add (gnus-uncompress-sequence list)
- gnus-newsgroup-unseen)
- (gnus-compress-sequence gnus-newsgroup-articles))))
+ (setq list (gnus-range-add list gnus-newsgroup-unseen)))
(when (eq (gnus-article-mark-to-type (cdr type)) 'list)
(setq list (gnus-compress-sequence (set symbol (sort list '<)) t)))
;; Walking around summary lines.
-(defun gnus-summary-first-subject (&optional unread undownloaded)
+(defun gnus-summary-first-subject (&optional unread undownloaded unseen)
"Go to the first unread subject.
If UNREAD is non-nil, go to the first unread article.
Returns the article selected or nil if there are no unread articles."
(and (not (and undownloaded
(eq gnus-undownloaded-mark
(gnus-data-mark (car data)))))
+ (not (and unseen
+ (memq (car data) gnus-newsgroup-unseen)))
(not (gnus-data-unread-p (car data)))))
(setq data (cdr data)))
(when data
(gnus-summary-first-subject t))
(gnus-summary-position-point)))
+(defun gnus-summary-first-unseen-subject ()
+ "Place the point on the subject line of the first unseen article.
+Return nil if there are no unseen articles."
+ (interactive)
+ (prog1
+ (when (gnus-summary-first-subject t t t)
+ (gnus-summary-show-thread)
+ (gnus-summary-first-subject t t t))
+ (gnus-summary-position-point)))
+
(defun gnus-summary-first-article ()
"Select the first article.
Return nil if there are no articles."
(gnus-summary-display-article (gnus-summary-article-number)))
(gnus-summary-position-point)))
-(defun gnus-summary-best-unread-article ()
- "Select the unread article with the highest score."
+(defun gnus-summary-best-unread-article (&optional arg)
+ "Select the unread article with the highest score.
+If given a prefix argument, select the next unread article that has a
+score higher than the default score."
+ (interactive "P")
+ (let ((article (if arg
+ (gnus-summary-better-unread-subject)
+ (gnus-summary-best-unread-subject))))
+ (if article
+ (gnus-summary-goto-article article)
+ (error "No unread articles"))))
+
+(defun gnus-summary-best-unread-subject ()
+ "Select the unread subject with the highest score."
(interactive)
(let ((best -1000000)
(data gnus-newsgroup-data)
(setq best score
article (gnus-data-number (car data))))
(setq data (cdr data)))
- (prog1
- (if article
- (gnus-summary-goto-article article)
- (error "No unread articles"))
- (gnus-summary-position-point))))
+ (when article
+ (gnus-summary-goto-subject article))
+ (gnus-summary-position-point)
+ article))
+
+(defun gnus-summary-better-unread-subject ()
+ "Select the first unread subject that has a score over the default score."
+ (interactive)
+ (let ((data gnus-newsgroup-data)
+ article score)
+ (while (and (setq article (gnus-data-number (car data)))
+ (or (gnus-data-read-p (car data))
+ (not (> (gnus-summary-article-score article)
+ gnus-summary-default-score))))
+ (setq data (cdr data)))
+ (when article
+ (gnus-summary-goto-subject article))
+ (gnus-summary-position-point)
+ article))
(defun gnus-summary-last-subject ()
"Go to the last displayed subject line in the group."
(when (> (length days) 0)
(setq days (read days)))
(if (numberp days)
- (setq days-got t)
+ (progn
+ (setq days-got t)
+ (if (< days 0)
+ (progn
+ (setq younger (not younger))
+ (setq days (* days -1)))))
(message "Please enter a number.")
(sleep-for 1)))
(list days younger)))
(dolist (article (gnus-summary-work-articles n))
(gnus-summary-select-article nil nil 'pseudo article)
(gnus-eval-in-buffer-window gnus-article-buffer
- (let ((buffer (generate-new-buffer " *print*")))
- (unwind-protect
- (progn
- (copy-to-buffer buffer (point-min) (point-max))
- (set-buffer buffer)
- (gnus-article-delete-invisible-text)
- (when (gnus-visual-p 'article-highlight 'highlight)
- ;; Copy-to-buffer doesn't copy overlay. So redo
- ;; highlight.
- (let ((gnus-article-buffer buffer))
- (gnus-article-highlight-citation t)
- (gnus-article-highlight-signature)))
- (let ((ps-left-header
- (list
- (concat "("
- (gnus-summary-print-truncate-and-quote
- (mail-header-subject gnus-current-headers)
- 66) ")")
- (concat "("
- (gnus-summary-print-truncate-and-quote
- (mail-header-from gnus-current-headers)
- 45) ")")))
- (ps-right-header
- (list
- "/pagenumberstring load"
- (concat "("
- (mail-header-date gnus-current-headers) ")"))))
- (gnus-run-hooks 'gnus-ps-print-hook)
- (save-excursion
- (if window-system
- (ps-spool-buffer-with-faces)
- (ps-spool-buffer)))))
- (kill-buffer buffer))))
+ (gnus-print-buffer))
(gnus-summary-remove-process-mark article))
(ps-despool filename))
+(defun gnus-print-buffer ()
+ (let ((buffer (generate-new-buffer " *print*")))
+ (unwind-protect
+ (progn
+ (copy-to-buffer buffer (point-min) (point-max))
+ (set-buffer buffer)
+ (gnus-article-delete-invisible-text)
+ (when (gnus-visual-p 'article-highlight 'highlight)
+ ;; Copy-to-buffer doesn't copy overlay. So redo
+ ;; highlight.
+ (let ((gnus-article-buffer buffer))
+ (gnus-article-highlight-citation t)
+ (gnus-article-highlight-signature)))
+ (let ((ps-left-header
+ (list
+ (concat "("
+ (gnus-summary-print-truncate-and-quote
+ (mail-header-subject gnus-current-headers)
+ 66) ")")
+ (concat "("
+ (gnus-summary-print-truncate-and-quote
+ (mail-header-from gnus-current-headers)
+ 45) ")")))
+ (ps-right-header
+ (list
+ "/pagenumberstring load"
+ (concat "("
+ (mail-header-date gnus-current-headers) ")"))))
+ (gnus-run-hooks 'gnus-ps-print-hook)
+ (save-excursion
+ (if window-system
+ (ps-spool-buffer-with-faces)
+ (ps-spool-buffer)))))
+ (kill-buffer buffer))))
+
(defun gnus-summary-show-article (&optional arg)
"Force redisplaying of the current article.
If ARG (the prefix) is a number, show the article with the charset
(if hidden
(let ((gnus-treat-hide-headers nil)
(gnus-treat-hide-boring-headers nil))
- (setq gnus-article-wash-types
- (delq 'headers gnus-article-wash-types))
+ (gnus-delete-wash-type 'headers)
(gnus-treat-article 'head))
(gnus-treat-article 'head)))
(gnus-set-mode-line 'article)))))
art-group to-method new-xref article to-groups)
(unless (assq action names)
(error "Unknown action %s" action))
+ ;; We have to select an article to give
+ ;; `gnus-read-move-group-name' an opportunity to suggest an
+ ;; appropriate default.
+ (unless (gnus-buffer-live-p gnus-original-article-buffer)
+ (gnus-summary-select-article nil nil nil (car articles)))
;; Read the newsgroup name.
(when (and (not to-newsgroup)
(not select-method))
(mapcar 'list (gnus-topic-list))
nil t)))
(dolist (topic (gnus-current-topics topic))
+ (gnus-topic-goto-topic topic)
(gnus-topic-fold t))
(gnus-topic-goto-topic topic))
(delete-char 1))
(goto-char (next-single-property-change (point) prop nil (point-max))))))
+(defun gnus-text-with-property (prop)
+ "Return a list of all points where the text has PROP."
+ (let ((points nil)
+ (point (point-min)))
+ (save-excursion
+ (while (< point (point-max))
+ (when (get-text-property point prop)
+ (push point points))
+ (incf point)))
+ (nreverse points)))
+
(require 'nnheader)
(defun gnus-newsgroup-directory-form (newsgroup)
"Make hierarchical directory name from NEWSGROUP name."
(setq beg (point)))
(gnus-put-text-property beg (point) prop val)))))
+(defsubst gnus-put-overlay-excluding-newlines (beg end prop val)
+ "The same as `put-text-property', but don't put this prop on any newlines in the region."
+ (save-match-data
+ (save-excursion
+ (save-restriction
+ (goto-char beg)
+ (while (re-search-forward gnus-emphasize-whitespace-regexp end 'move)
+ (gnus-overlay-put
+ (gnus-make-overlay beg (match-beginning 0))
+ prop val)
+ (setq beg (point)))
+ (gnus-overlay-put (gnus-make-overlay beg (point)) prop val)))))
+
(defun gnus-put-text-property-excluding-characters-with-faces (beg end
prop val)
"The same as `put-text-property', but don't put props on characters with the `gnus-face' property."
(require 'product)
(provide 'gnus-vers)
-(defconst gnus-revision-number "09"
+(defconst gnus-revision-number "10"
"Revision number for this version of gnus.")
;; Product information of this gnus.
(if gnus-carpal '(summary-carpal 4))))
(article
(cond
- ((and gnus-use-picons
- (eq gnus-picons-display-where 'picons))
- '(frame 1.0
- (vertical 1.0
- (summary 0.25 point)
- (if gnus-carpal '(summary-carpal 4))
- (article 1.0))
- (vertical ((height . 5) (width . 15)
- (user-position . t)
- (left . -1) (top . 1))
- (picons 1.0))))
(gnus-use-trees
'(vertical 1.0
(summary 0.25 point)
(mail . gnus-message-buffer)
(post-news . gnus-message-buffer)
(faq . gnus-faq-buffer)
- (picons . gnus-picons-buffer-name)
(tree . gnus-tree-buffer)
(score-trace . "*Score Trace*")
(split-trace . "*Split Trace*")
(draft . gnus-draft-buffer))
"Mapping from short symbols to buffer names or buffer variables.")
+(defcustom gnus-configure-windows-hook nil
+ "*A hook called when configuring windows."
+ :group 'gnus-windowns
+ :type 'hook)
+
;;; Internal variables.
(defvar gnus-current-window-configuration nil
;; This is not a `frame' split, so we ignore the
;; other frames.
(delete-other-windows)
- ;; This is a `frame' split, so we delete all windows
+ ;; This is a `frame' split, so we delete all windows
;; on all frames.
(gnus-delete-windows-in-gnusey-frames))
;; Just remove some windows.
(switch-to-buffer nntp-server-buffer)
(set-buffer nntp-server-buffer))
(gnus-configure-frame split)
+ (run-hooks 'gnus-configure-windows-hook)
(when gnus-window-frame-focus
(select-frame (window-frame gnus-window-frame-focus))))))))
(error "Can't find glyph directory. \
Possibly the `etc' directory has not been installed.")))
-;;(format "%02x%02x%02x" 114 66 20) "724214"
-
-(defvar gnus-xmas-logo-color-alist
- '((flame "#cc3300" "#ff2200")
- (pine "#c0cc93" "#f8ffb8")
- (moss "#a1cc93" "#d2ffb8")
- (irish "#04cc90" "#05ff97")
- (sky "#049acc" "#05deff")
- (tin "#6886cc" "#82b6ff")
- (velvet "#7c68cc" "#8c82ff")
- (grape "#b264cc" "#cf7df")
- (labia "#cc64c2" "#fd7dff")
- (berry "#cc6485" "#ff7db5")
- (dino "#724214" "#1e3f03")
- (neutral "#b4b4b4" "#878787")
- (september "#bf9900" "#ffcc00"))
- "Color alist used for the Gnus logo.")
-
-(defcustom gnus-xmas-logo-color-style 'dino
- "*Color styles used for the Gnus logo."
- :type '(choice (const flame) (const pine) (const moss)
- (const irish) (const sky) (const tin)
- (const velvet) (const grape) (const labia)
- (const berry) (const neutral) (const september)
- (const dino))
- :group 'gnus-xmas)
-
-(defvar gnus-xmas-logo-colors
- (cdr (assq gnus-xmas-logo-color-style gnus-xmas-logo-color-alist))
- "Colors used for the Gnus logo.")
-
;;; Internal variables.
;; Don't warn about these undefined variables.
(defalias 'gnus-put-text-property 'gnus-xmas-put-text-property)
(defalias 'gnus-deactivate-mark 'ignore)
(defalias 'gnus-window-edges 'window-pixel-edges)
-
+
(if (and (<= emacs-major-version 19)
(< emacs-minor-version 14))
(defalias 'gnus-set-text-properties 'gnus-xmas-set-text-properties))
(defalias 'gnus-region-active-p 'region-active-p)
(defalias 'gnus-annotation-in-region-p 'gnus-xmas-annotation-in-region-p)
(defalias 'gnus-mime-button-menu 'gnus-xmas-mime-button-menu)
+ (defalias 'gnus-image-type-available-p 'gnus-xmas-image-type-available-p)
+ (defalias 'gnus-put-image 'gnus-xmas-put-image)
+ (defalias 'gnus-create-image 'gnus-xmas-create-image)
+ (defalias 'gnus-remove-image 'gnus-xmas-remove-image)
;; These ones are not defcutom'ed, sometimes not even defvar'ed. They
;; probably should. If that is done, the code below should then be moved
`[xpm
:file ,logo-xpm
:color-symbols
- (("thing" . ,(car gnus-xmas-logo-colors))
- ("shadow" . ,(cadr gnus-xmas-logo-colors))
+ (("thing" . ,(car gnus-logo-colors))
+ ("shadow" . ,(cadr gnus-logo-colors))
("background" . ,(face-background 'default)))])
((featurep 'xbm)
`[xbm :file ,logo-xbm])
"Face to show X face"
:group 'gnus-xmas)
-(defun gnus-xmas-article-display-xface (beg end &optional buffer)
- "Display any XFace headers in BUFFER."
+(defun gnus-xmas-article-display-xface (data)
+ "Display the XFace in DATA."
(save-excursion
(let ((xface-glyph
(cond
((featurep 'xface)
(make-glyph (vector 'xface :data
- (concat "X-Face: "
- (if buffer
- (with-current-buffer buffer
- (buffer-substring beg end))
- (buffer-substring beg end))))))
+ (concat "X-Face: " data))))
((featurep 'xpm)
- (let ((cur (or buffer (current-buffer))))
+ (let ((cur (current-buffer)))
(save-excursion
(gnus-set-work-buffer)
- (insert-buffer-substring cur beg end)
+ (insert data)
(let ((coding-system-for-read 'binary)
(coding-system-for-write 'binary))
(gnus-xmas-call-region "uncompface")
(make-glyph
(vector 'xpm :data (buffer-string)))))))
(t
- (make-glyph [nothing]))))
- (ext (make-extent (progn
- (goto-char (point-min))
- (re-search-forward "^From:" nil t)
- (point))
- (1+ (point)))))
- (set-glyph-face xface-glyph 'gnus-x-face)
- (set-extent-begin-glyph ext xface-glyph)
- (set-extent-property ext 'duplicable t))))
+ (make-glyph [nothing])))))
+ ;;(set-glyph-face xface-glyph 'gnus-x-face)
+
+ (gnus-article-goto-header "from")
+ (gnus-put-image xface-glyph " ")
+ (gnus-add-wash-type 'xface)
+ (gnus-add-image 'xface xface-glyph))))
(defvar gnus-xmas-modeline-left-extent
(let ((ext (copy-extent modeline-buffer-id-left-extent)))
(gnus-xmas-menu-add mailing-list
gnus-mailing-list-menu))
+(defun gnus-xmas-image-type-available-p (type)
+ (featurep type))
+
+(defun gnus-xmas-create-image (file &optional type data-p &rest props)
+ (let ((type (if type
+ (symbol-name type)
+ (car (last (split-string file "[.]")))))
+ (face (plist-get props :face))
+ glyph)
+ (when (equal type "pbm")
+ (with-temp-buffer
+ (if data-p
+ (insert file)
+ (insert-file-contents file))
+ (shell-command-on-region (point-min) (point-max)
+ "ppmtoxpm 2>/dev/null" t)
+ (setq file (buffer-string)
+ type "xpm"
+ data-p t)))
+ (setq glyph
+ (if (equal type "xbm")
+ (make-glyph (list (cons 'x file)))
+ (with-temp-buffer
+ (if data-p
+ (insert file)
+ (insert-file-contents file))
+ (make-glyph
+ (vector
+ (or (intern type)
+ (mm-image-type-from-buffer))
+ :data (buffer-string))))))
+ (when face
+ (set-glyph-face glyph face))
+ glyph))
+
+(defun gnus-xmas-put-image (glyph &optional string)
+ "Insert STRING, but display GLYPH.
+Warning: Don't insert text immediately after the image."
+ (let ((begin (point))
+ extent)
+ (if string
+ (insert string)
+ (setq begin (1- begin)))
+ (setq extent (make-extent begin (point)))
+ (set-extent-property extent 'gnus-image t)
+ (set-extent-property extent 'duplicable t)
+ (if string
+ (set-extent-property extent 'invisible t))
+ (set-extent-property extent 'end-glyph glyph))
+ glyph)
+
+(defun gnus-xmas-remove-image (image)
+ (map-extents
+ (lambda (ext unused)
+ (when (equal (extent-end-glyph ext) image)
+ (set-extent-property ext 'invisible nil)
+ (set-extent-property ext 'end-glyph nil))
+ nil)
+ nil nil nil nil nil 'gnus-image))
+
(provide 'gnus-xmas)
;;; gnus-xmas.el ends here
;;; gnus.el --- a newsreader for GNU Emacs
-;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996, 2001,
-;; 1997, 1998, 2000, 2001 Free Software Foundation, Inc.
+;; Copyright (C) 1987, 1988, 1989, 1990, 1993, 1994, 1995, 1996,
+;; 1997, 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
;; Author: Masanobu UMEDA <umerin@flab.flab.fujitsu.junet>
;; Lars Magne Ingebrigtsen <larsi@gnus.org>
(defface gnus-splash-face
'((((class color)
(background dark))
- (:foreground "Brown"))
+ (:foreground "#888888"))
(((class color)
(background light))
- (:foreground "Brown"))
+ (:foreground "#888888"))
(t
()))
"Face for the splash screen.")
(defvar gnus-simple-splash nil)
+;;(format "%02x%02x%02x" 114 66 20) "724214"
+
+(defvar gnus-logo-color-alist
+ '((flame "#cc3300" "#ff2200")
+ (pine "#c0cc93" "#f8ffb8")
+ (moss "#a1cc93" "#d2ffb8")
+ (irish "#04cc90" "#05ff97")
+ (sky "#049acc" "#05deff")
+ (tin "#6886cc" "#82b6ff")
+ (velvet "#7c68cc" "#8c82ff")
+ (grape "#b264cc" "#cf7df")
+ (labia "#cc64c2" "#fd7dff")
+ (berry "#cc6485" "#ff7db5")
+ (dino "#724214" "#1e3f03")
+ (oort "#cccccc" "#888888")
+ (neutral "#b4b4b4" "#878787")
+ (september "#bf9900" "#ffcc00"))
+ "Color alist used for the Gnus logo.")
+
+(defcustom gnus-logo-color-style 'oort
+ "*Color styles used for the Gnus logo."
+ :type '(choice (const flame) (const pine) (const moss)
+ (const irish) (const sky) (const tin)
+ (const velvet) (const grape) (const labia)
+ (const berry) (const neutral) (const september)
+ (const dino))
+ :group 'gnus-xmas)
+
+(defvar gnus-logo-colors
+ (cdr (assq gnus-logo-color-style gnus-logo-color-alist))
+ "Colors used for the Gnus logo.")
+
(defun gnus-group-startup-message (&optional x y)
"Insert startup message in current buffer."
;; Insert the message.
(fg (face-foreground 'gnus-splash-face))
(image (find-image
`((:type xpm :file "gnus.xpm"
- :color-symbols (("thing" . "#724214")
- ("shadow" . "#1e3f03")
- ("background" . ,bg)))
+ :color-symbols
+ (("thing" . ,(car gnus-logo-colors))
+ ("shadow" . ,(cadr gnus-logo-colors))
+ ("background" . ,bg)))
(:type pbm :file "gnus.pbm"
;; Account for the pbm's blackground.
:background ,bg :foreground ,fg)
:group 'gnus-meta
:type 'boolean)
-(defcustom gnus-use-picons nil
- "*If non-nil, display picons in a frame of their own."
- :group 'gnus-meta
- :type 'boolean)
-
(defcustom gnus-summary-prepare-exit-hook
'(gnus-summary-expire-articles)
"*A hook called when preparing to exit from the summary buffer.
gnus-summary-followup-to-mail-with-original gnus-bug
gnus-summary-wide-reply-with-original gnus-summary-post-forward
gnus-summary-digest-mail-forward gnus-summary-digest-post-forward)
- ("gnus-picon" :interactive t gnus-article-display-picons
- gnus-group-display-picons)
- ("gnus-picon" gnus-picons-buffer-name)
+ ("gnus-picon" :interactive t gnus-treat-from-picon)
("gnus-gl" bbb-login bbb-logout bbb-grouplens-group-p
gnus-grouplens-mode)
("smiley" :interactive t gnus-smiley-display)
gnus-unplugged gnus-agentize gnus-agent-batch)
("gnus-vm" :interactive t gnus-summary-save-in-vm
gnus-summary-save-article-vm)
- ("gnus-draft" :interactive t gnus-draft-mode gnus-group-send-drafts)
+ ("gnus-draft" :interactive t gnus-draft-mode gnus-group-send-queue)
("gnus-mlspl" gnus-group-split gnus-group-split-fancy)
("gnus-mlspl" :interactive t gnus-group-split-setup
gnus-group-split-update))))
startup level. If ARG is non-nil and not a positive number, Gnus will
prompt the user for the name of an NNTP server to use."
(interactive "P")
+ (unless (byte-code-function-p (symbol-function 'gnus))
+ (message "You should byte-compile Gnus")
+ (sit-for 2))
(gnus-1 arg dont-connect slave))
;; Allow redefinition of Gnus functions.
;;; ietf-drums.el --- Functions for parsing RFC822bis headers
-;; Copyright (C) 1998, 1999, 2000
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002
;; Free Software Foundation, Inc.
;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
(defun ietf-drums-parse-addresses (string)
"Parse STRING and return a list of MAILBOX / DISPLAY-NAME pairs."
- (with-temp-buffer
- (ietf-drums-init string)
- (let ((beg (point))
- pairs c)
- (while (not (eobp))
- (setq c (char-after))
- (cond
- ((memq c '(?\" ?< ?\())
- (forward-sexp 1))
- ((eq c ?,)
- (push (ietf-drums-parse-address (buffer-substring beg (point)))
- pairs)
- (forward-char 1)
- (setq beg (point)))
- (t
- (forward-char 1))))
- (push (ietf-drums-parse-address (buffer-substring beg (point)))
- pairs)
- (nreverse pairs))))
+ (if (null string)
+ nil
+ (with-temp-buffer
+ (ietf-drums-init string)
+ (let ((beg (point))
+ pairs c address)
+ (while (not (eobp))
+ (setq c (char-after))
+ (cond
+ ((memq c '(?\" ?< ?\())
+ (condition-case nil
+ (forward-sexp 1)
+ (error
+ (skip-chars-forward "^,"))))
+ ((eq c ?,)
+ (setq address
+ (condition-case nil
+ (ietf-drums-parse-address
+ (buffer-substring beg (point)))
+ (error nil)))
+ (if address (push address pairs))
+ (forward-char 1)
+ (setq beg (point)))
+ (t
+ (forward-char 1))))
+ (setq address
+ (condition-case nil
+ (ietf-drums-parse-address
+ (buffer-substring beg (point)))
+ (error nil)))
+ (if address (push address pairs))
+ (nreverse pairs)))))
(defun ietf-drums-unfold-fws ()
"Unfold folding white space in the current buffer."
(defun imap-parse-fetch (response)
(when (eq (char-after) ?\()
(let (uid flags envelope internaldate rfc822 rfc822header rfc822text
- rfc822size body bodydetail bodystructure)
+ rfc822size body bodydetail bodystructure flags-empty)
(while (not (eq (char-after) ?\)))
(imap-forward)
(let ((token (read (current-buffer))))
(cond ((eq token 'UID)
(setq uid (ignore-errors (read (current-buffer)))))
((eq token 'FLAGS)
- (setq flags (imap-parse-flag-list)))
+ (setq flags (imap-parse-flag-list))
+ (if (not flags)
+ (setq flags-empty 't)))
((eq token 'ENVELOPE)
(setq envelope (imap-parse-envelope)))
((eq token 'INTERNALDATE)
(when uid
(setq imap-current-message uid)
(imap-message-put uid 'UID uid)
- (and flags (imap-message-put uid 'FLAGS flags))
+ (and (or flags flags-empty) (imap-message-put uid 'FLAGS flags))
(and envelope (imap-message-put uid 'ENVELOPE envelope))
(and internaldate (imap-message-put uid 'INTERNALDATE internaldate))
(and rfc822 (imap-message-put uid 'RFC822 rfc822))
url-retrieve w3-form-encode-xwfu window-at
window-edges x-color-values x-popup-menu browse-url
frame-char-height frame-char-width
- xml-parse-region))
+ url-generic-parse-url xml-parse-region))
(maybe-bind '(buffer-display-table
buffer-file-coding-system font-lock-defaults
global-face-data gnus-article-x-face-too-ugly
(defalias 'mail-narrow-to-head 'ietf-drums-narrow-to-header)
(defalias 'mail-quote-string 'ietf-drums-quote-string)
+(defalias 'mail-header-fold-field 'rfc2047-fold-field)
+(defalias 'mail-header-unfold-field 'rfc2047-unfold-field)
(defalias 'mail-header-narrow-to-field 'rfc2047-narrow-to-field)
+(defalias 'mail-header-field-value 'rfc2047-field-value)
+
(defalias 'mail-encode-encoded-word-region 'rfc2047-encode-region)
(defalias 'mail-encode-encoded-word-buffer 'rfc2047-encode-message-header)
(defalias 'mail-encode-encoded-word-string 'rfc2047-encode-string)
(setq success (funcall (caddr elem) arg)))
(setq sent t)))))
(unless
- (or sent (not success)
+ (or sent
+ (not success)
(let ((fcc (message-fetch-field "Fcc"))
(gcc (message-fetch-field "Gcc")))
(when (or fcc gcc)
(or (mm-image-type-from-buffer)
(intern type))
'data-p)
- (cond
- ((equal type "xbm")
- ;; xbm images require special handling, since
- ;; the only way to create glyphs from these
- ;; (without a ton of work) is to write them
- ;; out to a file, and then create a file
- ;; specifier.
- (let ((file (make-temp-name
- (expand-file-name "emm.xbm"
- mm-tmp-directory))))
- (unwind-protect
- (progn
- (write-region (point-min) (point-max) file)
- (make-glyph (list (cons 'x file))))
- (ignore-errors
- (delete-file file)))))
- (t
- (make-glyph
- (vector
- (or (mm-image-type-from-buffer)
- (intern type))
- :data (buffer-string))))))))
+ (mm-create-image-xemacs type))))
(mm-handle-set-cache handle spec))))))
+(defun mm-create-image-xemacs (type)
+ (cond
+ ((equal type "xbm")
+ ;; xbm images require special handling, since
+ ;; the only way to create glyphs from these
+ ;; (without a ton of work) is to write them
+ ;; out to a file, and then create a file
+ ;; specifier.
+ (let ((file (make-temp-name
+ (expand-file-name "emm.xbm"
+ mm-tmp-directory))))
+ (unwind-protect
+ (progn
+ (write-region (point-min) (point-max) file)
+ (make-glyph (list (cons 'x file))))
+ (ignore-errors
+ (delete-file file)))))
+ (t
+ (make-glyph
+ (vector
+ (or (mm-image-type-from-buffer)
+ (intern type))
+ :data (buffer-string))))))
+
(defun mm-image-fit-p (handle)
"Say whether the image in HANDLE will fit the current window."
(let ((image (mm-get-image handle)))
;;;
;;; Functions for displaying various formats inline
;;;
+
(defun mm-inline-image-emacs (handle)
(let ((b (point-marker))
buffer-read-only)
(setq text (mm-get-part handle))
(let ((b (point))
(url-standalone-mode t)
+ (w3-honor-stylesheets nil)
+ (w3-delay-image-loads t)
(url-current-object
(url-generic-parse-url (format "cid:%s" (mm-handle-id handle))))
(width (window-width))
;; Don't let w3 set the global version of
;; this variable.
(fill-column fill-column)
+ (w3-honor-stylesheets nil)
+ (w3-delay-image-loads t)
(url-standalone-mode t))
(condition-case var
(w3-region (point-min) (point-max))
(defun mm-w3-prepare-buffer ()
(require 'w3)
- (let ((url-standalone-mode t))
+ (let ((url-standalone-mode t)
+ (w3-honor-stylesheets nil)
+ (w3-delay-image-loads t))
(w3-prepare-buffer)))
(defun mm-view-message ()
"Various mail options."
:group 'nnmail)
-(defcustom nnmail-split-methods
- '(("mail.misc" ""))
+(defcustom nnmail-split-methods '(("mail.misc" ""))
"*Incoming mail will be split according to this variable.
If you'd like, for instance, one mail group for mail from the
(defun nnmail-article-group (func &optional trace)
"Look at the headers and return an alist of groups that match.
FUNC will be called with the group name to determine the article number."
- (let ((methods nnmail-split-methods)
+ (let ((methods (or nnmail-split-methods '(("bogus" ""))))
(obuf (current-buffer))
(beg (point-min))
end group-art method grp)
(error
(nnheader-message 1 "Error in group %s: %s" group (cadr err))))
(while (and xml (not (assq 'item xml)))
- (unless (listp (car (setq xml (cddar xml))))
- (setq xml nil)))
+ (setq xml (cddar xml))
+ (while (not (listp (car xml)))
+ (setq xml (cdr xml))))
(dolist (item (nreverse xml))
(when (and (listp item)
(eq 'item (car item))
(point-max))))
(goto-char (point-min)))
+(defun rfc2047-field-value ()
+ "Return the value of the field at point."
+ (save-excursion
+ (save-restriction
+ (rfc2047-narrow-to-field)
+ (re-search-forward ":[ \t\n]*" nil t)
+ (buffer-substring (point) (point-max)))))
+
(defun rfc2047-encode-message-header ()
"Encode the message header according to `rfc2047-header-encoding-alist'.
Should be called narrowed to the head of the message."
;; Is message-posting-charset a coding system?
(mm-encode-coding-region
(point-min) (point-max)
- (car message-posting-charset)))
+ (car message-posting-charset))
+ nil)
;; No encoding necessary, but folding is nice
- (rfc2047-fold-region (save-excursion
- (goto-char (point-min))
- (skip-chars-forward "^:")
- (and (looking-at ": ")
- (forward-char 2))
- (point)) (point-max)))
+ (rfc2047-fold-region
+ (save-excursion
+ (goto-char (point-min))
+ (skip-chars-forward "^:")
+ (when (looking-at ": ")
+ (forward-char 2))
+ (point))
+ (point-max)))
;; We found something that may perhaps be encoded.
(setq method nil
alist rfc2047-header-encoding-alist)
(insert "?=")
(forward-line 1)))))
+(defun rfc2047-fold-field ()
+ "Fold the current line."
+ (save-excursion
+ (save-restriction
+ (rfc2047-narrow-to-field)
+ (rfc2047-fold-region (point-min) (point-max)))))
+
(defun rfc2047-fold-region (b e)
"Fold long lines in region B to E."
(save-restriction
(goto-char (point-min))
(let ((break nil)
(qword-break nil)
+ (first t)
(bol (save-restriction
(widen)
(gnus-point-at-bol))))
(while (not (eobp))
- (when (and (or break qword-break) (> (- (point) bol) 76))
+ (when (and (or break qword-break)
+ (> (- (point) bol) 76))
(goto-char (or break qword-break))
(setq break nil
qword-break nil)
(setq bol (1- (point)))
;; Don't break before the first non-LWSP characters.
(skip-chars-forward " \t")
- (unless (eobp) (forward-char 1)))
+ (unless (eobp)
+ (forward-char 1)))
(cond
((eq (char-after) ?\n)
(forward-char 1)
(forward-char 1))
((memq (char-after) '(? ?\t))
(skip-chars-forward " \t")
- (setq break (1- (point))))
+ (if first
+ ;; Don't break just after the header name.
+ (setq first nil)
+ (setq break (1- (point)))))
((not break)
(if (not (looking-at "=\\?[^=]"))
(if (eq (char-after) ?=)
(skip-chars-forward "^ \t\n\r")))
(t
(skip-chars-forward "^ \t\n\r"))))
- (when (and (or break qword-break) (> (- (point) bol) 76))
+ (when (and (or break qword-break)
+ (> (- (point) bol) 76))
(goto-char (or break qword-break))
(setq break nil
qword-break nil)
(setq bol (1- (point)))
;; Don't break before the first non-LWSP characters.
(skip-chars-forward " \t")
- (unless (eobp) (forward-char 1))))))
+ (unless (eobp)
+ (forward-char 1))))))
+
+(defun rfc2047-unfold-field ()
+ "Fold the current line."
+ (save-excursion
+ (save-restriction
+ (rfc2047-narrow-to-field)
+ (rfc2047-unfold-region (point-min) (point-max)))))
(defun rfc2047-unfold-region (b e)
"Unfold lines in region B to E."
(require 'hex-util)
+(autoload 'executable-find "executable")
+
;;;
;;; external SHA1 function.
;;;
"*Name of program to compute SHA1.
It must be a string \(program name\) or list of strings \(name and its args\).")
+(defvar sha1-use-external
+ (exec-installed-p (car sha1-program))
+ "*Use external sha1 program.
+If this variable is set to nil, use internal function only.")
+
(defun sha1-string-external (string)
;; `with-temp-buffer' is new in v20, so we do not use it.
(save-excursion
;;;
(defun sha1-region (beg end)
- (if (and sha1-maximum-internal-length
+ (if (and sha1-use-external
+ sha1-maximum-internal-length
(> (abs (- end beg)) sha1-maximum-internal-length))
(sha1-region-external beg end)
(sha1-region-internal beg end)))
(defun sha1-string (string)
- (if (and sha1-maximum-internal-length
+ (if (and sha1-use-external
+ sha1-maximum-internal-length
(> (length string) sha1-maximum-internal-length))
(sha1-string-external string)
(sha1-string-internal string)))
;; The XEmacs version has a baroque, if not rococo, set of these.
(defcustom smiley-regexp-alist
- '(("\\(:-?)\\)\\W" 1 "smile.pbm")
- ("\\(;-?)\\)\\W" 1 "blink.pbm")
- ("\\(:-[/\\]\\)\\W" 1 "wry.pbm")
- ("\\(:-(\\)\\W" 1 "sad.pbm")
- ("\\(:-{\\)\\W" 1 "frown.pbm"))
+ '(("\\(:-?)\\)\\W" 1 "smile")
+ ("\\(;-?)\\)\\W" 1 "blink")
+ ("\\(:-]\\)\\W" 1 "forced")
+ ("\\(8-)\\)\\W" 1 "braindamaged")
+ ("\\(:-|\\)\\W" 1 "indifferent")
+ ("\\(:-[/\\]\\)\\W" 1 "wry")
+ ("\\(:-(\\)\\W" 1 "sad")
+ ("\\(:-{\\)\\W" 1 "frown"))
"*A list of regexps to map smilies to images.
The elements are (REGEXP MATCH FILE), where MATCH is the submatch in
regexp to replace with IMAGE. IMAGE is the name of a PBM file in
:initialize 'custom-initialize-default
:group 'smiley)
+(defcustom gnus-smiley-file-types
+ (let ((types (list "pbm")))
+ (when (gnus-image-type-available-p 'xpm)
+ (push "xpm" types))
+ types)
+ "*List of suffixes on picon file names to try."
+ :type '(repeat string)
+ :group 'smiley)
+
(defvar smiley-cached-regexp-alist nil)
(defun smiley-update-cache ()
(dolist (elt (if (symbolp smiley-regexp-alist)
(symbol-value smiley-regexp-alist)
smiley-regexp-alist))
- (let* ((data-directory smiley-data-directory)
- (image (find-image (list (list :type
- (image-type-from-file-header
- (nth 2 elt))
- :file (nth 2 elt)
- :ascent 'center)))))
- (if image
- (push (list (car elt) (cadr elt) image)
- smiley-cached-regexp-alist)))))
+ (let ((types gnus-smiley-file-types)
+ file type)
+ (while (and (not file)
+ (setq type (pop types)))
+ (unless (file-exists-p
+ (setq file (expand-file-name (concat (nth 2 elt) "." type)
+ smiley-data-directory)))
+ (setq file nil)))
+ (when type
+ (let ((image (find-image (list (list :type (intern type)
+ :file file
+ :ascent 'center)))))
+ (when image
+ (push (list (car elt) (cadr elt) image)
+ smiley-cached-regexp-alist)))))))
(defvar smiley-active nil
"Non-nil means smilies in the buffer will be displayed.")
map))
(defun smiley-region (start end)
- "Replace in the region `smiley-regexp-alist' matches with corresponding images."
+ "Replace in the region `smiley-regexp-alist' matches with corresponding images.
+A list of images is returned."
(interactive "r")
(when (and (fboundp 'display-graphic-p)
(display-graphic-p))
(overlays-in start end))
(unless smiley-cached-regexp-alist
(smiley-update-cache))
+ (setq smiley-active t)
(save-excursion
(let ((beg (or start (point-min)))
- group overlay image)
+ group overlay image images)
(dolist (entry smiley-cached-regexp-alist)
(setq group (nth 1 entry)
image (nth 2 entry))
(goto-char beg)
(while (re-search-forward (car entry) end t)
(when image
- (setq overlay (make-overlay (match-beginning group)
- (match-end group)))
- (overlay-put overlay
- 'display `(when smiley-active ,@image))
- (overlay-put overlay 'mouse-face 'highlight)
- (overlay-put overlay 'smiley t)
- (overlay-put overlay
- 'help-echo "mouse-2: toggle smilies in buffer")
- (overlay-put overlay 'keymap smiley-mouse-map))))))
- (setq smiley-active t)))
+ (push image images)
+ (add-text-properties
+ (match-beginning group) (match-end group)
+ `(display ,image
+ mouse-face highlight
+ smiley t
+ help-echo "mouse-2: toggle smilies in buffer"
+ keymap smiley-mouse-map)))))
+ images))))
(defun smiley-toggle-buffer (&optional arg)
"Toggle displaying smiley faces.
"Display textual emoticaons (\"smilies\") as small graphical icons.
With arg, turn displaying on if and only if arg is positive."
(interactive "P")
- (save-excursion
- (article-goto-body)
- (smiley-region (point) (point-max))
- (if (and (numberp arg) (<= arg 0))
- (smiley-toggle-buffer arg))))
+ (gnus-with-article-buffer
+ (if (memq 'smiley gnus-article-wash-types)
+ (gnus-delete-images 'smiley)
+ (article-goto-body)
+ (let ((images (smiley-region (point) (point-max))))
+ (when images
+ (gnus-add-wash-type 'smiley)
+ (dolist (image images)
+ (gnus-add-image 'smiley image))))
+ (when (and (numberp arg)
+ (<= arg 0))
+ (smiley-toggle-buffer arg)))))
(provide 'smiley)
+2002-01-01 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Choosing Commands): Addition.
+
+2001-12-31 Rui Zhu <sprache@iname.com>
+
+ * emacs-mime.texi (Customization): Typo fix.
+
+2001-12-31 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (Article Display): Addition.
+
+ * emacs-mime.texi (Interface Functions): Addition.
+
+ * gnus.texi (Using MIME): Addition.
+
+2001-12-30 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * gnus.texi (X-Face): Made into own node.
+ (Article Display): New.
+
+ * emacs-mime.texi (Interface Functions): Addition.
+
+ * message.texi (Message Headers): Addition.
+
+2001-12-29 Lars Magne Ingebrigtsen <larsi@gnus.org>
+
+ * emacs-mime.texi (Customization): Added example.
+
+ * gnus.texi (Selecting a Group): Addition.
+ (Tree Display): Addition.
+
2001-12-26 Florian Weimer <fw@deneb.enyo.de>
* gnus.texi (Using GPG): Remove obsolete reference to gpg-2comp.
@item mail-header-narrow-to-field
@findex mail-header-narrow-to-field
-Narrow the buffer to the header under point.
+Narrow the buffer to the header under point. Understands continuation
+headers.
+
+@item mail-header-fold-field
+@findex mail-header-fold-field
+Fold the header under point.
+
+@item mail-header-unfold-field
+@findex mail-header-unfold-field
+Unfold the header under point.
+
+@item mail-header-field-value
+@findex mail-header-field-value
+Return the value of the field under point.
@item mail-encode-encoded-word-region
@findex mail-encode-encoded-word-region
However, users may prefer other types instead, and this list says what
types are most unwanted. If, for instance, @samp{text/html} parts are
very unwanted, and @samp{text/richtech} parts are somewhat unwanted,
-then the value of this variable should be set to:
+you could say something like:
@lisp
-("text/html" "text/richtext")
+(setq mm-discouraged-alternatives
+ '("text/html" "text/richtext")
+ mm-automatic-display
+ (remove "text/html" mm-automatic-display))
@end lisp
@item mm-inline-large-images-p
makes the library display all inline images as inline, regardless of
their size.
-@item mm-inline-override-p
+@item mm-inline-override-type
@code{mm-inlined-types} may include regular expressions, for example to
specify that all @samp{text/.*} parts be displayed inline. If a user
prefers to have a type that matches such a regular expression be treated
* NoCeM:: Spam \e$B$dB>$NB@$j$d$9$$?);v$rHr$1$kJ}K!\e(B
* Undo:: \e$B$$$/$D$+$NF0:n$O85$KLa$9;v$,$G$-$k\e(B
* Moderation:: \e$B$"$J$?$,%b%G%l!<%?!<$@$C$?$i$I$&$9$k$+\e(B
-* XEmacs Enhancements:: XEmacs \e$B$G$O$b$C$H3($d$=$NB>$N$b$N$,B8:_\e(B
- \e$B$9$k\e(B
+* Image Enhancements:: \e$B:G?7$N\e(B Emacs/XEmacs \e$B$O3($rI=<($G$-$k\e(B
* Fuzzy Matching:: \e$BBg$-$JLJLS$C$F2?\e(B?
* Thwarting Email Spam:: \e$BM>7W$J>&6HE*EE;R%a!<%k$rHr$1$kJ}K!\e(B
* Various Various:: \e$BK\Ev$K$$$m$$$m$J$b$N\e(B
@vindex gnus-select-group-hook
@vindex gnus-auto-select-first
-@code{gnus-auto-select-first} \e$B$O!"\e(B@kbd{SPACE} \e$B%3%^%s%I$G%0%k!<%W$KF~$C$?\e(B
-\e$B$H$-$K!"<+F0E*$K5-;v$rA*Br$9$k$+$I$&$+$r@)8f$7$^$9!#\e(B
+\e$B$b$7\e(B @code{gnus-auto-select-first} \e$B$,Hs\e(B-@code{nil} \e$B$@$C$?$i!"\e(B
+@kbd{SPACE} \e$B%3%^%s%I$G%0%k!<%W$KF~$C$?$H$-$K<+F0E*$K5-;v$rA*Br$7$^$9!#$I\e(B
+\e$B$N5-;v$,A*Br$5$l$k$+$O!"JQ?t\e(B @code{gnus-auto-select-subject} \e$B$G@)8f$5$l\e(B
+\e$B$^$9!#$3$NJQ?t$K@_Dj$G$-$kM-8z$JCM$O\e(B:
@table @code
-@item nil
-\e$B%0%k!<%W$KF~$C$?$H$-$K$I$N5-;v$bA*Br$7$J$$!#$?$@35N,%P%C%U%!$rI=<($9$k$@\e(B
-\e$B$1!#\e(B
+@item unread
+\e$B:G=i$NL$FI5-;v$NI=Bj$N9T$K%]%$%s%H$r0\F0$5$;$^$9!#\e(B
-@item t
-\e$B%0%k!<%W$KF~$C$?$H$-$K!":G=i$NL$FI5-;v$rA*Br$9$k!#\e(B
+@item first
+\e$B:G=i$N5-;v$NI=Bj$N9T$K%]%$%s%H$r0\F0$5$;$^$9!#\e(B
+
+@item unseen
+\e$B$^$@FI$^$l$?$3$H$,L5$$:G=i$N5-;v$NI=Bj$N9T$K%]%$%s%H$r0\F0$5$;$^$9!#\e(B
@item best
-\e$B%0%k!<%W$KF~$C$?$H$-$K!"$=$N%0%k!<%W$G:G$b9b$$%9%3%"$N5-;v$rA*Br$9$k!#\e(B
+\e$B%9%3%"$,:G$b9b$$L$FI5-;v$NI=Bj$N9T$K%]%$%s%H$r0\F0$5$;$^$9!#\e(B
@end table
-\e$B$3$NJQ?t$O4X?t$G$"$k$3$H$b$G$-$^$9!#$=$N>l9g$O!"$=$N4X?t$OI=Bj$N9T$K%]%$\e(B
-\e$B%s%H$r0\F0$5$;$k$+!"$$$/$D$+$N5-;v$rA*Br$9$k$+$NN>J}$+!"8e<T$r$9$k$?$a$K\e(B
-\e$B8F$P$l$^$9!#JXMx$J4X?t$O\e(B:
-
-@table @code
-@item gnus-summary-first-unread-subject
-\e$B:G=i$NL$FI5-;v$NI=Bj9T$K%]%$%s%H$rCV$-$^$9$,!"5-;v$rA*Br$7$^$;$s!#\e(B
-
-@item gnus-summary-first-unread-article
-\e$B:G=i$NL$FI5-;v$rA*Br$7$^$9!#\e(B
-
-@item gnus-summary-best-unraed-article
-\e$B:G9b%9%3%"$NL$FI5-;v$rA*Br$7$^$9!#\e(B
-@end table
+\e$B$3$NJQ?t$O4X?t$G$"$k$3$H$b$G$-$^$9!#$=$N>l9g!"$=$N4X?t$OI=Bj$N9T$K%]%$%s\e(B
+\e$B%H$r0\F0$5$;$k$?$a$K8F$P$l$^$9!#\e(B
\e$B$b$7$"$k%0%k!<%W$G<+F05-;vA*Br$r$d$a$?$$$N$G$"$l$P\e(B (\e$BNc$($P$G$C$+$$5-;v$N\e(B
-\e$B$"$k%P%$%J%j%0%k!<%W$G$O!"$H$+\e(B)\e$B!"%0%k!<%W$,A*Br$5$l$?$H$-$K8F$S=P$5$l$k\e(B
-@code{gnus-select-group-hook} \e$B$NCf$G$3$NJQ?t$r\e(B @code{nil} \e$B$K@_Dj$9$k$3$H\e(B
-\e$B$,$G$-$^$9!#\e(B
+\e$B$"$k%P%$%J%j%0%k!<%W$G$O!"$H$+\e(B)\e$B!"%0%k!<%W$,A*Br$5$l$?$H$-$K8F$S=P$5$l\e(B
+\e$B$k\e(B @code{gnus-select-group-hook} \e$B$NCf$GJQ\e(B
+\e$B?t\e(B @code{gnus-auto-select-first} \e$B$r\e(B @code{nil} \e$B$K@_Dj$9$k$3$H$,$G$-$^$9!#\e(B
@node Subscription Commands
@section \e$B9XFI@)8f%3%^%s%I\e(B
@kindex G b (\e$B35N,\e(B)
@kindex , (\e$B35N,\e(B)
@findex gnus-summary-best-unread-article
-\e$B:G9b%9%3%"$N5-;v$K0\F0$7$^$9\e(B (@code{gnus-summary-best-unread-article})\e$B!#\e(B
+\e$B:G9b%9%3%"$NL$FI5-;v$K0\F0$7$^\e(B
+\e$B$9\e(B (@code{gnus-summary-best-unread-article})\e$B!#$b$7@\F,0z?t$,M?$($i$l$?$J\e(B
+\e$B$i$P!"%G%#%U%)%k%H$N%9%3%"$h$jBg$-$$%9%3%"$r;}$D:G=i$NL$FI5-;v$K0\F0$7$^\e(B
+\e$B$9!#\e(B
@item G l
@itemx l
\e$B$"$J$?$,?7Ce%K%e!<%9$r<hF@$7$h$&$H$9$k$H$-$O$$$D$b!"\e(Bgnus \e$B$OAw?.$9$k4|8B\e(B
\e$B$KC#$7$?5-;v$r$=$N%0%k!<%W$GC5$7$F!"$=$l$i$rAw?.$7$^$9!#$3$l$K$O4X\e(B
-\e$B?t\e(B @code{gnus-delay-send-drafts} \e$B$,;H$o$l$^$9!#%G%#%U%)%k%H$G$O$3$N4X?t\e(B
+\e$B?t\e(B @code{gnus-delay-send-queue} \e$B$,;H$o$l$^$9!#%G%#%U%)%k%H$G$O$3$N4X?t\e(B
\e$B$O\e(B @code{gnus-get-new-news-hook} \e$B$KDI2C$5$l$^$9$,!"$b$A$m$s$"$J$?$O$3$l\e(B
\e$B$rJQ99$9$k$3$H$,$G$-$^$9!#$*$=$i$/$"$J$?$O!"%I%i%U%H$NAw?.$K%G!<%b%s$r;H\e(B
\e$B$$$?$$$H;W$&$N$G$O$J$$$G$7$g$&$+\e(B? \e$B$=$l$K$O!"%G!<%b%s$K4X\e(B
-\e$B?t\e(B @code{gnus-delay-send-drafts} \e$B$r<B9T$;$h!"$H8@$&$@$1$GNI$$$N$G$9!#\e(B
+\e$B?t\e(B @code{gnus-delay-send-queue} \e$B$r<B9T$;$h!"$H8@$&$@$1$GNI$$$N$G$9!#\e(B
@table @code
@item gnus-delay-initialize
@findex gnus-delay-initialize
\e$B%G%#%U%)%k%H$G$O!"$3$N4X?t$O\e(B Message \e$B%b!<%I$K$*$1$k\e(B @kbd{C-c C-j} \e$B%-!<$N\e(B
\e$B%P%$%s%I$H!"\e(B
-@code{gnus-delay-send-drafts} \e$B$N\e(B @code{gnus-get-new-news-hook} \e$B$X$NDI2C\e(B
-\e$B$r9T$J$$$^$9!#$G$9$,!"$3$l$O\e(B @code{no-keymap} \e$B$H\e(B @code{no-check} \e$B$NFs$D\e(B
-\e$B$N%*%W%7%g%s0z?t$r<u$1IU$1$^$9!#$b$7\e(B @code{no-keymap} \e$B$,Hs\e(Bnil \e$B$@$C$?\e(B
+@code{gnus-delay-send-queue} \e$B$N\e(B @code{gnus-get-new-news-hook} \e$B$X$NDI2C$r\e(B
+\e$B9T$J$$$^$9!#$G$9$,!"$3$l$O\e(B @code{no-keymap} \e$B$H\e(B @code{no-check} \e$B$NFs$D$N\e(B
+\e$B%*%W%7%g%s0z?t$r<u$1IU$1$^$9!#$b$7\e(B @code{no-keymap} \e$B$,Hs\e(Bnil \e$B$@$C$?\e(B
\e$B$i\e(B @kbd{C-c C-j} \e$B%-!<$N%P%$%s%I$r9T$J$$$^$;$s!#$b$7\e(B @code{no-check} \e$B$,Hs\e(B
-nill \e$B$@$C$?$i\e(B @code{gnus-get-new-news-hook} \e$B$OJQ99$5$l$^$;$s!#\e(B
+nil \e$B$@$C$?$i\e(B @code{gnus-get-new-news-hook} \e$B$OJQ99$5$l$^$;$s!#\e(B
\e$BNc$($P\e(B @code{(gnus-delay-initialize nil t)} \e$B$O!"%-!<%^%C%W$OJQ99$9$k\e(B
\e$B$,\e(B @code{gnus-get-new-news-hook} \e$B$OJQ99$7$J$$$3$H$r0UL#$7$^$9!#$"$J$?$O\e(B
* Article Buttons:: URL \e$B$d\e(B Message-ID \e$B$d\e(B \e$B%"%I%l%9$J$I$r%/%j%C\e(B
\e$B%/$9$k\e(B
* Article Date:: \e$B$0$:$0$:8@$&$J!"@$3&;~$@\e(B!
+* Article Display:: X-Face, Picons, Smileys \e$B$rI=<($9$k\e(B
* Article Signature:: \e$B=pL>$C$F2?\e(B?
* Article Miscellania:: \e$BB>$N$$$m$$$m$J$b$N\e(B
@end menu
@c has been done.
@c If a prefix is given, a charset will be asked for.
-@item W f
-@kindex W f (\e$B35N,\e(B)
-@cindex x-face
-@findex gnus-article-display-x-face
-@findex gnus-article-x-face-command
-@vindex gnus-article-x-face-command
-@vindex gnus-article-x-face-too-ugly
-@iftex
-@iflatex
-\include{xface}
-@end iflatex
-@end iftex
-@c @anchor{X-Face}
-\e$B$9$Y$F$N\e(B X-Face \e$BMs$rC5$7$FI=<($7$^$9\e(B(@code{gnus-article-display-x-face})\e$B!#\e(B
-\e$B$3$NL?Na$OJQ?t\e(B @code{gnus-article-x-face-command} \e$B$K$h$C$FM?$($i$l$?4X?t\e(B
-\e$B$K$h$C$F<B9T$5$l$^$9!#$3$NJQ?t$,J8;zNs$J$i$P!"$3$NJ8;zNs$,%5%V%7%'%k$G<B\e(B
-\e$B9T$5$l$^$9!#4X?t$J$i$P!"$3$N4X?t$,4i$r0z?t$H$7$F8F$P$l$^$9!#$b\e(B
-\e$B$7\e(B @code{gnus-article-x-face-too-ugly} (\e$B$3$l$O@55,I=8=$G\e(B
-\e$B$9\e(B) \e$B$,\e(B @code{From} \e$BMs$K9gCW$9$l$P!"4i$OI=<($5$l$^$;$s!#\e(BEmacs \e$B$G$N%G%#%U%)\e(B
-\e$B%k%H$NF0:n$O\e(B @code{display} \e$B%W%m%0%i\e(B
-\e$B%`\e(B @footnote{@code{display} \e$B$O\e(B ImageMagick \e$B%Q%C%1!<%8$K4^$^$l$F$$$^$9!#\e(B
-@code{uncompface} \e$B$H\e(B @code{icontopbm} \e$B$NN>%W%m%0%i%`$K$D$$$F$O!"\e(B
-`compface' \e$B$d\e(B GNU/Linux \e$B%7%9%F%`$K$*$1$k\e(B `faces-xface' \e$B$N$h$&$J%Q%C%1!<\e(B
-\e$B%8$rC5$7$F2<$5$$!#\e(B} \e$B$r%U%)!<%/$7$F8+$h$&$H$7$^$9!#\e(BXEmacs \e$B$G$N%G%#%U%)%k\e(B
-\e$B%H$NF0:n$O\e(B @code{From} \e$BMs$NA0$K4i$rI=<($7$^$9!#\e(B(XEmacs \e$B$,\e(B X-Face \e$B5!G=IU\e(B
-\e$B$-$G%3%s%Q%$%k$5$l$F$$$k$HNI$$$G$7$g$&!=!=$=$l$OI=<($r>/$7Aa$/$7$^$9!#$b\e(B
-\e$B$7:,K\E*\e(B X-Face \e$B5!G=$,$J$$$N$G$"$l$P!"\e(Bgnus \e$B$O\e(B @code{pbmplus} \e$B$d$=$NCg4V\e(B
-\e$B$N30It%W%m%0%i%`$r;H$C$F\e(B @code{X-Face} \e$BMs$rJQ49$7$h$&$H;n$_$^$9!#\e(B) \e$B$3$N\e(B
-\e$B4X?t$rI=<(%U%C%/$KF~$l$?$$$N$G$"$l$P!"$*$=$i$/$=$l$O:G8e$K$J$k$Y$-$G$7$g\e(B
-\e$B$&!#\e(B(\e$BCm\e(B: \e$BJQ?t\e(B/\e$B4X?tL>$K$O\e(B @code{xface} \e$B$G$O$J$/\e(B @code{x-face} \e$B$,;H$o$l$^\e(B
-\e$B$9!#\e(B)
-
@item W b
@kindex W b (\e$B35N,\e(B)
@findex gnus-article-add-buttons
@c Verify a signed (PGP, PGP/MIME or S/MIME) message
@c (@code{gnus-summary-force-verify-and-decrypt}).
+@item W u
+@kindex W u (\e$B35N,\e(B)
+@findex gnus-article-treat-unfold-headers
+\e$B@^$jJV$5$l$?%X%C%@!<9T$r0l9T$K$7$^\e(B
+\e$B$9\e(B (@code{gnus-article-treat-unfold-headers})\e$B!#\e(B
+
+@item W n
+@kindex W n (\e$B35N,\e(B)
+@findex gnus-article-treat-fold-newsgroups
+@code{Newsgroups} \e$B$H\e(B @code{Followup-To} \e$B%X%C%@!<$r@^$jJV$7$^\e(B
+\e$B$9\e(B (@code{gnus-article-treat-fold-newsgroups})\e$B!#\e(B
+
@item W W H
@kindex W W H (\e$B35N,\e(B)
@findex gnus-article-strip-headers-from-body
\e$B<+F0E*$K9%$`=q<0$GF|IU$rI=<($9$kJ}K!$O\e(B @xref{Customizing Articles} \e$B$r;2\e(B
\e$B>H$7$F2<$5$$!#\e(B
+@node Article Display
+@subsection Article Display
+@cindex picons
+@cindex x-face
+@cindex smileys
+
+\e$B$3$l$i$N%3%^%s%I$O!"$$$m$s$J<h$k$KB-$i$J$$%.%_%C%/\e(B (gimmicks) \e$B$NI=<($r!"\e(B
+\e$B$=$l$i$r%5%]!<%H$7$F$$$k\e(B Emacs \e$B$N5-;v%P%C%U%!$KDI2C$7$^$9!#\e(B
+
+@code{X-Face} \e$B%X%C%@!<$O>.$5$JGr9u2hA|$G!"%a%C%;!<%8%X%C%@!<$+$i6!5k$5$l\e(B
+\e$B$^$9\e(B (@pxref{X-Face})\e$B!#\e(B
+
+\e$B0lJ}\e(B Picon \e$B$O$"$J$?<+?H$N%7%9%F%`$K0MB8$7!"\e(Bgnus \e$B$O%X%C%@!<$K%^%C%A$9$k$"\e(B
+\e$B$J$?$N;}$AJ*$rC5$7$F$_$^$9\e(B (@pxref{Picons})\e$B!#\e(B
+
+\e$B%9%^%$%j!<$O!"?M!9$,%a%C%;!<%8$K;6$i$+$7$?$,$k>.$5$J\e(B @samp{:-)} \e$B%7%s%\%k\e(B
+\e$B$G$9!#\e(B
+
+\e$B$3$l$i$9$Y$F$N5!G=$O%H%0%k$G$9!#$b$7$9$G$K$=$l$i$,B8:_$7$F$$$?$J$i$P!"$=\e(B
+\e$B$l$i$O:o=|$5$l$^$9!#\e(B
+
+@table @kbd
+@item W D x
+@kindex W D x (\e$B35N,\e(B)
+@findex gnus-article-display-x-face
+@code{X-Face} \e$B$r\e(B @code{From} \e$B%X%C%@!<$KI=<($7$^\e(B
+\e$B$9\e(B (@code{gnus-article-display-x-face})\e$B!#\e(B
+
+@item W D s
+@kindex W D s (\e$B35N,\e(B)
+@findex gnus-article-toggle-smiley
+\e$B%9%^%$%j!<$NI=<($r%H%0%k$7$^$9\e(B (@code{gnus-article-toggle-smiley})\e$B!#\e(B
+
+@item W D f
+@kindex W D f (\e$B35N,\e(B)
+@findex gnus-treat-from-picon
+@code{From} \e$B%X%C%@!<$r\e(B Picon \e$B2=$7$^$9\e(B (@code{gnus-treat-from-picon})\e$B!#\e(B
+
+@item W D m
+@kindex W D m (\e$B35N,\e(B)
+@findex gnus-treat-mail-picon
+\e$B$9$Y$F$N%a!<%k%X%C%@!<\e(B (\e$B$9$J$o$A\e(B @code{Cc}\e$B!"\e(B@code{To}) \e$B$r\e(B Picon \e$B2=$7$^\e(B
+\e$B$9\e(B (@code{gnus-treat-mail-picon})\e$B!#\e(B
+
+@item W D n
+@kindex W D n (\e$B35N,\e(B)
+@findex gnus-treat-newsgroups-picon
+\e$B$9$Y$F$N%K%e!<%9%X%C%@!<\e(B (\e$B$9$J$o\e(B
+\e$B$A\e(B @code{Newsgroups} \e$B$H\e(B @code{Followup-To}) \e$B$r\e(B Picon \e$B2=$7$^\e(B
+\e$B$9\e(B (@code{gnus-treat-from-picon})\e$B!#\e(B
+@end table
+
@node Article Signature
@subsection \e$B5-;v$N=pL>\e(B
@cindex signatures
\e$B$=$NNY$KI=<($5$l$F$$$k$9$Y$F$N%&%#%s%I%&$NBg$-$5$rJQ99$9$k;v$KCm0U$7$F$/\e(B
\e$B$@$5$$!#\e(B
+\e$B0J2<$N%U%C%/$rDI2C$7$F!"$$$D$G$bLZ%&%#%s%I%&$r:G>.2=$7$F$bNI$$$G$7$g$&!#\e(B
+
+@lisp
+(add-hook 'gnus-configure-windows-hook
+ 'gnus-tree-perhaps-minimize)
+@end lisp
+
@item gnus-generate-tree-function
@vindex gnus-generate-tree-function
@findex gnus-generate-horizontal-tree
@item gnus-treat-strip-trailing-blank-lines (t, last, integer)
@item gnus-treat-translate
@item gnus-treat-x-pgp-sig (head)
+@item gnus-treat-from-picon (head)
+@item gnus-treat-mail-picon (head)
+@item gnus-treat-newsgroups-picon (head)
+@item gnus-treat-unfold-headers (head)
+@item gnus-treat-fold-newsgroups (head)
+@item gnus-treat-body-boundary (head)
@item gnus-treat-decode-article-as-default-mime-charset
@end table
@item J S
@kindex J S (\e$B%(!<%8%'%s%H\e(B \e$B%0%k!<%W\e(B)
-@findex gnus-group-send-drafts
-\e$B2<=q$-%0%k!<%W$K$"$kAw?.2DG=$J%a%C%;!<%8$rA4$FAw?.$9\e(B
-\e$B$k\e(B (@code{gnus-group-send-drafts})\e$B!#\e(B@xref{Drafts}.
+@findex gnus-group-send-queue
+\e$B2<=q$-\e(B (queue) \e$B%0%k!<%W$K$"$kAw?.2DG=$J%a%C%;!<%8$rA4$FAw?.$9\e(B
+\e$B$k\e(B (@code{gnus-group-send-queue})\e$B!#\e(B@xref{Drafts}\e$B!#\e(B
@item J a
@kindex J a (\e$B%(!<%8%'%s%H\e(B \e$B%0%k!<%W\e(B)
* NoCeM:: Spam \e$B$dB>$NB@$j$d$9$$?);v$rHr$1$kJ}K!\e(B
* Undo:: \e$B$$$/$D$+$NF0:n$O85$KLa$9;v$,$G$-$k\e(B
* Moderation:: \e$B$"$J$?$,%b%G%l!<%?!<$@$C$?$i$I$&$9$k$+\e(B
-* XEmacs Enhancements:: XEmacs \e$B$G$O$b$C$H3($d$=$NB>$N$b$N$,B8:_\e(B
- \e$B$9$k\e(B
+* Image Enhancements:: \e$B:G?7$N\e(B Emacs/XEmacs \e$B$O3($rI=<($G$-$k\e(B
* Fuzzy Matching:: \e$BBg$-$JLJLS$C$F2?\e(B?
* Thwarting Email Spam:: \e$BM>7W$J>&6HE*EE;R%a!<%k$rHr$1$kJ}K!\e(B
* Various Various:: \e$BK\Ev$K$$$m$$$m$J$b$N\e(B
"^nnml:rec.zoofle$\\|^rec.zoofle$")
@end lisp
-@node XEmacs Enhancements
-@section XEmacs \e$B3HD%\e(B
-@cindex XEmacs
+@node Image Enhancements
+@section \e$B2hA|$N3HD%\e(B
-XEmacs \e$B$O3($d$=$NB>$N$b$N$rI=<($9$k$3$H$,$G$-$k$N$G!"\e(Bgnus \e$B$O$3$l$rMxMQ$9\e(B
-\e$B$k$3$H$K$7$^$9!#\e(B
+XEmacs\e$B!"$=$l$K\e(B Emacs 21 \e$B$O3($d$=$NB>$N$b$N$rI=<($9$k$3$H$,$G$-$k$N$G!"\e(B
+gnus \e$B$O$3$l$rMxMQ$9$k$3$H$K$7$^$9!#\e(B
@menu
-* Picons:: \e$B$"$J$?$,FI$s$G$$$k$b$N$N3($rI=<($9$kJ}K!\e(B
-* Smileys:: \e$BI=<($5$l$k$Y$/@8$^$l$?9,$;$=$&$J4i$rI=<(\e(B
- \e$B$9$kJ}K!\e(B
-* Toolbar:: \e$B%/%j%C%/1n\e(B
-* XVarious:: \e$B$=$NB>$N\e(B XEmacs \e$B$G\e(B Gnus \e$B$JJQ?t\e(B
+* Picons:: \e$B$"$J$?$,FI$s$G$$$k$b$N$N3($rI=<($9$kJ}K!\e(B
+* Smileys:: \e$BI=<($5$l$k$Y$/@8$^$l$?9,$;$=$&$J4i$rI=<($9$kJ}K!\e(B
+* X-Face:: \e$B%U%!%s%-!<$J$A$C$A$c$JGr9u$N3($rI=<($9$k\e(B
+* Toolbar:: \e$B%/%j%C%/1n\e(B
+* XVarious:: \e$B$=$NB>$N\e(B XEmacs \e$B$G\e(B Gnus \e$B$JJQ?t\e(B
@end menu
@node Picons
\e$B$@$5$$!#\e(BGnus \e$B$O\e(B picons \e$B$,\e(B @code{gnus-picons-database} \e$B$G<($5$l$k>l=j$K%$\e(B
\e$B%s%9%H!<%k$7$F$"$k$b$N$H4|BT$7$^$9!#\e(B
+\e$B$b$7$"$J$?$,\e(B Debian GNU/Linux \e$B$r;H$C$F$$$k$N$J$i!"\e(B@samp{apt-get install
+picons.*} \e$B$H8@$($P\e(B gnus \e$B$,8+$D$1$k$3$H$,$G$-$k\e(B picon \e$B$,%$%s%9%H!<%k$5$l\e(B
+\e$B$^$9!#\e(B
+
@node Picon Requirements
@subsubsection Picon \e$B$NF0:n>r7o\e(B
\e$B%^%&%9$G6/D4I=<($7$?$H$-$N4i!#\e(B
@end table
+@node X-Face
+@subsection X-Face
+@cindex x-face
+
+@code{X-Face} \e$B%X%C%@!<$O!"%a%C%;!<%8$NCx<T$rI=$o$9$3$H$K$J$C$F$$$k\e(B 48\e$B!_\e(B
+48 \e$B2hAG$NGr9u$N3($rIA$-$^$9!#$3$l$O?J2=$7B3$1$k$"$^$?$N%a!<%k$H%K%e!<%9\e(B
+\e$B%j!<%@!<$K$h$C$F%5%]!<%H$5$l$k$G$7$g$&!#\e(B
+
+@cindex x-face
+@findex gnus-article-display-x-face
+@findex gnus-article-x-face-command
+@vindex gnus-article-x-face-command
+@vindex gnus-article-x-face-too-ugly
+@iftex
+@iflatex
+\include{xface}
+@end iflatex
+@end iftex
+@c @anchor{X-Face}
+
+@code{X-Face} \e$B%X%C%@!<$NI|9f$K$O!"\e(BEmacs \e$B$,\e(B @samp{compface} \e$B$r%5%]!<\e(B
+\e$B%H\e(B (XEmacs \e$B$N$[$H$s$I$,%5%]!<%H\e(B) \e$B$7$F$$$k$+!"$"$J$?$N%7%9%F%`\e(B
+\e$B$K\e(B @samp{compface} \e$B$,%$%s%9%H!<%k$5$l$F$$$kI,MW$,$"$j$^$9!#$b$7$I$A$i$+\e(B
+\e$B$,??$J$i$P!"\e(Bgnus \e$B$O%G%#%U%)%k%H$G\e(B @code{X-Face} \e$B%X%C%@!<$rI=<($7$^$9!#\e(B
+
+\e$B$3$l$r@)8f$9$k$N$OJQ?t\e(B @code{gnus-article-x-face-command} \e$B$G$9!#$3$NJQ?t\e(B
+\e$B$,J8;zNs$J$i$P!"$3$NJ8;zNs$,%5%V%7%'%k$G<B9T$5$l$^$9!#4X?t$J$i$P!"$3$N4X\e(B
+\e$B?t$,4i$r0z?t$H$7$F8F$P$l$^$9!#$b\e(B
+\e$B$7\e(B @code{gnus-article-x-face-too-ugly} (\e$B$3$l$O@55,I=8=$G\e(B
+\e$B$9\e(B) \e$B$,\e(B @code{From} \e$BMs$K9gCW$9$l$P!"4i$OI=<($5$l$^$;$s!#\e(B
+
+Emacs 20 \e$B$G$N%G%#%U%)%k%H$NF0:n$O\e(B @code{display} \e$B%W%m%0%i\e(B
+\e$B%`\e(B @footnote{@code{display} \e$B$O\e(B ImageMagick \e$B%Q%C%1!<%8$K4^$^$l$F$$$^$9!#\e(B
+@code{uncompface} \e$B$H\e(B @code{icontopbm} \e$B$NN>%W%m%0%i%`$K$D$$$F$O!"\e(B
+`compface' \e$B$d\e(B GNU/Linux \e$B%7%9%F%`$K$*$1$k\e(B `faces-xface' \e$B$N$h$&$J%Q%C%1!<\e(B
+\e$B%8$rC5$7$F2<$5$$!#\e(B} \e$B$r%U%)!<%/$7$F8+$h$&$H$7$^$9!#\e(B
+
+XEmacs \e$B$+@E;_2h$r%5%]!<%H$7$F$$$k\e(B Emacs 21+ \e$B$G$N%G%#%U%)%k%H$NF0:n\e(B
+\e$B$O\e(B @code{From} \e$BMs$NA0$K4i$rI=<($9$k$3$H$G$9!#\e(B(XEmacs \e$B$,\e(B X-Face \e$B5!G=IU$-\e(B
+\e$B$G%3%s%Q%$%k$5$l$F$$$k$HNI$$$G$7$g$&!=!=$=$l$OI=<($r>/$7Aa$/$7$^$9!#$b$7\e(B
+\e$B:,K\E*\e(B X-Face \e$B5!G=$,$J$$$N$G$"$l$P!"\e(Bgnus \e$B$O\e(B @code{pbmplus} \e$B$d$=$NCg4V$N\e(B
+\e$B30It%W%m%0%i%`$r;H$C$F\e(B @code{X-Face} \e$BMs$rJQ49$7$h$&$H;n$_$^$9\e(B @footnote{
+GNU/Linux \e$B%7%9%F%`$G$O\e(B @code{netpbm}\e$B!"\e(B@code{libgr-progs} \e$B$^$?\e(B
+\e$B$O\e(B @code{compface} \e$B$N$h$&$JL>A0$N%Q%C%1!<%8$rC5$7$F2<$5$$!#\e(B}\e$B!#\e(B)
+
+(\e$BCm\e(B: \e$BJQ?t\e(B/\e$B4X?tL>$K$O\e(B @code{xface} \e$B$G$O$J$/\e(B @code{x-face} \e$B$,;H$o$l$^$9!#\e(B)
+
@node Toolbar
@subsection \e$B%D!<%k%P!<\e(B
@chapter \e$BIUO?\e(B
@menu
+* XEmacs:: XEmacs \e$B$G%$%s%9%H!<%k$9$k$?$a$NMW7o\e(B
* History:: \e$B$I$&$d$C$F\e(B gnus \e$B$,:#F|$N$h$&$K$J$C$?$+\e(B
* On Writing Manuals:: \e$B$J$<$3$l$,=i?4<TMQ$N0FFb$G$J$$$+\e(B
* Terminology:: \e$B2f!9$OK\Ev$KFq$7$$!"8l$N$h$&$J8l$r;H$&\e(B
* Frequently Asked Questions::
@end menu
+@node XEmacs
+@section XEmacs
+@cindex XEmacs
+@cindex Installing under XEmacs
+
+XEmacs \e$B$O%Q%C%1!<%8$N=/=8$H$7$FG[I[$5$l$F$$$^$9!#\e(Bgnus \e$B$N\e(B XEmacs \e$B%Q%C%1!<\e(B
+\e$B%8$,I,MW$H$9$k$b$N$O2?$G$"$l!"$"$J$?$O%$%s%9%H!<%k$9$Y$-$G$9!#:#$N$H$3$m\e(B
+\e$BI,MW$J$N$O\e(B @samp{gnus}\e$B!"\e(B@samp{w3}\e$B!"\e(B@samp{mh-e}\e$B!"\e(B@samp{mailcrypt}\e$B!"\e(B
+@samp{rmail}\e$B!"\e(B@samp{eterm}\e$B!"\e(B@samp{mail-lib}\e$B!"\e(B@samp{xemacs-base} \e$B$*$h$S\e(B
+@samp{fsf-compat} \e$B$G$9!#\e(B
+
@node History
@section \e$BNr;K\e(B
* NoCeM:: How to avoid spam and other fatty foods.
* Undo:: Some actions can be undone.
* Moderation:: What to do if you're a moderator.
-* XEmacs Enhancements:: There are more pictures and stuff under XEmacs.
+* Image Enhancements:: There are more pictures and stuff under XEmacs.
* Fuzzy Matching:: What's the big fuzz?
* Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email.
* Various Various:: Things that are really various.
@vindex gnus-select-group-hook
@vindex gnus-auto-select-first
-@code{gnus-auto-select-first} control whether any articles are selected
+If @code{gnus-auto-select-first} is non-@code{nil}, select an article
automatically when entering a group with the @kbd{SPACE} command.
+Which article this is is controlled by the
+@code{gnus-auto-select-subject} variable. Valid values for this
+variable is:
@table @code
-@item nil
-Don't select any articles when entering the group. Just display the
-full summary buffer.
-
-@item t
-Select the first unread article when entering the group.
-
-@item best
-Select the highest scored article in the group when entering the
-group.
-
-@end table
+@item unread
+Place point on the subject line of the first unread article.
-This variable can also be a function. In that case, that function will
-be called to place point on a subject line, and/or select some article.
-Useful functions include:
+@item first
+Place point on the subject line of the first article.
-@table @code
-@item gnus-summary-first-unread-subject
-Place point on the subject line of the first unread article, but
-don't select the article.
+@item unseen
+Place point on the subject line of the first unseen article.
-@item gnus-summary-first-unread-article
-Select the first unread article.
+@item best
+Place point on the subject line of the highest-scored unread article.
-@item gnus-summary-best-unread-article
-Select the highest-scored unread article.
@end table
+This variable can also be a function. In that case, that function
+will be called to place point on a subject line.
If you want to prevent automatic selection in some group (say, in a
-binary group with Huge articles) you can set this variable to @code{nil}
-in @code{gnus-select-group-hook}, which is called when a group is
+binary group with Huge articles) you can set the
+@code{gnus-auto-select-first} variable to @code{nil} in
+@code{gnus-select-group-hook}, which is called when a group is
selected.
This function actually prepares a news even when using mail groups.
This is useful for "posting" messages to mail groups without actually
sending them over the network: they're just saved directly to the group
-in question. The corresponding backend must have a request-post method
+in question. The corresponding back end must have a request-post method
for this to work though.
@end table
@kindex G b (Summary)
@kindex , (Summary)
@findex gnus-summary-best-unread-article
-Go to the article with the highest score
-(@code{gnus-summary-best-unread-article}).
+Go to the unread article with the highest score
+(@code{gnus-summary-best-unread-article}). If given a prefix argument,
+go to the first unread article that has a score over the default score.
@item G l
@itemx l
This function actually prepares a news even when using mail groups.
This is useful for "posting" messages to mail groups without actually
sending them over the network: they're just saved directly to the group
-in question. The corresponding backend must have a request-post method
+in question. The corresponding back end must have a request-post method
for this to work though.
@item S D b
@code{nndraft:delayed} group.
And whenever you get new news, Gnus looks through the group for articles
-which are due and sends them. It uses the @code{gnus-delay-send-drafts}
+which are due and sends them. It uses the @code{gnus-delay-send-queue}
function for this. By default, this function is added to the hook
@code{gnus-get-new-news-hook}. But of course, you can change this.
Maybe you want to use the demon to send drafts? Just tell the demon to
-execute the @code{gnus-delay-send-drafts} function.
+execute the @code{gnus-delay-send-queue} function.
@table @code
@item gnus-delay-initialize
@findex gnus-delay-initialize
By default, this function installs the @kbd{C-c C-j} key binding in
-Message mode and @code{gnus-delay-send-drafts} in
+Message mode and @code{gnus-delay-send-queue} in
@code{gnus-get-new-news-hook}. But it accepts two optional arguments,
@code{no-keymap} and @code{no-check}. If @code{no-keymap} is non-nil,
the @kbd{C-c C-j} binding is not intalled. If @code{no-check} is
these articles easier.
@menu
-* Article Highlighting:: You want to make the article look like fruit salad.
-* Article Fontisizing:: Making emphasized text look nice.
-* Article Hiding:: You also want to make certain info go away.
-* Article Washing:: Lots of way-neat functions to make life better.
-* Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
-* Article Date:: Grumble, UT!
-* Article Signature:: What is a signature?
-* Article Miscellania:: Various other stuff.
+* Article Highlighting:: You want to make the article look like fruit salad.
+* Article Fontisizing:: Making emphasized text look nice.
+* Article Hiding:: You also want to make certain info go away.
+* Article Washing:: Lots of way-neat functions to make life better.
+* Article Buttons:: Click on URLs, Message-IDs, addresses and the like.
+* Article Date:: Grumble, UT!
+* Article Display:: Display various stuff---X-Face, Picons, Smileys
+* Article Signature:: What is a signature?
+* Article Miscellania:: Various other stuff.
@end menu
has been done.
If a prefix is given, a charset will be asked for.
-@item W f
-@kindex W f (Summary)
-@cindex x-face
-@findex gnus-article-display-x-face
-@findex gnus-article-x-face-command
-@vindex gnus-article-x-face-command
-@vindex gnus-article-x-face-too-ugly
-@iftex
-@iflatex
-\include{xface}
-@end iflatex
-@end iftex
-@c @anchor{X-Face}
-Look for and display any X-Face headers
-(@code{gnus-article-display-x-face}). The command executed by this
-function is given by the @code{gnus-article-x-face-command} variable.
-If this variable is a string, this string will be executed in a
-sub-shell. If it is a function, this function will be called with the
-face as the argument. If the @code{gnus-article-x-face-too-ugly} (which
-is a regexp) matches the @code{From} header, the face will not be shown.
-The default action under Emacs is to fork off the @code{display}
-program@footnote{@code{display} is from the ImageMagick package. For
-the @code{uncompface} and @code{icontopbm} programs look for a package
-like `compface' or `faces-xface' on a GNU/Linux system.} to view the
-face. Under XEmacs or Emacs 21+ with suitable image support, the
-default action is to display the face before the @code{From} header.
-(It's nicer if XEmacs has been compiled with X-Face support---that will
-make display somewhat faster. If there's no native X-Face support, Gnus
-will try to convert the @code{X-Face} header using external programs
-from the @code{pbmplus} package and friends.@footnote{On a GNU/Linux
-system look for packages with names like @code{netpbm} or
-@code{libgr-progs}.}) If you want to have this function in the display
-hook, it should probably come last.
-(NOTE: @code{x-face} is used in the variable/function names, not @code{xface}).
-
@item W b
@kindex W b (Summary)
@findex gnus-article-add-buttons
Verify a signed (PGP, PGP/MIME or S/MIME) message
(@code{gnus-summary-force-verify-and-decrypt}).
+@item W u
+@kindex W u (Summary)
+@findex gnus-article-treat-unfold-headers
+Unfold folded header lines (@code{gnus-article-treat-unfold-headers}).
+
+@item W n
+@kindex W n (Summary)
+@findex gnus-article-treat-fold-newsgroups
+Fold the @code{Newsgroups} and @code{Followup-To} headers
+(@code{gnus-article-treat-fold-newsgroups}).
+
@item W W H
@kindex W W H (Summary)
@findex gnus-article-strip-headers-from-body
preferred format automatically.
+@node Article Display
+@subsection Article Display
+@cindex picons
+@cindex x-face
+@cindex smileys
+
+These commands add various frivolous display gimmics to the article
+buffer in Emacs versions that support them.
+
+@code{X-Face} headers are small black-and-white images supplied by the
+message headers (@pxref{X-Face}).
+
+Picons, on the other hand, reside on your own system, and Gnus will
+try to match the headers to what you have (@pxref{Picons}).
+
+Smileys are those little @samp{:-)} symbols that people like to litter
+their messages with (@pxref{Smileys}).
+
+All these functions are toggles--if the elements already exist,
+they'll be removed.
+
+@table @kbd
+@item W D x
+@kindex W D x (Summary)
+@findex gnus-article-display-x-face
+Display an @code{X-Face} in the @code{From} header.
+(@code{gnus-article-display-x-face}).
+
+@item W D s
+@kindex W D s (Summary)
+@findex gnus-article-toggle-smiley
+Toggle whether to display smileys
+(@code{gnus-article-toggle-smiley}).
+
+@item W D f
+@kindex W D f (Summary)
+@findex gnus-treat-from-picon
+Piconify the @code{From} header (@code{gnus-treat-from-picon}).
+
+@item W D m
+@kindex W D m (Summary)
+@findex gnus-treat-mail-picon
+Piconify all mail headers (i. e., @code{Cc}, @code{To})
+(@code{gnus-treat-mail-picon}).
+
+@item W D n
+@kindex W D n (Summary)
+@findex gnus-treat-newsgroups-picon
+Piconify all news headers (i. e., @code{Newsgroups} and
+@code{Followup-To}) (@code{gnus-treat-from-picon}).
+
+@end table
+
+
+
@node Article Signature
@subsection Article Signature
@cindex signatures
buffer is one of these, minimizing the tree window will also resize all
other windows displayed next to it.
+You may also wish to add the following hook to keep the window minimized
+at all times:
+
+@lisp
+(add-hook 'gnus-configure-windows-hook
+ 'gnus-tree-perhaps-minimize)
+@end lisp
+
@item gnus-generate-tree-function
@vindex gnus-generate-tree-function
@findex gnus-generate-horizontal-tree
@item gnus-treat-strip-trailing-blank-lines (t, last, integer)
@item gnus-treat-translate
@item gnus-treat-x-pgp-sig (head)
+@item gnus-treat-from-picon (head)
+@item gnus-treat-mail-picon (head)
+@item gnus-treat-newsgroups-picon (head)
+@item gnus-treat-unfold-headers (head)
+@item gnus-treat-fold-newsgroups (head)
+@item gnus-treat-body-boundary (head)
@item gnus-treat-decode-article-as-default-mime-charset
@end table
@vindex nnmail-expiry-target
The normal action taken when expiring articles is to delete them.
-However, in some circumstances it might make more sense to move them to
-other groups instead of deleting them. The variable @code{nnmail-expiry-target}
-(and the @code{expiry-target} group parameter) controls this. The
-variable supplies a default value for all groups, which can be
-overridden for specific groups by the group parameter.
-default value is @code{delete}, but this can also be a string (which
-should be the name of the group the message should be moved to), or a
-function (which will be called in a buffer narrowed to the message in
-question, and with the name of the group being moved from as its
-parameter) which should return a target -- either a group name or
-@code{delete}.
+However, in some circumstances it might make more sense to move them
+to other groups instead of deleting them. The variable
+@code{nnmail-expiry-target} (and the @code{expiry-target} group
+parameter) controls this. The variable supplies a default value for
+all groups, which can be overridden for specific groups by the group
+parameter. default value is @code{delete}, but this can also be a
+string (which should be the name of the group the message should be
+moved to), or a function (which will be called in a buffer narrowed to
+the message in question, and with the name of the group being moved
+from as its parameter) which should return a target -- either a group
+name or @code{delete}.
Here's an example for specifying a group name:
@lisp
@item J S
@kindex J S (Agent Group)
-@findex gnus-group-send-drafts
-Send all sendable messages in the draft group
-(@code{gnus-group-send-drafts}). @xref{Drafts}.
+@findex gnus-group-send-queue
+Send all sendable messages in the queue group
+(@code{gnus-group-send-queue}). @xref{Drafts}.
@item J a
@kindex J a (Agent Group)
@chapter Various
@menu
-* Process/Prefix:: A convention used by many treatment commands.
-* Interactive:: Making Gnus ask you many questions.
-* Symbolic Prefixes:: How to supply some Gnus functions with options.
-* Formatting Variables:: You can specify what buffers should look like.
-* Window Layout:: Configuring the Gnus buffer windows.
-* Faces and Fonts:: How to change how faces look.
-* Compilation:: How to speed Gnus up.
-* Mode Lines:: Displaying information in the mode lines.
-* Highlighting and Menus:: Making buffers look all nice and cozy.
-* Buttons:: Get tendinitis in ten easy steps!
-* Daemons:: Gnus can do things behind your back.
-* NoCeM:: How to avoid spam and other fatty foods.
-* Undo:: Some actions can be undone.
-* Moderation:: What to do if you're a moderator.
-* XEmacs Enhancements:: There are more pictures and stuff under XEmacs.
-* Fuzzy Matching:: What's the big fuzz?
-* Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email.
-* Various Various:: Things that are really various.
+* Process/Prefix:: A convention used by many treatment commands.
+* Interactive:: Making Gnus ask you many questions.
+* Symbolic Prefixes:: How to supply some Gnus functions with options.
+* Formatting Variables:: You can specify what buffers should look like.
+* Window Layout:: Configuring the Gnus buffer windows.
+* Faces and Fonts:: How to change how faces look.
+* Compilation:: How to speed Gnus up.
+* Mode Lines:: Displaying information in the mode lines.
+* Highlighting and Menus:: Making buffers look all nice and cozy.
+* Buttons:: Get tendinitis in ten easy steps!
+* Daemons:: Gnus can do things behind your back.
+* NoCeM:: How to avoid spam and other fatty foods.
+* Undo:: Some actions can be undone.
+* Moderation:: What to do if you're a moderator.
+* Image Enhancements:: Modern versions of Emacs/XEmacs can display images.
+* Fuzzy Matching:: What's the big fuzz?
+* Thwarting Email Spam:: A how-to on avoiding unsolicited commercial email.
+* Various Various:: Things that are really various.
@end menu
@end lisp
-@node XEmacs Enhancements
-@section XEmacs Enhancements
-@cindex XEmacs
+@node Image Enhancements
+@section Image Enhancements
-XEmacs is able to display pictures and stuff, so Gnus has taken
-advantage of that.
+XEmacs, as well as Emacs 21, is able to display pictures and stuff, so
+Gnus has taken advantage of that.
@menu
-* Picons:: How to display pictures of what your reading.
-* Smileys:: Show all those happy faces the way they were meant to be shown.
-* Toolbar:: Click'n'drool.
-* XVarious:: Other XEmacsy Gnusey variables.
+* Picons:: How to display pictures of what you're reading.
+* Smileys:: Show all those happy faces the way they were meant to be shown.
+* X-Face:: Display a funky, teensy black-and-white image.
+* Toolbar:: Click'n'drool.
+* XVarious:: Other XEmacsy Gnusey variables.
@end menu
picons to be installed into a location pointed to by
@code{gnus-picons-database}.
+If you are using Debian GNU/Linux, saying @samp{apt-get install
+picons.*} will install the picons where Gnus can find them.
+
@node Picon Requirements
@subsubsection Picon Requirements
@end table
+@node X-Face
+@subsection X-Face
+@cindex x-face
+
+@code{X-Face} headers describe a 48x48 pixel black-and-white image
+that's supposed to represent the author of the message. It seems to
+be supported by an ever-growing number of mail and news readers.
+
+@cindex x-face
+@findex gnus-article-display-x-face
+@findex gnus-article-x-face-command
+@vindex gnus-article-x-face-command
+@vindex gnus-article-x-face-too-ugly
+@iftex
+@iflatex
+\include{xface}
+@end iflatex
+@end iftex
+@c @anchor{X-Face}
+
+Decoding an @code{X-Face} header either requires an Emacs that has
+@samp{compface} support (which most XEmacs versions has), or that you
+have @samp{compface} installed on your system. If either is true,
+Gnus will default to displaying @code{X-Face} headers.
+
+The variable that controls this is the
+@code{gnus-article-x-face-command} variable. If this variable is a
+string, this string will be executed in a sub-shell. If it is a
+function, this function will be called with the face as the argument.
+If the @code{gnus-article-x-face-too-ugly} (which is a regexp) matches
+the @code{From} header, the face will not be shown.
+
+The default action under Emacs 20 is to fork off the @code{display}
+program@footnote{@code{display} is from the ImageMagick package. For
+the @code{uncompface} and @code{icontopbm} programs look for a package
+like @code{compface} or @code{faces-xface} on a GNU/Linux system.} to
+view the face.
+
+Under XEmacs or Emacs 21+ with suitable image support, the default
+action is to display the face before the @code{From} header. (It's
+nicer if XEmacs has been compiled with @code{X-Face} support---that
+will make display somewhat faster. If there's no native @code{X-Face}
+support, Gnus will try to convert the @code{X-Face} header using
+external programs from the @code{pbmplus} package and
+friends.@footnote{On a GNU/Linux system look for packages with names
+like @code{netpbm}, @code{libgr-progs} and @code{compface}.})
+
+(NOTE: @code{x-face} is used in the variable/function names, not
+@code{xface}).
+
+
@node Toolbar
@subsection Toolbar
@chapter Appendices
@menu
+* XEmacs:: Requirements for installing under XEmacs.
* History:: How Gnus got where it is today.
* On Writing Manuals:: Why this is not a beginner's guide.
* Terminology:: We use really difficult, like, words here.
@end menu
+@node XEmacs
+@section XEmacs
+@cindex XEmacs
+@cindex Installing under XEmacs
+
+XEmacs is distributed as a collection of packages. You should install
+whatever packages the Gnus XEmacs package requires. The current
+requirements are @samp{gnus}, @samp{w3}, @samp{mh-e},
+@samp{mailcrypt}, @samp{rmail}, @samp{eterm}, @samp{mail-lib},
+@samp{xemacs-base}, and @samp{fsf-compat}.
+
+
@node History
@section History
@item message-subject-re-regexp
@vindex message-subject-re-regexp
+@cindex Aw:
+@cindex Sv:
+@cindex Re:
\e$B%a%C%;!<%8$X$N1~Ez$O\e(B @samp{Re: } \e$B$G;O$^$j$^$9!#$3$l$O1Q8l\e(B
\e$B$N\e(B ``response'' \e$B$NN,$G$O\e(B @emph{\e$B$"$j$^$;$s\e(B} \e$B$,!"%i%F%s8l$G!"\e(B``\e$B$=$l$K1~Ez\e(B
\e$B$7$F\e(B'' (in response to) \e$B$H8@$&0UL#$G$9!#$$$/$D$+$NL53X$NGO</$O$3$N;v<B$r\e(B
\e$B$J>l9g$O$3$NJQ?t$r$3$l$i$N@\F,8l$K9g$&$h$&$J@55,I=8=$K@_Dj$9$k$G$7$g$&!#\e(B
\e$B;d<+?H$O!"$=$N$h$&$J5,3J$K=>$o$J$$%a!<%k$O$?$@<N$F5n$C$F$$$k$@$1$G$9!#\e(B
+\e$B$3$l$O!"JV;v$r$9$k$H$-$K$3$l$i$N%X%C%@!<$r=hM}$9$kCM$NNc$G$9\e(B:
+
+@lisp
+(setq message-subject-re-regexp
+ "^\\(\\(\\([Rr][Ee]\\|[Ss][Vv]\\|[Aa][Ww]\\): *\\)+\\))
+@end lisp
+
@item message-alternative-emails
@vindex message-alternative-emails
\e$BBe$o$j$N%a!<%k%"%I%l%9$K9gCW$9$k@55,I=8=$G$9!#:G=i$K%^%C%A$7$?\e(B (\e$BBh0l5A$G\e(B
@item message-subject-re-regexp
@vindex message-subject-re-regexp
+@cindex Aw:
+@cindex Sv:
+@cindex Re:
Responses to messages have subjects that start with @samp{Re: }. This
is @emph{not} an abbreviation of the English word ``response'', but is
Latin, and means ``in response to''. Some illiterate nincompoops have
set this variable to a regexp that matches these prefixes. Myself, I
just throw away non-compliant mail.
+Here's an example of a value to deal with these headers when
+responding to a message:
+
+@lisp
+(setq message-subject-re-regexp
+ "^\\(\\(\\([Rr][Ee]\\|[Ss][Vv]\\|[Aa][Ww]\\): *\\)+\\))
+@end lisp
+
@item message-alternative-emails
@vindex message-alternative-emails
A regexp to match the alternative email addresses. The first matched