Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Side by Side Diff: ui/gtk/panel.py

Issue 1735020: Support changing the global input method engine without focus. (Closed) Base URL: ssh://git@chromiumos-git/ibus.git
Patch Set: Created 10 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ibus/interface/iibus.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # vim:set et sts=4 sw=4: 1 # vim:set et sts=4 sw=4:
2 # 2 #
3 # ibus - The Input Bus 3 # ibus - The Input Bus
4 # 4 #
5 # Copyright(c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com> 5 # Copyright(c) 2007-2010 Peng Huang <shawn.p.huang@gmail.com>
6 # Copyright(c) 2007-2010 Red Hat, Inc. 6 # Copyright(c) 2007-2010 Red Hat, Inc.
7 # 7 #
8 # This library is free software; you can redistribute it and/or 8 # This library is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU Lesser General Public 9 # modify it under the terms of the GNU Lesser General Public
10 # License as published by the Free Software Foundation; either 10 # License as published by the Free Software Foundation; either
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 show_uri(about.get_screen(), "mailto:%s" % email) 54 show_uri(about.get_screen(), "mailto:%s" % email)
55 55
56 gtk.about_dialog_set_url_hook(url_hook, None) 56 gtk.about_dialog_set_url_hook(url_hook, None)
57 gtk.about_dialog_set_email_hook(email_hook, None) 57 gtk.about_dialog_set_email_hook(email_hook, None)
58 58
59 class Panel(ibus.PanelBase): 59 class Panel(ibus.PanelBase):
60 __gtype_name__ = "IBusPanel" 60 __gtype_name__ = "IBusPanel"
61 def __init__(self, bus): 61 def __init__(self, bus):
62 super(Panel, self).__init__(bus) 62 super(Panel, self).__init__(bus)
63 self.__bus = bus 63 self.__bus = bus
64 self.__bus.connect("global-engine-changed",
65 self.__global_engine_changed_cb)
64 self.__config = self.__bus.get_config() 66 self.__config = self.__bus.get_config()
65 self.__focus_ic = None 67 self.__focus_ic = None
66 self.__setup_pid = 0 68 self.__setup_pid = 0
67 self.__prefix = os.getenv("IBUS_PREFIX") 69 self.__prefix = os.getenv("IBUS_PREFIX")
68 self.__data_dir = path.join(self.__prefix, "share", "ibus") 70 self.__data_dir = path.join(self.__prefix, "share", "ibus")
69 # self.__icons_dir = path.join(self.__data_dir, "icons") 71 # self.__icons_dir = path.join(self.__data_dir, "icons")
70 self.__setup_cmd = path.join(self.__prefix, "bin", "ibus-setup") 72 self.__setup_cmd = path.join(self.__prefix, "bin", "ibus-setup")
71 self.__setxkbmap_cmd = path.join(self.__prefix, "bin", "setxkbmap") 73 self.__setxkbmap_cmd = path.join(self.__prefix, "bin", "setxkbmap")
72 self.__current_xkb_layout = "" 74 self.__current_xkb_layout = ""
73 self.__default_xkb_layout = "us" 75 self.__default_xkb_layout = "us"
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 self.__status_icon.set_from_file(icon_name) 199 self.__status_icon.set_from_file(icon_name)
198 else: 200 else:
199 self.__status_icon.set_from_icon_name(icon_name) 201 self.__status_icon.set_from_icon_name(icon_name)
200 202
201 def __set_im_name(self, name): 203 def __set_im_name(self, name):
202 self.__language_bar.set_im_name(name) 204 self.__language_bar.set_im_name(name)
203 205
204 def focus_in(self, ic): 206 def focus_in(self, ic):
205 self.reset() 207 self.reset()
206 self.__focus_ic = ibus.InputContext(self.__bus, ic) 208 self.__focus_ic = ibus.InputContext(self.__bus, ic)
207 enabled = self.__focus_ic.is_enabled() 209 self.__update_ui_and_xkb_layout()
208 self.__language_bar.set_enabled(enabled)
209
210 if not enabled:
211 self.__set_im_icon(ICON_KEYBOARD)
212 self.__set_im_name(None)
213 if self.__bus.get_use_sys_layout():
214 self.__set_xkb_layout(self.__default_xkb_layout)
215 else:
216 engine = self.__focus_ic.get_engine()
217 if engine:
218 self.__set_im_icon(engine.icon)
219 self.__set_im_name(engine.longname)
220 if self.__bus.get_use_sys_layout():
221 self.__set_xkb_layout(engine.layout)
222 else:
223 self.__set_im_icon(ICON_KEYBOARD)
224 self.__set_im_name(None)
225 if self.__bus.get_use_sys_layout():
226 self.__set_xkb_layout(self.__default_xkb_layout)
227 self.__language_bar.focus_in() 210 self.__language_bar.focus_in()
228 211
229 def focus_out(self, ic): 212 def focus_out(self, ic):
230 self.reset() 213 self.reset()
231 self.__focus_ic = None 214 self.__focus_ic = None
232 self.__language_bar.set_enabled(False) 215 self.__update_ui_and_xkb_layout()
233 self.__language_bar.focus_out() 216 self.__language_bar.focus_out()
234 self.__set_im_icon(ICON_KEYBOARD)
235 self.__set_im_name(None)
236 if self.__bus.get_use_sys_layout():
237 self.__set_xkb_layout(self.__default_xkb_layout)
238 217
239 def state_changed(self): 218 def state_changed(self):
240 if not self.__focus_ic: 219 if not self.__focus_ic:
241 return 220 return
242 221 self.__update_ui_and_xkb_layout()
243 enabled = self.__focus_ic.is_enabled()
244 self.__language_bar.set_enabled(enabled)
245
246 if enabled == False:
247 self.reset()
248 self.__set_im_icon(ICON_KEYBOARD)
249 self.__set_im_name(None)
250 if self.__bus.get_use_sys_layout():
251 self.__set_xkb_layout(self.__default_xkb_layout)
252 else:
253 engine = self.__focus_ic.get_engine()
254 if engine:
255 self.__set_im_icon(engine.icon)
256 self.__set_im_name(engine.longname)
257 if self.__bus.get_use_sys_layout():
258 self.__set_xkb_layout(engine.layout)
259 else:
260 self.__set_im_icon(ICON_KEYBOARD)
261 self.__set_im_name(None)
262 if self.__bus.get_use_sys_layout():
263 self.__set_xkb_layout(self.__default_xkb_layout)
264 222
265 def reset(self): 223 def reset(self):
266 self.__candidate_panel.reset() 224 self.__candidate_panel.reset()
267 self.__language_bar.reset() 225 self.__language_bar.reset()
268 226
269 def start_setup(self): 227 def start_setup(self):
270 self.__start_setup() 228 self.__start_setup()
271 229
272 def do_destroy(self): 230 def do_destroy(self):
273 gtk.main_quit() 231 gtk.main_quit()
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 # menu.add(item) 365 # menu.add(item)
408 366
409 # menu.show_all() 367 # menu.show_all()
410 # menu.set_take_focus(False) 368 # menu.set_take_focus(False)
411 # return menu 369 # return menu
412 370
413 def __create_im_menu(self): 371 def __create_im_menu(self):
414 engines = self.__bus.list_active_engines() 372 engines = self.__bus.list_active_engines()
415 current_engine = \ 373 current_engine = \
416 (self.__focus_ic != None and self.__focus_ic.get_engine()) or \ 374 (self.__focus_ic != None and self.__focus_ic.get_engine()) or \
375 self.__bus.get_global_engine() or \
417 (engines and engines[0]) or \ 376 (engines and engines[0]) or \
418 None 377 None
419 378
420 size = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU) 379 size = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU)
421 menu = gtk.Menu() 380 menu = gtk.Menu()
422 for i, engine in enumerate(engines): 381 for i, engine in enumerate(engines):
423 lang = ibus.get_language_name(engine.language) 382 lang = ibus.get_language_name(engine.language)
424 item = gtk.ImageMenuItem("%s - %s" % (lang, engine.longname)) 383 item = gtk.ImageMenuItem("%s - %s" % (lang, engine.longname))
425 if current_engine and current_engine.name == engine.name: 384 if current_engine and current_engine.name == engine.name:
426 for widget in item.get_children(): 385 for widget in item.get_children():
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 422
464 def __status_icon_popup_menu_cb(self, status_icon, button, active_time): 423 def __status_icon_popup_menu_cb(self, status_icon, button, active_time):
465 menu = self.__create_sys_menu() 424 menu = self.__create_sys_menu()
466 menu.popup(None, None, 425 menu.popup(None, None,
467 gtk.status_icon_position_menu, 426 gtk.status_icon_position_menu,
468 button, 427 button,
469 active_time, 428 active_time,
470 self.__status_icon) 429 self.__status_icon)
471 430
472 def __status_icon_activate_cb(self, status_icon): 431 def __status_icon_activate_cb(self, status_icon):
473 if not self.__focus_ic: 432 if not (self.__focus_ic or self.__bus.get_use_global_engine()):
474 menu = gtk.Menu() 433 menu = gtk.Menu()
475 item = gtk.ImageMenuItem(_("No input window")) 434 item = gtk.ImageMenuItem(_("No input window"))
476 size = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU) 435 size = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU)
477 item.set_image(_icon.IconWidget("gtk-info", size[0])) 436 item.set_image(_icon.IconWidget("gtk-info", size[0]))
478 menu.add(item) 437 menu.add(item)
479 menu.show_all() 438 menu.show_all()
480 else: 439 else:
481 menu = self.__create_im_menu() 440 menu = self.__create_im_menu()
482 self.__language_bar.create_im_menu(menu) 441 self.__language_bar.create_im_menu(menu)
483 menu.popup(None, None, 442 menu.popup(None, None,
484 gtk.status_icon_position_menu, 443 gtk.status_icon_position_menu,
485 0, 444 0,
486 gtk.get_current_event_time(), 445 gtk.get_current_event_time(),
487 self.__status_icon) 446 self.__status_icon)
488 447
489 def __im_menu_item_activate_cb(self, item, engine): 448 def __im_menu_item_activate_cb(self, item, engine):
490 if not self.__focus_ic: 449 if self.__focus_ic:
491 return 450 if engine:
492 if engine: 451 self.__focus_ic.set_engine(engine)
493 self.__focus_ic.set_engine(engine) 452 else:
494 else: 453 self.__focus_ic.disable()
495 self.__focus_ic.disable() 454 elif self.__bus.get_use_global_engine() and engine:
455 self.__bus.set_global_engine(engine)
496 456
497 def __sys_menu_item_activate_cb(self, item, command): 457 def __sys_menu_item_activate_cb(self, item, command):
498 if command == gtk.STOCK_PREFERENCES: 458 if command == gtk.STOCK_PREFERENCES:
499 self.__start_setup() 459 self.__start_setup()
500 elif command == gtk.STOCK_ABOUT: 460 elif command == gtk.STOCK_ABOUT:
501 about_dialog = gtk.AboutDialog() 461 about_dialog = gtk.AboutDialog()
502 about_dialog.set_program_name("IBus") 462 about_dialog.set_program_name("IBus")
503 about_dialog.set_version(ibus.get_version()) 463 about_dialog.set_version(ibus.get_version())
504 about_dialog.set_copyright(ibus.get_copyright()) 464 about_dialog.set_copyright(ibus.get_copyright())
505 about_dialog.set_license(ibus.get_license()) 465 about_dialog.set_license(ibus.get_license())
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
537 self.__setup_pid = os.spawnl(os.P_NOWAIT, self.__setup_cmd, "ibus-setup" ) 497 self.__setup_pid = os.spawnl(os.P_NOWAIT, self.__setup_cmd, "ibus-setup" )
538 498
539 def __set_xkb_layout(self, layout): 499 def __set_xkb_layout(self, layout):
540 # if it's not a us keyboard layout, then we need to load us layout 500 # if it's not a us keyboard layout, then we need to load us layout
541 # into the second group. Otherwise applications' key bindings may 501 # into the second group. Otherwise applications' key bindings may
542 # not work correctly. 502 # not work correctly.
543 if layout != "us" and not layout.startswith("us("): 503 if layout != "us" and not layout.startswith("us("):
544 layout = layout + ",us" 504 layout = layout + ",us"
545 505
546 if self.__current_xkb_layout == layout: 506 if self.__current_xkb_layout == layout:
547 return; 507 return
548 508
549 self.__current_xkb_layout = layout 509 self.__current_xkb_layout = layout
550 510
551 # FIXME: It's an ugly hack. libxklavier might be used to make it more 511 # FIXME: It's an ugly hack. libxklavier might be used to make it more
552 # reliable. 512 # reliable.
553 try: 513 try:
554 os.spawnv(os.P_WAIT, self.__setxkbmap_cmd, 514 os.spawnv(os.P_WAIT, self.__setxkbmap_cmd,
555 [ "setxkbmap", "-layout", layout ] ) 515 [ "setxkbmap", "-layout", layout ] )
556 except: 516 except:
557 print >> sys.stderr, "Failed to run %s" % self.__setxkbmap_cmd 517 print >> sys.stderr, "Failed to run %s" % self.__setxkbmap_cmd
518
519 def __update_ui_and_xkb_layout(self):
520 engine = None
521 enabled = False
522 language_bar_enabled = False
523
524 if self.__focus_ic:
525 engine = self.__focus_ic.get_engine()
526 enabled = self.__focus_ic.is_enabled()
527 language_bar_enabled = enabled
528 elif self.__bus.get_use_global_engine():
529 engine = self.__bus.get_global_engine()
530 enabled = self.__bus.is_global_engine_enabled()
531
532 self.__language_bar.set_enabled(language_bar_enabled)
533
534 if engine and enabled:
535 self.__set_im_icon(engine.icon)
536 self.__set_im_name(engine.longname)
537 if self.__bus.get_use_sys_layout():
538 self.__set_xkb_layout(engine.layout)
539 else:
540 self.__set_im_icon(ICON_KEYBOARD)
541 self.__set_im_name(None)
542 if self.__bus.get_use_sys_layout():
543 self.__set_xkb_layout(self.__default_xkb_layout)
544
545 def __global_engine_changed_cb(self, bus):
546 if not self.__focus_ic:
547 self.__update_ui_and_xkb_layout()
OLDNEW
« no previous file with comments | « ibus/interface/iibus.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698