<div dir="ltr"><div class="gmail_default" style><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">WMWindowManager.BufferWindow has a IsHit method (</span><a href="http://bbos.org/xref/WMWindowManager.Mod.html#WMWindowManager.BufferWindow.IsHit">http://bbos.org/xref/WMWindowManager.Mod.html#WMWindowManager.BufferWindow.IsHit</a>) that defines if the pointer is handled by the window. By default the alpha value 0 should still be handled by the window, maybe check that the value of pointerThreshold is 0 (<a href="http://bbos.org/xref/WMWindowManager.Mod.html#WMWindowManager.BufferWindow.pointerThreshold">http://bbos.org/xref/WMWindowManager.Mod.html#WMWindowManager.BufferWindow.pointerThreshold</a> ) If it is 0 and it is not handled by the window, we need to dig deeper. (Alternatively you could override IsHit and return TRUE, but that would only solve the problem and not explain what is wrong)</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Feb 1, 2015 at 9:15 PM, Yaroslav Romanchenko <span dir="ltr">&lt;<a href="mailto:tobject@bk.ru" target="_blank">tobject@bk.ru</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div><p>Hi guys,<br><br>I faced with some strange behaviour in A2.<br><br>After drawing 32-bit bitmap with alpha set to 0 into img field of WMWindowManager.BufferWindow instance, the window stops to handle mouse events.<br>I&#39;ve made small code based on WMScribble application to illustrate this.<br><br>Just open instance of window. Draw something. Window will work as expected. Then press &quot;b&quot; key. The precomputed picture will be drawn on img field. Then try to draw something using mouse... Now you should see that when mouse positioned on black parts of picture the cursor changed to cursor that currently set for underlaying window. Even mouse clicks handled by underlaying window. And after clicking the WMScribble losts focus! It looks like you may see the window, but, for system it absent.<br>Situation changes when you point mouse exactly on some yellow part of picture. The mouse pointer changes to cross-hair, window can receive mouse click again and drawing works also.<br>Is it known feature in A2 or a bug?<br><br><br><br><br><br><br><br>MODULE WMScribble;    (** AUTHOR &quot;TF&quot;; PURPOSE &quot;Example program&quot;; *)<br><br>IMPORT SYSTEM, Raster, WMWindowManager, Strings, WMGraphics, WMRectangles, Modules, WMDialogs;<br><br>CONST<br><br>    MAP =<br>        [<br>            [8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 4, 6, 4, 4, 6, 4, 6, 4, 4, 4, 6, 4],<br>            [8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4],<br>            [8, 0, 3, 3, 0, 0, 0, 0, 0, 8, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6],<br>            [8, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6],<br>            [8, 0, 3, 3, 0, 0, 0, 0, 0, 8, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4],<br>            [8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 4, 0, 0, 0, 0, 0, 6, 6, 6, 0, 6, 4, 6],<br>            [8, 8, 8, 8, 0, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 4, 4, 6, 0, 0, 0, 0, 0, 6],<br>            [7, 7, 7, 7, 0, 7, 7, 7, 7, 0, 8, 0, 8, 0, 8, 0, 8, 4, 0, 4, 0, 6, 0, 6],<br>            [7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 0, 8, 0, 8, 0, 8, 8, 6, 0, 0, 0, 0, 0, 6],<br>            [7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 6, 0, 0, 0, 0, 0, 4],<br>            [7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 6, 0, 6, 0, 6, 0, 6],<br>            [7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 0, 8, 0, 8, 0, 8, 8, 6, 4, 6, 0, 6, 6, 6],<br>            [7, 7, 7, 7, 0, 7, 7, 7, 7, 8, 8, 4, 0, 6, 8, 4, 8, 3, 3, 3, 0, 3, 3, 3],<br>            [2, 2, 2, 2, 0, 2, 2, 2, 2, 4, 6, 4, 0, 0, 6, 0, 6, 3, 0, 0, 0, 0, 0, 3],<br>            [2, 2, 0, 0, 0, 0, 0, 2, 2, 4, 0, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 3],<br>            [2, 0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 0, 4, 3, 0, 0, 0, 0, 0, 3],<br>            [1, 0, 0, 0, 0, 0, 0, 0, 1, 4, 4, 4, 4, 4, 6, 0, 6, 3, 3, 0, 0, 0, 3, 3],<br>            [2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 1, 2, 2, 2, 6, 6, 0, 0, 5, 0, 5, 0, 5],<br>            [2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 0, 5, 0, 5, 0, 0, 0, 5, 5],<br>            [2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 5, 0, 5, 0, 5, 0, 5, 0, 5],<br>            [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5],<br>            [2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 5, 0, 5, 0, 5, 0, 5, 0, 5],<br>            [2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 0, 5, 0, 5, 0, 0, 0, 5, 5],<br>            [2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5]<br>        ];<br>    <br>    MAP_HEIGHT = LEN(MAP, 0);<br>    MAP_WIDTH = LEN(MAP, 1);<br>    <br>    CELL_WIDTH    = 20;<br><br>TYPE<br>    ScribbleWindow = OBJECT (WMWindowManager.BufferWindow);<br>    VAR lx, ly : LONGINT;<br>    <br>        mode: Raster.Mode;<br><br>        PROCEDURE &amp;New*;<br>        BEGIN<br>            Init(nMapPixelsWidth, nMapPixelsHeight, FALSE);<br>            WMWindowManager.AddWindow(SELF, 200, 200);<br>            SetTitle(Strings.NewString(&quot;Scribble Example&quot;));<br>            SetIcon(WMGraphics.LoadImage(&quot;WMIcons.tar://WMScribble.png&quot;, TRUE));<br>            canvas.Fill(WMRectangles.MakeRect(0, 0, GetWidth(), GetHeight()), WMGraphics.White, WMGraphics.ModeCopy);<br>            Invalidate(WMRectangles.MakeRect(0, 0, GetWidth(), GetHeight()));<br>            SetPointerInfo(manager.pointerCrosshair)<br>        END New;<br><br>        PROCEDURE PointerMove(x, y : LONGINT; keys : SET);<br>        BEGIN<br>            IF 0 IN keys THEN canvas.Line(lx, ly, x, y, WMGraphics.Blue, WMGraphics.ModeSrcOverDst);<br>                Invalidate(<br>                    WMRectangles.MakeRect(Strings.Min(lx, x), Strings.Min(ly, y), Strings.Max(lx, x) + 1, Strings.Max(ly, y) + 1)<br>                )<br>             END;<br>            lx := x; ly := y<br>        END PointerMove;<br><br>        PROCEDURE PointerDown(x, y : LONGINT; keys : SET);<br>        BEGIN<br>            lx := x; ly := y;<br>            IF 2 IN keys THEN<br>                canvas.Fill(WMRectangles.MakeRect(0, 0, GetWidth(), GetHeight()), WMGraphics.White, WMGraphics.ModeCopy);<br>                Invalidate(WMRectangles.MakeRect(0, 0, GetWidth(), GetHeight()))<br>            END<br>        END PointerDown;<br><br>        PROCEDURE KeyEvent(ucs : LONGINT; flags : SET; keySym : LONGINT);<br>        VAR res, y: LONGINT; filename : ARRAY 128 OF CHAR;<br>        BEGIN<br>            IF ucs = ORD(&quot;s&quot;) THEN<br>                filename := &quot;scribble.bmp&quot;;<br>                IF WMDialogs.QueryString(&quot;Save as :&quot;, filename) = WMDialogs.ResOk THEN<br>                    WMGraphics.StoreImage(img, filename, res);<br>                    IF res # 0 THEN<br>                        WMDialogs.Error(&quot;Sorry&quot;, &quot;The image could not be stored. Try another file name.&quot;);<br>                    END<br>                END<br>            ELSIF ucs = ORD(&quot;b&quot;) THEN<br>                Raster.InitMode(mode, Raster.srcCopy);<br>                FOR y := 0 TO nMapPixelsHeight - 1 DO<br>                    Raster.PutPixels(img, 0, y, nMapPixelsWidth, Raster.BGRA8888,<br>                        bufMapPixels^, y * nMapPixelsWidth * 4, mode)<br>                END;<br>                Invalidate(WMRectangles.MakeRect(0, 0, GetWidth(), GetHeight()));<br>            END<br>        END KeyEvent;<br>    END ScribbleWindow;<br><br>VAR s : ScribbleWindow;<br><br>    bufMapPixels: POINTER TO ARRAY OF CHAR;<br>    nMapPixelsWidth, nMapPixelsHeight: LONGINT;<br><br>    PROCEDURE InitMapPixels;<br>    VAR<br>        x, y, tileX, tileY, x2, y2: LONGINT;<br>        pixelWall, pixelFloor: Raster.Pixel;<br>        bTop, bBottom, bLeft, bRight: BOOLEAN;<br>    BEGIN<br>        NEW(bufMapPixels, nMapPixelsWidth * nMapPixelsHeight * 4);<br>        pixelWall[Raster.r] := 080X;<br>        pixelWall[Raster.g] := 050X;<br>        pixelWall[Raster.b] := 0X;<br>        pixelWall[Raster.a] := 020X;<br>        pixelFloor[Raster.r] := 0X;<br>        pixelFloor[Raster.g] := 0X;<br>        pixelFloor[Raster.b] := 0X;<br>        pixelFloor[Raster.a] := 0X;<br>        (* draw border *)<br>        <br>        FOR y := 0 TO nMapPixelsHeight - 1 DO<br>            FOR x := 0 TO nMapPixelsWidth - 1 DO<br>                IF (x = 0) OR (x = nMapPixelsWidth - 1) OR<br>                    (y = 0) OR (y = nMapPixelsHeight - 1)<br>                THEN<br>                    SYSTEM.PUT32(SYSTEM.ADR(bufMapPixels^[0]) + nMapPixelsWidth * 4 * y + 4 * x,<br>                        SYSTEM.VAL(LONGINT, pixelWall))<br>                ELSE<br>                    SYSTEM.PUT32(SYSTEM.ADR(bufMapPixels^[0]) + nMapPixelsWidth * 4 * y + 4 * x,<br>                        SYSTEM.VAL(LONGINT, pixelFloor))<br>                END<br>            END<br>        END;<br>        <br>        tileY := 1;<br>        FOR y := 1 TO MAP_HEIGHT - 2 DO<br>            tileX := 1;<br>            FOR x := 1 TO MAP_WIDTH - 2 DO<br>                IF MAP[y, x] &gt; 0 THEN<br>                    bBottom := (y + 1 &lt;= MAP_HEIGHT - 2) &amp; (MAP[y + 1, x] = 0);<br>                    bTop := (y - 1 &gt;= 1) &amp; (MAP[y - 1, x] = 0);<br>                    bLeft := (x - 1 &gt;= 1) &amp; (MAP[y, x - 1] = 0);<br>                    bRight := (x + 1 &lt;= MAP_WIDTH - 2) &amp; (MAP[y, x + 1] = 0);<br>                    FOR y2 := 0 TO CELL_WIDTH - 1 DO<br>                        FOR x2 := 0 TO CELL_WIDTH - 1 DO<br>                            IF ((x2 = 0) &amp; bLeft) OR ((y2 = 0) &amp; bTop) OR<br>                                ((x2 = CELL_WIDTH - 1) &amp; bRight) OR<br>                                ((y2 = CELL_WIDTH - 1) &amp; bBottom) OR<br>                                ((x2 + y2) MOD 5 = 0)<br>                            THEN<br>                                SYSTEM.PUT32(SYSTEM.ADR(bufMapPixels^[0]) +<br>                                    nMapPixelsWidth * 4 * (tileY + y2) + 4 * (tileX + x2),<br>                                    SYSTEM.VAL(LONGINT, pixelWall))<br>                            END<br>                        END<br>                    END<br>                END;<br>                INC(tileX, CELL_WIDTH)<br>            END;<br>            INC(tileY, CELL_WIDTH)<br>        END<br>        <br>    END InitMapPixels;<br><br>PROCEDURE Open*;<br>BEGIN {EXCLUSIVE}<br>    IF s # NIL THEN s.Close END;<br>    nMapPixelsWidth := CELL_WIDTH * (MAP_WIDTH - 2) + 2;<br>    nMapPixelsHeight := CELL_WIDTH * (MAP_HEIGHT - 2) + 2;<br>    InitMapPixels;<br>    NEW(s);<br>END Open;<br><br>PROCEDURE Cleanup;<br>BEGIN<br>    IF s # NIL THEN s.Close END<br>END Cleanup;<br><br>BEGIN<br>    Modules.InstallTermHandler(Cleanup)<br>END WMScribble.<br><br>SystemTools.Free WMScribble ~<br>WMScribble.Open ~<br>WMPicView.Open scribble.bmp ~<br><br><br><br><br><br>---<br>Cheers, SAGE<br><a href="http://sage.com.ua/" target="_blank">http://sage.com.ua/</a></p></div>
<br>--<br>
<a href="mailto:Oberon@lists.inf.ethz.ch">Oberon@lists.inf.ethz.ch</a> mailing list for ETH Oberon and related systems<br>
<a href="https://lists.inf.ethz.ch/mailman/listinfo/oberon" target="_blank">https://lists.inf.ethz.ch/mailman/listinfo/oberon</a><br>
<br></blockquote></div><br></div>