| tvkaista-0.985/Makefile | | tvkaista-0.986/Makefile |
| 2 | #VERSION_CONTROLLED= tvkaista.sh tvkaista_gtkui.c tvkaista-helper.pl \ | 2 | #VERSION_CONTROLLED= tvkaista.sh tvkaista_gtkui.c tvkaista-helper.pl \ |
| 3 | # tvkaista.desktop logo.pov tvkaista.png Makefile | 3 | # tvkaista.desktop logo.pov tvkaista.png Makefile |
| 4 | | 4 | |
| | 5 | VERSION=0.986 |
| 5 | | 6 | |
| 6 | all: tvkaista_gtkui tvkaista_gtkpw | 7 | all: tvkaista_gtkui tvkaista_gtkpw |
| 7 | | 8 | |
| 8 | tvkaista_gtkui: tvkaista_gtkui.c tvkaista.desktop custom-list.o | 9 | tvkaista_gtkui: tvkaista_gtkui.c Makefile custom-list.o |
| 9 | sh $< | 10 | sh $< |
| 10 | | 11 | |
| 11 | custom-list.o: custom-list.c custom-list.h | 12 | custom-list.o: custom-list.c custom-list.h |
| 27 | cp tvkaista_gtkpw "$$HOME"/.tvkaista | 28 | cp tvkaista_gtkpw "$$HOME"/.tvkaista |
| 28 | cp tvkaista-helper.pl "$$HOME"/.tvkaista | 29 | cp tvkaista-helper.pl "$$HOME"/.tvkaista |
| 29 | cp tvkaista.png "$$HOME"/.tvkaista | 30 | cp tvkaista.png "$$HOME"/.tvkaista |
| 30 | cp tvkaista.menu "$$HOME"/.tvkaista | 31 | sed 's|$$dest|'"$$HOME/.tvkaista|" tvkaista.menu \ |
| | 32 | > "$$HOME"/.tvkaista/tvkaista.menu |
| 31 | sed 's|$$dest|'"$$HOME/.tvkaista|" tvkaista.desktop \ | 33 | sed 's|$$dest|'"$$HOME/.tvkaista|" tvkaista.desktop \ |
| 32 | > "$$HOME"/.tvkaista/tvkaista.desktop | 34 | > "$$HOME"/.tvkaista/tvkaista.desktop |
| 33 | rm -f "$$HOME"/bin/tvkaista_gtk "$$HOME"/bin/tvkaista_gtkui \ | 35 | rm -f "$$HOME"/bin/tvkaista_gtk "$$HOME"/bin/tvkaista_gtkui \ |
| 40 | || ln -sf ../.tvkaista/tvkaista.desktop "$$HOME"/Työpöytä | 42 | || ln -sf ../.tvkaista/tvkaista.desktop "$$HOME"/Työpöytä |
| 41 | test -d "$$HOME"/.menu || mkdir "$$HOME"/.menu | 43 | test -d "$$HOME"/.menu || mkdir "$$HOME"/.menu |
| 42 | ln -sf ../.tvkaista/tvkaista.menu "$$HOME"/.menu/tvkaista | 44 | ln -sf ../.tvkaista/tvkaista.menu "$$HOME"/.menu/tvkaista |
| | 45 | # test -d "$$HOME/".icons || mkdir "$$HOME"/.icons |
| | 46 | # test -d "$$HOME/".icons/hicolor || mkdir "$$HOME"/.icons/hicolor |
| | 47 | # test -d "$$HOME/".icons/hicolor/48x48 || mkdir "$$HOME"/.icons/hicolor/48x48 |
| | 48 | # test -d "$$HOME/".icons/hicolor/48x48/apps || mkdir "$$HOME"/.icons/hicolor/48x4 |
| | | 8/apps |
| | 49 | # rm -f "$$HOME/".icons/hicolor/48x48/apps/tvkaista_gtk.png |
| | 50 | # ln -s "$$HOME"/.tvkaista/tvkaista_gtk.png "$$HOME"/.icons/hicolor/48x48/apps |
| 43 | case `env which update-menus >/dev/null 2>&1` in /*) update-menus;;esac | 51 | case `env which update-menus >/dev/null 2>&1` in /*) update-menus;;esac |
| | 52 | # case `env which update-icon-caches >/dev/null 2>&1` in /*) update-icon-caches "$ |
| | | $HOME"/.icons/hicolor ;;esac |
| 44 | | 53 | |
| 45 | gitlog: #$(VERSION_CONTROLLED) | 54 | gitlog: #$(VERSION_CONTROLLED) |
| 46 | git log --name-status > $@ | 55 | git log --name-status > $@ |
| 49 | | 58 | |
| 50 | targz: gitlog | 59 | targz: gitlog |
| 51 | # requires recent-enough GNU tar | 60 | # requires recent-enough GNU tar |
| 52 | ver=`sed -n 's/Version=//p' tvkaista.desktop`; \ | 61 | ver=`sed -n 's/VERSION[=]//p' Makefile`; \ |
| 53 | tar --transform "s|^|tvkaista-$$ver/|" -zcf tvkaista-$$ver.tar.gz \ | 62 | tar --transform "s|^|tvkaista-$$ver/|" -zcf tvkaista-$$ver.tar.gz \ |
| 54 | tvkaista_gtkui.c tvkaista-helper.pl tvkaista.sh custom-list.c \ | 63 | tvkaista_gtkui.c tvkaista-helper.pl tvkaista.sh custom-list.c \ |
| 55 | tvkaista_gtkpw.c tvkaista.desktop tvkaista.png custom-list.h \ | 64 | tvkaista_gtkpw.c tvkaista.desktop tvkaista.png custom-list.h \ |
| tvkaista-0.985/tvkaista-helper.pl | | tvkaista-0.986/tvkaista-helper.pl |
| 14 | use warnings; | 14 | use warnings; |
| 15 | | 15 | |
| 16 | use Time::Local qw( timegm ); | 16 | use Time::Local qw( timegm ); |
| 17 | use Time::HiRes qw( gettimeofday ); | | |
| 18 | use MIME::Base64 qw( encode_base64 ); | 17 | use MIME::Base64 qw( encode_base64 ); |
| 19 | | 18 | |
| 20 | select STDERR; | 19 | select STDERR; |
| 44 | { | 43 | { |
| 45 | my @t = localtime; | 44 | my @t = localtime; |
| 46 | ($date, $time) = ( sprintf('%d-%02d-%02d', $t[5] + 1900, $t[4] + 1, $t[3]), | 45 | ($date, $time) = ( sprintf('%d-%02d-%02d', $t[5] + 1900, $t[4] + 1, $t[3]), |
| 47 | sprintf('%02d:%02d:%02d', $t[2], $t[1], $t[0]) ); | 46 | sprintf('%02d%02d%02d', $t[2], $t[1], $t[0]) ); |
| 48 | #print "$date -- $time\n"; | 47 | #print "$date -- $time\n"; |
| 49 | } | 48 | } |
| 50 | getdatetime; | 49 | getdatetime; |
| | 50 | open LOG, '>>', 'run.log'; |
| | 51 | print LOG "+ $date $time $0 @ARGV\n"; |
| 51 | | 52 | |
| 52 | unless (-d "4/logs.$date") { | 53 | unless (-d "4/logs.$date") { |
| 53 | mkdir "4/logs.$date"; | 54 | mkdir "4/logs.$date"; |
| 104 | # '--save-headers', '-O', @_; | 105 | # '--save-headers', '-O', @_; |
| 105 | } | 106 | } |
| 106 | | 107 | |
| | 108 | use IO::Socket::INET; |
| | 109 | sub openhttpstream($$$) |
| | 110 | { |
| | 111 | my ($redir, $host, $path) = ($_[0], $_[1], $_[2]); |
| | 112 | while (1) { |
| | 113 | # XXX check unauthorized, rotate tunnus (paitsi jos sama jonkun)! |
| | 114 | $host = "$host:80" unless $host =~ /:/; |
| | 115 | print "Opening host $host, path $path\n"; |
| | 116 | my $sock = IO::Socket::INET->new($host) or die "INET->new: $!\n"; |
| | 117 | print $sock "GET $path HTTP/1.0\r\n"; |
| | 118 | print $sock "User-Agent: tvkaista-helper.pl\r\n"; |
| | 119 | print $sock "Accept: */*\r\n"; |
| | 120 | print $sock "Connection: Close\r\n"; |
| | 121 | print $sock "Authorization: Basic $b64cred\r\n"; |
| | 122 | print $sock "\r\n"; |
| | 123 | |
| | 124 | print "--8<----8<----8<----8<--\n"; |
| | 125 | my ($moved, $location, $rc) = (0, undef, 0); |
| | 126 | while (<$sock>) { |
| | 127 | print $_; |
| | 128 | if (/HTTP.*\s(\d+)\s/) { |
| | 129 | $rc = $1; |
| | 130 | $moved = 1 if $rc == 301 || $rc == 302; |
| | 131 | next; |
| | 132 | } |
| | 133 | $location = $1 if /Location:\s+(https?:\/\/.*\S)\s*/; |
| | 134 | # XXX check unauthorized, rotate tunnus (paitsi jos sama jonkun)! |
| | 135 | last if (/^\s*$/); |
| | 136 | } |
| | 137 | print "-->8---->8---->8---->8--\n"; |
| | 138 | if ($moved) { |
| | 139 | close $sock; |
| | 140 | die "No location\n" unless defined $location; |
| | 141 | if ($redir) { |
| | 142 | $location =~ m|https?:\/\/(.*?)(/.*)|; |
| | 143 | ($host, $path) = ($1, $2); |
| | 144 | next; |
| | 145 | } |
| | 146 | return $location; |
| | 147 | } |
| | 148 | $path =~ /outputfilename=(.*)/; |
| | 149 | return ($sock, $1, $rc); |
| | 150 | } |
| | 151 | } |
| | 152 | |
| 107 | my %months = ( Jan => 1, Feb => 2, Mar => 3, Apr => 4, May => 5, Jun => 6, | 153 | my %months = ( Jan => 1, Feb => 2, Mar => 3, Apr => 4, May => 5, Jun => 6, |
| 108 | Jul => 7, Aug => 8, Sep => 9, Oct => 10, Nov => 11, Dec => 12 ); | 154 | Jul => 7, Aug => 8, Sep => 9, Oct => 10, Nov => 11, Dec => 12 ); |
| 109 | | 155 | |
| 162 | | 208 | |
| 163 | sub update () | 209 | sub update () |
| 164 | { | 210 | { |
| 165 | feedwget "4/today/channels-$time.rss", "4/today/channels-$time.log", | 211 | feedwget "4/today/chnlist-$time.rss", "4/today/chnlist-$time.log", |
| 166 | 'http://www.tvkaista.fi/feed/channels/'; | 212 | 'http://alpha.tvkaista.fi/feed/channels/'; |
| 167 | return 0 if -z "4/today/channels-$time.rss"; | 213 | return 0 if -z "4/today/chnlist-$time.rss"; |
| 168 | open I, '<', "4/today/channels-$time.rss" or die $!; | 214 | open I, '<', "4/today/chnlist-$time.rss" or die $!; |
| 169 | my (@channels, $linktail, $c); | 215 | my (@channels, $linktail, $c); |
| 170 | while (<I>) { last if /<ttl>/; } | 216 | while (<I>) { last if /<ttl>/; } |
| 171 | while (<I>) { | 217 | while (<I>) { |
| 177 | $c = 100; | 223 | $c = 100; |
| 178 | | 224 | |
| 179 | my @urls; | 225 | my @urls; |
| 180 | push @urls, "http://www.tvkaista.fi/feed/channels/$_/flv.rss" | 226 | push @urls, "http://alpha.tvkaista.fi/feed/channels/$_/flv.rss" |
| 181 | foreach (@channels); | 227 | foreach (@channels); |
| 182 | | 228 | |
| 183 | feedwget "4/today/a-$time-now.rss", "4/today/a-$time-now.log", @urls; | 229 | feedwget "4/today/chnls-now-$time.rss","4/today/chnls-now-$time.log", @urls; |
| 184 | | 230 | |
| 185 | open I, '<', "4/today/a-$time-now.rss" or die $!; | 231 | open I, '<', "4/today/chnls-now-$time.rss" or die $!; |
| 186 | fillprograms; | 232 | fillprograms; |
| 187 | close I; | 233 | close I; |
| 188 | | 234 | |
| 226 | my @fst = stat $outputfile; | 272 | my @fst = stat $outputfile; |
| 227 | next if (defined $fst[9] && $fst[9] > $daysecs+86400); # recent enough. | 273 | next if (defined $fst[9] && $fst[9] > $daysecs+86400); # recent enough. |
| 228 | | 274 | |
| 229 | push @urls, "http://www.tvkaista.fi/feed/archives/$di[4]/$di[3]/$di[2]" | 275 | push @urls, "http://alpha.tvkaista.fi/feed/archives/$di[4]/$di[3]/$di[2]" |
| 230 | . "/channels/$_/flv.rss" foreach (@channels); | 276 | . "/channels/$_/flv.rss" foreach (@channels); |
| 231 | | 277 | |
| 232 | getdatetime; | 278 | getdatetime; |
| 233 | feedwget "4/today/a-$di[3]-$di[2]-$time.rss", | 279 | my $filedate = sprintf "%02d-%02d-$time", $di[3], $di[2]; |
| | 280 | feedwget "4/today/chnls-$filedate.rss", |
| 234 | "4/today/a-$di[3]-$di[2]-$time.log", @urls; | 281 | "4/today/chnls-$filedate.log", @urls; |
| 235 | last WHILE unless -s "4/today/a-$di[3]-$di[2]-$time.rss"; | 282 | last WHILE unless -s "4/today/chnls-$filedate.rss"; |
| 236 | | 283 | |
| 237 | open I, '<', "4/today/a-$di[3]-$di[2]-$time.rss" or die $!; | 284 | open I, '<', "4/today/chnls-$filedate.rss" or die $!; |
| 238 | fillprograms; | 285 | fillprograms; |
| 239 | close I; | 286 | close I; |
| 240 | | 287 | |
| 276 | } | 323 | } |
| 277 | } | 324 | } |
| 278 | | 325 | |
| 279 | sub getsrt($$) | | |
| 280 | { | | |
| 281 | #http://www.tvkaista.fi/netpvr/Download/774338.srt <- 2009-12 <- | | |
| 282 | #http://www.tvkaista.fi/recordings/download/774338.srt -> 2009-12 -> | | |
| 283 | | | |
| 284 | my $tof = "$recdir/$_[0].srt"; | | |
| 285 | my $log = "4/today/$_[0].log"; | | |
| 286 | | | |
| 287 | feedwget $tof,$log, "http://www.tvkaista.fi/recordings/download/$_[0].srt"; | | |
| 288 | | | |
| 289 | open I, '<', $log or return ( $_[0], 0 ); | | |
| 290 | | | |
| 291 | my ($namepfx, $haveit, $conlen) = ($_[0], 0, -1); | | |
| 292 | while (<I>) { | | |
| 293 | $namepfx = $1, $haveit = 1 if /outputfilename=(.*).srt\s*$/i; | | |
| 294 | $conlen = $1 if /^Pituus:\s+(\d+).*application.x-srt/; | | |
| 295 | } | | |
| 296 | close I; | | |
| 297 | if ($conlen > 0) { | | |
| 298 | $namepfx = 'tekstitys' if $_[1] ne 'wget'; | | |
| 299 | rename $tof, "$recdir/$namepfx.srt"; } | | |
| 300 | else { | | |
| 301 | unlink $tof; } | | |
| 302 | | | |
| 303 | return ($namepfx, $conlen); | | |
| 304 | } | | |
| 305 | | | |
| 306 | my %speeds = qw ( 300k mp4 1M flv 2M h264 8M ts ); | 326 | my %speeds = qw ( 300k mp4 1M flv 2M h264 8M ts ); |
| 307 | | 327 | |
| 308 | sub play ($) | 328 | sub play ($) |
| 311 | | 331 | |
| 312 | getpw; | 332 | getpw; |
| 313 | | 333 | |
| 314 | my ($namepfx, $srtflen) = getsrt($ARGV[2], $ARGV[1]); | 334 | my $havesubtitles = 0; |
| | 335 | my ($sock, $srtname, $rc) = openhttpstream 1, |
| | 336 | 'alpha.tvkaista.fi:80', "/recordings/download/$ARGV[2].srt"; |
| 315 | | 337 | |
| 316 | my $pagename = "4/today/play-$time.html"; | 338 | return 0 if $rc == 401; # Unauthorized. |
| 317 | my $logname = "4/today/play-$time.log"; | 339 | |
| | 340 | if ($rc == 200) { |
| | 341 | # found subtitle content |
| | 342 | open O, '>', "$recdir/$srtname" or die "XXX: $!\n"; |
| | 343 | binmode O; # (Input IO handle in raw mode; do not utf8 utf8 input...) |
| | 344 | print O $_ while (<$sock>); |
| | 345 | close O; |
| | 346 | $havesubtitles = 1; |
| | 347 | } |
| | 348 | close $sock; |
| 318 | | 349 | |
| 319 | my $format = $speeds{$ARGV[3]}; | 350 | my $format = $speeds{$ARGV[3]}; |
| 320 | | 351 | |
| 321 | feedwget $pagename, $logname, '--max-redirect', '0', | 352 | my $url = openhttpstream 0, |
| 322 | "http://www.tvkaista.fi/recordings/download/$ARGV[2].$format"; | 353 | 'alpha.tvkaista.fi:80', "/recordings/download/$ARGV[2].$format"; |
| 323 | | | |
| 324 | open I, '<', $logname or die "Can not open '$logname': $!\n"; | | |
| 325 | my $url; | | |
| 326 | while (<I>) { | | |
| 327 | chomp ($url = $1) if /^Sijainti:\s+(http:\S+)/; | | |
| 328 | } | | |
| 329 | close I; | | |
| 330 | unless (defined $url) { | | |
| 331 | return 0 unless $_[0]; | | |
| 332 | die "No content found!\n"; | | |
| 333 | } | | |
| 334 | | 354 | |
| 335 | chdir $recdir; | 355 | chdir $recdir; |
| 336 | | 356 | |
| 337 | my @list = ( $ARGV[1] ); | 357 | my @list = ( $ARGV[1] ); |
| 338 | if ($ARGV[1] eq 'wget') { | 358 | if ($ARGV[1] eq 'wget') { |
| 339 | push @list, '-O' , "$namepfx.$format"; | 359 | $url =~ /outputfilename=(.*)/; |
| | 360 | push @list, '-O', $1; |
| 340 | } | 361 | } |
| 341 | elsif ($ARGV[1] eq 'vlc') { | 362 | elsif ($ARGV[1] eq 'vlc') { |
| 342 | push @list, '--sub-file', "$namepfx.srt" if $srtflen > 0; | 363 | push @list, '--sub-file', $srtname if $havesubtitles; |
| 343 | } | 364 | } |
| 344 | elsif ($ARGV[1] eq 'mplayer') { | 365 | elsif ($ARGV[1] eq 'mplayer') { |
| 345 | push @list, '-utf8'; | 366 | push @list, '-cache', '1000'; |
| 346 | push @list, '-sub', "$namepfx.srt" if $srtflen > 0; | 367 | push @list, '-sub', $srtname, '-utf8' if $havesubtitles; |
| 347 | } | 368 | } |
| 348 | elsif ($ARGV[1] eq 'xine') { | 369 | elsif ($ARGV[1] eq 'xine') { |
| 349 | # how to give subtitle file as separate command line parameter ? | 370 | # how to give subtitle file as separate command line parameter ? |
| 354 | system @list or warn "system(): $!\n"; | 375 | system @list or warn "system(): $!\n"; |
| 355 | print "Executed @list\n"; | 376 | print "Executed @list\n"; |
| 356 | | 377 | |
| 357 | unlink "$namepfx.srt" if $srtflen > 0 && $ARGV[1] ne 'wget'; | 378 | unlink "$srtname" if $havesubtitles > 0 && $ARGV[1] ne 'wget'; |
| 358 | | 379 | |
| 359 | # add more checks & cleanups | 380 | # add more checks & cleanups |
| 360 | exit 0; | 381 | exit 0; |
| 422 | close I; | 443 | close I; |
| 423 | } | 444 | } |
| 424 | print ("Q \n"); | 445 | print ("Q \n"); |
| | 446 | print STDERR ".\n"; |
| tvkaista-0.985/tvkaista_gtkui.c | | tvkaista-0.986/tvkaista_gtkui.c |
| 5 | WARN="$WARN -Wcast-align -Wpointer-arith " # -Wfloat-equal #-Werror | 5 | WARN="$WARN -Wcast-align -Wpointer-arith " # -Wfloat-equal #-Werror |
| 6 | WARN="$WARN -W -Wwrite-strings -Wcast-qual -Wshadow" # -Wconversion | 6 | WARN="$WARN -W -Wwrite-strings -Wcast-qual -Wshadow" # -Wconversion |
| 7 | FLAGS=`pkg-config --cflags --libs gtk+-2.0 | sed 's/-I/-isystem '/g` | 7 | FLAGS=`pkg-config --cflags --libs gtk+-2.0 | sed 's/-I/-isystem '/g` |
| 8 | ver=`sed -n 's/Version=//p' tvkaista.desktop` | 8 | ver=`sed -n 's/VERSION=//p' Makefile` |
| 9 | OPTS="$WARN $FLAGS -DVERSION=$ver -fstack-protector" | 9 | OPTS="$WARN $FLAGS -DVERSION=$ver -fstack-protector" |
| 10 | case $1 in '') set x -ggdb | 10 | case $1 in '') set x -ggdb |
| 11 | #case $1 in '') set x -O2 ### set x -ggdb | 11 | #case $1 in '') set x -O2 ### set x -ggdb |
| 225 | G.childexit_cb(); | 225 | G.childexit_cb(); |
| 226 | } | 226 | } |
| 227 | | 227 | |
| 228 | bool clear_childexit_cb(void) | | |
| 229 | { | | |
| 230 | G.childexit_cb = null; | | |
| 231 | return false; | | |
| 232 | } | | |
| 233 | | | |
| 234 | void execbgcommand(const char * command, char * const argv[]) | 228 | void execbgcommand(const char * command, char * const argv[]) |
| 235 | { | 229 | { |
| 236 | switch(fork()) | 230 | switch(fork()) |
| 243 | die("fork() failed:"); /* XXX */ | 237 | die("fork() failed:"); /* XXX */ |
| 244 | default: | 238 | default: |
| 245 | /*parent */ | 239 | /*parent */ |
| 246 | G.childexit_cb = clear_childexit_cb; // default | | |
| 247 | return; | 240 | return; |
| 248 | } | 241 | } |
| 249 | (void)execvp(command, argv); | 242 | (void)execvp(command, argv); |
| 562 | dest[n - 1] = '\0'; | 555 | dest[n - 1] = '\0'; |
| 563 | } | 556 | } |
| 564 | | 557 | |
| 565 | int fill_store(FILE * fh) | 558 | void fill_store(FILE * fh) |
| 566 | { | 559 | { |
| 567 | char line[1024]; | 560 | char line[1024]; |
| 568 | | 561 | |
| 618 | case 'Q': | 611 | case 'Q': |
| 619 | custom_list_full(W.listmodel); | 612 | custom_list_full(W.listmodel); |
| 620 | do_filtering(); | 613 | do_filtering(); |
| 621 | return true; | 614 | return; |
| 622 | default: | 615 | default: |
| 623 | fprintf(stderr, "Unknown line: '%s'\n", line); | 616 | fprintf(stderr, "Unknown line: '%s'\n", line); |
| 624 | continue; | 617 | continue; |
| 638 | } | 631 | } |
| 639 | custom_list_full(W.listmodel); | 632 | custom_list_full(W.listmodel); |
| 640 | do_filtering(); | 633 | do_filtering(); |
| 641 | return false; | 634 | return; |
| 642 | } | 635 | } |
| 643 | | 636 | |
| 644 | void day_clicked(int promille) | 637 | void day_clicked(int promille) |
| 1076 | | 1069 | |
| 1077 | bool relist_view(void) | 1070 | bool relist_view(void) |
| 1078 | { | 1071 | { |
| | 1072 | G.childexit_cb = null; |
| 1079 | gtk_tree_view_set_model(GTK_TREE_VIEW(W.listview), null); | 1073 | gtk_tree_view_set_model(GTK_TREE_VIEW(W.listview), null); |
| 1080 | FILE * fh = runhelper("list"); | 1074 | FILE * fh = runhelper("list"); |
| 1081 | clean_data(); | 1075 | clean_data(); |
| 1082 | if (fill_store(fh)) { | 1076 | fill_store(fh); |
| 1083 | g_idle_add(clear_childexit_cb, null); | | |
| 1084 | } | | |
| 1085 | pclose(fh); | 1077 | pclose(fh); |
| 1086 | gtk_tree_view_set_model(GTK_TREE_VIEW(W.listview), | 1078 | gtk_tree_view_set_model(GTK_TREE_VIEW(W.listview), |
| 1087 | GTK_TREE_MODEL(W.listmodel)); | 1079 | GTK_TREE_MODEL(W.listmodel)); |