[cheese] Start porting to application-wide GMenu
- From: David King <davidk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [cheese] Start porting to application-wide GMenu
- Date: Mon, 25 Jun 2012 21:41:28 +0000 (UTC)
commit 856edea2a1537ee699d9c5984b9e7ac1e5573a3d
Author: David King <amigadave amigadave com>
Date: Sat Jun 23 16:10:23 2012 +0100
Start porting to application-wide GMenu
Add a menu to the application, and enable application-wide actions for
showing the help, showing the about dialog and quitting the application.
Move the GtkBuilder definition of the about dialog into Cheese.Main.
Makefile.am | 1 -
configure.ac | 2 +-
data/cheese-about.ui | 69 ------------------
data/cheese-actions.ui | 83 ----------------------
data/cheese-main-window.ui | 10 ---
po/POTFILES.in | 1 -
src/cheese-main.vala | 121 +++++++++++++++++++++++++++++++-
src/cheese-window.vala | 167 +++++++++++++------------------------------
src/vapi/config.vapi | 16 ++--
9 files changed, 180 insertions(+), 290 deletions(-)
---
diff --git a/Makefile.am b/Makefile.am
index 01ca138..4968385 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -294,7 +294,6 @@ gsettings_SCHEMAS = data/org.gnome.Cheese.gschema.xml
dist_pkgdata_DATA = \
data/cheese.css \
- data/cheese-about.ui \
data/cheese-actions.ui \
data/cheese-main-window.ui \
data/cheese-prefs.ui \
diff --git a/configure.ac b/configure.ac
index 146feb5..b38e242 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,6 +1,6 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.64])
-AC_INIT([cheese],
+AC_INIT([Cheese],
[3.5.3],
[https://bugzilla.gnome.org/enter_bug.cgi?product=cheese],
[cheese],
diff --git a/data/cheese-actions.ui b/data/cheese-actions.ui
index 3f7f2cd..53d37cb 100644
--- a/data/cheese-actions.ui
+++ b/data/cheese-actions.ui
@@ -3,57 +3,6 @@
<requires lib="gtk+" version="2.16"/>
<object class="GtkUIManager" id="menu_ui_man">
<child>
- <object class="GtkActionGroup" id="main_actions">
- <child>
- <object class="GtkAction" id="cheese_action">
- <property name="name">Cheese</property>
- <property name="label" translatable="yes">_Cheese</property>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="edit_action">
- <property name="name">Edit</property>
- <property name="label" translatable="yes">_Edit</property>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="help_action">
- <property name="name">Help</property>
- <property name="label" translatable="yes">_Help</property>
- </object>
- </child>
- <child>
- <object class="GtkAction" id="quit">
- <property name="name">Quit</property>
- <property name="stock-id">gtk-quit</property>
- <signal name="activate" handler="cheese_main_window_on_quit"/>
- </object>
- <accelerator key="q" modifiers="GDK_CONTROL_MASK"/>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkActionGroup" id="help_actions">
- <child>
- <object class="GtkAction" id="help_contents">
- <property name="name">HelpContents</property>
- <property name="label" translatable="yes">_Contents</property>
- <property name="stock-id">gtk-help</property>
- <signal name="activate" handler="cheese_main_window_on_help_contents"/>
- </object>
- <accelerator key="F1"/>
- </child>
- <child>
- <object class="GtkAction" id="about">
- <property name="name">About</property>
- <property name="label" translatable="yes">_About</property>
- <property name="stock-id">gtk-about</property>
- <signal name="activate" handler="cheese_main_window_on_help_about"/>
- </object>
- </child>
- </object>
- </child>
- <child>
<object class="GtkActionGroup" id="file_actions">
<child>
<object class="GtkAction" id="open">
@@ -228,38 +177,6 @@
</object>
</child>
<ui>
- <menubar name="main_menubar">
- <menu action="cheese_action">
- <menuitem action="take_photo"/>
- <menuitem action="take_video"/>
- <menuitem action="take_burst"/>
- <separator/>
- <menuitem action="photo_mode"/>
- <menuitem action="video_mode"/>
- <menuitem action="burst_mode"/>
- <separator/>
- <menuitem action="fullscreen"/>
- <menuitem action="wide_mode"/>
- <separator/>
- <menuitem action="quit"/>
- </menu>
- <menu action="edit_action">
- <menuitem action="effects_toggle"/>
- <menuitem action="effects_page_next"/>
- <menuitem action="effects_page_prev"/>
- <separator/>
- <menuitem action="share"/>
- <separator/>
- <menuitem action="move_to_trash"/>
- <menuitem action="move_all_to_trash"/>
- <separator/>
- <menuitem action="preferences"/>
- </menu>
- <menu action="help_action">
- <menuitem action="help_contents"/>
- <menuitem action="about"/>
- </menu>
- </menubar>
<popup name="thumbnail_popup" id="thumbnail_popup">
<menuitem action="open"/>
<separator/>
diff --git a/data/cheese-main-window.ui b/data/cheese-main-window.ui
index b0760bd..c99cd1f 100644
--- a/data/cheese-main-window.ui
+++ b/data/cheese-main-window.ui
@@ -5,16 +5,6 @@
<property name="orientation">vertical</property>
<property name="events">GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<child>
- <object class="GtkMenuBar" id="main_menubar" constructor="menu_ui_man">
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
<object class="GtkGrid" id="content_area">
<property name="vexpand">True</property>
<property name="hexpand">True</property>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 87b6567..784090e 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,7 +1,6 @@
# List of source files containing translatable strings.
# Please keep this file sorted alphabetically.
[encoding: UTF-8]
-[type: gettext/glade]data/cheese-about.ui
[type: gettext/glade]data/cheese-actions.ui
[type: gettext/glade]data/cheese-main-window.ui
[type: gettext/glade]data/cheese-prefs.ui
diff --git a/src/cheese-main.vala b/src/cheese-main.vala
index fd5ad56..4af13e2 100644
--- a/src/cheese-main.vala
+++ b/src/cheese-main.vala
@@ -33,6 +33,12 @@ public class Cheese.Main : Gtk.Application
static Cheese.MainWindow main_window;
+ private const GLib.ActionEntry action_entries[] = {
+ { "help", on_help },
+ { "about", on_about },
+ { "quit", on_quit }
+ };
+
const OptionEntry[] options = {
{"wide", 'w', 0, OptionArg.NONE, ref wide, N_("Start in wide mode"), null },
{"device", 'd', 0, OptionArg.FILENAME, ref device, N_("Device to use as a camera"), N_("DEVICE")},
@@ -60,7 +66,7 @@ public class Cheese.Main : Gtk.Application
if (gtk_settings != null)
gtk_settings.gtk_application_prefer_dark_theme = true;
- main_window = new Cheese.MainWindow ();
+ main_window = new Cheese.MainWindow (this);
Environment.set_variable ("PULSE_PROP_media.role", "production", true);
@@ -69,6 +75,34 @@ public class Cheese.Main : Gtk.Application
Gtk.IconTheme.get_default ().append_search_path (GLib.Path.build_filename (Config.PACKAGE_DATADIR, "icons"));
+ add_action_entries (action_entries, this);
+
+ // Create the menus.
+ var menu = new GLib.Menu ();
+ var section = new GLib.Menu ();
+ menu.append_section (null, section);
+ section.append (_("_Shoot"), "app.shoot");
+ section = new GLib.Menu ();
+ menu.append_section (_("Mode:"), section);
+ section.append (_("_Photo"), "app.mode::photo");
+ section.append (_("_Video"), "app.mode::video");
+ section.append (_("_Burst"), "app.mode::burst");
+ section = new GLib.Menu ();
+ menu.append_section (null, section);
+ section.append (_("_Fullscreen"), "app.fullscreen");
+ section = new GLib.Menu ();
+ menu.append_section (null, section);
+ section.append (_("_Effects"), "app.effects");
+ section = new GLib.Menu ();
+ menu.append_section (null, section);
+ section.append (_("P_references"), "app.preferences");
+ section = new GLib.Menu ();
+ menu.append_section (null, section);
+ section.append (_("_About"), "app.about");
+ section.append (_("_Help"), "app.help");
+ section.append (_("_Quit"), "app.quit");
+ set_app_menu (menu);
+
main_window.setup_ui ();
main_window.start_thumbview_monitors ();
@@ -163,6 +197,91 @@ public class Cheese.Main : Gtk.Application
}
return true;
}
+
+ /**
+ * Show the Cheese help contents.
+ */
+ private void on_help ()
+ {
+ var screen = main_window.get_screen ();
+ try
+ {
+ Gtk.show_uri (screen, "help:cheese", Gtk.get_current_event_time ());
+ }
+ catch (Error err)
+ {
+ message ("Error opening help: %s", err.message);
+ }
+ }
+
+ /**
+ * Show the about dialog.
+ */
+ private void on_about ()
+ {
+ string[] artists = { "Andreas Nilsson <andreas andreasn se>",
+ "Josef VybÃral <josef vybiral gmail com>",
+ "Kalle Persson <kalle kallepersson se>",
+ "Lapo Calamandrei <calamandrei gmail com>",
+ "Or Dvory <gnudles nana co il>",
+ "Ulisse Perusin <ulisail yahoo it>",
+ null };
+
+ string[] authors = { "daniel g. siegel <dgsiegel gnome org>",
+ "Jaap A. Haitsma <jaap haitsma org>",
+ "Filippo Argiolas <fargiolas gnome org>",
+ "Yuvaraj Pandian T <yuvipanda yuvi in>",
+ "Luciana Fujii Pontello <luciana fujii eti br>",
+ "",
+ "Aidan Delaney <a j delaney brighton ac uk>",
+ "Alex \"weej\" Jones <alex weej com>",
+ "Andrea Cimitan <andrea cimitan gmail com>",
+ "Baptiste Mille-Mathias <bmm80 free fr>",
+ "Cosimo Cecchi <anarki lilik it>",
+ "Diego Escalante Urrelo <dieguito gmail com>",
+ "Felix Kaser <f kaser gmx net>",
+ "Gintautas Miliauskas <gintas akl lt>",
+ "Hans de Goede <jwrdegoede fedoraproject org>",
+ "James Liggett <jrliggett cox net>",
+ "Luca Ferretti <elle uca libero it>",
+ "Mirco \"MacSlow\" MÃller <macslow bangang de>",
+ "Patryk Zawadzki <patrys pld-linux org>",
+ "Ryan Zeigler <zeiglerr gmail com>",
+ "Sebastian Keller <sebastian-keller gmx de>",
+ "Steve Magoun <steve magoun canonical com>",
+ "Thomas Perl <thp thpinfo com>",
+ "Tim Philipp MÃller <tim centricular net>",
+ "Todd Eisenberger <teisenberger gmail com>",
+ "Tommi Vainikainen <thv iki fi>",
+ null };
+
+ string[] documenters = { "Joshua Henderson <joshhendo gmail com>",
+ "Jaap A. Haitsma <jaap haitsma org>",
+ "Felix Kaser <f kaser gmx net>",
+ null };
+
+ Gtk.show_about_dialog (main_window,
+ "artists", artists,
+ "authors", authors,
+ "comments", _("Take photos and videos with your webcam, with fun graphical effects"),
+ "copyright", "Copyright  2007 - 2010 daniel g. siegel <dgsiegel gnome org>",
+ "documenters", documenters,
+ "license-type", Gtk.License.GPL_2_0,
+ "logo-icon-name", Config.PACKAGE_TARNAME,
+ "program-name", _("Cheese"),
+ "translator-credits", _("translator-credits"),
+ "website", Config.PACKAGE_URL,
+ "website-label", _("Cheese Website"),
+ "version", Config.PACKAGE_VERSION);
+ }
+
+ /**
+ * Destroy the main window, and shutdown the application, when quitting.
+ */
+ private void on_quit ()
+ {
+ main_window.destroy ();
+ }
}
public int main (string[] args)
diff --git a/src/cheese-window.vala b/src/cheese-window.vala
index 919d754..a3efe13 100644
--- a/src/cheese-window.vala
+++ b/src/cheese-window.vala
@@ -38,8 +38,17 @@ const int FULLSCREEN_TIMEOUT_INTERVAL = 5 * 1000;
const int EFFECTS_PER_PAGE = 9;
const string SENDTO_EXEC = "nautilus-sendto";
-public class Cheese.MainWindow : Gtk.Window
+public class Cheese.MainWindow : Gtk.ApplicationWindow
{
+ // Actions for the app menu.
+ private const GLib.ActionEntry entries[] = {
+ { "shoot", on_take_action },
+ { "mode", null, "s", "'photo'", on_mode_change },
+ { "fullscreen", null, null, "false", on_layout_fullscreen },
+ { "effects", null, null, "false", on_effects_toggle },
+ { "preferences", on_preferences_dialog }
+ };
+
private MediaMode current_mode;
private Gtk.Builder gtk_builder;
@@ -54,7 +63,6 @@ public class Cheese.MainWindow : Gtk.Window
private Cheese.ThumbView thumb_view;
private Gtk.Alignment thumbnails_right;
private Gtk.Alignment thumbnails_bottom;
- private Gtk.MenuBar menubar;
private Gtk.Box leave_fullscreen_button_container;
private Gtk.ToggleButton photo_toggle_button;
private Gtk.ToggleButton video_toggle_button;
@@ -93,7 +101,6 @@ public class Cheese.MainWindow : Gtk.Window
private Gtk.Action effects_page_prev_action;
private Gtk.Action effects_page_next_action;
private Gtk.Action share_action;
- private Gtk.ActionGroup main_actions;
private bool is_fullscreen;
private bool is_wide_mode;
@@ -129,16 +136,10 @@ public class Cheese.MainWindow : Gtk.Window
SKIP_ALL = 2
}
- /**
- * Destroy the main window, and shutdown the application, when quitting.
- *
- * @param action the action that emitted the signal
- */
- [CCode (instance_pos = -1)]
- public void on_quit (Gtk.Action action)
- {
- destroy ();
- }
+ public MainWindow (Gtk.Application application)
+ {
+ GLib.Object (application: application);
+ }
/**
* Show the preferences dialog when requested, creating it as necessary.
@@ -146,7 +147,7 @@ public class Cheese.MainWindow : Gtk.Window
* @param action the action that emitted the signal
*/
[CCode (instance_pos = -1)]
- public void on_preferences_dialog (Gtk.Action action)
+ public void on_preferences_dialog (SimpleAction action, Variant? parameter)
{
if (preferences_dialog == null)
preferences_dialog = new Cheese.PreferencesDialog (camera, settings);
@@ -524,41 +525,6 @@ public class Cheese.MainWindow : Gtk.Window
}
/**
- * Show the Cheese help contents.
- *
- * @param action the action that emitted the signal
- */
- [CCode (instance_pos = -1)]
- public void on_help_contents (Gtk.Action action)
- {
- Gdk.Screen screen;
- screen = this.get_screen ();
- try {
- Gtk.show_uri (screen, "help:cheese", Gtk.get_current_event_time ());
- } catch (Error err)
- {
- warning ("Error: %s\n", err.message);
- }
- }
-
- /**
- * Show the about dialog.
- *
- * @param action the action that emitted the signal
- */
- [CCode (instance_pos = -1)]
- public void on_help_about (Gtk.Action action)
- {
- Gtk.AboutDialog about_dialog;
- about_dialog = gtk_builder.get_object ("aboutdialog") as Gtk.AboutDialog;
- about_dialog.set_transient_for (this);
- about_dialog.set_modal (true);
- about_dialog.version = Config.PACKAGE_VERSION;
- about_dialog.run ();
- about_dialog.hide ();
- }
-
- /**
* Toggle wide mode and save the preference to GSettings.
*
* @param action the action that emitted the signal
@@ -575,33 +541,23 @@ public class Cheese.MainWindow : Gtk.Window
set_wide_mode (action.active);
}
- /**
- * Toggle fullscreen mode and save the preference to GSettings.
- *
- * @param action the action that emitted the signal
- */
- [CCode (instance_pos = -1)]
- public void on_layout_fullscreen (ToggleAction action)
- {
- if (!is_command_line_startup)
+ /**
+ * Toggle fullscreen mode and save the preference to GSettings.
+ *
+ * @param action the action that emitted the signal
+ */
+ [CCode (instance_pos = -1)]
+ public void on_layout_fullscreen (SimpleAction action, Variant value)
{
- /* Don't save to settings when using -f mode from command-line, so
- * command-line options change the mode for one run only. */
- settings.set_boolean ("fullscreen", action.active);
- }
- set_fullscreen_mode (action.active);
- }
+ if (!is_command_line_startup)
+ {
+ /* Don't save to settings when using -f mode from command-line, so
+ * command-line options change the mode for one run only. */
+ settings.set_boolean ("fullscreen", action.enabled);
+ }
- /**
- * Change the media capture mode (photo, video or burst).
- *
- * @param action the action that emitted the signal
- */
- [CCode (instance_pos = -1)]
- public void on_mode_change (RadioAction action)
- {
- set_mode ((MediaMode) action.value);
- }
+ set_fullscreen_mode (action.state.get_boolean ());
+ }
/**
* Make the media capture mode actions sensitive.
@@ -780,7 +736,7 @@ public class Cheese.MainWindow : Gtk.Window
{
thumbnails_bottom.hide ();
}
- menubar.hide ();
+ this.set_show_menubar (false);
leave_fullscreen_button_container.no_show_all = false;
leave_fullscreen_button_container.show_all ();
@@ -804,7 +760,7 @@ public class Cheese.MainWindow : Gtk.Window
{
thumbnails_bottom.show_all ();
}
- menubar.show_all ();
+ this.set_show_menubar (true);
leave_fullscreen_button_container.hide ();
/* Make all buttons look, uhm, Normal */
@@ -1126,7 +1082,7 @@ public class Cheese.MainWindow : Gtk.Window
* @param action the action that emitted the signal
*/
[CCode (instance_pos = -1)]
- public void on_take_action (Gtk.Action action)
+ public void on_take_action (SimpleAction action, Variant? parameter)
{
if (current_mode == MediaMode.PHOTO)
{
@@ -1150,15 +1106,15 @@ public class Cheese.MainWindow : Gtk.Window
* @param action the action that emitted the signal
*/
[CCode (instance_pos = -1)]
- public void on_effects_toggle (Gtk.ToggleAction action)
+ public void on_effects_toggle (SimpleAction action, Variant value)
{
- toggle_effects_selector (action.active);
- take_photo_action.sensitive = !action.active;
- take_video_action.sensitive = !action.active;
- take_burst_action.sensitive = !action.active;
- photo_mode_action.sensitive = !action.active;
- video_mode_action.sensitive = !action.active;
- burst_mode_action.sensitive = !action.active;
+ toggle_effects_selector (action.enabled);
+ take_photo_action.sensitive = !action.enabled;
+ take_video_action.sensitive = !action.enabled;
+ take_burst_action.sensitive = !action.enabled;
+ photo_mode_action.sensitive = !action.enabled;
+ video_mode_action.sensitive = !action.enabled;
+ burst_mode_action.sensitive = !action.enabled;
}
/**
@@ -1401,17 +1357,14 @@ public class Cheese.MainWindow : Gtk.Window
}
/* Keep only these actions sensitive. */
- string [] active_actions = { "cheese_action",
- "edit_action",
- "help_action",
- "quit",
- "help_contents",
- "about",
- "open",
- "save_as",
- "move_to_trash",
- "delete",
- "move_all_to_trash"};
+ string [] active_actions = { "quit",
+ "help_contents",
+ "about",
+ "open",
+ "save_as",
+ "move_to_trash",
+ "delete",
+ "move_all_to_trash"};
/* Gross hack because Vala's `in` operator doesn't really work */
bool flag;
@@ -1494,7 +1447,6 @@ public class Cheese.MainWindow : Gtk.Window
try {
gtk_builder.add_from_file (GLib.Path.build_filename (Config.PACKAGE_DATADIR, "cheese-actions.ui"));
- gtk_builder.add_from_file (GLib.Path.build_filename (Config.PACKAGE_DATADIR, "cheese-about.ui"));
gtk_builder.add_from_file (GLib.Path.build_filename (Config.PACKAGE_DATADIR, "cheese-main-window.ui"));
gtk_builder.connect_signals (this);
@@ -1504,13 +1456,14 @@ public class Cheese.MainWindow : Gtk.Window
error ("Error: %s", err.message);
}
+ add_action_entries (entries, this);
+
main_vbox = gtk_builder.get_object ("mainbox_normal") as Gtk.Grid;
thumbnails = gtk_builder.get_object ("thumbnails") as Gtk.Widget;
viewport_widget = gtk_builder.get_object ("viewport") as GtkClutter.Embed;
viewport = viewport_widget.get_stage () as Clutter.Stage;
thumbnails_right = gtk_builder.get_object ("thumbnails_right") as Gtk.Alignment;
thumbnails_bottom = gtk_builder.get_object ("thumbnails_bottom") as Gtk.Alignment;
- menubar = gtk_builder.get_object ("main_menubar") as Gtk.MenuBar;
leave_fullscreen_button_container = gtk_builder.get_object ("leave_fullscreen_button_bin") as Gtk.Box;
photo_toggle_button = gtk_builder.get_object ("photo_toggle_button") as Gtk.ToggleButton;
video_toggle_button = gtk_builder.get_object ("video_toggle_button") as Gtk.ToggleButton;
@@ -1523,7 +1476,6 @@ public class Cheese.MainWindow : Gtk.Window
buttons_area = gtk_builder.get_object ("buttons_area") as Gtk.Box;
thumbnail_popup = gtk_builder.get_object ("thumbnail_popup") as Gtk.Menu;
- main_actions = gtk_builder.get_object ("main_actions") as Gtk.ActionGroup;
take_photo_action = gtk_builder.get_object ("take_photo") as Gtk.Action;
take_video_action = gtk_builder.get_object ("take_video") as Gtk.Action;
take_burst_action = gtk_builder.get_object ("take_burst") as Gtk.Action;
@@ -1539,7 +1491,6 @@ public class Cheese.MainWindow : Gtk.Window
share_action = gtk_builder.get_object ("share") as Gtk.Action;
shareable_media = new Cheese.ShareableMedia (this);
- main_actions.pre_activate.connect(on_action_pre_activated);
/* Array contains all 'buttons', for easier manipulation
* IMPORTANT: IF ANOTHER BUTTON IS ADDED UNDER THE VIEWPORT, ADD IT TO THIS ARRAY */
@@ -1617,22 +1568,6 @@ public class Cheese.MainWindow : Gtk.Window
}
/**
- * Decide which actions will be sensitive or insensitive.
- *
- * @param action the action that emitted the signal.
- */
- public void on_action_pre_activated (Gtk.Action action)
- {
- if (strcmp (action.get_name(), "edit_action") == 0)
- {
- if (thumb_view.get_selected_images_list () == null)
- share_action.set_sensitive (false);
- else
- share_action.set_sensitive (true);
- }
- }
-
- /**
* Setup the camera listed in GSettings.
*
* @param uri the uri of the device node to setup, or null
diff --git a/src/vapi/config.vapi b/src/vapi/config.vapi
index 2508dff..222da03 100644
--- a/src/vapi/config.vapi
+++ b/src/vapi/config.vapi
@@ -1,12 +1,12 @@
[CCode (cprefix = "", lower_case_cprefix = "", cheader_filename = "cheese-config.h")]
namespace Config
{
- public const string GETTEXT_PACKAGE;
- public const string DATADIR;
- public const string PACKAGE_DATADIR;
- public const string PACKAGE_LOCALEDIR;
- public const string PACKAGE_NAME;
- public const string PACKAGE_VERSION;
- public const string PACKAGE_TARNAME;
- public const string VERSION;
+ public const string GETTEXT_PACKAGE;
+ public const string DATADIR;
+ public const string PACKAGE_DATADIR;
+ public const string PACKAGE_LOCALEDIR;
+ public const string PACKAGE_NAME;
+ public const string PACKAGE_TARNAME;
+ public const string PACKAGE_URL;
+ public const string PACKAGE_VERSION;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]