summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'gtk')
-rw-r--r--gtk/Makefile.am5
-rw-r--r--gtk/gtkclist.c28
-rw-r--r--gtk/gtkcombo.c112
-rw-r--r--gtk/gtkctree.c36
-rw-r--r--gtk/gtkentry.c2
-rw-r--r--gtk/gtkfilesel.c12
-rw-r--r--gtk/gtkframe.c8
-rw-r--r--gtk/gtkframe.h9
-rw-r--r--gtk/gtkhandlebox.c41
-rw-r--r--gtk/gtkitemfactory.c24
-rw-r--r--gtk/gtklabel.c4
-rw-r--r--gtk/gtklabel.h9
-rw-r--r--gtk/gtklist.c8
-rw-r--r--gtk/gtkmenu.c26
-rw-r--r--gtk/gtkmenushell.c6
-rw-r--r--gtk/gtknotebook.c4
-rw-r--r--gtk/gtkoptionmenu.c85
-rw-r--r--gtk/gtkrange.c14
-rw-r--r--gtk/gtkrc.c24
-rw-r--r--gtk/gtkstyle.c16
-rw-r--r--gtk/gtktext.c46
-rw-r--r--gtk/gtkwindow.c25
-rw-r--r--gtk/testgtk.c10
23 files changed, 364 insertions, 190 deletions
diff --git a/gtk/Makefile.am b/gtk/Makefile.am
index 0869168b66..230f78445d 100644
--- a/gtk/Makefile.am
+++ b/gtk/Makefile.am
@@ -5,7 +5,7 @@ SUBDIRS=stock-icons
INCLUDES = @STRIP_BEGIN@ \
-DG_LOG_DOMAIN=\"Gtk\" \
-DGTK_DISABLE_COMPAT_H \
- -DGTK_EXE_PREFIX=\"$(exec_prefix)\" \
+ -DGTK_LIBDIR=\"$(libdir)\" \
-DGTK_DATA_PREFIX=\"$(prefix)\" \
-DGTK_SYSCONFDIR=\"$(sysconfdir)\" \
-DGTK_LOCALEDIR=\"$(gtklocaledir)\" \
@@ -70,7 +70,6 @@ gtk_public_h_sources = @STRIP_BEGIN@ \
gtkcolorsel.h \
gtkcolorseldialog.h \
gtkcombo.h \
- gtkcompat.h \
gtkcontainer.h \
gtkctree.h \
gtkcurve.h \
@@ -423,7 +422,7 @@ gtk_extra_sources = @STRIP_BEGIN@ \
#
# setup GTK+ sources and their dependancies
#
-gtk_target_headers = $(gtk_public_h_sources) $(gtk_built_public_sources)
+gtk_target_headers = $(gtk_public_h_sources) $(gtk_built_public_sources) gtkcompat.h
gtk_target_sources = $(gtk_c_sources)
MAINTAINERCLEANFILES += $(gtk_built_sources)
EXTRA_HEADERS +=
diff --git a/gtk/gtkclist.c b/gtk/gtkclist.c
index 0ab00b0abf..69cb38470c 100644
--- a/gtk/gtkclist.c
+++ b/gtk/gtkclist.c
@@ -2421,7 +2421,10 @@ set_cell_contents (GtkCList *clist,
GdkBitmap *mask)
{
GtkRequisition requisition;
-
+ gchar *old_text = NULL;
+ GdkPixmap *old_pixmap = NULL;
+ GdkBitmap *old_mask = NULL;
+
g_return_if_fail (clist != NULL);
g_return_if_fail (GTK_IS_CLIST (clist));
g_return_if_fail (clist_row != NULL);
@@ -2436,18 +2439,16 @@ set_cell_contents (GtkCList *clist,
case GTK_CELL_EMPTY:
break;
case GTK_CELL_TEXT:
- g_free (GTK_CELL_TEXT (clist_row->cell[column])->text);
+ old_text = GTK_CELL_TEXT (clist_row->cell[column])->text;
break;
case GTK_CELL_PIXMAP:
- gdk_pixmap_unref (GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap);
- if (GTK_CELL_PIXMAP (clist_row->cell[column])->mask)
- gdk_bitmap_unref (GTK_CELL_PIXMAP (clist_row->cell[column])->mask);
+ old_pixmap = GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap;
+ old_mask = GTK_CELL_PIXMAP (clist_row->cell[column])->mask;
break;
case GTK_CELL_PIXTEXT:
- g_free (GTK_CELL_PIXTEXT (clist_row->cell[column])->text);
- gdk_pixmap_unref (GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap);
- if (GTK_CELL_PIXTEXT (clist_row->cell[column])->mask)
- gdk_bitmap_unref (GTK_CELL_PIXTEXT (clist_row->cell[column])->mask);
+ old_text = GTK_CELL_PIXTEXT (clist_row->cell[column])->text;
+ old_pixmap = GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap;
+ old_mask = GTK_CELL_PIXTEXT (clist_row->cell[column])->mask;
break;
case GTK_CELL_WIDGET:
/* unimplimented */
@@ -2458,6 +2459,8 @@ set_cell_contents (GtkCList *clist,
clist_row->cell[column].type = GTK_CELL_EMPTY;
+ /* Note that pixmap and mask were already ref'ed by the caller
+ */
switch (type)
{
case GTK_CELL_TEXT:
@@ -2493,6 +2496,13 @@ set_cell_contents (GtkCList *clist,
if (clist->column[column].auto_resize &&
!GTK_CLIST_AUTO_RESIZE_BLOCKED(clist))
column_auto_resize (clist, clist_row, column, requisition.width);
+
+ if (old_text)
+ g_free (old_text);
+ if (old_pixmap)
+ gdk_pixmap_unref (old_pixmap);
+ if (old_mask)
+ gdk_pixmap_unref (old_mask);
}
PangoLayout *
diff --git a/gtk/gtkcombo.c b/gtk/gtkcombo.c
index dea6d8956c..3d063ee439 100644
--- a/gtk/gtkcombo.c
+++ b/gtk/gtkcombo.c
@@ -46,51 +46,54 @@ const gchar *gtk_combo_string_key = "gtk-combo-string-value";
#define COMBO_LIST_MAX_HEIGHT (400)
#define EMPTY_LIST_HEIGHT (15)
-static void gtk_combo_class_init (GtkComboClass *klass);
-static void gtk_combo_init (GtkCombo *combo);
-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 gint gtk_combo_entry_focus_out (GtkEntry *entry,
- GdkEventFocus *event,
- GtkCombo *combo);
-static void gtk_combo_get_pos (GtkCombo *combo,
- gint *x,
- gint *y,
- gint *height,
- gint *width);
-static void gtk_combo_popup_list (GtkCombo *combo);
-static void gtk_combo_activate (GtkWidget *widget,
- GtkCombo *combo);
+static void gtk_combo_class_init (GtkComboClass *klass);
+static void gtk_combo_init (GtkCombo *combo);
+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 gint gtk_combo_entry_focus_out (GtkEntry *entry,
+ GdkEventFocus *event,
+ GtkCombo *combo);
+static void gtk_combo_get_pos (GtkCombo *combo,
+ gint *x,
+ gint *y,
+ gint *height,
+ gint *width);
+static void gtk_combo_popup_list (GtkCombo *combo);
+static void gtk_combo_activate (GtkWidget *widget,
+ GtkCombo *combo);
static void gtk_combo_popup_button_press (GtkWidget *button,
GdkEventButton *event,
GtkCombo *combo);
static void gtk_combo_popup_button_leave (GtkWidget *button,
GdkEventCrossing *event,
GtkCombo *combo);
-static void gtk_combo_update_entry (GtkList *list,
- GtkCombo *combo);
-static void gtk_combo_update_list (GtkEntry *entry,
- GtkCombo *combo);
-static gint gtk_combo_button_press (GtkWidget *widget,
- GdkEvent *event,
- GtkCombo *combo);
-static gint gtk_combo_button_release (GtkWidget *widget,
- GdkEvent *event,
- GtkCombo *combo);
-static gint gtk_combo_list_enter (GtkWidget *widget,
- GdkEventCrossing *event,
- GtkCombo *combo);
-static gint gtk_combo_list_key_press (GtkWidget *widget,
- GdkEventKey *event,
- GtkCombo *combo);
-static gint gtk_combo_entry_key_press (GtkEntry *widget,
- GdkEventKey *event,
- GtkCombo *combo);
-static void gtk_combo_item_destroy (GtkObject *object);
-static void gtk_combo_size_allocate (GtkWidget *widget,
- GtkAllocation *allocation);
+static void gtk_combo_update_entry (GtkList *list,
+ GtkCombo *combo);
+static void gtk_combo_update_list (GtkEntry *entry,
+ GtkCombo *combo);
+static gint gtk_combo_button_press (GtkWidget *widget,
+ GdkEvent *event,
+ GtkCombo *combo);
+static gint gtk_combo_button_release (GtkWidget *widget,
+ GdkEvent *event,
+ GtkCombo *combo);
+static gint gtk_combo_list_enter (GtkWidget *widget,
+ GdkEventCrossing *event,
+ GtkCombo *combo);
+static gint gtk_combo_list_key_press (GtkWidget *widget,
+ GdkEventKey *event,
+ GtkCombo *combo);
+static gint gtk_combo_entry_key_press (GtkEntry *widget,
+ GdkEventKey *event,
+ GtkCombo *combo);
+static gint gtk_combo_window_key_press (GtkWidget *window,
+ GdkEventKey *event,
+ GtkCombo *combo);
+static void gtk_combo_item_destroy (GtkObject *object);
+static void gtk_combo_size_allocate (GtkWidget *widget,
+ GtkAllocation *allocation);
static GtkHBoxClass *parent_class = NULL;
@@ -208,6 +211,34 @@ gtk_combo_entry_key_press (GtkEntry * entry, GdkEventKey * event, GtkCombo * com
return FALSE;
}
+static int
+gtk_combo_window_key_press (GtkWidget *window,
+ GdkEventKey *event,
+ GtkCombo *combo)
+{
+ GList *li;
+
+ if (event->keyval == GDK_Return || event->keyval == GDK_KP_Enter)
+ {
+ if (GTK_WIDGET_VISIBLE (combo->popwin))
+ {
+ gtk_widget_hide (combo->popwin);
+
+ if (GTK_WIDGET_HAS_GRAB (combo->popwin))
+ {
+ gtk_grab_remove (combo->popwin);
+ gdk_pointer_ungrab (event->time);
+ }
+ }
+
+ gtk_signal_emit_stop_by_name (GTK_OBJECT (window), "key_press_event");
+
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static GtkListItem *
gtk_combo_find (GtkCombo * combo)
{
@@ -686,6 +717,9 @@ gtk_combo_init (GtkCombo * combo)
combo->popwin = gtk_window_new (GTK_WINDOW_POPUP);
gtk_widget_ref (combo->popwin);
gtk_window_set_policy (GTK_WINDOW (combo->popwin), 1, 1, 0);
+
+ gtk_signal_connect (GTK_OBJECT (combo->popwin), "key_press_event",
+ GTK_SIGNAL_FUNC (gtk_combo_window_key_press), combo);
gtk_widget_set_events (combo->popwin, GDK_KEY_PRESS_MASK);
diff --git a/gtk/gtkctree.c b/gtk/gtkctree.c
index 3ead47c46c..acc7e128b2 100644
--- a/gtk/gtkctree.c
+++ b/gtk/gtkctree.c
@@ -2418,8 +2418,7 @@ real_tree_move (GtkCTree *ctree,
gtk_clist_freeze (clist);
work = NULL;
- if (gtk_ctree_is_viewable (ctree, node) ||
- gtk_ctree_is_viewable (ctree, new_sibling))
+ if (gtk_ctree_is_viewable (ctree, node))
work = GTK_CTREE_NODE (g_list_nth (clist->row_list, clist->focus_row));
gtk_ctree_unlink (ctree, node, FALSE);
@@ -2904,6 +2903,9 @@ set_cell_contents (GtkCList *clist,
gboolean visible = FALSE;
GtkCTree *ctree;
GtkRequisition requisition;
+ gchar *old_text = NULL;
+ GdkPixmap *old_pixmap = NULL;
+ GdkBitmap *old_mask = NULL;
g_return_if_fail (clist != NULL);
g_return_if_fail (GTK_IS_CTREE (clist));
@@ -2930,26 +2932,17 @@ set_cell_contents (GtkCList *clist,
{
case GTK_CELL_EMPTY:
break;
-
case GTK_CELL_TEXT:
- g_free (GTK_CELL_TEXT (clist_row->cell[column])->text);
+ old_text = GTK_CELL_TEXT (clist_row->cell[column])->text;
break;
case GTK_CELL_PIXMAP:
- gdk_pixmap_unref (GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap);
- if (GTK_CELL_PIXMAP (clist_row->cell[column])->mask)
- gdk_bitmap_unref (GTK_CELL_PIXMAP (clist_row->cell[column])->mask);
+ old_pixmap = GTK_CELL_PIXMAP (clist_row->cell[column])->pixmap;
+ old_mask = GTK_CELL_PIXMAP (clist_row->cell[column])->mask;
break;
case GTK_CELL_PIXTEXT:
- if (GTK_CELL_PIXTEXT (clist_row->cell[column])->text)
- g_free (GTK_CELL_PIXTEXT (clist_row->cell[column])->text);
- if (GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap)
- {
- gdk_pixmap_unref
- (GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap);
- if (GTK_CELL_PIXTEXT (clist_row->cell[column])->mask)
- gdk_bitmap_unref
- (GTK_CELL_PIXTEXT (clist_row->cell[column])->mask);
- }
+ old_text = GTK_CELL_PIXTEXT (clist_row->cell[column])->text;
+ old_pixmap = GTK_CELL_PIXTEXT (clist_row->cell[column])->pixmap;
+ old_mask = GTK_CELL_PIXTEXT (clist_row->cell[column])->mask;
break;
case GTK_CELL_WIDGET:
/* unimplimented */
@@ -2963,6 +2956,8 @@ set_cell_contents (GtkCList *clist,
if (column == ctree->tree_column && type != GTK_CELL_EMPTY)
type = GTK_CELL_PIXTEXT;
+ /* Note that pixmap and mask were already ref'ed by the caller
+ */
switch (type)
{
case GTK_CELL_TEXT:
@@ -3017,6 +3012,13 @@ set_cell_contents (GtkCList *clist,
if (visible && clist->column[column].auto_resize &&
!GTK_CLIST_AUTO_RESIZE_BLOCKED (clist))
column_auto_resize (clist, clist_row, column, requisition.width);
+
+ if (old_text)
+ g_free (old_text);
+ if (old_pixmap)
+ gdk_pixmap_unref (old_pixmap);
+ if (old_mask)
+ gdk_pixmap_unref (old_mask);
}
static void
diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c
index 7f471229ed..a74589936b 100644
--- a/gtk/gtkentry.c
+++ b/gtk/gtkentry.c
@@ -1732,6 +1732,8 @@ gtk_entry_commit_cb (GtkIMContext *context,
GtkEditable *editable = GTK_EDITABLE (entry);
gint tmp_pos = entry->current_pos;
+ gtk_editable_delete_selection (editable);
+
gtk_editable_insert_text (editable, str, strlen (str), &tmp_pos);
gtk_editable_set_position (editable, tmp_pos);
}
diff --git a/gtk/gtkfilesel.c b/gtk/gtkfilesel.c
index 0d75338f63..538f799636 100644
--- a/gtk/gtkfilesel.c
+++ b/gtk/gtkfilesel.c
@@ -89,6 +89,18 @@
#define FILE_LIST_WIDTH 180
#define FILE_LIST_HEIGHT 180
+/* The Hurd doesn't define either PATH_MAX or MAXPATHLEN, so we put this
+ * in here, since the rest of the code in the file does require some
+ * fixed maximum.
+ */
+#ifndef MAXPATHLEN
+# ifdef PATH_MAX
+# define MAXPATHLEN PATH_MAX
+# else
+# define MAXPATHLEN 2048
+# endif
+#endif
+
/* I've put this here so it doesn't get confused with the
* file completion interface */
typedef struct _HistoryCallbackArg HistoryCallbackArg;
diff --git a/gtk/gtkframe.c b/gtk/gtkframe.c
index 02921ef10a..be0ea17139 100644
--- a/gtk/gtkframe.c
+++ b/gtk/gtkframe.c
@@ -73,12 +73,6 @@ static void gtk_frame_real_compute_child_allocation (GtkFrame *frame,
static GtkBinClass *parent_class = NULL;
-/* Here until I convince timj about memory management behavior
- */
-gchar * gtk_frame_get_label (GtkFrame *frame);
-gchar * gtk_label_get_text (GtkLabel *label);
-
-
GtkType
gtk_frame_get_type (void)
{
@@ -276,7 +270,7 @@ gtk_frame_set_label (GtkFrame *frame,
* was no label widget or the lable widget was not
* a #GtkLabel. This value must be freed with g_free().
**/
-gchar *
+G_CONST_RETURN gchar *
gtk_frame_get_label (GtkFrame *frame)
{
g_return_val_if_fail (frame != NULL, NULL);
diff --git a/gtk/gtkframe.h b/gtk/gtkframe.h
index 6eb3f4dec8..a29fb72931 100644
--- a/gtk/gtkframe.h
+++ b/gtk/gtkframe.h
@@ -70,10 +70,11 @@ struct _GtkFrameClass
GtkType gtk_frame_get_type (void) G_GNUC_CONST;
GtkWidget* gtk_frame_new (const gchar *label);
-void gtk_frame_set_label (GtkFrame *frame,
- const gchar *label);
-/* Temporarily commented out until memory management behavior is figured out */
-/* gchar * gtk_frame_get_label (GtkFrame *frame); */
+
+void gtk_frame_set_label (GtkFrame *frame,
+ const gchar *label);
+G_CONST_RETURN gchar *gtk_frame_get_label (GtkFrame *frame);
+
void gtk_frame_set_label_widget (GtkFrame *frame,
GtkWidget *label_widget);
void gtk_frame_set_label_align (GtkFrame *frame,
diff --git a/gtk/gtkhandlebox.c b/gtk/gtkhandlebox.c
index c834ef459a..ca2dd0321f 100644
--- a/gtk/gtkhandlebox.c
+++ b/gtk/gtkhandlebox.c
@@ -443,6 +443,7 @@ gtk_handle_box_style_set (GtkWidget *widget,
GtkStyle *previous_style)
{
GtkHandleBox *hb;
+ GdkRectangle new_area;
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_HANDLE_BOX (widget));
@@ -880,27 +881,29 @@ gtk_handle_box_button_changed (GtkWidget *widget,
return FALSE;
child = GTK_BIN (hb)->child;
-
- switch (hb->handle_position)
+
+ if (child)
{
- case GTK_POS_LEFT:
- in_handle = event->x < DRAG_HANDLE_SIZE;
- break;
- case GTK_POS_TOP:
- in_handle = event->y < DRAG_HANDLE_SIZE;
- break;
- case GTK_POS_RIGHT:
- in_handle = event->x > 2 * GTK_CONTAINER (hb)->border_width + child->allocation.width;
- break;
- case GTK_POS_BOTTOM:
- in_handle = event->y > 2 * GTK_CONTAINER (hb)->border_width + child->allocation.height;
- break;
- default:
- in_handle = FALSE;
- break;
+ switch (hb->handle_position)
+ {
+ case GTK_POS_LEFT:
+ in_handle = event->x < DRAG_HANDLE_SIZE;
+ break;
+ case GTK_POS_TOP:
+ in_handle = event->y < DRAG_HANDLE_SIZE;
+ break;
+ case GTK_POS_RIGHT:
+ in_handle = event->x > 2 * GTK_CONTAINER (hb)->border_width + child->allocation.width;
+ break;
+ case GTK_POS_BOTTOM:
+ in_handle = event->y > 2 * GTK_CONTAINER (hb)->border_width + child->allocation.height;
+ break;
+ default:
+ in_handle = FALSE;
+ break;
+ }
}
-
- if (!child)
+ else
{
in_handle = FALSE;
event_handled = TRUE;
diff --git a/gtk/gtkitemfactory.c b/gtk/gtkitemfactory.c
index 202ab00be4..f0aecf338e 100644
--- a/gtk/gtkitemfactory.c
+++ b/gtk/gtkitemfactory.c
@@ -1318,8 +1318,7 @@ gtk_item_factory_delete_item (GtkItemFactory *ifactory,
const gchar *path)
{
GtkItemFactoryClass *class;
- GtkItemFactoryItem *item;
- gchar *fpath;
+ GtkWidget *widget;
g_return_if_fail (ifactory != NULL);
g_return_if_fail (GTK_IS_ITEM_FACTORY (ifactory));
@@ -1327,25 +1326,14 @@ gtk_item_factory_delete_item (GtkItemFactory *ifactory,
class = GTK_ITEM_FACTORY_GET_CLASS (ifactory);
- fpath = g_strconcat (ifactory->path, path, NULL);
- item = g_hash_table_lookup (class->item_ht, fpath);
- g_free (fpath);
+ widget = gtk_item_factory_get_widget (ifactory, path);
- if (item)
+ if (widget)
{
- GtkWidget *widget = NULL;
- GSList *slist;
-
- for (slist = item->widgets; slist; slist = slist->next)
- {
- widget = slist->data;
-
- if (gtk_item_factory_from_widget (widget) == ifactory)
- break;
- }
+ if (GTK_IS_MENU (widget))
+ widget = gtk_menu_get_attach_widget (GTK_MENU (widget));
- if (slist)
- gtk_widget_destroy (widget);
+ gtk_widget_destroy (widget);
}
}
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index f8ab0f5cd9..1a0939a37c 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -337,13 +337,13 @@ gtk_label_set_markup_with_accel (GtkLabel *label,
* Return value: the text in the label widget. This value must
* be freed with g_free().
**/
-gchar *
+G_CONST_RETURN gchar *
gtk_label_get_text (GtkLabel *label)
{
g_return_val_if_fail (label != NULL, NULL);
g_return_val_if_fail (GTK_IS_LABEL (label), NULL);
- return g_strdup (label->label);
+ return label->label;
}
void
diff --git a/gtk/gtklabel.h b/gtk/gtklabel.h
index b0524af66c..04c579c4cb 100644
--- a/gtk/gtklabel.h
+++ b/gtk/gtklabel.h
@@ -71,8 +71,11 @@ struct _GtkLabelClass
GtkType gtk_label_get_type (void) G_GNUC_CONST;
GtkWidget *gtk_label_new (const char *str);
-void gtk_label_set_text (GtkLabel *label,
- const char *str);
+
+void gtk_label_set_text (GtkLabel *label,
+ const char *str);
+G_CONST_RETURN gchar *gtk_label_get_text (GtkLabel *label);
+
void gtk_label_set_attributes (GtkLabel *label,
PangoAttrList *attrs);
@@ -81,8 +84,6 @@ void gtk_label_set_markup (GtkLabel *label,
guint gtk_label_set_markup_with_accel (GtkLabel *label,
const gchar *str);
-
-/* Temporarily commented out until memory management behavior is figured out *//* gchar * gtk_label_get_text (GtkLabel *label); */
void gtk_label_set_justify (GtkLabel *label,
GtkJustification jtype);
void gtk_label_set_pattern (GtkLabel *label,
diff --git a/gtk/gtklist.c b/gtk/gtklist.c
index 8698b1303c..1cf4cd0237 100644
--- a/gtk/gtklist.c
+++ b/gtk/gtklist.c
@@ -2700,6 +2700,14 @@ gtk_list_signal_item_toggle (GtkListItem *list_item,
g_return_if_fail (list != NULL);
g_return_if_fail (GTK_IS_LIST (list));
+ if ((list->selection_mode == GTK_SELECTION_BROWSE ||
+ list->selection_mode == GTK_SELECTION_EXTENDED) &&
+ GTK_WIDGET (list_item)->state == GTK_STATE_NORMAL)
+ {
+ gtk_widget_set_state (GTK_WIDGET (list_item), GTK_STATE_SELECTED);
+ return;
+ }
+
switch (GTK_WIDGET (list_item)->state)
{
case GTK_STATE_SELECTED:
diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c
index 8056c4a8a7..a2015c4ff7 100644
--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -110,6 +110,8 @@ static void gtk_menu_position (GtkMenu *menu);
static void gtk_menu_reparent (GtkMenu *menu,
GtkWidget *new_parent,
gboolean unrealize);
+static void gtk_menu_remove (GtkContainer *menu,
+ GtkWidget *widget);
static GtkMenuShellClass *parent_class = NULL;
static const gchar *attach_data_key = "gtk-menu-attach-data";
@@ -169,6 +171,8 @@ gtk_menu_class_init (GtkMenuClass *class)
widget_class->hide_all = gtk_menu_hide_all;
widget_class->enter_notify_event = gtk_menu_enter_notify;
widget_class->leave_notify_event = gtk_menu_leave_notify;
+
+ container_class->remove = gtk_menu_remove;
menu_shell_class->submenu_placement = GTK_LEFT_RIGHT;
menu_shell_class->deactivate = gtk_menu_deactivate;
@@ -396,6 +400,28 @@ gtk_menu_detach (GtkMenu *menu)
gtk_widget_unref (GTK_WIDGET (menu));
}
+void
+gtk_menu_remove(GtkContainer *container,
+ GtkWidget *widget)
+{
+ GtkMenu *menu;
+ g_return_if_fail (GTK_IS_MENU (container));
+ g_return_if_fail (GTK_IS_MENU_ITEM (widget));
+
+ menu = GTK_MENU (container);
+
+ /* Clear out old_active_menu_item if it matches the item we are removing
+ */
+ if (menu->old_active_menu_item == widget)
+ {
+ gtk_widget_unref (menu->old_active_menu_item);
+ menu->old_active_menu_item = NULL;
+ }
+
+ GTK_CONTAINER_CLASS (parent_class)->remove (container, widget);
+}
+
+
GtkWidget*
gtk_menu_new (void)
{
diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c
index 145b7b7521..04fa940b3c 100644
--- a/gtk/gtkmenushell.c
+++ b/gtk/gtkmenushell.c
@@ -683,6 +683,12 @@ gtk_menu_shell_remove (GtkContainer *container,
menu_shell = GTK_MENU_SHELL (container);
menu_shell->children = g_list_remove (menu_shell->children, widget);
+ if (widget == menu_shell->active_menu_item)
+ {
+ gtk_item_deselect (GTK_ITEM (menu_shell->active_menu_item));
+ menu_shell->active_menu_item = NULL;
+ }
+
gtk_widget_unparent (widget);
/* queue resize regardless of GTK_WIDGET_VISIBLE (container),
diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c
index 4c0994af45..4bb12ec597 100644
--- a/gtk/gtknotebook.c
+++ b/gtk/gtknotebook.c
@@ -2547,8 +2547,8 @@ gtk_notebook_set_shape (GtkNotebook *notebook)
}
gdk_draw_rectangle(pm, pmgc, TRUE, x, y, width, height);
- /* if theres an area for scrollign arrows draw the shape for them */
- if (notebook->panel)
+ /* if theres an area for scrolling arrows draw the shape for them */
+ if (notebook->panel && gdk_window_is_visible (notebook->panel))
{
gdk_window_get_geometry(notebook->panel, &x, &y, &width, &height, &depth);
gdk_draw_rectangle(pm, pmgc, TRUE, x, y, width, height);
diff --git a/gtk/gtkoptionmenu.c b/gtk/gtkoptionmenu.c
index c329a28965..65802151b2 100644
--- a/gtk/gtkoptionmenu.c
+++ b/gtk/gtkoptionmenu.c
@@ -559,6 +559,56 @@ gtk_option_menu_changed (GtkOptionMenu *option_menu)
}
static void
+gtk_option_menu_select_first_sensitive (GtkOptionMenu *option_menu)
+{
+ if (option_menu->menu)
+ {
+ GList *children = GTK_MENU_SHELL (option_menu->menu)->children;
+ gint index = 0;
+
+ while (children)
+ {
+ if (GTK_WIDGET_SENSITIVE (children->data))
+ {
+ gtk_option_menu_set_history (option_menu, index);
+ return;
+ }
+
+ children = children->next;
+ index++;
+ }
+ }
+}
+
+static void
+gtk_option_menu_item_state_changed_cb (GtkWidget *widget,
+ GtkStateType previous_state,
+ GtkOptionMenu *option_menu)
+{
+ GtkWidget *child = GTK_BIN (option_menu)->child;
+
+ if (child && GTK_WIDGET_SENSITIVE (child) != GTK_WIDGET_IS_SENSITIVE (widget))
+ gtk_widget_set_sensitive (child, GTK_WIDGET_IS_SENSITIVE (widget));
+}
+
+static void
+gtk_option_menu_item_destroy_cb (GtkWidget *widget,
+ GtkOptionMenu *option_menu)
+{
+ GtkWidget *child = GTK_BIN (option_menu)->child;
+
+ if (child)
+ {
+ gtk_widget_ref (child);
+ gtk_option_menu_remove_contents (option_menu);
+ gtk_widget_destroy (child);
+ gtk_widget_unref (child);
+
+ gtk_option_menu_select_first_sensitive (option_menu);
+ }
+}
+
+static void
gtk_option_menu_update_contents (GtkOptionMenu *option_menu)
{
GtkWidget *child;
@@ -580,14 +630,16 @@ gtk_option_menu_update_contents (GtkOptionMenu *option_menu)
child = GTK_BIN (option_menu->menu_item)->child;
if (child)
{
- if (GTK_BIN (option_menu)->child)
- gtk_container_remove (GTK_CONTAINER (option_menu),
- GTK_BIN (option_menu)->child);
- if (GTK_WIDGET (option_menu)->state != child->state)
- gtk_widget_set_state (child, GTK_WIDGET (option_menu)->state);
+ if (!GTK_WIDGET_IS_SENSITIVE (option_menu->menu_item))
+ gtk_widget_set_sensitive (child, FALSE);
gtk_widget_reparent (child, GTK_WIDGET (option_menu));
}
+ gtk_signal_connect (GTK_OBJECT (option_menu->menu_item), "state_changed",
+ GTK_SIGNAL_FUNC (gtk_option_menu_item_state_changed_cb), option_menu);
+ gtk_signal_connect (GTK_OBJECT (option_menu->menu_item), "destroy",
+ GTK_SIGNAL_FUNC (gtk_option_menu_item_destroy_cb), option_menu);
+
gtk_widget_size_request (child, &child_requisition);
gtk_widget_size_allocate (GTK_WIDGET (option_menu),
&(GTK_WIDGET (option_menu)->allocation));
@@ -604,15 +656,28 @@ gtk_option_menu_update_contents (GtkOptionMenu *option_menu)
static void
gtk_option_menu_remove_contents (GtkOptionMenu *option_menu)
{
+ GtkWidget *child;
+
g_return_if_fail (option_menu != NULL);
g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));
- if (GTK_BIN (option_menu)->child)
+ if (option_menu->menu_item)
{
- if (GTK_WIDGET (option_menu->menu_item)->state != GTK_BIN (option_menu)->child->state)
- gtk_widget_set_state (GTK_BIN (option_menu)->child,
- GTK_WIDGET (option_menu->menu_item)->state);
- gtk_widget_reparent (GTK_BIN (option_menu)->child, option_menu->menu_item);
+ child = GTK_BIN (option_menu)->child;
+
+ if (child)
+ {
+ gtk_widget_set_sensitive (child, TRUE);
+ gtk_widget_reparent (child, option_menu->menu_item);
+ }
+
+ gtk_signal_disconnect_by_func (GTK_OBJECT (option_menu->menu_item),
+ GTK_SIGNAL_FUNC (gtk_option_menu_item_state_changed_cb),
+ option_menu);
+ gtk_signal_disconnect_by_func (GTK_OBJECT (option_menu->menu_item),
+ GTK_SIGNAL_FUNC (gtk_option_menu_item_destroy_cb),
+ option_menu);
+
gtk_widget_unref (option_menu->menu_item);
option_menu->menu_item = NULL;
}
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index 54a2dd769e..77e43d221a 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -926,7 +926,7 @@ gtk_range_button_press (GtkWidget *widget,
}
}
- return FALSE;
+ return TRUE;
}
static gint
@@ -982,7 +982,7 @@ gtk_range_button_release (GtkWidget *widget,
range->click_child = 0;
}
- return FALSE;
+ return TRUE;
}
static gint
@@ -1054,7 +1054,7 @@ gtk_range_motion_notify (GtkWidget *widget,
}
}
- return FALSE;
+ return TRUE;
}
static gint
@@ -1156,7 +1156,7 @@ gtk_range_enter_notify (GtkWidget *widget,
gtk_range_draw_step_back (range);
}
- return FALSE;
+ return TRUE;
}
static gint
@@ -1194,7 +1194,7 @@ gtk_range_leave_notify (GtkWidget *widget,
gtk_range_draw_step_back (range);
}
- return FALSE;
+ return TRUE;
}
static gint
@@ -1207,7 +1207,7 @@ gtk_range_focus_in (GtkWidget *widget,
GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
gtk_widget_draw_focus (widget);
- return FALSE;
+ return TRUE;
}
static gint
@@ -1220,7 +1220,7 @@ gtk_range_focus_out (GtkWidget *widget,
GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
gtk_widget_draw_focus (widget);
- return FALSE;
+ return TRUE;
}
static void
diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c
index 03a12b3bfe..a67ee40600 100644
--- a/gtk/gtkrc.c
+++ b/gtk/gtkrc.c
@@ -297,11 +297,11 @@ gtk_rc_make_default_dir (const gchar *type)
#ifndef G_OS_WIN32
var = getenv("GTK_EXE_PREFIX");
if (var)
- path = g_strdup_printf("%s%s%s", var, "/lib/gtk-2.0/" GTK_VERSION "/", type);
+ path = g_strconcat (var, "/lib/gtk-2.0/" GTK_VERSION "/", type, NULL);
else
- path = g_strdup_printf("%s%s%s", GTK_EXE_PREFIX, "/lib/gtk-2.0/" GTK_VERSION "/", type);
+ path = g_strconcat (GTK_LIBDIR "/gtk-2.0/" GTK_VERSION "/", type, NULL);
#else
- path = g_strdup_printf ("%s\\%s", get_themes_directory (), type);
+ path = g_strconcat ("%s\\%s", get_themes_directory (), type);
#endif
return path;
@@ -351,9 +351,9 @@ gtk_rc_get_theme_dir(void)
#ifndef G_OS_WIN32
var = getenv("GTK_DATA_PREFIX");
if (var)
- path = g_strdup_printf("%s%s", var, "/share/themes");
+ path = g_strconcat (var, "/share/themes", NULL);
else
- path = g_strdup_printf("%s%s", GTK_DATA_PREFIX, "/share/themes");
+ path = g_strconcat (GTK_DATA_PREFIX, "/share/themes", NULL);
#else
path = g_strdup (get_themes_directory ());
#endif
@@ -380,11 +380,11 @@ gtk_rc_append_default_module_path(void)
#ifndef G_OS_WIN32
var = getenv("GTK_EXE_PREFIX");
if (var)
- path = g_strdup_printf("%s%s", var, "/lib/gtk-2.0/" GTK_VERSION "/engines");
+ path = g_strconcat(var, "/lib/gtk-2.0/" GTK_VERSION "/engines", NULL);
else
- path = g_strdup_printf("%s%s", GTK_EXE_PREFIX, "/lib/gtk-2.0/" GTK_VERSION "/engines");
+ path = g_strdup (GTK_LIBDIR "/gtk-2.0/" GTK_VERSION "/engines");
#else
- path = g_strdup_printf ("%s%s", get_themes_directory (), "\\engines");
+ path = g_strconcat (get_themes_directory (), "\\engines", NULL);
#endif
module_path[n++] = path;
@@ -400,10 +400,10 @@ gtk_rc_append_default_module_path(void)
else
sep = "";
/* This produces something like ~/.gtk-2.0/2.0/engines */
- path = g_strdup_printf ("%s%s%s", var, sep,
- ".gtk-2.0" G_DIR_SEPARATOR_S
- GTK_VERSION G_DIR_SEPARATOR_S
- "engines");
+ path = g_strconcat (var, sep,
+ ".gtk-2.0" G_DIR_SEPARATOR_S
+ GTK_VERSION G_DIR_SEPARATOR_S
+ "engines", NULL);
module_path[n++] = path;
}
module_path[n] = NULL;
diff --git a/gtk/gtkstyle.c b/gtk/gtkstyle.c
index 054bf21dfc..30c75cf907 100644
--- a/gtk/gtkstyle.c
+++ b/gtk/gtkstyle.c
@@ -635,6 +635,9 @@ gtk_style_detach (GtkStyle *style)
{
GTK_STYLE_GET_CLASS (style)->unrealize (style);
+ gdk_colormap_unref (style->colormap);
+ style->colormap = NULL;
+
gtk_style_unref (style);
}
}
@@ -657,7 +660,7 @@ gtk_style_realize (GtkStyle *style,
{
g_return_if_fail (GTK_IS_STYLE (style));
- style->colormap = colormap;
+ style->colormap = gdk_colormap_ref (colormap);
style->depth = gdk_colormap_get_visual (colormap)->depth;
GTK_STYLE_GET_CLASS (style)->realize (style);
@@ -1231,7 +1234,18 @@ gtk_style_real_unrealize (GtkStyle *style)
gtk_gc_release (style->mid_gc[i]);
gtk_gc_release (style->text_gc[i]);
gtk_gc_release (style->base_gc[i]);
+
+ if (style->bg_pixmap[i] && style->bg_pixmap[i] != (GdkPixmap*) GDK_PARENT_RELATIVE)
+ gdk_pixmap_unref (style->bg_pixmap[i]);
}
+
+ gdk_colormap_free_colors (style->colormap, style->fg, 5);
+ gdk_colormap_free_colors (style->colormap, style->bg, 5);
+ gdk_colormap_free_colors (style->colormap, style->light, 5);
+ gdk_colormap_free_colors (style->colormap, style->dark, 5);
+ gdk_colormap_free_colors (style->colormap, style->mid, 5);
+ gdk_colormap_free_colors (style->colormap, style->text, 5);
+ gdk_colormap_free_colors (style->colormap, style->base, 5);
}
static void
diff --git a/gtk/gtktext.c b/gtk/gtktext.c
index 5933396703..31b83d4274 100644
--- a/gtk/gtktext.c
+++ b/gtk/gtktext.c
@@ -1505,19 +1505,30 @@ static void
clear_focus_area (GtkText *text, gint area_x, gint area_y, gint area_width, gint area_height)
{
GtkWidget *widget = GTK_WIDGET (text);
-
+ GdkGC *gc;
+
gint ythick = TEXT_BORDER_ROOM + widget->style->ythickness;
gint xthick = TEXT_BORDER_ROOM + widget->style->xthickness;
gint width, height;
- gdk_window_get_size (widget->style->bg_pixmap[GTK_STATE_NORMAL], &width, &height);
+ if (area_width == 0 || area_height == 0)
+ return;
+
+ if (widget->style->bg_pixmap[GTK_STATE_NORMAL])
+ {
+ gdk_window_get_size (widget->style->bg_pixmap[GTK_STATE_NORMAL], &width, &height);
- gdk_gc_set_ts_origin (text->bg_gc,
- (- text->first_onscreen_hor_pixel + xthick) % width,
- (- text->first_onscreen_ver_pixel + ythick) % height);
+ gdk_gc_set_ts_origin (text->bg_gc,
+ (- text->first_onscreen_hor_pixel + xthick) % width,
+ (- text->first_onscreen_ver_pixel + ythick) % height);
+
+ gc = text->bg_gc;
+ }
+ else
+ gc = widget->style->bg_gc[widget->state];
- gdk_draw_rectangle (GTK_WIDGET (text)->window, text->bg_gc, TRUE,
+ gdk_draw_rectangle (GTK_WIDGET (text)->window, gc, TRUE,
area_x, area_y, area_width, area_height);
}
@@ -1573,19 +1584,16 @@ gtk_text_draw_focus (GtkWidget *widget)
width -= 2 * xthick;
height -= 2 * ythick;
- if (widget->style->bg_pixmap[GTK_STATE_NORMAL])
- {
- /* top rect */
- clear_focus_area (text, x, y, width, yextra);
- /* left rect */
- clear_focus_area (text, x, y + yextra,
- xextra, y + height - 2 * yextra);
- /* right rect */
- clear_focus_area (text, x + width - xextra, y + yextra,
- xextra, height - 2 * ythick);
- /* bottom rect */
- clear_focus_area (text, x, x + height - yextra, width, yextra);
- }
+ /* top rect */
+ clear_focus_area (text, x, y, width, yextra);
+ /* left rect */
+ clear_focus_area (text, x, y + yextra,
+ xextra, y + height - 2 * yextra);
+ /* right rect */
+ clear_focus_area (text, x + width - xextra, y + yextra,
+ xextra, height - 2 * ythick);
+ /* bottom rect */
+ clear_focus_area (text, x, x + height - yextra, width, yextra);
}
else
{
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index dc6aa2a12c..09f39f9d92 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -1863,27 +1863,18 @@ gtk_window_real_set_focus (GtkWindow *window,
event.window = window->focus_widget->window;
event.in = TRUE;
- if (window->default_widget)
- {
- if (GTK_WIDGET_RECEIVES_DEFAULT (window->focus_widget) &&
- (window->focus_widget != window->default_widget))
- {
- if (GTK_WIDGET_CAN_DEFAULT (window->focus_widget))
- GTK_WIDGET_SET_FLAGS (window->focus_widget, GTK_HAS_DEFAULT);
- GTK_WIDGET_UNSET_FLAGS (window->default_widget, GTK_HAS_DEFAULT);
- }
- else
- {
- GTK_WIDGET_SET_FLAGS (window->default_widget, GTK_HAS_DEFAULT);
- }
+ if (GTK_WIDGET_RECEIVES_DEFAULT (window->focus_widget) &&
+ (window->focus_widget != window->default_widget))
+ {
+ if (GTK_WIDGET_CAN_DEFAULT (window->focus_widget))
+ GTK_WIDGET_SET_FLAGS (window->focus_widget, GTK_HAS_DEFAULT);
+
+ if (window->default_widget)
+ GTK_WIDGET_UNSET_FLAGS (window->default_widget, GTK_HAS_DEFAULT);
}
gtk_widget_event (window->focus_widget, (GdkEvent*) &event);
}
- else if (window->default_widget)
- {
- GTK_WIDGET_SET_FLAGS (window->default_widget, GTK_HAS_DEFAULT);
- }
if (window->default_widget &&
(def_flags != GTK_WIDGET_FLAGS (window->default_widget)))
diff --git a/gtk/testgtk.c b/gtk/testgtk.c
index 73a151ec5f..c5c460d531 100644
--- a/gtk/testgtk.c
+++ b/gtk/testgtk.c
@@ -2913,11 +2913,19 @@ static GtkItemFactoryEntry menu_items[] =
{ "/_Preferences/Shape/_Square", 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" },
+ { "/_Preferences/Shape/_Rectangle", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
+ { "/_Preferences/Shape/_Oval", NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
+
+ /* For testing deletion of menus */
+ { "/_Preferences/Should_NotAppear", NULL, 0, 0, "<Branch>" },
+ { "/Preferences/ShouldNotAppear/SubItem1", NULL, gtk_ifactory_cb, 0 },
+ { "/Preferences/ShouldNotAppear/SubItem2", NULL, gtk_ifactory_cb, 0 },
{ "/_Help", NULL, 0, 0, "<LastBranch>" },
{ "/Help/_About", NULL, gtk_ifactory_cb, 0 },
};
+
static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
static void
@@ -2990,6 +2998,8 @@ create_item_factory (void)
GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
gtk_widget_grab_default (button);
+ gtk_item_factory_delete_item (item_factory, "/Preferences/ShouldNotAppear");
+
gtk_widget_show_all (window);
}
else