Internet radio browser GUI for music/video streams from various directory services.

⌈⌋ ⎇ branch:  streamtuner2


Check-in [ff3473b8ec]

Overview
Comment:(no comment)
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: ff3473b8ecc62447622d4276b3e277abb222e94a
User & Date: mario on 2012-01-12 14:39:07
Other Links: manifest | tags
Context
2014-01-04
22:25
live365 now searches javascript check-in: f0cd5d48f2 user: mario tags: trunk
2012-01-12
14:39
(no comment) check-in: ff3473b8ec user: mario tags: trunk
2012-01-10
03:54
shoutcast parsing patch from Vincent check-in: d9e9441d2d user: mario tags: trunk
Changes

Modified README from [f33e23cc73] to [7a93008fc3].

100
101
102
103
104
105
106


107
108
109
110
111
112
113
- sys.path patch (less py module conflicts) from Stefan Talpalaru
- fixed main_quit signal slot, so window size saving works
- added [new] button in streamedit window
- prepared remaining print syntax for python3 (still needs 2to3 though)
- fix for https://bugzilla.redhat.com/show_bug.cgi?id=655596 array error
- transitioned glade file to gtk.Builder, just a few things broke
- made configuration window resizable


- 


2.0.8
- configuration files use prettified json
- fixed double quotation for %pls players and /local/file handling
- (unused) channel .shutdown function introduced (late saving)







>
>







100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
- sys.path patch (less py module conflicts) from Stefan Talpalaru
- fixed main_quit signal slot, so window size saving works
- added [new] button in streamedit window
- prepared remaining print syntax for python3 (still needs 2to3 though)
- fix for https://bugzilla.redhat.com/show_bug.cgi?id=655596 array error
- transitioned glade file to gtk.Builder, just a few things broke
- made configuration window resizable
- locked station list columns, no longer resortable (associatation mismatch)
- applied Vincents fixed for Windows action.run and Shoutcast PQ parsing
- 


2.0.8
- configuration files use prettified json
- fixed double quotation for %pls players and /local/file handling
- (unused) channel .shutdown function introduced (late saving)

Modified _package.epm from [d93aee70f8] to [bb299e0003].

157
158
159
160
161
162
163

164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#f 644 root root /usr/share/streamtuner2/lxml/html/usedoctest.py 	 /usr/share/pyshared/lxml/html/usedoctest.py


#-- windows
%system win32
%description  Windows version gets no love, nor support.
%description  It requires manual installation of Python 2.6 and Gtk+ and Pygtk.org libraries first.

f 644 root root /usr/share/applications/streamtuner2.lnk	./streamtuner2.lnk
%shortcut $desktop$\streamtuner2.lnk|/usr/share/applications/streamtuner2.lnk
%homepage http://streamtuner2.sourceforge.net/




#-- distribution specific dependency rules
%system all
%requires python

%format deb
%requires python-lxml
%requires python-imaging
%requires python-pyquery
%requires python-keybinder
%requires python-gtk2
%requires python-glade2
# %requires python-httplib2
# %requires python-json
# %requires python-xdg
# %requires python-xdgapp

%format rpm
%requires pygtk
# %requires pyxdg
# RPM package names are weirder, and there's no comprehensive list of them (Suse and Fedora depart anyway)







>

















|









157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
#f 644 root root /usr/share/streamtuner2/lxml/html/usedoctest.py 	 /usr/share/pyshared/lxml/html/usedoctest.py


#-- windows
%system win32
%description  Windows version gets no love, nor support.
%description  It requires manual installation of Python 2.6 and Gtk+ and Pygtk.org libraries first.
f 644 root root /usr/bin/streamtuner2.lnk			./streamtuner2.lnk
f 644 root root /usr/share/applications/streamtuner2.lnk	./streamtuner2.lnk
%shortcut $desktop$\streamtuner2.lnk|/usr/share/applications/streamtuner2.lnk
%homepage http://streamtuner2.sourceforge.net/




#-- distribution specific dependency rules
%system all
%requires python

%format deb
%requires python-lxml
%requires python-imaging
%requires python-pyquery
%requires python-keybinder
%requires python-gtk2
# %requires python-glade2
# %requires python-httplib2
# %requires python-json
# %requires python-xdg
# %requires python-xdgapp

%format rpm
%requires pygtk
# %requires pyxdg
# RPM package names are weirder, and there's no comprehensive list of them (Suse and Fedora depart anyway)

Modified channels/shoutcast.py from [f74abd4786] to [20027a66d7].

110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137


138
139
140
141
142
143
144
145
146
147
148
149
150














151
152
153
154
155
156
157
158
159
160
161
162
        # downloads stream list from shoutcast for given category
        def update_streams(self, cat, search=""):

            if (not cat or cat == self.empty):
                __print__("nocat")
                return []
            ucat = urllib.quote(cat)

            
            # new extraction regex
            if not conf.get("pyquery") or not pq:
              rx_stream = re.compile("""
                 <a\s+class="?playbutton\d?[^>]+id="(\d+)".+?
		 <a\s+class="[\w\s]*title[\w\s]*"[^>]+href="(http://[^">]+)"[^>]*>([^<>]+)</a>.+?
                 (?:Recently\s*played|Coming\s*soon|Now\s*playing):\s*([^<]*).+?
                 ners">(\d*)<.+?
                 bitrate">(\d*)<.+?
                 type">([MP3AAC]*)
                 """, re.S|re.I|re.X)
            rx_next = re.compile("""onclick="showMoreGenre""")



            # loop
            entries = []
            next = 0
            max = int(conf.max_streams)
            count = max


            while (next < max):

               # page
               url = "http://www.shoutcast.com/genre-ajax/" + ucat
	       referer = url.replace("/genre-ajax", "/radio")
	       params = { "strIndex":"0", "count":str(count), "ajax":"true", "mode":"listeners", "order":"desc" }
               html = http.ajax(url, params, referer)   #,feedback=self.parent.status)

               __print__(html)

               # regular expressions
               if not conf.get("pyquery") or not pq:
               














                   # extract entries
                   self.parent.status("parsing document...")
                   __print__("loop-rx")
                   for uu in rx_stream.findall(html):
                       (id, homepage, title, playing, ls, bit, fmt) = uu
                       __print__(uu)
                       entries += [{
                           "title": self.entity_decode(title),
                           "url": "http://yp.shoutcast.com/sbin/tunein-station.pls?id=" + id,
                           "homepage": http.fix_url(homepage),
                           "playing": self.entity_decode(playing),
                           "genre": cat, #self.strip_tags(uu[4]),







<
<
<
<
<
<
<
<
<
<
<
<
<
<







>
>













>
>
>
>
>
>
>
>
>
>
>
>
>
>



|
|







110
111
112
113
114
115
116














117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
        # downloads stream list from shoutcast for given category
        def update_streams(self, cat, search=""):

            if (not cat or cat == self.empty):
                __print__("nocat")
                return []
            ucat = urllib.quote(cat)
















            # loop
            entries = []
            next = 0
            max = int(conf.max_streams)
            count = max
            rx_stream = None
            rx_next = re.compile("""onclick="showMoreGenre""")
            while (next < max):

               # page
               url = "http://www.shoutcast.com/genre-ajax/" + ucat
	       referer = url.replace("/genre-ajax", "/radio")
	       params = { "strIndex":"0", "count":str(count), "ajax":"true", "mode":"listeners", "order":"desc" }
               html = http.ajax(url, params, referer)   #,feedback=self.parent.status)

               __print__(html)

               # regular expressions
               if not conf.get("pyquery") or not pq:
               
                   # new extraction regex
                   if not rx_stream:
                       rx_stream = re.compile(
                           """
                           <a\s+class="?playbutton\d?[^>]+id="(\d+)".+?
                           <a\s+class="[\w\s]*title[\w\s]*"[^>]+href="(http://[^">]+)"[^>]*>([^<>]+)</a>.+?
                           (?:Recently\s*played|Coming\s*soon|Now\s*playing):\s*([^<]*).+?
                           ners">(\d*)<.+?
                           bitrate">(\d*)<.+?
                           type">([MP3AAC]*)
                           """,
                           re.S|re.I|re.X
                       )

                   # extract entries
                   self.parent.status("parsing document...")
                   __print__("loop-rx")
                   for m in rx_stream.findall(html):
                       (id, homepage, title, playing, ls, bit, fmt) = m
                       __print__(uu)
                       entries += [{
                           "title": self.entity_decode(title),
                           "url": "http://yp.shoutcast.com/sbin/tunein-station.pls?id=" + id,
                           "homepage": http.fix_url(homepage),
                           "playing": self.entity_decode(playing),
                           "genre": cat, #self.strip_tags(uu[4]),

Modified st2.py from [cdf275e0b5] to [c1d417a2d9].

204
205
206
207
208
209
210


211
212
213
214
215
216
217
                "update_favicons": self.update_favicons,
                "app_state": self.app_state,
                "bookmark": self.bookmark,
                "save_as": self.save_as,
                "menu_about": lambda w: AboutStreamtuner2(),
                "menu_help": action.action.help,
                "menu_onlineforum": lambda w: action.browser("http://sourceforge.net/projects/streamtuner2/forums/forum/1173108"),


               # "menu_bugreport": lambda w: BugReport(),
                "menu_copy": self.menu_copy,
                "delete_entry": self.delete_entry,
                "quicksearch_set": search.quicksearch_set,
                "search_open": search.menu_search,
                "search_go": search.start,
                "search_srv": search.start,







>
>







204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
                "update_favicons": self.update_favicons,
                "app_state": self.app_state,
                "bookmark": self.bookmark,
                "save_as": self.save_as,
                "menu_about": lambda w: AboutStreamtuner2(),
                "menu_help": action.action.help,
                "menu_onlineforum": lambda w: action.browser("http://sourceforge.net/projects/streamtuner2/forums/forum/1173108"),
                "menu_fossilwiki": lambda w: action.browser("http://fossil.include-once.org/streamtuner2/"),
                "menu_projhomepage": lambda w: action.browser("http://milki.include-once.org/streamtuner2/"),
               # "menu_bugreport": lambda w: BugReport(),
                "menu_copy": self.menu_copy,
                "delete_entry": self.delete_entry,
                "quicksearch_set": search.quicksearch_set,
                "search_open": search.menu_search,
                "search_go": search.start,
                "search_srv": search.start,

Modified ui.xml from [17a9e1bc5e] to [39008dd4a6].

670
671
672
673
674
675
676













































677
678
679
680
681
682
683
        </child>
      </object>
    </child>
    <action-widgets>
      <action-widget response="0">timer_cancel</action-widget>
      <action-widget response="0">timer_ok</action-widget>
    </action-widgets>













































  </object>
  <object class="GtkWindow" id="win_config">
    <property name="width_request">565</property>
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">streamtuner settings</property>
    <property name="window_position">center</property>
    <property name="destroy_with_parent">True</property>







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
        </child>
      </object>
    </child>
    <action-widgets>
      <action-widget response="0">timer_cancel</action-widget>
      <action-widget response="0">timer_ok</action-widget>
    </action-widgets>
  </object>
  <object class="GtkWindow" id="url_action_container">
    <property name="can_focus">False</property>
    <child>
      <object class="GtkVBox" id="url_action_list">
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <child>
          <object class="GtkLabel" id="url_action_1_online_forum">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">http://sourceforge.net/projects/streamtuner2/forums/forum/1173108</property>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">0</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="url_action_2_fossil_wiki">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">http://fossil.include-once.org/streamtuner2/</property>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">1</property>
          </packing>
        </child>
        <child>
          <object class="GtkLabel" id="url_action_3_project_homepage">
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <property name="label" translatable="yes">http://milki.include-once.org/streamtuner2/</property>
          </object>
          <packing>
            <property name="expand">True</property>
            <property name="fill">True</property>
            <property name="position">2</property>
          </packing>
        </child>
      </object>
    </child>
  </object>
  <object class="GtkWindow" id="win_config">
    <property name="width_request">565</property>
    <property name="can_focus">False</property>
    <property name="title" translatable="yes">streamtuner settings</property>
    <property name="window_position">center</property>
    <property name="destroy_with_parent">True</property>
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
                              </packing>
                            </child>
                            <child>
                              <object class="GtkLabel" id="label124124_placeholder">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="label" translatable="yes">placeholder
&lt;a href="file:///usr/share/doc/streamtuner2/help/configuration.page"&gt;see help&lt;/a&gt;</property>
                                <property name="use_markup">True</property>
                              </object>
                              <packing>
                                <property name="top_attach">7</property>
                                <property name="bottom_attach">8</property>
                              </packing>
                            </child>







|







1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
                              </packing>
                            </child>
                            <child>
                              <object class="GtkLabel" id="label124124_placeholder">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="label" translatable="yes">placeholder
&lt;a href="http://fossil.include-once.org/streamtuner2/wiki?name=player"&gt;see help&lt;/a&gt;</property>
                                <property name="use_markup">True</property>
                              </object>
                              <packing>
                                <property name="top_attach">7</property>
                                <property name="bottom_attach">8</property>
                              </packing>
                            </child>
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309

2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322

2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkVBox" id="vbox3">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <child>
                  <object class="GtkMenuBar" id="menubar1">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <object class="GtkMenuItem" id="streammenu">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_action_appearance">False</property>
                        <property name="label" translatable="yes">_Station</property>
                        <property name="use_underline">True</property>
                        <child type="submenu">
                          <object class="GtkMenu" id="menu1">
                            <property name="visible">True</property>
                            <property name="can_focus">False</property>
                            <child>
                              <object class="GtkMenuItem" id="menu_bookmark">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="label" translatable="yes">bookmark</property>
                                <property name="use_underline">True</property>
                                <accelerator key="d" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                                <accelerator key="F8" signal="activate"/>

                                <signal name="activate" handler="bookmark" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem_saveas">
                                <property name="label">gtk-save-as</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <accelerator key="F2" signal="activate"/>
                                <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>

                                <signal name="activate" handler="save_as" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="gtk-edit">
                                <property name="label">gtk-edit</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <accelerator key="F3" signal="activate"/>
                                <accelerator key="space" signal="activate" modifiers="GDK_MOD1_MASK"/>
                                <accelerator key="Return" signal="activate" modifiers="GDK_MOD1_MASK"/>
                                <signal name="activate" handler="streamedit_open" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkMenuItem" id="extensions0">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>







|




















<

>











<

>











|

|







2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352

2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365

2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
            <property name="visible">True</property>
            <property name="can_focus">False</property>
            <child>
              <object class="GtkVBox" id="vbox3">
                <property name="visible">True</property>
                <property name="can_focus">False</property>
                <child>
                  <object class="GtkMenuBar" id="mainmenu">
                    <property name="visible">True</property>
                    <property name="can_focus">False</property>
                    <child>
                      <object class="GtkMenuItem" id="streammenu">
                        <property name="visible">True</property>
                        <property name="can_focus">False</property>
                        <property name="use_action_appearance">False</property>
                        <property name="label" translatable="yes">_Station</property>
                        <property name="use_underline">True</property>
                        <child type="submenu">
                          <object class="GtkMenu" id="menu1">
                            <property name="visible">True</property>
                            <property name="can_focus">False</property>
                            <child>
                              <object class="GtkMenuItem" id="menu_bookmark">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="label" translatable="yes">bookmark</property>
                                <property name="use_underline">True</property>

                                <accelerator key="F8" signal="activate"/>
                                <accelerator key="d" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                                <signal name="activate" handler="bookmark" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem_saveas">
                                <property name="label">gtk-save-as</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>

                                <accelerator key="s" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                                <accelerator key="F2" signal="activate"/>
                                <signal name="activate" handler="save_as" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="gtk-edit">
                                <property name="label">gtk-edit</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <accelerator key="Return" signal="activate" modifiers="GDK_MOD1_MASK"/>
                                <accelerator key="space" signal="activate" modifiers="GDK_MOD1_MASK"/>
                                <accelerator key="F3" signal="activate"/>
                                <signal name="activate" handler="streamedit_open" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkMenuItem" id="extensions0">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
2407
2408
2409
2410
2411
2412
2413
2414
2415

2416
2417
2418
2419
2420
2421
2422
                              <object class="GtkImageMenuItem" id="menuitem_delete">
                                <property name="label">gtk-delete</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>
                                <accelerator key="Delete" signal="activate"/>
                                <accelerator key="x" signal="activate" modifiers="GDK_CONTROL_MASK"/>

                                <signal name="activate" handler="delete_entry" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem8">
                                <property name="label">gtk-find</property>
                                <property name="visible">True</property>







<

>







2452
2453
2454
2455
2456
2457
2458

2459
2460
2461
2462
2463
2464
2465
2466
2467
                              <object class="GtkImageMenuItem" id="menuitem_delete">
                                <property name="label">gtk-delete</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="use_underline">True</property>
                                <property name="use_stock">True</property>

                                <accelerator key="x" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                                <accelerator key="Delete" signal="activate"/>
                                <signal name="activate" handler="delete_entry" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem8">
                                <property name="label">gtk-find</property>
                                <property name="visible">True</property>
2637
2638
2639
2640
2641
2642
2643










2644
2645
2646
2647
2648
2649
2650
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="label" translatable="yes">online forum</property>
                                <property name="use_underline">True</property>
                                <signal name="activate" handler="menu_onlineforum" swapped="no"/>
                              </object>
                            </child>










                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem10">
                                <property name="label">gtk-about</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="use_underline">True</property>







>
>
>
>
>
>
>
>
>
>







2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="label" translatable="yes">online forum</property>
                                <property name="use_underline">True</property>
                                <signal name="activate" handler="menu_onlineforum" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkMenuItem" id="menufossilwiki">
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="label" translatable="yes">wiki/fossil/bugs</property>
                                <property name="use_underline">True</property>
                                <signal name="activate" handler="menu_fossilwiki" swapped="no"/>
                              </object>
                            </child>
                            <child>
                              <object class="GtkImageMenuItem" id="imagemenuitem10">
                                <property name="label">gtk-about</property>
                                <property name="visible">True</property>
                                <property name="can_focus">False</property>
                                <property name="use_action_appearance">False</property>
                                <property name="use_underline">True</property>