Philipp Hörist pushed to branch master at gajim / gajim
Commits: 2e3b3d64 by lovetox at 2020-08-29T21:25:50+02:00 Remove unused import
- - - - - 9c256c42 by lovetox at 2020-08-29T21:34:10+02:00 ChatControlBase: Move textview calls into TextView classes
- - - - - 79c5f872 by lovetox at 2020-08-29T21:37:07+02:00 ChatControlBase: Use correct signal names
_ works only because of compat code
- - - - - 59db443a by lovetox at 2020-08-29T22:01:25+02:00 ChatControlBase: Simplify shutdown
- - - - - 32d3c3cd by lovetox at 2020-08-29T23:27:39+02:00 ChatControlBase: Move connecting handlers into .ui file
- - - - - 42953fb1 by lovetox at 2020-08-29T23:34:06+02:00 Fix typo
- - - - - acbce41f by lovetox at 2020-08-29T23:34:32+02:00 Add debug helper methods
- - - - -
9 changed files:
- gajim/chat_control.py - gajim/chat_control_base.py - gajim/conversation_textview.py - gajim/data/gui/chat_control.ui - gajim/groupchat_control.py - gajim/gtk/htmltextview.py - gajim/gtk/message_input.py - gajim/gtk/util.py - gajim/message_window.py
Changes:
===================================== gajim/chat_control.py ===================================== @@ -1104,16 +1104,7 @@ class ChatControl(ChatControlBase): self.account, force=True, backend=backend) - # remove all register handlers on widgets, created by self.xml - # to prevent circular references among objects - for i in list(self.handlers.keys()): - if self.handlers[i].handler_is_connected(i): - self.handlers[i].disconnect(i) - del self.handlers[i] - self.conv_textview.del_handlers() - self.msg_textview.destroy() - # PluginSystem: calling shutdown of super class (ChatControlBase) to let - # it remove it's GUI extension points + super(ChatControl, self).shutdown()
def minimizable(self):
===================================== gajim/chat_control_base.py ===================================== @@ -33,7 +33,6 @@ from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GLib from gi.repository import Gio -from gi.repository import GObject
from gajim.common import events from gajim.common import app @@ -136,19 +135,6 @@ class ChatControlBase(ChatCommandProcessor, CommandTools, EventHelper): self.xml.connect_signals(self) self.widget = self.xml.get_object('%s_hbox' % widget_name)
- if not self._type.is_groupchat: - # Create banner and connect signals - id_ = self.xml.banner_eventbox.connect( - 'button-press-event', - self._on_banner_eventbox_button_press_event) - self.handlers[id_] = self.xml.banner_eventbox - - if self.xml.banner_label is not None: - id_ = self.xml.banner_label.connect( - 'populate_popup', - self.on_banner_label_populate_popup) - self.handlers[id_] = self.xml.banner_label - self._accounts = app.get_enabled_accounts_with_labels() if len(self._accounts) > 1: account_badge = generate_account_badge(self.account) @@ -174,15 +160,6 @@ class ChatControlBase(ChatCommandProcessor, CommandTools, EventHelper): Gtk.TargetFlags.SAME_APP, 0)]
- id_ = self.xml.overlay.connect('drag_data_received', - self._on_drag_data_received) - - self.handlers[id_] = self.xml.overlay - id_ = self.xml.overlay.connect('drag_motion', self._on_drag_motion) - self.handlers[id_] = self.xml.overlay - id_ = self.xml.overlay.connect('drag_leave', self._on_drag_leave) - self.handlers[id_] = self.xml.overlay - self.xml.overlay.drag_dest_set( Gtk.DestDefaults.ALL, self._dnd_list, @@ -191,47 +168,36 @@ class ChatControlBase(ChatCommandProcessor, CommandTools, EventHelper):
# Create textviews and connect signals self.conv_textview = ConversationTextview(self.account) - self.conv_textview.tv.drag_dest_unset() + id_ = self.conv_textview.connect('quote', self.on_quote) - self.handlers[id_] = self.conv_textview.tv + self.handlers[id_] = self.conv_textview
self.conv_textview.tv.connect('key-press-event', self._on_conv_textview_key_press_event)
- self.conv_scrolledwindow = self.xml.conversation_scrolledwindow - self.conv_scrolledwindow.add(self.conv_textview.tv) - widget = self.conv_scrolledwindow.get_vadjustment() - id_ = widget.connect('changed', - self.on_conversation_vadjustment_changed) - self.handlers[id_] = widget + self.xml.conversation_scrolledwindow.add(self.conv_textview.tv) + widget = self.xml.conversation_scrolledwindow.get_vadjustment() + widget.connect('changed', self.on_conversation_vadjustment_changed)
- vscrollbar = self.conv_scrolledwindow.get_vscrollbar() - id_ = vscrollbar.connect('button-release-event', - self._on_scrollbar_button_release) - self.handlers[id_] = vscrollbar + vscrollbar = self.xml.conversation_scrolledwindow.get_vscrollbar() + vscrollbar.connect('button-release-event', + self._on_scrollbar_button_release)
- self.correcting = False - self.last_sent_msg = None - - # add MessageInputTextView to UI and connect signals self.msg_textview = MessageInputTextView() - self.msg_textview.drag_dest_unset() + self.msg_textview.connect('paste-clipboard', + self._on_message_textview_paste_event) + self.msg_textview.connect('key-press-event', + self._on_message_textview_key_press_event) + self.msg_textview.connect('populate-popup', + self.on_msg_textview_populate_popup) + self.msg_textview.connect('text-changed', + self._on_message_tv_buffer_changed) + self.msg_scrolledwindow = ScrolledWindow() self.msg_scrolledwindow.add(self.msg_textview)
self.xml.hbox.pack_start(self.msg_scrolledwindow, True, True, 0)
- id_ = self.msg_textview.connect('paste-clipboard', - self._on_message_textview_paste_event) - self.handlers[id_] = self.msg_textview - id_ = self.msg_textview.connect( - 'key_press_event', - self._on_message_textview_key_press_event) - self.handlers[id_] = self.msg_textview - id_ = self.msg_textview.connect('populate_popup', - self.on_msg_textview_populate_popup) - self.handlers[id_] = self.msg_textview - # the following vars are used to keep history of user's messages self.sent_history = [] self.sent_history_pos = 0 @@ -239,6 +205,9 @@ class ChatControlBase(ChatCommandProcessor, CommandTools, EventHelper): self.received_history_pos = 0 self.orig_msg = None
+ self.correcting = False + self.last_sent_msg = None + self.set_emoticon_popover()
# Attach speller @@ -256,9 +225,6 @@ class ChatControlBase(ChatCommandProcessor, CommandTools, EventHelper): con = app.connections[self.account] con.get_module('Chatstate').set_active(self.contact)
- id_ = self.msg_textview.connect('text-changed', - self._on_message_tv_buffer_changed) - self.handlers[id_] = self.msg_textview if parent_win is not None: id_ = parent_win.window.connect('motion-notify-event', self._on_window_motion_notify) @@ -301,7 +267,7 @@ class ChatControlBase(ChatCommandProcessor, CommandTools, EventHelper): if textview.get_buffer().props.has_selection: return Gdk.EVENT_PROPAGATE
- # Focus the Messsage Input and resend the event + # Focus the Message Input and resend the event textview.unselect() self.msg_textview.grab_focus() self.msg_textview.get_toplevel().propagate_key_event(event) @@ -684,6 +650,21 @@ class ChatControlBase(ChatCommandProcessor, CommandTools, EventHelper): menu.show_all()
def shutdown(self): + for i in list(self.handlers.keys()): + if self.handlers[i].handler_is_connected(i): + self.handlers[i].disconnect(i) + self.handlers.clear() + + self.conv_textview.del_handlers() + del self.conv_textview + del self.msg_textview + del self.msg_scrolledwindow + + self.widget.destroy() + del self.widget + + del self.xml + # PluginSystem: removing GUI extension points # connected with ChatControlBase instance object app.plugin_manager.remove_gui_extension_point('chat_control_base', self) @@ -1441,7 +1422,7 @@ class ChatControlBase(ChatCommandProcessor, CommandTools, EventHelper): if direction != Gdk.ScrollDirection.UP: return # Check if we have a Scrollbar - adjustment = self.conv_scrolledwindow.get_vadjustment() + adjustment = self.xml.conversation_scrolledwindow.get_vadjustment() if adjustment.get_upper() != adjustment.get_page_size(): app.log('autoscroll').info('Autoscroll disabled') self.conv_textview.autoscroll = False
===================================== gajim/conversation_textview.py ===================================== @@ -100,14 +100,6 @@ class ConversationTextview(GObject.GObject): self.tv = HtmlTextView(account) self.tv.connect('query-tooltip', self._query_tooltip)
- # set properties - self.tv.set_border_width(1) - self.tv.set_accepts_tab(True) - self.tv.set_editable(False) - self.tv.set_cursor_visible(False) - self.tv.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) - self.tv.set_left_margin(2) - self.tv.set_right_margin(2) self._buffer = self.tv.get_buffer() self.handlers = {} self.image_cache = {}
===================================== gajim/data/gui/chat_control.ui ===================================== @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.36.0 --> +<!-- Generated with glade 3.22.2 --> <interface> <requires lib="gtk+" version="3.22"/> <object class="GtkAdjustment" id="adjustment1"> @@ -398,6 +398,9 @@ <object class="GtkOverlay" id="overlay"> <property name="visible">True</property> <property name="can_focus">False</property> + <signal name="drag-data-received" handler="_on_drag_data_received" swapped="no"/> + <signal name="drag-leave" handler="_on_drag_leave" swapped="no"/> + <signal name="drag-motion" handler="_on_drag_motion" swapped="no"/> <child> <object class="GtkPaned" id="paned1"> <property name="visible">True</property> @@ -412,6 +415,7 @@ <property name="name">ChatControl-BannerEventBox</property> <property name="can_focus">False</property> <property name="no_show_all">True</property> + <signal name="button-press-event" handler="_on_banner_eventbox_button_press_event" swapped="no"/> <child> <object class="GtkBox"> <property name="visible">True</property>
===================================== gajim/groupchat_control.py ===================================== @@ -1638,9 +1638,6 @@ class GroupchatControl(ChatControlBase): app.connections[self.account].get_module('MUC').leave( self.room_jid, reason=reason)
- # PluginSystem: calling shutdown of super class (ChatControlBase) - # to let it remove it's GUI extension points - super(GroupchatControl, self).shutdown() # PluginSystem: removing GUI extension points connected with # GrouphatControl instance object app.plugin_manager.remove_gui_extension_point( @@ -1668,15 +1665,11 @@ class GroupchatControl(ChatControlBase): self.roster.destroy() self.roster = None
- # remove all register handlers on wigets, created by self.xml - # to prevent circular references among objects - for i in list(self.handlers.keys()): - if self.handlers[i].handler_is_connected(i): - self.handlers[i].disconnect(i) - del self.handlers[i] # Remove unread events from systray app.events.remove_events(self.account, self.room_jid)
+ super(GroupchatControl, self).shutdown() + def safe_shutdown(self): if self.minimizable(): return True
===================================== gajim/gtk/htmltextview.py ===================================== @@ -703,9 +703,18 @@ class HtmlTextView(Gtk.TextView):
def __init__(self, account, standalone=False): Gtk.TextView.__init__(self) - self.set_wrap_mode(Gtk.WrapMode.CHAR) - self.set_editable(False) + self.set_has_tooltip(True) + self.set_border_width(1) + self.set_accepts_tab(True) + self.set_editable(False) + self.set_cursor_visible(False) + self.set_wrap_mode(Gtk.WrapMode.WORD_CHAR) + self.set_left_margin(2) + self.set_right_margin(2) + + self.drag_dest_unset() + self.connect('copy-clipboard', self._on_copy_clipboard) self.get_buffer().eol_tag = self.get_buffer().create_tag('eol')
===================================== gajim/gtk/message_input.py ===================================== @@ -61,6 +61,8 @@ class MessageInputTextView(Gtk.TextView): self.set_pixels_below_lines(2) self.get_style_context().add_class('gajim-conversation-font')
+ self.drag_dest_unset() + # set undo list self.undo_list = [] # needed to know if we undid something
===================================== gajim/gtk/util.py ===================================== @@ -21,6 +21,7 @@ from typing import Tuple from typing import Optional
import sys +import weakref import logging import textwrap from importlib import import_module @@ -811,3 +812,13 @@ class EventHelper(CommonEventHelper):
def __on_destroy(self, *args): self.unregister_events() + + +def check_destroy(widget): + def _destroy(*args): + print('DESTROYED', args) + widget.connect('destroy', _destroy) + + +def check_finalize(obj, name): + weakref.finalize(obj, print, f'{name} has been finalized')
===================================== gajim/message_window.py ===================================== @@ -561,10 +561,6 @@ class MessageWindow(EventHelper): ask any confirmation """ def close(ctrl): - if reason is not None: # We are leaving gc with a status message - ctrl.shutdown(reason) - else: # We are leaving gc without status message or it's a chat - ctrl.shutdown() # Update external state app.events.remove_events( ctrl.account, ctrl.get_full_jid, @@ -588,6 +584,11 @@ class MessageWindow(EventHelper): if not self._controls[ctrl.account]: del self._controls[ctrl.account]
+ if reason is not None: # We are leaving gc with a status message + ctrl.shutdown(reason) + else: # We are leaving gc without status message or it's a chat + ctrl.shutdown() + self.check_tabs() self.show_title()
View it on GitLab: https://dev.gajim.org/gajim/gajim/-/compare/cd9150b8a919e83868a2724a16d32148...