[gtkmm] Gtk: Add several new methods
- From: Kjell Ahlstedt <kjellahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtkmm] Gtk: Add several new methods
- Date: Tue, 28 Nov 2017 14:10:01 +0000 (UTC)
commit dfd5e13950cbdb20f1afebc3438859220d5211f4
Author: Kjell Ahlstedt <kjellahlstedt gmail com>
Date: Tue Nov 28 15:05:36 2017 +0100
Gtk: Add several new methods
* gtk/src/buttonbox.hg: Add property_secondary() and
property_non_homogeneous().
* gtk/src/entry.hg: Add property_show_emoji_icon().
* gtk/src/flowbox.hg: Add get_child_at_pos().
* gtk/src/infobar.hg: Add set/get/property_revealed().
* gtk/src/menu.hg: Add place_on_monitor() and
property_[left|right|top|bottom]_attach().
* gtk/src/menubutton.hg: Add set_popup().
* gtk/src/overlay.hg: Add child_property_blur().
* gtk/src/placessidebar.hg: Add set/get/signal/property_show_starred_location().
* gtk/src/selectiondata.[ccg|hg]: Add set/get_surface(). Remove the non-const
get_pixbuf() and let the const get_pixbuf() return a non-const Pixbuf.
The returned Pixbuf is newly allocated.
* gtk/src/textview.hg: Ignore the key-binding "insert-emoji" signal.
* gtk/src/widget.[ccg|hg]: Replace the hand-coded get_width() and get_height()
by wrapped gtk_widget_get_width() and gtk_widget_get_height().
Add contains(), contains_vfunc(), pick(), pick_vfunc(),
set/get/property_cursor(), signal_accel_closures_changed().
* gtk/src/gtk_vfuncs.defs: Add Widget::contains_vfunc() and
Widget::pick_vfunc().
* tools/m4/convert_gdk.m4: Add more conversions for Gdk::Cursor.
gtk/src/buttonbox.hg | 7 ++++---
gtk/src/entry.hg | 2 ++
gtk/src/flowbox.hg | 3 +++
gtk/src/gtk_vfuncs.defs | 18 ++++++++++++++++++
gtk/src/infobar.hg | 3 +++
gtk/src/menu.hg | 8 +++++++-
gtk/src/menubutton.hg | 1 +
gtk/src/overlay.hg | 1 +
gtk/src/placessidebar.hg | 5 +++++
gtk/src/selectiondata.ccg | 4 +---
gtk/src/selectiondata.hg | 8 ++++++--
gtk/src/textview.hg | 1 +
gtk/src/widget.ccg | 7 -------
gtk/src/widget.hg | 33 ++++++++++++++++++++++++++++++---
tools/m4/convert_gdk.m4 | 4 ++++
15 files changed, 86 insertions(+), 19 deletions(-)
---
diff --git a/gtk/src/buttonbox.hg b/gtk/src/buttonbox.hg
index 388ce45..01c6403 100644
--- a/gtk/src/buttonbox.hg
+++ b/gtk/src/buttonbox.hg
@@ -51,7 +51,7 @@ class ButtonBox
{
_CLASS_GTKOBJECT(ButtonBox,GtkButtonBox,GTK_BUTTON_BOX,Gtk::Box,GtkBox)
public:
- //Note that we try to use the same defaul parameter value as the default property value.
+ //Note that we try to use the same default parameter value as the default property value.
_WRAP_CTOR(ButtonBox(Orientation orientation = Orientation::HORIZONTAL), gtk_button_box_new)
_WRAP_METHOD(ButtonBoxStyle get_layout() const, gtk_button_box_get_layout)
@@ -60,11 +60,12 @@ public:
_WRAP_METHOD(void set_child_secondary(Widget& child, bool is_secondary = true),
gtk_button_box_set_child_secondary)
_WRAP_METHOD(bool get_child_secondary(const Gtk::Widget& child) const, gtk_button_box_get_child_secondary)
- _WRAP_METHOD(bool get_child_non_homogeneous(const Gtk::Widget& child) const,
gtk_button_box_get_child_non_homogeneous )
-
+ _WRAP_METHOD(bool get_child_non_homogeneous(const Gtk::Widget& child) const,
gtk_button_box_get_child_non_homogeneous)
_WRAP_METHOD(void set_child_non_homogeneous(Gtk::Widget& child, bool non_homogeneous = true),
gtk_button_box_set_child_non_homogeneous)
_WRAP_PROPERTY("layout-style", ButtonBoxStyle)
+ _WRAP_CHILD_PROPERTY("secondary", bool)
+ _WRAP_CHILD_PROPERTY("non-homogeneous", bool)
};
} // namespace Gtk
diff --git a/gtk/src/entry.hg b/gtk/src/entry.hg
index 90ea2c0..e832665 100644
--- a/gtk/src/entry.hg
+++ b/gtk/src/entry.hg
@@ -217,6 +217,7 @@ public:
_IGNORE_SIGNAL("toggle_overwrite")
_IGNORE_SIGNAL("backspace")
_IGNORE_SIGNAL("preedit-changed")
+ _IGNORE_SIGNAL("insert-emoji")
_WRAP_PROPERTY("buffer", Glib::RefPtr<EntryBuffer>)
_WRAP_PROPERTY("cursor-position", int)
@@ -263,6 +264,7 @@ public:
_WRAP_PROPERTY("attributes", Pango::AttrList)
_WRAP_PROPERTY("populate-all", bool)
_WRAP_PROPERTY("tabs", Pango::TabArray)
+ _WRAP_PROPERTY("show-emoji-icon", bool)
};
} //namespace Gtk
diff --git a/gtk/src/flowbox.hg b/gtk/src/flowbox.hg
index 289d9ae..086ce5d 100644
--- a/gtk/src/flowbox.hg
+++ b/gtk/src/flowbox.hg
@@ -134,6 +134,9 @@ public:
_WRAP_METHOD(FlowBoxChild* get_child_at_index(int idx), gtk_flow_box_get_child_at_index)
_WRAP_METHOD(const FlowBoxChild* get_child_at_index(int idx) const, gtk_flow_box_get_child_at_index,
constversion)
+ _WRAP_METHOD(FlowBoxChild* get_child_at_pos(int x, int y), gtk_flow_box_get_child_at_pos)
+ _WRAP_METHOD(const FlowBoxChild* get_child_at_pos(int x, int y) const, gtk_flow_box_get_child_at_pos,
constversion)
+
/** Calls a function for each selected child.
*
* Note that the selection cannot be modified from within
diff --git a/gtk/src/gtk_vfuncs.defs b/gtk/src/gtk_vfuncs.defs
index 73971fd..51bfb19 100644
--- a/gtk/src/gtk_vfuncs.defs
+++ b/gtk/src/gtk_vfuncs.defs
@@ -708,6 +708,24 @@
)
)
+(define-vfunc contains
+ (of-object "GtkWidget")
+ (return-type "gboolean")
+ (parameters
+ '("gdouble" "x")
+ '("gdouble" "y")
+ )
+)
+
+(define-vfunc pick
+ (of-object "GtkWidget")
+ (return-type "GtkWidget*")
+ (parameters
+ '("gdouble" "x")
+ '("gdouble" "y")
+ )
+)
+
; GtkRecentChooser
(define-vfunc set_current_uri
diff --git a/gtk/src/infobar.hg b/gtk/src/infobar.hg
index 5dbe97e..a54eebc 100644
--- a/gtk/src/infobar.hg
+++ b/gtk/src/infobar.hg
@@ -80,6 +80,8 @@ public:
_WRAP_METHOD(void set_show_close_button(bool setting = true), gtk_info_bar_set_show_close_button)
_WRAP_METHOD(bool get_show_close_button() const, gtk_info_bar_get_show_close_button)
+ _WRAP_METHOD(void set_revealed(bool revealed = true), gtk_info_bar_set_revealed)
+ _WRAP_METHOD(bool get_revealed() const, gtk_info_bar_get_revealed)
_IGNORE_SIGNAL("close")
@@ -87,6 +89,7 @@ public:
_WRAP_PROPERTY("message-type", MessageType)
_WRAP_PROPERTY("show-close-button", bool)
+ _WRAP_PROPERTY("revealed", bool)
};
} // namespace Gtk
diff --git a/gtk/src/menu.hg b/gtk/src/menu.hg
index 603d205..0b43198 100644
--- a/gtk/src/menu.hg
+++ b/gtk/src/menu.hg
@@ -18,6 +18,7 @@
_DEFS(gtkmm,gtk)
_PINCLUDE(gtkmm/private/menushell_p.h)
+#include <gdkmm/monitor.h>
#include <gdkmm/window.h>
#include <gtkmm/menushell.h>
#include <gtkmm/menuitem.h>
@@ -130,7 +131,7 @@ public:
_WRAP_METHOD(void set_monitor(int monitor_num), gtk_menu_set_monitor)
_WRAP_METHOD(int get_monitor() const, gtk_menu_get_monitor)
- //TODO: Wrap or ignore gtk_menu_place_on_monitor(). It's not documented. Does it mean it's private?
+ _WRAP_METHOD(void place_on_monitor(const Glib::RefPtr<Gdk::Monitor>& monitor), gtk_menu_place_on_monitor)
void reorder_child(const MenuItem& child, int position);
_IGNORE(gtk_menu_reorder_child)
@@ -164,6 +165,11 @@ public:
_WRAP_PROPERTY("rect-anchor-dy", int)
_WRAP_PROPERTY("menu-type-hint", Gdk::Window::TypeHint)
+ _WRAP_CHILD_PROPERTY("left-attach", int)
+ _WRAP_CHILD_PROPERTY("right-attach", int)
+ _WRAP_CHILD_PROPERTY("top-attach", int)
+ _WRAP_CHILD_PROPERTY("bottom-attach", int)
+
protected:
//TODO: Remove this if it has never been used, at the next ABI break?
diff --git a/gtk/src/menubutton.hg b/gtk/src/menubutton.hg
index 825da40..9f6f6ed 100644
--- a/gtk/src/menubutton.hg
+++ b/gtk/src/menubutton.hg
@@ -43,6 +43,7 @@ public:
_CTOR_DEFAULT
+ _WRAP_METHOD(void set_popup(Menu& menu), gtk_menu_button_set_popup)
/** Disables the button.
*/
void unset_popup();
diff --git a/gtk/src/overlay.hg b/gtk/src/overlay.hg
index 7bd4815..bcc65c1 100644
--- a/gtk/src/overlay.hg
+++ b/gtk/src/overlay.hg
@@ -67,6 +67,7 @@ public:
_WRAP_SIGNAL(bool get_child_position(Gtk::Widget* widget, Gdk::Rectangle& allocation),
"get-child-position")
_WRAP_CHILD_PROPERTY("pass-through", bool)
+ _WRAP_CHILD_PROPERTY("blur", double)
_WRAP_CHILD_PROPERTY("index", int)
};
diff --git a/gtk/src/placessidebar.hg b/gtk/src/placessidebar.hg
index f466bf8..2221036 100644
--- a/gtk/src/placessidebar.hg
+++ b/gtk/src/placessidebar.hg
@@ -116,6 +116,9 @@ public:
_WRAP_METHOD(void set_show_other_locations(bool show_other_locations = true),
gtk_places_sidebar_set_show_other_locations)
_WRAP_METHOD(bool get_show_other_locations() const, gtk_places_sidebar_get_show_other_locations)
+ _WRAP_METHOD(void set_show_starred_location(bool show_starred_location = true),
gtk_places_sidebar_set_show_starred_location)
+ _WRAP_METHOD(bool get_show_starred_location() const, gtk_places_sidebar_get_show_starred_location)
+
// Gtk+ does not guarantee that context can be a nullptr, not even when visible is false.
// See https://bugzilla.gnome.org/show_bug.cgi?id=752633#c3.
_WRAP_METHOD(void set_drop_targets_visible(bool visible, const Glib::RefPtr<Gdk::DragContext>& context),
gtk_places_sidebar_set_drop_targets_visible)
@@ -137,6 +140,7 @@ public:
_WRAP_SIGNAL(void show_error_message(const Glib::ustring& primary, const Glib::ustring& secondary),
"show_error_message", no_default_handler)
_WRAP_SIGNAL(void show_enter_location(), "show_enter_location", no_default_handler)
_WRAP_SIGNAL(void show_other_locations_with_flags(PlacesOpenFlags open_flags),
"show_other_locations_with_flags", no_default_handler)
+ _WRAP_SIGNAL(void show_starred_location(PlacesOpenFlags open_flags), "show_starred_location",
no_default_handler)
#m4 _CONVERSION(`GMountOperation*',`const Glib::RefPtr<Gio::MountOperation>&',`Glib::wrap($3, true)')
_WRAP_SIGNAL(void mount(const Glib::RefPtr<Gio::MountOperation>& mount_operation), "mount",
no_default_handler)
@@ -150,6 +154,7 @@ public:
_WRAP_PROPERTY("show-recent", bool)
_WRAP_PROPERTY("show-trash", bool)
_WRAP_PROPERTY("show-other-locations", bool)
+ _WRAP_PROPERTY("show-starred-location", bool)
_WRAP_PROPERTY("populate-all", bool)
};
diff --git a/gtk/src/selectiondata.ccg b/gtk/src/selectiondata.ccg
index a6ee912..47d36e8 100644
--- a/gtk/src/selectiondata.ccg
+++ b/gtk/src/selectiondata.ccg
@@ -18,12 +18,11 @@
#include <glibmm/vectorutils.h>
#include <gtkmm/textbuffer.h>
+#include <gdkmm/cairoutils.h>
#include <gdkmm/pixbuf.h>
#include <glibmm/utility.h> //For make_unique_ptr_gfree<>.
#include <gtk/gtk.h>
-
-
namespace Gtk
{
@@ -91,5 +90,4 @@ std::string SelectionData::get_data_type() const
gdk_atom_name( gtk_selection_data_get_data_type(const_cast<GtkSelectionData*>(gobj())) ) );
}
-
} // namespace Gtk
diff --git a/gtk/src/selectiondata.hg b/gtk/src/selectiondata.hg
index c1832fd..ddd7878 100644
--- a/gtk/src/selectiondata.hg
+++ b/gtk/src/selectiondata.hg
@@ -83,8 +83,12 @@ public:
_IGNORE(gtk_selection_data_get_text)
_WRAP_METHOD(bool set_pixbuf(const Glib::RefPtr<Gdk::Pixbuf>& pixbuf), gtk_selection_data_set_pixbuf)
- _WRAP_METHOD(Glib::RefPtr<Gdk::Pixbuf> get_pixbuf(), gtk_selection_data_get_pixbuf)
- _WRAP_METHOD(Glib::RefPtr<const Gdk::Pixbuf> get_pixbuf() const, gtk_selection_data_get_pixbuf,
constversion)
+ // get_pixbuf() is const because it returns a newly allocated pixbuf.
+ _WRAP_METHOD(Glib::RefPtr<Gdk::Pixbuf> get_pixbuf() const, gtk_selection_data_get_pixbuf)
+
+ _WRAP_METHOD(bool set_surface(const Cairo::RefPtr<Cairo::Surface>& surface),
gtk_selection_data_set_surface)
+ // get_surface() is const because it returns a newly allocated cairo surface.
+ _WRAP_METHOD(Cairo::RefPtr<Cairo::Surface> get_surface() const, gtk_selection_data_get_surface)
dnl The constness of gtk_selection_data_set_uris() is not quite right:
#m4 _CONVERSION(`const
std::vector<Glib::ustring>&',`gchar**',`const_cast<char**>(Glib::ArrayHandler<Glib::ustring>::vector_to_array($3).data())')
diff --git a/gtk/src/textview.hg b/gtk/src/textview.hg
index 2d1a971..de42edc 100644
--- a/gtk/src/textview.hg
+++ b/gtk/src/textview.hg
@@ -221,6 +221,7 @@ public:
_IGNORE_SIGNAL("toggle_cursor_visible")
_IGNORE_SIGNAL("preedit-changed")
_IGNORE_SIGNAL("extend-selection")
+ _IGNORE_SIGNAL("insert-emoji")
_WRAP_PROPERTY("pixels-above-lines", int)
_WRAP_PROPERTY("pixels-below-lines", int)
diff --git a/gtk/src/widget.ccg b/gtk/src/widget.ccg
index fcf5420..638d195 100644
--- a/gtk/src/widget.ccg
+++ b/gtk/src/widget.ccg
@@ -415,13 +415,6 @@ Allocation Widget::get_allocation() const
return allocation;
}
-int Widget::get_width() const
- { return get_allocation().get_width(); }
-
-int Widget::get_height() const
- { return get_allocation().get_height(); }
-
-
void Widget::drag_dest_set(DestDefaults flags, Gdk::DragAction actions)
{
gtk_drag_dest_set(gobj(), (GtkDestDefaults)flags, nullptr, (GdkDragAction)actions);
diff --git a/gtk/src/widget.hg b/gtk/src/widget.hg
index 3e35ba9..9c77e01 100644
--- a/gtk/src/widget.hg
+++ b/gtk/src/widget.hg
@@ -249,6 +249,9 @@ public:
Allocation get_allocation() const;
_IGNORE(gtk_widget_get_allocation)
+ _WRAP_METHOD(int get_width() const, gtk_widget_get_width)
+ _WRAP_METHOD(int get_height() const, gtk_widget_get_height)
+
/** Retrieves the widget’s clip area.
*
* The clip area is the area in which all of the widget's drawing will
@@ -337,6 +340,10 @@ public:
int src_x, int src_y,
int& dest_x, int& dest_y), gtk_widget_translate_coordinates)
+ _WRAP_METHOD(bool contains(double x, double y) const, gtk_widget_contains)
+ _WRAP_METHOD(Widget* pick(double x, double y), gtk_widget_pick)
+ _WRAP_METHOD(const Widget* pick(double x, double y) const, gtk_widget_pick, constversion)
+
_WRAP_METHOD(void reset_style(), gtk_widget_reset_style)
_WRAP_METHOD(Glib::RefPtr<Pango::Context> create_pango_context(), gtk_widget_create_pango_context)
@@ -365,6 +372,24 @@ public:
_WRAP_METHOD(void shape_combine_region(const Cairo::RefPtr<const Cairo::Region>& region),
gtk_widget_shape_combine_region)
_WRAP_METHOD(void input_shape_combine_region(const Cairo::RefPtr<const Cairo::Region>& region),
gtk_widget_input_shape_combine_region)
+ _WRAP_METHOD(void set_cursor(const Glib::RefPtr<Gdk::Cursor>& cursor), gtk_widget_set_cursor)
+
+ /** Sets a named cursor to be shown when pointer devices point towards the widget.
+ *
+ * This is a utility function that creates a cursor and then sets it on the widget.
+ *
+ * If the @a name is an empty string, the widget will use the cursor specified via CSS
+ * or the parent widget. If neither specifies a cursor, the default cursor
+ * will be shown. This is the default behavior.
+ *
+ * @newin{3,94}
+ *
+ * @param name The name of the cursor, or an empty string to use the default cursor.
+ */
+ _WRAP_METHOD(void set_cursor(const Glib::ustring& name{NULL} = {}), gtk_widget_set_cursor_from_name)
+ _WRAP_METHOD(Glib::RefPtr<Gdk::Cursor> get_cursor(), gtk_widget_get_cursor, refreturn)
+ _WRAP_METHOD(Glib::RefPtr<const Gdk::Cursor> get_cursor() const, gtk_widget_get_cursor, refreturn,
constversion)
+
_WRAP_METHOD(WidgetPath get_path() const, gtk_widget_get_path)
#m4 _CONVERSION(`GList*',`std::vector<Widget*>',`Glib::ListHandler<Widget*>::list_to_vector($3,
Glib::OWNERSHIP_SHALLOW)')
@@ -448,9 +473,6 @@ public:
_WRAP_METHOD(void set_has_tooltip(bool has_tooltip = TRUE), gtk_widget_set_has_tooltip)
_WRAP_METHOD(bool get_has_tooltip() const, gtk_widget_get_has_tooltip)
- int get_width() const;
- int get_height() const;
-
_WRAP_METHOD(bool in_destruction() const, gtk_widget_in_destruction)
_WRAP_METHOD(Glib::RefPtr<StyleContext> get_style_context(), gtk_widget_get_style_context, refreturn)
@@ -648,6 +670,8 @@ dnl
_WRAP_SIGNAL(bool drag_drop(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, guint time),
"drag_drop")
_WRAP_SIGNAL(void drag_data_received(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, const
SelectionData& selection_data, guint time), "drag_data_received")
+ // The accel_closures_changed signal can't have a default handler because the wrapped C signal has no
default handler.
+ _WRAP_SIGNAL(void accel_closures_changed(), "accel_closures_changed", no_default_handler)
_CONVERSION(`GdkDisplay*',`const Glib::RefPtr<Gdk::Display>&',`Glib::wrap($3, true)')
_WRAP_SIGNAL(void display_changed(const Glib::RefPtr<Gdk::Display>& previous_display), "display_changed")
@@ -687,6 +711,7 @@ _CONVERSION(`GdkDisplay*',`const Glib::RefPtr<Gdk::Display>&',`Glib::wrap($3, tr
_WRAP_PROPERTY("can_default", bool)
_WRAP_PROPERTY("has_default", bool)
_WRAP_PROPERTY("receives_default", bool)
+ _WRAP_PROPERTY("cursor", Glib::RefPtr<Gdk::Cursor>)
_WRAP_PROPERTY("has_tooltip", bool)
_WRAP_PROPERTY("tooltip_markup", Glib::ustring)
_WRAP_PROPERTY("tooltip_text", Glib::ustring)
@@ -720,6 +745,8 @@ protected:
_WRAP_VFUNC(void compute_expand(bool& hexpand_p, bool& vexpand_p), compute_expand,
custom_vfunc_callback, custom_vfunc)
+ _WRAP_VFUNC(bool contains(double x, double y) const, contains)
+ _WRAP_VFUNC(Widget* pick(double x, double y), pick)
// The snapshot vfunc must not be wrapped here. It would interfere with the way
// gtk+ selects either the snapshot vfunc or the draw signal for rendering widgets.
diff --git a/tools/m4/convert_gdk.m4 b/tools/m4/convert_gdk.m4
index 0d1d018..26388cf 100644
--- a/tools/m4/convert_gdk.m4
+++ b/tools/m4/convert_gdk.m4
@@ -113,6 +113,8 @@ _CONVERSION(`cairo_surface_t*',`::Cairo::RefPtr< ::Cairo::Surface>',`Gdk::Cairo:
_CONVERSION(`const Glib::RefPtr<Cursor>&',`GdkCursor*',__CONVERT_REFPTR_TO_P)
_CONVERSION(`const Glib::RefPtr<const Cursor>&',`GdkCursor*',__CONVERT_CONST_REFPTR_TO_P)
+_CONVERSION(`const Glib::RefPtr<Gdk::Cursor>&',`GdkCursor*',__CONVERT_REFPTR_TO_P)
+_CONVERSION(`const Glib::RefPtr<const Gdk::Cursor>&',`GdkCursor*',__CONVERT_CONST_REFPTR_TO_P)
_CONVERSION(`const Glib::RefPtr<Gdk::Window>&',`GdkWindow*',__CONVERT_REFPTR_TO_P)
_CONVERSION(`const Glib::RefPtr<Window>&',`GdkWindow*',__CONVERT_REFPTR_TO_P)
_CONVERSION(`const Glib::RefPtr<GLContext>&',`GdkGLContext*',__CONVERT_REFPTR_TO_P)
@@ -182,6 +184,8 @@ _CONVERSION(`GdkDrawContext*',`Glib::RefPtr<const DrawContext>', `Glib::wrap($3)
_CONVERSION(`GdkDrawingContext*',`Glib::RefPtr<DrawingContext>', `Glib::wrap($3)')
_CONVERSION(`GdkCursor*',`Glib::RefPtr<Cursor>', `Glib::wrap($3)')
_CONVERSION(`GdkCursor*',`Glib::RefPtr<const Cursor>', `Glib::wrap($3)')
+_CONVERSION(`GdkCursor*',`Glib::RefPtr<Gdk::Cursor>', `Glib::wrap($3)')
+_CONVERSION(`GdkCursor*',`Glib::RefPtr<const Gdk::Cursor>', `Glib::wrap($3)')
_CONVERSION(`GdkPixbuf*',`Glib::RefPtr<Pixbuf>', `Glib::wrap($3)')
_CONVERSION(`GdkPixbuf*',`Glib::RefPtr<Gdk::Pixbuf>', `Glib::wrap($3)')
_CONVERSION(`GdkPixbuf*',`Glib::RefPtr<const Gdk::Pixbuf>', `Glib::wrap($3)')
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]