Current mouse screen?

  • Hi,

    let's get back from what user can or can't do to Cocoa ;)

    Anybody knows how to find the screen the mouse is currently on? The
    position is easy ([NSEvent mousePosition]), but I did not succeed to
    find the screen...

    TIA,
    ---
    Ondra Hada
    OCSoftware:    <ocs...>              http://www.ocs.cz
    private        <ondra...>            http://www.ocs.cz/oc

    [demime 0.98b removed an attachment of type application/pkcs7-signature which had a name of smime.p7s]
    _______________________________________________
    cocoa-dev mailing list | <cocoa-dev...>
    Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
    Do not post admin requests to the list. They will be ignored.
  • On Apr 17, 2004, at 10:16 AM, Ondra Cada wrote:

    > Anybody knows how to find the screen the mouse is currently on? The
    > position is easy ([NSEvent mousePosition]), but I did not succeed to
    > find the screen...

    NSPoint mouseLoc = [NSEvent mouseLocation];
    NSEnumerator *screenEnum = [[NSScreen screens] objectEnumerator];
    NSScreen screen;
    while ((screen = [screenEnum nextObject]) && !NSMouseInRect(mouseLoc,
    [screen frame], NO));

    Usual disclaimers apply; written in Mail.app.
    --
    Shaun Wexler
    MacFOH
    http://www.macfoh.com
    _______________________________________________
    cocoa-dev mailing list | <cocoa-dev...>
    Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
    Do not post admin requests to the list. They will be ignored.
  • At 10:51 Uhr -0700 17.04.2004, Shaun Wexler wrote:
    > On Apr 17, 2004, at 10:16 AM, Ondra Cada wrote:
    >
    >> Anybody knows how to find the screen the mouse is currently on? The
    >> position is easy ([NSEvent mousePosition]), but I did not succeed to
    >> find the screen...
    >
    > NSPoint mouseLoc = [NSEvent mouseLocation];
    > NSEnumerator *screenEnum = [[NSScreen screens] objectEnumerator];
    > NSScreen screen;
    > while ((screen = [screenEnum nextObject]) &&
    > !NSMouseInRect(mouseLoc, [screen frame], NO));
    >
    > Usual disclaimers apply; written in Mail.app.

      That should be NSPointInRect() instead of NSMouseInRect(), AFAIK.
    --
    Cheers,
    M. Uli Kusterer
    ------------------------------------------------------------
            "The Witnesses of TeachText are everywhere..."
                        http://www.zathras.de
    _______________________________________________
    cocoa-dev mailing list | <cocoa-dev...>
    Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
    Do not post admin requests to the list. They will be ignored.
  • On Apr 18, 2004, at 2:42 AM, M. Uli Kusterer wrote:

    > At 10:51 Uhr -0700 17.04.2004, Shaun Wexler wrote:
    >> On Apr 17, 2004, at 10:16 AM, Ondra Cada wrote:
    >>
    >>> Anybody knows how to find the screen the mouse is currently on? The
    >>> position is easy ([NSEvent mousePosition]), but I did not succeed to
    >>> find the screen...
    >>
    >> NSPoint mouseLoc = [NSEvent mouseLocation];
    >> NSEnumerator *screenEnum = [[NSScreen screens] objectEnumerator];
    >> NSScreen screen;
    >> while ((screen = [screenEnum nextObject]) && !NSMouseInRect(mouseLoc,
    >> [screen frame], NO));
    >>
    >> Usual disclaimers apply; written in Mail.app.
    >
    > That should be NSPointInRect() instead of NSMouseInRect(), AFAIK.

    Actually, NSMouseInRect() still exists..  It accounts for flipped
    coordinate spaces, which NSPointInRect() doesn't.

    -jcr
    _______________________________________________
    cocoa-dev mailing list | <cocoa-dev...>
    Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
    Do not post admin requests to the list. They will be ignored.
  • Hello...

    John Randolph wrote:
    > On Apr 18, 2004, at 2:42 AM, M. Uli Kusterer wrote:
    ...
    >> That should be NSPointInRect() instead of NSMouseInRect(), AFAIK.
    >
    > Actually, NSMouseInRect() still exists..  It accounts for flipped
    > coordinate spaces, which NSPointInRect() doesn't.
    >
    > -jcr

    This is something which makes absolutely no sense to me (and in fact
    is one of the documentation bugs that has been on my bug reporting to
    do list for awhile). In terms of the way NSRect is defined and used
    in Cocoa, isn't it physically impossible for a specific point and a
    specific rect within the same two dimensional coordinate system to
    have a different relationship depending on whether the view is
    flipped or unflipped?

    If the view is unflipped, the origin of the view is at the bottom
    left corner. Likewise, the origin of an NSRect in this coordinate
    system is at the bottom left, and the rectangle extends upward and to
    the right. By definition, the point {170.0,90.0) is inside the rect
    {{50.0,50.0}.{250.0,100.0}}.

    If the view is flipped, the origin of the view is at the top left
    corner. Likewise, the origin of an NSRect in this view's coordinate
    system is at the top right, and the rectangle extends downward and to
    the right. Again, the point {170.0,90.0) is inside the rect
    {{50.0,50.0}.{250.0,100.0}}.

    If you don't believe me, or prefer a visual example, try the
    following code in a test app:

    - - - - - - - - - - - - - - - - - - - - - - - - -
    @interface TestView : NSView {}
    @end

    @implementation TestView

    - (BOOL)isFlipped {return FALSE;}

    - (void)drawRect:(NSRect)rect
    // Drawing code here.
    {
        [[NSColor whiteColor] set];
        NSRectFill([self bounds]);

    // rect
        NSRect filled = NSMakeRect(50.0f,50.0f,250.0f,100.0f);
        [[NSColor greenColor] set];
        NSRectFill(filled);

    // origin
        filled = NSMakeRect(50.0f,50.0f,10.0f,10.0f);
        [[NSColor redColor] set];
        NSRectFill(filled);

    // point
    filled = NSMakeRect(170.0f,90.0f,10.0f,10.0f);
        [[NSColor blueColor] set];
        NSRectFill(filled);
    }

    @end

    @interface FlippedTestView : TestView {}
    @end

    @implementation FlippedTestView

    - (BOOL)isFlipped {return TRUE;}

    @end
    - - - - - - - - - - - - - - - - - - - -- - - - -

    In InterfaceBuilder, in the main window, add two NSView "custom
    views" next to each other and make one an instance of TestView and
    the other an instance of FlippedTestView. When the app is run, the
    blue dot will be inside the green rect, in both views.

    In fact, all three implementations that "deal" with this issue return
    identical results for a particular point, regardless of which
    function/method is used and whether the view is flipped or the value
    of the equivalent argument is TRUE/FALSE.

    For example:

    Given:
    NSPoint point01 = {170.0f,90.0f};
    NSPoint point02 = {75.0f,45.0f};
    NSRect rect = {{50.0f,50.0f},{250.0f,100.0f}};
    TestView *aTestView; /* as implemented above in example, unflipped */
    FlippedTestView *aFlippedTestView; /* as implemented above, flipped */

    Tests:
    NSPointInRect(point01,rect) returns TRUE
    NSMouseInRect(point01,rect,TRUE) returns TRUE /*isFlipped*/
    NSMouseInRect(point01,rect,FALSE) returns TRUE /*not Flipped*/
    [aTestView mouse:point01 inRect:rect] returns TRUE /*not Flipped*/
    [aFlippedTestView mouse:point01 inRect:rect] returns TRUE /*isFlipped*/

    NSPointInRect(point02,rect) returns FALSE
    NSMouseInRect(point02,rect,TRUE) returns FALSE /*isFlipped*/
    NSMouseInRect(point02,rect,FALSE) returns FALSE /*not Flipped*/
    [aTestView mouse:point02 inRect:rect] returns FALSE /*not Flipped*/
    [aFlippedTestView mouse:point02 inRect:rect] returns FALSE
    /*isFlipped*/

    It might make sense that different methods would be needed if the
    point and the rect were supposed to be in different coordinate
    systems (for example if the mouse point was assumed to be in screen
    or window coordinates), but the NSView method mouse:inRect: is
    specifically documented as requiring both the NSPoint and NSRect to
    be in the view's coordinate system, and the two functions obviously
    make the same assumption since otherwise the arguments wouldn't
    provide enough information to determine the answer.

    So this whole issue of needing to know if the view uses a flipped
    coordinate system to determine if a given point is inside a given
    rect would definitely seem to be some sort of urban legend? Maybe it
    was some kind of legacy functionality, where at some point the
    definition of NSRect was different and was always defined with the
    origin in the bottom left regardless of the view's coordinate system?

    Or maybe it's just me :) If anyone knows the answer, I'd appreciate
    it if you would explain it, since this is something that lots of
    people seem to quote, but has never made any sense at all to me.

    Anyway, since I already ended up spending the time to write all this,
    I've gone ahead and filed a bug with this info (bug# 3627693).

    Louis
    _______________________________________________
    cocoa-dev mailing list | <cocoa-dev...>
    Help/Unsubscribe/Archives: http://www.lists.apple.com/mailman/listinfo/cocoa-dev
    Do not post admin requests to the list. They will be ignored.
previous month april 2004 next month
MTWTFSS
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
Go to today