Merge lp:~bratsche/gwibber/input-focus into lp:gwibber

Proposed by Cody Russell
Status: Merged
Merged at revision: not available
Proposed branch: lp:~bratsche/gwibber/input-focus
Merge into: lp:gwibber
Diff against target: 482 lines (+61/-56)
2 files modified
gwibber/client.py (+18/-16)
gwibber/gwui.py (+43/-40)
To merge this branch: bzr merge lp:~bratsche/gwibber/input-focus
Reviewer Review Type Date Requested Status
Ken VanDine Approve
Review via email: mp+21578@code.launchpad.net

Description of the change

Sets the focus children so that the text input widget has the focus.

To post a comment you must log in.
Revision history for this message
Ken VanDine (ken-vandine) wrote :

Awesome, thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'gwibber/client.py'
--- gwibber/client.py 2010-03-17 17:17:13 +0000
+++ gwibber/client.py 2010-03-17 17:37:30 +0000
@@ -26,7 +26,7 @@
26 self.ui = gtk.Builder()26 self.ui = gtk.Builder()
2727
28 self.model = gwui.Model()28 self.model = gwui.Model()
29 29
30 self.service = self.model.daemon30 self.service = self.model.daemon
31 self.service.connect_to_signal("LoadingStarted", self.on_loading_started)31 self.service.connect_to_signal("LoadingStarted", self.on_loading_started)
32 self.service.connect_to_signal("LoadingComplete", self.on_loading_complete)32 self.service.connect_to_signal("LoadingComplete", self.on_loading_complete)
@@ -51,7 +51,7 @@
51 self.service.Refresh()51 self.service.Refresh()
5252
53 self.setup_ui()53 self.setup_ui()
54 54
55 # set state online/offline55 # set state online/offline
56 if not self.connection.isConnected():56 if not self.connection.isConnected():
57 log.logger.info("Setting to Offline")57 log.logger.info("Setting to Offline")
@@ -74,7 +74,7 @@
74 resources.get_ui_asset("gwibber.svg"), 24, 24))74 resources.get_ui_asset("gwibber.svg"), 24, 24))
75 self.set_icon_name("gwibber")75 self.set_icon_name("gwibber")
76 self.connect("delete-event", self.on_window_close)76 self.connect("delete-event", self.on_window_close)
77 77
78 # Load the application menu78 # Load the application menu
79 menu_ui = self.setup_menu()79 menu_ui = self.setup_menu()
80 self.add_accel_group(menu_ui.get_accel_group())80 self.add_accel_group(menu_ui.get_accel_group())
@@ -92,7 +92,7 @@
9292
93 menubar = menu_ui.get_widget("/menubar_main")93 menubar = menu_ui.get_widget("/menubar_main")
94 menubar.append(menu_spin)94 menubar.append(menu_spin)
95 95
96 view_class = getattr(gwui,96 view_class = getattr(gwui,
97 "MultiStreamUi" if len(self.model.settings["streams"]) > 197 "MultiStreamUi" if len(self.model.settings["streams"]) > 1
98 else "SingleStreamUi")98 else "SingleStreamUi")
@@ -104,7 +104,7 @@
104 self.stream_view.connect("stream-closed", self.on_stream_closed)104 self.stream_view.connect("stream-closed", self.on_stream_closed)
105 if isinstance(self.stream_view, gwui.MultiStreamUi):105 if isinstance(self.stream_view, gwui.MultiStreamUi):
106 self.stream_view.connect("pane-closed", self.on_pane_closed)106 self.stream_view.connect("pane-closed", self.on_pane_closed)
107 107
108 self.input = gwui.Input()108 self.input = gwui.Input()
109 self.input.connect("submit", self.on_input_activate)109 self.input.connect("submit", self.on_input_activate)
110 self.input.connect("changed", self.on_input_changed)110 self.input.connect("changed", self.on_input_changed)
@@ -113,6 +113,8 @@
113 self.input_splitter.pack1(self.stream_view, resize=True)113 self.input_splitter.pack1(self.stream_view, resize=True)
114 self.input_splitter.pack2(self.input, resize=False)114 self.input_splitter.pack2(self.input, resize=False)
115115
116 self.input_splitter.set_focus_child(self.input)
117
116 self.button_send = gtk.Button(_("Send"))118 self.button_send = gtk.Button(_("Send"))
117 self.button_send.connect("clicked", self.on_button_send_clicked)119 self.button_send.connect("clicked", self.on_button_send_clicked)
118120
@@ -125,7 +127,7 @@
125 content.pack_start(self.input_splitter, True)127 content.pack_start(self.input_splitter, True)
126 content.pack_start(self.message_target, False)128 content.pack_start(self.message_target, False)
127 content.set_border_width(5)129 content.set_border_width(5)
128 130
129 layout = gtk.VBox()131 layout = gtk.VBox()
130 layout.pack_start(menubar, False)132 layout.pack_start(menubar, False)
131 layout.pack_start(content, True)133 layout.pack_start(content, True)
@@ -147,16 +149,16 @@
147 if self.stream_view:149 if self.stream_view:
148 state = self.stream_view.get_state()150 state = self.stream_view.get_state()
149 self.stream_view.destroy()151 self.stream_view.destroy()
150 152
151 self.stream_view = self.view_class(self.model)153 self.stream_view = self.view_class(self.model)
152 self.stream_view.connect("action", self.on_action)154 self.stream_view.connect("action", self.on_action)
153 self.stream_view.connect("search", self.on_perform_search)155 self.stream_view.connect("search", self.on_perform_search)
154 self.stream_view.connect("stream-changed", self.on_stream_changed)156 self.stream_view.connect("stream-changed", self.on_stream_changed)
155 self.stream_view.connect("stream-closed", self.on_stream_closed)157 self.stream_view.connect("stream-closed", self.on_stream_closed)
156 158
157 if isinstance(self.stream_view, gwui.MultiStreamUi):159 if isinstance(self.stream_view, gwui.MultiStreamUi):
158 self.stream_view.connect("pane-closed", self.on_pane_closed)160 self.stream_view.connect("pane-closed", self.on_pane_closed)
159 161
160 self.input_splitter.add1(self.stream_view)162 self.input_splitter.add1(self.stream_view)
161 self.stream_view.show_all()163 self.stream_view.show_all()
162 if state: self.stream_view.set_state(state)164 if state: self.stream_view.set_state(state)
@@ -223,7 +225,7 @@
223 ("help_report", None, _("Report A Problem..."), None, None, lambda *a: util.load_url(BUG_URL)),225 ("help_report", None, _("Report A Problem..."), None, None, lambda *a: util.load_url(BUG_URL)),
224 ])226 ])
225227
226 228
227 ui = gtk.UIManager()229 ui = gtk.UIManager()
228 ui.insert_action_group(self.actions, pos=0)230 ui.insert_action_group(self.actions, pos=0)
229 ui.add_ui_from_string(ui_string)231 ui.add_ui_from_string(ui_string)
@@ -243,7 +245,7 @@
243 if "reply" in features:245 if "reply" in features:
244 if message["sender"].get("nick", 0) and not "thread" in features:246 if message["sender"].get("nick", 0) and not "thread" in features:
245 self.input.set_text("@%s: " % message["sender"]["nick"])247 self.input.set_text("@%s: " % message["sender"]["nick"])
246 248
247 self.message_target.set_target(message)249 self.message_target.set_target(message)
248 self.input.textview.grab_focus()250 self.input.textview.grab_focus()
249 buf = self.input.textview.get_buffer()251 buf = self.input.textview.get_buffer()
@@ -254,7 +256,7 @@
254256
255 def get_message(self, id):257 def get_message(self, id):
256 return dict(self.model.messages.get_record(id).items())258 return dict(self.model.messages.get_record(id).items())
257 259
258 def on_refresh(self, *args):260 def on_refresh(self, *args):
259 self.service.Refresh()261 self.service.Refresh()
260262
@@ -262,7 +264,7 @@
262 id = self.model.streams.put_record(CouchRecord(data, kind))264 id = self.model.streams.put_record(CouchRecord(data, kind))
263 self.model.refresh()265 self.model.refresh()
264 self.service.PerformOp('{"id": "%s"}' % id)266 self.service.PerformOp('{"id": "%s"}' % id)
265 267
266 if "operation" in data:268 if "operation" in data:
267 stream = str(self.model.features[data["operation"]]["stream"])269 stream = str(self.model.features[data["operation"]]["stream"])
268 else: stream = "search"270 else: stream = "search"
@@ -348,7 +350,7 @@
348 def on_message_action_menu(self, msg):350 def on_message_action_menu(self, msg):
349 theme = gtk.icon_theme_get_default()351 theme = gtk.icon_theme_get_default()
350 menu = gtk.Menu()352 menu = gtk.Menu()
351 353
352 for a in actions.MENU_ITEMS:354 for a in actions.MENU_ITEMS:
353 if a.include(self, msg):355 if a.include(self, msg):
354 image = gtk.image_new_from_icon_name(a.icon, gtk.ICON_SIZE_MENU)356 image = gtk.image_new_from_icon_name(a.icon, gtk.ICON_SIZE_MENU)
@@ -399,14 +401,14 @@
399 self.service.Send(json.dumps(data))401 self.service.Send(json.dumps(data))
400 self.message_target.end()402 self.message_target.end()
401 else: self.service.SendMessage(text)403 else: self.service.SendMessage(text)
402 404
403 def on_new_stream(self, *args):405 def on_new_stream(self, *args):
404 if isinstance(self.stream_view, gwui.MultiStreamUi):406 if isinstance(self.stream_view, gwui.MultiStreamUi):
405 self.stream_view.new_stream()407 self.stream_view.new_stream()
406 else:408 else:
407 self.set_view("MultiStreamUi")409 self.set_view("MultiStreamUi")
408 self.stream_view.new_stream()410 self.stream_view.new_stream()
409 411
410 def on_loading_started(self, *args):412 def on_loading_started(self, *args):
411 self.loading_spinner.set_from_animation(413 self.loading_spinner.set_from_animation(
412 gtk.gdk.PixbufAnimation(resources.get_ui_asset("progress.gif")))414 gtk.gdk.PixbufAnimation(resources.get_ui_asset("progress.gif")))
413415
=== modified file 'gwibber/gwui.py'
--- gwibber/gwui.py 2010-03-17 17:17:13 +0000
+++ gwibber/gwui.py 2010-03-17 17:37:30 +0000
@@ -30,11 +30,11 @@
30 gobject.GObject.__init__(self)30 gobject.GObject.__init__(self)
3131
32 self.daemon = util.getbus("Service")32 self.daemon = util.getbus("Service")
33 33
34 self.account_monitor = util.getbus("Accounts")34 self.account_monitor = util.getbus("Accounts")
35 self.account_monitor.connect_to_signal("AccountChanged", self.on_stream_changed)35 self.account_monitor.connect_to_signal("AccountChanged", self.on_stream_changed)
36 self.account_monitor.connect_to_signal("AccountDeleted", self.on_stream_changed)36 self.account_monitor.connect_to_signal("AccountDeleted", self.on_stream_changed)
37 37
38 self.streams_monitor = util.getbus("Streams")38 self.streams_monitor = util.getbus("Streams")
39 self.streams_monitor.connect_to_signal("StreamChanged", self.on_stream_changed)39 self.streams_monitor.connect_to_signal("StreamChanged", self.on_stream_changed)
40 self.streams_monitor.connect_to_signal("StreamClosed", self.on_stream_changed)40 self.streams_monitor.connect_to_signal("StreamClosed", self.on_stream_changed)
@@ -69,7 +69,7 @@
69 def find_all(self, **params):69 def find_all(self, **params):
70 for stream in self.get_streams():70 for stream in self.get_streams():
71 if self.match(stream, params): yield stream71 if self.match(stream, params): yield stream
72 72
73 if "items" in stream:73 if "items" in stream:
74 for stream in stream["items"]:74 for stream in stream["items"]:
75 if self.match(stream, params): yield stream75 if self.match(stream, params): yield stream
@@ -130,7 +130,7 @@
130 }130 }
131131
132 default_streams = self.services[account["protocol"]]["default_streams"]132 default_streams = self.services[account["protocol"]]["default_streams"]
133 133
134 if len(default_streams) > 1:134 if len(default_streams) > 1:
135 for feature in default_streams:135 for feature in default_streams:
136 aname = self.features[feature]["stream"]136 aname = self.features[feature]["stream"]
@@ -174,7 +174,7 @@
174 "color": util.Color(account["color"]),174 "color": util.Color(account["color"]),
175 "protocol": account["protocol"],175 "protocol": account["protocol"],
176 })176 })
177 177
178 items.append(item)178 items.append(item)
179179
180 searches = {180 searches = {
@@ -192,13 +192,13 @@
192 sId = search["_id"]192 sId = search["_id"]
193 searches["items"].append({193 searches["items"].append({
194 "name": search["name"],194 "name": search["name"],
195 "account": None, 195 "account": None,
196 "view": self.messages.execute_view("transient_time", "messages")[[sId, {}]:[sId, 0]],196 "view": self.messages.execute_view("transient_time", "messages")[[sId, {}]:[sId, 0]],
197 "stream": "search",197 "stream": "search",
198 "transient": sId,198 "transient": sId,
199 "color": None,199 "color": None,
200 })200 })
201 201
202 items.append(searches)202 items.append(searches)
203 return items203 return items
204204
@@ -222,7 +222,7 @@
222222
223 def on_click_link(self, view, frame, req):223 def on_click_link(self, view, frame, req):
224 uri = req.get_uri()224 uri = req.get_uri()
225 225
226 if uri.startswith("file:///"): return False226 if uri.startswith("file:///"): return False
227 elif uri.startswith("gwibber:"):227 elif uri.startswith("gwibber:"):
228 url = urlparse.urlparse(uri)228 url = urlparse.urlparse(uri)
@@ -230,7 +230,7 @@
230 query = urlparse.parse_qs(url.query)230 query = urlparse.parse_qs(url.query)
231 query = dict((x,y[0]) for x,y in query.items())231 query = dict((x,y[0]) for x,y in query.items())
232 self.emit("action", uri, cmd, query)232 self.emit("action", uri, cmd, query)
233 else: util.load_url(uri) 233 else: util.load_url(uri)
234 return True234 return True
235235
236 def render(self, theme, template, **kwargs):236 def render(self, theme, template, **kwargs):
@@ -245,7 +245,7 @@
245 theme_path = resources.get_theme_path(theme)245 theme_path = resources.get_theme_path(theme)
246 template_path = resources.get_template_path(template, theme)246 template_path = resources.get_template_path(template, theme)
247 lookup_paths = list(resources.get_template_dirs()) + [theme_path]247 lookup_paths = list(resources.get_template_dirs()) + [theme_path]
248 248
249 template = open(template_path).read()249 template = open(template_path).read()
250 template = Template(template, lookup=TemplateLookup(directories=lookup_paths))250 template = Template(template, lookup=TemplateLookup(directories=lookup_paths))
251 content = template.render(theme=util.get_theme_colors(), resources=resources, _=_, **kwargs)251 content = template.render(theme=util.get_theme_colors(), resources=resources, _=_, **kwargs)
@@ -253,7 +253,7 @@
253 # Avoid navigation redraw crashes253 # Avoid navigation redraw crashes
254 if isinstance(self, Navigation) and not self.get_property("visible"):254 if isinstance(self, Navigation) and not self.get_property("visible"):
255 return content255 return content
256 256
257 self.load_html_string(content, "file://%s/" % os.path.dirname(template_path))257 self.load_html_string(content, "file://%s/" % os.path.dirname(template_path))
258 return content258 return content
259259
@@ -273,7 +273,7 @@
273 self.selected_stream = None273 self.selected_stream = None
274 self.tree_enabled = False274 self.tree_enabled = False
275 self.small_icons = False275 self.small_icons = False
276 276
277 def render(self):277 def render(self):
278 return WebUi.render(self, self.model.settings["theme"], "navigation.mako",278 return WebUi.render(self, self.model.settings["theme"], "navigation.mako",
279 streams=self.model.get_streams(),279 streams=self.model.get_streams(),
@@ -334,7 +334,7 @@
334 self.splitter = gtk.HPaned()334 self.splitter = gtk.HPaned()
335 self.splitter.add1(self.navigation_scroll)335 self.splitter.add1(self.navigation_scroll)
336 self.splitter.add2(layout)336 self.splitter.add2(layout)
337 337
338 self.splitter.set_position(self.model.settings["sidebar_splitter"])338 self.splitter.set_position(self.model.settings["sidebar_splitter"])
339 self.handle_splitter_position_change(self.model.settings["sidebar_splitter"])339 self.handle_splitter_position_change(self.model.settings["sidebar_splitter"])
340 self.splitter.connect("notify", self.on_splitter_drag)340 self.splitter.connect("notify", self.on_splitter_drag)
@@ -368,8 +368,8 @@
368 def on_splitter_drag(self, pane, ev):368 def on_splitter_drag(self, pane, ev):
369 if ev.name == 'position':369 if ev.name == 'position':
370 pos = pane.get_position()370 pos = pane.get_position()
371 self.handle_splitter_position_change(pos) 371 self.handle_splitter_position_change(pos)
372 372
373 def on_stream_closed(self, widget, id, kind):373 def on_stream_closed(self, widget, id, kind):
374 self.emit("stream-closed", id, kind)374 self.emit("stream-closed", id, kind)
375375
@@ -378,7 +378,7 @@
378 self.emit("stream-changed", stream)378 self.emit("stream-changed", stream)
379 self.update_search_visibility()379 self.update_search_visibility()
380 self.update()380 self.update()
381 381
382 def update_search_visibility(self):382 def update_search_visibility(self):
383 stream = self.navigation.selected_stream383 stream = self.navigation.selected_stream
384 if stream is not None:384 if stream is not None:
@@ -428,14 +428,14 @@
428 self.scroll.add_with_viewport(self.container)428 self.scroll.add_with_viewport(self.container)
429429
430 self.pack_start(self.scroll, True)430 self.pack_start(self.scroll, True)
431 431
432 def on_stream_closed(self, widget, id, kind):432 def on_stream_closed(self, widget, id, kind):
433 self.emit("stream-closed", id, kind)433 self.emit("stream-closed", id, kind)
434434
435 def on_pane_closed(self, widget):435 def on_pane_closed(self, widget):
436 widget.destroy()436 widget.destroy()
437 self.emit("pane-closed", len(self.container))437 self.emit("pane-closed", len(self.container))
438 438
439 def on_search(self, widget, query):439 def on_search(self, widget, query):
440 self.emit("search", query)440 self.emit("search", query)
441441
@@ -483,7 +483,7 @@
483 # Build the top navigation bar483 # Build the top navigation bar
484 close_icon = gtk.image_new_from_stock("gtk-close", gtk.ICON_SIZE_MENU)484 close_icon = gtk.image_new_from_stock("gtk-close", gtk.ICON_SIZE_MENU)
485 down_arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_NONE)485 down_arrow = gtk.Arrow(gtk.ARROW_DOWN, gtk.SHADOW_NONE)
486 486
487 btn_arrow = gtk.Button()487 btn_arrow = gtk.Button()
488 btn_arrow.set_relief(gtk.RELIEF_NONE)488 btn_arrow.set_relief(gtk.RELIEF_NONE)
489 btn_arrow.add(down_arrow)489 btn_arrow.add(down_arrow)
@@ -514,7 +514,7 @@
514 # Build the main message view514 # Build the main message view
515 self.message_view = MessageStreamView(self.model)515 self.message_view = MessageStreamView(self.model)
516 self.message_view.connect("action", self.on_action)516 self.message_view.connect("action", self.on_action)
517 517
518 self.message_scroll = gtk.ScrolledWindow()518 self.message_scroll = gtk.ScrolledWindow()
519 self.message_scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)519 self.message_scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
520 self.message_scroll.set_shadow_type(gtk.SHADOW_IN)520 self.message_scroll.set_shadow_type(gtk.SHADOW_IN)
@@ -530,7 +530,7 @@
530 def on_dropdown(self, button):530 def on_dropdown(self, button):
531 w, h = self.arrow.window.get_geometry()[2:4]531 w, h = self.arrow.window.get_geometry()[2:4]
532 x, y = self.arrow.window.get_origin()532 x, y = self.arrow.window.get_origin()
533 533
534 window = gtk.Window()534 window = gtk.Window()
535 window.move(x, y + h)535 window.move(x, y + h)
536 window.set_decorated(False)536 window.set_decorated(False)
@@ -566,7 +566,7 @@
566566
567 is_search = stream["stream"] == "search" and stream["name"] == "Search"567 is_search = stream["stream"] == "search" and stream["name"] == "Search"
568 self.search_box.set_visible(not is_search)568 self.search_box.set_visible(not is_search)
569 569
570 if stream["account"]:570 if stream["account"]:
571 fname = resources.get_ui_asset("icons/breakdance/16x16/%s.png" % stream["protocol"])571 fname = resources.get_ui_asset("icons/breakdance/16x16/%s.png" % stream["protocol"])
572 self.icon_protocol.set_from_file(fname)572 self.icon_protocol.set_from_file(fname)
@@ -604,10 +604,10 @@
604 self.model = model604 self.model = model
605 self.model.connect("changed", self.on_account_changed)605 self.model.connect("changed", self.on_account_changed)
606 self.accounts = []606 self.accounts = []
607 607
608 self.target = None608 self.target = None
609 self.action = None609 self.action = None
610 610
611 self.targetbar = WebUi()611 self.targetbar = WebUi()
612 self.targetbar.connect("action", self.on_action)612 self.targetbar.connect("action", self.on_action)
613 self.targetbar.set_size_request(0, 24)613 self.targetbar.set_size_request(0, 24)
@@ -661,11 +661,11 @@
661661
662 def render(self, views):662 def render(self, views):
663 accounts = CouchDatabase(COUCH_DB_ACCOUNTS).get_records(COUCH_TYPE_ACCOUNT, True)663 accounts = CouchDatabase(COUCH_DB_ACCOUNTS).get_records(COUCH_TYPE_ACCOUNT, True)
664 664
665 accounts = dict((a.id, a.value) for a in accounts)665 accounts = dict((a.id, a.value) for a in accounts)
666 messages = []666 messages = []
667 seen = {}667 seen = {}
668 668
669 for view in views:669 for view in views:
670 view.options["descending"] = True670 view.options["descending"] = True
671 view.options["limit"] = 100671 view.options["limit"] = 100
@@ -698,8 +698,8 @@
698 else:698 else:
699 if message["txtid"]:699 if message["txtid"]:
700 seen[message["txtid"]] = n700 seen[message["txtid"]] = n
701 701
702 WebUi.render(self, self.model.settings["theme"], "template.mako", 702 WebUi.render(self, self.model.settings["theme"], "template.mako",
703 message_store=messages,703 message_store=messages,
704 preferences=self.model.settings,704 preferences=self.model.settings,
705 services=self.model.services,705 services=self.model.services,
@@ -712,14 +712,14 @@
712712
713 def __init__(self):713 def __init__(self):
714 gtk.HBox.__init__(self, spacing=2)714 gtk.HBox.__init__(self, spacing=2)
715 715
716 self.entry = gtk.Entry()716 self.entry = gtk.Entry()
717 self.entry.connect("activate", self.on_search)717 self.entry.connect("activate", self.on_search)
718 self.entry.connect("changed", self.on_changed)718 self.entry.connect("changed", self.on_changed)
719719
720 self.button = gtk.Button("Search")720 self.button = gtk.Button("Search")
721 self.button.connect("clicked", self.on_search)721 self.button.connect("clicked", self.on_search)
722 722
723 self.pack_start(self.entry, True)723 self.pack_start(self.entry, True)
724 self.pack_start(self.button, False)724 self.pack_start(self.button, False)
725725
@@ -731,7 +731,7 @@
731 def on_search(self, *args):731 def on_search(self, *args):
732 self.emit("search", self.entry.get_text())732 self.emit("search", self.entry.get_text())
733 self.clear()733 self.clear()
734 734
735 def clear(self):735 def clear(self):
736 self.entry.set_text("")736 self.entry.set_text("")
737737
@@ -748,7 +748,7 @@
748748
749 def focus(self):749 def focus(self):
750 self.entry.grab_focus()750 self.entry.grab_focus()
751 751
752class Input(gtk.Frame):752class Input(gtk.Frame):
753 __gsignals__ = {753 __gsignals__ = {
754 "submit": (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, None, (str, int)),754 "submit": (gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, None, (str, int)),
@@ -767,6 +767,9 @@
767 scroll.add(self.textview)767 scroll.add(self.textview)
768 self.add(scroll)768 self.add(scroll)
769769
770 self.set_focus_child(scroll)
771 scroll.set_focus_child(self.textview)
772
770 def get_text(self):773 def get_text(self):
771 return self.textview.get_text()774 return self.textview.get_text()
772775
@@ -780,7 +783,7 @@
780 text = self.textview.get_text()783 text = self.textview.get_text()
781 chars = self.textview.get_char_count()784 chars = self.textview.get_char_count()
782 self.emit("changed", text, chars)785 self.emit("changed", text, chars)
783 786
784 def do_submit_event(self, tv):787 def do_submit_event(self, tv):
785 text = tv.get_text()788 text = tv.get_text()
786 chars = tv.get_char_count()789 chars = tv.get_char_count()
@@ -798,13 +801,13 @@
798801
799 self.overlay_color = util.get_theme_colors()["text"].darker(3).hex802 self.overlay_color = util.get_theme_colors()["text"].darker(3).hex
800 self.overlay_text = '<span weight="bold" size="xx-large" foreground="%s">%s</span>'803 self.overlay_text = '<span weight="bold" size="xx-large" foreground="%s">%s</span>'
801 804
802 self.shortener = util.getbus("URLShorten")805 self.shortener = util.getbus("URLShorten")
803806
804 self.connection = util.getbus("Connection")807 self.connection = util.getbus("Connection")
805 self.connection.connect_to_signal("ConnectionOnline", self.on_connection_online)808 self.connection.connect_to_signal("ConnectionOnline", self.on_connection_online)
806 self.connection.connect_to_signal("ConnectionOffline", self.on_connection_offline)809 self.connection.connect_to_signal("ConnectionOffline", self.on_connection_offline)
807 810
808 self.get_buffer().connect("insert-text", self.on_add_text)811 self.get_buffer().connect("insert-text", self.on_add_text)
809 self.get_buffer().connect("changed", self.on_text_changed)812 self.get_buffer().connect("changed", self.on_text_changed)
810 self.connect("expose-event", self.expose_view)813 self.connect("expose-event", self.expose_view)
@@ -820,7 +823,7 @@
820 self.set_right_margin(2)823 self.set_right_margin(2)
821 self.set_pixels_above_lines(2)824 self.set_pixels_above_lines(2)
822 self.set_pixels_below_lines(2)825 self.set_pixels_below_lines(2)
823 826
824 self.base_color = util.get_style().base[gtk.STATE_NORMAL]827 self.base_color = util.get_style().base[gtk.STATE_NORMAL]
825 self.error_color = gtk.gdk.color_parse("indianred")828 self.error_color = gtk.gdk.color_parse("indianred")
826829
@@ -849,7 +852,7 @@
849 buf = self.get_buffer()852 buf = self.get_buffer()
850 buf.stop_emission("insert-text")853 buf.stop_emission("insert-text")
851 service = self.model.settings["urlshorter"] or "is.gd"854 service = self.model.settings["urlshorter"] or "is.gd"
852 855
853 def add_shortened(shortened_url):856 def add_shortened(shortened_url):
854 "Internal add-shortened-url-to-buffer function: a closure"857 "Internal add-shortened-url-to-buffer function: a closure"
855 iter_start = buf.get_iter_at_mark(mark_start)858 iter_start = buf.get_iter_at_mark(mark_start)
@@ -860,7 +863,7 @@
860 "Internal shortening-url-died function: a closure"863 "Internal shortening-url-died function: a closure"
861 iter = buf.get_iter_at_mark(mark)864 iter = buf.get_iter_at_mark(mark)
862 buf.insert(iter, text) # shortening failed865 buf.insert(iter, text) # shortening failed
863 866
864 # set a mark at iter, so that the callback knows where to insert867 # set a mark at iter, so that the callback knows where to insert
865 mark_start = buf.create_mark(None, iter, True)868 mark_start = buf.create_mark(None, iter, True)
866 # insert a placeholder character869 # insert a placeholder character
@@ -870,9 +873,9 @@
870 iter_end = buf.get_iter_at_mark(buf.get_insert())873 iter_end = buf.get_iter_at_mark(buf.get_insert())
871 mark_end = buf.create_mark(None, iter_end, True)874 mark_end = buf.create_mark(None, iter_end, True)
872 self.shortener.Shorten(text, service,875 self.shortener.Shorten(text, service,
873 reply_handler=add_shortened, 876 reply_handler=add_shortened,
874 error_handler=error_shortened)877 error_handler=error_shortened)
875 878
876 def set_overlay_text(self, text):879 def set_overlay_text(self, text):
877 self.pango_overlay.set_markup(self.overlay_text % (self.overlay_color, text))880 self.pango_overlay.set_markup(self.overlay_text % (self.overlay_color, text))
878881