[ekiga] Call window: Code cleanups.



commit 9e1426746796216e4f0f2214ad892e5a33fbe1b0
Author: Damien Sandras <dsandras beip be>
Date:   Sun Jan 8 15:24:30 2012 +0100

    Call window: Code cleanups.

 src/gui/call_window.cpp |   85 ++++++++---------
 src/gui/main_window.cpp |  235 +----------------------------------------------
 2 files changed, 42 insertions(+), 278 deletions(-)
---
diff --git a/src/gui/call_window.cpp b/src/gui/call_window.cpp
index 9ae3874..12f0d5e 100644
--- a/src/gui/call_window.cpp
+++ b/src/gui/call_window.cpp
@@ -224,29 +224,29 @@ static bool account_completion_helper (Ekiga::AccountPtr acc,
 static void window_closed_from_menu_cb (GtkWidget *widget,
                                         gpointer data);
 
-static void zoom_in_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
+static void zoom_in_changed_cb (GtkWidget *widget,
                                 gpointer data);
 
-static void zoom_out_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
+static void zoom_out_changed_cb (GtkWidget *widget,
                                  gpointer data);
 
-static void zoom_normal_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
+static void zoom_normal_changed_cb (GtkWidget *widget,
                                     gpointer data);
 
 static void display_changed_cb (GtkWidget *widget,
                                 gpointer data);
 
-static void fullscreen_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
-                                   G_GNUC_UNUSED gpointer data);
+static void fullscreen_changed_cb (GtkWidget *widget,
+                                   gpointer data);
 
-static void stay_on_top_changed_nt (G_GNUC_UNUSED gpointer id,
+static void stay_on_top_changed_nt (gpointer id,
                                     GmConfEntry *entry,
                                     gpointer data);
 
 static void url_changed_cb (GtkEditable *e,
                             gpointer data);
 
-static void toolbar_toggle_button_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
+static void toolbar_toggle_button_changed_cb (GtkWidget *widget,
                                               gpointer data);
 
 static void place_call_cb (GtkWidget * /*widget*/,
@@ -261,7 +261,7 @@ static void hangup_call_cb (GtkWidget * /*widget*/,
 static void show_window_cb (GtkWidget *widget,
                             gpointer data);
 
-static void hold_current_call_cb (G_GNUC_UNUSED GtkWidget *widget,
+static void hold_current_call_cb (GtkWidget *widget,
                                   gpointer data);
 
 static void toggle_audio_stream_pause_cb (GtkWidget * /*widget*/,
@@ -270,7 +270,7 @@ static void toggle_audio_stream_pause_cb (GtkWidget * /*widget*/,
 static void toggle_video_stream_pause_cb (GtkWidget * /*widget*/,
                                           gpointer data);
 
-static void transfer_current_call_cb (G_GNUC_UNUSED GtkWidget *widget,
+static void transfer_current_call_cb (GtkWidget *widget,
 			  gpointer data);
 
 static void audio_volume_changed_cb (GtkAdjustment * /*adjustment*/,
@@ -394,9 +394,9 @@ static void ekiga_call_window_update_stats (EkigaCallWindow *cw,
 
 static void ekiga_call_window_set_call_info (EkigaCallWindow *cw,
                                              const char *tr_audio_codec,
-                                             G_GNUC_UNUSED const char *re_audio_codec,
+                                             const char *re_audio_codec,
                                              const char *tr_video_codec,
-                                             G_GNUC_UNUSED const char *re_video_codec);
+                                             const char *re_video_codec);
 
 static void ekiga_call_window_set_status (EkigaCallWindow *cw,
                                           const char *status);
@@ -483,8 +483,8 @@ account_completion_helper (Ekiga::AccountPtr acc,
 }
 
 static void
-window_closed_from_menu_cb (GtkWidget *widget,
-                           gpointer data)
+window_closed_from_menu_cb (G_GNUC_UNUSED GtkWidget *widget,
+                            gpointer data)
 {
   gtk_widget_hide (GTK_WIDGET (data));
 }
@@ -818,35 +818,32 @@ on_videooutput_device_opened_cb (Ekiga::VideoOutputManager & /* manager */,
 {
   EkigaCallWindow *cw = EKIGA_CALL_WINDOW (self);
   int vv;
-  // FIXME
-/*
+
   if (both_streams) {
-    gtk_menu_section_set_sensitive (cw->priv->call_menu, "local_video", TRUE);
-    gtk_menu_section_set_sensitive (cw->priv->call_menu, "fullscreen", TRUE);
+    gtk_menu_section_set_sensitive (cw->priv->main_menu, "local_video", TRUE);
+    gtk_menu_section_set_sensitive (cw->priv->main_menu, "fullscreen", TRUE);
   }
   else {
-
     if (mode == Ekiga::VO_MODE_LOCAL)
-      gtk_menu_set_sensitive (cw->priv->call_menu, "local_video", TRUE);
-
-    if (mode == Ekiga::VO_MODE_REMOTE)
-      gtk_menu_set_sensitive (cw->priv->call_menu, "remote_video", TRUE);
+      gtk_menu_set_sensitive (cw->priv->main_menu, "local_video", TRUE);
+    else if (mode == Ekiga::VO_MODE_REMOTE)
+      gtk_menu_set_sensitive (cw->priv->main_menu, "remote_video", TRUE);
   }
-*/
+
   // when ending a call and going back to local video, the video_view
   // setting should not be updated, so memorise the setting and
   // restore it afterwards
   if (!both_streams && mode == Ekiga::VO_MODE_LOCAL)
     vv = gm_conf_get_int (VIDEO_DISPLAY_KEY "video_view");
   cw->priv->changing_back_to_local_after_a_call = true;
-//FIXME  gtk_radio_menu_select_with_id (cw->priv->call_menu, "local_video", mode);
+  gtk_radio_menu_select_with_id (cw->priv->main_menu, "local_video", mode);
   cw->priv->changing_back_to_local_after_a_call = false;
   if (!both_streams && mode == Ekiga::VO_MODE_LOCAL)
     gm_conf_set_int (VIDEO_DISPLAY_KEY "video_view", vv);
 
-//  gtk_menu_set_sensitive (cw->priv->call_menu, "zoom_in", zoom != 200);
-//  gtk_menu_set_sensitive (cw->priv->call_menu, "zoom_out", zoom != 50);
- // gtk_menu_set_sensitive (cw->priv->call_menu, "normal_size", zoom != 100);
+  gtk_menu_set_sensitive (cw->priv->main_menu, "zoom_in", zoom != 200);
+  gtk_menu_set_sensitive (cw->priv->main_menu, "zoom_out", zoom != 50);
+  gtk_menu_set_sensitive (cw->priv->main_menu, "normal_size", zoom != 100);
 }
 
 static void
@@ -854,11 +851,9 @@ on_videooutput_device_closed_cb (Ekiga::VideoOutputManager & /* manager */, gpoi
 {
   EkigaCallWindow *cw = EKIGA_CALL_WINDOW (self);
 
-/*  gtk_menu_section_set_sensitive (cw->priv->call_menu, "local_video", FALSE);
-
-  gtk_menu_section_set_sensitive (cw->priv->call_menu, "fullscreen", TRUE);
-
-  gtk_menu_section_set_sensitive (cw->priv->call_menu, "zoom_in", FALSE);*/ //FIXME
+  gtk_menu_section_set_sensitive (cw->priv->main_menu, "local_video", FALSE);
+  gtk_menu_section_set_sensitive (cw->priv->main_menu, "fullscreen", TRUE);
+  gtk_menu_section_set_sensitive (cw->priv->main_menu, "zoom_in", FALSE);
 }
 
 //FIXME Set_stay_on_top "window_show object"
@@ -894,7 +889,9 @@ on_videooutput_device_error_cb (Ekiga::VideoOutputManager & /* manager */,
 }
 
 static void
-on_fullscreen_mode_changed_cb (Ekiga::VideoOutputManager & /* manager */, Ekiga::VideoOutputFSToggle toggle, gpointer self)
+on_fullscreen_mode_changed_cb (G_GNUC_UNUSED Ekiga::VideoOutputManager & manager,
+                               Ekiga::VideoOutputFSToggle toggle,
+                               G_GNUC_UNUSED gpointer self)
 {
   ekiga_call_window_toggle_fullscreen (toggle);
 }
@@ -1205,9 +1202,9 @@ on_established_call_cb (boost::shared_ptr<Ekiga::CallManager>  /*manager*/,
 }
 
 static void
-on_cleared_call_cb (boost::shared_ptr<Ekiga::CallManager>  /*manager*/,
+on_cleared_call_cb (G_GNUC_UNUSED boost::shared_ptr<Ekiga::CallManager> manager,
                     boost::shared_ptr<Ekiga::Call>  call,
-                    std::string reason,
+                    G_GNUC_UNUSED std::string reason,
                     gpointer self)
 {
   EkigaCallWindow *cw = EKIGA_CALL_WINDOW (self);
@@ -1288,9 +1285,9 @@ ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
     //  ekiga_call_window_update_sensitivity (cw, FALSE, FALSE, FALSE);
 
       /* Update the menus and toolbar items */
-      //gtk_menu_set_sensitive (cw->priv->call_menu, "connect", TRUE);
-      //gtk_menu_set_sensitive (cw->priv->call_menu, "disconnect", FALSE);
-      //gtk_menu_section_set_sensitive (cw->priv->call_menu, "hold_call", FALSE);
+      //gtk_menu_set_sensitive (cw->priv->main_menu, "connect", TRUE);
+      //gtk_menu_set_sensitive (cw->priv->main_menu, "disconnect", FALSE);
+      //gtk_menu_section_set_sensitive (cw->priv->main_menu, "hold_call", FALSE);
       gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->hold_button), FALSE);
       gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->preview_button), TRUE);
 
@@ -1307,8 +1304,8 @@ ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
     case Calling:
 
       /* Update the menus and toolbar items */
-      //gtk_menu_set_sensitive (cw->priv->call_menu, "connect", FALSE);
-      //gtk_menu_set_sensitive (cw->priv->call_menu, "disconnect", TRUE);
+      //gtk_menu_set_sensitive (cw->priv->main_menu, "connect", FALSE);
+      //gtk_menu_set_sensitive (cw->priv->main_menu, "disconnect", TRUE);
       gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->preview_button), FALSE);
 
       /* Update the connect button */
@@ -1319,9 +1316,9 @@ ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
     case Connected:
 
       /* Update the menus and toolbar items */
-      //gtk_menu_set_sensitive (cw->priv->call_menu, "connect", FALSE);
-      //gtk_menu_set_sensitive (cw->priv->call_menu, "disconnect", TRUE);
-      //gtk_menu_section_set_sensitive (cw->priv->call_menu, "hold_call", TRUE);
+      //gtk_menu_set_sensitive (cw->priv->main_menu, "connect", FALSE);
+      //gtk_menu_set_sensitive (cw->priv->main_menu, "disconnect", TRUE);
+      //gtk_menu_section_set_sensitive (cw->priv->main_menu, "hold_call", TRUE);
       gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->hold_button), TRUE);
       gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->preview_button), FALSE);
 
@@ -1333,7 +1330,7 @@ ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
     case Called:
 
       /* Update the menus and toolbar items */
-      //gtk_menu_set_sensitive (cw->priv->call_menu, "disconnect", TRUE);
+      //gtk_menu_set_sensitive (cw->priv->main_menu, "disconnect", TRUE);
 
       /* Update the connect button */
       ekiga_call_window_call_button_set_connected (cw, TRUE);
diff --git a/src/gui/main_window.cpp b/src/gui/main_window.cpp
index 6d93272..095e779 100644
--- a/src/gui/main_window.cpp
+++ b/src/gui/main_window.cpp
@@ -235,9 +235,6 @@ static void show_gm_window_cb (GtkWidget *widget,
 static void ekiga_main_window_zooms_menu_update_sensitivity (EkigaMainWindow *main_window,
 							     unsigned int zoom);
 
-static void gm_main_window_toggle_fullscreen (Ekiga::VideoOutputFSToggle toggle,
-                                              GtkWidget   *main_window);
-
 static void ekiga_main_window_incoming_call_dialog_show (EkigaMainWindow *mw,
                                                       boost::shared_ptr<Ekiga::Call>  call);
 
@@ -365,44 +362,6 @@ static gint window_closed_cb (GtkWidget *,
 static void window_closed_from_menu_cb (GtkWidget *,
                                        gpointer);
 
-
-/* DESCRIPTION  :  This callback is called when the user changes the zoom
- *                 factor in the menu, and chooses to zoom in.
- * BEHAVIOR     :  zoom *= 2.
- * PRE          :  The GConf key to update with the new zoom.
- */
-static void zoom_in_changed_cb (GtkWidget *,
-				gpointer);
-
-
-/* DESCRIPTION  :  This callback is called when the user changes the zoom
- *                 factor in the menu, and chooses to zoom in.
- * BEHAVIOR     :  zoom /= 2.
- * PRE          :  The GConf key to update with the new zoom.
- */
-static void zoom_out_changed_cb (GtkWidget *,
-				 gpointer);
-
-
-/* DESCRIPTION  :  This callback is called when the user changes the zoom
- *                 factor in the menu, and chooses to zoom in.
- * BEHAVIOR     :  zoom = 1.
- * PRE          :  The GConf key to update with the new zoom.
- */
-static void zoom_normal_changed_cb (GtkWidget *,
-				    gpointer);
-
-static void display_changed_cb (GtkWidget *widget,
-				gpointer data);
-
-/* DESCRIPTION  :  This callback is called when the user toggles fullscreen
- *                 factor in the popup menu.
- * BEHAVIOR     :  Toggles the fullscreen configuration key.
- * PRE          :  /
- */
-static void fullscreen_changed_cb (GtkWidget *,
-				   gpointer);
-
 /* DESCRIPTION  :  This callback is called when the status bar is clicked.
  * BEHAVIOR     :  Clear all info message, not normal messages.
  * PRE          :  The main window GMObject.
@@ -956,12 +915,6 @@ static bool on_handle_errors (std::string error,
  * Display Engine Callbacks
  */
 void
-on_fullscreen_mode_changed_cb (Ekiga::VideoOutputManager & /* manager */, Ekiga::VideoOutputFSToggle toggle,  gpointer self)
-{
-  gm_main_window_toggle_fullscreen (toggle, GTK_WIDGET (self));
-}
-
-void
 on_videoinput_device_added_cb (const Ekiga::VideoInputDevice & device, bool is_desired, gpointer self)
 {
   EkigaMainWindow *mw = EKIGA_MAIN_WINDOW (self);
@@ -1402,108 +1355,7 @@ static void
 window_closed_from_menu_cb (GtkWidget *widget,
                            gpointer data)
 {
-window_closed_cb (widget, NULL, data);
-}
-
-
-static void 
-zoom_in_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
-		    gpointer data)
-{
-  GtkWidget *main_window = GnomeMeeting::Process ()->GetMainWindow ();
-  g_return_if_fail (main_window != NULL);
-
-  g_return_if_fail (data != NULL);
-
-  Ekiga::DisplayInfo display_info;
-
-  display_info.zoom = gm_conf_get_int ((char *) data);
-
-  if (display_info.zoom < 200)
-    display_info.zoom = display_info.zoom * 2;
-
-  gm_conf_set_int ((char *) data, display_info.zoom);
-  ekiga_main_window_zooms_menu_update_sensitivity (EKIGA_MAIN_WINDOW (main_window), display_info.zoom);
-}
-
-
-static void 
-zoom_out_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
-		     gpointer data)
-{
-  GtkWidget *main_window = GnomeMeeting::Process ()->GetMainWindow ();
-  g_return_if_fail (main_window != NULL);
-
-  g_return_if_fail (data != NULL);
-
-  Ekiga::DisplayInfo display_info;
-
-  display_info.zoom = gm_conf_get_int ((char *) data);
-
-  if (display_info.zoom  > 50)
-    display_info.zoom  = (unsigned int) (display_info.zoom  / 2);
-
-  gm_conf_set_int ((char *) data, display_info.zoom);
-  ekiga_main_window_zooms_menu_update_sensitivity (EKIGA_MAIN_WINDOW (main_window), display_info.zoom);
-}
-
-static void
-zoom_normal_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
-			gpointer data)
-{
-  GtkWidget *main_window = GnomeMeeting::Process ()->GetMainWindow ();
-  g_return_if_fail (main_window != NULL);
-
-  g_return_if_fail (data != NULL);
-
-  Ekiga::DisplayInfo display_info;
-
-  display_info.zoom  = 100;
-
-  gm_conf_set_int ((char *) data, display_info.zoom);
-  ekiga_main_window_zooms_menu_update_sensitivity (EKIGA_MAIN_WINDOW (main_window), display_info.zoom);
-}
-
-static void
-display_changed_cb (GtkWidget *widget,
-		    gpointer data)
-{
-  EkigaMainWindow *main_window = EKIGA_MAIN_WINDOW (GnomeMeeting::Process ()->GetMainWindow ());
-  g_return_if_fail (main_window != NULL);
-  g_return_if_fail (data != NULL);
-
-  GSList *group = NULL;
-//  int group_last_pos = 0;
-  int active = 0;
-
-  group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (widget));
-//  group_last_pos = g_slist_length (group) - 1; /* If length 1, last pos is 0 */
-
-  /* Only do something when a new CHECK_MENU_ITEM becomes active,
-     not when it becomes inactive */
-  if (GTK_CHECK_MENU_ITEM (widget)->active) {
-
-    while (group) {
-      if (group->data == widget)
-	break;
-
-      active++;
-      group = g_slist_next (group);
-    }
-
-    // FIXME
-//    if ( !main_window->priv->changing_back_to_local_after_a_call)
-  //    gm_conf_set_int ((gchar *) data, group_last_pos - active);
-  }
-}
-
-static void
-fullscreen_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
-		       G_GNUC_UNUSED gpointer data)
-{
-  GtkWidget* main_window = GnomeMeeting::Process()->GetMainWindow ();
-  g_return_if_fail (main_window != NULL);
-  gm_main_window_toggle_fullscreen (Ekiga::VO_FS_TOGGLE, main_window);
+  window_closed_cb (widget, NULL, data);
 }
 
 static gboolean
@@ -1621,46 +1473,6 @@ ekiga_main_window_update_sensitivity (EkigaMainWindow *mw,
 }
 
 
-void
-gm_main_window_toggle_fullscreen (Ekiga::VideoOutputFSToggle toggle,
-                                  G_GNUC_UNUSED GtkWidget   *main_window)
-{
-  Ekiga::VideoOutputMode videooutput_mode;
-
-  switch (toggle) {
-    case Ekiga::VO_FS_OFF:
-      if (gm_conf_get_int (VIDEO_DISPLAY_KEY "video_view") == Ekiga::VO_MODE_FULLSCREEN) {
-
-        videooutput_mode = (Ekiga::VideoOutputMode) gm_conf_get_int (VIDEO_DISPLAY_KEY "video_view_before_fullscreen");
-        gm_conf_set_int (VIDEO_DISPLAY_KEY "video_view", videooutput_mode);
-      }
-      break;
-    case Ekiga::VO_FS_ON:
-      if (gm_conf_get_int (VIDEO_DISPLAY_KEY "video_view") != Ekiga::VO_MODE_FULLSCREEN) {
-
-        videooutput_mode = (Ekiga::VideoOutputMode) gm_conf_get_int (VIDEO_DISPLAY_KEY "video_view");
-        gm_conf_set_int (VIDEO_DISPLAY_KEY "video_view_before_fullscreen", videooutput_mode);
-        gm_conf_set_int (VIDEO_DISPLAY_KEY "video_view", Ekiga::VO_MODE_FULLSCREEN);
-      }
-      break;
-
-    case Ekiga::VO_FS_TOGGLE:
-    default:
-      if (gm_conf_get_int (VIDEO_DISPLAY_KEY "video_view") == Ekiga::VO_MODE_FULLSCREEN) {
-
-        videooutput_mode = (Ekiga::VideoOutputMode) gm_conf_get_int (VIDEO_DISPLAY_KEY "video_view_before_fullscreen");
-        gm_conf_set_int (VIDEO_DISPLAY_KEY "video_view", videooutput_mode);
-      }
-      else {
-
-        videooutput_mode =  (Ekiga::VideoOutputMode) gm_conf_get_int (VIDEO_DISPLAY_KEY "video_view");
-        gm_conf_set_int (VIDEO_DISPLAY_KEY "video_view_before_fullscreen", videooutput_mode);
-        gm_conf_set_int (VIDEO_DISPLAY_KEY "video_view", Ekiga::VO_MODE_FULLSCREEN);
-      }
-      break;
-  }
-}
-
 static void
 ekiga_main_window_incoming_call_dialog_show (EkigaMainWindow *mw,
                                              boost::shared_ptr<Ekiga::Call>  call)
@@ -2152,51 +1964,6 @@ ekiga_main_window_init_menu (EkigaMainWindow *mw)
                      G_CALLBACK (show_window_cb),
                      (gpointer) call_window, TRUE),
 
-      GTK_MENU_SEPARATOR,
-
-      GTK_MENU_RADIO_ENTRY("local_video", _("_Local Video"),
-			   _("Local video image"),
-			   NULL, '1',
-			   G_CALLBACK (display_changed_cb),
-			   (gpointer) VIDEO_DISPLAY_KEY "video_view",
-			   TRUE, FALSE),
-      GTK_MENU_RADIO_ENTRY("remote_video", _("_Remote Video"),
-			   _("Remote video image"),
-			   NULL, '2',
-			   G_CALLBACK (display_changed_cb),
-			   (gpointer) VIDEO_DISPLAY_KEY "video_view",
-			   FALSE, FALSE),
-      GTK_MENU_RADIO_ENTRY("both_incrusted", _("_Picture-in-Picture"),
-			   _("Both video images"),
-			   NULL, '3',
-			   G_CALLBACK (display_changed_cb),
-			   (gpointer) VIDEO_DISPLAY_KEY "video_view",
-			   FALSE, FALSE),
-      GTK_MENU_RADIO_ENTRY("both_incrusted_window", _("Picture-in-Picture in Separate _Window"),
-			   _("Both video images"),
-			   NULL, '4',
-			   G_CALLBACK (display_changed_cb),
-			   (gpointer) VIDEO_DISPLAY_KEY "video_view",
-			   FALSE, FALSE),
-      GTK_MENU_SEPARATOR,
-
-      GTK_MENU_ENTRY("zoom_in", NULL, _("Zoom in"),
-		     GTK_STOCK_ZOOM_IN, '+',
-		     G_CALLBACK (zoom_in_changed_cb),
-		     (gpointer) VIDEO_DISPLAY_KEY "zoom", FALSE),
-      GTK_MENU_ENTRY("zoom_out", NULL, _("Zoom out"),
-		     GTK_STOCK_ZOOM_OUT, '-',
-		     G_CALLBACK (zoom_out_changed_cb),
-		     (gpointer) VIDEO_DISPLAY_KEY "zoom", FALSE),
-      GTK_MENU_ENTRY("normal_size", NULL, _("Normal size"),
-		     GTK_STOCK_ZOOM_100, '0',
-		     G_CALLBACK (zoom_normal_changed_cb),
-		     (gpointer) VIDEO_DISPLAY_KEY "zoom", FALSE),
-      GTK_MENU_ENTRY("fullscreen", _("_Fullscreen"), _("Switch to fullscreen"),
-		     GTK_STOCK_ZOOM_IN, GDK_F11,
-		     G_CALLBACK (fullscreen_changed_cb),
-		     (gpointer) mw, FALSE),
-
       GTK_MENU_NEW(_("_Help")),
 
       GTK_MENU_ENTRY("help", NULL,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]