diff src/gtk/misc-gtk.c @ 19:3b2dcdefc7e9

2002-09-15 Brian Masney <masneyb@gftp.org> * lib/gftp.h (struct gftp_transfer) - changed the type of numfiles and numdirs from unsigned long to long. This must be a signed field. This is a bug I introduced a few days ago. * lib/local.c (local_put_file) - remove the + off of the ab mode to fdopen. This is also a bug I introduced a few days ago. * src/gtk/transfer.c (gftp_gtk_calc_kbs) - make sure that the variable difftime isn't a negative number when computing the KB/s * src/gtk/menu-items.c (save_directory_listing) - remove casts to GTK_OBJECT for the str variable * src/gtk/gftp-gtk.c - use GTK_STOCK_* icons in place of left.xpm, right.xpm, up.xpm, down.xpm and stop.xpm in GTK+ 2.0 port * src/gtk/bookmarks.c - show GTK_STOCK_* icons on the popup menu * src/gtk/bookmarks.c, src/gtk/chmod_dialog.c, src/gtk/menu-items.c, src/gtk/misc-gtk.c, src/gtk/options_dialog.c and src/gtk/view_dialog.c - use gtk_dialog_new_with_buttons in GTK+ 2.0 port to create the dialog. Also, associate gFTP icon with this dialog * src/gtk/misc-gtk.c - changed the interface of MakeEditDialog and MakeYesNoDialog. In the GTK+ 2.0 port, I now use stock icons in the dialog buttons.
author masneyb
date Mon, 16 Sep 2002 12:27:50 +0000
parents 83090328581e
children 4b244bf9d84d
line wrap: on
line diff
--- a/src/gtk/misc-gtk.c	Wed Sep 11 10:26:13 2002 +0000
+++ b/src/gtk/misc-gtk.c	Mon Sep 16 12:27:50 2002 +0000
@@ -22,7 +22,6 @@
 static void set_menu_sensitive 			( gftp_window_data * wdata,
 						  char *path, 
 						  int sensitive );
-static void destroy_dialog_data 		( gftp_dialog_data * data );
 static gint delete_event 			( GtkWidget * widget, 
 						  GdkEvent * event, 
 						  gpointer data );
@@ -503,6 +502,7 @@
   return (1);
 }
 
+
 static gchar *
 gftp_item_factory_translate (const char *path,
 			     gpointer    func_data)
@@ -524,11 +524,10 @@
   return (char *)result;
 }
 
+
 GtkItemFactory *
-item_factory_new (GtkType	       container_type,
-		  const char	      *path,
-		  GtkAccelGroup       *accel_group,
-		  const char          *strip_prefix)
+item_factory_new (GtkType container_type, const char *path,
+		  GtkAccelGroup *accel_group, const char *strip_prefix)
 {
   GtkItemFactory *result = gtk_item_factory_new (container_type, path, accel_group);
   gchar *strip_prefix_dup = g_strdup (g_strdup (strip_prefix));
@@ -543,6 +542,7 @@
   return result;
 }
 
+
 void
 create_item_factory (GtkItemFactory * ifactory, guint n_entries,
 		     GtkItemFactoryEntry * entries, gpointer callback_data)
@@ -776,185 +776,227 @@
 }
 
 
+#if !(GTK_MAJOR_VERSION == 1 && GTK_MINOR_VERSION == 2)
+static void
+dialog_response (GtkWidget * widget, gint response, gftp_dialog_data * ddata)
+{
+  if (ddata->edit == NULL)
+    gtk_widget_destroy (widget);
+
+  switch (response)
+    {
+      case GTK_RESPONSE_YES:
+        if (ddata->yesfunc != NULL)
+          ddata->yesfunc (ddata->yespointer, ddata);
+        break;
+      default:
+        if (ddata->nofunc != NULL)
+          ddata->nofunc (ddata->nopointer, ddata);
+        break;
+    }
+
+  if (ddata->edit != NULL)
+    gtk_widget_destroy (widget);
+
+  g_free (ddata);
+}
+#endif
+
+
 void
-MakeEditDialog (char *diagtxt, char *infotxt, char *deftext, int edit_shown,
-		int erase, char *checktext, 
-                char *oktxt, void (*okfunc) (), void *okptr,
-		char *canceltxt, void (*cancelfunc) (), void *cancelptr)
+MakeEditDialog (char *diagtxt, char *infotxt, char *deftext, int passwd_item,
+		char *checktext, 
+                gftp_dialog_button okbutton, void (*okfunc) (), void *okptr,
+		void (*cancelfunc) (), void *cancelptr)
 {
-  gftp_dialog_data * d, * cancel_d;
-  GtkWidget * tempwid;
+  GtkWidget * tempwid, * dialog;
+  gftp_dialog_data * ddata;
+  const gchar * yes_text;
+
+  ddata = g_malloc (sizeof (*ddata));
+  ddata->yesfunc = okfunc;
+  ddata->yespointer = okptr;
+  ddata->nofunc = cancelfunc;
+  ddata->nopointer = cancelptr;
 
-  d = g_malloc0 (sizeof (*d));
-  cancel_d = g_malloc0 (sizeof (*cancel_d));
-  cancel_d->data = cancelptr;
-  d->data = okptr;
-  cancel_d->all_buttons = d->all_buttons = NULL;
-  d->dialog = cancel_d->dialog = gtk_dialog_new ();
-  gtk_grab_add (d->dialog);
-  gtk_window_set_title (GTK_WINDOW (d->dialog), diagtxt);
-  gtk_window_set_wmclass (GTK_WINDOW(d->dialog), "edit", "gFTP");
-  gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (d->dialog)->vbox), 10);
+#if GTK_MAJOR_VERSION == 1 && GTK_MINOR_VERSION == 2
+  dialog = gtk_dialog_new ();
+  gtk_window_set_title (GTK_WINDOW (dialog), diagtxt);
+  gtk_grab_add (dialog);
   gtk_container_border_width (GTK_CONTAINER
-			      (GTK_DIALOG (d->dialog)->action_area), 5);
-  gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (d->dialog)->vbox), 5);
-  gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (d->dialog)->action_area), 15);
-  gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (d->dialog)->action_area), TRUE);
-  gtk_window_set_position (GTK_WINDOW (d->dialog), GTK_WIN_POS_MOUSE);
+			      (GTK_DIALOG (dialog)->action_area), 5);
+  gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->action_area), 15);
+  gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE);
+#else
+  switch (okbutton)
+    {
+      case gftp_dialog_button_create:
+        yes_text = GTK_STOCK_ADD;
+        break;
+      case gftp_dialog_button_change:
+        yes_text = _("Change");
+        break;
+      case gftp_dialog_button_connect:
+        yes_text = _("Connect");
+        break;
+      case gftp_dialog_button_rename:
+        yes_text = _("Rename");
+        break;
+      default:
+        yes_text = GTK_STOCK_MISSING_IMAGE;
+        break;
+    }
 
-  if (cancelfunc)
-    gtk_signal_connect (GTK_OBJECT (d->dialog), "delete_event",
-			GTK_SIGNAL_FUNC (cancelfunc), (gpointer) cancel_d);
+  dialog = gtk_dialog_new_with_buttons (_(diagtxt), NULL, 0,
+                                        yes_text,
+                                        GTK_RESPONSE_YES,
+                                        GTK_STOCK_CANCEL,
+                                        GTK_RESPONSE_NO,
+                                        NULL);
+#endif
+  gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10);
+  gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5);
+  gtk_window_set_wmclass (GTK_WINDOW(dialog), "edit", "gFTP");
+  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
+  gtk_widget_realize (dialog);
 
-  gtk_signal_connect_object (GTK_OBJECT (d->dialog), "delete_event",
-			     GTK_SIGNAL_FUNC (destroy_dialog_data),
-			     (gpointer) cancel_d);
+  if (gftp_icon != NULL)
+    {
+      gdk_window_set_icon (dialog->window, NULL, gftp_icon->pixmap,
+                           gftp_icon->bitmap);
+      gdk_window_set_icon_name (dialog->window, _("gFTP Icon"));
+    }
+
+  ddata->dialog = dialog;
+
   tempwid = gtk_label_new (infotxt);
-  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (d->dialog)->vbox), tempwid, TRUE,
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), tempwid, TRUE,
 		      TRUE, 0);
   gtk_widget_show (tempwid);
 
-  d->edit = cancel_d->edit = gtk_entry_new ();
-  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (d->dialog)->vbox), d->edit, TRUE,
+  ddata->edit = gtk_entry_new ();
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), ddata->edit, TRUE,
 		      TRUE, 0);
-  if (okfunc)
-    gtk_signal_connect (GTK_OBJECT (d->edit), "activate",
-			GTK_SIGNAL_FUNC (okfunc), (gpointer) d);
-  if (erase || !okfunc)
-    gtk_signal_connect_object (GTK_OBJECT (d->edit), "activate",
-			       GTK_SIGNAL_FUNC (gtk_widget_destroy),
-			       (gpointer) d->dialog);
+  gtk_widget_grab_focus (ddata->edit);
+  gtk_entry_set_visibility (GTK_ENTRY (ddata->edit), passwd_item);
 
-  gtk_widget_grab_focus (d->edit);
-  gtk_entry_set_visibility (GTK_ENTRY (d->edit), edit_shown);
   if (deftext != NULL)
     {
-      gtk_entry_set_text (GTK_ENTRY (d->edit), deftext);
-      gtk_entry_select_region (GTK_ENTRY (d->edit), 0, strlen (deftext));
+      gtk_entry_set_text (GTK_ENTRY (ddata->edit), deftext);
+      gtk_entry_select_region (GTK_ENTRY (ddata->edit), 0, strlen (deftext));
     }
-  gtk_widget_show (d->edit);
+  gtk_widget_show (ddata->edit);
 
-  if (checktext)
+  if (checktext != NULL)
     {
-      d->checkbox = cancel_d->checkbox = 
-                                   gtk_check_button_new_with_label (checktext);
-      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (d->dialog)->vbox), d->checkbox, 
-                          TRUE, TRUE, 0);
-      gtk_widget_show (d->checkbox);
+      ddata->checkbox = gtk_check_button_new_with_label (checktext);
+      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), 
+                          ddata->checkbox, TRUE, TRUE, 0);
+      gtk_widget_show (ddata->checkbox);
     }
       
+#if GTK_MAJOR_VERSION == 1 && GTK_MINOR_VERSION == 2
+/* FIXME - fix call backs */
   tempwid = gtk_button_new_with_label (oktxt);
   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
-  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (d->dialog)->action_area), tempwid,
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
 		      TRUE, TRUE, 0);
-  if (okfunc)
-    gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
-			GTK_SIGNAL_FUNC (okfunc), (gpointer) d);
-  if (erase || !okfunc)
-    gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
-			       GTK_SIGNAL_FUNC (gtk_widget_destroy),
-			       (gpointer) d->dialog);
   gtk_widget_grab_default (tempwid);
   gtk_widget_show (tempwid);
 
   tempwid = gtk_button_new_with_label (canceltxt);
   GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
-  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (d->dialog)->action_area), tempwid,
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
 		      TRUE, TRUE, 0);
-  if (cancelfunc)
-    gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
-			GTK_SIGNAL_FUNC (cancelfunc), (gpointer) cancel_d);
-  if (erase || !cancelfunc)
-    gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
-			       GTK_SIGNAL_FUNC (gtk_widget_destroy),
-			       (gpointer) d->dialog);
   gtk_widget_show (tempwid);
+#else
+  g_signal_connect (GTK_OBJECT (dialog), "response",
+                    G_CALLBACK (dialog_response), ddata);
+#endif
 
-  d->all_buttons = g_list_append (d->all_buttons, d);
-  d->all_buttons = g_list_append (d->all_buttons, cancel_d);
-  cancel_d->all_buttons = d->all_buttons;
-  gtk_widget_show (d->dialog);
+  gtk_widget_show (dialog);
 }
 
 
 void
-MakeYesNoDialog (char *diagtxt, char *infotxt, int erase, int num, ...)
+MakeYesNoDialog (char *diagtxt, char *infotxt, 
+                 void (*yesfunc) (), gpointer yespointer, 
+                 void (*nofunc) (), gpointer nopointer)
 {
-  GtkWidget * text, * tempwid, * dialog;
-  typedef void (*func) ();
-  gftp_dialog_data * d;
-  char *tempstr;
-  va_list argp;
-  func myfunc;
-  GList * list;
-  void *ptr;
-  int i;
+  GtkWidget * text, * dialog;
+#if !(GTK_MAJOR_VERSION == 1 && GTK_MINOR_VERSION == 2)
+  gftp_dialog_data * ddata;
+#endif
 
+#if GTK_MAJOR_VERSION == 1 && GTK_MINOR_VERSION == 2
   dialog = gtk_dialog_new ();
   gtk_grab_add (dialog);
   gtk_window_set_title (GTK_WINDOW (dialog), diagtxt);
-  gtk_window_set_wmclass (GTK_WINDOW(dialog), "yndiag", "gFTP");
-  gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10);
   gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area), 
                               5);
-  gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5);
   gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->action_area), 15);
   gtk_box_set_homogeneous (GTK_BOX (GTK_DIALOG (dialog)->action_area), TRUE);
+#else
+  dialog = gtk_dialog_new_with_buttons (_(diagtxt), NULL, 0,
+                                        GTK_STOCK_YES,
+                                        GTK_RESPONSE_YES,
+                                        GTK_STOCK_NO,
+                                        GTK_RESPONSE_NO,
+                                        NULL);
+#endif
+  gtk_container_border_width (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox), 10);
+  gtk_box_set_spacing (GTK_BOX (GTK_DIALOG (dialog)->vbox), 5);
   gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_MOUSE);
+  gtk_window_set_wmclass (GTK_WINDOW(dialog), "yndiag", "gFTP");
+  gtk_widget_realize (dialog);
+
+  if (gftp_icon != NULL)
+    {
+      gdk_window_set_icon (dialog->window, NULL, gftp_icon->pixmap,
+                           gftp_icon->bitmap);
+      gdk_window_set_icon_name (dialog->window, _("gFTP Icon"));
+    }
 
   text = gtk_label_new (infotxt);
   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), text, TRUE, TRUE, 0);
   gtk_widget_show (text);
 
-  list = NULL;
-  ptr = g_malloc0 (sizeof (gftp_dialog_data));
-  list = g_list_append (list, ptr);
-  va_start (argp, num);
-  for (i = 0; i < num; i++)
-    {
-      tempstr = va_arg (argp, char *);
-      myfunc = va_arg (argp, func); 
-      ptr = va_arg (argp, void *);
-      d = g_malloc (sizeof (gftp_dialog_data));
-      list = g_list_append (list, d);
-      d->dialog = dialog;
-      d->data = ptr;
-      d->all_buttons = list;
+#if GTK_MAJOR_VERSION == 1 && GTK_MINOR_VERSION == 2
+/* FIXME - fix call backs */
+  tempwid = gtk_button_new_with_label (_("  Yes  "));
+  GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
+                      FALSE, FALSE, 0);
+  gtk_signal_connect_object_before (GTK_OBJECT (tempwid), "clicked",
+                                    GTK_SIGNAL_FUNC (gtk_widget_destroy),
+                                    GTK_OBJECT (dialog));
+  gtk_widget_grab_default (tempwid);
+  gtk_widget_show (tempwid);
 
-      tempwid = gtk_button_new_with_label (tempstr);
-      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
-			  TRUE, TRUE, 0);
-      if (myfunc)
-	gtk_signal_connect (GTK_OBJECT (tempwid), "clicked",
-			    GTK_SIGNAL_FUNC (myfunc), (gpointer) d);
-      if (erase || !myfunc)
-	gtk_signal_connect_object (GTK_OBJECT (tempwid), "clicked",
-				   GTK_SIGNAL_FUNC (gtk_widget_destroy),
-				   (gpointer) d->dialog);
-      gtk_widget_show (tempwid);
-    }
+  tempwid = gtk_button_new_with_label (_("  No  "));
+  GTK_WIDGET_SET_FLAGS (tempwid, GTK_CAN_DEFAULT);
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->action_area), tempwid,
+                      FALSE, FALSE, 0);
+  gtk_signal_connect_object_before (GTK_OBJECT (tempwid), "clicked",
+                                    GTK_SIGNAL_FUNC (gtk_widget_destroy),
+                                    GTK_OBJECT (dialog));
+  gtk_widget_show (tempwid);
+
+#else
+  ddata = g_malloc (sizeof (*ddata));
+  ddata->yesfunc = yesfunc;
+  ddata->yespointer = yespointer;
+  ddata->nofunc = nofunc;
+  ddata->nopointer = nopointer;
+
+  g_signal_connect (GTK_OBJECT (dialog), "response",
+                    G_CALLBACK (dialog_response), ddata);
+#endif
 
   gtk_widget_show (dialog);
 }
 
 
-static void
-destroy_dialog_data (gftp_dialog_data * data)
-{
-  GList * list;
-
-  list = data->all_buttons;
-  while (list != NULL)
-    {
-      if (list->data != data && list->data)
-        g_free (list->data);
-      list = list->next;
-    }
-  g_list_free (data->all_buttons);
-  g_free (data);
-}
-
-
 void
 update_directory_download_progress (gftp_transfer * transfer)
 {