| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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() |
| OLD | NEW |