mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-10 10:50:10 +00:00
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 <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.
This commit is contained in:
parent
aab3106abd
commit
f75d8b0c23
78
ChangeLog
78
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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
19
configure.in
19
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 <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
|
||||
|
25
gdk/gdk.c
25
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.
|
||||
*/
|
||||
|
507
gdk/gdkpixmap.c
507
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 (color_name == NULL ||
|
||||
gdk_color_parse (color_name, &color->color) == FALSE)
|
||||
{
|
||||
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;
|
||||
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,
|
||||
|
@ -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.
|
||||
*/
|
||||
|
@ -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 (color_name == NULL ||
|
||||
gdk_color_parse (color_name, &color->color) == FALSE)
|
||||
{
|
||||
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;
|
||||
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,
|
||||
|
27
glib/gmem.c
27
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)
|
||||
{
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
return list->next;
|
||||
}
|
||||
|
||||
list = member->next;
|
||||
|
||||
g_mem_chunk_free (params_mem_chunk, member->data);
|
||||
g_list_free_1 (member);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
/**********************************************************************/
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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;
|
||||
GList *toplevels;
|
||||
|
||||
atom_default_colors = gdk_atom_intern("_GTK_DEFAULT_COLORS", FALSE);
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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),
|
||||
|
@ -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),
|
||||
|
Loading…
Reference in New Issue
Block a user