• Show log

    Commit

  • Hash : 704d9bd3
    Author : Sam Lantinga
    Date : 2014-06-25T02:08:37

    Fixed bug 2525 - Keyboard focus crash
    
    Todd Seiler
    
    Call Stack:
    #0  0x0000000101c29291 in Cocoa_StartTextInput at /Users/Todd/Desktop/codes/sources/SDL/src/video/cocoa/SDL_cocoakeyboard.m:512
    #1  0x0000000101c110c5 in SDL_SetKeyboardFocus at /Users/Todd/Desktop/codes/sources/SDL/src/events/SDL_keyboard.c:643
    #2  0x0000000101c32be4 in SetupWindowData at /Users/Todd/Desktop/codes/sources/SDL/src/video/cocoa/SDL_cocoawindow.m:981
    #3  0x0000000101c32d2a in Cocoa_CreateWindowFrom at /Users/Todd/Desktop/codes/sources/SDL/src/video/cocoa/SDL_cocoawindow.m:1092
    #4  0x0000000101c99999 in SDL_CreateWindowFrom_REAL at /Users/Todd/Desktop/codes/sources/SDL/src/video/SDL_video.c:1338
    #5  0x0000000101ce1484 in SDL_CreateWindowFrom at /Users/Todd/Desktop/codes/sources/SDL/src/dynapi/SDL_dynapi_procs.h:547
    #6  0x0000000100018a5e in SceneRenderer at /Users/Todd/Desktop/codes/sources/tseiler_Todds-MacBook-Pro_3405/AppName/src/SceneRenderer.cpp:138
    #7  0x0000000100017ca5 in SceneRenderer at /Users/Todd/Desktop/codes/sources/tseiler_Todds-MacBook-Pro_3405/AppName/src/SceneRenderer.cpp:145
    #8  0x000000010000cd96 in App::execute(int, char**) at /Users/Todd/Desktop/codes/sources/tseiler_Todds-MacBook-Pro_3405/AppName/src/App.cpp:28
    #9  0x0000000100004402 in main at /Users/Todd/Desktop/codes/sources/tseiler_Todds-MacBook-Pro_3405/AppName/src/main.cpp:8
    
    
    This issue occurred when using Ogre3D Graphics engine on Mac (cocoa) to create the window. Then handing the window handle off to SDL_CreateWindowFrom().
    
    In Ogre3D application you do the following:
            window_ = root_->initialise(true, "Ogre Window 2");
            loadOgreResources();
            Ogre::WindowEventUtilities::addWindowEventListener(window_, this);
    
    #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE
            NSWindow* Data = 0;
            window_->getCustomAttribute("WINDOW", &Data);
            sdl_window_ = SDL_CreateWindowFrom((void*)Data);
    #endif
    
    It results in a crash in this function:
    SDL_cocoakeyboard.m
    
    void
    Cocoa_StartTextInput(_THIS)
    {
        SDL_VideoData *data = (SDL_VideoData *) _this->driverdata;
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        SDL_Window *window = SDL_GetKeyboardFocus();
        NSWindow *nswindow = nil;
        if (window)
            nswindow = ((SDL_WindowData*)window->driverdata)->nswindow;
    
        // ...
    }
    
    The crash occurred because "driverdata" was nil. Before this function call, a call to SetupWindowData is called:
    
    SDL_cocoawindow.m
    
    static int
    SetupWindowData(_THIS, SDL_Window * window, NSWindow *nswindow, SDL_bool created)
    {
        // ...
    
        if ([nswindow isKeyWindow]) {
            window->flags |= SDL_WINDOW_INPUT_FOCUS;
            SDL_SetKeyboardFocus(data->window);
        }
    
        /* Prevents the window's "window device" from being destroyed when it is
         * hidden. See http://www.mikeash.com/pyblog/nsopenglcontext-and-one-shot.html
         */
        [nswindow setOneShot:NO];
    
        /* All done! */
        [pool release];
        window->driverdata = data;
        return 0;
    }
    
    As you can see: "window->driverdata = data" is performed after the "SDL_SetKeyboardFocus()" call, which eventually leads to "Cocoa_StartTextInput()" where the crash occurs.
    

  • Properties

  • Git HTTP https://git.kmx.io/kc3-lang/SDL.git
    Git SSH git@git.kmx.io:kc3-lang/SDL.git
    Public access ? public
    Description

    Fork of https://github.com/libsdl-org/SDL

    Users
    thodg_m kc3_lang_org thodg_w thodg_l www_kmx_io thodg
    Tags

  • README.txt

  •                          Simple DirectMedia Layer
    
                                      (SDL)
    
                                    Version 2.0
    
    ---
    http://www.libsdl.org/
    
    Simple DirectMedia Layer is a cross-platform development library designed
    to provide low level access to audio, keyboard, mouse, joystick, and graphics
    hardware via OpenGL and Direct3D. It is used by video playback software,
    emulators, and popular games including Valve's award winning catalog
    and many Humble Bundle games.
    
    SDL officially supports Windows, Mac OS X, Linux, iOS, and Android.
    Support for other platforms may be found in the source code.
    
    SDL is written in C, works natively with C++, and there are bindings 
    available for several other languages, including C# and Python.
    
    This library is distributed under the zlib license, which can be found
    in the file "COPYING.txt".
    
    The best way to learn how to use SDL is to check out the header files in
    the "include" subdirectory and the programs in the "test" subdirectory.
    The header files and test programs are well commented and always up to date.
    More documentation and FAQs are available online at:
    	http://wiki.libsdl.org/
    
    If you need help with the library, or just want to discuss SDL related
    issues, you can join the developers mailing list:
    	http://www.libsdl.org/mailing-list.php
    
    If you want to report bugs or contribute patches, please submit them to
    bugzilla:
        http://bugzilla.libsdl.org/
    
    Enjoy!
    	Sam Lantinga				(slouken@libsdl.org)