]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcombo.c
Left-align menu labels. (#393255, Michail Crayson)
[~andy/gtk] / gtk / gtkcombo.c
index 51bb60283296899b62f3b63af4243664c6d82a06..10d10b2991cd12ff8a2c609820e9cbc6b07fc4e9 100644 (file)
@@ -30,6 +30,7 @@
 
 #undef GTK_DISABLE_DEPRECATED
 
+#include <config.h>
 #include <string.h>
 
 #include "gtkarrow.h"
 #include "gdk/gdkkeysyms.h"
 #include "gtkcombo.h"
 #include "gtkframe.h"
+#include "gtkprivate.h"
 #include "gtkintl.h"
+#include "gtkalias.h"
 
-const gchar *gtk_combo_string_key = "gtk-combo-string-value";
+static const gchar gtk_combo_string_key[] = "gtk-combo-string-value";
 
 #define COMBO_LIST_MAX_HEIGHT  (400)
 #define        EMPTY_LIST_HEIGHT       (15)
@@ -61,14 +64,12 @@ enum {
   PROP_VALUE_IN_LIST
 };
 
-static void         gtk_combo_class_init         (GtkComboClass    *klass);
-static void         gtk_combo_init               (GtkCombo         *combo);
 static void         gtk_combo_realize           (GtkWidget        *widget);
 static void         gtk_combo_unrealize                 (GtkWidget        *widget);
 static void         gtk_combo_destroy            (GtkObject        *combo);
 static GtkListItem *gtk_combo_find               (GtkCombo         *combo);
 static gchar *      gtk_combo_func               (GtkListItem      *li);
-static gint         gtk_combo_focus_idle         (GtkCombo         *combo);
+static gboolean     gtk_combo_focus_idle         (GtkCombo         *combo);
 static gint         gtk_combo_entry_focus_out    (GtkEntry         *entry,
                                                  GdkEventFocus    *event,
                                                  GtkCombo         *combo);
@@ -119,7 +120,8 @@ static void         gtk_combo_get_property       (GObject         *object,
                                                  guint            prop_id,
                                                  GValue          *value,
                                                  GParamSpec      *pspec);
-static GtkHBoxClass *parent_class = NULL;
+
+G_DEFINE_TYPE (GtkCombo, gtk_combo, GTK_TYPE_HBOX)
 
 static void
 gtk_combo_class_init (GtkComboClass * klass)
@@ -132,48 +134,46 @@ gtk_combo_class_init (GtkComboClass * klass)
   oclass = (GtkObjectClass *) klass;
   widget_class = (GtkWidgetClass *) klass;
 
-  parent_class = g_type_class_peek_parent (klass);
-
   gobject_class->set_property = gtk_combo_set_property; 
   gobject_class->get_property = gtk_combo_get_property; 
 
   g_object_class_install_property (gobject_class,
                                    PROP_ENABLE_ARROW_KEYS,
-                                   g_param_spec_boolean ("enable_arrow_keys",
+                                   g_param_spec_boolean ("enable-arrow-keys",
                                                          P_("Enable arrow keys"),
                                                          P_("Whether the arrow keys move through the list of items"),
                                                          TRUE,
-                                                         G_PARAM_READABLE | G_PARAM_WRITABLE));
+                                                         GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                    PROP_ENABLE_ARROWS_ALWAYS,
-                                   g_param_spec_boolean ("enable_arrows_always",
+                                   g_param_spec_boolean ("enable-arrows-always",
                                                          P_("Always enable arrows"),
                                                          P_("Obsolete property, ignored"),
                                                          TRUE,
-                                                         G_PARAM_READABLE | G_PARAM_WRITABLE));
+                                                         GTK_PARAM_READWRITE));
   g_object_class_install_property (gobject_class,
                                    PROP_CASE_SENSITIVE,
-                                   g_param_spec_boolean ("case_sensitive",
+                                   g_param_spec_boolean ("case-sensitive",
                                                          P_("Case sensitive"),
                                                          P_("Whether list item matching is case sensitive"),
                                                          FALSE,
-                                                         G_PARAM_READABLE | G_PARAM_WRITABLE));
+                                                         GTK_PARAM_READWRITE));
 
   g_object_class_install_property (gobject_class,
                                    PROP_ALLOW_EMPTY,
-                                   g_param_spec_boolean ("allow_empty",
+                                   g_param_spec_boolean ("allow-empty",
                                                          P_("Allow empty"),
                                                         P_("Whether an empty value may be entered in this field"),
                                                          TRUE,
-                                                         G_PARAM_READABLE | G_PARAM_WRITABLE));
+                                                         GTK_PARAM_READWRITE));
 
   g_object_class_install_property (gobject_class,
                                    PROP_VALUE_IN_LIST,
-                                   g_param_spec_boolean ("value_in_list",
+                                   g_param_spec_boolean ("value-in-list",
                                                          P_("Value in list"),
                                                          P_("Whether entered values must already be present in the list"),
                                                          FALSE,
-                                                         G_PARAM_READABLE | G_PARAM_WRITABLE));
+                                                         GTK_PARAM_READWRITE));
   
    
   oclass->destroy = gtk_combo_destroy;
@@ -195,7 +195,7 @@ gtk_combo_destroy (GtkObject *object)
       combo->popwin = NULL;
     }
 
-  GTK_OBJECT_CLASS (parent_class)->destroy (object);
+  GTK_OBJECT_CLASS (gtk_combo_parent_class)->destroy (object);
 }
 
 static int
@@ -363,7 +363,7 @@ gtk_combo_func (GtkListItem * li)
   GtkWidget *label;
   gchar *ltext = NULL;
 
-  ltext = g_object_get_data (G_OBJECT (li), gtk_combo_string_key);
+  ltext = g_object_get_data (G_OBJECT (li), I_(gtk_combo_string_key));
   if (!ltext)
     {
       label = GTK_BIN (li)->child;
@@ -411,6 +411,7 @@ gtk_combo_entry_focus_out (GtkEntry * entry, GdkEventFocus * event, GtkCombo * c
                            g_cclosure_new_object (G_CALLBACK (gtk_combo_focus_idle),
                                                   G_OBJECT (combo)));
       g_source_attach (focus_idle, NULL);
+       g_source_unref (focus_idle);
       
       /*g_signal_stop_emission_by_name (entry, "focus_out_event"); */
       return TRUE;
@@ -513,8 +514,9 @@ gtk_combo_get_pos (GtkCombo * combo, gint * x, gint * y, gint * height, gint * w
 }
 
 static void
-gtk_combo_popup_list (GtkCombo * combo)
+gtk_combo_popup_list (GtkCombo *combo)
 {
+  GtkWidget *toplevel;
   GtkList *list;
   gint height, width, x, y;
   gint old_width, old_height;
@@ -553,6 +555,16 @@ gtk_combo_popup_list (GtkCombo * combo)
     }
   
   gtk_window_move (GTK_WINDOW (combo->popwin), x, y);
+
+  toplevel = gtk_widget_get_toplevel (GTK_WIDGET (combo));
+
+  if (GTK_IS_WINDOW (toplevel))
+    {
+      gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)), 
+                                   GTK_WINDOW (combo->popwin));
+      gtk_window_set_transient_for (GTK_WINDOW (combo->popwin), GTK_WINDOW (toplevel));
+    }
+
   gtk_widget_set_size_request (combo->popwin, width, height);
   gtk_widget_show (combo->popwin);
 
@@ -580,6 +592,8 @@ gtk_combo_popdown_list (GtkCombo *combo)
     }
   
   gtk_widget_hide (combo->popwin);
+
+  gtk_window_group_add_window (gtk_window_get_group (NULL), GTK_WINDOW (combo->popwin));
 }
 
 static gboolean
@@ -926,6 +940,7 @@ gtk_combo_init (GtkCombo * combo)
                    G_CALLBACK (gtk_combo_popup_button_leave), combo);
 
   combo->popwin = gtk_window_new (GTK_WINDOW_POPUP);
+  gtk_window_set_type_hint (GTK_WINDOW (combo->popwin), GDK_WINDOW_TYPE_HINT_COMBO);
   g_object_ref (combo->popwin);
   gtk_window_set_resizable (GTK_WINDOW (combo->popwin), FALSE);
 
@@ -968,7 +983,7 @@ gtk_combo_init (GtkCombo * combo)
                                       gtk_scrolled_window_get_hadjustment (GTK_SCROLLED_WINDOW (combo->popup)));
   gtk_widget_show (combo->list);
 
-  combo->list_change_id = g_signal_connect (combo->list, "selection_changed",
+  combo->list_change_id = g_signal_connect (combo->list, "selection-changed",
                                            G_CALLBACK (gtk_combo_selection_changed), combo);
   
   g_signal_connect (combo->popwin, "key_press_event",
@@ -993,7 +1008,7 @@ gtk_combo_realize (GtkWidget *widget)
   gtk_window_set_screen (GTK_WINDOW (combo->popwin), 
                         gtk_widget_get_screen (widget));
   
-  GTK_WIDGET_CLASS( parent_class )->realize (widget);  
+  GTK_WIDGET_CLASS (gtk_combo_parent_class)->realize (widget);  
 }
 
 static void        
@@ -1004,34 +1019,7 @@ gtk_combo_unrealize (GtkWidget *widget)
   gtk_combo_popdown_list (combo);
   gtk_widget_unrealize (combo->popwin);
   
-  GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
-}
-
-GType
-gtk_combo_get_type (void)
-{
-  static GType combo_type = 0;
-
-  if (!combo_type)
-    {
-      static const GTypeInfo combo_info =
-      {
-       sizeof (GtkComboClass),
-       NULL,           /* base_init */
-       NULL,           /* base_finalize */
-       (GClassInitFunc) gtk_combo_class_init,
-       NULL,           /* class_finalize */
-       NULL,           /* class_data */
-       sizeof (GtkCombo),
-       0,              /* n_preallocs */
-       (GInstanceInitFunc) gtk_combo_init,
-      };
-
-      combo_type = g_type_register_static (GTK_TYPE_HBOX, "GtkCombo",
-                                          &combo_info, 0);
-    }
-
-  return combo_type;
+  GTK_WIDGET_CLASS (gtk_combo_parent_class)->unrealize (widget);
 }
 
 GtkWidget*
@@ -1051,12 +1039,12 @@ gtk_combo_set_value_in_list (GtkCombo * combo, gboolean val, gboolean ok_if_empt
   if (combo->value_in_list != val)
     {
        combo->value_in_list = val;
-  g_object_notify (G_OBJECT (combo), "value_in_list");
+  g_object_notify (G_OBJECT (combo), "value-in-list");
     }
   if (combo->ok_if_empty != ok_if_empty)
     {
        combo->ok_if_empty = ok_if_empty;
-  g_object_notify (G_OBJECT (combo), "allow_empty");
+  g_object_notify (G_OBJECT (combo), "allow-empty");
     }
   g_object_thaw_notify (G_OBJECT (combo));
 }
@@ -1070,7 +1058,7 @@ gtk_combo_set_case_sensitive (GtkCombo * combo, gboolean val)
   if (combo->case_sensitive != val) 
     {
   combo->case_sensitive = val;
-  g_object_notify (G_OBJECT (combo), "case_sensitive");
+  g_object_notify (G_OBJECT (combo), "case-sensitive");
     }
 }
 
@@ -1083,7 +1071,7 @@ gtk_combo_set_use_arrows (GtkCombo * combo, gboolean val)
   if (combo->use_arrows != val) 
     {
   combo->use_arrows = val;
-  g_object_notify (G_OBJECT (combo), "enable_arrow_keys");
+  g_object_notify (G_OBJECT (combo), "enable-arrow-keys");
     }
 }
 
@@ -1097,12 +1085,12 @@ gtk_combo_set_use_arrows_always (GtkCombo * combo, gboolean val)
     {
        g_object_freeze_notify (G_OBJECT (combo));
   combo->use_arrows_always = val;
-       g_object_notify (G_OBJECT (combo), "enable_arrows_always");
+       g_object_notify (G_OBJECT (combo), "enable-arrows-always");
 
        if (combo->use_arrows != TRUE) 
          {
   combo->use_arrows = TRUE;
-  g_object_notify (G_OBJECT (combo), "enable_arrow_keys");
+  g_object_notify (G_OBJECT (combo), "enable-arrow-keys");
          }
   g_object_thaw_notify (G_OBJECT (combo));
     }
@@ -1136,7 +1124,7 @@ gtk_combo_set_item_string (GtkCombo * combo, GtkItem * item, const gchar * item_
   g_return_if_fail (GTK_IS_COMBO (combo));
   g_return_if_fail (item != NULL);
 
-  g_object_set_data_full (G_OBJECT (item), gtk_combo_string_key,
+  g_object_set_data_full (G_OBJECT (item), I_(gtk_combo_string_key),
                          g_strdup (item_value), g_free);
 }
 
@@ -1149,7 +1137,7 @@ gtk_combo_size_allocate (GtkWidget     *widget,
   g_return_if_fail (GTK_IS_COMBO (widget));
   g_return_if_fail (allocation != NULL);
 
-  GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation);
+  GTK_WIDGET_CLASS (gtk_combo_parent_class)->size_allocate (widget, allocation);
   
   combo = GTK_COMBO (widget);
 
@@ -1240,3 +1228,6 @@ gtk_combo_get_property (GObject         *object,
     }
    
 }
+
+#define __GTK_SMART_COMBO_C__
+#include "gtkaliasdef.c"