~ubuntu-branches/ubuntu/maverick/ibus/maverick-updates

« back to all changes in this revision

Viewing changes to ui/gtk/panel.py

  • Committer: Bazaar Package Importer
  • Author(s): Ken VanDine, Karl Lattimer, Ikuya Awashiro, Ken VanDine
  • Date: 2010-11-16 09:57:35 UTC
  • mfrom: (25.1.1 ibus)
  • Revision ID: james.westby@ubuntu.com-20101116095735-e6tt9c3ek3lam2yi
Tags: 1.3.7-1ubuntu4
[ Karl Lattimer ]
* debia/patches/05_appindicator.patch
  - Fixed unresponsive menu, (LP: #645724)
  - Fixed 100% cpu usage properly, (LP: #637671)
  - Fixed focus tracking issue, (LP: #522079)

[ Ikuya Awashiro ]
* debian/patches/03_fix1104.patch: added.
  - http://code.google.com/p/ibus/issues/detail?id=1104
  - This patch fixed (LP: #637671) finally.

[ Ken VanDine ]
* debian/README.source
  - Removed, it was outdated and no longer correct

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
import gtk
24
24
import gtk.gdk as gdk
25
25
import gobject
 
26
import glib
26
27
import ibus
27
28
import icon as _icon
28
29
import os
37
38
try:
38
39
    import appindicator
39
40
except:
40
 
    pass
 
41
    appindicator = None
41
42
 
42
43
from gettext import dgettext
43
44
_  = lambda a : dgettext("ibus", a)
68
69
        self.__bus = bus
69
70
        self.__config = self.__bus.get_config()
70
71
        self.__focus_ic = None
71
 
        self.__setup_pid = 0
 
72
        self.__setup_pid = None
 
73
        self.__block_activate = False
72
74
        self.__prefix = os.getenv("IBUS_PREFIX")
73
75
        self.__data_dir = path.join(self.__prefix, "share", "ibus")
74
76
        # self.__icons_dir = path.join(self.__data_dir, "icons")
75
77
        self.__setup_cmd = path.join(self.__prefix, "bin", "ibus-setup")
76
 
        
77
 
        # hanlder signal
78
 
        signal.signal(signal.SIGCHLD, self.__sigchld_cb)
79
78
 
80
79
        # connect bus signal
81
80
        self.__config.connect("value-changed", self.__config_value_changed_cb)
231
230
            else:
232
231
                self.__set_im_icon(ICON_KEYBOARD)
233
232
                self.__set_im_name(None)
 
233
                
234
234
        self.__language_bar.focus_in()
 
235
        while gtk.events_pending():
 
236
            gtk.main_iteration(False)
235
237
        if self.__appindicator:
236
 
            self.__previous_focus_ic = self.__focus_ic
237
238
            self.__appindicator_update_menu()
238
239
 
239
240
    def focus_out(self, ic):
240
241
        self.reset()
 
242
        self.__previous_focus_ic = self.__focus_ic
241
243
        self.__focus_ic = None
242
244
        self.__language_bar.set_enabled(False)
243
245
        self.__language_bar.focus_out()
244
246
        self.__set_im_icon(ICON_KEYBOARD)
245
247
        self.__set_im_name(None)
 
248
        
 
249
        while gtk.events_pending():
 
250
            gtk.main_iteration(False)
246
251
 
247
252
    def state_changed(self):
248
253
        if not self.__focus_ic:
425
430
 
426
431
        size = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU)
427
432
        menu = gtk.Menu()
 
433
 
428
434
        group = None
429
435
        for i, engine in enumerate(engines):
430
436
            lang = ibus.get_language_name(engine.language)
438
444
                    item.set_active(True)
439
445
                else:
440
446
                    for widget in item.get_children():
441
 
                        if isinstance(widget, gtk.Label):
442
 
                            widget.set_markup("<b>%s</b>" % widget.get_text())
 
447
                         if isinstance(widget, gtk.Label):
 
448
                             widget.set_markup("<b>%s</b>" % widget.get_text())
443
449
            if not self.__appindicator:
444
450
                if engine.icon:
445
451
                    item.set_image(_icon.IconWidget(engine.icon, size[0]))
447
453
                    item.set_image(_icon.IconWidget(ICON_ENGINE, size[0]))
448
454
            item.connect("activate", self.__im_menu_item_activate_cb, engine)
449
455
            menu.add(item)
 
456
 
 
457
            
450
458
        if self.__appindicator:
451
459
            item = gtk.RadioMenuItem(group, _("Input method Off"))
452
 
            item.connect("activate", self.__im_menu_item_activate_cb, None)
453
460
            if self.__focus_ic == None or not self.__focus_ic.is_enabled():
454
461
                item.set_active(True)
 
462
            item.connect("activate", self.__im_menu_item_activate_cb, None)
455
463
        else:
456
464
            item = gtk.ImageMenuItem(_("Turn off input method"))
457
465
            item.set_image(_icon.IconWidget("gtk-close", size[0]))
513
521
                self.__status_icon)
514
522
 
515
523
    def __appindicator_update_menu(self):
 
524
        self.__block_activate = True
516
525
        if not self.__appindicator:
517
526
            return
518
 
 
519
527
        if not self.__previous_focus_ic:
520
528
            menu = gtk.Menu()
521
529
            item = gtk.ImageMenuItem(_("No input window"))
528
536
        menu.add(gtk.SeparatorMenuItem())
529
537
 
530
538
        self.__create_sys_menu(menu)
531
 
 
 
539
        menu.set_take_focus(False)
532
540
        menu.show_all()
533
 
        menu.set_take_focus(False)
534
 
 
535
541
        self.__appindicator.set_menu(menu)
536
 
 
 
542
        self.__block_activate = False
 
543
 
537
544
    def __im_menu_item_activate_cb(self, item, engine):
 
545
        if self.__block_activate: return
 
546
        self.__block_activate = True
538
547
        focus_ic = self.__focus_ic
539
548
        if self.__previous_focus_ic:
540
549
            focus_ic = self.__previous_focus_ic
541
 
 
542
550
        if not focus_ic:
543
551
            return
544
 
        if engine:
 
552
 
 
553
        current_engine = focus_ic.get_engine()
 
554
 
 
555
        if not engine:
 
556
            focus_ic.disable()
 
557
        elif engine != current_engine:
 
558
            focus_ic.enable()
545
559
            focus_ic.set_engine(engine)
546
 
        else:
547
 
            focus_ic.disable()
 
560
        
 
561
        item.set_active(True)
 
562
        self.__block_activate = False
548
563
 
549
564
    def __sys_menu_item_activate_cb(self, item, command):
550
565
        if command == gtk.STOCK_PREFERENCES:
571
586
        else:
572
587
            print >> sys.stderr, "Unknown command %s" % command
573
588
 
574
 
    def __sigchld_cb(self, sig, sf):
575
 
        try:
576
 
            pid, status = os.wait()
577
 
            if self.__setup_pid == pid:
578
 
                self.__setup_pid = 0
579
 
        except:
580
 
            pass
 
589
    def __child_watch_cb(self, pid, status):
 
590
        self.__setup_pid.close()
 
591
        self.__setup_pid = None
581
592
 
582
593
    def __start_setup(self):
583
 
        if self.__setup_pid != 0:
584
 
            pid, state = os.waitpid(self.__setup_pid, os.P_NOWAIT)
585
 
            if pid != self.__setup_pid:
586
 
                os.kill(self.__setup_pid, signal.SIGUSR1)
587
 
                return
588
 
            self.__setup_pid = 0
589
 
        self.__setup_pid = os.spawnl(os.P_NOWAIT, self.__setup_cmd, "ibus-setup")
 
594
        if self.__setup_pid:
 
595
            # if setup dialog is running, bring the dialog to front by SIGUSR1
 
596
            self.__setup_pid.close()
 
597
            self.__setup_pid = None
 
598
            return
 
599
 
 
600
        pid = glib.spawn_async(argv=[self.__setup_cmd], flags=glib.SPAWN_DO_NOT_REAP_CHILD)[0]
 
601
        self.__setup_pid = pid
 
602
        glib.child_watch_add(self.__setup_pid, self.__child_watch_cb)
590
603