2002-11-15 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkprivate-win32.h
* gdk/win32/gdkglobals-win32.c
* gdk/win32/gdkmain-win32.c
* gdk/win32/gdkdrawable-win32.c (generic_draw): Don't check if
MaskBlt() is present in gdi32.dll, it is, even on Win9x. It just
always returns failure on Win9x. Instead, call MaskBlt() only if
we are on NT/2k/XP.
2002-11-14 Tor Lillqvist <tml@iki.fi>
Start implementing all fill styles (i.e. tiled, stippled, and
opaque stippled in addition to the plain solid style) in the Win32
backend in an elegant and generic way. For now only did the
draw_rectangle() and draw_glyphs() methods. The rest will
follow. Previously some of the drawing methods implemented opaque
stippling, but not tiles or non-opaque stippling.
Seems to work fine, now the check marks show up in check buttons,
the stippled background and stippled text in gtk-demo's Text
Widget look as they should, and GtkText's line wrap arrow shows
correctly instead of an ugly rectangle.
The implementation does do a lot of pixmap handling and blitting
back and forth, especially on Win9x. But performance is hopefully
not an issue. I don't think many applications do a lot of tiled or
stippled drawing.
* gdk/win32/gdkprivate-win32.h: Define a new macro, GDI_CALL, that
calls a GDI function and prints a warning if it failed. Also
API_CALL for non-GDI calls. Cleans all the the if (!BlaBla())
WIN32_GDI_FAILED ("BlaBla") snippets, these can now be written
GDI_CALL (BlaBla, ()).
* gdk/win32/gdkdrawable-win32.c: Use GDI_CALL macro in lots of places.
(generic_draw): New function that handles all the blitting
necessary to implement tiles and stipples. A function that
actually draws stuff is passed as a parameter to
generic_draw(). If the fill style is solid, it is called
directly, to draw on the destination drawable. Otherwise it is
called to draw on a temporary mask bitmap, which then is used in
blitting operations. The tiles and/or stipples are rendered into
another temporary pixmap. If MaskBlt() is available (on NT/2k/XP),
it is used, otherwise a sequence of BitBlt() is used to do the
final composition onto the destination drawable.
(draw_tiles_lowlevel, draw_tiles): Some renaming and code
reorg. Use BitBlt() to blit each tile, not gdk_draw_drawable().
(rop2_to_rop3): Instead of bitblt_wrapper, this function does the
binary->ternary rop mapping.
(draw_rectangle, gdk_win32_draw_rectangle, draw_glyphs,
gdk_win32_draw_glyphs): Split functionality into two functions,
with generic_draw() doing its magic inbetween.
* gdk/win32/gdkevents-win32.c: Remove the TrackMouseEvent code, it
was ifdeffed out and wouldn't have done anything even if
enabled. Remove the GDK_EVENT_FUNC_FROM_WINDOW_PROC code, didn't
have any effect any more anyway after all the changes GTK+ has
gone through in the last years. Remove some #if 0 code.
* gdk/win32/gdkgc-win32.c (gdk_gc_copy): Set the copy's hdc field
to NULL in case a GC is copied while it has a Windows DC active.
* gdk/win32/gdkprivate-win32.h
* gdk/win32/gdkglobals-win32.c: Remove gdk_event_func_from_window_proc.
Add mask_blt that points to MaskBlt() if available.
* gdk/win32/gdkmain-win32.c: Remove -event-func-from-window-proc
option. Check if MaskBlt() is available. If there is a
PRETEND_WIN9X envvar, set windows_version as if on Win9x.
* gdk/win32/gdkpixmap-win32.c (_gdk_win32_pixmap_new,
gdk_pixmap_new): Combine these two, _gdk_win32_pixmap_new() wasn't
used or exported. Make a bit more like the X11 version. Hopefully
I didn't break the fragile palettized display ("pseudocolor")
code.
2002-11-13 Christopher James Lahey <clahey@ximian.com>
* gdk/x11/gdkwindow-x11.c (gdk_window_impl_x11_get_colormap): Ref
the colormap returned from gdk_colormap_lookup.
2002-11-13 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkdrawable-win32.c (bitblt_wrapper): New
function. Translates the GC's current binary raster op (rop2) to
the appropriate ternary raster op and calls BitBlt(). Previously
used SRCCOPY always.
(blit_from_pixmap, blit_inside_window, blit_from_window): Use
bitblt_wrapper().
* gdk/win32/gdkgc-win32.c
* gdk/win32/gdkmain-win32.c:: Various debugging output improvements.
* gdk/win32/gdkgc-win32.c (predraw_set_foreground): Check whether
tile/stipple origins are valid when calling SetBrushOrgEx().
(gdk_win32_hdc_get): Ifdef out code that tries to handle the
stipple by converting it into a region, and combining the clip
region with that. A stipple shouldn't work like that, it should
replicate in x and y directions. Stipples will have to be handled
elsewhere.
* gdk/win32/gdkmain-win32.c: (gdk_win32_gcvalues_mask_to_string,
gdk_win32_rop2_to_string): New debugging functions.
(gdk_win32_print_dc): Print also DC's rop2 and text color.
* gdk/win32/gdkprivate-win32.h: Declare new functions.
2002-11-12 Tor Lillqvist <tml@iki.fi>
More work on the Win32 backend. The scrolling problem diagnosis
from 2002-11-07 was wrong, even if the cure happened to work. The
problems were not caused by a lack of WM_PAINT messages while
scrolling. The real issue was that SetWindowPos() and
ScrollWindowEx() don't blit those parts of the window they think
are invalid. As we didn't keep Windows's update region in synch
with GDK's, Windows thought those areas that in fact had been
updated were invalid. Calling ValidateRgn() in
_gdk_windowing_window_queue_antiexpose() seems to be an elegant
and efficient solution, removing from Windows's update region
those areas we are about to repaint proactively.
In some cases garbage leftover values were used for the clip
origin in GdkGCWin32. This showed up as odd blank areas around the
pixmaps included in the Text Widget in gtk-demo.
Having the clip region either as a GdkRegion or a HRGN in
GdkGCWin32 was unnecessary, it's better to just use a HRGN.
The translation and antiexpose queue handling in
gdkgeometry-win32.c seems unnecessary (and not implementable in
the same way as on X11 anyway, no serial numbers) on Windows,
ifdeffed out.
All of testgtk and gtk-demo except "big windows" now seem to work
pretty well.
Bug #79720 should be fixed now.
* gdk/win32/gdkevents-win32.c (gdk_event_translate) In WM_PAINT
handler: Don't check for empty update rect. When we get a
WM_PAINT, the update region isn't empty. And if it for some
strange reason is, that will be handled later anyway. Don't leak
hrgn.
* gdk/win32/gdkgc-win32.c: Set clip origins to zero
when appropriate.
(gdk_gc_copy): Increase refcount on colormap if present.
(gdk_win32_hdc_get): Handle just hcliprgn. If we have a stipple,
combine it with clip region after selecting into the DC.
(_gdk_win32_bitmap_to_hrgn): Rename from _gdk_win32_bitmap_to_region.
(_gdk_win3_gdkregion_to_hrgn): New function, code snippet
extracted from gdk_win32_hdc_get().
* gdk/win32/gdkgeometry-win32.c: Ifdef out the translate_queue
handling.
(gdk_window_copy_area_scroll): Increase clipRect to avoid
ScrollWindowEx() not scrolling pixels it thinks are invalid.
Don't call UpdateWindow().
(_gdk_window_move_resize_child): Don't call UpdateWindow().
(gdk_window_premove, gdk_window_postmove,
gdk_window_clip_changed): Add debugging output.
(_gdk_windowing_window_queue_antiexpose): Just call ValidateRgn()
on the region.
(_gdk_window_process_expose): No use for the serial number
parameter now. Instead of a rectangle, take a region parameter, as
Windows gives us one in WM_PAINT.
* gdk/win32/gdkmain-win32.c (gdk_win32_rect_to_string,
gdk_win32_gdkrectangle_to_string, gdk_win32_gdkregion_to_string):
New debugging functions.
* gdk/win32/*.c: Use above functions.
* gdk/win32/gdkwindow-win32.c (gdk_propagate_shapes): Plug memory
leak, free list after use.
* gdk/win32/gdkprivate-win32.h: Drop the clip_region field from
GdkGCWin32. Only use the HRGN hcliprgn. Declare new functions.
* gdk/win32/rc/gdk.rc.in: Update copyright year.
Fri Nov 8 14:44:43 2002 Owen Taylor <otaylor@redhat.com>
* ==== Released 2.0.8 ====
* configure.in: Version 2.0.8, interface, binary age 8.
* NEWS: Updated.
Thu Nov 7 18:09:42 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtkfilesel.c (open_new_dir): Escape invalid
filename before printing it out, since it isn't
a valid UTF-8 string. (#94676)
2002-11-07 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkgeometry-win32.c (gdk_window_copy_area_scroll,
_gdk_window_move_resize_child): Call UpdateWindow() after
scrolling or moving/resizing the window. This causes a WM_PAINT
message to be sent to the window procedure. Improves scrolling a
lot, for instance in testgtk's "scrolled windows" dialog or
gtk-demo's "Text Widget".
Without calling UpdateWindow(), Windows generates a WM_PAINT only
when there is no other message in the queue. Thus, while you keep
moving the scrollbar slider and generating mouse messages, no
WM_PAINT messages are sent.
Thu Nov 7 17:18:06 2002 Owen Taylor <otaylor@redhat.com>
* gdk/x11/gdkdrawable-x11.c (gdk_x11_draw_pixbuf):
Don't try to use render if we can't get a picture for
the drawable. (Fixes#97220, reported by
Jamie Zawinski)
* gtk/gtkimage.c: Force requisition calculation
when we get a expose prior to size_request().
(#91711, reported by Sven Neumann, debugging
help from Matthias Clasen, Soeren Sandmann)
2002-11-04 Sven Neumann <sven@gimp.org>
* io-bmp.c (DecodeHeader): removed redundant code that did nothing,
caused a compiler warning and is also not in the HEAD branch.
2002-11-03 Tor Lillqvist <tml@iki.fi>
Lots of changes to the Win32 backend:
One big improvement is that scrolling of windows with background
pixmaps now works much better. (This can be seen in for instance
testgtk's "text" test.) Blitting inside a window
(gdk_draw_drawable) also works much better now (can also seen in
the "text" test).
Another major change is we don't (try to) do guffaw scrolling as
there is no static window gravity on Windows. Guffaw scrolling
would be unnecessary anyway, as there is the ScrollWindow()
API. This improves the behaviour of the Text Widget demo in
gtk-demo a lot. But I have no idea how the lack of static win
gravity should be handled in other places where the X11 code uses
it. Especially _gdk_window_move_resize_child().
Big windows still don't work correctly, I assume.
l
Another vague area is the translate_queue. I don't think the queue
items actually ever gets used, at least not in the code as of now.
There is still some problem in expose handling. By moving an
obscuring window back and forth over testgtk's main window, for
instance, every now and then you typically get narrow vertical or
horizontal strips of pixels that haven't been properly redrawn
after being exposed. A fencepost error somewhere?
* gdk/win32/gdkevents-win32.c: Cast known GdkWindowObjects
directly instead of using GDK_WINDOW_OBJECT(). Remove unused
latin_locale_loaded variable.
(_gdk_win32_get_next_tick): New function. Used to make sure
timestamps of events are always increasing, both in events
generated from the window procedure and in events gotten via
PeekMessage(). Not sure whether this is actually useful, but it
seemed as a good idea.
(real_window_procedure): Don't use a local GdkEventPrivate
variable. Don't attempt any compression of configure or expose
events here, handled elsewhere.
(erase_background): Accumulate window offsets when traversing up
the parent chain for GDK_PARENT_RELATIVE_BG, in order to get
correct alignment of background pixmaps. Don't fill with
BLACK_BRUSH if GDK_NO_BG.
(gdk_event_get_graphics_expose): A bit more verbose debugging output.
(gdk_event_translate): Use _gdk_win32_get_next_tick(). In the
WM_PAINT handler, call GetUpdateRgn() before calling BeginPaint()
and EndPaint() (which empty the update region).
* gdk/win32/gdkdnd-win32.c
* gdk/win32/gdkinput-win32.c:
Use _gdk_win32_get_next_tick().
* gdk/win32/gdkfont-win32.c: Use %p to print HFONTs.
(gdk_text_size): Remove, unused.
* gdk/win32/gdkgeometry-win32.c
(_gdk_windowing_window_queue_antiexpose): Always return FALSE for
now, until figured out whether antiexposes actually can work on
Win32.
(gdk_window_copy_area_scroll): Scroll also children with the
ScrollWindowEx() call. No need to call gdk_window_move() on the
children.
(gdk_window_scroll): Don't do guffaw scrolling.
(gdk_window_compute_position): Fix typo, used win32_y where x was
intended.
(gdk_window_queue_append): Use GetTickCount() for serial number,
not GetMessageTime(), which can be very far back.
* gdk/win32/gdkwindow-win32.c (gdk_window_gravity_works): Remove,
we know that there is no such thing on Windows.
(gdk_window_set_static_bit_gravity,
gdk_window_set_static_win_gravity): Ditto, remove, they didn't do
anything anyway.
(_gdk_windowing_window_init, gdk_window_foreign_new): Call
_gdk_window_init_position() like in the X11 backend.
(gdk_window_reparent): Don't call the now nonexistent
gdk_window_set_static_win_gravity(). No idea what should be done
instead.
(gdk_window_get_geometry): The returned x and y should be relative
to parent. Used to be always zero..
(gdk_window_set_static_gravities): Return FALSE if trying to set
static gravity.
* gdk/win32/gdkdrawable-win32.c (_gdk_win32_draw_tiles):
Rewrite. Make static. Must take tile origin parameters, too.
(gdk_win32_draw_rectangle): Pass the tile/stipple origin to
_gdk_win32_draw_tiles(). Remove #if 0 code.
(blit_inside_window): Don't call ScrollDC(), that didn't work at
all like I thought. A simple call to BitBlt() is enough.
* gdk/win32/gdkcolor-win32.c (gdk_win32_color_to_string,
gdk_win32_print_paletteentries, gdk_win32_print_system_palette,
gdk_win32_print_hpalette)
* gdk/win32/gdkdrawable-win32.c (gdk_win32_drawable_description)
* gdk/win32/gdkevents-win32.c (gdk_win32_message_name):
Move all debugging helper functions to gdkmain-win32.c.
* gdk/win32/gdkmain-win32.c: (gdk_win32_lbstyle_to_string,
gdk_win32_pstype_to_string, gdk_win32_psstyle_to_string,
gdk_win32_psendcap_to_string, gdk_win32_psjoin_to_string): New
debugging functions.
(static_printf): Helper function for the above. sprintfs into a
static circular buffer, return value should be used "soon".
* gdk/win32/gdkgc-win32.c: Use above debugging functions.
* gdk/win32/gdkprivate-win32.h: Declare new functions, remove
obsoleted ones.
Sun Nov 3 21:26:20 2002 Kristian Rietveld <kris@gtk.org>
Bah, and of course I broke something ...
* gtk/gtktreeselection.c (gtk_tree_selection_selected_foreach): fix
up the mess I caused with my commit of Oct 23 fixing #50263, things
should be fine now.
Sun Nov 3 13:03:29 2002 Owen Taylor <otaylor@redhat.com>
* gtk/gtkfilesel.c configure.in: Remove check for
winsock.h since it might show up on Linux+Wine.
Instead just conditionalize of G_OS_WIN32.
(#97396, Gaute Lindkvist)
Sun Nov 3 01:27:40 2002 Kristian Rietveld <kris@gtk.org>
* gtk/gtkcellrendererpixbuf.c (gtk_cell_renderer_pixbuf_get_size):
check if width isn't zero instead of calc_width ...
Sun Nov 3 01:22:01 2002 Kristian Rietveld <kris@gtk.org>
Merge fest from HEAD, note that only a selection of bug fixes on
HEAD got committed to stable.
#94868, reported and testcase provided by Daniel Elstner.
* gtk/gtktreeselection.c (_gtk_tree_selection_internal_select_node):
free anchor if applicable.
#92014, fixed with help of detailed traces from Morten Welinder.
* gtk/gtkliststore.c (gtk_list_store_remove_silently): free the
actual link after the node has been removed.
* gtk/gtktreeviewcolumn.c (gtk_tree_view_column_column_finalize):
free the cell_list and the child if it exists.
#85858, #85859, #85860, #85872, reported by David L. Cooper II.
* gtk/gtkcellrendererpixbuf.c (gtk_cell_renderer_pixbuf_render):
s/guint/GtkCellRendererState/.
* gtk/gtkcellrenderertext.c (gtk_cell_renderer_text_render):
ditto.
* gtk/gtkcellrenderertoggle.c (gtk_cell_renderer_toggle_render),
(gtk_cell_renderer_toggle_activate): ditto.
* gtk/gtkliststore.c (gtk_list_store_get_flags): a
s/guint/GtkTreeModelFlags/ on the return type.
#93629, fixes a really evil GtkTreeModelSort bug. Reported and
testcase by Hans Petter Jansson.
* gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_changed): if we
are swapping two rows (re-insertion on row_changed), also *emit*
a rows_reordered signal. oops.
#96851, reported by Jorn Baayen.
* gtk/gtktreemodelsort.c (gtk_tree_model_sort_set_model): remove
the second ref command on the child_model, we only have to ref it
once here. (#96851, reported by Jorn Baayen).
#50263, reported by Havoc Pennington.
* gtk/gtktreeselection.c (model_changed): new function,
(gtk_tree_selection_selected_foreach): monitor changes in the model,
bail out if the model has been changed from the foreach func.
2002-10-28 Tor Lillqvist <tml@iki.fi>
* gdk/win32/gdkwindow-win32.c (gdk_window_set_decorations,
gdk_window_set_functions): Don't call GetWindowLong for
GWL_EXSTYLE, the extended window style wasn't used or
changed. After setting the window style with SetWindowLong, call
SetWindowPos with the SWP_FRAMECHANGED flag for the window to
actually be updated, as Platform SDK docs say one should. (#95812,
huzheng)