#!/usr/bin/perl use X11::Protocol; use X11::Protocol::Constants qw(InputOutput CopyFromParent Replace Exposure_m); use IO::Select; use strict; $| = 1; my $big_size = 1000; my $small_wd = 50; my $small_ht = 20; my $X = X11::Protocol->new; my $cmap = $X->default_colormap; my($bg_pixel,) = $X->AllocColor($cmap, (0xdddd, 0xdddd, 0xdddd)); my $main_win = $X->new_rsrc; $X->CreateWindow($main_win, $X->root, InputOutput, CopyFromParent, CopyFromParent, (0, 0), $big_size, $big_size, 0, 'background_pixel' => $bg_pixel); $X->ChangeProperty($main_win, $X->atom('WM_ICON_NAME'), $X->atom('STRING'), 8, Replace, "long run"); $X->ChangeProperty($main_win, $X->atom('WM_NAME'), $X->atom('STRING'), 8, Replace, "Long-running X11::Protocol test"); $X->ChangeProperty($main_win, $X->atom('WM_CLASS'), $X->atom('STRING'), 8, Replace, "longrun\0LongRun"); $X->ChangeProperty($main_win, $X->atom('WM_NORMAL_HINTS'), $X->atom('WM_SIZE_HINTS'), 32, Replace, pack("Lx16llx16llllllx4", 8|16|128|256, $big_size, $big_size, 1, 1, 1, 1, $big_size, $big_size)); $X->ChangeProperty($main_win, $X->atom('WM_HINTS'), $X->atom('WM_HINTS'), 32, Replace, pack("LLLx24", 1|2, 1, 1)); my $delete_atom = $X->atom('WM_DELETE_WINDOW'); $X->ChangeProperty($main_win, $X->atom('WM_PROTOCOLS'), $X->atom('ATOM'), 32, Replace, pack("L", $delete_atom)); my $text_gc = $X->new_rsrc; my($text_pixel,) = $X->AllocColor($cmap, (0x0000, 0x0000, 0x0000)); my $font = $X->new_rsrc; $X->OpenFont($font, "fixed"); $X->CreateGC($text_gc, $main_win, 'foreground' => $text_pixel, 'font' => $font); $X->MapWindow($main_win); my $fds = IO::Select->new($X->connection->fh); my $num_cols = $big_size / $small_wd; my @cols; my %visible; sub label { my($win) = @_; $X->PolyText8($win, $text_gc, 4, ($small_ht + 10) / 2, [0, sprintf("%x", $win)]); } sub handle_event { my(%e) = @_; if ($e{'name'} eq "Expose") { my $win = $e{'window'}; label($win) if $visible{$win}; } } $X->{'event_handler'} = \&handle_event; my $last_id; for (;;) { while ($fds->can_read(0)) { $X->handle_input; } for (my $x = 0; $x < $big_size; $x += $small_wd) { my @column; for (my $y = 0; $y < $big_size; $y += $small_ht) { # my($rand_pixel,) = # $X->AllocColor($cmap, (rand(65536), rand(65535), rand(65535))); my $rand_pixel = rand(2**32); my $win = $X->new_rsrc; if ($win != $last_id + 1) { print "x"; } $last_id = $win; $X->CreateWindow($win, $main_win, InputOutput, CopyFromParent, CopyFromParent, ($x, $y), $small_wd, $small_ht, 1, 'background_pixel' => $rand_pixel, 'event_mask' => Exposure_m); if (rand() < 0.001) { $X->MapWindow($win); push @column, $win if rand() < 0.9; $visible{$win} = 1; label($win); } else { $X->DestroyWindow($win); } } push @cols, [@column]; if (@cols >= $num_cols) { for my $win (@{shift @cols}) { delete $visible{$win}; $X->DestroyWindow($win); } } } print "."; }