Prevent callbacks on destroyed objects

Fixes #9560
This commit is contained in:
Philipp Hörist 2019-01-26 21:25:33 +01:00
parent e994b8f402
commit d6b7916f2b
2 changed files with 23 additions and 0 deletions

View File

@ -15,6 +15,7 @@
import logging import logging
import nbxmpp import nbxmpp
from gi.repository import Gdk
from gi.repository import Gtk from gi.repository import Gtk
from gajim.common import app from gajim.common import app
@ -25,6 +26,7 @@ from gajim.common.caps_cache import muc_caps_cache
from gajim.gtk.dialogs import ErrorDialog from gajim.gtk.dialogs import ErrorDialog
from gajim.gtk.dataform import DataFormWidget from gajim.gtk.dataform import DataFormWidget
from gajim.gtk.util import get_builder from gajim.gtk.util import get_builder
from gajim.gtk.util import ensure_not_destroyed
log = logging.getLogger('gajim.gtk.groupchat_config') log = logging.getLogger('gajim.gtk.groupchat_config')
@ -36,6 +38,7 @@ class GroupchatConfig(Gtk.ApplicationWindow):
self.set_position(Gtk.WindowPosition.CENTER) self.set_position(Gtk.WindowPosition.CENTER)
self.set_show_menubar(False) self.set_show_menubar(False)
self.set_title(_('Group Chat Configuration')) self.set_title(_('Group Chat Configuration'))
self._destroyed = False
self.account = account self.account = account
self.jid = jid self.jid = jid
@ -77,6 +80,8 @@ class GroupchatConfig(Gtk.ApplicationWindow):
self._ui.connect_signals(self) self._ui.connect_signals(self)
self.connect('delete-event', self._cancel) self.connect('delete-event', self._cancel)
self.connect('destroy', self._on_destroy)
self.connect('key-press-event', self._on_key_press)
self.show_all() self.show_all()
self._ui.stack.notify('visible-child-name') self._ui.stack.notify('visible-child-name')
@ -291,6 +296,10 @@ class GroupchatConfig(Gtk.ApplicationWindow):
return add, remove, modified return add, remove, modified
def _on_key_press(self, _widget, event):
if event.keyval == Gdk.KEY_Escape:
self._on_cancel()
def _on_cancel(self, *args): def _on_cancel(self, *args):
self._cancel() self._cancel()
self.destroy() self.destroy()
@ -300,6 +309,9 @@ class GroupchatConfig(Gtk.ApplicationWindow):
con = app.connections[self.account] con = app.connections[self.account]
con.get_module('MUC').cancel_config(self.jid) con.get_module('MUC').cancel_config(self.jid)
def _on_destroy(self, *args):
self._destroyed = True
def _set_affiliations(self): def _set_affiliations(self):
add, remove, modified = self._get_diff() add, remove, modified = self._get_diff()
@ -339,6 +351,7 @@ class GroupchatConfig(Gtk.ApplicationWindow):
con = app.connections[self.account] con = app.connections[self.account]
con.get_module('MUC').set_affiliation(self.jid, diff_dict) con.get_module('MUC').set_affiliation(self.jid, diff_dict)
@ensure_not_destroyed
def _on_affiliations_received(self, result): def _on_affiliations_received(self, result):
if result.is_error: if result.is_error:
log.info('Error while requesting %s affiliations: %s', log.info('Error while requesting %s affiliations: %s',

View File

@ -25,6 +25,7 @@ import sys
import logging import logging
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
from pathlib import Path from pathlib import Path
from functools import wraps
from gi.repository import Gdk from gi.repository import Gdk
from gi.repository import Gtk from gi.repository import Gtk
@ -489,3 +490,12 @@ def get_hardware_key_codes(keyval):
if not valid: if not valid:
return [] return []
return [key.keycode for key in key_map_keys] return [key.keycode for key in key_map_keys]
def ensure_not_destroyed(func):
@wraps(func)
def func_wrapper(self, *args, **kwargs):
if self._destroyed:
return
return func(self, *args, **kwargs)
return func_wrapper