Ticket #1041: gajim-message-mode.2.patch
| File gajim-message-mode.2.patch, 148.6 kB (added by David Danier <goliath.mailinglist@…>, 12 months ago) |
|---|
-
src/config.py
==== Patch <gajim-message-mode> level 3 Source: c68c8ed0-6fce-42b2-a3b7-6be8b34235d4:/local:7661 [local] Target: c4d4e39b-2f5f-9a77-1c94-36969bb79148:/trunk:8974 [mirrored] (svn://svn.gajim.org/gajim/trunk) Log: r7653@damasonium: ddanier | 2007-11-14 21:10:55 +0100 r7654@damasonium: ddanier | 2007-11-15 00:32:14 +0100 * Implemented very simple message-mode like psi: - Configuration option for default-type of new messages when clicking on an roster item - SingleMessageWindow: - Added "Next" and "Quote" button - "Next"-button to read next message waiting - "Next"-button show how many messages are waiting (by subscribing to gajim.events) - "Reply"-button does not quote, "Quote"-button does - Focus on Text by default - "RE: " only added to subject if subject is not empty - "Reply"/"Quote" does not close received message window, the parent is closed when reply window is closed and only if there are no more messages waiting r7655@damasonium: ddanier | 2007-11-15 00:33:26 +0100 * TODO for message-mode r7658@damasonium: ddanier | 2007-11-15 18:24:49 +0100 * SingleMessageWindow: - Action-menu - Username is displayed - GPG-Support, but untested * typo in src/chat_control.py === src/config.py ==================================================================71 71 self.notebook = self.xml.get_widget('preferences_notebook') 72 72 self.treat_incoming_messages_combobox =\ 73 73 self.xml.get_widget('treat_incoming_messages_combobox') 74 self.send_outgoing_messages_combobox =\ 75 self.xml.get_widget('send_outgoing_messages_combobox') 74 76 self.one_window_type_combobox =\ 75 77 self.xml.get_widget('one_window_type_combobox') 76 78 self.iconset_combobox = self.xml.get_widget('iconset_combobox') … … 140 142 else: 141 143 self.treat_incoming_messages_combobox.set_active(0) 142 144 145 # Set default for send outgoing messages 146 choices = common.config.opt_send_outgoing_messages 147 type = gajim.config.get('send_outgoing_messages') 148 if type in choices: 149 self.send_outgoing_messages_combobox.set_active(choices.index(type)) 150 else: 151 self.send_outgoing_messages_combobox.set_active(0) 152 143 153 # Set default for single window type 144 154 choices = common.config.opt_one_window_types 145 155 type = gajim.config.get('one_message_window') … … 574 584 config_type = common.config.opt_treat_incoming_messages[active] 575 585 gajim.config.set('treat_incoming_messages', config_type) 576 586 587 def on_send_outgoing_messages_combobox_changed(self, widget): 588 active = widget.get_active() 589 config_type = common.config.opt_send_outgoing_messages[active] 590 gajim.config.set('send_outgoing_messages', config_type) 591 577 592 def on_one_window_type_combo_changed(self, widget): 578 593 active = widget.get_active() 579 594 config_type = common.config.opt_one_window_types[active] -
src/roster_window.py
=== src/roster_window.py ==================================================================
1969 1969 self.draw_account(account) 1970 1970 1971 1971 def on_send_single_message_menuitem_activate(self, widget, account, 1972 contact =None):1972 contact=None, resource=None): 1973 1973 if contact is None: 1974 1974 dialogs.SingleMessageWindow(account, action = 'send') 1975 1975 elif type(contact) == type([]): 1976 1976 dialogs.SingleMessageWindow(account, contact, 'send') 1977 1977 else: 1978 1978 jid = contact.jid 1979 if contact.jid == gajim.get_jid_from_account(account): 1979 if resource: 1980 jid += '/' + resource 1981 elif contact.jid == gajim.get_jid_from_account(account): 1980 1982 jid += '/' + contact.resource 1981 1983 dialogs.SingleMessageWindow(account, jid, 'send') 1982 1984 … … 4358 4360 c = gajim.contacts.get_contact_with_highest_priority(account, jid) 4359 4361 if jid == gajim.get_jid_from_account(account): 4360 4362 resource = c.resource 4361 self.on_open_chat_window(widget, c, account, resource = resource, session = session) 4363 send_outgoing_messages = gajim.config.get('send_outgoing_messages') 4364 if send_outgoing_messages == 'normal': 4365 self.on_send_single_message_menuitem_activate(widget, account, c, resource = resource) 4366 else: 4367 self.on_open_chat_window(widget, c, account, resource = resource, session = session) 4362 4368 4363 4369 def on_roster_treeview_row_activated(self, widget, path, col = 0): 4364 4370 '''When an iter is double clicked: open the first event window''' -
src/dialogs.py
=== src/dialogs.py ==================================================================
1832 1832 # Keep a reference on windows so garbage collector don't restroy them 1833 1833 instances = [] 1834 1834 def __init__(self, account, to='', action='', from_whom='', subject='', 1835 message='', resource='', session=None, form_node=None ):1835 message='', resource='', session=None, form_node=None, encrypted=False): 1836 1836 self.instances.append(self) 1837 1837 self.account = account 1838 1838 self.action = action … … 1844 1844 self.resource = resource 1845 1845 self.session = session 1846 1846 1847 self.encrypted = encrypted 1848 self.next_count = 0 1849 1847 1850 self.xml = gtkgui_helpers.get_glade('single_message_window.glade') 1848 1851 self.window = self.xml.get_widget('single_message_window') 1849 1852 self.count_chars_label = self.xml.get_widget('count_chars_label') 1850 1853 self.from_label = self.xml.get_widget('from_label') 1851 1854 self.from_entry = self.xml.get_widget('from_entry') 1855 self.from_status_image = self.xml.get_widget('from_status_image') 1856 self.from_name = self.xml.get_widget('from_name') 1852 1857 self.to_label = self.xml.get_widget('to_label') 1853 1858 self.to_entry = self.xml.get_widget('to_entry') 1859 self.to_status_image = self.xml.get_widget('to_status_image') 1860 self.to_name = self.xml.get_widget('to_name') 1854 1861 self.subject_entry = self.xml.get_widget('subject_entry') 1855 1862 self.message_scrolledwindow = self.xml.get_widget( 1856 1863 'message_scrolledwindow') … … 1876 1883 parent_box.child_get_property(self.xml.get_widget('conversation_scrolledwindow'), 'position')) 1877 1884 self.action = 'form' 1878 1885 1886 self.gpg_togglebutton = self.xml.get_widget('gpg_togglebutton') 1887 self.gpg_togglebutton_separator = self.xml.get_widget('gpg_togglebutton_separator') 1879 1888 self.send_button = self.xml.get_widget('send_button') 1889 self.quote_button = self.xml.get_widget('quote_button') 1880 1890 self.reply_button = self.xml.get_widget('reply_button') 1891 self.next_button = self.xml.get_widget('next_button') 1892 self.next_count_label = self.xml.get_widget('next_count_label') 1881 1893 self.send_and_close_button = self.xml.get_widget('send_and_close_button') 1882 1894 self.cancel_button = self.xml.get_widget('cancel_button') 1883 1895 self.close_button = self.xml.get_widget('close_button') … … 1902 1914 1903 1915 self.prepare_widgets_for(self.action) 1904 1916 1917 gajim.events.event_added_subscribe(self.on_event_added) 1918 gajim.events.event_removed_subscribe(self.on_event_removed) 1919 if self.action == 'receive': 1920 self.update_next_count() 1921 1905 1922 # set_text(None) raises TypeError exception 1906 1923 if self.subject is None: 1907 1924 self.subject = '' … … 1924 1941 1925 1942 if gajim.config.get('saveposition'): 1926 1943 # get window position and size from config 1927 gtkgui_helpers.move_window(self.window, 1928 gajim.config.get('single-msg-x-position'), 1929 gajim.config.get('single-msg-y-position')) 1944 # Makes absolutely no sense when dealing with multiple windows 1945 # (for example when hitting "reply" the orig window stays) 1946 #gtkgui_helpers.move_window(self.window, 1947 # gajim.config.get('single-msg-x-position'), 1948 # gajim.config.get('single-msg-y-position')) 1930 1949 gtkgui_helpers.resize_window(self.window, 1931 1950 gajim.config.get('single-msg-width'), 1932 1951 gajim.config.get('single-msg-height')) … … 1968 1987 self.send_and_close_button.show() 1969 1988 self.to_label.show() 1970 1989 self.to_entry.show() 1990 self.to_status_image.show() 1991 self.to_name.show() 1971 1992 self.reply_button.hide() 1993 self.quote_button.hide() 1994 self.next_button.hide() 1972 1995 self.from_label.hide() 1973 1996 self.from_entry.hide() 1997 self.from_status_image.hide() 1998 self.from_name.hide() 1974 1999 self.conversation_scrolledwindow.hide() 1975 2000 self.message_scrolledwindow.show() 2001 self.gpg_togglebutton.show() 2002 if type(self.to) == type([]): 2003 self.gpg_togglebutton.set_property('sensitive', False) 2004 self.gpg_togglebutton.set_active(False) 2005 else: 2006 self.gpg_togglebutton.set_property('sensitive', True) 2007 self.gpg_togglebutton.set_active(self.encrypted) 2008 self.gpg_togglebutton_separator.show() 1976 2009 1977 2010 if self.message: # we come from a reply? 1978 2011 self.message_textview.grab_focus() … … 1983 2016 else: # we write a new message (not from reply) 1984 2017 self.close_button.hide() 1985 2018 if self.to: # do we already have jid? 1986 self.subject_entry.grab_focus() 2019 # Most of the time users skip the subject 2020 #self.subject_entry.grab_focus() 2021 self.message_textview.grab_focus() 2022 else: 2023 self.to_entry.grab_focus() 2024 self.update_to_information() 1987 2025 1988 2026 elif action == 'receive': # prepare UI for Receiving 1989 2027 title = _('Received %s') % title 1990 2028 self.reply_button.show() 2029 self.quote_button.show() 2030 self.next_button.show() 1991 2031 self.from_label.show() 1992 2032 self.from_entry.show() 2033 self.from_status_image.show() 2034 self.from_name.show() 1993 2035 self.send_button.hide() 1994 2036 self.send_and_close_button.hide() 1995 2037 self.to_label.hide() 1996 2038 self.to_entry.hide() 2039 self.to_status_image.hide() 2040 self.to_name.hide() 1997 2041 self.conversation_scrolledwindow.show() 1998 2042 self.message_scrolledwindow.hide() 2043 self.gpg_togglebutton.show() 2044 self.gpg_togglebutton.set_property('sensitive', False) 2045 self.gpg_togglebutton.set_active(self.encrypted) 2046 self.gpg_togglebutton_separator.show() 1999 2047 2000 2048 if self.message: 2001 2049 self.conversation_textview.print_real_text(self.message) … … 2008 2056 self.reply_button.grab_focus() 2009 2057 self.cancel_button.hide() 2010 2058 self.close_button.show() 2059 self.update_from_information() 2060 2011 2061 elif action == 'form': # prepare UI for Receiving 2012 2062 title = _('Form %s') % title 2013 2063 self.send_button.show() 2014 2064 self.send_and_close_button.show() 2015 2065 self.to_label.show() 2016 2066 self.to_entry.show() 2067 self.to_status_image.show() 2068 self.to_name.show() 2017 2069 self.reply_button.hide() 2018 2070 self.from_label.hide() 2019 2071 self.from_entry.hide() 2072 self.from_status_image.hide() 2073 self.from_name.hide() 2020 2074 self.conversation_scrolledwindow.hide() 2021 2075 self.message_scrolledwindow.hide() 2076 self.gpg_togglebutton.hide() 2077 self.gpg_togglebutton_separator.hide() 2078 self.update_to_information() 2022 2079 2023 2080 self.window.set_title(title) 2024 2081 2082 def on_to_entry_changed(self, widget): 2083 self.update_to_information() 2084 2085 def update_to_information(self): 2086 jid, resource, contact = self.get_jid_resource_and_contact() 2087 if contact: 2088 self.to_status_image.show() 2089 roster = gajim.interface.roster 2090 iconset = gajim.config.get('iconset') 2091 path = os.path.join(helpers.get_iconset_path(iconset), '16x16') 2092 state_images = roster.load_iconset(path) 2093 icon_name = helpers.get_icon_name_to_show(contact, self.account) 2094 icon = state_images[icon_name] 2095 # TODO: Set image 2096 #print icon 2097 #icon, mask = icon.get_image() 2098 #print icon 2099 #print mask 2100 #self.to_status_image.set_from_image(icon, mask) 2101 self.to_name.show() 2102 self.to_name.set_text(contact.get_shown_name()) 2103 else: 2104 self.to_status_image.hide() 2105 self.to_name.hide() 2106 2107 def update_from_information(self): 2108 jid = self.from_entry.get_text() 2109 contact = None 2110 if '@' in jid: 2111 if '/' in jid: 2112 jid, resource = jid.split('/', 1) 2113 else: 2114 resource = self.resource 2115 contact = gajim.contacts.get_contact(self.account, jid, resource) 2116 if contact: 2117 self.from_status_image.show() 2118 roster = gajim.interface.roster 2119 iconset = gajim.config.get('iconset') 2120 path = os.path.join(helpers.get_iconset_path(iconset), '16x16') 2121 state_images = roster.load_iconset(path) 2122 icon_name = helpers.get_icon_name_to_show(contact, self.account) 2123 icon = state_images[icon_name] 2124 # TODO: Set image 2125 #print icon 2126 #icon, mask = icon.get_image() 2127 #print icon 2128 #print mask 2129 #self.from_status_image.set_from_image(icon, mask) 2130 self.from_name.show() 2131 self.from_name.set_text(contact.get_shown_name()) 2132 else: 2133 self.from_status_image.hide() 2134 self.from_name.hide() 2135 2136 def on_actions_button_clicked(self, widget): 2137 '''popup action menu''' 2138 menu = self.prepare_context_menu() 2139 menu.show_all() 2140 gtkgui_helpers.popup_emoticons_under_button(menu, widget, self.window.window) 2141 2142 def get_jid_and_resource(self): 2143 if self.action == 'receive': 2144 jid = self.from_whom 2145 elif self.action == 'send': 2146 jid = self.to_entry.get_text() 2147 else: 2148 jid = self.to 2149 if '/' in jid: 2150 jid, resource = jid.split('/', 1) 2151 else: 2152 resource = self.resource 2153 return jid, resource 2154 2155 def get_contact(self): 2156 jid, resource = self.get_jid_and_resource() 2157 if '@' in jid: 2158 return gajim.contacts.get_contact(self.account, jid, self.resource) 2159 else: 2160 return None 2161 2162 def get_jid_resource_and_contact(self): 2163 jid, resource = self.get_jid_and_resource() 2164 if '@' in jid: 2165 return jid, resource, gajim.contacts.get_contact(self.account, jid, self.resource) 2166 else: 2167 return jid, resource, None 2168 2169 def prepare_context_menu(self): 2170 '''sets compact view menuitem active state 2171 sets active and sensitivity state for toggle_gpg_menuitem 2172 sets sensitivity for history_menuitem (False for transports) 2173 and file_transfer_menuitem 2174 and hide()/show() for add_to_roster_menuitem 2175 ''' 2176 xml = gtkgui_helpers.get_glade('chat_control_popup_menu.glade') 2177 menu = xml.get_widget('chat_control_popup_menu') 2178 2179 history_menuitem = xml.get_widget('history_menuitem') 2180 toggle_gpg_menuitem = xml.get_widget('toggle_gpg_menuitem') 2181 toggle_e2e_menuitem = xml.get_widget('toggle_e2e_menuitem') 2182 add_to_roster_menuitem = xml.get_widget('add_to_roster_menuitem') 2183 send_file_menuitem = xml.get_widget('send_file_menuitem') 2184 information_menuitem = xml.get_widget('information_menuitem') 2185 convert_to_gc_menuitem = xml.get_widget('convert_to_groupchat') 2186 muc_icon = gajim.interface.roster.load_icon('muc_active') 2187 if muc_icon: 2188 convert_to_gc_menuitem.set_image(muc_icon) 2189 2190 jid, resource, contact = self.get_jid_resource_and_contact() 2191 2192 # check if gpg capabitlies or else make gpg toggle insensitive 2193 gpg_btn = self.gpg_togglebutton 2194 isactive = gpg_btn.get_active() 2195 is_sensitive = gpg_btn.get_property('sensitive') 2196 toggle_gpg_menuitem.set_active(isactive) 2197 toggle_gpg_menuitem.set_property('sensitive', is_sensitive) 2198 2199 # TODO: support this, if possible 2200 toggle_e2e_menuitem.set_sensitive(False) 2201 2202 # If we don't have resource, we can't do file transfer 2203 # in transports, contact holds our info we need to disable it too 2204 if jid and resource: 2205 send_file_menuitem.set_sensitive(True) 2206 elif contact and contact.resource and contact.jid.find('@') != -1: 2207 send_file_menuitem.set_sensitive(True) 2208 else: 2209 send_file_menuitem.set_sensitive(False) 2210 2211 # check if it's possible to convert to groupchat 2212 if gajim.get_transport_name_from_jid(jid) or \ 2213 gajim.connections[self.account].is_zeroconf: 2214 convert_to_gc_menuitem.set_sensitive(False) 2215 2216 # add_to_roster_menuitem 2217 if contact and _('Not in Roster') in contact.groups: 2218 add_to_roster_menuitem.show() 2219 add_to_roster_menuitem.set_no_show_all(False) 2220 else: 2221 add_to_roster_menuitem.hide() 2222 add_to_roster_menuitem.set_no_show_all(True) 2223 2224 # connect signals 2225 history_menuitem.connect('activate', 2226 self.on_history_menuitem_activate) 2227 send_file_menuitem.connect('activate', 2228 self.on_send_file_menuitem_activate) 2229 add_to_roster_menuitem.connect('activate', 2230 self.on_add_to_roster_menuitem_activate) 2231 toggle_gpg_menuitem.connect('activate', 2232 self.on_toggle_gpg_menuitem_activate) 2233 #toggle_e2e_menuitem.connect('activate', 2234 # self.on_toggle_e2e_menuitem_activate) 2235 information_menuitem.connect('activate', 2236 self.on_contact_information_menuitem_activate) 2237 convert_to_gc_menuitem.connect('activate', 2238 self.on_convert_to_gc_menuitem_activate) 2239 menu.connect('selection-done', self.destroy_menu) 2240 return menu 2241 2242 def destroy_menu(self, menu): 2243 # destroy menu 2244 menu.destroy() 2245 2246 def on_history_menuitem_activate(self, widget): 2247 '''When history menuitem is pressed: call history window''' 2248 import history_window 2249 jid, resource = self.get_jid_and_resource() 2250 2251 if gajim.interface.instances.has_key('logs'): 2252 gajim.interface.instances['logs'].window.present() 2253 gajim.interface.instances['logs'].open_history(jid, self.account) 2254 else: 2255 gajim.interface.instances['logs'] = \ 2256 history_window.HistoryWindow(jid, self.account) 2257 2258 def on_send_file_menuitem_activate(self, widget): 2259 contact = self.get_contact() 2260 if contact: 2261 gajim.interface.instances['file_transfers'].show_file_send_request( 2262 self.account, contact) 2263 2264 def on_add_to_roster_menuitem_activate(self, widget): 2265 jid, resource = self.get_jid_and_resource() 2266 AddNewContactWindow(self.account, jid) 2267 2268 def on_toggle_gpg_menuitem_activate(self, widget): 2269 if self.gpg_togglebutton.get_active(): 2270 self.gpg_togglebutton.set_active(False) 2271 else: 2272 self.gpg_togglebutton.set_active(True) 2273 self.gpg_togglebutton.toggled() 2274 2275 def on_gpg_togglebutton_toggled(self, widget): 2276 self.encrypted = self.gpg_togglebutton.get_active() 2277 2278 def on_contact_information_menuitem_activate(self, widget): 2279 contact = self.get_contact() 2280 if contact: 2281 gajim.interface.roster.on_info(widget, contact, self.account) 2282 2283 def on_convert_to_gc_menuitem_activate(self, widget): 2284 '''user want to invite some friends to chat''' 2285 jid, resource = self.get_jid_and_resource() 2286 TransformChatToMUC(self.account, [jid]) 2287 2288 def on_single_message_window_destroy(self, widget): 2289 gajim.events.event_added_unsubscribe(self.on_event_added) 2290 gajim.events.event_removed_unsubscribe(self.on_event_removed) 2291 2292 def update_next_count(self): 2293 # gajim.get_jid_without_resource(self.from_jid)? 2294 self.next_count = len(gajim.events.get_events(self.account, \ 2295 self.from_whom, types=('normal',))) 2296 self.next_count_label.set_label("(%d)" % self.next_count) 2297 if self.next_count == 0: 2298 self.next_button.set_property('sensitive', False) 2299 else: 2300 self.next_button.set_property('sensitive', True) 2301 2302 def on_event_added(self, event): 2303 if event.type_ == 'normal': 2304 self.update_next_count() 2305 2306 def on_event_removed(self, event_list): 2307 for event in event_list: 2308 if event.type_ == 'normal': 2309 self.update_next_count() 2310 return 2311 2312 def on_next_button_clicked(self, widget): 2313 if self.next_count == 0: 2314 return 2315 next_event = gajim.events.get_first_event(self.account, self.from_whom, 'normal') 2316 #if not next_event: 2317 # next_event = gajim.events.get_first_event(self.account, self.from_whom, 'chat') 2318 if not next_event: 2319 return 2320 # parameters: 2321 # message, subject, kind, time, encrypted, resource, 2322 # msg_id 2323 self.action = 'receive' 2324 self.subject = next_event.parameters[1] 2325 self.message = next_event.parameters[0] 2326 self.resource = next_event.parameters[5] 2327 self.session = next_event.parameters[8] 2328 form_node = next_event.parameters[9] 2329 2330 parent_box = self.xml.get_widget('conversation_scrolledwindow').get_parent() 2331 if form_node: 2332 dataform = dataforms.ExtendForm(node = form_node) 2333 self.form_widget = dataforms_widget.DataFormWidget(dataform) 2334 self.form_widget.show_all() 2335 parent_box.add(self.form_widget) 2336 parent_box.child_set_property(self.form_widget, 'position', 2337 parent_box.child_get_property(self.xml.get_widget('conversation_scrolledwindow'), 'position')) 2338 self.action = 'form' 2339 elif self.form_widget: 2340 self.form_widget.hide() 2341 parent_box.remove(self.form_widget) 2342 self.form_widget = None 2343 2344 self.conversation_textview.clear() 2345 self.prepare_widgets_for(self.action) 2346 2347 # set_text(None) raises TypeError exception 2348 if self.subject is None: 2349 self.subject = '' 2350 self.subject_entry.set_text(self.subject) 2351 2352 gajim.interface.remove_first_event(self.account, self.from_whom, next_event.type_) 2353 self.update_next_count() 2354 2025 2355 def on_cancel_button_clicked(self, widget): 2026 2356 self.save_pos() 2027 2357 self.window.destroy() … … 2066 2396 form_node = self.form_widget.data_form 2067 2397 else: 2068 2398 form_node = None 2069 # FIXME: allow GPG message some day 2399 keyID = None 2400 if self.encrypted: 2401 contact = self.get_contact() 2402 keyID = contact.keyID 2070 2403 gajim.connections[self.account].send_message(to_whom_jid, message, 2071 keyID= None, type='normal', subject=subject, session=session,2404 keyID=keyID, type='normal', subject=subject, session=session, 2072 2405 form_node=form_node) 2073 2406 2074 2407 self.subject_entry.set_text('') # we sent ok, clear the subject … … 2076 2409 2077 2410 def on_send_button_clicked(self, widget): 2078 2411 self.send_single_message() 2412 2413 def on_child_window_destroy(self, widget): 2414 # TODO: Only close window if child send a message 2415 if self.next_count == 0: 2416 self.save_pos() 2417 self.window.destroy() 2079 2418 2080 def on_reply_button_clicked(self, widget ):2419 def on_reply_button_clicked(self, widget, quote=False): 2081 2420 # we create a new blank window to send and we preset RE: and to jid 2082 self.subject = _('RE: %s') % self.subject 2083 self.message = _('%s wrote:\n') % self.from_whom + self.message 2084 # add > at the begining of each line 2085 self.message = self.message.replace('\n', '\n> ') + '\n\n' 2086 self.window.destroy() 2087 SingleMessageWindow(self.account, to = self.from_whom, 2088 action = 'send', from_whom = self.from_whom, subject = self.subject, 2089 message = self.message, session = self.session) 2421 if self.subject: 2422 subject = _('RE: %s') % self.subject 2423 else: 2424 subject = '' 2425 if quote: 2426 message = _('%s wrote:\n') % self.from_whom + self.message 2427 # add > at the begining of each line 2428 message = message.replace('\n', '\n> ') + '\n\n' 2429 else: 2430 message = '' 2431 smw = SingleMessageWindow(self.account, to = self.from_whom, 2432 action = 'send', from_whom = self.from_whom, subject = subject, 2433 message = message, session = self.session) 2434 smw.window.connect('destroy', 2435 self.on_child_window_destroy) 2090 2436 2437 def on_quote_button_clicked(self, widget): 2438 self.on_reply_button_clicked(widget, quote=True) 2439 2091 2440 def on_send_and_close_button_clicked(self, widget): 2092 2441 self.send_single_message() 2093 2442 self.save_pos() -
src/common/config.py
=== src/common/config.py ==================================================================
