Changeset 511

Show
Ignore:
Timestamp:
12/01/06 22:07:53 (2 years ago)
Author:
nicfit
Message:

remote control support using dbus

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/configure.ac

    r490 r511  
    1818AC_PREREQ([2.57]) 
    1919 
    20 AC_INIT([Mesk], [0.2.99], [Travis Shirk <travis@pobox.com>], [mesk]) 
     20AC_INIT([Mesk], [0.3.0], [Travis Shirk <travis@pobox.com>], [mesk]) 
    2121PACKAGE_CODENAME="The Sword" 
    2222AC_SUBST([PACKAGE_CODENAME]) 
  • trunk/src/dbus_service.py

    r509 r511  
    2020import gobject 
    2121import dbus, dbus.service, dbus.glib 
     22import mesk 
    2223 
    2324OBJ_PATH  = '/net/nicfit/mesk/MeskApp' 
     
    2829    '''A dbus service object for Mesk''' 
    2930 
    30     def __init__(self, bus_name, obj_path=OBJ_PATH): 
    31         dbus.service.Object.__init__(self, bus_name, obj_path) 
     31    def __init__(self, bus_name, profile, audio_ctrl): 
     32        dbus.service.Object.__init__(self, bus_name, OBJ_PATH) 
     33        self._profile = profile 
     34        self._audio_control = audio_ctrl 
    3235 
    3336    @dbus.service.method(INTERFACE) 
    34     def hello_world(self): 
    35         return "hello world" 
     37    def stop(self): 
     38        self._audio_control.stop() 
    3639 
     40    @dbus.service.method(INTERFACE) 
     41    def play(self): 
     42        self._audio_control.play() 
     43 
     44    @dbus.service.method(INTERFACE) 
     45    def pause(self): 
     46        self._audio_control.pause() 
     47 
     48    @dbus.service.method(INTERFACE) 
     49    def pause(self): 
     50        self._audio_control.pause() 
     51 
     52    @dbus.service.method(INTERFACE) 
     53    def prev(self): 
     54        self._audio_control.prev() 
     55 
     56    @dbus.service.method(INTERFACE) 
     57    def next(self): 
     58        self._audio_control.next() 
     59 
  • trunk/src/main.py

    r509 r511  
    2727        '''Constructor''' 
    2828 
    29         # XXX Workaround gst intercepting --help by ensuring gst is not imported 
     29        # Workaround gst intercepting --help by ensuring gst is not imported 
    3030        # at this point. 
    3131        def handle_gst_option(): 
     
    4949                        handle_gst_option() # This will not return 
    5050 
     51        gtk.window_set_auto_startup_notification(False) 
     52 
     53        # Parse command line 
    5154        self.cmd_line = OptionParser() 
    5255        (self.opts, self.args) = self.cmd_line.parse_args() 
    53         gtk.window_set_auto_startup_notification(False) 
     56        # The profile is used for the GUI and to select a dbus service instance 
     57        self.profile = self.opts.profile 
     58        self.remote_control = None 
    5459 
    5560    def run(self): 
     61        import mesk 
     62 
     63        remote_status = 0 
     64        # Handle remote control options 
     65        for arg in sys.argv[1:]: 
     66            if arg in self.cmd_line.remote_control_opts: 
     67                try: 
     68                    remote_status |= self._remote_control(arg) 
     69                except Exception, ex: 
     70                    mesk.log.error('Dbus error: %s' % str(ex)) 
     71                    return 5 
     72 
     73        if self.remote_control: 
     74            return remote_status 
     75 
     76        # Init GUI 
    5677        self._init() 
    5778 
    5879        # Main window 
    5980        from main_window import MainWindow 
    60         self.main_window = MainWindow(
     81        self.main_window = MainWindow(self.profile
    6182        self.main_window.show() 
    6283        gtk.gdk.notify_startup_complete() 
     
    7596        # Shutdown 
    7697        mesk.config.save(self.config_file) 
    77         mesk.plugin.shutdown() 
    7898        return 0 
    7999 
    80100    def _init(self): 
    81         import mesk 
    82101        # Load configuration 
    83         profile = self.opts.profile 
    84         if self.opts.profile: 
     102        if self.profile: 
    85103            self.config_file = '%s/config.%s' % (mesk.MESK_DIR, 
    86104                                                 self.opts.profile) 
     
    102120                sys.exit(1) 
    103121            mesk.log.set_logging_level(lvl) 
     122 
    104123        if self.opts.profile: 
    105124            mesk.log.verbose('Using profile: %s' % self.opts.profile) 
     
    114133        mesk.config.set(mesk.CONFIG_MAIN, 'version', mesk.info.APP_VERSION) 
    115134 
    116         # Initialize i18n 
     135        # Initialize glade i18n 
    117136        import gtk.glade 
    118137        gtk.glade.bindtextdomain('mesk', mesk.i18n.DIR) 
     
    136155        else: 
    137156            mesk.log.debug('Enabling Gnome session management') 
    138             gnome.program_init(mesk.info.APP_NAME.lower(), 
     157            gnome.program_init("foo",# mesk.info.APP_NAME.lower(), 
    139158                               mesk.info.APP_VERSION) 
    140159            cli = gnome.ui.master_client() 
     
    149168                cli.set_restart_command(len(argv), argv) 
    150169 
    151         # Initialize Dbus, if possible 
    152         try: 
    153             import dbus, dbus.service 
    154         except ImportError: 
    155             self.DBUS_SUPPORT = False 
    156             self.mesk_dbus = None 
    157             mesk.log.warning("Not able to load DBus, support is disabled") 
    158         else: 
    159             import dbus_service 
    160             self.DBUS_SUPPORT = True 
    161             session_bus = dbus.SessionBus() 
    162             name = dbus.service.BusName(dbus_service.SERVICE, bus=session_bus) 
    163             self.mesk_dbus = dbus_service.MeskDbusService(name) 
    164             mesk.log.verbose("DBus support activated") 
    165  
    166         # Initialize plugin manager 
    167         import mesk.plugin 
    168         plugin_dir = mesk.config.get(mesk.CONFIG_MAIN, 'plugins_dir') 
    169         plugin_mgr = mesk.plugin.PluginMgr(plugin_dir) 
    170         mesk.plugin.set_manager(plugin_mgr) 
    171  
    172170    def _migrate_config(self, old_version, my_version): 
    173171        import mesk.log, mesk.playlist 
     
    203201                    mesk.config.remove_section(sect) 
    204202                mesk.config.set(mesk.CONFIG_MAIN, 'playlists', 'Playlist') 
     203 
     204    def _remote_control(self, cmd): 
     205        if self.remote_control is None: 
     206            import dbus 
     207            import dbus_service  # This is a local module 
     208            session_bus = dbus.SessionBus() 
     209            self.remote_control = \ 
     210                dbus.Interface(session_bus.get_object(dbus_service.SERVICE, 
     211                                                      dbus_service.OBJ_PATH), 
     212                               dbus_service.INTERFACE) 
     213 
     214        if cmd in ['--stop']: 
     215            self.remote_control.stop() 
     216        elif cmd in ['--play']: 
     217            self.remote_control.play() 
     218        elif cmd in ['--pause']: 
     219            self.remote_control.pause() 
     220        elif cmd in ['--prev']: 
     221            self.remote_control.prev() 
     222        elif cmd in ['--next']: 
     223            self.remote_control.next() 
     224        else: 
     225            assert(False) # This should not happen 
     226            return -1 
     227 
     228        return 0 
    205229 
    206230import optparse 
     
    219243                        help=_('Start with profile NAME.'), 
    220244                        metavar='NAME', default='') 
    221         self.add_option('-l', '--log-level', dest='log_level', 
    222                         help=_('Select the amount of terminal logging.  May be ' 
    223                                'CRITICAL, ERROR, WARNING, INFO, VERBOSE, or ' 
    224                                'DEBUG'), 
    225                         metavar='LEVEL', default='') 
     245 
     246        # Remote control options 
     247        rc_opts = optparse.OptionGroup(self, _('Remote Control Options')) 
     248        rc_opts.set_description(_('These options operate on a running Mesk ' 
     249                                  'instance.  Which instance is determined ' 
     250                                  'by the profile option (-p,--profile).')) 
     251        rc_opts.add_option('--stop', action='store_true', dest='stop', 
     252                           help=_('Stops playback')) 
     253        rc_opts.add_option('--play', action='store_true', dest='play', 
     254                           default=False, help=_('Starts playback')) 
     255        rc_opts.add_option('--pause', action='store_true', dest='pause', 
     256                           default=False, help=_('Pauses playback')) 
     257        rc_opts.add_option('--prev', action='store_true', dest='prev', 
     258                           default=False, help=_('Previous track')) 
     259        rc_opts.add_option('--next', action='store_true', dest='next', 
     260                           default=False, help=_('Next track')) 
     261        self.add_option_group(rc_opts) 
     262 
     263        # Build complete list of remote control options 
     264        self.remote_control_opts = [] 
     265        for opt in rc_opts.option_list: 
     266            for o in opt._short_opts: 
     267                self.remote_control_opts.append(o) 
     268            for o in opt._long_opts: 
     269                self.remote_control_opts.append(o) 
    226270 
    227271        # Developer options 
    228         debug_opts = optparse.OptionGroup(self, _('Advanced Options')); 
     272        debug_opts = optparse.OptionGroup(self, _('Advanced Options')) 
     273        debug_opts.add_option('-l', '--log-level', dest='log_level', 
     274                              help=_('Select the amount of terminal logging. ' 
     275                                     'May be CRITICAL, ERROR, WARNING, INFO, ' 
     276                                     'VERBOSE, or DEBUG'), 
     277                              metavar='LEVEL', default='') 
    229278        debug_opts.add_option('--debug', action='store_true', 
    230279                              dest='debug', default=False, 
  • trunk/src/main_window.py

    r507 r511  
    2323 
    2424import mesk 
     25import mesk.plugin 
    2526import mesk.gtk_utils 
    2627import mesk.window 
     
    4243    DND_TARGETS = [('MESK_TAB', 0, 81)] 
    4344 
    44     def __init__(self): 
     45    def __init__(self, profile): 
     46        self.profile = profile 
    4547        self._is_compact = False 
    4648        self._controls = [] 
     
    116118 
    117119        self.tips_window = None 
     120 
     121        # Initialize Dbus, if possible 
     122        try: 
     123            import dbus, dbus.service 
     124        except ImportError: 
     125            self.DBUS_SUPPORT = False 
     126            self.mesk_dbus = None 
     127            mesk.log.warning("Not able to load DBus, support is disabled") 
     128        else: 
     129            import dbus_service 
     130            self.DBUS_SUPPORT = True 
     131            session_bus = dbus.SessionBus() 
     132            name = dbus.service.BusName(dbus_service.SERVICE, bus=session_bus) 
     133            self.mesk_dbus = dbus_service.MeskDbusService(name, self.profile, 
     134                                                          self._audio_control) 
     135            mesk.log.verbose("DBus support activated") 
     136 
     137        # Initialize plugin manager 
     138        plugin_dir = mesk.config.get(mesk.CONFIG_MAIN, 'plugins_dir') 
     139        plugin_mgr = mesk.plugin.PluginMgr(plugin_dir) 
     140        mesk.plugin.set_manager(plugin_mgr) 
    118141 
    119142    def add_playlist_control(self, name, set_active=False): 
     
    301324            self._pref_window.window.destroy() 
    302325 
     326        # Shutdown plugins 
     327        mesk.plugin.shutdown() 
     328 
    303329        # Shutdown all controls 
    304330        playlists = [] 
     
    341367        x = mesk.config.getint(mesk.CONFIG_UI, 'main_window_pos_x') 
    342368        y = mesk.config.getint(mesk.CONFIG_UI, 'main_window_pos_y') 
    343         mesk.log.debug('_restore_window_attrs pos (%d,%d)' % (x, y))  
     369        mesk.log.debug('_restore_window_attrs pos (%d,%d)' % (x, y)) 
    344370        self.window.move(x, y) 
    345371 
    346372        width = mesk.config.getint(mesk.CONFIG_UI, 'main_window_width') 
    347373        height = mesk.config.getint(mesk.CONFIG_UI, 'main_window_height') 
    348         mesk.log.debug('_restore_window_attrs size %dx%d' % (width, height))  
     374        mesk.log.debug('_restore_window_attrs size %dx%d' % (width, height)) 
    349375        self.window.resize(width, height) 
    350376 
     
    352378        '''Overridden from mesk.window.Window''' 
    353379        if mesk.config.getboolean(mesk.CONFIG_UI, 'window_hide_on_close'): 
     380            self._save_window_attrs() 
    354381            self.window.hide() 
    355382            return True