Не удается получить события NSMouseMoved из nextEventMatchingMask с NSOpenGLView - PullRequest
0 голосов
/ 23 ноября 2011

Я пытаюсь создать базовое окно opengl с помощью мыши, используя типичный цикл событий в стиле win.Проблема в том, что я дергаю себя за волосы, пытаясь сгенерировать событие NSMouseMoved.Следующий код выводит отладочную информацию для Mouse Up, Mouse Down, Mouse Drag и т. Д., Но не Mouse Move, хотя я сказал окну setAcceptsMouseMovedEvents:YES.Итак, есть какие-нибудь идеи о том, как заставить мышь работать в следующем примере?

Очевидно, способ создания окна очень не похож на какао, но я пытаюсь портировать makefile-основанная на Windows c ++ кодовая база, которая делает некоторые сложные вещи.Вот почему я придерживаюсь стиля, похожего на цикл win32, используя GetMsg().

Кроме того, для сборки я просто использую:

gcc -o hellogl hellogl.m -framework Foundation -framework Cocoa -framework OpenGL

Спасибо за помощь!

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>

#include <OpenGL/gl.h>
#include <stdlib.h>

@interface BaseWinDelegate : NSWindow<NSWindowDelegate>

@end

@implementation BaseWinDelegate
- (void) windowWillClose:(NSNotification*)notification
{
    printf("Closing.\n");

    NSEvent * evt = [NSEvent otherEventWithType:NSApplicationDefined
                     location: NSMakePoint(0,0)
                     modifierFlags: 0
                     timestamp: 0.0
                     windowNumber: 0
                     context: nil
                     subtype: 0
                     data1: 0
                     data2: 0];

    [NSApp postEvent:evt atStart:NO];
}
@end

@interface BaseView : NSOpenGLView
- (void) update;
- (void) drawRect:(NSRect)rect;
- (void) reshape;
@end

@implementation BaseView

- (void) drawRect:(NSRect)rect
{
    glClearColor(0.2f,0.2f,0.2f,0.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    [[self openGLContext] flushBuffer];
}

- (void) update
{
    printf("Update.\n");
}

- (void) reshape
{
    NSRect rect;

    [[self openGLContext] update];
    rect = [self bounds];

    printf("Reshape - %f, %f\n", rect.size.width,rect.size.height);
}

@end

int main(int argc, const char * argv[])
{
    printf("Starting.\n");

    NSAutoreleasePool * myPool = [[NSAutoreleasePool alloc] init ];
    NSApplicationLoad();

    NSRect rect = NSMakeRect(100,100,640,480);
    NSWindow * win = [[NSWindow alloc] initWithContentRect:rect
                        styleMask:NSTitledWindowMask |     NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask
                        backing: NSBackingStoreBuffered
                        defer: NO];

    NSOpenGLPixelFormatAttribute attributes[] =
    {
        NSOpenGLPFADoubleBuffer,
        0
    };

    NSOpenGLPixelFormat* pf = [[NSOpenGLPixelFormat alloc]     initWithAttributes:attributes];

    BaseView * pView = [[BaseView alloc] initWithFrame:rect pixelFormat:pf];
        BaseWinDelegate * myDelegate = [BaseWinDelegate alloc];

    [win setDelegate:myDelegate];
    [win setContentView: pView];
    [win makeKeyAndOrderFront: NSApp];
    [win setAcceptsMouseMovedEvents:YES];

    do
    {
        NSEvent * evt = [NSApp nextEventMatchingMask : NSAnyEventMask
                               untilDate : [NSDate distantFuture]
                               inMode : NSDefaultRunLoopMode
                               dequeue : YES ];

        NSEventType evtType = [evt type];

        if (evtType == NSApplicationDefined)
        {
            break;
        }

        printf("%d\n",(int)evtType);
        [NSApp sendEvent : evt];
    } while (1);

    [myPool drain];
    return EXIT_SUCCESS;
}

1 Ответ

1 голос
/ 29 ноября 2011

Хорошо, разобрался. Проблема в том, что это не процесс переднего плана. Таким образом, добавление этого кода исправляет это.

ProcessSerialNumber psn;
GetCurrentProcess(&psn);
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
SetFrontProcess(&psn);

Это препятствовало тому, чтобы окно становилось ключевым, и отправляло события перемещения мыши. Надеюсь, что это поможет кому-то еще (т. Е. 0,1% людей, которым нравится обрабатывать свой собственный цикл событий).

...