]> Pileus Git - ~andy/gtk/commitdiff
Try to figure out if this is Digital Unix and we need -std1 to get the
authorOwen Taylor <otaylor@gtk.org>
Sun, 10 May 1998 02:46:20 +0000 (02:46 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Sun, 10 May 1998 02:46:20 +0000 (02:46 +0000)
Sat May  9 20:11:20 1998  Owen Taylor  <otaylor@gtk.org>

* configure.in (LIBS): Try to figure out if this
is Digital Unix and we need -std1 to get the
right prototypes.

Sat May  9 20:08:12 1998  Owen Taylor  <otaylor@gtk.org>

* glib/gmem.c: Experimentally restore GMemChunk
to its primeval state - where mem areas are
freed incrementally instead of searching the tree
every time a mem area is completely empty. Also,
always keep one mem chunk around. (Reduced calls
to malloc() a lot, but doesn't really improve
performance significiantly)

Fri May  8 21:31:50 1998  Owen Taylor  <otaylor@gtk.org>

* gtk/gtkwidget.c (gtk_widget_queue_draw): Free the
draw-queue when we are done.

(gtk_widget_queue_draw/_queu_resize): Always return
FALSE and avoid having two idles at the same time.

Fri May  8 21:04:00 1998  Owen Taylor  <otaylor@gtk.org>

* gtk/gtktext.c: Various fixes to make sure cache
lines are freed if line_start_cache doesn't point to the
beginning of the cache.

Thu May  7 09:44:22 1998  Owen Taylor  <otaylor@gtk.org>

* style_set improvements for GtkText and GtkEntry

Tue May  5 19:49:27 1998  Owen Taylor  <otaylor@gtk.org>

* gdk/gdkpixmap.c: Patches from Gordon Matzigkeit
to speed things up and remove code duplication.

Reintegrated buffer overflow patches, and added
some extra paranoia.

Tue May  5 17:04:14 1998  Owen Taylor  <otaylor@gtk.org>

* gdk/gdk.c (gdk_event_translate): A guint * was
being passed where X expected a Keysym *, and
keysyms are long's on Alpha Linux. This was causing
segfaults in Xlib, apparently because of alignment.
(Bug located by Juergen Haas <haas@forwiss.uni-passau.de>)

Tue May  5 19:11:27 1998  Owen Taylor  <otaylor@gtk.org>

* gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always
set GDK_EXPOSURE_MASK for DrawingAreas

Tue May  5 14:32:37 1998  Owen Taylor  <otaylor@gtk.org>

* gtk/gtkwidget.[ch]: removed gtk_widge_propagate_default_style
(superceded by RC file reparsing capabilities)

* gtk/gtkwindow.c: Add handling for _GDK_READ_RFCILES client
events. (Shouldn't be sent to the InputOnly leader, which
it is now by gdk_event_send_clientmessage_toall

* gtk/testgtk.c: Added extra button to rcfiles test
to send out _GDK_READ_RCFILES events.

Tue May  5 11:03:00 1998  Owen Taylor  <otaylor@gtk.org>

* gtk/gtkselection.c (gtk_selection_clear): Fixed
reversed conditionals that caused segfault on some
platforms.

Tue May  5 00:44:47 1998  Owen Taylor  <otaylor@gtk.org>

* gtk/gtkcontainer.c (gtk_container_set_focus_[hv]adjustment):
cast to GTK_OBJECT for gtk_object_ref.

23 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
configure.in
gdk/gdk.c
gdk/gdkpixmap.c
gdk/x11/gdkmain-x11.c
gdk/x11/gdkpixmap-x11.c
glib/gmem.c
gtk/gtkcontainer.c
gtk/gtkdrawingarea.c
gtk/gtkentry.c
gtk/gtkselection.c
gtk/gtktext.c
gtk/gtkwidget.c
gtk/gtkwidget.h
gtk/gtkwindow.c
gtk/testgtk.c
tests/testgtk.c

index d4c6ea91d0a367963aafff5ad038835b6365547a..a68e3b6c334bdde1d167d47a350add2dd41b143b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,81 @@
+Sat May  9 20:11:20 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * configure.in (LIBS): Try to figure out if this
+       is Digital Unix and we need -std1 to get the
+       right prototypes.
+
+Sat May  9 20:08:12 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * glib/gmem.c: Experimentally restore GMemChunk
+       to its primeval state - where mem areas are
+       freed incrementally instead of searching the tree
+       every time a mem area is completely empty. Also,
+       always keep one mem chunk around. (Reduced calls
+       to malloc() a lot, but doesn't really improve 
+       performance significiantly)
+
+Fri May  8 21:31:50 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.c (gtk_widget_queue_draw): Free the
+       draw-queue when we are done. 
+
+       (gtk_widget_queue_draw/_queu_resize): Always return
+       FALSE and avoid having two idles at the same time.
+       
+Fri May  8 21:04:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtktext.c: Various fixes to make sure cache
+       lines are freed if line_start_cache doesn't point to the
+       beginning of the cache.
+
+Thu May  7 09:44:22 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * style_set improvements for GtkText and GtkEntry
+
+Tue May  5 19:49:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdkpixmap.c: Patches from Gordon Matzigkeit
+       to speed things up and remove code duplication.
+
+       Reintegrated buffer overflow patches, and added
+       some extra paranoia.
+       
+Tue May  5 17:04:14 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdk.c (gdk_event_translate): A guint * was
+       being passed where X expected a Keysym *, and
+       keysyms are long's on Alpha Linux. This was causing
+       segfaults in Xlib, apparently because of alignment.
+       (Bug located by Juergen Haas <haas@forwiss.uni-passau.de>)
+       
+Tue May  5 19:11:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always
+       set GDK_EXPOSURE_MASK for DrawingAreas
+
+Tue May  5 14:32:37 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.[ch]: removed gtk_widge_propagate_default_style
+       (superceded by RC file reparsing capabilities)
+
+       * gtk/gtkwindow.c: Add handling for _GDK_READ_RFCILES client
+       events. (Shouldn't be sent to the InputOnly leader, which
+       it is now by gdk_event_send_clientmessage_toall
+
+       * gtk/testgtk.c: Added extra button to rcfiles test
+       to send out _GDK_READ_RCFILES events.
+       
+Tue May  5 11:03:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkselection.c (gtk_selection_clear): Fixed
+       reversed conditionals that caused segfault on some
+       platforms.
+
+Tue May  5 00:44:47 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkcontainer.c (gtk_container_set_focus_[hv]adjustment):
+       cast to GTK_OBJECT for gtk_object_ref.
+
 Sat May  9 16:30:33 BST 1998 Tony Gale  <gale@gtk.org>
 
        * docs/gtk_tut_it.sgml: update of Italian tutorial
index d4c6ea91d0a367963aafff5ad038835b6365547a..a68e3b6c334bdde1d167d47a350add2dd41b143b 100644 (file)
@@ -1,3 +1,81 @@
+Sat May  9 20:11:20 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * configure.in (LIBS): Try to figure out if this
+       is Digital Unix and we need -std1 to get the
+       right prototypes.
+
+Sat May  9 20:08:12 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * glib/gmem.c: Experimentally restore GMemChunk
+       to its primeval state - where mem areas are
+       freed incrementally instead of searching the tree
+       every time a mem area is completely empty. Also,
+       always keep one mem chunk around. (Reduced calls
+       to malloc() a lot, but doesn't really improve 
+       performance significiantly)
+
+Fri May  8 21:31:50 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.c (gtk_widget_queue_draw): Free the
+       draw-queue when we are done. 
+
+       (gtk_widget_queue_draw/_queu_resize): Always return
+       FALSE and avoid having two idles at the same time.
+       
+Fri May  8 21:04:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtktext.c: Various fixes to make sure cache
+       lines are freed if line_start_cache doesn't point to the
+       beginning of the cache.
+
+Thu May  7 09:44:22 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * style_set improvements for GtkText and GtkEntry
+
+Tue May  5 19:49:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdkpixmap.c: Patches from Gordon Matzigkeit
+       to speed things up and remove code duplication.
+
+       Reintegrated buffer overflow patches, and added
+       some extra paranoia.
+       
+Tue May  5 17:04:14 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdk.c (gdk_event_translate): A guint * was
+       being passed where X expected a Keysym *, and
+       keysyms are long's on Alpha Linux. This was causing
+       segfaults in Xlib, apparently because of alignment.
+       (Bug located by Juergen Haas <haas@forwiss.uni-passau.de>)
+       
+Tue May  5 19:11:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always
+       set GDK_EXPOSURE_MASK for DrawingAreas
+
+Tue May  5 14:32:37 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.[ch]: removed gtk_widge_propagate_default_style
+       (superceded by RC file reparsing capabilities)
+
+       * gtk/gtkwindow.c: Add handling for _GDK_READ_RFCILES client
+       events. (Shouldn't be sent to the InputOnly leader, which
+       it is now by gdk_event_send_clientmessage_toall
+
+       * gtk/testgtk.c: Added extra button to rcfiles test
+       to send out _GDK_READ_RCFILES events.
+       
+Tue May  5 11:03:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkselection.c (gtk_selection_clear): Fixed
+       reversed conditionals that caused segfault on some
+       platforms.
+
+Tue May  5 00:44:47 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkcontainer.c (gtk_container_set_focus_[hv]adjustment):
+       cast to GTK_OBJECT for gtk_object_ref.
+
 Sat May  9 16:30:33 BST 1998 Tony Gale  <gale@gtk.org>
 
        * docs/gtk_tut_it.sgml: update of Italian tutorial
index d4c6ea91d0a367963aafff5ad038835b6365547a..a68e3b6c334bdde1d167d47a350add2dd41b143b 100644 (file)
@@ -1,3 +1,81 @@
+Sat May  9 20:11:20 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * configure.in (LIBS): Try to figure out if this
+       is Digital Unix and we need -std1 to get the
+       right prototypes.
+
+Sat May  9 20:08:12 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * glib/gmem.c: Experimentally restore GMemChunk
+       to its primeval state - where mem areas are
+       freed incrementally instead of searching the tree
+       every time a mem area is completely empty. Also,
+       always keep one mem chunk around. (Reduced calls
+       to malloc() a lot, but doesn't really improve 
+       performance significiantly)
+
+Fri May  8 21:31:50 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.c (gtk_widget_queue_draw): Free the
+       draw-queue when we are done. 
+
+       (gtk_widget_queue_draw/_queu_resize): Always return
+       FALSE and avoid having two idles at the same time.
+       
+Fri May  8 21:04:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtktext.c: Various fixes to make sure cache
+       lines are freed if line_start_cache doesn't point to the
+       beginning of the cache.
+
+Thu May  7 09:44:22 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * style_set improvements for GtkText and GtkEntry
+
+Tue May  5 19:49:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdkpixmap.c: Patches from Gordon Matzigkeit
+       to speed things up and remove code duplication.
+
+       Reintegrated buffer overflow patches, and added
+       some extra paranoia.
+       
+Tue May  5 17:04:14 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdk.c (gdk_event_translate): A guint * was
+       being passed where X expected a Keysym *, and
+       keysyms are long's on Alpha Linux. This was causing
+       segfaults in Xlib, apparently because of alignment.
+       (Bug located by Juergen Haas <haas@forwiss.uni-passau.de>)
+       
+Tue May  5 19:11:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always
+       set GDK_EXPOSURE_MASK for DrawingAreas
+
+Tue May  5 14:32:37 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.[ch]: removed gtk_widge_propagate_default_style
+       (superceded by RC file reparsing capabilities)
+
+       * gtk/gtkwindow.c: Add handling for _GDK_READ_RFCILES client
+       events. (Shouldn't be sent to the InputOnly leader, which
+       it is now by gdk_event_send_clientmessage_toall
+
+       * gtk/testgtk.c: Added extra button to rcfiles test
+       to send out _GDK_READ_RCFILES events.
+       
+Tue May  5 11:03:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkselection.c (gtk_selection_clear): Fixed
+       reversed conditionals that caused segfault on some
+       platforms.
+
+Tue May  5 00:44:47 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkcontainer.c (gtk_container_set_focus_[hv]adjustment):
+       cast to GTK_OBJECT for gtk_object_ref.
+
 Sat May  9 16:30:33 BST 1998 Tony Gale  <gale@gtk.org>
 
        * docs/gtk_tut_it.sgml: update of Italian tutorial
index d4c6ea91d0a367963aafff5ad038835b6365547a..a68e3b6c334bdde1d167d47a350add2dd41b143b 100644 (file)
@@ -1,3 +1,81 @@
+Sat May  9 20:11:20 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * configure.in (LIBS): Try to figure out if this
+       is Digital Unix and we need -std1 to get the
+       right prototypes.
+
+Sat May  9 20:08:12 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * glib/gmem.c: Experimentally restore GMemChunk
+       to its primeval state - where mem areas are
+       freed incrementally instead of searching the tree
+       every time a mem area is completely empty. Also,
+       always keep one mem chunk around. (Reduced calls
+       to malloc() a lot, but doesn't really improve 
+       performance significiantly)
+
+Fri May  8 21:31:50 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.c (gtk_widget_queue_draw): Free the
+       draw-queue when we are done. 
+
+       (gtk_widget_queue_draw/_queu_resize): Always return
+       FALSE and avoid having two idles at the same time.
+       
+Fri May  8 21:04:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtktext.c: Various fixes to make sure cache
+       lines are freed if line_start_cache doesn't point to the
+       beginning of the cache.
+
+Thu May  7 09:44:22 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * style_set improvements for GtkText and GtkEntry
+
+Tue May  5 19:49:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdkpixmap.c: Patches from Gordon Matzigkeit
+       to speed things up and remove code duplication.
+
+       Reintegrated buffer overflow patches, and added
+       some extra paranoia.
+       
+Tue May  5 17:04:14 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdk.c (gdk_event_translate): A guint * was
+       being passed where X expected a Keysym *, and
+       keysyms are long's on Alpha Linux. This was causing
+       segfaults in Xlib, apparently because of alignment.
+       (Bug located by Juergen Haas <haas@forwiss.uni-passau.de>)
+       
+Tue May  5 19:11:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always
+       set GDK_EXPOSURE_MASK for DrawingAreas
+
+Tue May  5 14:32:37 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.[ch]: removed gtk_widge_propagate_default_style
+       (superceded by RC file reparsing capabilities)
+
+       * gtk/gtkwindow.c: Add handling for _GDK_READ_RFCILES client
+       events. (Shouldn't be sent to the InputOnly leader, which
+       it is now by gdk_event_send_clientmessage_toall
+
+       * gtk/testgtk.c: Added extra button to rcfiles test
+       to send out _GDK_READ_RCFILES events.
+       
+Tue May  5 11:03:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkselection.c (gtk_selection_clear): Fixed
+       reversed conditionals that caused segfault on some
+       platforms.
+
+Tue May  5 00:44:47 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkcontainer.c (gtk_container_set_focus_[hv]adjustment):
+       cast to GTK_OBJECT for gtk_object_ref.
+
 Sat May  9 16:30:33 BST 1998 Tony Gale  <gale@gtk.org>
 
        * docs/gtk_tut_it.sgml: update of Italian tutorial
index d4c6ea91d0a367963aafff5ad038835b6365547a..a68e3b6c334bdde1d167d47a350add2dd41b143b 100644 (file)
@@ -1,3 +1,81 @@
+Sat May  9 20:11:20 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * configure.in (LIBS): Try to figure out if this
+       is Digital Unix and we need -std1 to get the
+       right prototypes.
+
+Sat May  9 20:08:12 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * glib/gmem.c: Experimentally restore GMemChunk
+       to its primeval state - where mem areas are
+       freed incrementally instead of searching the tree
+       every time a mem area is completely empty. Also,
+       always keep one mem chunk around. (Reduced calls
+       to malloc() a lot, but doesn't really improve 
+       performance significiantly)
+
+Fri May  8 21:31:50 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.c (gtk_widget_queue_draw): Free the
+       draw-queue when we are done. 
+
+       (gtk_widget_queue_draw/_queu_resize): Always return
+       FALSE and avoid having two idles at the same time.
+       
+Fri May  8 21:04:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtktext.c: Various fixes to make sure cache
+       lines are freed if line_start_cache doesn't point to the
+       beginning of the cache.
+
+Thu May  7 09:44:22 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * style_set improvements for GtkText and GtkEntry
+
+Tue May  5 19:49:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdkpixmap.c: Patches from Gordon Matzigkeit
+       to speed things up and remove code duplication.
+
+       Reintegrated buffer overflow patches, and added
+       some extra paranoia.
+       
+Tue May  5 17:04:14 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdk.c (gdk_event_translate): A guint * was
+       being passed where X expected a Keysym *, and
+       keysyms are long's on Alpha Linux. This was causing
+       segfaults in Xlib, apparently because of alignment.
+       (Bug located by Juergen Haas <haas@forwiss.uni-passau.de>)
+       
+Tue May  5 19:11:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always
+       set GDK_EXPOSURE_MASK for DrawingAreas
+
+Tue May  5 14:32:37 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.[ch]: removed gtk_widge_propagate_default_style
+       (superceded by RC file reparsing capabilities)
+
+       * gtk/gtkwindow.c: Add handling for _GDK_READ_RFCILES client
+       events. (Shouldn't be sent to the InputOnly leader, which
+       it is now by gdk_event_send_clientmessage_toall
+
+       * gtk/testgtk.c: Added extra button to rcfiles test
+       to send out _GDK_READ_RCFILES events.
+       
+Tue May  5 11:03:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkselection.c (gtk_selection_clear): Fixed
+       reversed conditionals that caused segfault on some
+       platforms.
+
+Tue May  5 00:44:47 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkcontainer.c (gtk_container_set_focus_[hv]adjustment):
+       cast to GTK_OBJECT for gtk_object_ref.
+
 Sat May  9 16:30:33 BST 1998 Tony Gale  <gale@gtk.org>
 
        * docs/gtk_tut_it.sgml: update of Italian tutorial
index d4c6ea91d0a367963aafff5ad038835b6365547a..a68e3b6c334bdde1d167d47a350add2dd41b143b 100644 (file)
@@ -1,3 +1,81 @@
+Sat May  9 20:11:20 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * configure.in (LIBS): Try to figure out if this
+       is Digital Unix and we need -std1 to get the
+       right prototypes.
+
+Sat May  9 20:08:12 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * glib/gmem.c: Experimentally restore GMemChunk
+       to its primeval state - where mem areas are
+       freed incrementally instead of searching the tree
+       every time a mem area is completely empty. Also,
+       always keep one mem chunk around. (Reduced calls
+       to malloc() a lot, but doesn't really improve 
+       performance significiantly)
+
+Fri May  8 21:31:50 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.c (gtk_widget_queue_draw): Free the
+       draw-queue when we are done. 
+
+       (gtk_widget_queue_draw/_queu_resize): Always return
+       FALSE and avoid having two idles at the same time.
+       
+Fri May  8 21:04:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtktext.c: Various fixes to make sure cache
+       lines are freed if line_start_cache doesn't point to the
+       beginning of the cache.
+
+Thu May  7 09:44:22 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * style_set improvements for GtkText and GtkEntry
+
+Tue May  5 19:49:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdkpixmap.c: Patches from Gordon Matzigkeit
+       to speed things up and remove code duplication.
+
+       Reintegrated buffer overflow patches, and added
+       some extra paranoia.
+       
+Tue May  5 17:04:14 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdk.c (gdk_event_translate): A guint * was
+       being passed where X expected a Keysym *, and
+       keysyms are long's on Alpha Linux. This was causing
+       segfaults in Xlib, apparently because of alignment.
+       (Bug located by Juergen Haas <haas@forwiss.uni-passau.de>)
+       
+Tue May  5 19:11:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always
+       set GDK_EXPOSURE_MASK for DrawingAreas
+
+Tue May  5 14:32:37 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.[ch]: removed gtk_widge_propagate_default_style
+       (superceded by RC file reparsing capabilities)
+
+       * gtk/gtkwindow.c: Add handling for _GDK_READ_RFCILES client
+       events. (Shouldn't be sent to the InputOnly leader, which
+       it is now by gdk_event_send_clientmessage_toall
+
+       * gtk/testgtk.c: Added extra button to rcfiles test
+       to send out _GDK_READ_RCFILES events.
+       
+Tue May  5 11:03:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkselection.c (gtk_selection_clear): Fixed
+       reversed conditionals that caused segfault on some
+       platforms.
+
+Tue May  5 00:44:47 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkcontainer.c (gtk_container_set_focus_[hv]adjustment):
+       cast to GTK_OBJECT for gtk_object_ref.
+
 Sat May  9 16:30:33 BST 1998 Tony Gale  <gale@gtk.org>
 
        * docs/gtk_tut_it.sgml: update of Italian tutorial
index d4c6ea91d0a367963aafff5ad038835b6365547a..a68e3b6c334bdde1d167d47a350add2dd41b143b 100644 (file)
@@ -1,3 +1,81 @@
+Sat May  9 20:11:20 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * configure.in (LIBS): Try to figure out if this
+       is Digital Unix and we need -std1 to get the
+       right prototypes.
+
+Sat May  9 20:08:12 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * glib/gmem.c: Experimentally restore GMemChunk
+       to its primeval state - where mem areas are
+       freed incrementally instead of searching the tree
+       every time a mem area is completely empty. Also,
+       always keep one mem chunk around. (Reduced calls
+       to malloc() a lot, but doesn't really improve 
+       performance significiantly)
+
+Fri May  8 21:31:50 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.c (gtk_widget_queue_draw): Free the
+       draw-queue when we are done. 
+
+       (gtk_widget_queue_draw/_queu_resize): Always return
+       FALSE and avoid having two idles at the same time.
+       
+Fri May  8 21:04:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtktext.c: Various fixes to make sure cache
+       lines are freed if line_start_cache doesn't point to the
+       beginning of the cache.
+
+Thu May  7 09:44:22 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * style_set improvements for GtkText and GtkEntry
+
+Tue May  5 19:49:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdkpixmap.c: Patches from Gordon Matzigkeit
+       to speed things up and remove code duplication.
+
+       Reintegrated buffer overflow patches, and added
+       some extra paranoia.
+       
+Tue May  5 17:04:14 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gdk/gdk.c (gdk_event_translate): A guint * was
+       being passed where X expected a Keysym *, and
+       keysyms are long's on Alpha Linux. This was causing
+       segfaults in Xlib, apparently because of alignment.
+       (Bug located by Juergen Haas <haas@forwiss.uni-passau.de>)
+       
+Tue May  5 19:11:27 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always
+       set GDK_EXPOSURE_MASK for DrawingAreas
+
+Tue May  5 14:32:37 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkwidget.[ch]: removed gtk_widge_propagate_default_style
+       (superceded by RC file reparsing capabilities)
+
+       * gtk/gtkwindow.c: Add handling for _GDK_READ_RFCILES client
+       events. (Shouldn't be sent to the InputOnly leader, which
+       it is now by gdk_event_send_clientmessage_toall
+
+       * gtk/testgtk.c: Added extra button to rcfiles test
+       to send out _GDK_READ_RCFILES events.
+       
+Tue May  5 11:03:00 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkselection.c (gtk_selection_clear): Fixed
+       reversed conditionals that caused segfault on some
+       platforms.
+
+Tue May  5 00:44:47 1998  Owen Taylor  <otaylor@gtk.org>
+
+       * gtk/gtkcontainer.c (gtk_container_set_focus_[hv]adjustment):
+       cast to GTK_OBJECT for gtk_object_ref.
+
 Sat May  9 16:30:33 BST 1998 Tony Gale  <gale@gtk.org>
 
        * docs/gtk_tut_it.sgml: update of Italian tutorial
index f12208d22e7a7d2fa15bc8eee948282b21353e8f..fa956c4a23f3dcf9be61973c129509174b4d6384 100644 (file)
@@ -105,6 +105,25 @@ if test "x$GCC" = "xyes"; then
   fi
 fi
 
+AC_MSG_CHECKING([For extra flags to get ANSI library prototypes])
+gtk_save_LDFLAGS=$LDFLAGS
+LIBS="$LIBS -lm"
+AC_TRY_RUN([#include <math.h>
+             int main (void) { return (log(1) != log(1.)); }],
+     AC_MSG_RESULT(none needed),
+     gtk_save_CFLAGS=$CFLAGS
+     CFLAGS="$CFLAGS -std1"
+     AC_TRY_RUN([#include <math.h>
+                int main (void) { return (log(1) != log(1.)); }],
+         AC_MSG_RESULT(-std1),
+         AC_MSG_RESULT()
+         CFLAGS=$gtk_save_CFLAGS
+         AC_MSG_WARN(
+                [No ANSI prototypes found in library. (-std1 didn't work.)])
+     )
+)
+LIBS=$gtk_save_LIBS
+
 if test "x$enable_xim" = "xyes"; then
   CFLAGS="$CFLAGS -DUSE_XIM"
 fi
index bfb1070ecc8eb1cbfad3da58dfae67c85d8766c0..8b9768b2d517555ab4ac88a3bf5db3a8a2fe1218 100644 (file)
--- a/gdk/gdk.c
+++ b/gdk/gdk.c
@@ -1685,7 +1685,8 @@ gdk_event_translate (GdkEvent *event,
 
   GdkWindow *window;
   GdkWindowPrivate *window_private;
-  XComposeStatus compose;
+  static XComposeStatus compose;
+  KeySym keysym;
   int charcount;
 #ifdef USE_XIM
   static gchar* buf = NULL;
@@ -1767,16 +1768,16 @@ gdk_event_translate (GdkEvent *event,
          buf_len = 128;
          buf = g_new (gchar, buf_len);
        }
+      keysym = GDK_VoidSymbol;
+
       if (xim_using == TRUE && xim_ic)
        {
          Status status;
          
          /* Clear keyval. Depending on status, may not be set */
-         event->key.keyval = GDK_VoidSymbol;
          charcount = XmbLookupString(xim_ic->xic,
                                      &xevent->xkey, buf, buf_len-1,
-                                     (KeySym*) &event->key.keyval,
-                                     &status);
+                                     &keysym, &status);
          if (status == XBufferOverflow)
            {                     /* retry */
              /* alloc adequate size of buffer */
@@ -1789,8 +1790,7 @@ gdk_event_translate (GdkEvent *event,
             
              charcount = XmbLookupString (xim_ic->xic,
                                           &xevent->xkey, buf, buf_len-1,
-                                          (KeySym*) &event->key.keyval,
-                                          &status);
+                                          &keysym, &status);
            }
          if (status == XLookupNone)
            {
@@ -1800,13 +1800,13 @@ gdk_event_translate (GdkEvent *event,
        }
       else
        charcount = XLookupString (&xevent->xkey, buf, buf_len,
-                                  (KeySym*) &event->key.keyval,
-                                  &compose);
+                                  &keysym, &compose);
 #else
       charcount = XLookupString (&xevent->xkey, buf, 16,
-                                (KeySym*) &event->key.keyval,
-                                &compose);
+                                &keysym, &compose);
 #endif
+      event->key.keyval = keysym;
+
       if (charcount > 0 && buf[charcount-1] == '\0')
        charcount --;
       else
@@ -1844,9 +1844,10 @@ gdk_event_translate (GdkEvent *event,
     case KeyRelease:
       /* Lookup the string corresponding to the given keysym.
        */
+      keysym = GDK_VoidSymbol;
       charcount = XLookupString (&xevent->xkey, buf, 16,
-                                (KeySym*) &event->key.keyval,
-                                &compose);
+                                &keysym, &compose);
+      event->key.keyval = keysym;      
 
       /* Print debugging info.
        */
index 2f2cdea4c0f3ce328c65a6d073360db20b6337d5..a7045d19fcf3548cf3ea94d1d0fdece991addc04 100644 (file)
@@ -237,12 +237,15 @@ gdk_pixmap_read_string (FILE  *infile,
                        guint *buffer_size)
 {
   gint c;
-  guint cnt = 0;
+  guint cnt = 0, bufsiz, ret = FALSE;
+  gchar *buf;
 
-  if ((*buffer) == NULL)
+  buf = *buffer;
+  bufsiz = *buffer_size;
+  if (buf == NULL)
     {
-      (*buffer_size) = 10 * sizeof (gchar);
-      (*buffer) = g_new(gchar, *buffer_size);
+      bufsiz = 10 * sizeof (gchar);
+      buf = g_new(gchar, bufsiz);
     }
 
   do
@@ -250,31 +253,37 @@ gdk_pixmap_read_string (FILE  *infile,
   while (c != EOF && c != '"');
 
   if (c != '"')
-    return FALSE;
+    goto out;
 
   while ((c = getc(infile)) != EOF)
     {
-      if (cnt == (*buffer_size))
+      if (cnt == bufsiz)
        {
-         guint new_size = (*buffer_size) * 2;
-         if (new_size > (*buffer_size))
-           *buffer_size = new_size;
+         guint new_size = bufsiz * 2;
+         if (new_size > bufsiz)
+           bufsiz = new_size;
          else
-           return FALSE;
+           goto out;
          
-         (*buffer) = (gchar *) g_realloc ((*buffer), *buffer_size);    
+         buf = (gchar *) g_realloc (buf, bufsiz);
+         buf[bufsiz-1] = '\0';
        }
 
       if (c != '"')
-        (*buffer)[cnt++] = c;
+        buf[cnt++] = c;
       else
         {
-          (*buffer)[cnt++] = 0;
-          return TRUE;
+          buf[cnt] = 0;
+         ret = TRUE;
+         break;
         }
     }
 
-  return FALSE;
+ out:
+  buf[bufsiz-1] = '\0';                /* ensure null termination for errors */
+  *buffer = buf;
+  *buffer_size = bufsiz;
+  return ret;
 }
 
 gchar*
@@ -299,12 +308,16 @@ gdk_pixmap_skip_string (gchar *buffer)
   return &buffer[index];
 }
 
+/* Xlib crashed ince at a color name lengths around 125 */
+#define MAX_COLOR_LEN 120
+
 gchar*
 gdk_pixmap_extract_color (gchar *buffer)
 {
-  gint counter, finished = FALSE, numnames;
+  gint counter, numnames;
   gchar *ptr = NULL, ch, temp[128];
-  gchar color[128], *retcol;
+  gchar color[MAX_COLOR_LEN], *retcol;
+  gint space;
 
   counter = 0;
   while (ptr == NULL)
@@ -321,9 +334,6 @@ gdk_pixmap_extract_color (gchar *buffer)
       counter++;
     }
 
-  if (ptr == NULL)
-    return NULL;
-
   ptr = gdk_pixmap_skip_whitespaces (ptr);
 
   if (ptr[0] == 0)
@@ -337,18 +347,26 @@ gdk_pixmap_extract_color (gchar *buffer)
   color[0] = 0;
   numnames = 0;
 
-  while (finished == FALSE)
+  space = MAX_COLOR_LEN - 1;
+  while (space > 0)
     {
       sscanf (ptr, "%127s", temp);
 
-      if ((gint)ptr[0] == 0 || strcmp ("s", temp) == 0 || strcmp ("m", temp) == 0 ||
-          strcmp ("g", temp) == 0 || strcmp ("g4", temp) == 0)
-       finished = TRUE;
+      if (((gint)ptr[0] == 0) ||
+         (strcmp ("s", temp) == 0) || (strcmp ("m", temp) == 0) ||
+          (strcmp ("g", temp) == 0) || (strcmp ("g4", temp) == 0))
+       {
+         break;
+       }
       else
         {
           if (numnames > 0)
-            strcat (color, " ");
-          strcat (color, temp);
+           {
+             space -= 1;
+             strcat (color, " ");
+           }
+         strncat (color, temp, space);
+         space -= MIN (space, strlen (temp));
           ptr = gdk_pixmap_skip_string (ptr);
           ptr = gdk_pixmap_skip_whitespaces (ptr);
           numnames++;
@@ -359,214 +377,41 @@ gdk_pixmap_extract_color (gchar *buffer)
   return retcol;
 }
 
-
-GdkPixmap*
-gdk_pixmap_colormap_create_from_xpm (GdkWindow   *window,
-                                    GdkColormap *colormap,
-                                    GdkBitmap  **mask,
-                                    GdkColor    *transparent_color,
-                                    const gchar *filename)
+static void
+free_color (gpointer key, gpointer value, gpointer user_data)
 {
-  FILE *infile = NULL;
-  GdkPixmap *pixmap = NULL;
-  GdkImage *image = NULL;
-  GdkVisual *visual;
-  GdkGC *gc;
-  GdkColor tmp_color;
-  gint width, height, num_cols, cpp, cnt, n, ns, xcnt, ycnt;
-  gchar *buffer = NULL, pixel_str[32];
-  guint buffer_size = 0;
-  _GdkPixmapColor *colors = NULL, *color = NULL;
-  gulong index;
-
-  if ((window == NULL) && (colormap == NULL))
-    g_warning ("Creating pixmap from xpm with NULL window and colormap");
-
-  if (window == NULL)
-    window = (GdkWindow *)&gdk_root_parent;
-
-  if (colormap == NULL)
-    {
-      colormap = gdk_window_get_colormap (window);
-      visual = gdk_window_get_visual (window);
-    }
-  else
-    visual = ((GdkColormapPrivate *)colormap)->visual;
-
-  infile = fopen (filename, "rb");
-  if (infile != NULL)
-    {
-      if (gdk_pixmap_seek_string (infile, "XPM", FALSE) == TRUE)
-        {
-          if (gdk_pixmap_seek_char (infile,'{') == TRUE)
-            {
-              gdk_pixmap_seek_char (infile, '"');
-              fseek (infile, -1, SEEK_CUR);
-              gdk_pixmap_read_string (infile, &buffer, &buffer_size);
-
-              sscanf (buffer,"%d %d %d %d", &width, &height, &num_cols, &cpp);
-             if (cpp >= 32)
-               {
-                 g_warning ("Pixmap has more than 31 characters per color\n");
-                 return NULL;
-               }
-
-              colors = g_new(_GdkPixmapColor, num_cols);
-
-             if (transparent_color == NULL) 
-               {
-                 gdk_color_white (colormap, &tmp_color);
-                 transparent_color = &tmp_color;
-               }
-
-              for (cnt = 0; cnt < num_cols; cnt++)
-                {
-                 gchar *color_name;
-
-                  gdk_pixmap_seek_char (infile, '"');
-                  fseek (infile, -1, SEEK_CUR);
-                  gdk_pixmap_read_string (infile, &buffer, &buffer_size);
-
-                  colors[cnt].color_string = g_new(gchar, cpp + 1);
-                  for (n = 0; n < cpp; n++)
-                    colors[cnt].color_string[n] = buffer[n];
-                  colors[cnt].color_string[n] = 0;
-                 colors[cnt].transparent = FALSE;
-
-                  color_name = gdk_pixmap_extract_color (&buffer[cpp]);
-
-                  if (color_name != NULL)
-                    {
-                      if (gdk_color_parse (color_name, &colors[cnt].color) == FALSE)
-                       {
-                         colors[cnt].color = *transparent_color;
-                         colors[cnt].transparent = TRUE;
-                       }
-                    }
-                  else
-                   {
-                     colors[cnt].color = *transparent_color;
-                     colors[cnt].transparent = TRUE;
-                   }
-
-                 g_free (color_name);
-
-                  gdk_color_alloc (colormap, &colors[cnt].color);
-                }
-
-              index = 0;
-              image = gdk_image_new (GDK_IMAGE_FASTEST, visual, width, height);
-
-             gc = NULL;
-             if (mask)
-               {
-                 /* The pixmap mask is just a bits pattern.
-                  * Color 0 is used for background and 1 for foreground.
-                  * We don't care about the colormap, we just need 0 and 1.
-                  */
-                 GdkColor mask_pattern;
-                 
-                 *mask = gdk_pixmap_new (window, width, height, 1);
-                 gc = gdk_gc_new (*mask);
-                 
-                 mask_pattern.pixel = 0;
-                 gdk_gc_set_foreground (gc, &mask_pattern);
-                 gdk_draw_rectangle (*mask, gc, TRUE, 0, 0, -1, -1);
-                 
-                 mask_pattern.pixel = 1;
-                 gdk_gc_set_foreground (gc, &mask_pattern);
-               }
-
-              for (ycnt = 0; ycnt < height; ycnt++)
-                {
-                  gdk_pixmap_read_string (infile, &buffer, &buffer_size);
-
-                  for (n = 0, cnt = 0, xcnt = 0; n < (width * cpp); n += cpp, xcnt++)
-                    {
-                      strncpy (pixel_str, &buffer[n], cpp);
-                      pixel_str[cpp] = 0;
-                      color = NULL;
-                      ns = 0;
-
-                      while ((color == NULL) && (ns < num_cols))
-                        {
-                          if (strcmp (pixel_str, colors[ns].color_string) == 0)
-                            color = &colors[ns];
-                          else
-                            ns++;
-                        }
-
-                     if (!color) /* screwed up XPM file */
-                       color = &colors[0];
-
-                      gdk_image_put_pixel (image, xcnt, ycnt, color->color.pixel);
-
-                     if (mask && color->transparent)
-                       {
-                         if (cnt < xcnt)
-                           gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);
-                         cnt = xcnt + 1;
-                       }
-                    }
-
-                 if (mask && (cnt < xcnt))
-                   gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);
-                }
-
-             if (mask)
-               gdk_gc_destroy (gc);
-
-              pixmap = gdk_pixmap_new (window, width, height, visual->depth);
-
-              gc = gdk_gc_new (pixmap);
-              gdk_gc_set_foreground (gc, transparent_color);
-              gdk_draw_image (pixmap, gc, image, 0, 0, 0, 0, image->width, image->height);
-              gdk_gc_destroy (gc);
-              gdk_image_destroy (image);
-            }
-        }
-
-      fclose (infile);
-      free (buffer);
-
-      if (colors != NULL)
-        {
-          for (cnt = 0; cnt < num_cols; cnt++)
-            g_free (colors[cnt].color_string);
-          g_free (colors);
-        }
-    }
-
-  return pixmap;
+  g_free (key);
+  g_free (value);
 }
+  
 
-GdkPixmap*
-gdk_pixmap_create_from_xpm (GdkWindow  *window,
-                           GdkBitmap **mask,
-                           GdkColor   *transparent_color,
-                           const gchar *filename)
+enum buffer_op
 {
-  return gdk_pixmap_colormap_create_from_xpm (window, NULL, mask, 
-                                      transparent_color, filename);
-}
-
-
-GdkPixmap*
-gdk_pixmap_colormap_create_from_xpm_d (GdkWindow  *window,
-                                      GdkColormap *colormap,
-                                      GdkBitmap **mask,
-                                      GdkColor   *transparent_color,
-                                      gchar     **data)
+  op_header,
+  op_cmap,
+  op_body
+};
+  
+  
+static GdkPixmap *
+_gdk_pixmap_create_from_xpm (GdkWindow  *window,
+                            GdkColormap *colormap,
+                            GdkBitmap **mask,
+                            GdkColor   *transparent_color,
+                            gchar *   (*get_buf) (enum buffer_op op,
+                                                  gpointer       handle),
+                            gpointer    handle)
 {
   GdkPixmap *pixmap = NULL;
   GdkImage *image = NULL;
   GdkVisual *visual;
   GdkGC *gc;
   GdkColor tmp_color;
-  gint width, height, num_cols, cpp, cnt, n, ns, xcnt, ycnt, i;
+  gint width, height, num_cols, cpp, n, ns, cnt, xcnt, ycnt, wbytes;
   gchar *buffer, pixel_str[32];
-  _GdkPixmapColor *colors = NULL, *color = NULL;
+  _GdkPixmapColor *color = NULL, *fallbackcolor = NULL;
   gulong index;
+  GHashTable *colors = NULL;
 
   if ((window == NULL) && (colormap == NULL))
     g_warning ("Creating pixmap from xpm with NULL window and colormap");
@@ -582,54 +427,57 @@ gdk_pixmap_colormap_create_from_xpm_d (GdkWindow  *window,
   else
     visual = ((GdkColormapPrivate *)colormap)->visual;
 
-  i = 0;
-  buffer = data[i++];
+  buffer = (*get_buf) (op_header, handle);
+  if (buffer == NULL)
+    return NULL;
+
   sscanf (buffer,"%d %d %d %d", &width, &height, &num_cols, &cpp);
   if (cpp >= 32)
     {
       g_warning ("Pixmap has more than 31 characters per color\n");
       return NULL;
     }
-
-  colors = g_new(_GdkPixmapColor, num_cols);
-
-  if (transparent_color == NULL) 
-    {
-      gdk_color_white (colormap, &tmp_color);
-      transparent_color = &tmp_color;
+  
+  colors = g_hash_table_new (g_str_hash, g_str_equal);
+  
+  if (transparent_color == NULL)
+      {
+        gdk_color_white (colormap, &tmp_color);
+        transparent_color = &tmp_color;
     }
 
   for (cnt = 0; cnt < num_cols; cnt++)
     {
       gchar *color_name;
 
-      buffer = data[i++];
+      buffer = (*get_buf) (op_cmap, handle);
+      if (buffer == NULL)
+       goto error;
 
-      colors[cnt].color_string = g_new(gchar, cpp + 1);
-      for (n = 0; n < cpp; n++)
-       colors[cnt].color_string[n] = buffer[n];
-      colors[cnt].color_string[n] = 0;
-      colors[cnt].transparent = FALSE;
+      color = g_new (_GdkPixmapColor, 1);
+      color->color_string = g_new(gchar, cpp + 1);
+      strncpy (color->color_string, buffer, cpp);
+      color->color_string[cpp] = 0;
+      buffer += strlen (color->color_string);
+      color->transparent = FALSE;
 
-      color_name = gdk_pixmap_extract_color (&buffer[cpp]);
+      color_name = gdk_pixmap_extract_color (buffer);
 
-      if (color_name != NULL)
-       {
-         if (gdk_color_parse (color_name, &colors[cnt].color) == FALSE)
-           {
-             colors[cnt].color = *transparent_color;
-             colors[cnt].transparent = TRUE;
-           }
-       }
-      else
+      if (color_name == NULL ||
+         gdk_color_parse (color_name, &color->color) == FALSE)
        {
-         colors[cnt].color = *transparent_color;
-         colors[cnt].transparent = TRUE;
+         color->color = *transparent_color;
+         color->transparent = TRUE;
        }
 
       g_free (color_name);
 
-      gdk_color_alloc (colormap, &colors[cnt].color);
+      /* FIXME: The remaining slowness appears to happen in this
+         function. */
+      gdk_color_alloc (colormap, &color->color);
+      g_hash_table_insert (colors, color->color_string, color);
+      if (cnt == 0)
+       fallbackcolor = color;
     }
 
   index = 0;
@@ -655,27 +503,28 @@ gdk_pixmap_colormap_create_from_xpm_d (GdkWindow  *window,
       gdk_gc_set_foreground (gc, &mask_pattern);
     }
 
+  wbytes = width * cpp;
   for (ycnt = 0; ycnt < height; ycnt++)
     {
-      buffer = data[i++];
+      buffer = (*get_buf) (op_body, handle);
 
-      for (n = 0, cnt = 0, xcnt = 0; n < (width * cpp); n += cpp, xcnt++)
+      /* FIXME: this slows things down a little - it could be
+       * integrated into the strncpy below, perhaps. OTOH, strlen
+       * is fast.
+       */
+      if ((buffer == NULL) || strlen (buffer) < wbytes)
+       continue;
+
+      for (n = 0, cnt = 0, xcnt = 0; n < wbytes; n += cpp, xcnt++)
        {
          strncpy (pixel_str, &buffer[n], cpp);
          pixel_str[cpp] = 0;
-         color = NULL;
          ns = 0;
 
-         while ((color == NULL) && (ns < num_cols))
-           {
-             if (strcmp (pixel_str, colors[ns].color_string) == 0)
-               color = &colors[ns];
-             else
-               ns++;
-           }
+         color = g_hash_table_lookup (colors, pixel_str);
 
          if (!color) /* screwed up XPM file */
-           color = &colors[0];
+           color = fallbackcolor;
 
          gdk_image_put_pixel (image, xcnt, ycnt, color->color.pixel);
 
@@ -691,27 +540,145 @@ gdk_pixmap_colormap_create_from_xpm_d (GdkWindow  *window,
        gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);
     }
 
+ error:
+
   if (mask)
     gdk_gc_destroy (gc);
 
-  pixmap = gdk_pixmap_new (window, width, height, visual->depth);
+  if (image != NULL)
+    {
+      pixmap = gdk_pixmap_new (window, width, height, visual->depth);
 
-  gc = gdk_gc_new (pixmap);
-  gdk_gc_set_foreground (gc, transparent_color);
-  gdk_draw_image (pixmap, gc, image, 0, 0, 0, 0, image->width, image->height);
-  gdk_gc_destroy (gc);
-  gdk_image_destroy (image);
+      gc = gdk_gc_new (pixmap);
+      gdk_gc_set_foreground (gc, transparent_color);
+      gdk_draw_image (pixmap, gc, image, 0, 0, 0, 0, image->width, image->height);
+      gdk_gc_destroy (gc);
+      gdk_image_destroy (image);
+    }
 
   if (colors != NULL)
     {
-      for (cnt = 0; cnt < num_cols; cnt++)
-       g_free (colors[cnt].color_string);
-      g_free (colors);
+      g_hash_table_foreach (colors, free_color, 0);
+      g_hash_table_destroy (colors);
+    }
+
+  return pixmap;
+}
+
+
+struct file_handle
+{
+  FILE *infile;
+  gchar *buffer;
+  guint buffer_size;
+};
+
+
+static gchar *
+file_buffer (enum buffer_op op, gpointer handle)
+{
+  struct file_handle *h = handle;
+
+  switch (op)
+    {
+    case op_header:
+      if (gdk_pixmap_seek_string (h->infile, "XPM", FALSE) != TRUE)
+       break;
+
+      if (gdk_pixmap_seek_char (h->infile,'{') != TRUE)
+       break;
+      /* Fall through to the next gdk_pixmap_seek_char. */
+
+    case op_cmap:
+      gdk_pixmap_seek_char (h->infile, '"');
+      fseek (h->infile, -1, SEEK_CUR);
+      /* Fall through to the gdk_pixmap_read_string. */
+
+    case op_body:
+      gdk_pixmap_read_string (h->infile, &h->buffer, &h->buffer_size);
+      return h->buffer;
+    }
+  return 0;
+}
+
+
+GdkPixmap*
+gdk_pixmap_colormap_create_from_xpm (GdkWindow   *window,
+                                    GdkColormap *colormap,
+                                    GdkBitmap  **mask,
+                                    GdkColor    *transparent_color,
+                                    const gchar *filename)
+{
+  struct file_handle h;
+  GdkPixmap *pixmap = NULL;
+
+  memset (&h, 0, sizeof (h));
+  h.infile = fopen (filename, "rb");
+  if (h.infile != NULL)
+    {
+      pixmap = _gdk_pixmap_create_from_xpm (window, colormap, mask,
+                                           transparent_color,
+                                           file_buffer, &h);
+      fclose (h.infile);
+      g_free (h.buffer);
+    }
+
+  return pixmap;
+}
+>
+GdkPixmap*
+gdk_pixmap_create_from_xpm (GdkWindow  *window,
+                           GdkBitmap **mask,
+                           GdkColor   *transparent_color,
+                           const gchar *filename)
+{
+  return gdk_pixmap_colormap_create_from_xpm (window, NULL, mask,
+                                      transparent_color, filename);
+}
+
+
+struct mem_handle
+{
+  gchar **data;
+  int offset;
+};
+
+
+static gchar *
+mem_buffer (enum buffer_op op, gpointer handle)
+{
+  struct mem_handle *h = handle;
+  switch (op)
+    {
+    case op_header:
+    case op_cmap:
+    case op_body:
+      if (h->data[h->offset])
+       return h->data[h->offset ++];
     }
+  return 0;
+}
+
 
+GdkPixmap*
+gdk_pixmap_colormap_create_from_xpm_d (GdkWindow  *window,
+                                      GdkColormap *colormap,
+                                      GdkBitmap **mask,
+                                      GdkColor   *transparent_color,
+                                      gchar     **data)
+{
+  struct mem_handle h;
+  GdkPixmap *pixmap = NULL;
+
+  memset (&h, 0, sizeof (h));
+  h.data = data;
+  pixmap = _gdk_pixmap_create_from_xpm (window, colormap, mask,
+                                       transparent_color,
+                                       mem_buffer, &h);
   return pixmap;
 }
 
+
 GdkPixmap*
 gdk_pixmap_create_from_xpm_d (GdkWindow  *window,
                              GdkBitmap **mask,
index bfb1070ecc8eb1cbfad3da58dfae67c85d8766c0..8b9768b2d517555ab4ac88a3bf5db3a8a2fe1218 100644 (file)
@@ -1685,7 +1685,8 @@ gdk_event_translate (GdkEvent *event,
 
   GdkWindow *window;
   GdkWindowPrivate *window_private;
-  XComposeStatus compose;
+  static XComposeStatus compose;
+  KeySym keysym;
   int charcount;
 #ifdef USE_XIM
   static gchar* buf = NULL;
@@ -1767,16 +1768,16 @@ gdk_event_translate (GdkEvent *event,
          buf_len = 128;
          buf = g_new (gchar, buf_len);
        }
+      keysym = GDK_VoidSymbol;
+
       if (xim_using == TRUE && xim_ic)
        {
          Status status;
          
          /* Clear keyval. Depending on status, may not be set */
-         event->key.keyval = GDK_VoidSymbol;
          charcount = XmbLookupString(xim_ic->xic,
                                      &xevent->xkey, buf, buf_len-1,
-                                     (KeySym*) &event->key.keyval,
-                                     &status);
+                                     &keysym, &status);
          if (status == XBufferOverflow)
            {                     /* retry */
              /* alloc adequate size of buffer */
@@ -1789,8 +1790,7 @@ gdk_event_translate (GdkEvent *event,
             
              charcount = XmbLookupString (xim_ic->xic,
                                           &xevent->xkey, buf, buf_len-1,
-                                          (KeySym*) &event->key.keyval,
-                                          &status);
+                                          &keysym, &status);
            }
          if (status == XLookupNone)
            {
@@ -1800,13 +1800,13 @@ gdk_event_translate (GdkEvent *event,
        }
       else
        charcount = XLookupString (&xevent->xkey, buf, buf_len,
-                                  (KeySym*) &event->key.keyval,
-                                  &compose);
+                                  &keysym, &compose);
 #else
       charcount = XLookupString (&xevent->xkey, buf, 16,
-                                (KeySym*) &event->key.keyval,
-                                &compose);
+                                &keysym, &compose);
 #endif
+      event->key.keyval = keysym;
+
       if (charcount > 0 && buf[charcount-1] == '\0')
        charcount --;
       else
@@ -1844,9 +1844,10 @@ gdk_event_translate (GdkEvent *event,
     case KeyRelease:
       /* Lookup the string corresponding to the given keysym.
        */
+      keysym = GDK_VoidSymbol;
       charcount = XLookupString (&xevent->xkey, buf, 16,
-                                (KeySym*) &event->key.keyval,
-                                &compose);
+                                &keysym, &compose);
+      event->key.keyval = keysym;      
 
       /* Print debugging info.
        */
index 2f2cdea4c0f3ce328c65a6d073360db20b6337d5..a7045d19fcf3548cf3ea94d1d0fdece991addc04 100644 (file)
@@ -237,12 +237,15 @@ gdk_pixmap_read_string (FILE  *infile,
                        guint *buffer_size)
 {
   gint c;
-  guint cnt = 0;
+  guint cnt = 0, bufsiz, ret = FALSE;
+  gchar *buf;
 
-  if ((*buffer) == NULL)
+  buf = *buffer;
+  bufsiz = *buffer_size;
+  if (buf == NULL)
     {
-      (*buffer_size) = 10 * sizeof (gchar);
-      (*buffer) = g_new(gchar, *buffer_size);
+      bufsiz = 10 * sizeof (gchar);
+      buf = g_new(gchar, bufsiz);
     }
 
   do
@@ -250,31 +253,37 @@ gdk_pixmap_read_string (FILE  *infile,
   while (c != EOF && c != '"');
 
   if (c != '"')
-    return FALSE;
+    goto out;
 
   while ((c = getc(infile)) != EOF)
     {
-      if (cnt == (*buffer_size))
+      if (cnt == bufsiz)
        {
-         guint new_size = (*buffer_size) * 2;
-         if (new_size > (*buffer_size))
-           *buffer_size = new_size;
+         guint new_size = bufsiz * 2;
+         if (new_size > bufsiz)
+           bufsiz = new_size;
          else
-           return FALSE;
+           goto out;
          
-         (*buffer) = (gchar *) g_realloc ((*buffer), *buffer_size);    
+         buf = (gchar *) g_realloc (buf, bufsiz);
+         buf[bufsiz-1] = '\0';
        }
 
       if (c != '"')
-        (*buffer)[cnt++] = c;
+        buf[cnt++] = c;
       else
         {
-          (*buffer)[cnt++] = 0;
-          return TRUE;
+          buf[cnt] = 0;
+         ret = TRUE;
+         break;
         }
     }
 
-  return FALSE;
+ out:
+  buf[bufsiz-1] = '\0';                /* ensure null termination for errors */
+  *buffer = buf;
+  *buffer_size = bufsiz;
+  return ret;
 }
 
 gchar*
@@ -299,12 +308,16 @@ gdk_pixmap_skip_string (gchar *buffer)
   return &buffer[index];
 }
 
+/* Xlib crashed ince at a color name lengths around 125 */
+#define MAX_COLOR_LEN 120
+
 gchar*
 gdk_pixmap_extract_color (gchar *buffer)
 {
-  gint counter, finished = FALSE, numnames;
+  gint counter, numnames;
   gchar *ptr = NULL, ch, temp[128];
-  gchar color[128], *retcol;
+  gchar color[MAX_COLOR_LEN], *retcol;
+  gint space;
 
   counter = 0;
   while (ptr == NULL)
@@ -321,9 +334,6 @@ gdk_pixmap_extract_color (gchar *buffer)
       counter++;
     }
 
-  if (ptr == NULL)
-    return NULL;
-
   ptr = gdk_pixmap_skip_whitespaces (ptr);
 
   if (ptr[0] == 0)
@@ -337,18 +347,26 @@ gdk_pixmap_extract_color (gchar *buffer)
   color[0] = 0;
   numnames = 0;
 
-  while (finished == FALSE)
+  space = MAX_COLOR_LEN - 1;
+  while (space > 0)
     {
       sscanf (ptr, "%127s", temp);
 
-      if ((gint)ptr[0] == 0 || strcmp ("s", temp) == 0 || strcmp ("m", temp) == 0 ||
-          strcmp ("g", temp) == 0 || strcmp ("g4", temp) == 0)
-       finished = TRUE;
+      if (((gint)ptr[0] == 0) ||
+         (strcmp ("s", temp) == 0) || (strcmp ("m", temp) == 0) ||
+          (strcmp ("g", temp) == 0) || (strcmp ("g4", temp) == 0))
+       {
+         break;
+       }
       else
         {
           if (numnames > 0)
-            strcat (color, " ");
-          strcat (color, temp);
+           {
+             space -= 1;
+             strcat (color, " ");
+           }
+         strncat (color, temp, space);
+         space -= MIN (space, strlen (temp));
           ptr = gdk_pixmap_skip_string (ptr);
           ptr = gdk_pixmap_skip_whitespaces (ptr);
           numnames++;
@@ -359,214 +377,41 @@ gdk_pixmap_extract_color (gchar *buffer)
   return retcol;
 }
 
-
-GdkPixmap*
-gdk_pixmap_colormap_create_from_xpm (GdkWindow   *window,
-                                    GdkColormap *colormap,
-                                    GdkBitmap  **mask,
-                                    GdkColor    *transparent_color,
-                                    const gchar *filename)
+static void
+free_color (gpointer key, gpointer value, gpointer user_data)
 {
-  FILE *infile = NULL;
-  GdkPixmap *pixmap = NULL;
-  GdkImage *image = NULL;
-  GdkVisual *visual;
-  GdkGC *gc;
-  GdkColor tmp_color;
-  gint width, height, num_cols, cpp, cnt, n, ns, xcnt, ycnt;
-  gchar *buffer = NULL, pixel_str[32];
-  guint buffer_size = 0;
-  _GdkPixmapColor *colors = NULL, *color = NULL;
-  gulong index;
-
-  if ((window == NULL) && (colormap == NULL))
-    g_warning ("Creating pixmap from xpm with NULL window and colormap");
-
-  if (window == NULL)
-    window = (GdkWindow *)&gdk_root_parent;
-
-  if (colormap == NULL)
-    {
-      colormap = gdk_window_get_colormap (window);
-      visual = gdk_window_get_visual (window);
-    }
-  else
-    visual = ((GdkColormapPrivate *)colormap)->visual;
-
-  infile = fopen (filename, "rb");
-  if (infile != NULL)
-    {
-      if (gdk_pixmap_seek_string (infile, "XPM", FALSE) == TRUE)
-        {
-          if (gdk_pixmap_seek_char (infile,'{') == TRUE)
-            {
-              gdk_pixmap_seek_char (infile, '"');
-              fseek (infile, -1, SEEK_CUR);
-              gdk_pixmap_read_string (infile, &buffer, &buffer_size);
-
-              sscanf (buffer,"%d %d %d %d", &width, &height, &num_cols, &cpp);
-             if (cpp >= 32)
-               {
-                 g_warning ("Pixmap has more than 31 characters per color\n");
-                 return NULL;
-               }
-
-              colors = g_new(_GdkPixmapColor, num_cols);
-
-             if (transparent_color == NULL) 
-               {
-                 gdk_color_white (colormap, &tmp_color);
-                 transparent_color = &tmp_color;
-               }
-
-              for (cnt = 0; cnt < num_cols; cnt++)
-                {
-                 gchar *color_name;
-
-                  gdk_pixmap_seek_char (infile, '"');
-                  fseek (infile, -1, SEEK_CUR);
-                  gdk_pixmap_read_string (infile, &buffer, &buffer_size);
-
-                  colors[cnt].color_string = g_new(gchar, cpp + 1);
-                  for (n = 0; n < cpp; n++)
-                    colors[cnt].color_string[n] = buffer[n];
-                  colors[cnt].color_string[n] = 0;
-                 colors[cnt].transparent = FALSE;
-
-                  color_name = gdk_pixmap_extract_color (&buffer[cpp]);
-
-                  if (color_name != NULL)
-                    {
-                      if (gdk_color_parse (color_name, &colors[cnt].color) == FALSE)
-                       {
-                         colors[cnt].color = *transparent_color;
-                         colors[cnt].transparent = TRUE;
-                       }
-                    }
-                  else
-                   {
-                     colors[cnt].color = *transparent_color;
-                     colors[cnt].transparent = TRUE;
-                   }
-
-                 g_free (color_name);
-
-                  gdk_color_alloc (colormap, &colors[cnt].color);
-                }
-
-              index = 0;
-              image = gdk_image_new (GDK_IMAGE_FASTEST, visual, width, height);
-
-             gc = NULL;
-             if (mask)
-               {
-                 /* The pixmap mask is just a bits pattern.
-                  * Color 0 is used for background and 1 for foreground.
-                  * We don't care about the colormap, we just need 0 and 1.
-                  */
-                 GdkColor mask_pattern;
-                 
-                 *mask = gdk_pixmap_new (window, width, height, 1);
-                 gc = gdk_gc_new (*mask);
-                 
-                 mask_pattern.pixel = 0;
-                 gdk_gc_set_foreground (gc, &mask_pattern);
-                 gdk_draw_rectangle (*mask, gc, TRUE, 0, 0, -1, -1);
-                 
-                 mask_pattern.pixel = 1;
-                 gdk_gc_set_foreground (gc, &mask_pattern);
-               }
-
-              for (ycnt = 0; ycnt < height; ycnt++)
-                {
-                  gdk_pixmap_read_string (infile, &buffer, &buffer_size);
-
-                  for (n = 0, cnt = 0, xcnt = 0; n < (width * cpp); n += cpp, xcnt++)
-                    {
-                      strncpy (pixel_str, &buffer[n], cpp);
-                      pixel_str[cpp] = 0;
-                      color = NULL;
-                      ns = 0;
-
-                      while ((color == NULL) && (ns < num_cols))
-                        {
-                          if (strcmp (pixel_str, colors[ns].color_string) == 0)
-                            color = &colors[ns];
-                          else
-                            ns++;
-                        }
-
-                     if (!color) /* screwed up XPM file */
-                       color = &colors[0];
-
-                      gdk_image_put_pixel (image, xcnt, ycnt, color->color.pixel);
-
-                     if (mask && color->transparent)
-                       {
-                         if (cnt < xcnt)
-                           gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);
-                         cnt = xcnt + 1;
-                       }
-                    }
-
-                 if (mask && (cnt < xcnt))
-                   gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);
-                }
-
-             if (mask)
-               gdk_gc_destroy (gc);
-
-              pixmap = gdk_pixmap_new (window, width, height, visual->depth);
-
-              gc = gdk_gc_new (pixmap);
-              gdk_gc_set_foreground (gc, transparent_color);
-              gdk_draw_image (pixmap, gc, image, 0, 0, 0, 0, image->width, image->height);
-              gdk_gc_destroy (gc);
-              gdk_image_destroy (image);
-            }
-        }
-
-      fclose (infile);
-      free (buffer);
-
-      if (colors != NULL)
-        {
-          for (cnt = 0; cnt < num_cols; cnt++)
-            g_free (colors[cnt].color_string);
-          g_free (colors);
-        }
-    }
-
-  return pixmap;
+  g_free (key);
+  g_free (value);
 }
+  
 
-GdkPixmap*
-gdk_pixmap_create_from_xpm (GdkWindow  *window,
-                           GdkBitmap **mask,
-                           GdkColor   *transparent_color,
-                           const gchar *filename)
+enum buffer_op
 {
-  return gdk_pixmap_colormap_create_from_xpm (window, NULL, mask, 
-                                      transparent_color, filename);
-}
-
-
-GdkPixmap*
-gdk_pixmap_colormap_create_from_xpm_d (GdkWindow  *window,
-                                      GdkColormap *colormap,
-                                      GdkBitmap **mask,
-                                      GdkColor   *transparent_color,
-                                      gchar     **data)
+  op_header,
+  op_cmap,
+  op_body
+};
+  
+  
+static GdkPixmap *
+_gdk_pixmap_create_from_xpm (GdkWindow  *window,
+                            GdkColormap *colormap,
+                            GdkBitmap **mask,
+                            GdkColor   *transparent_color,
+                            gchar *   (*get_buf) (enum buffer_op op,
+                                                  gpointer       handle),
+                            gpointer    handle)
 {
   GdkPixmap *pixmap = NULL;
   GdkImage *image = NULL;
   GdkVisual *visual;
   GdkGC *gc;
   GdkColor tmp_color;
-  gint width, height, num_cols, cpp, cnt, n, ns, xcnt, ycnt, i;
+  gint width, height, num_cols, cpp, n, ns, cnt, xcnt, ycnt, wbytes;
   gchar *buffer, pixel_str[32];
-  _GdkPixmapColor *colors = NULL, *color = NULL;
+  _GdkPixmapColor *color = NULL, *fallbackcolor = NULL;
   gulong index;
+  GHashTable *colors = NULL;
 
   if ((window == NULL) && (colormap == NULL))
     g_warning ("Creating pixmap from xpm with NULL window and colormap");
@@ -582,54 +427,57 @@ gdk_pixmap_colormap_create_from_xpm_d (GdkWindow  *window,
   else
     visual = ((GdkColormapPrivate *)colormap)->visual;
 
-  i = 0;
-  buffer = data[i++];
+  buffer = (*get_buf) (op_header, handle);
+  if (buffer == NULL)
+    return NULL;
+
   sscanf (buffer,"%d %d %d %d", &width, &height, &num_cols, &cpp);
   if (cpp >= 32)
     {
       g_warning ("Pixmap has more than 31 characters per color\n");
       return NULL;
     }
-
-  colors = g_new(_GdkPixmapColor, num_cols);
-
-  if (transparent_color == NULL) 
-    {
-      gdk_color_white (colormap, &tmp_color);
-      transparent_color = &tmp_color;
+  
+  colors = g_hash_table_new (g_str_hash, g_str_equal);
+  
+  if (transparent_color == NULL)
+      {
+        gdk_color_white (colormap, &tmp_color);
+        transparent_color = &tmp_color;
     }
 
   for (cnt = 0; cnt < num_cols; cnt++)
     {
       gchar *color_name;
 
-      buffer = data[i++];
+      buffer = (*get_buf) (op_cmap, handle);
+      if (buffer == NULL)
+       goto error;
 
-      colors[cnt].color_string = g_new(gchar, cpp + 1);
-      for (n = 0; n < cpp; n++)
-       colors[cnt].color_string[n] = buffer[n];
-      colors[cnt].color_string[n] = 0;
-      colors[cnt].transparent = FALSE;
+      color = g_new (_GdkPixmapColor, 1);
+      color->color_string = g_new(gchar, cpp + 1);
+      strncpy (color->color_string, buffer, cpp);
+      color->color_string[cpp] = 0;
+      buffer += strlen (color->color_string);
+      color->transparent = FALSE;
 
-      color_name = gdk_pixmap_extract_color (&buffer[cpp]);
+      color_name = gdk_pixmap_extract_color (buffer);
 
-      if (color_name != NULL)
-       {
-         if (gdk_color_parse (color_name, &colors[cnt].color) == FALSE)
-           {
-             colors[cnt].color = *transparent_color;
-             colors[cnt].transparent = TRUE;
-           }
-       }
-      else
+      if (color_name == NULL ||
+         gdk_color_parse (color_name, &color->color) == FALSE)
        {
-         colors[cnt].color = *transparent_color;
-         colors[cnt].transparent = TRUE;
+         color->color = *transparent_color;
+         color->transparent = TRUE;
        }
 
       g_free (color_name);
 
-      gdk_color_alloc (colormap, &colors[cnt].color);
+      /* FIXME: The remaining slowness appears to happen in this
+         function. */
+      gdk_color_alloc (colormap, &color->color);
+      g_hash_table_insert (colors, color->color_string, color);
+      if (cnt == 0)
+       fallbackcolor = color;
     }
 
   index = 0;
@@ -655,27 +503,28 @@ gdk_pixmap_colormap_create_from_xpm_d (GdkWindow  *window,
       gdk_gc_set_foreground (gc, &mask_pattern);
     }
 
+  wbytes = width * cpp;
   for (ycnt = 0; ycnt < height; ycnt++)
     {
-      buffer = data[i++];
+      buffer = (*get_buf) (op_body, handle);
 
-      for (n = 0, cnt = 0, xcnt = 0; n < (width * cpp); n += cpp, xcnt++)
+      /* FIXME: this slows things down a little - it could be
+       * integrated into the strncpy below, perhaps. OTOH, strlen
+       * is fast.
+       */
+      if ((buffer == NULL) || strlen (buffer) < wbytes)
+       continue;
+
+      for (n = 0, cnt = 0, xcnt = 0; n < wbytes; n += cpp, xcnt++)
        {
          strncpy (pixel_str, &buffer[n], cpp);
          pixel_str[cpp] = 0;
-         color = NULL;
          ns = 0;
 
-         while ((color == NULL) && (ns < num_cols))
-           {
-             if (strcmp (pixel_str, colors[ns].color_string) == 0)
-               color = &colors[ns];
-             else
-               ns++;
-           }
+         color = g_hash_table_lookup (colors, pixel_str);
 
          if (!color) /* screwed up XPM file */
-           color = &colors[0];
+           color = fallbackcolor;
 
          gdk_image_put_pixel (image, xcnt, ycnt, color->color.pixel);
 
@@ -691,27 +540,145 @@ gdk_pixmap_colormap_create_from_xpm_d (GdkWindow  *window,
        gdk_draw_line (*mask, gc, cnt, ycnt, xcnt - 1, ycnt);
     }
 
+ error:
+
   if (mask)
     gdk_gc_destroy (gc);
 
-  pixmap = gdk_pixmap_new (window, width, height, visual->depth);
+  if (image != NULL)
+    {
+      pixmap = gdk_pixmap_new (window, width, height, visual->depth);
 
-  gc = gdk_gc_new (pixmap);
-  gdk_gc_set_foreground (gc, transparent_color);
-  gdk_draw_image (pixmap, gc, image, 0, 0, 0, 0, image->width, image->height);
-  gdk_gc_destroy (gc);
-  gdk_image_destroy (image);
+      gc = gdk_gc_new (pixmap);
+      gdk_gc_set_foreground (gc, transparent_color);
+      gdk_draw_image (pixmap, gc, image, 0, 0, 0, 0, image->width, image->height);
+      gdk_gc_destroy (gc);
+      gdk_image_destroy (image);
+    }
 
   if (colors != NULL)
     {
-      for (cnt = 0; cnt < num_cols; cnt++)
-       g_free (colors[cnt].color_string);
-      g_free (colors);
+      g_hash_table_foreach (colors, free_color, 0);
+      g_hash_table_destroy (colors);
+    }
+
+  return pixmap;
+}
+
+
+struct file_handle
+{
+  FILE *infile;
+  gchar *buffer;
+  guint buffer_size;
+};
+
+
+static gchar *
+file_buffer (enum buffer_op op, gpointer handle)
+{
+  struct file_handle *h = handle;
+
+  switch (op)
+    {
+    case op_header:
+      if (gdk_pixmap_seek_string (h->infile, "XPM", FALSE) != TRUE)
+       break;
+
+      if (gdk_pixmap_seek_char (h->infile,'{') != TRUE)
+       break;
+      /* Fall through to the next gdk_pixmap_seek_char. */
+
+    case op_cmap:
+      gdk_pixmap_seek_char (h->infile, '"');
+      fseek (h->infile, -1, SEEK_CUR);
+      /* Fall through to the gdk_pixmap_read_string. */
+
+    case op_body:
+      gdk_pixmap_read_string (h->infile, &h->buffer, &h->buffer_size);
+      return h->buffer;
+    }
+  return 0;
+}
+
+
+GdkPixmap*
+gdk_pixmap_colormap_create_from_xpm (GdkWindow   *window,
+                                    GdkColormap *colormap,
+                                    GdkBitmap  **mask,
+                                    GdkColor    *transparent_color,
+                                    const gchar *filename)
+{
+  struct file_handle h;
+  GdkPixmap *pixmap = NULL;
+
+  memset (&h, 0, sizeof (h));
+  h.infile = fopen (filename, "rb");
+  if (h.infile != NULL)
+    {
+      pixmap = _gdk_pixmap_create_from_xpm (window, colormap, mask,
+                                           transparent_color,
+                                           file_buffer, &h);
+      fclose (h.infile);
+      g_free (h.buffer);
+    }
+
+  return pixmap;
+}
+>
+GdkPixmap*
+gdk_pixmap_create_from_xpm (GdkWindow  *window,
+                           GdkBitmap **mask,
+                           GdkColor   *transparent_color,
+                           const gchar *filename)
+{
+  return gdk_pixmap_colormap_create_from_xpm (window, NULL, mask,
+                                      transparent_color, filename);
+}
+
+
+struct mem_handle
+{
+  gchar **data;
+  int offset;
+};
+
+
+static gchar *
+mem_buffer (enum buffer_op op, gpointer handle)
+{
+  struct mem_handle *h = handle;
+  switch (op)
+    {
+    case op_header:
+    case op_cmap:
+    case op_body:
+      if (h->data[h->offset])
+       return h->data[h->offset ++];
     }
+  return 0;
+}
+
 
+GdkPixmap*
+gdk_pixmap_colormap_create_from_xpm_d (GdkWindow  *window,
+                                      GdkColormap *colormap,
+                                      GdkBitmap **mask,
+                                      GdkColor   *transparent_color,
+                                      gchar     **data)
+{
+  struct mem_handle h;
+  GdkPixmap *pixmap = NULL;
+
+  memset (&h, 0, sizeof (h));
+  h.data = data;
+  pixmap = _gdk_pixmap_create_from_xpm (window, colormap, mask,
+                                       transparent_color,
+                                       mem_buffer, &h);
   return pixmap;
 }
 
+
 GdkPixmap*
 gdk_pixmap_create_from_xpm_d (GdkWindow  *window,
                              GdkBitmap **mask,
index 1f4ae285eba90786f134ace3bc7126a8c4fc8e36..101255966a890d49372f08321e2ff2bac0e1ce2b 100644 (file)
@@ -498,7 +498,6 @@ g_mem_chunk_alloc (GMemChunk *mem_chunk)
               if (rmem_chunk->free_mem_area)
                 {
                   rmem_chunk->num_mem_areas -= 1;
-                  rmem_chunk->num_marked_areas -= 1;
 
                   if (temp_area->next)
                     temp_area->next->prev = temp_area->prev;
@@ -506,13 +505,15 @@ g_mem_chunk_alloc (GMemChunk *mem_chunk)
                     temp_area->prev->next = temp_area->next;
                   if (temp_area == rmem_chunk->mem_areas)
                     rmem_chunk->mem_areas = rmem_chunk->mem_areas->next;
-                  if (temp_area == rmem_chunk->mem_area)
-                    rmem_chunk->mem_area = NULL;
 
+                 if (rmem_chunk->type == G_ALLOC_AND_FREE)
+                   g_tree_remove (rmem_chunk->mem_tree, temp_area);
                   g_free (temp_area);
                 }
               else
                 rmem_chunk->free_mem_area = temp_area;
+             
+             rmem_chunk->num_marked_areas -= 1;
            }
        }
       else
@@ -562,23 +563,6 @@ g_mem_chunk_alloc (GMemChunk *mem_chunk)
       rmem_chunk->mem_area->allocated = 0;
       rmem_chunk->mem_area->mark = 0;
     }
-  else if (rmem_chunk->free_mem_area)
-    {
-      rmem_chunk->num_mem_areas -= 1;
-
-      if (rmem_chunk->free_mem_area->next)
-       rmem_chunk->free_mem_area->next->prev = rmem_chunk->free_mem_area->prev;
-      if (rmem_chunk->free_mem_area->prev)
-       rmem_chunk->free_mem_area->prev->next = rmem_chunk->free_mem_area->next;
-      if (rmem_chunk->free_mem_area == rmem_chunk->mem_areas)
-       rmem_chunk->mem_areas = rmem_chunk->mem_areas->next;
-
-      if (rmem_chunk->type == G_ALLOC_AND_FREE)
-       g_tree_remove (rmem_chunk->mem_tree, rmem_chunk->free_mem_area);
-
-      g_free (rmem_chunk->free_mem_area);
-      rmem_chunk->free_mem_area = NULL;
-    }
 
   /* Get the memory and modify the state variables appropriately.
    */
@@ -624,12 +608,11 @@ g_mem_chunk_free (GMemChunk *mem_chunk,
        {
          temp_area->mark = 1;
          rmem_chunk->num_marked_areas += 1;
-
-         g_mem_chunk_clean (mem_chunk);
        }
     }
 }
 
+/* This doesn't free the free_area if there is one */
 void
 g_mem_chunk_clean (GMemChunk *mem_chunk)
 {
index de7b350a02e00cc54dde4fb0e924a61fa291d4b3..966358db93c8aeb35b810ebee42e1c5043b4dc2b 100644 (file)
@@ -1116,7 +1116,7 @@ gtk_container_set_focus_vadjustment (GtkContainer  *container,
     g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
   if (adjustment)
-    gtk_object_ref (adjustment);
+    gtk_object_ref (GTK_OBJECT(adjustment));
 
   gtk_object_set_data_by_id_full (GTK_OBJECT (container),
                                  vadjustment_key_id,
@@ -1134,7 +1134,7 @@ gtk_container_set_focus_hadjustment (GtkContainer  *container,
     g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
   if (adjustment)
-    gtk_object_ref (adjustment);
+    gtk_object_ref (GTK_OBJECT (adjustment));
 
   gtk_object_set_data_by_id_full (GTK_OBJECT (container),
                                  hadjustment_key_id,
index 0b6691999f420f61d7c78f5db4cb980ac0113112..352c95b8e45ecfd76bdd670ec6a322096a619ee1 100644 (file)
@@ -110,7 +110,7 @@ gtk_drawing_area_realize (GtkWidget *widget)
   attributes.wclass = GDK_INPUT_OUTPUT;
   attributes.visual = gtk_widget_get_visual (widget);
   attributes.colormap = gtk_widget_get_colormap (widget);
-  attributes.event_mask = gtk_widget_get_events (widget);
+  attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;
 
   attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
 
index 105643948bcf53de9a80ec63731f49b44441c0cf..93cf32e577b1be2e197938cec8307cf003d05389 100644 (file)
@@ -2106,5 +2106,11 @@ gtk_entry_style_set      (GtkWidget      *widget,
       scroll_char = gtk_entry_find_position (entry, entry->scroll_offset);
       gtk_entry_recompute_offsets (GTK_ENTRY (widget));
       entry->scroll_offset = entry->char_offset[scroll_char];
+
+      gdk_window_set_background (widget->window, &widget->style->base[GTK_STATE_NORMAL]);
+      gdk_window_set_background (entry->text_area, &widget->style->base[GTK_STATE_NORMAL]);
     }
+
+  if (GTK_WIDGET_DRAWABLE (widget))
+    gdk_window_clear (widget->window);
 }
index 3f4dffa1a56440ea7ac0cabebd8158e1707af774..0f5e2c509a394756fbb16ec950664f39769af35c 100644 (file)
@@ -630,18 +630,20 @@ gtk_selection_clear (GtkWidget *widget,
       tmp_list = tmp_list->next;
     }
     
-  if (selection_info->time > event->time)
-    return FALSE;              /* return FALSE to indicate that
+  if (tmp_list)
+    {
+      if (selection_info->time > event->time)
+       return FALSE;           /* return FALSE to indicate that
                                 * the selection was out of date,
                                 * and this clear should be ignored */
-  else
-    if (tmp_list)
-      {
-       current_selections = g_list_remove_link (current_selections, tmp_list);
-       g_list_free (tmp_list);
-       g_free (selection_info);
-      }
-
+      else
+       {
+         current_selections = g_list_remove_link (current_selections, tmp_list);
+         g_list_free (tmp_list);
+         g_free (selection_info);
+       }
+    }
+  
   return TRUE;
 }
 
index 843fa465c274671af899f646a5d9ae854be63725..69b533c29aaca93a150c77d9e24be4f0a72d9f2b 100644 (file)
@@ -161,6 +161,8 @@ static void  gtk_text_init           (GtkText        *text);
 static void  gtk_text_destroy        (GtkObject      *object);
 static void  gtk_text_realize        (GtkWidget      *widget);
 static void  gtk_text_unrealize      (GtkWidget      *widget);
+static void  gtk_text_style_set             (GtkWidget      *widget,
+                                     GtkStyle       *previous_style);
 static void  gtk_text_draw_focus     (GtkWidget      *widget);
 static void  gtk_text_size_request   (GtkWidget      *widget,
                                      GtkRequisition *requisition);
@@ -458,6 +460,7 @@ gtk_text_class_init (GtkTextClass *class)
 
   widget_class->realize = gtk_text_realize;
   widget_class->unrealize = gtk_text_unrealize;
+  widget_class->style_set = gtk_text_style_set;
   widget_class->draw_focus = gtk_text_draw_focus;
   widget_class->size_request = gtk_text_size_request;
   widget_class->size_allocate = gtk_text_size_allocate;
@@ -1052,6 +1055,29 @@ gtk_text_realize (GtkWidget *widget)
     recompute_geometry (text);
 }
 
+static void 
+gtk_text_style_set     (GtkWidget      *widget,
+                        GtkStyle       *previous_style)
+{
+  GtkText *text;
+
+  g_return_if_fail (widget != NULL);
+  g_return_if_fail (GTK_IS_TEXT (widget));
+
+  text = GTK_TEXT (widget);
+  if (GTK_WIDGET_REALIZED (widget))
+    {
+      gdk_window_set_background (widget->window, &widget->style->base[GTK_STATE_NORMAL]);
+      gdk_window_set_background (text->text_area, &widget->style->base[GTK_STATE_NORMAL]);
+
+      if ((widget->allocation.width > 1) || (widget->allocation.height > 1))
+       recompute_geometry (text);
+    }
+
+  if (GTK_WIDGET_DRAWABLE (widget))
+    gdk_window_clear (widget->window);
+}
+
 static void
 gtk_text_unrealize (GtkWidget *widget)
 {
@@ -1888,6 +1914,13 @@ gtk_text_adjustment (GtkAdjustment *adjustment,
   g_return_if_fail (text != NULL);
   g_return_if_fail (GTK_IS_TEXT (text));
 
+  /* Just ignore it if we haven't been size-allocated yet, or
+   * if something weird has happened */
+  if ((text->line_start_cache == NULL) || 
+      (GTK_WIDGET (text)->allocation.height <= 1) || 
+      (GTK_WIDGET (text)->allocation.width <= 1))
+    return;
+
   if (adjustment == text->hadj)
     {
       g_warning ("horizontal scrolling not implemented");
@@ -2958,8 +2991,11 @@ find_line_containing_point (GtkText* text, guint point,
       if (scroll)
        {
          lph = pixel_height_of (text, cache->next);
-         
-         while (lph > height || lph == 0)
+
+         /* Scroll the bottom of the line is on screen, or until
+          * the line is the first onscreen line.
+          */
+         while (cache->next != text->line_start_cache && lph > height)
            {
              TEXT_SHOW_LINE (text, cache, "cache");
              TEXT_SHOW_LINE (text, cache->next, "cache->next");
@@ -3196,6 +3232,14 @@ free_cache (GtkText* text)
 {
   GList* cache = text->line_start_cache;
 
+  if (cache)
+    {
+      while (cache->prev)
+       cache = cache->prev;
+
+      text->line_start_cache = cache;
+    }
+
   for (; cache; cache = cache->next)
     g_mem_chunk_free (params_mem_chunk, cache->data);
 
@@ -3207,26 +3251,29 @@ free_cache (GtkText* text)
 static GList*
 remove_cache_line (GtkText* text, GList* member)
 {
+  GList *list;
+
   if (member == text->line_start_cache)
     {
       if (text->line_start_cache)
        text->line_start_cache = text->line_start_cache->next;
-      return text->line_start_cache;
     }
-  else
-    {
-      GList *list = member->prev;
 
-      list->next = list->next->next;
+  if (member->prev)
+    {
+      list = member->prev;
+  
+      list->next = member->next;
       if (list->next)
        list->next->prev = list;
+    }
 
-      member->next = NULL;
-      g_mem_chunk_free (params_mem_chunk, member->data);
-      g_list_free (member);
+  list = member->next;
+  
+  g_mem_chunk_free (params_mem_chunk, member->data);
+  g_list_free_1 (member);
 
-      return list->next;
-    }
+  return list;
 }
 
 /**********************************************************************/
index 47ab7bd328cd9ded1948e667922a636bfc885b60..d59b8f5e010507256dde0beff4b54a4d9c99335f 100644 (file)
@@ -1558,8 +1558,12 @@ static gint
 gtk_widget_idle_draw (void *data)
 {
   GSList *node;
+  GSList *draw_queue;
 
-  node = gtk_widget_redraw_queue;
+  draw_queue = node = gtk_widget_redraw_queue;
+  /* We set this gtk_widget_redraw_queue to NULL first, in case anybody
+   * calls queue_draw recursively
+   */
   gtk_widget_redraw_queue = NULL;
   while (node)
     {
@@ -1567,7 +1571,9 @@ gtk_widget_idle_draw (void *data)
       node = node->next;
     }
 
-  return gtk_widget_redraw_queue != NULL;
+  g_slist_free (draw_queue);
+  
+  return FALSE;
 }
 
 void
@@ -1628,7 +1634,7 @@ gtk_widget_idle_sizer (void *data)
     }
   g_slist_free (free_slist);
 
-  return gtk_widget_resize_queue != NULL;
+  return FALSE;
 }
 
 void
@@ -2724,32 +2730,6 @@ gtk_widget_pop_style (void)
     }
 }
 
-/* Basically, send a message to all toplevel windows telling them
- * that a new _GTK_STYLE_COLORS property is available on the root
- * window
- */
-void
-gtk_widget_propagate_default_style (void)
-{
-  GdkEventClient sev;
-  int i;
-  
-  /* Set the property on the root window */
-  gdk_property_change(GDK_ROOT_PARENT(),
-                     gdk_atom_intern("_GTK_DEFAULT_COLORS", FALSE),
-                     gdk_atom_intern("STRING", FALSE),
-                     8*sizeof(gushort),
-                     GDK_PROP_MODE_REPLACE,
-                     (guchar *)gtk_widget_get_default_style(),
-                     GTK_STYLE_NUM_STYLECOLORS() * sizeof(GdkColor));
-
-  for(i = 0; i < 5; i++)
-    sev.data.l[i] = 0;
-  sev.data_format = 32;
-  sev.message_type = gdk_atom_intern ("_GTK_STYLE_CHANGED", FALSE);
-  gdk_event_send_clientmessage_toall ((GdkEvent *) &sev);
-}
-
 /*************************************************************
  * gtk_widget_set_parent_window:
  *     Set a non default parent window for widget
index 2dfc1510244731be1a77e3796184e6f644494e32..08ea853316774d2c621cca88f8f81496625b0fb2 100644 (file)
@@ -474,10 +474,6 @@ void          gtk_widget_restore_default_style (GtkWidget  *widget);
 /* Descend recursively and set rc-style on all widgets without user styles */
 void       gtk_widget_reset_rc_styles   (GtkWidget      *widget);
 
-/* Tell other Gtk applications to use the same default colors.
- */
-void      gtk_widget_propagate_default_style   (void);
-
 /* Push/pop pairs, to change default values upon a widget's creation.
  * This will override the values that got set by the
  * gtk_widget_set_default_* () functions.
index 2d68eb1114718f4ca2dbb5232a920da3a0d94862..9608b081a552baf774178627d60b6db5d897ee7e 100644 (file)
@@ -22,6 +22,7 @@
 #include "gdk/gdkkeysyms.h"
 #include "gdk/gdkx.h"
 #include "gtkprivate.h"
+#include "gtkrc.h"
 #include "gtksignal.h"
 #include "gtkwindow.h"
 
@@ -110,6 +111,9 @@ static gint gtk_window_check_accelerator  (GtkWindow         *window,
                                           gint               key,
                                           guint              mods);
 
+static void gtk_window_read_rcfiles       (GtkWidget         *widget,
+                                          GdkEventClient    *event);
+
 
 static GtkBinClass *parent_class = NULL;
 static guint window_signals[LAST_SIGNAL] = { 0 };
@@ -942,70 +946,43 @@ gtk_window_focus_out_event (GtkWidget     *widget,
 }
 
 static void
-gtk_window_style_set_event (GtkWidget *widget,
-                           GdkEventClient *event)
+gtk_window_read_rcfiles (GtkWidget *widget,
+                        GdkEventClient *event)
 {
-  GdkAtom atom_default_colors;
-  GtkStyle *style_newdefault;
-  GdkAtom realtype;
-  gint retfmt, retlen;
-  GdkColor *data, *stylecolors;
-  int i = 0;
-  GdkColormap *widget_cmap;
-  
-  atom_default_colors = gdk_atom_intern("_GTK_DEFAULT_COLORS", FALSE);
+  GList *toplevels;
   
-  if(gdk_property_get (GDK_ROOT_PARENT(),
-                      atom_default_colors,
-                      gdk_atom_intern("STRING", FALSE),
-                      0,
-                      sizeof(GdkColor) * GTK_STYLE_NUM_STYLECOLORS(),
-                      FALSE,
-                      &realtype,
-                      &retfmt,
-                      &retlen,
-                      (guchar **)&data) != TRUE) {
-    g_warning("gdk_property_get() failed in _GTK_STYLE_CHANGED handler\n");
-    return;
-  }
-  if(retfmt != sizeof(gushort)*8) {
-    g_warning("retfmt (%d) != sizeof(gushort)*8 (%d)\n", retfmt,
-       sizeof(gushort)*8);
-    return;
-  }
-  /* We have the color data, now let's interpret it */
-  style_newdefault = gtk_widget_get_default_style();
-  gtk_style_ref(style_newdefault);
-  stylecolors = (GdkColor *) style_newdefault;
-
-  widget_cmap = gtk_widget_get_colormap(widget);
-  for(i = 0; i < GTK_STYLE_NUM_STYLECOLORS(); i++) {
-    stylecolors[i] = data[i];
-    gdk_color_alloc(widget_cmap, &stylecolors[i]);
-  }
-
-  gtk_widget_set_default_style(style_newdefault);
-  gtk_style_unref(style_newdefault);
-
-  /* Now we need to redraw everything */
-  gtk_widget_draw(widget, NULL);
-  gtk_widget_draw_children(widget);
+  if (gtk_rc_reparse_all ())
+    {
+      toplevels = gdk_window_get_toplevels();
+      while (toplevels)
+       {
+         GtkWidget *widget;
+         gdk_window_get_user_data (toplevels->data, (gpointer *)&widget);
+         
+         if (widget)
+           gtk_widget_reset_rc_styles (widget);
+         
+         toplevels = toplevels->next;
+       }
+      g_list_free (toplevels);
+    }
 }
 
 static gint
 gtk_window_client_event (GtkWidget     *widget,
                         GdkEventClient *event)
 {
-  GdkAtom atom_styleset;
+  static GdkAtom atom_rcfiles = GDK_NONE;
   g_return_val_if_fail (widget != NULL, FALSE);
   g_return_val_if_fail (GTK_IS_WINDOW (widget), FALSE);
   g_return_val_if_fail (event != NULL, FALSE);
 
-  atom_styleset = gdk_atom_intern("_GTK_STYLE_CHANGED", FALSE);
+  if (!atom_rcfiles)
+    atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
+
+  if(event->message_type == atom_rcfiles) 
+    gtk_window_read_rcfiles (widget, event);    
 
-  if(event->message_type == atom_styleset) {
-    gtk_window_style_set_event(widget, event);    
-  }
   return FALSE;
 }
 
index df5936d4fcf42fd1b585c5b89958fd2213073672..bbeb06b486c7475b5f49e2c7660eb59033ec5ef5 100644 (file)
@@ -6456,6 +6456,24 @@ reload_rc_file (void)
     }
 }
 
+void
+reload_all_rc_files (void)
+{
+  static GdkAtom atom_rcfiles = GDK_NONE;
+
+  GdkEventClient sev;
+  int i;
+  
+  if (!atom_rcfiles)
+    atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
+
+  for(i = 0; i < 5; i++)
+    sev.data.l[i] = 0;
+  sev.data_format = 32;
+  sev.message_type = atom_rcfiles;
+  gdk_event_send_clientmessage_toall ((GdkEvent *) &sev);
+}
+
 void
 create_rc_file (void)
 {
@@ -6482,6 +6500,14 @@ create_rc_file (void)
       gtk_widget_grab_default (button);
       gtk_widget_show (button);
 
+      button = gtk_button_new_with_label ("Reload All");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC(reload_all_rc_files), NULL);
+      GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), 
+                         button, TRUE, TRUE, 0);
+      gtk_widget_show (button);
+
       button = gtk_button_new_with_label ("Close");
       gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
                                 GTK_SIGNAL_FUNC(gtk_widget_destroy),
index df5936d4fcf42fd1b585c5b89958fd2213073672..bbeb06b486c7475b5f49e2c7660eb59033ec5ef5 100644 (file)
@@ -6456,6 +6456,24 @@ reload_rc_file (void)
     }
 }
 
+void
+reload_all_rc_files (void)
+{
+  static GdkAtom atom_rcfiles = GDK_NONE;
+
+  GdkEventClient sev;
+  int i;
+  
+  if (!atom_rcfiles)
+    atom_rcfiles = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
+
+  for(i = 0; i < 5; i++)
+    sev.data.l[i] = 0;
+  sev.data_format = 32;
+  sev.message_type = atom_rcfiles;
+  gdk_event_send_clientmessage_toall ((GdkEvent *) &sev);
+}
+
 void
 create_rc_file (void)
 {
@@ -6482,6 +6500,14 @@ create_rc_file (void)
       gtk_widget_grab_default (button);
       gtk_widget_show (button);
 
+      button = gtk_button_new_with_label ("Reload All");
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                         GTK_SIGNAL_FUNC(reload_all_rc_files), NULL);
+      GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+      gtk_box_pack_start (GTK_BOX (GTK_DIALOG (window)->action_area), 
+                         button, TRUE, TRUE, 0);
+      gtk_widget_show (button);
+
       button = gtk_button_new_with_label ("Close");
       gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
                                 GTK_SIGNAL_FUNC(gtk_widget_destroy),