[Date Prev][Date Next][Thread Prev][Thread Next] [Search] [Date Index] [Thread Index]

Re: [MacPerl] CDP: Gradient



> Another wowser!
> 
> Anyone else get this:
> # Jeff-HD:*Jeff:MacPerl :gradient.pl syntax OK
> # Use of uninitialized value.
> File 'Jeff-HD:*Jeff:MacPerl :lib:Mac:LowMem.pm'; Line 533

Well, I never syntax-checked it. This bug will also cause your
MacPerl menu bar to become un-clickable.

Here is a fixed version that also has a few improvements:

#!perl -w

# Gradient v1.1
# by Kevin Reid <kpreid@ibm.net>
#
# Run this in the highest color depth you can.
# To stop, click or press a key.
# 
# Version History
# 1.1
#   * Fixed bug in menu bar hiding code
#   * Minor tweak to @Dirs
#   * Now provides chance to cancel mouse click
# 1.0
#   * Initial release

use strict;

use Mac::Events;
use Mac::QuickDraw;
use Mac::Windows;
use Mac::LowMem;
use Mac::Menus;
use Mac::Processes;

use vars qw(
  $rScreen $rWindow
  $TheWindow
  $MBOldRgn $MBOldHeight
 
  $Done $Hog

  $Width $Height $CPMax
  $CurPos $Loop
  @Colors @Dirs

);

use constant COLOR_VEL_MAX => 600; # Maximum color-change speed.

use constant SPACING => 2; # Spacing of lines in one gradient.

use constant SYSTEM_FREQ => 011;   # Higher values give less time to other
                                   # applications; the value must NOT be
                                   # divisible by SPACING.

$rScreen = GetWMgrPort->portRect;
$rWindow = OffsetRect $rScreen, $rScreen->left, $rScreen->top;
$Width = $rWindow->right;
$Height = $rWindow->bottom;
$CPMax = $Width + $Height;

$MBOldRgn = CopyRgn(GetGrayRgn());
RectRgn(GetGrayRgn, $rScreen);
#OpenRgn();
#FrameRoundRect($rScreen, 16, 16);
#CloseRgn GetGrayRgn;

$MBOldHeight = LMGetMBarHeight;
LMSetMBarHeight(0);
HideCursor();
DisableItem GetMenu 129;
DisableItem GetMenu 130;

$TheWindow = new MacColorWindow ($rScreen, 'Gradient', 1, dBoxProc, 1) or die $^E;
$TheWindow->sethook(click => sub {
  my ($w, $pt) = @_;
  my $r = new Rect ($pt->h - 20, $pt->v - 20, $pt->h + 20, $pt->v + 20);
  my ($in, $oin) = (1, 1);
  InvertOval($r);
  ShowCursor();
  while (StillDown()) {
    $in = PtInRect(GetMouse, $r);
    if ($in != $oin) {
      InvertOval($r);
    } 
    $oin = $in;
    WaitNextEvent;
  }
  HideCursor();
  return unless $in;
  $Done = 1;
});
$TheWindow->sethook(key => sub {$Done = 1});
SetPort $TheWindow->window;
RGBBackColor(new RGBColor(0,0,0));
TextFont(0);

{my $i = 0; WaitNextEvent until $i++ > 10}


@Dirs = (
  sub {MoveTo(0, $CurPos);
       LineTo($CurPos, 0)},

  sub {MoveTo($Width - $CurPos, 0);
       LineTo($Width, $CurPos)},

  sub {MoveTo($Width, $Height - $CurPos);
       LineTo($Width - $CurPos, $Height)},

  sub {MoveTo(0, $Height - $CurPos);
       LineTo($CurPos, $Height)},
);

for ($Loop = 0; !$Done; $Loop++) {
  @Colors = map {{val => rand 65535, vel => rand COLOR_VEL_MAX}} qw(R G B);

  for ($CurPos = $Loop % SPACING; $CurPos <= $CPMax and !$Done; $CurPos += SPACING) {
    unless ($CurPos % SYSTEM_FREQ) {
      WaitNextEvent;
      if (!EqualRgn($TheWindow->window->contRgn, $TheWindow->window->visRgn)) {
        MoveTo(20, 30); RGBForeColor(new RGBColor((65535)x3));
        DrawString('Warning: Performance will be reduced because the window is partially obscured');
      }
    }
    SetPort $TheWindow->window;

    RGBForeColor(new RGBColor(map {$_->{val}} @Colors));
    &{$Dirs[$Loop % @Dirs]};

    foreach my $c (@Colors) {
      $c->{val} += $c->{vel};
      if ($c->{val} > 65535 or $c->{val} < 0) {
        $c->{vel} *= -1;
        redo;
      }
    }
  }
}

#WaitNextEvent until $Done;

END {
  LMSetMBarHeight($MBOldHeight) if $MBOldHeight;
  ShowCursor();
  EnableItem GetMenu 129;
  EnableItem GetMenu 130;

  if ($TheWindow) {
    SetPort $TheWindow->window;
    EraseRect($rWindow);
  }

  if ($MBOldRgn) {
    CopyRgn($MBOldRgn, GetGrayRgn);
    DisposeRgn $MBOldRgn;
  }

  $TheWindow->dispose if $TheWindow;
  # The window is disposed AFTER the GrayRgn is restored
  # so that the corners of the screen are frozen at black.
}

__END__

===== Want to unsubscribe from this list?
===== Send mail with body "unsubscribe" to macperl-request@macperl.org