#!Perl
#
# "my geometry"
#
#Copies my ("me" being the file on disk for this script) window,
# font choice and size, and printing setup into given Perl scripts
# (Resources TFSS 255 and TFSP 255, resp);
#
# Useful for solving the annoying problems created when you move
#  MacPerl files between boxen with wildly different screen sizes.
#
# sburke@netadventure.net 1998-03-19

use Mac::Memory;
use Mac::Resources;
use File::Find;

exit unless @ARGV;
&get_my_geometry();
find(\&put_window_prefs, @ARGV);
print "Done\n";
exit;

#--------------------------------------------------------------------------
sub get_my_geometry {
  local($SPEC) = $0;
  die "Can't find myself on disk!\n" unless -f $SPEC;

  my($creator, $type) = MacPerl::GetFileInfo($SPEC);
  unless($creator eq 'MrPL' or $creator eq 'McPL') {
    die "I'm not a Perl script?!?  Open me in MacPerl and save me.";
  }

  my $refnum = FSpOpenResFile($SPEC, 1); # read only
  unless(defined($refnum)) {
    die "I have no resource fork?!?  Open me in MacPerl and save me.\n";
  }

  my $handle = Get1Resource('TFSP', 255);
  if( $handle ) {
    $Master_TFSP = $handle->get;
  } else {
    CloseResFile($refnum);
    die "I have no TFSP.  Open me in MacPerl and save me.\n";
  }

  $handle = Get1Resource('TFSS', 255);
  if( $handle ) {
    $Master_TFSS = $handle->get;
  } else {
    CloseResFile($refnum);
    die "I have no TFSS.  Open me in MacPerl and save me.\n";
  }
  CloseResFile($refnum);
}

#--------------------------------------------------------------------------

sub put_window_prefs {
  my $SPEC = $File::Find::name;
  my(@utime);

  return unless -f $SPEC;

  @utime = (stat($SPEC))[8,9];

  my($creator, $type) = MacPerl::GetFileInfo($SPEC);
  return unless $creator eq 'MrPL' or $creator eq 'McPL';

  my $refnum = OpenResFile($SPEC);
  unless(defined($refnum)) {
    #No res fork.  Make one.
    if(CreateResFile($SPEC)) {
      $refnum = OpenResFile($SPEC);
    } else {
      warn "Can't make a resource fork for $SPEC";
      return;
    }
  }

  my $handle = Get1Resource('TFSP', 255);
  # 'TFSP' (255)	 The printing setup for the file.
  RemoveResource($handle) if $handle;
  $handle = new Handle($Master_TFSP); # make a new one
  AddResource($handle, 'TFSP', 255, "Printer Info");

  $handle = Get1Resource('TFSS', 255);
  # 'TFSS' (255)		The font, size and rectangle for the file.
  RemoveResource($handle) if $handle;
  $handle = new Handle($Master_TFSS); # make a new one
  AddResource($handle, 'TFSS', 255, "Header Info");

  UpdateResFile($refnum) || print "Error writing: $! $^E\n";
  CloseResFile($refnum);

  utime(@utime , $SPEC); # preserve the datestamps

}

#--------------------------------------------------------------------------
__END__
