From: Owen Taylor Date: Sun, 10 May 1998 02:46:20 +0000 (+0000) Subject: Try to figure out if this is Digital Unix and we need -std1 to get the X-Git-Url: http://pileus.org/git/?a=commitdiff_plain;h=f75d8b0c23e8ea8cd31afd8ac16aa85324aa4ff5;p=~andy%2Fgtk Try to figure out if this is Digital Unix and we need -std1 to get the Sat May 9 20:11:20 1998 Owen Taylor * 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 * 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 * 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 * 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 * style_set improvements for GtkText and GtkEntry Tue May 5 19:49:27 1998 Owen Taylor * 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 * 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 ) Tue May 5 19:11:27 1998 Owen Taylor * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always set GDK_EXPOSURE_MASK for DrawingAreas Tue May 5 14:32:37 1998 Owen Taylor * 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 * gtk/gtkselection.c (gtk_selection_clear): Fixed reversed conditionals that caused segfault on some platforms. Tue May 5 00:44:47 1998 Owen Taylor * gtk/gtkcontainer.c (gtk_container_set_focus_[hv]adjustment): cast to GTK_OBJECT for gtk_object_ref. --- diff --git a/ChangeLog b/ChangeLog index d4c6ea91d..a68e3b6c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,81 @@ +Sat May 9 20:11:20 1998 Owen Taylor + + * 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 + + * 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 + + * 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 + + * 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 + + * style_set improvements for GtkText and GtkEntry + +Tue May 5 19:49:27 1998 Owen Taylor + + * 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 + + * 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 ) + +Tue May 5 19:11:27 1998 Owen Taylor + + * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always + set GDK_EXPOSURE_MASK for DrawingAreas + +Tue May 5 14:32:37 1998 Owen Taylor + + * 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 + + * gtk/gtkselection.c (gtk_selection_clear): Fixed + reversed conditionals that caused segfault on some + platforms. + +Tue May 5 00:44:47 1998 Owen Taylor + + * 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 * docs/gtk_tut_it.sgml: update of Italian tutorial diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index d4c6ea91d..a68e3b6c3 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,81 @@ +Sat May 9 20:11:20 1998 Owen Taylor + + * 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 + + * 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 + + * 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 + + * 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 + + * style_set improvements for GtkText and GtkEntry + +Tue May 5 19:49:27 1998 Owen Taylor + + * 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 + + * 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 ) + +Tue May 5 19:11:27 1998 Owen Taylor + + * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always + set GDK_EXPOSURE_MASK for DrawingAreas + +Tue May 5 14:32:37 1998 Owen Taylor + + * 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 + + * gtk/gtkselection.c (gtk_selection_clear): Fixed + reversed conditionals that caused segfault on some + platforms. + +Tue May 5 00:44:47 1998 Owen Taylor + + * 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 * docs/gtk_tut_it.sgml: update of Italian tutorial diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index d4c6ea91d..a68e3b6c3 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,81 @@ +Sat May 9 20:11:20 1998 Owen Taylor + + * 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 + + * 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 + + * 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 + + * 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 + + * style_set improvements for GtkText and GtkEntry + +Tue May 5 19:49:27 1998 Owen Taylor + + * 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 + + * 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 ) + +Tue May 5 19:11:27 1998 Owen Taylor + + * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always + set GDK_EXPOSURE_MASK for DrawingAreas + +Tue May 5 14:32:37 1998 Owen Taylor + + * 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 + + * gtk/gtkselection.c (gtk_selection_clear): Fixed + reversed conditionals that caused segfault on some + platforms. + +Tue May 5 00:44:47 1998 Owen Taylor + + * 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 * docs/gtk_tut_it.sgml: update of Italian tutorial diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index d4c6ea91d..a68e3b6c3 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,81 @@ +Sat May 9 20:11:20 1998 Owen Taylor + + * 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 + + * 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 + + * 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 + + * 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 + + * style_set improvements for GtkText and GtkEntry + +Tue May 5 19:49:27 1998 Owen Taylor + + * 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 + + * 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 ) + +Tue May 5 19:11:27 1998 Owen Taylor + + * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always + set GDK_EXPOSURE_MASK for DrawingAreas + +Tue May 5 14:32:37 1998 Owen Taylor + + * 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 + + * gtk/gtkselection.c (gtk_selection_clear): Fixed + reversed conditionals that caused segfault on some + platforms. + +Tue May 5 00:44:47 1998 Owen Taylor + + * 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 * docs/gtk_tut_it.sgml: update of Italian tutorial diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index d4c6ea91d..a68e3b6c3 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,81 @@ +Sat May 9 20:11:20 1998 Owen Taylor + + * 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 + + * 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 + + * 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 + + * 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 + + * style_set improvements for GtkText and GtkEntry + +Tue May 5 19:49:27 1998 Owen Taylor + + * 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 + + * 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 ) + +Tue May 5 19:11:27 1998 Owen Taylor + + * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always + set GDK_EXPOSURE_MASK for DrawingAreas + +Tue May 5 14:32:37 1998 Owen Taylor + + * 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 + + * gtk/gtkselection.c (gtk_selection_clear): Fixed + reversed conditionals that caused segfault on some + platforms. + +Tue May 5 00:44:47 1998 Owen Taylor + + * 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 * docs/gtk_tut_it.sgml: update of Italian tutorial diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index d4c6ea91d..a68e3b6c3 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,81 @@ +Sat May 9 20:11:20 1998 Owen Taylor + + * 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 + + * 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 + + * 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 + + * 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 + + * style_set improvements for GtkText and GtkEntry + +Tue May 5 19:49:27 1998 Owen Taylor + + * 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 + + * 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 ) + +Tue May 5 19:11:27 1998 Owen Taylor + + * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always + set GDK_EXPOSURE_MASK for DrawingAreas + +Tue May 5 14:32:37 1998 Owen Taylor + + * 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 + + * gtk/gtkselection.c (gtk_selection_clear): Fixed + reversed conditionals that caused segfault on some + platforms. + +Tue May 5 00:44:47 1998 Owen Taylor + + * 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 * docs/gtk_tut_it.sgml: update of Italian tutorial diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index d4c6ea91d..a68e3b6c3 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,81 @@ +Sat May 9 20:11:20 1998 Owen Taylor + + * 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 + + * 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 + + * 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 + + * 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 + + * style_set improvements for GtkText and GtkEntry + +Tue May 5 19:49:27 1998 Owen Taylor + + * 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 + + * 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 ) + +Tue May 5 19:11:27 1998 Owen Taylor + + * gtk/gtkdrawingarea.c (gtk_drawing_area_realize): Always + set GDK_EXPOSURE_MASK for DrawingAreas + +Tue May 5 14:32:37 1998 Owen Taylor + + * 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 + + * gtk/gtkselection.c (gtk_selection_clear): Fixed + reversed conditionals that caused segfault on some + platforms. + +Tue May 5 00:44:47 1998 Owen Taylor + + * 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 * docs/gtk_tut_it.sgml: update of Italian tutorial diff --git a/configure.in b/configure.in index f12208d22..fa956c4a2 100644 --- a/configure.in +++ b/configure.in @@ -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 + int main (void) { return (log(1) != log(1.)); }], + AC_MSG_RESULT(none needed), + gtk_save_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -std1" + AC_TRY_RUN([#include + 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 diff --git a/gdk/gdk.c b/gdk/gdk.c index bfb1070ec..8b9768b2d 100644 --- 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. */ diff --git a/gdk/gdkpixmap.c b/gdk/gdkpixmap.c index 2f2cdea4c..a7045d19f 100644 --- a/gdk/gdkpixmap.c +++ b/gdk/gdkpixmap.c @@ -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, diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c index bfb1070ec..8b9768b2d 100644 --- a/gdk/x11/gdkmain-x11.c +++ b/gdk/x11/gdkmain-x11.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. */ diff --git a/gdk/x11/gdkpixmap-x11.c b/gdk/x11/gdkpixmap-x11.c index 2f2cdea4c..a7045d19f 100644 --- a/gdk/x11/gdkpixmap-x11.c +++ b/gdk/x11/gdkpixmap-x11.c @@ -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, diff --git a/glib/gmem.c b/glib/gmem.c index 1f4ae285e..101255966 100644 --- a/glib/gmem.c +++ b/glib/gmem.c @@ -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) { diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c index de7b350a0..966358db9 100644 --- a/gtk/gtkcontainer.c +++ b/gtk/gtkcontainer.c @@ -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, diff --git a/gtk/gtkdrawingarea.c b/gtk/gtkdrawingarea.c index 0b6691999..352c95b8e 100644 --- a/gtk/gtkdrawingarea.c +++ b/gtk/gtkdrawingarea.c @@ -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; diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 105643948..93cf32e57 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -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); } diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c index 3f4dffa1a..0f5e2c509 100644 --- a/gtk/gtkselection.c +++ b/gtk/gtkselection.c @@ -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; } diff --git a/gtk/gtktext.c b/gtk/gtktext.c index 843fa465c..69b533c29 100644 --- a/gtk/gtktext.c +++ b/gtk/gtktext.c @@ -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; } /**********************************************************************/ diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 47ab7bd32..d59b8f5e0 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -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 diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h index 2dfc15102..08ea85331 100644 --- a/gtk/gtkwidget.h +++ b/gtk/gtkwidget.h @@ -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. diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index 2d68eb111..9608b081a 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -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; } diff --git a/gtk/testgtk.c b/gtk/testgtk.c index df5936d4f..bbeb06b48 100644 --- a/gtk/testgtk.c +++ b/gtk/testgtk.c @@ -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), diff --git a/tests/testgtk.c b/tests/testgtk.c index df5936d4f..bbeb06b48 100644 --- a/tests/testgtk.c +++ b/tests/testgtk.c @@ -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),