Re: [gtk-osx-users] crash on maximize/unmaximize
- From: John Ralls <jralls ceridwen us>
- To: Allin Cottrell <cottrell wfu edu>
- Cc: "gtk-osx-users-list gnome org" <gtk-osx-users-list gnome org>
- Subject: Re: [gtk-osx-users] crash on maximize/unmaximize
- Date: Thu, 18 Feb 2016 11:08:58 -0800
On Feb 18, 2016, at 8:24 AM, Allin Cottrell <cottrell wfu edu> wrote:
On Fri, 12 Feb 2016, Miroslav Rajcic wrote:
This [see report below] sounds similar to the crashes reported to me by users of my app (I reported this
case on this list in January) where crashes happen only on El Capitan and are related to using app in full
screen or new split view.
It seems that El Capitan version changed something internally, because searching on the net finds many
similar issues.
For example Atom editor crashes:
https://github.com/atom/atom/issues/9692
https://github.com/atom/atom/issues/9584
I know Atom is not a GTK+ app, but I believe that the crashes are related.
The fix for these particular crashes in Atom are explained here:
https://github.com/atom/electron/pull/3588
Quote: "Since EL Capitan it is possible that the methods of delegate would get called after the window has
been closed."
Could something like this be a case for GTK+ code too?
Thanks, this sounds very plausible; it fits the facts that I have observed. My first resort here will be to
try to implement in GdkQuartzWindow.c the fix that the Atom guys came up with. That is, add a callback for
the windowWillClose signal that detaches the delegate.
I'm totally unfamiliar with Objective C and Apple APIs, but from looking at the Atom and GdkQuartz code it
seems that the callback should look like this:
- (void)windowWillClose:(NSNotification*)notification
{
NSWindow *nsw = get_the_window();
[nsw setDelegate:nil];
}
So my question is, what should the notional call "get_the_window()" actually look like? I see in
GdkQuartzWindow.c code to get the relevant GdkWindow in this sort of notification context, namely
GdkWindow *window = [[self contentView] gdkWindow];
and I also see in gdkwindow-quartz.c a function
gdk_quartz_window_get_nswindow(GdkWindow *window);
I guess one could chain these, but I suspect this would be more roundabout than need be. Is "self" already
the relevant NSWindow, by any chance, or is there a more direct way of getting it?
The GtkQuartzNSWindow is its own delegate, so [self setDelegate:nil] will do the job. It's probably the right
thing to do, too: If NSWindow's destructor releases the delegate and then whatever's calling it releases the
NSWindow that would be a double-free.
That's not going to do anything for exiting fullscreen, though. The problem shown by your crash report seems
to be that the GdkQuartzView's GdkWindow* member has gotten a bogus value and the crash is from trying to
dereference it.
Regards,
John Ralls
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]