]> Pileus Git - ~andy/gtk/blobdiff - gtk/testgtk.c
Adapt cast macros to standard.
[~andy/gtk] / gtk / testgtk.c
index 980ac75c76c72f13b44527c7c54c53490596adbe..c8bc008999aabd08af42351d09ce2ffe31230c5e 100644 (file)
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+
+/*
+ * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
 #undef G_LOG_DOMAIN
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
 #include <math.h>
 #include <time.h>
+#include <unistd.h>
 #include "gtk.h"
-#include "../gdk/gdk.h"
-#include "../gdk/gdkx.h"
-#include "../gdk/gdkkeysyms.h"
+#include "gdk/gdk.h"
+#include "gdk/gdkkeysyms.h"
+#include "gdkx.h"
 
 #include "circles.xbm"
 
@@ -615,6 +625,13 @@ set_toolbar_both (GtkWidget *widget,
   gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH);
 }
 
+static void
+set_toolbar_both_horiz (GtkWidget *widget,
+                       gpointer   data)
+{
+  gtk_toolbar_set_style (GTK_TOOLBAR (data), GTK_TOOLBAR_BOTH_HORIZ);
+}
+
 static void
 set_toolbar_small_space (GtkWidget *widget,
                         gpointer   data)
@@ -717,7 +734,13 @@ create_toolbar (void)
                               "Both", "Show toolbar icons and text", "Toolbar/Both",
                               new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
                               (GtkSignalFunc) set_toolbar_both, toolbar);
-
+      gtk_toolbar_append_item (GTK_TOOLBAR (toolbar),
+                              "Both (horizontal)",
+                              "Show toolbar icons and text in a horizontal fashion",
+                              "Toolbar/BothHoriz",
+                              new_pixmap ("test.xpm", window->window, &window->style->bg[GTK_STATE_NORMAL]),
+                              (GtkSignalFunc) set_toolbar_both_horiz, toolbar);
+                              
       gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
 
       entry = gtk_entry_new ();
@@ -1538,7 +1561,7 @@ create_handle_box (void)
     gtk_window_set_policy (GTK_WINDOW (window),
                           TRUE,
                           TRUE,
-                          FALSE);
+                          TRUE);
     
     gtk_signal_connect (GTK_OBJECT (window), "destroy",
                        GTK_SIGNAL_FUNC(gtk_widget_destroyed),
@@ -2371,12 +2394,12 @@ static GtkItemFactoryEntry menu_items[] =
   { "/_Preferences",                   NULL, 0,               0, "<Branch>" },
   { "/_Preferences/_Color",            NULL, 0,               0, "<Branch>" },
   { "/_Preferences/Color/_Red",        NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
-  { "/_Preferences/Color/_Green",      NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
-  { "/_Preferences/Color/_Blue",        NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
+  { "/_Preferences/Color/_Green",      NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
+  { "/_Preferences/Color/_Blue",        NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
   { "/_Preferences/_Shape",            NULL, 0,               0, "<Branch>" },
   { "/_Preferences/Shape/_Square",      NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
-  { "/_Preferences/Shape/_Rectangle",   NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
-  { "/_Preferences/Shape/_Oval",        NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
+  { "/_Preferences/Shape/_Rectangle",   NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
+  { "/_Preferences/Shape/_Oval",        NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
 
   { "/_Help",            NULL,         0,                     0, "<LastBranch>" },
   { "/Help/_About",      NULL,         gtk_ifactory_cb,       0 },
@@ -2410,11 +2433,21 @@ create_item_factory (void)
       
       accel_group = gtk_accel_group_new ();
       item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
-      gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
+      gtk_object_set_data_full (GTK_OBJECT (window),
+                               "<main>",
+                               item_factory,
+                               (GtkDestroyNotify) gtk_object_unref);
       gtk_accel_group_attach (accel_group, GTK_OBJECT (window));
       gtk_window_set_title (GTK_WINDOW (window), "Item Factory");
       gtk_container_set_border_width (GTK_CONTAINER (window), 0);
-      
+      gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
+
+      /* preselect /Preferences/Shape/Oval over the other radios
+       */
+      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
+                                                                                     "/Preferences/Shape/Oval")),
+                                     TRUE);
+
       box1 = gtk_vbox_new (FALSE, 0);
       gtk_container_add (GTK_CONTAINER (window), box1);
       
@@ -2865,6 +2898,104 @@ get_value (GtkWidget *widget, gpointer data)
   gtk_label_set_text (label, buf);
 }
 
+static gint
+spin_button_time_output_func (GtkSpinButton *spin_button)
+{
+  static gchar buf[6];
+  gfloat hours;
+  gfloat minutes;
+
+  hours = spin_button->adjustment->value / 60.0;
+  minutes = (fabs(floor (hours) - hours) < 1e-5) ? 0.0 : 30;
+  sprintf (buf, "%02.0f:%02.0f", floor (hours), minutes);
+  if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
+    gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
+  return TRUE;
+}
+
+static gint
+spin_button_month_input_func (GtkSpinButton *spin_button,
+                             gfloat        *new_val)
+{
+  gint i;
+  static gchar *month[12] = { "January", "February", "March", "April",
+                             "May", "June", "July", "August",
+                             "September", "October", "November", "December" };
+  gchar *tmp1, *tmp2;
+  gboolean found = FALSE;
+
+  for (i = 1; i <= 12; i++)
+    {
+      tmp1 = g_strdup (month[i-1]);
+      g_strup (tmp1);
+      tmp2 = g_strdup (gtk_entry_get_text (GTK_ENTRY (spin_button)));
+      g_strup (tmp2);
+      if (strstr (tmp1, tmp2) == tmp1)
+       found = TRUE;
+      g_free (tmp1);
+      g_free (tmp2);
+      if (found)
+       break;
+    }
+  if (!found)
+    {
+      *new_val = 0.0;
+      return INPUT_ERROR;
+    }
+  *new_val = (gfloat) i;
+  return TRUE;
+}
+
+static gint
+spin_button_month_output_func (GtkSpinButton *spin_button)
+{
+  gint i;
+  static gchar *month[12] = { "January", "February", "March", "April",
+                             "May", "June", "July", "August", "September",
+                             "October", "November", "December" };
+
+  for (i = 1; i <= 12; i++)
+    if (fabs (spin_button->adjustment->value - (double)i) < 1e-5)
+      {
+       if (strcmp (month[i-1], gtk_entry_get_text (GTK_ENTRY (spin_button))))
+         gtk_entry_set_text (GTK_ENTRY (spin_button), month[i-1]);
+      }
+  return TRUE;
+}
+
+static gint
+spin_button_hex_input_func (GtkSpinButton *spin_button,
+                           gfloat        *new_val)
+{
+  gchar *buf;
+  gchar *err;
+  gfloat res;
+
+  buf = gtk_entry_get_text (GTK_ENTRY (spin_button));
+  res = (gfloat)(strtol(buf, &err, 16));
+  *new_val = res;
+  if (*err)
+    return INPUT_ERROR;
+  else
+    return TRUE;
+}
+
+static gint
+spin_button_hex_output_func (GtkSpinButton *spin_button)
+{
+  static gchar buf[7];
+  gint val;
+
+  val = (gint) spin_button->adjustment->value;
+  if (fabs (val) < 1e-5)
+    sprintf (buf, "0x00");
+  else
+    sprintf (buf, "0x%.2X", val);
+  if (strcmp (buf, gtk_entry_get_text (GTK_ENTRY (spin_button))))
+    gtk_entry_set_text (GTK_ENTRY (spin_button), buf);
+  return TRUE;
+}
+
 static void
 create_spins (void)
 {
@@ -2902,7 +3033,7 @@ create_spins (void)
       gtk_container_set_border_width (GTK_CONTAINER (vbox), 5);
       gtk_container_add (GTK_CONTAINER (frame), vbox);
       
-      /* Day, month, year spinners */
+      /* Time, month, hex spinners */
       
       hbox = gtk_hbox_new (FALSE, 0);
       gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 5);
@@ -2910,16 +3041,19 @@ create_spins (void)
       vbox2 = gtk_vbox_new (FALSE, 0);
       gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
       
-      label = gtk_label_new ("Day :");
+      label = gtk_label_new ("Time :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
       gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
       
-      adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 31.0, 1.0,
-                                                 5.0, 0.0);
+      adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 1410, 30, 60, 0);
       spinner = gtk_spin_button_new (adj, 0, 0);
+      gtk_editable_set_editable (GTK_EDITABLE (spinner), FALSE);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "output",
+                         GTK_SIGNAL_FUNC (spin_button_time_output_func),
+                         NULL);
       gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
-      gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
-                                      GTK_SHADOW_OUT);
+      gtk_widget_set_usize (spinner, 55, -1);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
 
       vbox2 = gtk_vbox_new (FALSE, 0);
@@ -2932,24 +3066,39 @@ create_spins (void)
       adj = (GtkAdjustment *) gtk_adjustment_new (1.0, 1.0, 12.0, 1.0,
                                                  5.0, 0.0);
       spinner = gtk_spin_button_new (adj, 0, 0);
+      gtk_spin_button_set_update_policy (GTK_SPIN_BUTTON (spinner),
+                                        GTK_UPDATE_IF_VALID);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "input",
+                         GTK_SIGNAL_FUNC (spin_button_month_input_func),
+                         NULL);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "output",
+                         GTK_SIGNAL_FUNC (spin_button_month_output_func),
+                         NULL);
       gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
-      gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
-                                      GTK_SHADOW_ETCHED_IN);
+      gtk_widget_set_usize (spinner, 85, -1);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
       
       vbox2 = gtk_vbox_new (FALSE, 0);
       gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 5);
 
-      label = gtk_label_new ("Year :");
+      label = gtk_label_new ("Hex :");
       gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
       gtk_box_pack_start (GTK_BOX (vbox2), label, FALSE, TRUE, 0);
 
-      adj = (GtkAdjustment *) gtk_adjustment_new (1998.0, 0.0, 2100.0, 
-                                                 1.0, 100.0, 0.0);
+      adj = (GtkAdjustment *) gtk_adjustment_new (0, 0, 255, 1, 16, 0);
       spinner = gtk_spin_button_new (adj, 0, 0);
+      gtk_editable_set_editable (GTK_EDITABLE (spinner), TRUE);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "input",
+                         GTK_SIGNAL_FUNC (spin_button_hex_input_func),
+                         NULL);
+      gtk_signal_connect (GTK_OBJECT (spinner),
+                         "output",
+                         GTK_SIGNAL_FUNC (spin_button_hex_output_func),
+                         NULL);
       gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
-      gtk_spin_button_set_shadow_type (GTK_SPIN_BUTTON (spinner),
-                                      GTK_SHADOW_IN);
       gtk_widget_set_usize (spinner, 55, 0);
       gtk_box_pack_start (GTK_BOX (vbox2), spinner, FALSE, TRUE, 0);
 
@@ -2986,7 +3135,6 @@ create_spins (void)
 
       adj = (GtkAdjustment *) gtk_adjustment_new (2, 1, 5, 1, 1, 0);
       spinner2 = gtk_spin_button_new (adj, 0.0, 0);
-      gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner2), TRUE);
       gtk_signal_connect (GTK_OBJECT (adj), "value_changed",
                          GTK_SIGNAL_FUNC (change_digits),
                          (gpointer) spinner2);
@@ -3047,6 +3195,7 @@ create_spins (void)
     gtk_widget_destroy (window);
 }
 
+
 /*
  * Cursors
  */
@@ -4633,7 +4782,7 @@ void create_ctree (void)
   GtkWidget *check;
   GtkAdjustment *adj;
   GtkWidget *spinner;
-  GdkColor transparent;
+  GdkColor transparent = { 0 };
 
   char *title[] = { "Tree" , "Info" };
   char buf[80];
@@ -5118,7 +5267,10 @@ void
 font_selection_ok (GtkWidget              *w,
                   GtkFontSelectionDialog *fs)
 {
-  g_print ("%s\n", gtk_font_selection_dialog_get_font_name (fs));
+  gchar *s = gtk_font_selection_dialog_get_font_name (fs);
+
+  g_print ("%s\n", s);
+  g_free (s);
   gtk_widget_destroy (GTK_WIDGET (fs));
 }
 
@@ -5528,9 +5680,7 @@ create_text (void)
   GtkWidget *button;
   GtkWidget *check;
   GtkWidget *separator;
-  GtkWidget *table;
-  GtkWidget *hscrollbar;
-  GtkWidget *vscrollbar;
+  GtkWidget *scrolled_window;
   GtkWidget *text;
   GdkFont *font;
 
@@ -5562,29 +5712,19 @@ create_text (void)
       gtk_widget_show (box2);
 
 
-      table = gtk_table_new (2, 2, FALSE);
-      gtk_table_set_row_spacing (GTK_TABLE (table), 0, 2);
-      gtk_table_set_col_spacing (GTK_TABLE (table), 0, 2);
-      gtk_box_pack_start (GTK_BOX (box2), table, TRUE, TRUE, 0);
-      gtk_widget_show (table);
+      scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+      gtk_box_pack_start (GTK_BOX (box2), scrolled_window, TRUE, TRUE, 0);
+      gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
+                                     GTK_POLICY_NEVER,
+                                     GTK_POLICY_ALWAYS);
+      gtk_widget_show (scrolled_window);
 
       text = gtk_text_new (NULL, NULL);
       gtk_text_set_editable (GTK_TEXT (text), TRUE);
-      gtk_table_attach (GTK_TABLE (table), text, 0, 1, 0, 1,
-                       GTK_EXPAND | GTK_SHRINK | GTK_FILL,
-                       GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
+      gtk_container_add (GTK_CONTAINER (scrolled_window), text);
       gtk_widget_grab_focus (text);
       gtk_widget_show (text);
 
-      hscrollbar = gtk_hscrollbar_new (GTK_TEXT (text)->hadj);
-      gtk_table_attach (GTK_TABLE (table), hscrollbar, 0, 1, 1, 2,
-                       GTK_EXPAND | GTK_FILL | GTK_SHRINK, GTK_FILL, 0, 0);
-      gtk_widget_show (hscrollbar);
-
-      vscrollbar = gtk_vscrollbar_new (GTK_TEXT (text)->vadj);
-      gtk_table_attach (GTK_TABLE (table), vscrollbar, 1, 2, 0, 1,
-                       GTK_FILL, GTK_EXPAND | GTK_SHRINK | GTK_FILL, 0, 0);
-      gtk_widget_show (vscrollbar);
 
       gtk_text_freeze (GTK_TEXT (text));
 
@@ -6446,8 +6586,6 @@ create_dnd (void)
  * Shaped Windows
  */
 
-static GdkWindow *root_win = NULL;
-
 typedef struct _cursoroffset {gint x,y;} CursorOffset;
 
 static void
@@ -6492,7 +6630,7 @@ shape_motion (GtkWidget      *widget,
    * Can't use event->x / event->y here 
    * because I need absolute coordinates.
    */
-  gdk_window_get_pointer (root_win, &xp, &yp, &mask);
+  gdk_window_get_pointer (NULL, &xp, &yp, &mask);
   gtk_widget_set_uposition (widget, xp  - p->x, yp  - p->y);
 }
 
@@ -6568,8 +6706,6 @@ create_shapes (void)
   static GtkWidget *sheets = NULL;
   static GtkWidget *rings = NULL;
 
-  root_win = gdk_window_foreign_new (GDK_ROOT_WINDOW ());
-
   if (!modeller)
     {
       modeller = shape_create_icon ("Modeller.xpm",
@@ -7757,7 +7893,7 @@ create_timeout_test (void)
  * Idle Test
  */
 
-static int idle = 0;
+static int idle_id = 0;
 
 static gint
 idle_test (GtkWidget *label)
@@ -7775,9 +7911,9 @@ static void
 start_idle_test (GtkWidget *widget,
                 GtkWidget *label)
 {
-  if (!idle)
+  if (!idle_id)
     {
-      idle = gtk_idle_add ((GtkFunction) idle_test, label);
+      idle_id = gtk_idle_add ((GtkFunction) idle_test, label);
     }
 }
 
@@ -7785,10 +7921,10 @@ static void
 stop_idle_test (GtkWidget *widget,
                gpointer   data)
 {
-  if (idle)
+  if (idle_id)
     {
-      gtk_idle_remove (idle);
-      idle = 0;
+      gtk_idle_remove (idle_id);
+      idle_id = 0;
     }
 }
 
@@ -8340,11 +8476,22 @@ int
 main (int argc, char *argv[])
 {
   GtkBindingSet *binding_set;
+  struct stat statbuf;
 
   srand (time (NULL));
 
   gtk_set_locale ();
 
+  /* Check to see if we are being run from the correct
+   * directory.
+   */
+  if (stat("./testgtkrc", &statbuf) < 0)
+    {
+      fprintf (stderr, "*** The testgtk program must be run from within the\n"
+                      "*** gtk/ subdirectory of the GTK+ distribution.\n");
+      exit (1);
+    }
+
   gtk_rc_add_default_file ("testgtkrc");
 
   gtk_init (&argc, &argv);