ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/bin/deliantra
(Generate patch)

Comparing deliantra/Deliantra-Client/bin/deliantra (file contents):
Revision 1.105 by root, Sat Apr 3 02:58:25 2010 UTC vs.
Revision 1.114 by root, Fri Apr 23 16:30:39 2010 UTC

17 $zip->extractMember ("SPLASH.bmp", "$ENV{PAR_TEMP}/SPLASH.bmp"); 17 $zip->extractMember ("SPLASH.bmp", "$ENV{PAR_TEMP}/SPLASH.bmp");
18 } 18 }
19 19
20 require Win32::GUI::SplashScreen; 20 require Win32::GUI::SplashScreen;
21 21
22 # initialise the resolver now, as vista forces us back to the desktop
23 # when doing this.
24 use AnyEvent::DNS ();
25 AnyEvent::DNS::resolver;
26
27 Win32::GUI::SplashScreen::Show ( 22 Win32::GUI::SplashScreen::Show (
28 -file => "$ENV{PAR_TEMP}/SPLASH.bmp", 23 -file => "$ENV{PAR_TEMP}/SPLASH.bmp",
29 ); 24 );
25
26 # initialise the resolver now, as vista forces us back to the desktop
27 # when doing this later.
28 require AnyEvent::DNS;
29 AnyEvent::DNS::resolver ();
30 30
31 $startup_done = sub { 31 $startup_done = sub {
32 Win32::GUI::SplashScreen::Done (1); 32 Win32::GUI::SplashScreen::Done (1);
33 }; 33 };
34 } 34 }
143our $NOW; 143our $NOW;
144 144
145our $CFG; 145our $CFG;
146our $PROFILE; # current profile 146our $PROFILE; # current profile
147our $FAST; # fast, low-quality mode, possibly useful for software-rendering 147our $FAST; # fast, low-quality mode, possibly useful for software-rendering
148our $DELIANTRA_DEBUG = $ENV{DELIANTRA_DEBUG} * 1;
148 149
149our $WANT_REFRESH; 150our $WANT_REFRESH;
150 151
151our $MODE_SLIDER; 152our $MODE_SLIDER;
152our $CAVEAT_LABEL; 153our $CAVEAT_LABEL;
517 audio_music_push; 518 audio_music_push;
518} 519}
519 520
520sub audio_init { 521sub audio_init {
521 if ($CFG->{audio_enable}) { 522 if ($CFG->{audio_enable}) {
523 if (length $CFG->{audio_driver}) {
524 local $ENV{SDL_AUDIODRIVER} = $CFG->{audio_driver};
525 DC::SDL_Init DC::SDL_INIT_AUDIO
526 and die "SDL::Init failed!\n";
527 } else {
528 DC::SDL_Init DC::SDL_INIT_AUDIO
529 and die "SDL::Init failed!\n";
530 }
531
522 $ENV{MIX_EFFECTSMAXSPEED} = 1; 532 $ENV{MIX_EFFECTSMAXSPEED} = 1;
523 $SDL_MIXER = !DC::Mix_OpenAudio 533 $SDL_MIXER = !DC::Mix_OpenAudio
524 $CFG->{audio_hw_frequency}, 534 $CFG->{audio_hw_frequency},
525 DC::MIX_DEFAULT_FORMAT, 535 DC::MIX_DEFAULT_FORMAT,
526 $CFG->{audio_hw_channels}, 536 $CFG->{audio_hw_channels},
556 %AUDIO_PLAY = (); 566 %AUDIO_PLAY = ();
557 %AUDIO_CHUNK = (); 567 %AUDIO_CHUNK = ();
558 568
559 DC::Mix_CloseAudio if $SDL_MIXER; 569 DC::Mix_CloseAudio if $SDL_MIXER;
560 undef $SDL_MIXER; 570 undef $SDL_MIXER;
571
572 DC::SDL_QuitSubSystem DC::SDL_INIT_AUDIO;
561} 573}
562 574
563############################################################################# 575#############################################################################
564 576
565sub destroy_query_dialog { 577sub destroy_query_dialog {
806 user => $PROFILE->{user}, 818 user => $PROFILE->{user},
807 pass => $PROFILE->{password}, 819 pass => $PROFILE->{password},
808 mapw => $mapw, 820 mapw => $mapw,
809 maph => $maph, 821 maph => $maph,
810 822
823 c_version => {
824 client => "deliantra",
811 client => "$DC::VERSION $] $^O", 825 clientver => $DC::VERSION,
826 gl_vendor => DC::OpenGL::gl_vendor,
827 gl_version => DC::OpenGL::gl_version,
828 },
812 829
813 map_widget => $MAPWIDGET, 830 map_widget => $MAPWIDGET,
814 statusbox => $STATUSBOX, 831 statusbox => $STATUSBOX,
815 map => $MAP, 832 map => $MAP,
816 mapmap => $MAPMAP, 833 mapmap => $MAPMAP,
848 865
849 # hack to make SURE we find the IP address all right 866 # hack to make SURE we find the IP address all right
850 # can be removed once AnyEvent::DNS is proven stable. 867 # can be removed once AnyEvent::DNS is proven stable.
851 if ($host eq "gameserver.deliantra.net") { 868 if ($host eq "gameserver.deliantra.net") {
852 AnyEvent::DNS::a "dnstest.deliantra.net", sub { 869 AnyEvent::DNS::a "dnstest.deliantra.net", sub {
853 if ($_[0] ne "80.101.114.108") { # Perl 870 if ($_[0] ne "80.101.114.108") { # P-e-r-l
854 status "dns failure, trying differently"; 871 status "dns failure, trying differently";
855 $host = eval { Socket::inet_ntoa Socket::inet_aton "gameserver.deliantra.net" }; 872 $host = eval { Socket::inet_ntoa Socket::inet_aton "gameserver.deliantra.net" };
856 unless (defined $host) { 873 unless (defined $host) {
857 status "dns failure, using hardcoded address"; 874 status "dns failure, using hardcoded address";
858 $host = "129.13.162.95"; 875 $host = "194.126.175.154";
859 } 876 }
860 } 877 }
861 878
862 dc_connect $host, $port; 879 dc_connect $host, $port;
863 }; 880 };
1139 ]); 1156 ]);
1140 1157
1141 my $text = !$freq 1158 my $text = !$freq
1142 ? "audio is off" 1159 ? "audio is off"
1143 : "audio is enabled\n" 1160 : "audio is enabled\n"
1161 . "driver: " . DC::SDL_AudioDriverName . "\n"
1144 . "frequency (Hz): $freq\n" 1162 . "frequency (Hz): $freq\n"
1145 . "channels: $chans\n" 1163 . "channels: $chans\n"
1146 . "chunk decoders available: " . (join ", ", DC::MixChunk::decoders) . "\n" 1164 . "chunk decoders available: " . (join ", ", DC::MixChunk::decoders) . "\n"
1147 . "music decoders available: " . (join ", ", DC::MixMusic::decoders); 1165 . "music decoders available: " . (join ", ", DC::MixMusic::decoders);
1148 1166
1149 $AUDIO_INFO->set_text ($text); 1167 $AUDIO_INFO->set_text ($text);
1150} 1168}
1151 1169
1152sub audio_setup { 1170sub audio_setup {
1155 $vbox->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 0, 1]); 1173 $vbox->add (my $table = new DC::UI::Table expand => 1, col_expand => [0, 0, 1]);
1156 1174
1157 my $row = 0; 1175 my $row = 0;
1158 1176
1159 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Audio Enable"); 1177 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Audio Enable");
1160 $table->add_at (1, $row++, new DC::UI::CheckBox 1178 $table->add_at (1, $row, new DC::UI::CheckBox
1161 state => $CFG->{audio_enable}, 1179 state => $CFG->{audio_enable},
1162 tooltip => "<b>Master Audio Enable.</b> If enabled, sound effects and music will be played. If disabled, no audio will be used and the soundcard will not be opened.", 1180 tooltip => "<b>Master Audio Enable.</b> If enabled, sound effects and music will be played. If disabled, no audio will be used and the soundcard will not be opened.",
1163 on_changed => sub { $CFG->{audio_enable} = $_[1]; 1 } 1181 on_changed => sub { $CFG->{audio_enable} = $_[1]; 1 }
1182 );
1183 $table->add_at (2, $row++, my $driver = new DC::UI::HBox expand => 1);
1184
1185 $driver->add (new DC::UI::Label align => 1, text => " Audio driver override");
1186 $driver->add (new DC::UI::Entry
1187 text => $CFG->{audio_driver},
1188 template => "dsound1234",
1189 tooltip => "You can override the audio driver to use here. Leaving it empty will result "
1190 . "in Deliantra picking one automatically. GNU/Linux users often prefer specific "
1191 . "drivers though, and can experiment with <b>alsa</b>, <b>dsp</b>, <b>esd</b>, <b>pulse</b>, <b>arts</b>, <b>nas</b> "
1192 . "or other system-specific drivers. Selecting the wrong driver here will simply result"
1193 . "in no sound.",
1194 on_changed => sub { my ($self, $value) = @_; $CFG->{audio_driver} = $value; 1 }
1164 ); 1195 );
1165 1196
1166 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Sound Effects"); 1197 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Sound Effects");
1167 $table->add_at (1, $row, new DC::UI::CheckBox 1198 $table->add_at (1, $row, new DC::UI::CheckBox
1168 expand => 1, state => $CFG->{effects_enable}, 1199 expand => 1, state => $CFG->{effects_enable},
1181 ); 1212 );
1182 1213
1183 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Background Music"); 1214 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Background Music");
1184 $table->add_at (1, $row, new DC::UI::CheckBox 1215 $table->add_at (1, $row, new DC::UI::CheckBox
1185 expand => 1, state => $CFG->{bgm_enable}, 1216 expand => 1, state => $CFG->{bgm_enable},
1186 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played.", 1217 tooltip => "If enabled, playing of background music is enabled. If disabled, no background music will be played. Needs server reconnect to take effect.",
1187 on_changed => sub { 1218 on_changed => sub {
1188 $CFG->{bgm_enable} = $_[1]; 1219 $CFG->{bgm_enable} = $_[1];
1189 $CONN->update_fx_want if $CONN; 1220 $CONN->update_fx_want if $CONN;
1190 audio_music_push; 1221 audio_music_push;
1191 1 1222 1
1202 c_colspan => 2, expand => 1, 1233 c_colspan => 2, expand => 1,
1203 value => $CFG->{audio_hw_frequency}, 1234 value => $CFG->{audio_hw_frequency},
1204 options => [ 1235 options => [
1205 [ 0, "default" , "Use System Default"], 1236 [ 0, "default" , "Use System Default"],
1206 [11025, "11 kHz" , "11kHz (low quality)"], 1237 [11025, "11 kHz" , "11kHz (low quality)"],
1207 [22050, "22 kHz" , "22kHz (reduced quality)"], 1238 [22050, "22 kHz" , "22kHz (reduced quality, recommended)"],
1208 [44100, "44.1 kHz", "44.1kHz (cd quality)"], 1239 [44100, "44.1 kHz", "44.1kHz (cd quality)"],
1209 [48000, "48 kHz" , "48kHz (studio quality)"], 1240 [48000, "48 kHz" , "48kHz (studio quality, not recommended)"],
1210 ], 1241 ],
1211 tooltip => "The sampling frequency to use. Higher sounds better, but also more cpu-intensive and might cause stuttering.", 1242 tooltip => "The sampling frequency to use. Higher sounds better, but also more cpu-intensive and might cause stuttering.",
1212 on_changed => sub { 1243 on_changed => sub {
1213 $CFG->{audio_hw_frequency} = $_[1]; 1244 $CFG->{audio_hw_frequency} = $_[1];
1214 audio_tab_update; 1245 audio_tab_update;
1238 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Latency"); 1269 $table->add_at (0, $row, new DC::UI::Label align => 1, text => "Latency");
1239 $table->add_at (1, $row++, $AUDIO_HW_CHUNKSIZE = new DC::UI::Selector 1270 $table->add_at (1, $row++, $AUDIO_HW_CHUNKSIZE = new DC::UI::Selector
1240 c_colspan => 2, expand => 1, 1271 c_colspan => 2, expand => 1,
1241 value => $CFG->{audio_hw_chunksize}, 1272 value => $CFG->{audio_hw_chunksize},
1242 tooltip => "The guarenteed latency. Lower is better, but also more cpu-intensive and might cause stuttering. If music playback " 1273 tooltip => "The guarenteed latency. Lower is better, but also more cpu-intensive and might cause stuttering. If music playback "
1243 . "is stuttering, increase this value. Values of 50-100ms are optimal.", 1274 . "is stuttering, increase this value. Values of 50-150ms are optimal.",
1244 on_changed => sub { 1275 on_changed => sub {
1245 $CFG->{audio_hw_chunksize} = $_[1]; 1276 $CFG->{audio_hw_chunksize} = $_[1];
1246 audio_tab_update; 1277 audio_tab_update;
1247 1 1278 1
1248 } 1279 }
1328 &set_gauge_window_fontsize; 1359 &set_gauge_window_fontsize;
1329 1360
1330 $win 1361 $win
1331} 1362}
1332 1363
1364our $BW_WATCHER;
1365
1366sub debug_toggle($) {
1367 $DELIANTRA_DEBUG ^= $_[0];
1368
1369 if ($DELIANTRA_DEBUG & 16) {
1370 $BW_WATCHER = EV::periodic 0, 1, 0, sub {
1371 return unless $CONN;
1372 debug sprintf "%8.2gKB/s", $CONN->{octets_in} / 1e3;
1373 $CONN->{octets_in} = 0;
1374 };
1375 } else {
1376 undef $BW_WATCHER;
1377 }
1378
1379}
1380
1333sub debug_setup { 1381sub debug_setup {
1334 my $table = new DC::UI::Table; 1382 my $table = new DC::UI::Table;
1335 1383
1336 $table->add_at (0, 0, new DC::UI::Label text => "Widget Borders"); 1384 $table->add_at (0, 0, new DC::UI::Label text => "Widget Borders");
1337 $table->add_at (1, 0, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 1; 0 }); 1385 $table->add_at (1, 0, new DC::UI::CheckBox on_changed => sub { debug_toggle 1; 0 });
1338 $table->add_at (0, 1, new DC::UI::Label text => "Tooltip Widget Info"); 1386 $table->add_at (0, 1, new DC::UI::Label text => "Tooltip Widget Info");
1339 $table->add_at (1, 1, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 2; 0 }); 1387 $table->add_at (1, 1, new DC::UI::CheckBox on_changed => sub { debug_toggle 2; 0 });
1340 $table->add_at (0, 2, new DC::UI::Label text => "Show FPS"); 1388 $table->add_at (0, 2, new DC::UI::Label text => "Show FPS");
1341 $table->add_at (1, 2, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 4; 0 }); 1389 $table->add_at (1, 2, new DC::UI::CheckBox on_changed => sub { debug_toggle 4; 0 });
1342 $table->add_at (0, 3, new DC::UI::Label text => "Suppress Tooltips"); 1390 $table->add_at (0, 3, new DC::UI::Label text => "Suppress Tooltips");
1343 $table->add_at (1, 3, new DC::UI::CheckBox on_changed => sub { $ENV{CFPLUS_DEBUG} ^= 8; 0 }); 1391 $table->add_at (1, 3, new DC::UI::CheckBox on_changed => sub { debug_toggle 8; 0 });
1392 $table->add_at (0, 4, new DC::UI::Label text => "Show Bandwidth");
1393 $table->add_at (1, 4, new DC::UI::CheckBox on_changed => sub { debug_toggle 16; 0 });
1394
1344 $table->add_at (0, 4, new DC::UI::Button text => "die on click(tm)", on_activate => sub { &DC::debug() } ); 1395 $table->add_at (0, 6, new DC::UI::Button text => "die on click(tm)", on_activate => sub { &DC::debug() } );
1345
1346 $table->add_at (0, 5, new DC::UI::TextEdit text => "line1\0152\0153\nµikachu\nづx゙つ゛");#d# 1396 $table->add_at (0, 7, new DC::UI::TextEdit text => "line1\0152\0153\nµikachu\nづx゙つ゛");#d#
1347 1397
1348 $table->add_at (7,7, my $t = new DC::UI::Table expand => 0); 1398 $table->add_at (7,7, my $t = new DC::UI::Table expand => 0);
1349 $t->add_at (0,0, new DC::UI::Label text => "a a", c_rowspan => 1, c_colspan => 2); 1399 $t->add_at (0,0, new DC::UI::Label text => "a a", c_rowspan => 1, c_colspan => 2);
1350 $t->add_at (2,0, new DC::UI::Label text => "b\nb", c_rowspan => 2, c_colspan => 1, ellipsise => 0 ); 1400 $t->add_at (2,0, new DC::UI::Label text => "b\nb", c_rowspan => 2, c_colspan => 1, ellipsise => 0 );
1351 $t->add_at (1,2, new DC::UI::Label text => "c c", c_rowspan => 1, c_colspan => 2); 1401 $t->add_at (1,2, new DC::UI::Label text => "c c", c_rowspan => 1, c_colspan => 2);
1941 $r 1991 $r
1942} 1992}
1943 1993
1944my %SORT_ORDER = ( 1994my %SORT_ORDER = (
1945 type => sub { 1995 type => sub {
1996 use sort 'stable';
1946 sort { $a->{type} <=> $b->{type} or $a->{name} cmp $b->{name} } @_ 1997 sort { $a->{type} <=> $b->{type} or $a->{name} cmp $b->{name} } @_
1947 }, 1998 },
1948 mtime => sub { 1999 mtime => sub {
2000 use sort 'stable';
1949 my $NOW = time; 2001 my $NOW = time;
1950 sort { 2002 sort {
1951 my $atime = $a->{mtime} - $NOW; $atime = $atime < 5 * 60 ? int $atime / 60 : 6; 2003 my $atime = $a->{mtime} - $NOW; $atime = $atime < 5 * 60 ? int $atime / 60 : 6;
1952 my $btime = $b->{mtime} - $NOW; $btime = $btime < 5 * 60 ? int $btime / 60 : 6; 2004 my $btime = $b->{mtime} - $NOW; $btime = $btime < 5 * 60 ? int $btime / 60 : 6;
1953 2005
1954 ($a->{flags} & F_LOCKED) <=> ($b->{flags} & F_LOCKED) 2006 ($a->{flags} & F_LOCKED) <=> ($b->{flags} & F_LOCKED)
1955 or $btime <=> $atime 2007 or $btime <=> $atime
1956 or $a->{type} <=> $b->{type} 2008 or $a->{type} <=> $b->{type}
1957 } @_ 2009 } @_
1958 }, 2010 },
1959 weight => sub { sort { 2011 weight => sub {
2012 use sort 'stable';
2013 sort {
1960 $a->{weight} * ($a->{nrof} || 1) <=> $b->{weight} * ($b->{nrof} || 1) 2014 $a->{weight} * ($a->{nrof} || 1) <=> $b->{weight} * ($b->{nrof} || 1)
1961 or $a->{type} <=> $b->{type} 2015 or $a->{type} <=> $b->{type}
1962 } @_ }, 2016 } @_
2017 },
1963); 2018);
1964 2019
1965sub inventory_widget { 2020sub inventory_widget {
1966 my $hb = new DC::UI::HBox homogeneous => 1; 2021 my $hb = new DC::UI::HBox homogeneous => 1;
1967 2022
2408 2463
2409 $dialog->show; 2464 $dialog->show;
2410 }; 2465 };
2411} 2466}
2412 2467
2413sub sdl_init {
2414 DC::SDL_Init DC::SDL_INIT_AUDIO #| DC::SDL_NOPARACHUTE
2415 and die "SDL::Init failed!\n";
2416}
2417
2418sub video_init { 2468sub video_init {
2419 DC::set_theme $CFG->{uitheme}; 2469 DC::set_theme $CFG->{uitheme};
2420 2470
2421 DC::SDL_InitSubSystem DC::SDL_INIT_VIDEO if $SDL_REINIT; 2471 DC::SDL_InitSubSystem DC::SDL_INIT_VIDEO if $SDL_REINIT;
2422 $SDL_REINIT = 0; 2472 $SDL_REINIT = 0;
2481 2531
2482 $DEBUG_STATUS = new DC::UI::Label 2532 $DEBUG_STATUS = new DC::UI::Label
2483 padding => 0, 2533 padding => 0,
2484 z => 100, 2534 z => 100,
2485 force_x => "max", 2535 force_x => "max",
2486 force_y => 0; 2536 force_y => 20;
2487 $DEBUG_STATUS->show; 2537 $DEBUG_STATUS->show;
2488 2538
2489 $STATUSBOX = new DC::UI::Statusbox; 2539 $STATUSBOX = new DC::UI::Statusbox;
2490 2540
2491 $MODBOX = new DC::UI::Label 2541 $MODBOX = new DC::UI::Label
2619my $animate_timer; 2669my $animate_timer;
2620 2670
2621my $fps = 9; 2671my $fps = 9;
2622 2672
2623sub force_refresh { 2673sub force_refresh {
2624 if ($ENV{CFPLUS_DEBUG} & 4) { 2674 if ($DELIANTRA_DEBUG & 4) {
2625 $fps = $fps * 0.98 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.02; 2675 $fps = $fps * 0.98 + 1 / (($NOW - $LAST_REFRESH) || 0.1) * 0.02;
2626 debug sprintf "%3.2f", $fps; 2676 debug sprintf "%3.2f", $fps;
2627 } 2677 }
2628 2678
2629 undef $WANT_REFRESH; 2679 undef $WANT_REFRESH;
2815 }; 2865 };
2816 } 2866 }
2817 } 2867 }
2818 } 2868 }
2819 2869
2820 sdl_init;
2821
2822 $ENV{FONTCONFIG_FILE} = DC::find_rcfile "fonts/fonts.conf"; 2870 $ENV{FONTCONFIG_FILE} = DC::find_rcfile "fonts/fonts.conf";
2823 $ENV{FONTCONFIG_DIR} = DC::find_rcfile "fonts"; 2871 $ENV{FONTCONFIG_DIR} = DC::find_rcfile "fonts";
2824 2872
2825 { 2873 {
2826 my @fonts = map DC::find_rcfile "fonts/$_", qw( 2874 my @fonts = map DC::find_rcfile "fonts/$_", qw(
2867 our $STARTUP_CANCEL = EV::idle sub { 2915 our $STARTUP_CANCEL = EV::idle sub {
2868 undef $::STARTUP_CANCEL; 2916 undef $::STARTUP_CANCEL;
2869 $startup_done->(); 2917 $startup_done->();
2870 }; 2918 };
2871 2919
2920 debug_toggle 0;
2921
2872 delete $SIG{__DIE__}; 2922 delete $SIG{__DIE__};
2873 EV::loop; 2923 EV::loop;
2874 2924
2875 DC::write_cfg if $CFG->{config_autosave}; 2925 DC::write_cfg if $CFG->{config_autosave};
2876 2926
2898The deliantra client utilises OpenGL for all UI elements and the game. It 2948The deliantra client utilises OpenGL for all UI elements and the game. It
2899is supposed to be used in fullscreen mode and interactively. 2949is supposed to be used in fullscreen mode and interactively.
2900 2950
2901=head1 DEBUGGING 2951=head1 DEBUGGING
2902 2952
2903CFPLUS_DEBUG - environment variable 2953DELIANTRA_DEBUG - environment variable
2904 2954
2905 1 draw borders around widgets 2955 1 draw borders around widgets
2906 2 add low-level widget info to tooltips 2956 2 add low-level widget info to tooltips
2907 4 show fps 2957 4 show fps
2908 8 suppress tooltips 2958 8 suppress tooltips
2959 16 show bandwidth downstream
2909 2960
2910=head1 AUTHOR 2961=head1 AUTHOR
2911 2962
2912Marc Lehmann <deliantra@schmorp.de>, Robin Redeker <elmex@ta-sa.org> 2963Marc Lehmann <deliantra@schmorp.de>, Robin Redeker <elmex@ta-sa.org>
2913 2964

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines