1. Silly Scribble Program

Ad asked for conversion of David's scribble program
to "dos", using any library of choice...

below is my answer to that 'challenge'...
it reads as easy (if not easier) as the original
winsnorz program, and doesn't require the 80 or more
megs of winsnorz *bloat*... :)

side note: since the latest update of TrueEU affects
   confined mouse work, it's best to use that latest
   version of TruMouse/TrueEU with this program...
   I'm not sure how an older version of TrueEU would
   behave while running this scribble program...

enjoy! --Hawke'

---------------------begin TruScribble.ex
include trumouse.e
object mouse
integer draw, x, y, oldx, oldy, event

procedure drawline(integer sx,integer sy,integer ex,integer ey)
   mouse_pointer(MOUSEOFF)          --hide the mouse
   true_line(sx,sy,ex,ey,TrueWhite) --draw a line
   mouse_pointer(MOUSEON)           --show the mouse
end procedure

x    = 0      y    = 0
oldx = 0      oldy = 0
draw = FALSE

mouse_cursor("cursor.tga")
mouse_init()
mouse_events(MOVE+LEFT_DOWN+LEFT_UP)

--set up a 'window'
mouse_pointer(MOUSEOFF)
mouse_confine({100,100},{250,250})
true_box(99,99,251,251,TrueBlue,FALSE)
mouse_pointer(MOUSEON)

while 1 do
        mouse = -1
        while atom(mouse) do
           mouse = get_mouse()
           if get_key()!=-1 then GoodBye() end if
        end while
        event = mouse[1]
        if event = MOVE then
           if draw then
              x = mouse[2]  y = mouse[3]
              drawline(oldx,oldy,x,y)
              oldx = x      oldy = y
           end if
        elsif event = LEFT_DOWN then
           oldx = mouse[2]  oldy = mouse[3]
           draw = TRUE
        elsif event = LEFT_UP then
           x    = mouse[2]  y    = mouse[3]
           draw = FALSE
        end if
end while
---------------------end   TruScribble.ex

new topic     » topic index » view message » categorize

2. Re: Silly Scribble Program

I just got around to looking at Hawke's version of TruScribble, and noticed
that he made many of the mistakes that I documented in my prior post.
Specifically:

    - not using and_bits to test the mouse state
    - making the tests mutually exclusive

As a result, the code ignores certain mouse events (such as MOVE+LEFT_UP)
and continues to draw lines after the mouse has been released. Of course, he
could always rewrite TruMouse to return the mouse events as *seperate*
events, like I did in the WinLib library I wrote for my version of Scribble.

Here's the code with the errors:

-- BEGIN SNIPPET OF HAWKE'S CODE --
    if event = MOVE then
       if draw then
          x = mouse[2]  y = mouse[3]
          drawline(oldx,oldy,x,y)
          oldx = x      oldy = y
       end if
    elsif event = LEFT_DOWN then
       oldx = mouse[2]  oldy = mouse[3]
       draw = TRUE
    elsif event = LEFT_UP then
       x    = mouse[2]  y    = mouse[3]
       draw = FALSE
    end if
-- END SNIPPET OF HAWKE'S CODE --

The corrected version might look something like:

-- BEGIN FIXED SNIPPET OF HAWKE'S CODE --
    if and_bits( event, MOVE ) then
       if draw then
          x = mouse[2]  y = mouse[3]
          drawline(oldx,oldy,x,y)
          oldx = x      oldy = y
       end if
    end if

    if and_bits( event, LEFT_DOWN ) then
       oldx = mouse[2]  oldy = mouse[3]
       draw = TRUE
    end if

    if and_bits( event = LEFT_UP ) then
       x    = mouse[2]  y    = mouse[3]
       drawline(oldx,oldy,x,y)
       draw = FALSE
    end if
-- END FIXED SNIPPET OF HAWKE'S CODE --

-- David Cuny

new topic     » goto parent     » topic index » view message » categorize

3. Re: Silly Scribble Program

"Cuny, David" wrote:
> I just got around to looking at Hawke's version of TruScribble, and noticed
> that he made many of the mistakes that I documented in my prior post.
*blush*
and what's _really_ funny is that i -did- read that particular
post, and (really!) meant to incorporate those mistake solutions...
personally... i think doing the following is 'cleaner' than
using and_bits... i never found reading code using those functions
to be 'easy to digest'...

if    event = MOVE then
      blahblahblah
elsif event = LEFT_UP        or    --is there a left_up   at all?
      event = MOVE+LEFT_UP   then
      blahblahblah
elsif event = LEFT_DOWN      or    --is there a left_down at all?
      event = MOVE+LEFT_DOWN then
      blahblahblah
end if

i dunno, just seems easier to read to me...
you can see exactly what the coder is 'thinking'...

either solution of course is fine, as long as
one of them is actually *implemented* :)

>Of course, he could always rewrite TruMouse to return the
>mouse events as *seperate* events, like I did in the WinLib
>library I wrote for my version of Scribble.
i don't remember the contents of that post... however,
i'm assuming that your suggestion to change TruMouse
to return individual events would mean a sequence returned
from get_mouse that was always the same length that had a
location for each event, or, naturally, an atom -1 if nuffin
happened as defined by mouse_events.

like:
constant
        MOVE       = 1,
        LEFT_UP    = 2,
        LEFT_DOWN  = 3,
        MIDDLE_UP  = 4,
        MIDDLE_DOWN= 5,
        RIGHT_UP   = 6,
        RIGHT_DOWN = 7,
        MOUSE_X    = 8,
        MOUSE_Y    = 9
object mouse

mouse_events({MOVE,LEFT_DOWN,RIGHT_DOWN}) --note adjusted syntax

if mouse then became {1,0,1,0,0,0,0,251,109}
you would have a MOVE+LEFT_DOWN situation at 251,109?
you would ask questions like:
  if    mouse[LEFT_DOWN]  then --do some action
  elsif mouse[RIGHT_DOWN] then --context menu?
  elsif mouse[MOVE]       then --some sort of 'mouseover' action?
and you wouldn't have to worry about missing any
events, wouldn't need to use and_bits, and wouldn't
have real complex if/elsif/endif statments???

Is this what you meant?

if so, it is easily implementable (i say that -now- ;)
and i would be happy to do so if the consensus of users
of TruMouse desired that... i might do it anyway, cuz
i think i like it better myself anyway... it does make
'clean' reading code, i think...

thanks for noticing that tho... mistakes like that are
so easy to make, and so hard to spot/debug... mebbe I
won't make it again now :)

onwards--Hawke'

new topic     » goto parent     » topic index » view message » categorize

4. Re: Silly Scribble Program

Hawke' wrote:

> however, i'm assuming that your suggestion to
> change TruMouse to return individual events would
> mean a sequence returned ...

That's essentially the same as and_bits, with more overhead.

Look at the way that you wrote your code; I think that's how people would
prefer the mouse to behave - complex mouse events are broken down into
*seperate* events. So MOVE by itself returns:

        first poll: { MOVE, x, y }

But LEFT_DOWN+RIGHT_UP, requires two calls to get_mouse() to get all the
information:

        { LEFT_DOWN, x, y }
        { RIGHT_UP, x, y }

With a mouse event such as MOVE+LEFT_UP+RIGHT_DOWN, the MOVE is redundant,
and can be simplified to two seperate polls (XXX_UP events are returned
first):

        { LEFT_UP, x, y }
        { RIGHT_DOWN, x, y }

There's one more feature: the mouse code keeps track of the state of the
mouse, and the state of the user's knowledge. So if a LEFT_UP occurs while
the user is busy painting the screen, the get_mouse() routine would realize
the states are out of sync, and return:

        { LEFT_UP, x, y }

on the next poll. That way, the user doesn't have to worry about missing
mouse events, or have to maintain a complex state machine for the mouse. It
seems to work just fine in Dos32Lib.

-- David Cuny

new topic     » goto parent     » topic index » view message » categorize

Search



Quick Links

User menu

Not signed in.

Misc Menu