The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

# Copyright 2011, 2012 Kevin Ryde

# This file is part of X11-Protocol-Other.
#
# X11-Protocol-Other 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 3, or (at your option) any
# later version.
#
# X11-Protocol-Other 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 X11-Protocol-Other.  If not, see <http://www.gnu.org/licenses/>.

use strict;
use X11::Protocol;

use lib 'devel', '.';

# uncomment this to run the ### lines
use Smart::Comments;



{
  $ENV{'DISPLAY'} = ':1';
  my $X = X11::Protocol->new ($ENV{'DISPLAY'} || ':0');
  $X->init_extension('XFIXES') or die;

  my $cursor_font = $X->new_rsrc;
  $X->OpenFont ($cursor_font, "cursor");
  my $cursor = $X->new_rsrc;
  $X->CreateGlyphCursor ($cursor,
                         $cursor_font,
                         'None',  # mask font
                         3,
                         0,
                         0xFFFF, 0xFFFF, 0xFFFF,
                         0,0,0);
  $X->CloseFont ($cursor_font);
  $X->QueryPointer($X->root); # sync

  $X->ChangeWindowAttributes ($X->root,
                              cursor => $cursor);
  $X->QueryPointer($X->root); # sync

  my ($rootx,$rooty, $width,$height, $xhot,$yhot, $serial, $pixels)
    = $X->XFixesGetCursorImage ();

  # {
  #   my @bytes = unpack 'C*', $pixels;
  #   foreach my $y (0 .. $height-1) {
  #     my @row = splice @bytes, 0,$width*4;
  #     print map {sprintf '%02X ',$_} @row;
  #     print "\n";
  #   }
  # }
  {
    my @words = unpack 'L*', $pixels;
    foreach my $y (0 .. $height-1) {
      my @row = splice @words, 0,$width;
      delete @row[5 .. $#row];
      print map {sprintf '%08X ',$_} @row;
      print "\n";
    }
  }
  exit 0;
}

{
  my $display = $ENV{'DISPLAY'} || ':0';
  my $X = X11::Protocol->new ($display);
  $X->{'event_handler'} = sub {
    my (%h) = @_;
    ### event_handler: \%h
  };

  { my @query = $X->QueryExtension('XFIXES');
    ### @query
  }
  $X->QueryPointer($X->{'root'}); # sync

  $X->init_extension('XFIXES') or die;
  $X->QueryPointer($X->{'root'}); # sync

  { my @version = $X->XFixesQueryVersion (99,0);
    ### @version
  }
  $X->QueryPointer($X->{'root'}); # sync

  my $cursor_font = $X->new_rsrc;
  $X->OpenFont ($cursor_font, "cursor");

  my $cursor = $X->new_rsrc;
  $X->CreateGlyphCursor ($cursor,
                         $cursor_font,
                         'None',  # mask font
                         3,
                         0,
                         0xFFFF, 0xFFFF, 0xFFFF,
                         0,0,0);
  $X->QueryPointer($X->{'root'}); # sync

  # { my @reqdata = $X->get_request('XFixesGetCursorName');
  #   ### @reqdata
  # }
  { my @cursorname = $X->XFixesGetCursorName ($cursor);
    ### XFixesGetCursorName: @cursorname
  }
  $X->QueryPointer($X->{'root'}); # sync

  my $region = $X->new_rsrc;
  $X->XFixesCreateRegion ($region);
  $X->QueryPointer($X->{'root'}); # sync

  my $region_dst = $X->new_rsrc;
  $X->XFixesCreateRegion ($region_dst);
  $X->XFixesExpandRegion ($region, $region_dst, 1,1,1,1);
  $X->QueryPointer($X->{'root'}); # sync

  my $window = $X->new_rsrc;
  $X->CreateWindow ($window,
                    $X->root,         # parent
                    'InputOutput',
                    0,                # depth, from parent
                    'CopyFromParent', # visual
                    0,0,              # x,y
                    100,100,          # width,height
                    0,                # border
                    background_pixel => $X->black_pixel,
                   );
  $X->MapWindow ($window);
  sleep 1;
  $X->QueryPointer($X->{'root'}); # sync

  $region = $X->new_rsrc;
  # $X->XFixesCreateRegionFromWindow ($region, $window, 'Bounding');
  $X->XFixesCreateRegion ($region);
  $X->QueryPointer($X->root); # sync
  { my @rects = $X->XFixesFetchRegion ($region);
    ### @rects
  }


  $X->XFixesSelectCursorInput ($X->root, 1);
  $X->QueryPointer($X->{'root'}); # sync
  $X->handle_input;

  exit 0;
}



{
  my $X = X11::Protocol->new (':0');
  $X->init_extension('XFIXES') or die;

  $X->XFixesHideCursor ($X->root);
  $X->QueryPointer($X->{'root'}); # sync

  sleep 1;

  $X->XFixesShowCursor ($X->root);
  $X->QueryPointer($X->{'root'}); # sync
  $X->XFixesShowCursor ($X->root);
  $X->QueryPointer($X->{'root'}); # sync

  sleep 1;
 
  exit 0;
}

{
  my $X = X11::Protocol->new (':0');
  $X->init_extension('XFIXES') or die;

  my $region = $X->new_rsrc;
  $X->XFixesCreateRegion ($region, [1,2,1,1], [4,6,1,1]);
  { my @rects = $X->XFixesFetchRegion ($region);
    ### @rects
  }

  my $r2 = $X->new_rsrc;
  $X->XFixesCreateRegion ($r2);
  $X->XFixesRegionExtents ($region, $r2);
  { my @rects = $X->XFixesFetchRegion ($r2);
    ### @rects
  }
 
  exit 0;
}



{
  my $X = X11::Protocol->new (':0');
  $X->init_extension('XFIXES') or die;
  { my @version = $X->XFixesQueryVersion (1,0);
    ### @version
  }
  $X->QueryPointer($X->{'root'}); # sync


  exit 0;
}

sub atom_name_maybe {
  my ($X, $atom) = @_;
  my $ret = $X->robust_req ('GetAtomName', $atom);
  if (ref $ret) {
    return @$ret;
  }
  return '[not-atom]';
}