Changeset 489

Show
Ignore:
Timestamp:
03/17/2008 00:04:09 (6 months ago)
Author:
why
Message:
  • shoes/app.c: App#started? returns true if the window is fully loaded.
  • lib/shoes.rb: Shoes.setup for easing the installation of gem prerequisites.
Location:
trunk
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • trunk/lib/shoes.rb

    r488 r489  
    135135  end 
    136136 
     137  class SettingUp < StandardError; end 
     138 
     139  @setups = {} 
     140 
     141  def self.setup &blk 
     142    line = caller[-1] 
     143    return if @setups[line] 
     144    script = line[/^(.+?):/, 1] 
     145    Shoes::Setup.new(script, &blk) 
     146    @setups[line] = true 
     147    raise SettingUp 
     148  end 
     149 
    137150  def self.show_selector 
    138151    fname = ask_open_file 
     
    178191 
    179192  def self.args! 
     193    Shoes::Setup.init 
    180194    if PLATFORM !~ /darwin/ 
    181195      if ARGV.empty? 
     
    221235      eval(File.read(path), TOPLEVEL_BINDING, path) 
    222236    end 
     237  rescue SettingUp 
    223238  end 
    224239 
  • trunk/lib/shoes/cache.rb

    r482 r489  
    4343  end 
    4444end 
     45class << Gem; attr_accessor :loaded_specs end 
    4546 
    4647# STDIN.reopen("/dev/tty") if STDIN.eof? 
    4748class NotSupportedByShoes < Exception; end 
    4849 
    49 def gem_reset 
    50   if Gem.const_defined? :ConfigFile 
    51     Gem.configuration = Gem::ConfigFile.new(:gemhome => GEM_DIR, :gempath => GEM_DIR) 
    52   end 
    53   Gem.use_paths(GEM_DIR, [GEM_DIR]) 
    54   Gem.source_index.refresh! 
    55 end 
    56 def source(uri) 
    57   puts "** Getting gems from #{uri}..." 
    58   Gem.sources.clear 
    59   Gem.sources << uri 
    60 end 
    61 def libdir(path) 
    62   path = File.expand_path(path) 
    63   puts "** Adding #{path} to the $LOAD_PATH..." 
    64   $:.unshift path 
    65 end 
    66 def setup_gems_app 
    67   unless Shoes === Gem::DefaultUserInteraction.ui 
     50class Shoes::Setup 
     51 
     52  def self.init 
     53    Gem.manage_gems 
     54 
     55    gem_reset 
     56    install_sources 
     57  end 
     58 
     59  def self.gem_reset 
     60    if Gem.const_defined? :ConfigFile 
     61      Gem.configuration = Gem::ConfigFile.new(:gemhome => GEM_DIR, :gempath => GEM_DIR) 
     62    end 
     63    Gem.use_paths(GEM_DIR, [GEM_DIR]) 
     64    Gem.source_index.refresh! 
     65  end 
     66 
     67  def self.source(uri) 
     68    Gem.sources.clear 
     69    Gem.sources << uri 
     70  end 
     71 
     72  def self.setup_app(setup) 
    6873    app =  
    6974      Shoes.app :width => 370, :height => 148, :resizable => false do 
     
    7580          progress :width => 1.0, :top => 80 
    7681        end 
    77       end 
    78     Gem::DefaultUserInteraction.ui = Gem::ShoesFace.new(app) 
    79   end 
    80   Gem::DefaultUserInteraction.ui 
    81 end 
    82 def fetch_gems(*gems, &blk) 
    83   ui = setup_gems_app 
    84   count, total = 0, gems.length 
    85   ui.progress count, total 
    86  
    87   gems.each do |name, version| 
    88     name, version = name.split(/\s+/, 2) if name =~ /\s/ 
    89     count += 1 
    90     ui.say "Looking for #{name}" 
    91     if Gem.source_index.find_name(name, version).empty? 
    92       ui.title "Installing #{name}" 
    93       installer = Gem::DependencyInstaller.new 
    94       installer.install(name, version || Gem::Requirement.default) 
    95       gem_reset 
    96     end 
    97     gem = Gem.source_index.find_name(name, version).first 
    98     Gem.activate(gem.name, true, "= #{gem.version}") 
    99     ui.say "Finished installing #{name}" 
    100     ui.progress count, total 
    101   end 
    102  
    103   if blk 
    104     Dir.chdir(gem.full_gem_path, &blk) 
    105   end 
    106 end 
    107 def svn(dir, save_as = nil, &blk) 
    108   dir.gsub! /(.)\/*$/, '\1/' 
    109   if save_as.nil? or save_as.empty? 
    110     save_as = File.join(GEM_DIR, 'svn', '1') 
    111     save_as.succ! while File.exists? save_as 
    112   elsif save_as.index(GEM_DIR) != 0 
    113     save_as = File.join(GEM_DIR, 'svn', save_as) 
    114   end 
    115   mkdir_p(save_as) 
    116   puts "** Pulling down #{dir}..." 
    117   svnuri = URI.parse(dir) 
    118   case svnuri.scheme 
    119   when "http", "https" 
    120     REXML::Document.new(svnuri.open { |f| f.read }). 
    121       each_element("/svn/index/*") do |ele| 
    122         fname, href = ele.attributes['name'], ele.attributes['href'] 
    123         case ele.name 
    124         when "file" 
    125           puts "- #{dir}#{href}" 
    126           URI.parse("#{dir}#{href}").open do |f| 
    127             File.open(File.join(save_as, fname), 'wb') do |f2| 
    128               f2 << f.read(16384) until f.eof? 
    129             end 
     82        Thread.start(self) do |app| 
     83          begin 
     84            sleep(1) until app.started? 
     85            setup.start 
     86          rescue => e 
     87            puts e.message 
    13088          end 
    131         when "dir" 
    132           svn("#{dir}#{href}", File.join(save_as, fname)) 
    13389        end 
    13490      end 
    135   else 
    136     raise NotSupportedByShoes, "Only HTTP addresses are supported by Shoes's Subversion module." 
    137   end 
    138   if blk 
    139     Dir.chdir(save_as, &blk) 
    140   end 
    141 end 
    142 def install_sources 
    143   require 'base64' 
    144   sources_gem = File.join(LIB_DIR, "sources-0.0.1.gem") 
    145   File.open(sources_gem, "wb") do |f| 
    146     f << Base64.decode64( <<-GEM.gsub(/^ +/, '') ) 
    147       ZGF0YS50YXIuZ3oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    148       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    149       AAAAAAAAAAAAADAwMDA2NDQAMDAwMDAwMAAwMDAwMDAwADAwMDAwMDAwMjYw 
    150       ADAwMDAwMDAwMDAwADAxMzMxNQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    151       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    152       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHdoZWVs 
    153       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAA 
    154       AAAAAAAAAAAAAAAAAAAwMDAwMDAwADAwMDAwMDAAAAAAAAAAAAAAAAAAAAAA 
    155       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    156       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    157       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    158       AAAAAAAAAAAAAAAAAAAAAAAfiwgAAKBzRAADyslM0i/OLy1KTi3WK0pioAkw 
    159       AAIzMxMwDQTotIGhCYINFgcKGBsxKBjQxjmooLS4JLEIaH15RmpqDh51hOTR 
    160       PTdEQG5+SmlOqoJ7ai6XgoIDNCUo2CpEK2WUlBRY6eunp+YCU0ZpUmVaflF6 
    161       qh6QUIoFKk1JTVMoTs1J04NqAQoh9AM5qXkpXCA80P4bBaNgFIyCUYAdAAAA 
    162       AP//AwBOIUx0AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    163       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    164       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    165       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    166       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    167       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    168       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    169       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1ldGFkYXRhLmd6 
    170       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    171       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw 
    172       MDAwNjQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAwMDYzMAAwMDAwMDAwMDAw 
    173       MAAwMTM0MDAAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    174       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    175       AAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDB3aGVlbAAAAAAAAAAAAAAA 
    176       AAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    177       AAAAMDAwMDAwMAAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    178       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    179       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    180       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    181       AAAAAAAAH4sIAACgc0QAA4SRyW7cMAyG73wKNndPNCkaFDrkmntb9FIEgizR 
    182       thItLiVneftKHk88QYHWMqCF5E/yY9d1+ImX/u069Y9kirynIOX3mYwbnNHF 
    183       pYjQ7COFrJ6Jc32RKA5fD8cj5Eu/3XqEqANJzGlhQxneDX9n+nkyISBeiIvD 
    184       EawuVeJGiNtOfOluPqMQcv2xE7d1g7yEoPlN4o/JZZy1edIj4czp2VnKaNNL 
    185       9EnbcxU4JEamkAphbQZdzEV7v5YOTL8Xx6RmXaYsETr0rgcK2vl6m1KguYrL 
    186       E4oqNFZXTmsbCDWbYTeXtXjQS0mb3E7A0qAXXxS9klmK7n3T6l20jiXWHSad 
    187       FdtkJA7aZzoXZFVLqP4PUMpvp4hAsTSavF9bQ4hdXVd3V/XUzv+cRPs+TENc 
    188       jgfmCq0yCBKbCGQ3RhdH9UR1FmCIizKTdhuLKXHN/+sBYHCe3tleb2QO3EOh 
    189       XNRmbY6Ng0orz+2FXgvrlc+l3w5zd6OY97CPDNqLpZmipWjcOeYPAAAA//8D 
    190       ADLcAkIBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    191       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    192       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    193       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    194       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    195       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    196       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    197       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    198       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    199       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    200       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    201       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    202       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    203       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    204       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    205       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    206       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    207       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    208       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    209       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    210       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    211       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    212       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    213       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    214       AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
    215       AAAAAAAAAAAAAAAA 
    216     GEM 
    217   end 
    218   Gem::Installer.new(sources_gem).install() 
     91  end 
     92 
     93  attr_accessor :steps, :script 
     94 
     95  def initialize(script, &blk) 
     96    @steps = [] 
     97    @script = script 
     98    @app = self.class.setup_app(self) 
     99    instance_eval &blk 
     100  end 
     101 
     102  def gem name, version = nil 
     103    @steps << [:gem, "#{name} #{version}".strip] 
     104  end 
     105 
     106  def start 
     107    old_ui = Gem::DefaultUserInteraction.ui 
     108    ui = Gem::DefaultUserInteraction.ui = Gem::ShoesFace.new(@app) 
     109    count, total = 0, @steps.length 
     110    ui.progress count, total 
     111 
     112    @steps.each do |act, arg| 
     113      case act 
     114      when :gem 
     115        name, version = arg.split(/\s+/, 2) 
     116        count += 1 
     117        ui.say "Looking for #{name}" 
     118        if Gem.source_index.find_name(name, version).empty? 
     119          ui.title "Installing #{name}" 
     120          installer = Gem::DependencyInstaller.new 
     121          installer.install(name, version || Gem::Requirement.default) 
     122          self.class.gem_reset 
     123        end 
     124        gem = Gem.source_index.find_name(name, version).first 
     125        Gem.activate(gem.name, true, "= #{gem.version}") 
     126        ui.say "Finished installing #{name}" 
     127      end 
     128      ui.progress count, total 
     129    end 
     130    Gem::DefaultUserInteraction.ui = old_ui 
     131 
     132    Shoes.load(@script) 
     133    @app.close 
     134  end 
     135 
     136  def svn(dir, save_as = nil, &blk) 
     137    dir.gsub! /(.)\/*$/, '\1/' 
     138    if save_as.nil? or save_as.empty? 
     139      save_as = File.join(GEM_DIR, 'svn', '1') 
     140      save_as.succ! while File.exists? save_as 
     141    elsif save_as.index(GEM_DIR) != 0 
     142      save_as = File.join(GEM_DIR, 'svn', save_as) 
     143    end 
     144    mkdir_p(save_as) 
     145    puts "** Pulling down #{dir}..." 
     146    svnuri = URI.parse(dir) 
     147    case svnuri.scheme 
     148    when "http", "https" 
     149      REXML::Document.new(svnuri.open { |f| f.read }). 
     150        each_element("/svn/index/*") do |ele| 
     151          fname, href = ele.attributes['name'], ele.attributes['href'] 
     152          case ele.name 
     153          when "file" 
     154            puts "- #{dir}#{href}" 
     155            URI.parse("#{dir}#{href}").open do |f| 
     156              File.open(File.join(save_as, fname), 'wb') do |f2| 
     157                f2 << f.read(16384) until f.eof? 
     158              end 
     159            end 
     160          when "dir" 
     161            svn("#{dir}#{href}", File.join(save_as, fname)) 
     162          end 
     163        end 
     164    else 
     165      raise NotSupportedByShoes, "Only HTTP addresses are supported by Shoes's Subversion module." 
     166    end 
     167    if blk 
     168      Dir.chdir(save_as, &blk) 
     169    end 
     170  end 
     171 
     172  def self.install_sources 
     173    require 'base64' 
     174    sources_gem = File.join(LIB_DIR, "sources-0.0.1.gem") 
     175    File.open(sources_gem, "wb") do |f| 
     176      f << Base64.decode64( <<-GEM.gsub(/^ +/, '') ) 
     177        ZGF0YS50YXIuZ3oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     178        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     179        AAAAAAAAAAAAADAwMDA2NDQAMDAwMDAwMAAwMDAwMDAwADAwMDAwMDAwMjYw 
     180        ADAwMDAwMDAwMDAwADAxMzMxNQAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     181        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     182        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHdoZWVs 
     183        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAd2hlZWwAAAAAAAAAAAAAAAAA 
     184        AAAAAAAAAAAAAAAAAAAwMDAwMDAwADAwMDAwMDAAAAAAAAAAAAAAAAAAAAAA 
     185        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     186        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     187        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     188        AAAAAAAAAAAAAAAAAAAAAAAfiwgAAKBzRAADyslM0i/OLy1KTi3WK0pioAkw 
     189        AAIzMxMwDQTotIGhCYINFgcKGBsxKBjQxjmooLS4JLEIaH15RmpqDh51hOTR 
     190        PTdEQG5+SmlOqoJ7ai6XgoIDNCUo2CpEK2WUlBRY6eunp+YCU0ZpUmVaflF6 
     191        qh6QUIoFKk1JTVMoTs1J04NqAQoh9AM5qXkpXCA80P4bBaNgFIyCUYAdAAAA 
     192        AP//AwBOIUx0AAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     193        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     194        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     195        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     196        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     197        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     198        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     199        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1ldGFkYXRhLmd6 
     200        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     201        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw 
     202        MDAwNjQ0ADAwMDAwMDAAMDAwMDAwMAAwMDAwMDAwMDYzMAAwMDAwMDAwMDAw 
     203        MAAwMTM0MDAAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     204        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     205        AAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDB3aGVlbAAAAAAAAAAAAAAA 
     206        AAAAAAAAAAAAAAAAAAAAAHdoZWVsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     207        AAAAMDAwMDAwMAAwMDAwMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     208        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     209        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     210        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     211        AAAAAAAAH4sIAACgc0QAA4SRyW7cMAyG73wKNndPNCkaFDrkmntb9FIEgizR 
     212        thItLiVneftKHk88QYHWMqCF5E/yY9d1+ImX/u069Y9kirynIOX3mYwbnNHF 
     213        pYjQ7COFrJ6Jc32RKA5fD8cj5Eu/3XqEqANJzGlhQxneDX9n+nkyISBeiIvD 
     214        EawuVeJGiNtOfOluPqMQcv2xE7d1g7yEoPlN4o/JZZy1edIj4czp2VnKaNNL 
     215        9EnbcxU4JEamkAphbQZdzEV7v5YOTL8Xx6RmXaYsETr0rgcK2vl6m1KguYrL 
     216        E4oqNFZXTmsbCDWbYTeXtXjQS0mb3E7A0qAXXxS9klmK7n3T6l20jiXWHSad 
     217        FdtkJA7aZzoXZFVLqP4PUMpvp4hAsTSavF9bQ4hdXVd3V/XUzv+cRPs+TENc 
     218        jgfmCq0yCBKbCGQ3RhdH9UR1FmCIizKTdhuLKXHN/+sBYHCe3tleb2QO3EOh 
     219        XNRmbY6Ng0orz+2FXgvrlc+l3w5zd6OY97CPDNqLpZmipWjcOeYPAAAA//8D 
     220        ADLcAkIBAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     221        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     222        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     223        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     224        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     225        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     226        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     227        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     228        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     229        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     230        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     231        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     232        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     233        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     234        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     235        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     236        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     237        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     238        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     239        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     240        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     241        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     242        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     243        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     244        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 
     245        AAAAAAAAAAAAAAAA 
     246      GEM 
     247    end 
     248    Gem::Installer.new(sources_gem).install() 
     249  end 
    219250end 
    220251 
     
    270301  end 
    271302end 
    272  
    273 $stderr = StringIO.new 
    274 Gem.manage_gems 
    275 class << Gem; attr_accessor :loaded_specs end 
    276  
    277 gem_reset 
    278 install_sources 
  • trunk/shoes/app.c

    r485 r489  
    14101410  if (shoes_world->mainloop) 
    14111411    shoes_app_open(app_t, "/"); 
    1412   return self; 
     1412  return app; 
    14131413} 
    14141414 
     
    14581458    if (!app->started) 
    14591459    { 
     1460      code = shoes_app_open(app, uri); 
    14601461      app->started = TRUE; 
    1461       code = shoes_app_open(app, uri); 
    14621462      if (code != SHOES_OK) 
    14631463        return code; 
     
    20652065 
    20662066VALUE 
     2067shoes_app_is_started(VALUE self) 
     2068{ 
     2069  shoes_app *app; 
     2070  Data_Get_Struct(self, shoes_app, app); 
     2071  return app->started == TRUE ? Qtrue : Qfalse; 
     2072} 
     2073 
     2074VALUE 
    20672075shoes_app_contents(VALUE self) 
    20682076{ 
  • trunk/shoes/app.h

    r463 r489  
    7272void shoes_app_style(shoes_app *, VALUE, VALUE); 
    7373VALUE shoes_app_location(VALUE); 
     74VALUE shoes_app_is_started(VALUE); 
    7475VALUE shoes_app_quit(VALUE); 
    7576 
  • trunk/shoes/ruby.c

    r488 r489  
    39383938  rb_define_alloc_func(cApp, shoes_app_alloc); 
    39393939  rb_define_method(cApp, "location", CASTHOOK(shoes_app_location), 0); 
     3940  rb_define_method(cApp, "started?", CASTHOOK(shoes_app_is_started), 0); 
    39403941  rb_define_method(cApp, "children", CASTHOOK(shoes_app_contents), 0); 
    39413942  cDialog = rb_define_class_under(cShoes, "Dialog", cApp);