1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00

Release 960314

Wed Mar 13 19:46:50 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [controls/edit.c]
	Removed calls to memmove (not portable).

	* [debugger/dbg.y] [debugger/debug.l]
	Prefixed all token with 't' to avoid conflicts with type
	definitions.
	Added 'walk queue', 'walk class' and 'info class' commands.

	* [debugger/info.c]
	Moved queue and window information functions to windows/queue.c
	and windows/win.c respectively.

	* [loader/signal.c]
	Added SIGHUP handling to force entry into built-in debugger.
	Cleaned up a bit.

	* [misc/spy.c]
	General cleanup and performance improvements.

	* [windows/class.c]
	Added CLASS_DumpClass() and CLASS_WalkClasses() functions for
	debugger.

	* [windows/event.c]
	Pressing Ctrl-Alt-Return forces an entry into the debugger. Not
	sure if this key combination is a good choice...

	* [windows/message.c] [windows/queue.c] (New file)
	Moved message queue handling functions to windows/queue.c.

Tue Mar 12 14:55:16 1996  Onno Hovers  <onno@stack.urc.tue.nl>

	* [if1632/except.S] [include/except.h] [win32/except.c] (New files)
	Implemented Win32 exception functions: RaiseException(),
 	RtlUnwind(), SetUnhandledExceptionFilter() and
	UnhandledExceptionFilter().

Mon Mar 11 19:23:29 1996  Albrecht Kleine  <kleine@ak.sax.de>

	* [controls/listbox.c] [include/listbox.h]
	Special handling for COMBOLBOX styles introduced via extension of
 	HEADLIST structure: lphl->dwStyle.

Mon Mar 11 13:31:06 1996  Greg Kreider <kreider@natlab.research.philips.com>

	* [controls/combo.c]
	Any mouse movement within a small distance (defined by CBLMM_EDGE)
	of the top or bottom edge causes the window to scroll.  Also moved 
	some assignments so the routine works correctly.

	* [controls/listbox.c]
	Changing selection in ListBoxSetCurSel now updates PrevFocused.
	Added to LBSetFont and CreateListBoxStruct a fake hdc that tests 
	and sets the standard text height.

Sun Mar 10 08:39:23 1996  Alex Korobka <alex@phm30.pharm.sunysb.edu>

	* [windows/dce.c]
	Fixed memory leak in DCE_ClipWindows().
This commit is contained in:
Alexandre Julliard 1996-03-14 18:08:34 +00:00
parent d2e1c1a43a
commit b817f4fbb5
47 changed files with 2275 additions and 1404 deletions

View file

@ -1,14 +1,13 @@
This is release 960309 of Wine the MS Windows emulator. This is still a This is release 960314 of Wine the MS Windows emulator. This is still a
developer's only release. There are many bugs and many unimplemented API developer's only release. There are many bugs and many unimplemented API
features. Most applications still do not work. features. Most applications still do not work.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry. forget to include a ChangeLog entry.
WHAT'S NEW with Wine-960309: (see ChangeLog for details) WHAT'S NEW with Wine-960314: (see ChangeLog for details)
- More edit control improvements. - Many combo and listbox fixes.
- Help begins to work. - Win32 exception handling.
- Internal LZEXPAND.DLL.
- Lots of bug fixes. - Lots of bug fixes.
See the README file in the distribution for installation instructions. See the README file in the distribution for installation instructions.
@ -17,10 +16,10 @@ Because of lags created by using mirror, this message may reach you before
the release is available at the ftp sites. The sources will be available the release is available at the ftp sites. The sources will be available
from the following locations: from the following locations:
sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960309.tar.gz sunsite.unc.edu:/pub/Linux/ALPHA/wine/development/Wine-960314.tar.gz
tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960309.tar.gz tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-960314.tar.gz
ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960309.tar.gz ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-960314.tar.gz
aris.com:/pub/linux/ALPHA/Wine/development/Wine-960309.tar.gz aris.com:/pub/linux/ALPHA/Wine/development/Wine-960314.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite. It should also be available from any site that mirrors tsx-11 or sunsite.

View file

@ -1,3 +1,66 @@
----------------------------------------------------------------------
Wed Mar 13 19:46:50 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
* [controls/edit.c]
Removed calls to memmove (not portable).
* [debugger/dbg.y] [debugger/debug.l]
Prefixed all token with 't' to avoid conflicts with type
definitions.
Added 'walk queue', 'walk class' and 'info class' commands.
* [debugger/info.c]
Moved queue and window information functions to windows/queue.c
and windows/win.c respectively.
* [loader/signal.c]
Added SIGHUP handling to force entry into built-in debugger.
Cleaned up a bit.
* [misc/spy.c]
General cleanup and performance improvements.
* [windows/class.c]
Added CLASS_DumpClass() and CLASS_WalkClasses() functions for
debugger.
* [windows/event.c]
Pressing Ctrl-Alt-Return forces an entry into the debugger. Not
sure if this key combination is a good choice...
* [windows/message.c] [windows/queue.c] (New file)
Moved message queue handling functions to windows/queue.c.
Tue Mar 12 14:55:16 1996 Onno Hovers <onno@stack.urc.tue.nl>
* [if1632/except.S] [include/except.h] [win32/except.c] (New files)
Implemented Win32 exception functions: RaiseException(),
RtlUnwind(), SetUnhandledExceptionFilter() and
UnhandledExceptionFilter().
Mon Mar 11 19:23:29 1996 Albrecht Kleine <kleine@ak.sax.de>
* [controls/listbox.c] [include/listbox.h]
Special handling for COMBOLBOX styles introduced via extension of
HEADLIST structure: lphl->dwStyle.
Mon Mar 11 13:31:06 1996 Greg Kreider <kreider@natlab.research.philips.com>
* [controls/combo.c]
Any mouse movement within a small distance (defined by CBLMM_EDGE)
of the top or bottom edge causes the window to scroll. Also moved
some assignments so the routine works correctly.
* [controls/listbox.c]
Changing selection in ListBoxSetCurSel now updates PrevFocused.
Added to LBSetFont and CreateListBoxStruct a fake hdc that tests
and sets the standard text height.
Sun Mar 10 08:39:23 1996 Alex Korobka <alex@phm30.pharm.sunysb.edu>
* [windows/dce.c]
Fixed memory leak in DCE_ClipWindows().
---------------------------------------------------------------------- ----------------------------------------------------------------------
Fri Mar 8 19:07:18 1996 Alexandre Julliard <julliard@lrc.epfl.ch> Fri Mar 8 19:07:18 1996 Alexandre Julliard <julliard@lrc.epfl.ch>
@ -69,6 +132,11 @@ Mon Mar 4 23:22:40 1996 Jim Peterson <jspeter@birch.ee.vt.edu>
* [include/wintypes.h] * [include/wintypes.h]
Added "#define __export". Added "#define __export".
* [objects/bitblt.c]
Put in a few hacks to make bitblt-ing work when upside-down and/or
mirrored. BITBLT_StretchImage should really be checked over
thoroughly.
* [programs/progman/main.c] * [programs/progman/main.c]
Added "#include <resource.h>" for definition of HAVE_WINE_CONSTRUCTOR. Added "#include <resource.h>" for definition of HAVE_WINE_CONSTRUCTOR.

245
configure vendored
View file

@ -2,7 +2,7 @@
# From configure.in configure.in 1.00 # From configure.in configure.in 1.00
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.7 # Generated automatically using autoconf version 2.8
# Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc. # Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
# #
# This configure script is free software; the Free Software Foundation # This configure script is free software; the Free Software Foundation
@ -341,7 +341,7 @@ EOF
verbose=yes ;; verbose=yes ;;
-version | --version | --versio | --versi | --vers) -version | --version | --versio | --versi | --vers)
echo "configure generated by autoconf version 2.7" echo "configure generated by autoconf version 2.8"
exit 0 ;; exit 0 ;;
-with-* | --with-*) -with-* | --with-*)
@ -506,12 +506,9 @@ fi
ac_ext=c ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='echo $CPP $CPPFLAGS 1>&5; ac_cpp='$CPP $CPPFLAGS'
$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_compile='echo ${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5; ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5 2>&5'
ac_link='echo ${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5;
${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5 2>&5'
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
# Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
@ -644,7 +641,6 @@ else
fi fi
done done
IFS="$ac_save_ifs" IFS="$ac_save_ifs"
test -z "$ac_cv_prog_CC" && ac_cv_prog_CC="cc"
fi fi
fi fi
CC="$ac_cv_prog_CC" CC="$ac_cv_prog_CC"
@ -654,6 +650,55 @@ else
echo "$ac_t""no" 1>&6 echo "$ac_t""no" 1>&6
fi fi
if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
if test -n "$CC"; then
ac_cv_prog_CC="$CC" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
ac_prog_rejected=no
for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
ac_prog_rejected=yes
continue
fi
ac_cv_prog_CC="cc"
break
fi
done
IFS="$ac_save_ifs"
if test $ac_prog_rejected = yes; then
# We found a bogon in the path, so make sure we never use it.
set dummy $ac_cv_prog_CC
shift
if test $# -gt 0; then
# We chose a different compiler from the bogus one.
# However, it has the same basename, so the bogon will be chosen
# first if we set CC to just the basename; use the full file name.
shift
set dummy "$ac_dir/$ac_word" "$@"
shift
ac_cv_prog_CC="$@"
fi
fi
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
echo "$ac_t""$CC" 1>&6
else
echo "$ac_t""no" 1>&6
fi
test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
fi
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
@ -664,7 +709,7 @@ else
yes; yes;
#endif #endif
EOF EOF
if ${CC-cc} -E conftest.c 2>&5 | egrep yes >/dev/null 2>&1; then if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:713: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes ac_cv_prog_gcc=yes
else else
ac_cv_prog_gcc=no ac_cv_prog_gcc=no
@ -716,12 +761,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser, # On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. # not just through cpp.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 720 "configure" #line 765 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:771: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@ -730,12 +776,13 @@ else
rm -rf conftest* rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp" CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 734 "configure" #line 780 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:786: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@ -787,17 +834,20 @@ if test "${with_x+set}" = set; then
: :
fi fi
# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
if test "x$with_x" = xno; then if test "x$with_x" = xno; then
no_x=yes # The user explicitly disabled X.
have_x=disabled
else else
if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
no_x= # Both variables are already set.
have_x=yes
else else
if eval "test \"`echo '$''{'ac_cv_path_x'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
# One or both of the vars are not set, and there is no cached value. # One or both of the vars are not set, and there is no cached value.
no_x=yes ac_x_includes=NO ac_x_libraries=NO
rm -fr conftestdir rm -fr conftestdir
if mkdir conftestdir; then if mkdir conftestdir; then
cd conftestdir cd conftestdir
@ -807,7 +857,6 @@ acfindx:
@echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
EOF EOF
if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
no_x=
# GNU make sometimes prints "make[1]: Entering...", which would confuse us. # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
# Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
@ -831,24 +880,28 @@ EOF
rm -fr conftestdir rm -fr conftestdir
fi fi
if test "$no_x" = yes; then if test "$ac_x_includes" = NO; then
test -z "$x_direct_test_library" && x_direct_test_library=Xt # Guess where to find include files, by looking for this one X11 .h file.
test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h
test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h
# First, try using that file with no special directory specified.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 840 "configure" #line 890 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <$x_direct_test_include> #include <$x_direct_test_include>
EOF EOF
eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:895: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
rm -rf conftest* rm -rf conftest*
no_x= ac_x_includes= # We can compile using X headers with no special include directory.
ac_x_includes=
else else
echo "$ac_err" >&5 echo "$ac_err" >&5
rm -rf conftest* rm -rf conftest*
for ac_dir in \ # Look for the header file in a standard set of common directories.
for ac_dir in \
/usr/X11R6/include \ /usr/X11R6/include \
/usr/X11R5/include \ /usr/X11R5/include \
/usr/X11R4/include \ /usr/X11R4/include \
@ -886,20 +939,26 @@ else
; \ ; \
do do
if test -r "$ac_dir/$x_direct_test_include"; then if test -r "$ac_dir/$x_direct_test_include"; then
no_x= ac_x_includes=$ac_dir ac_x_includes=$ac_dir
break break
fi fi
done done
fi fi
rm -f conftest* rm -f conftest*
fi # $ac_x_includes = NO
# Check for the libraries. if test "$ac_x_libraries" = NO; then
# See if we find them without any special options. # Check for the libraries.
# Don't add to $LIBS permanently.
ac_save_LIBS="$LIBS" test -z "$x_direct_test_library" && x_direct_test_library=Xt
LIBS="-l$x_direct_test_library $LIBS" test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc
# See if we find them without any special options.
# Don't add to $LIBS permanently.
ac_save_LIBS="$LIBS"
LIBS="-l$x_direct_test_library $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 903 "configure" #line 962 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { return 0; } int main() { return 0; }
@ -907,9 +966,11 @@ int t() {
${x_direct_test_function}() ${x_direct_test_function}()
; return 0; } ; return 0; }
EOF EOF
if eval $ac_link; then if { (eval echo configure:970: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
LIBS="$ac_save_LIBS" no_x= ac_x_libraries= LIBS="$ac_save_LIBS"
# We can link X programs with no special library path.
ac_x_libraries=
else else
rm -rf conftest* rm -rf conftest*
LIBS="$ac_save_LIBS" LIBS="$ac_save_LIBS"
@ -953,7 +1014,7 @@ for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \
do do
for ac_extension in a so sl; do for ac_extension in a so sl; do
if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then
no_x= ac_x_libraries=$ac_dir ac_x_libraries=$ac_dir
break 2 break 2
fi fi
done done
@ -961,27 +1022,35 @@ done
fi fi
rm -f conftest* rm -f conftest*
fi fi # $ac_x_libraries = NO
if test "$no_x" = yes; then
ac_cv_path_x="no_x=yes" if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then
# Didn't find X anywhere. Cache the known absence of X.
ac_cv_have_x="have_x=no"
else else
ac_cv_path_x="no_x= ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" # Record where we found X for the cache.
ac_cv_have_x="have_x=yes \
ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
fi fi
fi fi
fi fi
eval "$ac_cv_path_x" eval "$ac_cv_have_x"
fi # $with_x != no fi # $with_x != no
if test "$no_x" = yes; then if test "$have_x" != yes; then
echo "$ac_t""no" 1>&6 echo "$ac_t""$have_x" 1>&6
no_x=yes
else else
# If each of the values was on the command line, it overrides each guess.
test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_includes" = xNONE && x_includes=$ac_x_includes
test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
ac_cv_path_x="no_x= ac_x_includes=$x_includes ac_x_libraries=$x_libraries" # Update the cache value to reflect the command line values.
ac_cv_have_x="have_x=yes \
ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6
fi fi
if test "$no_x" = yes; then if test "$no_x" = yes; then
# Not all programs may use this symbol, but it does not hurt to define it. # Not all programs may use this symbol, but it does not hurt to define it.
X_CFLAGS="$X_CFLAGS -DX_DISPLAY_MISSING" X_CFLAGS="$X_CFLAGS -DX_DISPLAY_MISSING"
else else
@ -1011,14 +1080,14 @@ else
# libraries we check for below, so use a different variable. # libraries we check for below, so use a different variable.
# --interran@uluru.Stanford.EDU, kb@cs.umb.edu. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
echo $ac_n "checking for -lICE""... $ac_c" 1>&6 echo $ac_n "checking for -lICE""... $ac_c" 1>&6
ac_lib_var=`echo ICE | tr '.-/+' '___p'` ac_lib_var=`echo ICE_IceConnectionNumber | tr '.-/+' '___p'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-lICE $LIBS" LIBS="-lICE $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1022 "configure" #line 1091 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { return 0; } int main() { return 0; }
@ -1026,7 +1095,7 @@ int t() {
IceConnectionNumber() IceConnectionNumber()
; return 0; } ; return 0; }
EOF EOF
if eval $ac_link; then if { (eval echo configure:1099: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1055,14 +1124,14 @@ fi
# libraries were built with DECnet support. And karl@cs.umb.edu says # libraries were built with DECnet support. And karl@cs.umb.edu says
# the Alpha needs dnet_stub (dnet does not exist). # the Alpha needs dnet_stub (dnet does not exist).
echo $ac_n "checking for -ldnet""... $ac_c" 1>&6 echo $ac_n "checking for -ldnet""... $ac_c" 1>&6
ac_lib_var=`echo dnet | tr '.-/+' '___p'` ac_lib_var=`echo dnet_dnet_ntoa | tr '.-/+' '___p'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-ldnet $LIBS" LIBS="-ldnet $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1066 "configure" #line 1135 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { return 0; } int main() { return 0; }
@ -1070,7 +1139,7 @@ int t() {
dnet_ntoa() dnet_ntoa()
; return 0; } ; return 0; }
EOF EOF
if eval $ac_link; then if { (eval echo configure:1143: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1090,14 +1159,14 @@ fi
if test $ac_cv_lib_dnet = no; then if test $ac_cv_lib_dnet = no; then
echo $ac_n "checking for -ldnet_stub""... $ac_c" 1>&6 echo $ac_n "checking for -ldnet_stub""... $ac_c" 1>&6
ac_lib_var=`echo dnet_stub | tr '.-/+' '___p'` ac_lib_var=`echo dnet_stub_dnet_ntoa | tr '.-/+' '___p'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-ldnet_stub $LIBS" LIBS="-ldnet_stub $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1101 "configure" #line 1170 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { return 0; } int main() { return 0; }
@ -1105,7 +1174,7 @@ int t() {
dnet_ntoa() dnet_ntoa()
; return 0; } ; return 0; }
EOF EOF
if eval $ac_link; then if { (eval echo configure:1178: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1130,14 +1199,14 @@ fi
# Not sure which flavor of 386 UNIX this is, but it seems harmless to # Not sure which flavor of 386 UNIX this is, but it seems harmless to
# check for it. # check for it.
echo $ac_n "checking for -lnsl""... $ac_c" 1>&6 echo $ac_n "checking for -lnsl""... $ac_c" 1>&6
ac_lib_var=`echo nsl | tr '.-/+' '___p'` ac_lib_var=`echo nsl_t_accept | tr '.-/+' '___p'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-lnsl $LIBS" LIBS="-lnsl $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1141 "configure" #line 1210 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { return 0; } int main() { return 0; }
@ -1145,7 +1214,7 @@ int t() {
t_accept() t_accept()
; return 0; } ; return 0; }
EOF EOF
if eval $ac_link; then if { (eval echo configure:1218: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1169,14 +1238,14 @@ fi
# But -lsocket is broken on IRIX, according to simon@lia.di.epfl.ch. # But -lsocket is broken on IRIX, according to simon@lia.di.epfl.ch.
if test "`(uname) 2>/dev/null`" != IRIX; then if test "`(uname) 2>/dev/null`" != IRIX; then
echo $ac_n "checking for -lsocket""... $ac_c" 1>&6 echo $ac_n "checking for -lsocket""... $ac_c" 1>&6
ac_lib_var=`echo socket | tr '.-/+' '___p'` ac_lib_var=`echo socket_socket | tr '.-/+' '___p'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-lsocket $LIBS" LIBS="-lsocket $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1180 "configure" #line 1249 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { return 0; } int main() { return 0; }
@ -1184,7 +1253,7 @@ int t() {
socket() socket()
; return 0; } ; return 0; }
EOF EOF
if eval $ac_link; then if { (eval echo configure:1257: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1274,14 +1343,14 @@ then
*) ac_lib=l ;; *) ac_lib=l ;;
esac esac
echo $ac_n "checking for -l$ac_lib""... $ac_c" 1>&6 echo $ac_n "checking for -l$ac_lib""... $ac_c" 1>&6
ac_lib_var=`echo $ac_lib | tr '.-/+' '___p'` ac_lib_var=`echo $ac_lib_yywrap | tr '.-/+' '___p'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-l$ac_lib $LIBS" LIBS="-l$ac_lib $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1285 "configure" #line 1354 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { return 0; } int main() { return 0; }
@ -1289,7 +1358,7 @@ int t() {
yywrap() yywrap()
; return 0; } ; return 0; }
EOF EOF
if eval $ac_link; then if { (eval echo configure:1362: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1397,14 +1466,14 @@ test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
echo $ac_n "checking for -li386""... $ac_c" 1>&6 echo $ac_n "checking for -li386""... $ac_c" 1>&6
ac_lib_var=`echo i386 | tr '.-/+' '___p'` ac_lib_var=`echo i386_i386_set_ldt | tr '.-/+' '___p'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-li386 $LIBS" LIBS="-li386 $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1408 "configure" #line 1477 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { return 0; } int main() { return 0; }
@ -1412,7 +1481,7 @@ int t() {
i386_set_ldt() i386_set_ldt()
; return 0; } ; return 0; }
EOF EOF
if eval $ac_link; then if { (eval echo configure:1485: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1444,11 +1513,11 @@ else
ac_cv_c_cross=yes ac_cv_c_cross=yes
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1448 "configure" #line 1517 "configure"
#include "confdefs.h" #include "confdefs.h"
main(){return(0);} main(){return(0);}
EOF EOF
eval $ac_link { (eval echo configure:1521: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
if test -s conftest && (./conftest; exit) 2>/dev/null; then if test -s conftest && (./conftest; exit) 2>/dev/null; then
ac_cv_c_cross=no ac_cv_c_cross=no
else else
@ -1469,7 +1538,7 @@ else
ac_cv_c_gcc_strength_bug="yes" ac_cv_c_gcc_strength_bug="yes"
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1473 "configure" #line 1542 "configure"
#include "confdefs.h" #include "confdefs.h"
int main(void) { int main(void) {
@ -1480,7 +1549,7 @@ int main(void) {
exit( Array[1] != -2 ); exit( Array[1] != -2 );
} }
EOF EOF
eval $ac_link { (eval echo configure:1553: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
if test -s conftest && (./conftest; exit) 2>/dev/null; then if test -s conftest && (./conftest; exit) 2>/dev/null; then
ac_cv_c_gcc_strength_bug="no" ac_cv_c_gcc_strength_bug="no"
else else
@ -1505,7 +1574,7 @@ if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1509 "configure" #line 1578 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */ which can conflict with char $ac_func(); below. */
@ -1527,7 +1596,7 @@ $ac_func();
; return 0; } ; return 0; }
EOF EOF
if eval $ac_link; then if { (eval echo configure:1600: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_func_$ac_func=yes" eval "ac_cv_func_$ac_func=yes"
else else
@ -1557,11 +1626,12 @@ if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1561 "configure" #line 1630 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <$ac_hdr> #include <$ac_hdr>
EOF EOF
eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1635: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
rm -rf conftest* rm -rf conftest*
@ -1590,7 +1660,7 @@ if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1594 "configure" #line 1664 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -1645,7 +1715,7 @@ if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1649 "configure" #line 1719 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { return 0; } int main() { return 0; }
@ -1695,7 +1765,7 @@ ccp = (char const *const *) p;
; return 0; } ; return 0; }
EOF EOF
if eval $ac_compile; then if { (eval echo configure:1769: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
ac_cv_c_const=yes ac_cv_c_const=yes
else else
@ -1719,14 +1789,15 @@ if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1723 "configure" #line 1793 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
#include <string.h> #include <string.h>
#include <float.h> #include <float.h>
EOF EOF
eval "$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:1801: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
rm -rf conftest* rm -rf conftest*
@ -1741,7 +1812,7 @@ rm -f conftest*
if test $ac_cv_header_stdc = yes; then if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI. # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1745 "configure" #line 1816 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <string.h> #include <string.h>
EOF EOF
@ -1759,7 +1830,7 @@ fi
if test $ac_cv_header_stdc = yes; then if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1763 "configure" #line 1834 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <stdlib.h> #include <stdlib.h>
EOF EOF
@ -1780,7 +1851,7 @@ if test "$cross_compiling" = yes; then
: :
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1784 "configure" #line 1855 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <ctype.h> #include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@ -1791,7 +1862,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); } exit (0); }
EOF EOF
eval $ac_link { (eval echo configure:1866: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }
if test -s conftest && (./conftest; exit) 2>/dev/null; then if test -s conftest && (./conftest; exit) 2>/dev/null; then
: :
else else
@ -1815,7 +1886,7 @@ if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1819 "configure" #line 1890 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <sys/types.h> #include <sys/types.h>
#if STDC_HEADERS #if STDC_HEADERS
@ -1899,7 +1970,7 @@ trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
# Protect against shell expansion while executing Makefile rules. # Protect against shell expansion while executing Makefile rules.
# Protect against Makefile macro expansion. # Protect against Makefile macro expansion.
cat > conftest.defs <<\EOF cat > conftest.defs <<\EOF
s%#define \([A-Za-z_][A-Za-z0-9_]*\) \(.*\)%-D\1=\2%g s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
s%\[%\\&%g s%\[%\\&%g
s%\]%\\&%g s%\]%\\&%g
@ -1934,7 +2005,7 @@ do
echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
-version | --version | --versio | --versi | --vers | --ver | --ve | --v) -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
echo "$CONFIG_STATUS generated by autoconf version 2.7" echo "$CONFIG_STATUS generated by autoconf version 2.8"
exit 0 ;; exit 0 ;;
-help | --help | --hel | --he | --h) -help | --help | --hel | --he | --h)
echo "\$ac_cs_usage"; exit 0 ;; echo "\$ac_cs_usage"; exit 0 ;;

View file

@ -32,6 +32,9 @@
* I hope no programs rely on the implementation of combos. * I hope no programs rely on the implementation of combos.
*/ */
#define CBLMM_EDGE 4 /* distance inside box which is same as moving mouse
outside box, to trigger scrolling of CBL */
static HBITMAP hComboBit = 0; static HBITMAP hComboBit = 0;
static WORD CBitHeight, CBitWidth; static WORD CBitHeight, CBitWidth;
@ -470,6 +473,8 @@ static LRESULT CBSetCurSel(HWND hwnd, WPARAM wParam, LPARAM lParam)
wRet = ListBoxSetCurSel(lphl, wParam); wRet = ListBoxSetCurSel(lphl, wParam);
dprintf_combo(stddeb,"CBSetCurSel: hwnd "NPFMT" wp %x lp %lx wRet %d\n",
hwnd,wParam,lParam,wRet);
/* SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);*/ /* SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);*/
InvalidateRect(hwnd, NULL, TRUE); InvalidateRect(hwnd, NULL, TRUE);
@ -877,37 +882,41 @@ static LRESULT CBLLButtonUp( HWND hwnd, WPARAM wParam, LPARAM lParam )
static LRESULT CBLMouseMove( HWND hwnd, WPARAM wParam, LPARAM lParam ) static LRESULT CBLMouseMove( HWND hwnd, WPARAM wParam, LPARAM lParam )
{ {
LPHEADLIST lphl = CLBoxGetListHeader(hwnd); LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
int y; short y;
WORD wRet; WORD wRet;
RECT rect, rectsel; /* XXX Broken */ RECT rect, rectsel;
y = SHIWORD(lParam);
wRet = ListBoxFindMouse(lphl, LOWORD(lParam), HIWORD(lParam));
ListBoxGetItemRect(lphl, wRet, &rectsel);
GetClientRect(hwnd, &rect);
dprintf_combo(stddeb,"CBLMouseMove: hwnd "NPFMT" wp %x lp %lx y %d if %d wret %d %d,%d-%d,%d\n",
hwnd,wParam,lParam,y,lphl->ItemFocused,wRet,rectsel.left,rectsel.top,rectsel.right,rectsel.bottom);
if ((wParam & MK_LBUTTON) != 0) { if ((wParam & MK_LBUTTON) != 0) {
y = SHIWORD(lParam); if (y < CBLMM_EDGE) {
if (y < 0) {
if (lphl->FirstVisible > 0) { if (lphl->FirstVisible > 0) {
lphl->FirstVisible--; lphl->FirstVisible--;
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE); SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
ListBoxSetCurSel(lphl, wRet);
InvalidateRect(hwnd, NULL, TRUE); InvalidateRect(hwnd, NULL, TRUE);
return 0; return 0;
} }
} }
GetClientRect(hwnd, &rect); else if (y >= (rect.bottom-CBLMM_EDGE)) {
if (y >= rect.bottom) {
if (lphl->FirstVisible < ListMaxFirstVisible(lphl)) { if (lphl->FirstVisible < ListMaxFirstVisible(lphl)) {
lphl->FirstVisible++; lphl->FirstVisible++;
SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE); SetScrollPos(hwnd, SB_VERT, lphl->FirstVisible, TRUE);
ListBoxSetCurSel(lphl, wRet);
InvalidateRect(hwnd, NULL, TRUE); InvalidateRect(hwnd, NULL, TRUE);
return 0; return 0;
} }
} }
if ((y > 0) && (y < (rect.bottom - 4))) { else {
if ((y < rectsel.top) || (y > rectsel.bottom)) { if ((short) wRet == lphl->ItemFocused) return 0;
wRet = ListBoxFindMouse(lphl, LOWORD(lParam), HIWORD(lParam)); ListBoxSetCurSel(lphl, wRet);
if (wRet == lphl->ItemFocused) return 0; InvalidateRect(hwnd, NULL, TRUE);
ListBoxSetCurSel(lphl, wRet);
ListBoxGetItemRect(lphl, wRet, &rectsel);
InvalidateRect(hwnd, NULL, TRUE);
}
} }
} }

View file

@ -1757,7 +1757,7 @@ static void EDIT_InsertText(HWND hwnd, char *str, int len)
{ {
int plen; int plen;
EDITSTATE *es = EDIT_GetEditState(hwnd); EDITSTATE *es = EDIT_GetEditState(hwnd);
char *text = EDIT_HeapLock(hwnd, es->hText); char *p, *text = EDIT_HeapLock(hwnd, es->hText);
plen = strlen(text) + len; plen = strlen(text) + len;
if (plen + 1 > es->textlen) if (plen + 1 > es->textlen)
@ -1767,7 +1767,7 @@ static void EDIT_InsertText(HWND hwnd, char *str, int len)
text = EDIT_HeapLock(hwnd, es->hText); text = EDIT_HeapLock(hwnd, es->hText);
es->textlen = plen + 1; es->textlen = plen + 1;
} }
memmove(CurrChar + len, CurrChar, strlen(CurrChar) + 1); for (p = CurrChar + strlen(CurrChar); p >= CurrChar; p--) p[len] = *p;
memcpy(CurrChar, str, len); memcpy(CurrChar, str, len);
EDIT_BuildTextPointers(hwnd); EDIT_BuildTextPointers(hwnd);
@ -1834,7 +1834,7 @@ static void EDIT_KeyTyped(HWND hwnd, short ch)
{ {
EDITSTATE *es = EDIT_GetEditState(hwnd); EDITSTATE *es = EDIT_GetEditState(hwnd);
char *text = EDIT_HeapLock(hwnd, es->hText); char *text = EDIT_HeapLock(hwnd, es->hText);
char *currchar; char *currchar, *p;
RECT rc; RECT rc;
BOOL FullPaint = FALSE; BOOL FullPaint = FALSE;
@ -1890,14 +1890,14 @@ static void EDIT_KeyTyped(HWND hwnd, short ch)
/* make space for new character and put char in buffer */ /* make space for new character and put char in buffer */
if (ch == '\n') if (ch == '\n')
{ {
memmove(currchar + 2, currchar, strlen(currchar) + 1); for (p = currchar + strlen(currchar); p >= currchar; p--) p[2] = p[0];
*currchar = '\r'; *currchar = '\r';
*(currchar + 1) = '\n'; *(currchar + 1) = '\n';
EDIT_ModTextPointers(hwnd, es->CurrLine + 1, 2); EDIT_ModTextPointers(hwnd, es->CurrLine + 1, 2);
} }
else else
{ {
memmove(currchar + 1, currchar, strlen(currchar) + 1); for (p = currchar + strlen(currchar); p >= currchar; p--) p[1] = p[0];
*currchar = ch; *currchar = ch;
EDIT_ModTextPointers(hwnd, es->CurrLine + 1, 1); EDIT_ModTextPointers(hwnd, es->CurrLine + 1, 1);
} }

View file

@ -78,6 +78,7 @@ static void ListBoxInitialize(LPHEADLIST lphl)
void CreateListBoxStruct(HWND hwnd, WORD CtlType, LONG styles, HWND parent) void CreateListBoxStruct(HWND hwnd, WORD CtlType, LONG styles, HWND parent)
{ {
LPHEADLIST lphl; LPHEADLIST lphl;
HDC hdc;
lphl = (LPHEADLIST)xmalloc(sizeof(HEADLIST)); lphl = (LPHEADLIST)xmalloc(sizeof(HEADLIST));
SetWindowLong(hwnd, 0, (LONG)lphl); SetWindowLong(hwnd, 0, (LONG)lphl);
@ -89,11 +90,27 @@ void CreateListBoxStruct(HWND hwnd, WORD CtlType, LONG styles, HWND parent)
lphl->TabStops = NULL; lphl->TabStops = NULL;
lphl->hFont = GetStockObject(SYSTEM_FONT); lphl->hFont = GetStockObject(SYSTEM_FONT);
lphl->hSelf = hwnd; lphl->hSelf = hwnd;
if (CtlType==ODT_COMBOBOX) /* use the "faked" style for COMBOLBOX */
/* LBS_SORT instead CBS_SORT e.g. */
lphl->dwStyle = MAKELONG(LOWORD(styles),HIWORD(GetWindowLong(hwnd,GWL_STYLE)));
else
lphl->dwStyle = GetWindowLong(hwnd,GWL_STYLE); /* use original style dword */
lphl->hParent = parent; lphl->hParent = parent;
lphl->StdItemHeight = 15; /* FIXME: should get the font height */ lphl->StdItemHeight = 15; /* FIXME: should get the font height */
lphl->OwnerDrawn = styles & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE); lphl->OwnerDrawn = styles & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE);
lphl->HasStrings = (styles & LBS_HASSTRINGS) || !lphl->OwnerDrawn; lphl->HasStrings = (styles & LBS_HASSTRINGS) || !lphl->OwnerDrawn;
/* create dummy hdc to set text height */
if ((hdc = GetDC(0)))
{
TEXTMETRIC tm;
GetTextMetrics( hdc, &tm );
lphl->StdItemHeight = tm.tmHeight;
dprintf_listbox(stddeb,"CreateListBoxStruct: font height %d\n",
lphl->StdItemHeight);
ReleaseDC( 0, hdc );
}
if (lphl->OwnerDrawn) { if (lphl->OwnerDrawn) {
LISTSTRUCT dummyls; LISTSTRUCT dummyls;
@ -143,9 +160,7 @@ static LPHEADLIST ListBoxGetStorageHeader(HWND hwnd)
has the LBS_NOTIFY style */ has the LBS_NOTIFY style */
void ListBoxSendNotification(LPHEADLIST lphl, WORD code) void ListBoxSendNotification(LPHEADLIST lphl, WORD code)
{ {
DWORD dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE); if (lphl->dwStyle & LBS_NOTIFY)
if (dwStyle & LBS_NOTIFY)
#ifdef WINELIB32 #ifdef WINELIB32
SendMessage(lphl->hParent, WM_COMMAND, SendMessage(lphl->hParent, WM_COMMAND,
MAKEWPARAM(lphl->CtlID,code), (LPARAM)lphl->hSelf); MAKEWPARAM(lphl->CtlID,code), (LPARAM)lphl->hSelf);
@ -223,8 +238,6 @@ LPLISTSTRUCT ListBoxGetItem(LPHEADLIST lphl, UINT uIndex)
void ListBoxDrawItem (HWND hwnd, LPHEADLIST lphl, HDC hdc, LPLISTSTRUCT lpls, void ListBoxDrawItem (HWND hwnd, LPHEADLIST lphl, HDC hdc, LPLISTSTRUCT lpls,
RECT *rect, WORD itemAction, WORD itemState) RECT *rect, WORD itemAction, WORD itemState)
{ {
LONG dwStyle = GetWindowLong(hwnd,GWL_STYLE);
if (lphl->OwnerDrawn) { if (lphl->OwnerDrawn) {
DRAWITEMSTRUCT *dis = USER_HEAP_LIN_ADDR(lphl->hDrawItemStruct); DRAWITEMSTRUCT *dis = USER_HEAP_LIN_ADDR(lphl->hDrawItemStruct);
@ -251,7 +264,7 @@ void ListBoxDrawItem (HWND hwnd, LPHEADLIST lphl, HDC hdc, LPLISTSTRUCT lpls,
FillRect(hdc, rect, GetStockObject(BLACK_BRUSH)); FillRect(hdc, rect, GetStockObject(BLACK_BRUSH));
} }
if (dwStyle & LBS_USETABSTOPS) { if (lphl->dwStyle & LBS_USETABSTOPS) {
TabbedTextOut(hdc, rect->left + 5, rect->top + 2, TabbedTextOut(hdc, rect->left + 5, rect->top + 2,
(char *)lpls->itemText, strlen((char *)lpls->itemText), (char *)lpls->itemText, strlen((char *)lpls->itemText),
lphl->iNumStops, lphl->TabStops, 0); lphl->iNumStops, lphl->TabStops, 0);
@ -311,7 +324,7 @@ void ListBoxAskMeasure(LPHEADLIST lphl, LPLISTSTRUCT lpls)
lpmeasure->itemHeight = lphl->StdItemHeight; lpmeasure->itemHeight = lphl->StdItemHeight;
SendMessage(lphl->hParent, WM_MEASUREITEM, 0, (LPARAM)USER_HEAP_SEG_ADDR(hTemp)); SendMessage(lphl->hParent, WM_MEASUREITEM, 0, (LPARAM)USER_HEAP_SEG_ADDR(hTemp));
if (GetWindowLong(lphl->hSelf,GWL_STYLE) & LBS_OWNERDRAWFIXED) { if (lphl->dwStyle & LBS_OWNERDRAWFIXED) {
lphl->StdItemHeight = lpmeasure->itemHeight; lphl->StdItemHeight = lpmeasure->itemHeight;
lphl->needMeasure = FALSE; lphl->needMeasure = FALSE;
} }
@ -405,10 +418,9 @@ int ListBoxInsertString(LPHEADLIST lphl, UINT uIndex, LPCSTR newstr)
int ListBoxAddString(LPHEADLIST lphl, LPCSTR newstr) int ListBoxAddString(LPHEADLIST lphl, LPCSTR newstr)
{ {
LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
UINT pos = (UINT) -1; UINT pos = (UINT) -1;
if (lphl->HasStrings && (dwStyle & LBS_SORT)) { if (lphl->HasStrings && (lphl->dwStyle & LBS_SORT)) {
LPLISTSTRUCT lpls = lphl->lpFirst; LPLISTSTRUCT lpls = lphl->lpFirst;
for (pos = 0; lpls != NULL; lpls = lpls->lpNext, pos++) for (pos = 0; lpls != NULL; lpls = lpls->lpNext, pos++)
if (strcmp(lpls->itemText, newstr) >= 0) if (strcmp(lpls->itemText, newstr) >= 0)
@ -503,7 +515,6 @@ int ListBoxFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr)
UINT Count; UINT Count;
UINT First = nFirst + 1; UINT First = nFirst + 1;
LPSTR lpMatchStr = (LPSTR)MatchStr; LPSTR lpMatchStr = (LPSTR)MatchStr;
LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
if (First > lphl->ItemsCount) return LB_ERR; if (First > lphl->ItemsCount) return LB_ERR;
@ -514,7 +525,7 @@ int ListBoxFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr)
while(lpls != NULL) { while(lpls != NULL) {
if (lphl->HasStrings) { if (lphl->HasStrings) {
if (strstr(lpls->itemText, lpMatchStr) == lpls->itemText) return Count; if (strstr(lpls->itemText, lpMatchStr) == lpls->itemText) return Count;
} else if (dwStyle & LBS_SORT) { } else if (lphl->dwStyle & LBS_SORT) {
/* XXX Do a compare item */ /* XXX Do a compare item */
} }
else else
@ -531,7 +542,7 @@ int ListBoxFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr)
while (Count < First) { while (Count < First) {
if (lphl->HasStrings) { if (lphl->HasStrings) {
if (strstr(lpls->itemText, lpMatchStr) == lpls->itemText) return Count; if (strstr(lpls->itemText, lpMatchStr) == lpls->itemText) return Count;
} else if (dwStyle & LBS_SORT) { } else if (lphl->dwStyle & LBS_SORT) {
/* XXX Do a compare item */ /* XXX Do a compare item */
} else { } else {
if (lpls->mis.itemData == (DWORD)lpMatchStr) return Count; if (lpls->mis.itemData == (DWORD)lpMatchStr) return Count;
@ -572,13 +583,13 @@ int ListBoxResetContent(LPHEADLIST lphl)
int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex) int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex)
{ {
LPLISTSTRUCT lpls; LPLISTSTRUCT lpls;
DWORD dwStyle = GetWindowWord(lphl->hSelf,GWL_STYLE);
/* use ListBoxSetSel instead */ /* use ListBoxSetSel instead */
if (dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ) return 0; if (lphl->dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ) return 0;
/* unselect previous item */ /* unselect previous item */
if (lphl->ItemFocused != -1) { if (lphl->ItemFocused != -1) {
lphl->PrevFocused = lphl->ItemFocused;
lpls = ListBoxGetItem(lphl, lphl->ItemFocused); lpls = ListBoxGetItem(lphl, lphl->ItemFocused);
if (lpls == 0) return LB_ERR; if (lpls == 0) return LB_ERR;
lpls->itemState = 0; lpls->itemState = 0;
@ -602,8 +613,7 @@ int ListBoxSetSel(LPHEADLIST lphl, WORD wIndex, WORD state)
LPLISTSTRUCT lpls; LPLISTSTRUCT lpls;
int n = 0; int n = 0;
if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & if (!(lphl->dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
(LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
return LB_ERR; return LB_ERR;
if (wIndex == (UINT)-1) { if (wIndex == (UINT)-1) {
@ -715,7 +725,7 @@ int ListBoxSetItemHeight(LPHEADLIST lphl, WORD wIndex, long height)
{ {
LPLISTSTRUCT lpls; LPLISTSTRUCT lpls;
if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & LBS_OWNERDRAWVARIABLE)) { if (!(lphl->dwStyle & LBS_OWNERDRAWVARIABLE)) {
lphl->StdItemHeight = (short)height; lphl->StdItemHeight = (short)height;
return 0; return 0;
} }
@ -747,7 +757,7 @@ int ListBoxFindNextMatch(LPHEADLIST lphl, WORD wChar)
for(; lpls != NULL; lpls = lpls->lpNext, count++) { for(; lpls != NULL; lpls = lpls->lpNext, count++) {
if (*lpls->itemText != (char)wChar) if (*lpls->itemText != (char)wChar)
break; break;
if (count > lphl->ItemFocused) if ((short) count > lphl->ItemFocused)
return count; return count;
} }
return first; return first;
@ -776,6 +786,7 @@ static LONG LBCreate(HWND hwnd, WORD wParam, LONG lParam)
return 0; return 0;
} }
/*********************************************************************** /***********************************************************************
* LBDestroy * LBDestroy
*/ */
@ -905,7 +916,6 @@ static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam)
WORD wRet; WORD wRet;
int y,n; int y,n;
RECT rectsel; RECT rectsel;
LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
POINT tmpPOINT; POINT tmpPOINT;
tmpPOINT.x = LOWORD(lParam); tmpPOINT.y = HIWORD(lParam); tmpPOINT.x = LOWORD(lParam); tmpPOINT.y = HIWORD(lParam);
@ -918,12 +928,12 @@ static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam)
if (y == -1) return 0; if (y == -1) return 0;
if (dwStyle & LBS_NOTIFY && y!= LB_ERR ) if (lphl->dwStyle & LBS_NOTIFY && y!= LB_ERR )
if( SendMessage(lphl->hParent, WM_LBTRACKPOINT, y, lParam) ) if( SendMessage(lphl->hParent, WM_LBTRACKPOINT, y, lParam) )
return 0; return 0;
switch( dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ) switch( lphl->dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) )
{ {
case LBS_MULTIPLESEL: case LBS_MULTIPLESEL:
lphl->ItemFocused = y; lphl->ItemFocused = y;
@ -960,7 +970,7 @@ static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam)
} }
/* invalidate changed items */ /* invalidate changed items */
if( dwStyle & LBS_MULTIPLESEL || y!=lphl->PrevFocused ) if( lphl->dwStyle & LBS_MULTIPLESEL || y!=lphl->PrevFocused )
{ {
ListBoxGetItemRect(lphl, y, &rectsel); ListBoxGetItemRect(lphl, y, &rectsel);
InvalidateRect(hwnd, &rectsel, TRUE); InvalidateRect(hwnd, &rectsel, TRUE);
@ -1021,7 +1031,6 @@ static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam)
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
int y,redraw_prev = 0; int y,redraw_prev = 0;
int iRet; int iRet;
LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
RECT rect, rectsel; /* XXX Broken */ RECT rect, rectsel; /* XXX Broken */
dprintf_listbox(stddeb,"LBMouseMove %d %d\n",SLOWORD(lParam),SHIWORD(lParam)); dprintf_listbox(stddeb,"LBMouseMove %d %d\n",SLOWORD(lParam),SHIWORD(lParam));
@ -1050,10 +1059,10 @@ static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam)
if (iRet == lphl->ItemFocused || iRet == -1) { if (iRet == lphl->ItemFocused || iRet == -1) {
return 0; return 0;
} }
if (dwStyle & LBS_MULTIPLESEL) { if (lphl->dwStyle & LBS_MULTIPLESEL) {
lphl->ItemFocused = iRet; lphl->ItemFocused = iRet;
ListBoxSendNotification(lphl, LBN_SELCHANGE); ListBoxSendNotification(lphl, LBN_SELCHANGE);
} else if ( dwStyle & LBS_EXTENDEDSEL ) } else if ( lphl->dwStyle & LBS_EXTENDEDSEL )
{ {
/* Fixme: extended selection mode */ /* Fixme: extended selection mode */
ListBoxSetSel( lphl, lphl->ItemFocused, 0); ListBoxSetSel( lphl, lphl->ItemFocused, 0);
@ -1089,7 +1098,6 @@ static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam)
static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam) static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
{ {
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
WORD newFocused = 0xFFFF; WORD newFocused = 0xFFFF;
RECT rect; RECT rect;
@ -1104,7 +1112,7 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
case VK_DOWN: case VK_DOWN:
case VK_PRIOR: case VK_PRIOR:
case VK_NEXT: case VK_NEXT:
if ( dwStyle & LBS_WANTKEYBOARDINPUT ) if ( lphl->dwStyle & LBS_WANTKEYBOARDINPUT )
{ {
newFocused = (WORD)(INT)SendMessage(lphl->hParent,WM_VKEYTOITEM, newFocused = (WORD)(INT)SendMessage(lphl->hParent,WM_VKEYTOITEM,
wParam,MAKELPARAM(lphl->ItemFocused,hwnd)); wParam,MAKELPARAM(lphl->ItemFocused,hwnd));
@ -1124,7 +1132,7 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
newFocused = lphl->ItemsCount - 1; newFocused = lphl->ItemsCount - 1;
break; break;
case VK_LEFT: case VK_LEFT:
if (dwStyle & LBS_MULTICOLUMN) { if (lphl->dwStyle & LBS_MULTICOLUMN) {
if (newFocused >= lphl->ItemsPerColumn) { if (newFocused >= lphl->ItemsPerColumn) {
newFocused -= lphl->ItemsPerColumn; newFocused -= lphl->ItemsPerColumn;
} else { } else {
@ -1136,7 +1144,7 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
if (newFocused > 0) newFocused--; if (newFocused > 0) newFocused--;
break; break;
case VK_RIGHT: case VK_RIGHT:
if (dwStyle & LBS_MULTICOLUMN) if (lphl->dwStyle & LBS_MULTICOLUMN)
newFocused += lphl->ItemsPerColumn; newFocused += lphl->ItemsPerColumn;
break; break;
case VK_DOWN: case VK_DOWN:
@ -1157,7 +1165,7 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
} }
break; break;
case VK_SPACE: case VK_SPACE:
if (dwStyle & LBS_MULTIPLESEL) if (lphl->dwStyle & LBS_MULTIPLESEL)
{ {
WORD wRet = ListBoxGetSel(lphl, lphl->ItemFocused); WORD wRet = ListBoxGetSel(lphl, lphl->ItemFocused);
ListBoxSetSel(lphl, lphl->ItemFocused, !wRet); ListBoxSetSel(lphl, lphl->ItemFocused, !wRet);
@ -1174,7 +1182,7 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
if (newFocused >= lphl->ItemsCount) if (newFocused >= lphl->ItemsCount)
newFocused = lphl->ItemsCount - 1; newFocused = lphl->ItemsCount - 1;
if (!(dwStyle & LBS_MULTIPLESEL)) if (!(lphl->dwStyle & LBS_MULTIPLESEL))
{ {
ListBoxSetCurSel(lphl, newFocused); ListBoxSetCurSel(lphl, newFocused);
ListBoxSendNotification(lphl, LBN_SELCHANGE); ListBoxSendNotification(lphl, LBN_SELCHANGE);
@ -1182,7 +1190,7 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
lphl->ItemFocused = newFocused; lphl->ItemFocused = newFocused;
if( ListBoxScrollToFocus(lphl) || (dwStyle & if( ListBoxScrollToFocus(lphl) || (lphl->dwStyle &
(LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) ) (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) )
InvalidateRect(hwnd, NULL, TRUE); InvalidateRect(hwnd, NULL, TRUE);
else else
@ -1206,10 +1214,9 @@ static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
static LONG LBChar(HWND hwnd, WORD wParam, LONG lParam) static LONG LBChar(HWND hwnd, WORD wParam, LONG lParam)
{ {
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
WORD newFocused = 0xFFFF; WORD newFocused = 0xFFFF;
if ( (dwStyle & LBS_WANTKEYBOARDINPUT) && !(lphl->HasStrings)) if ( (lphl->dwStyle & LBS_WANTKEYBOARDINPUT) && !(lphl->HasStrings))
{ {
newFocused = (WORD)(INT)SendMessage(lphl->hParent,WM_CHARTOITEM, newFocused = (WORD)(INT)SendMessage(lphl->hParent,WM_CHARTOITEM,
wParam,MAKELPARAM(lphl->ItemFocused,hwnd)); wParam,MAKELPARAM(lphl->ItemFocused,hwnd));
@ -1224,7 +1231,7 @@ static LONG LBChar(HWND hwnd, WORD wParam, LONG lParam)
if (newFocused >= lphl->ItemsCount) if (newFocused >= lphl->ItemsCount)
newFocused = lphl->ItemsCount - 1; newFocused = lphl->ItemsCount - 1;
if (!(dwStyle & LBS_MULTIPLESEL)) if (!(lphl->dwStyle & LBS_MULTIPLESEL))
{ {
ListBoxSetCurSel(lphl, newFocused); ListBoxSetCurSel(lphl, newFocused);
ListBoxSendNotification(lphl, LBN_SELCHANGE); ListBoxSendNotification(lphl, LBN_SELCHANGE);
@ -1259,12 +1266,26 @@ static LONG LBSetRedraw(HWND hwnd, WORD wParam, LONG lParam)
static LONG LBSetFont(HWND hwnd, WPARAM wParam, LPARAM lParam) static LONG LBSetFont(HWND hwnd, WPARAM wParam, LPARAM lParam)
{ {
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
HDC hdc;
if (wParam == 0) if (wParam == 0)
lphl->hFont = GetStockObject(SYSTEM_FONT); lphl->hFont = GetStockObject(SYSTEM_FONT);
else else
lphl->hFont = (HFONT) wParam; lphl->hFont = (HFONT) wParam;
/* a new font means possible new text height */
/* does this mean the height of each entry must be separately changed? */
/* or are we guaranteed to get a LBSetFont before the first insert/add? */
if ((hdc = GetDC(0)))
{
TEXTMETRIC tm;
GetTextMetrics( hdc, &tm );
lphl->StdItemHeight = tm.tmHeight;
dprintf_listbox(stddeb,"LBSetFont: new font %d with height %d",
lphl->hFont, lphl->StdItemHeight);
ReleaseDC( 0, hdc );
}
return 0; return 0;
} }
@ -1274,7 +1295,6 @@ static LONG LBSetFont(HWND hwnd, WPARAM wParam, LPARAM lParam)
static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam) static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
{ {
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LONG dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
LPLISTSTRUCT lpls; LPLISTSTRUCT lpls;
PAINTSTRUCT ps; PAINTSTRUCT ps;
HBRUSH hBrush; HBRUSH hBrush;
@ -1311,7 +1331,7 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
FillRect(hdc, &rect, hBrush); FillRect(hdc, &rect, hBrush);
maxwidth = rect.right; maxwidth = rect.right;
if (dwStyle & LBS_MULTICOLUMN) { if (lphl->dwStyle & LBS_MULTICOLUMN) {
rect.right = lphl->ColumnsWidth; rect.right = lphl->ColumnsWidth;
} }
lpls = lphl->lpFirst; lpls = lphl->lpFirst;
@ -1326,7 +1346,7 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
height = lpls->mis.itemHeight; height = lpls->mis.itemHeight;
if (top > rect.bottom) { if (top > rect.bottom) {
if (dwStyle & LBS_MULTICOLUMN) { if (lphl->dwStyle & LBS_MULTICOLUMN) {
lphl->ItemsPerColumn = MAX(lphl->ItemsPerColumn, ipc); lphl->ItemsPerColumn = MAX(lphl->ItemsPerColumn, ipc);
ipc = 0; ipc = 0;
top = 0; top = 0;
@ -1345,7 +1365,7 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
if( IntersectRect(&scratchRect,&paintRect,&lpls->itemRect) ) if( IntersectRect(&scratchRect,&paintRect,&lpls->itemRect) )
{ {
dprintf_listbox(stddeb,"drawing item: %ld %d %ld %d %d\n",(LONG)rect.left,top, dprintf_listbox(stddeb,"LBPaint: drawing item: %ld %d %ld %d %d\n",(LONG)rect.left,top,
(LONG)rect.right,top+height,lpls->itemState); (LONG)rect.right,top+height,lpls->itemState);
if (lphl->OwnerDrawn && (lphl->ItemFocused == i) && GetFocus() == hwnd) if (lphl->OwnerDrawn && (lphl->ItemFocused == i) && GetFocus() == hwnd)
@ -1380,13 +1400,9 @@ static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
static LONG LBSetFocus(HWND hwnd, WORD wParam, LONG lParam) static LONG LBSetFocus(HWND hwnd, WORD wParam, LONG lParam)
{ {
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LONG dwStyle;
dprintf_listbox(stddeb,"ListBox WM_SETFOCUS for "NPFMT"\n",hwnd); dprintf_listbox(stddeb,"ListBox WM_SETFOCUS for "NPFMT"\n",hwnd);
if(!(lphl->dwStyle & LBS_MULTIPLESEL) )
dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
if(!(dwStyle & LBS_MULTIPLESEL) )
if( lphl->ItemsCount && lphl->ItemFocused != -1) if( lphl->ItemsCount && lphl->ItemFocused != -1)
{ {
HDC hDC = GetDC(hwnd); HDC hDC = GetDC(hwnd);
@ -1412,13 +1428,9 @@ static LONG LBSetFocus(HWND hwnd, WORD wParam, LONG lParam)
static LONG LBKillFocus(HWND hwnd, WORD wParam, LONG lParam) static LONG LBKillFocus(HWND hwnd, WORD wParam, LONG lParam)
{ {
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LONG dwStyle;
dprintf_listbox(stddeb,"ListBox WM_KILLFOCUS for "NPFMT"\n",hwnd); dprintf_listbox(stddeb,"ListBox WM_KILLFOCUS for "NPFMT"\n",hwnd);
if (!(lphl->dwStyle & LBS_MULTIPLESEL))
dwStyle = GetWindowLong(lphl->hSelf,GWL_STYLE);
if (!(dwStyle & LBS_MULTIPLESEL))
{ {
if( lphl->ItemsCount ) if( lphl->ItemsCount )
if( lphl->ItemFocused != -1 ) if( lphl->ItemFocused != -1 )
@ -1626,8 +1638,7 @@ static LONG LBGetSelCount(HWND hwnd, WORD wParam, LONG lParam)
int cnt = 0; int cnt = 0;
int items = 0; int items = 0;
if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & if (!(lphl->dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
(LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
return LB_ERR; return LB_ERR;
for( lpls = lphl->lpFirst; for( lpls = lphl->lpFirst;
@ -1652,8 +1663,7 @@ static LONG LBGetSelItems(HWND hwnd, WORD wParam, LONG lParam)
int cnt, idx; int cnt, idx;
int *lpItems = PTR_SEG_TO_LIN(lParam); int *lpItems = PTR_SEG_TO_LIN(lParam);
if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & if (!(lphl->dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
(LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
return LB_ERR; return LB_ERR;
if (wParam == 0) return 0; if (wParam == 0) return 0;
@ -1715,8 +1725,7 @@ static LONG LBSelectString(HWND hwnd, WORD wParam, LONG lParam)
if( iRet != LB_ERR) if( iRet != LB_ERR)
{ {
if( GetWindowLong(hwnd, GWL_STYLE) & if( lphl->dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) )
(LBS_MULTIPLESEL | LBS_EXTENDEDSEL) )
ListBoxSetSel(lphl,iRet,TRUE); ListBoxSetSel(lphl,iRet,TRUE);
else else
ListBoxSetCurSel(lphl,iRet); ListBoxSetCurSel(lphl,iRet);
@ -1739,8 +1748,7 @@ static LONG LBSelItemRange(HWND hwnd, WORD wParam, LONG lParam)
WORD last = HIWORD(lParam); WORD last = HIWORD(lParam);
BOOL select = wParam; BOOL select = wParam;
if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & if (!(lphl->dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
(LBS_MULTIPLESEL | LBS_EXTENDEDSEL) ))
return LB_ERR; return LB_ERR;
if (first >= lphl->ItemsCount || if (first >= lphl->ItemsCount ||
@ -1770,8 +1778,7 @@ static LONG LBSetCaretIndex(HWND hwnd, WORD wParam, LONG lParam)
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd); LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
int i; int i;
if (!(GetWindowLong(lphl->hSelf,GWL_STYLE) & if (!(lphl->dwStyle & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL) )) return 0;
(LBS_MULTIPLESEL | LBS_EXTENDEDSEL) )) return 0;
dprintf_listbox(stddeb,"LBSetCaretIndex: hwnd "NPFMT" n=%i\n",hwnd,wParam); dprintf_listbox(stddeb,"LBSetCaretIndex: hwnd "NPFMT" n=%i\n",hwnd,wParam);
@ -1886,7 +1893,7 @@ static LONG LBSetSel(HWND hwnd, WORD wParam, LONG lParam)
InvalidateRect(hwnd, NULL, TRUE); InvalidateRect(hwnd, NULL, TRUE);
else if( iRet != LB_ERR ) else if( iRet != LB_ERR )
{ {
if( GetWindowLong(hwnd,GWL_STYLE) & LBS_EXTENDEDSEL && if( lphl->dwStyle & LBS_EXTENDEDSEL &&
lphl->ItemFocused != LOWORD(lParam) ) lphl->ItemFocused != LOWORD(lParam) )
{ {
ListBoxGetItemRect(lphl, lphl->ItemFocused , &rect); ListBoxGetItemRect(lphl, lphl->ItemFocused , &rect);

View file

@ -9,7 +9,10 @@
#include <stdio.h> #include <stdio.h>
#include <signal.h> #include <signal.h>
#include <unistd.h> #include <unistd.h>
#include "windows.h" #include "class.h"
#include "options.h"
#include "queue.h"
#include "win.h"
#include "debugger.h" #include "debugger.h"
extern FILE * yyin; extern FILE * yyin;
@ -33,15 +36,15 @@ int yyerror(char *);
int integer; int integer;
} }
%token CONT STEP LIST NEXT QUIT HELP BACKTRACE INFO STACK SEGMENTS REGS %token tCONT tSTEP tLIST tNEXT tQUIT tHELP tBACKTRACE tINFO tWALK
%token ENABLE DISABLE BREAK DELETE SET MODE PRINT EXAM DEFINE ABORT WALK %token tENABLE tDISABLE tBREAK tDELETE tSET tMODE tPRINT tEXAM tDEFINE tABORT
%token WND QUEUE %token tCLASS tSTACK tSEGMENTS tREGS tWND tQUEUE
%token NO_SYMBOL EOL %token tNO_SYMBOL tEOL
%token SYMBOLFILE %token tSYMBOLFILE
%token <string> IDENTIFIER %token <string> tIDENTIFIER
%token <integer> NUM FORMAT %token <integer> tNUM tFORMAT
%token <reg> REG %token <reg> tREG
/* %left ',' */ /* %left ',' */
/* %left '=' OP_OR_EQUAL OP_XOR_EQUAL OP_AND_EQUAL OP_SHL_EQUAL \ /* %left '=' OP_OR_EQUAL OP_XOR_EQUAL OP_AND_EQUAL OP_SHL_EQUAL \
@ -66,127 +69,135 @@ int yyerror(char *);
%% %%
input: line { issue_prompt(); } input: line { issue_prompt(); }
| input line { issue_prompt(); } | input line { issue_prompt(); }
line: command line: command
| EOL | tEOL
| error EOL { yyerrok; } | error tEOL { yyerrok; }
command: QUIT EOL { exit(0); } command:
| HELP EOL { DEBUG_Help(); } tQUIT tEOL { exit(0); }
| CONT EOL { dbg_exec_mode = EXEC_CONT; return 0; } | tHELP tEOL { DEBUG_Help(); }
| STEP EOL { dbg_exec_mode = EXEC_STEP_INSTR; return 0; } | tCONT tEOL { dbg_exec_mode = EXEC_CONT; return 0; }
| NEXT EOL { dbg_exec_mode = EXEC_STEP_OVER; return 0; } | tSTEP tEOL { dbg_exec_mode = EXEC_STEP_INSTR; return 0; }
| LIST EOL { DEBUG_List( NULL, 15 ); } | tNEXT tEOL { dbg_exec_mode = EXEC_STEP_OVER; return 0; }
| LIST addr EOL { DEBUG_List( &$2, 15 ); } | tLIST tEOL { DEBUG_List( NULL, 15 ); }
| ABORT EOL { kill(getpid(), SIGABRT); } | tLIST addr tEOL { DEBUG_List( &$2, 15 ); }
| SYMBOLFILE IDENTIFIER EOL { DEBUG_ReadSymbolTable( $2 ); } | tABORT tEOL { kill(getpid(), SIGABRT); }
| DEFINE IDENTIFIER addr EOL { DEBUG_AddSymbol( $2, &$3 ); } | tSYMBOLFILE tIDENTIFIER tEOL { DEBUG_ReadSymbolTable( $2 ); }
| MODE NUM EOL { mode_command($2); } | tDEFINE tIDENTIFIER addr tEOL { DEBUG_AddSymbol( $2, &$3 ); }
| ENABLE NUM EOL { DEBUG_EnableBreakpoint( $2, TRUE ); } | tMODE tNUM tEOL { mode_command($2); }
| DISABLE NUM EOL { DEBUG_EnableBreakpoint( $2, FALSE ); } | tENABLE tNUM tEOL { DEBUG_EnableBreakpoint( $2, TRUE ); }
| BREAK '*' addr EOL { DEBUG_AddBreakpoint( &$3 ); } | tDISABLE tNUM tEOL { DEBUG_EnableBreakpoint( $2, FALSE ); }
| BREAK symbol EOL { DEBUG_AddBreakpoint( &$2 ); } | tDELETE tBREAK tNUM tEOL { DEBUG_DelBreakpoint( $3 ); }
| BREAK EOL { DBG_ADDR addr = { CS_reg(DEBUG_context), | tBACKTRACE tEOL { DEBUG_BackTrace(); }
EIP_reg(DEBUG_context) }; | set_command
DEBUG_AddBreakpoint( &addr ); | x_command
} | print_command
| DELETE BREAK NUM EOL { DEBUG_DelBreakpoint( $3 ); } | break_command
| BACKTRACE EOL { DEBUG_BackTrace(); } | info_command
| WALK WND EOL { DEBUG_InitWalk(); DEBUG_WndWalk( NULL ); } | walk_command
| WALK WND NUM EOL { DEBUG_InitWalk(); DEBUG_WndWalk( $3 ); }
| infocmd
| x_command
| print_command
| deposit_command
deposit_command:
SET REG '=' expr EOL { DEBUG_SetRegister( $2, $4 ); }
| SET '*' addr '=' expr EOL { DEBUG_WriteMemory( &$3, $5 ); }
| SET IDENTIFIER '=' addr EOL { if (!DEBUG_SetSymbolValue( $2, &$4 ))
{
fprintf( stderr,
"Symbol %s not found\n", $2 );
YYERROR;
}
}
set_command:
tSET tREG '=' expr tEOL { DEBUG_SetRegister( $2, $4 ); }
| tSET '*' addr '=' expr tEOL { DEBUG_WriteMemory( &$3, $5 ); }
| tSET tIDENTIFIER '=' addr tEOL { if (!DEBUG_SetSymbolValue( $2, &$4 ))
{
fprintf( stderr,
"Symbol %s not found\n", $2 );
YYERROR;
}
}
x_command: x_command:
EXAM addr EOL { DEBUG_ExamineMemory( &$2, 1, 'x'); } tEXAM addr tEOL { DEBUG_ExamineMemory( &$2, 1, 'x'); }
| EXAM FORMAT addr EOL { DEBUG_ExamineMemory( &$3, $2>>8, $2&0xff ); } | tEXAM tFORMAT addr tEOL { DEBUG_ExamineMemory( &$3, $2>>8, $2&0xff ); }
print_command: print_command:
PRINT addr EOL { DEBUG_Print( &$2, 1, 'x' ); } tPRINT addr tEOL { DEBUG_Print( &$2, 1, 'x' ); }
| PRINT FORMAT addr EOL { DEBUG_Print( &$3, $2 >> 8, $2 & 0xff ); } | tPRINT tFORMAT addr tEOL { DEBUG_Print( &$3, $2 >> 8, $2 & 0xff ); }
symbol: IDENTIFIER { if (!DEBUG_GetSymbolValue( $1, &$$ )) break_command:
tBREAK '*' addr tEOL { DEBUG_AddBreakpoint( &$3 ); }
| tBREAK symbol tEOL { DEBUG_AddBreakpoint( &$2 ); }
| tBREAK tEOL { DBG_ADDR addr = { CS_reg(DEBUG_context),
EIP_reg(DEBUG_context) };
DEBUG_AddBreakpoint( &addr );
}
info_command:
tINFO tBREAK tEOL { DEBUG_InfoBreakpoints(); }
| tINFO tCLASS expr tEOL { CLASS_DumpClass( $3 ); }
| tINFO tQUEUE expr tEOL { QUEUE_DumpQueue( $3 ); }
| tINFO tREGS tEOL { DEBUG_InfoRegisters(); }
| tINFO tSEGMENTS expr tEOL { LDT_Print( SELECTOR_TO_ENTRY($3), 1 ); }
| tINFO tSEGMENTS tEOL { LDT_Print( 0, -1 ); }
| tINFO tSTACK tEOL { DEBUG_InfoStack(); }
| tINFO tWND expr tEOL { WIN_DumpWindow( $3 ); }
walk_command:
tWALK tCLASS tEOL { CLASS_WalkClasses(); }
| tWALK tQUEUE tEOL { QUEUE_WalkQueues(); }
| tWALK tWND tEOL { WIN_WalkWindows( 0, 0 ); }
| tWALK tWND tNUM tEOL { WIN_WalkWindows( $3, 0 ); }
symbol: tIDENTIFIER { if (!DEBUG_GetSymbolValue( $1, &$$ ))
{ {
fprintf( stderr, "Symbol %s not found\n", $1 ); fprintf( stderr, "Symbol %s not found\n", $1 );
YYERROR; YYERROR;
} }
} }
addr: expr { $$.seg = 0xffffffff; $$.off = $1; } addr:
| segaddr { $$ = $1; } expr { $$.seg = 0xffffffff; $$.off = $1; }
| segaddr { $$ = $1; }
segaddr: expr ':' expr { $$.seg = $1; $$.off = $3; } segaddr:
| symbol { $$ = $1; } expr ':' expr { $$.seg = $1; $$.off = $3; }
| symbol { $$ = $1; }
expr: NUM { $$ = $1; } expr:
| REG { $$ = DEBUG_GetRegister($1); } tNUM { $$ = $1; }
| expr OP_LOR expr { $$ = $1 || $3; } | tREG { $$ = DEBUG_GetRegister($1); }
| expr OP_LAND expr { $$ = $1 && $3; } | expr OP_LOR expr { $$ = $1 || $3; }
| expr '|' expr { $$ = $1 | $3; } | expr OP_LAND expr { $$ = $1 && $3; }
| expr '&' expr { $$ = $1 & $3; } | expr '|' expr { $$ = $1 | $3; }
| expr '^' expr { $$ = $1 ^ $3; } | expr '&' expr { $$ = $1 & $3; }
| expr OP_EQ expr { $$ = $1 == $3; } | expr '^' expr { $$ = $1 ^ $3; }
| expr '>' expr { $$ = $1 > $3; } | expr OP_EQ expr { $$ = $1 == $3; }
| expr '<' expr { $$ = $1 < $3; } | expr '>' expr { $$ = $1 > $3; }
| expr OP_GE expr { $$ = $1 >= $3; } | expr '<' expr { $$ = $1 < $3; }
| expr OP_LE expr { $$ = $1 <= $3; } | expr OP_GE expr { $$ = $1 >= $3; }
| expr OP_NE expr { $$ = $1 != $3; } | expr OP_LE expr { $$ = $1 <= $3; }
| expr OP_SHL expr { $$ = (unsigned)$1 << $3; } | expr OP_NE expr { $$ = $1 != $3; }
| expr OP_SHR expr { $$ = (unsigned)$1 >> $3; } | expr OP_SHL expr { $$ = (unsigned)$1 << $3; }
| expr '+' expr { $$ = $1 + $3; } | expr OP_SHR expr { $$ = (unsigned)$1 >> $3; }
| expr '-' expr { $$ = $1 - $3; } | expr '+' expr { $$ = $1 + $3; }
| expr '*' expr { $$ = $1 * $3; } | expr '-' expr { $$ = $1 - $3; }
| expr '/' expr | expr '*' expr { $$ = $1 * $3; }
{ if ($3) | expr '/' expr { if ($3)
if ($3 == -1 && $1 == 0x80000000l) if ($3 == -1 && $1 == 0x80000000l)
yyerror ("Division overflow"); yyerror ("Division overflow");
else else $$ = $1 / $3;
$$ = $1 / $3; else yyerror ("Division by zero");
else }
yyerror ("Division by zero"); } | expr '%' expr { if ($3)
| expr '%' expr if ($3 == -1 && $1 == 0x80000000l)
{ if ($3) $$ = 0; /* A sensible result in this case. */
if ($3 == -1 && $1 == 0x80000000l) else $$ = $1 % $3;
$$ = 0; /* A sensible result in this case. */ else yyerror ("Division by zero");
else }
$$ = $1 % $3; | '-' expr %prec OP_SIGN { $$ = -$2; }
else | '+' expr %prec OP_SIGN { $$ = $2; }
yyerror ("Division by zero"); } | '!' expr { $$ = !$2; }
| '-' expr %prec OP_SIGN { $$ = -$2; } | '~' expr { $$ = ~$2; }
| '+' expr %prec OP_SIGN { $$ = $2; } | '(' expr ')' { $$ = $2; }
| '!' expr { $$ = !$2; }
| '~' expr { $$ = ~$2; }
| '(' expr ')' { $$ = $2; }
/* For parser technical reasons we can't use "addr" here. */ /* For parser technical reasons we can't use "addr" here. */
| '*' expr %prec OP_DEREF { DBG_ADDR addr = { 0xffffffff, $2 }; | '*' expr %prec OP_DEREF { DBG_ADDR addr = { 0xffffffff, $2 };
$$ = DEBUG_ReadMemory( &addr ); } $$ = DEBUG_ReadMemory( &addr ); }
| '*' segaddr %prec OP_DEREF { $$ = DEBUG_ReadMemory( &$2 ); } | '*' segaddr %prec OP_DEREF { $$ = DEBUG_ReadMemory( &$2 ); }
infocmd: INFO REGS EOL { DEBUG_InfoRegisters(); }
| INFO STACK EOL { DEBUG_InfoStack(); }
| INFO BREAK EOL { DEBUG_InfoBreakpoints(); }
| INFO SEGMENTS EOL { LDT_Print( 0, -1 ); }
| INFO SEGMENTS expr EOL { LDT_Print( SELECTOR_TO_ENTRY($3), 1 ); }
| INFO WND expr EOL { DEBUG_WndDump( $3 ); }
| INFO QUEUE expr EOL { DEBUG_QueueDump( $3 ); }
%% %%
void void

View file

@ -35,7 +35,7 @@ IDENTIFIER [_a-zA-Z\.~][_a-zA-Z0-9\.~]*
%% %%
\n { syntax_error = 0; return EOL; } /*Indicates end of command*/ \n { syntax_error = 0; return tEOL; } /*Indicates end of command*/
"||" { return OP_LOR; } "||" { return OP_LOR; }
"&&" { return OP_LAND; } "&&" { return OP_LAND; }
@ -47,77 +47,76 @@ IDENTIFIER [_a-zA-Z\.~][_a-zA-Z0-9\.~]*
">>" { return OP_SHR; } ">>" { return OP_SHR; }
[-+<=>|&^()*/%:!~] { return *yytext; } [-+<=>|&^()*/%:!~] { return *yytext; }
"0x"{HEXDIGIT}+ { sscanf(yytext, "%x", &yylval.integer); return NUM; } "0x"{HEXDIGIT}+ { sscanf(yytext, "%x", &yylval.integer); return tNUM; }
{DIGIT}+ { sscanf(yytext, "%d", &yylval.integer); return NUM; } {DIGIT}+ { sscanf(yytext, "%d", &yylval.integer); return tNUM; }
"/"{DIGIT}+{FORMAT} { char * last; "/"{DIGIT}+{FORMAT} { char * last;
yylval.integer = strtol( yytext+1, &last, NULL ); yylval.integer = strtol( yytext+1, &last, NULL );
yylval.integer = (yylval.integer << 8) | *last; yylval.integer = (yylval.integer << 8) | *last;
return FORMAT; } return tFORMAT; }
"/"{FORMAT} { yylval.integer = (1 << 8) | yytext[1]; return FORMAT; } "/"{FORMAT} { yylval.integer = (1 << 8) | yytext[1]; return tFORMAT; }
$pc { yylval.reg = REG_EIP; return REG; } $pc { yylval.reg = REG_EIP; return tREG; }
$flags { yylval.reg = REG_EFL; return REG; } $flags { yylval.reg = REG_EFL; return tREG; }
$eip { yylval.reg = REG_EIP; return REG; } $eip { yylval.reg = REG_EIP; return tREG; }
$ip { yylval.reg = REG_IP; return REG; } $ip { yylval.reg = REG_IP; return tREG; }
$esp { yylval.reg = REG_ESP; return REG; } $esp { yylval.reg = REG_ESP; return tREG; }
$sp { yylval.reg = REG_SP; return REG; } $sp { yylval.reg = REG_SP; return tREG; }
$eax { yylval.reg = REG_EAX; return REG; } $eax { yylval.reg = REG_EAX; return tREG; }
$ebx { yylval.reg = REG_EBX; return REG; } $ebx { yylval.reg = REG_EBX; return tREG; }
$ecx { yylval.reg = REG_ECX; return REG; } $ecx { yylval.reg = REG_ECX; return tREG; }
$edx { yylval.reg = REG_EDX; return REG; } $edx { yylval.reg = REG_EDX; return tREG; }
$esi { yylval.reg = REG_ESI; return REG; } $esi { yylval.reg = REG_ESI; return tREG; }
$edi { yylval.reg = REG_EDI; return REG; } $edi { yylval.reg = REG_EDI; return tREG; }
$ebp { yylval.reg = REG_EBP; return REG; } $ebp { yylval.reg = REG_EBP; return tREG; }
$ax { yylval.reg = REG_AX; return REG; } $ax { yylval.reg = REG_AX; return tREG; }
$bx { yylval.reg = REG_BX; return REG; } $bx { yylval.reg = REG_BX; return tREG; }
$cx { yylval.reg = REG_CX; return REG; } $cx { yylval.reg = REG_CX; return tREG; }
$dx { yylval.reg = REG_DX; return REG; } $dx { yylval.reg = REG_DX; return tREG; }
$si { yylval.reg = REG_SI; return REG; } $si { yylval.reg = REG_SI; return tREG; }
$di { yylval.reg = REG_DI; return REG; } $di { yylval.reg = REG_DI; return tREG; }
$bp { yylval.reg = REG_BP; return REG; } $bp { yylval.reg = REG_BP; return tREG; }
$es { yylval.reg = REG_ES; return REG; } $es { yylval.reg = REG_ES; return tREG; }
$ds { yylval.reg = REG_DS; return REG; } $ds { yylval.reg = REG_DS; return tREG; }
$cs { yylval.reg = REG_CS; return REG; } $cs { yylval.reg = REG_CS; return tREG; }
$ss { yylval.reg = REG_SS; return REG; } $ss { yylval.reg = REG_SS; return tREG; }
info|inf|in { return INFO; } info|inf|in { return tINFO; }
show|sho|sh { return INFO; } show|sho|sh { return tINFO; }
list|lis|li|l { return LIST; } list|lis|li|l { return tLIST; }
segments|segment|segm|seg|se { return SEGMENTS; } break|brea|bre|br|b { return tBREAK; }
break|brea|bre|br|b { return BREAK; } enable|enabl|enab|ena { return tENABLE;}
enable|enabl|enab|ena { return ENABLE;} disable|disabl|disab|disa|dis { return tDISABLE; }
disable|disabl|disab|disa|dis { return DISABLE; } delete|delet|dele|del { return tDELETE; }
delete|delet|dele|del { return DELETE; } quit|qui|qu|q { return tQUIT; }
quit|qui|qu|q { return QUIT; } set|se { return tSET; }
walk|w { return WALK; } walk|w { return tWALK; }
queue|queu|que { return QUEUE; } x { return tEXAM; }
window|windo|wind|win|wnd { return WND; }
x { return EXAM; }
help|hel|he|"?" { return HELP; } class|clas|cla { return tCLASS; }
queue|queu|que { return tQUEUE; }
registers|regs|reg|re { return tREGS; }
segments|segment|segm|seg|se { return tSEGMENTS; }
stack|stac|sta|st { return tSTACK; }
window|windo|wind|win|wnd { return tWND; }
set|se { return SET; } help|hel|he|"?" { return tHELP; }
bt { return BACKTRACE; } backtrace|bt { return tBACKTRACE; }
cont|con|co|c { return CONT; } cont|con|co|c { return tCONT; }
step|ste|st|s { return STEP; } step|ste|st|s { return tSTEP; }
next|nex|ne|n { return NEXT; } next|nex|ne|n { return tNEXT; }
symbolfile|symbolfil|symbolfi|symbolf|symbol|symbo|symb { return SYMBOLFILE; } symbolfile|symbolfil|symbolfi|symbolf|symbol|symbo|symb { return tSYMBOLFILE; }
define|defin|defi|def|de { return DEFINE; } define|defin|defi|def|de { return tDEFINE; }
abort|abor|abo { return ABORT; } abort|abor|abo { return tABORT; }
print|prin|pri|pr|p { return PRINT; } print|prin|pri|pr|p { return tPRINT; }
mode { return MODE; } mode { return tMODE; }
registers|regs|reg|re { return REGS; } {IDENTIFIER} { yylval.string = make_symbol(yytext); return tIDENTIFIER; }
stack|stac|sta|st { return STACK; }
{IDENTIFIER} { yylval.string = make_symbol(yytext); return IDENTIFIER; }
[ \t]+ /* Eat up whitespace */ [ \t]+ /* Eat up whitespace */

View file

@ -215,7 +215,6 @@ void DEBUG_LoadEntryPoints(void)
unsigned int address; unsigned int address;
BOOL ok; BOOL ok;
fprintf( stderr, "Adding symbols from loaded modules\n" );
for (ok = ModuleFirst(&entry); ok; ok = ModuleNext(&entry)) for (ok = ModuleFirst(&entry); ok; ok = ModuleNext(&entry))
{ {
if (!(pModule = (NE_MODULE *)GlobalLock( entry.hModule ))) continue; if (!(pModule = (NE_MODULE *)GlobalLock( entry.hModule ))) continue;

View file

@ -7,191 +7,8 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "global.h"
#include "user.h"
#include "class.h"
#include "win.h"
#include "message.h"
#include "spy.h"
#include "debugger.h" #include "debugger.h"
int iWndIndent = 0;
extern char lpstrSpyMessageIndent[]; /* from misc/spy.c */
/***********************************************************************
* DEBUG_InitWalk
*/
void DEBUG_InitWalk(void)
{
fprintf(stderr,"%-24.24s %-6.6s %-17.17s %-8.8s %s\n",
"HWND / WNDPTR","hQueue","Class Name", "Style", "WndProc");
lpstrSpyMessageIndent[0]='\0';
}
/***********************************************************************
* DEBUG_WndWalk
*
*/
void DEBUG_WndWalk(HWND hStart)
{
WND* wndPtr;
CLASS* classPtr;
char className[0x10];
int i;
if( !hStart )
hStart = GetDesktopHwnd();
wndPtr = WIN_FindWndPtr(hStart);
if( !wndPtr )
{ fprintf(stderr, "Invalid window handle: %04x\n", hStart);
return; }
i = strlen(lpstrSpyMessageIndent);
/* 0x10 bytes are always reserved at the end of lpstrSpyMessageIndent */
sprintf(lpstrSpyMessageIndent + i,"%04x %08x",hStart, (unsigned) wndPtr);
classPtr = CLASS_FindClassPtr(wndPtr->hClass);
if(classPtr)
GlobalGetAtomName(classPtr->atomName ,className, 0x10);
else
strcpy(className,"<BAD>");
fprintf(stderr,"%-24.24s %-6.4x %-17.17s %08x %04x:%04x\n",
lpstrSpyMessageIndent,
wndPtr->hmemTaskQ,
className,
(unsigned) wndPtr->dwStyle,
HIWORD(wndPtr->lpfnWndProc),
LOWORD(wndPtr->lpfnWndProc));
lpstrSpyMessageIndent[i] = '\0';
if( wndPtr->hwndChild )
{
/* walk children */
hStart = wndPtr->hwndChild;
wndPtr = WIN_FindWndPtr(hStart);
iWndIndent ++;
if( iWndIndent < SPY_MAX_INDENTLEVEL - 0x10 )
{
lpstrSpyMessageIndent[iWndIndent - 1] = ' ';
lpstrSpyMessageIndent[iWndIndent] = '\0';
}
while( wndPtr )
{
DEBUG_WndWalk(hStart);
hStart = wndPtr->hwndNext;
wndPtr = WIN_FindWndPtr(hStart);
}
if( hStart )
fprintf(stderr, "%s%s"NPFMT"\n", lpstrSpyMessageIndent,
"<BAD>", hStart);
if( iWndIndent )
{
iWndIndent--;
if( iWndIndent < SPY_MAX_INDENTLEVEL - 0x10 )
lpstrSpyMessageIndent[iWndIndent] = '\0';
}
}
}
/***********************************************************************
* DEBUG_WndDump
*
*/
void DEBUG_WndDump(HWND hWnd)
{
WND* wnd;
char* lpWndText = NULL;
wnd = WIN_FindWndPtr(hWnd);
if( !wnd )
{ fprintf(stderr, "Invalid window handle: %04x\n", hWnd);
return; }
if( wnd->hText )
lpWndText = (LPSTR) USER_HEAP_LIN_ADDR( wnd->hText );
fprintf( stderr, "next: %12.4x\n"
"child: %10.4x\n"
"parent: %10.4x\n"
"owner: %10.4x\n"
"hClass: %10.4x\n"
"hInst: %10.4x\n"
"clientRect: %i,%i - %i,%i\n"
"windowRect: %i,%i - %i,%i\n"
"hRgnUpdate: %6.4x\n"
"hLastPopup: %6.4x\n"
"Style: %10.8x\n"
"StyleEx: %9.8x\n"
"hDCE: %10.4x\n"
"hVscroll: %8.4x\n"
"hHscroll: %8.4x\n"
"menuID: %10.4x\n"
"hText: %10.4x (\"%s\")\n"
"flags: %10.4x\n",
wnd->hwndNext, wnd->hwndChild,wnd->hwndParent,
wnd->hwndOwner,wnd->hClass,wnd->hInstance,
wnd->rectClient.left, wnd->rectClient.top,
wnd->rectClient.right, wnd->rectClient.bottom,
wnd->rectWindow.left, wnd->rectWindow.top,
wnd->rectWindow.right, wnd->rectWindow.bottom,
wnd->hrgnUpdate, wnd->hwndLastActive,
(unsigned) wnd->dwStyle, (unsigned) wnd->dwExStyle,
wnd->hdce, wnd->hVScroll, wnd->hHScroll,
wnd->wIDmenu, wnd->hText, (lpWndText)?lpWndText:"NULL",
wnd->flags);
}
/***********************************************************************
* DEBUG_QueueDump
*
*/
void DEBUG_QueueDump(HQUEUE hQ)
{
MESSAGEQUEUE* pq;
if( !hQ || IsBadReadPtr((SEGPTR)MAKELONG( 0, GlobalHandleToSel(hQ)),
sizeof(MESSAGEQUEUE)) )
{
fprintf(stderr, "Invalid queue handle: "NPFMT"\n", hQ);
return;
}
pq = (MESSAGEQUEUE*) GlobalLock( hQ );
fprintf(stderr,"next: %12.4x Intertask SendMessage:\n"
"hTask: %11.4x ----------------------\n"
"msgSize: %9.4x hWnd: %10.4x\n"
"msgCount: %8.4x msg: %11.4x\n"
"msgNext: %9.4x wParam: %8.4x\n"
"msgFree: %9.4x lParam: %8.8x\n"
"qSize: %11.4x lRet: %10.8x\n"
"wWinVer: %9.4x ISMH: %10.4x\n"
"paints: %10.4x hSendTask: %5.4x\n"
"timers: %10.4x hPrevSend: %5.4x\n"
"wakeBits: %8.4x\n"
"wakeMask: %8.4x\n"
"hCurHook: %8.4x\n",
pq->next, pq->hTask, pq->msgSize, pq->hWnd,
pq->msgCount, pq->msg, pq->nextMessage, pq->wParam,
pq->nextFreeMessage, (unsigned)pq->lParam, pq->queueSize,
(unsigned)pq->SendMessageReturn, pq->wWinVersion, pq->InSendMessageHandle,
pq->wPaintCount, pq->hSendingTask, pq->wTimerCount,
pq->hPrevSendingTask, pq->status, pq->wakeMask, pq->hCurHook);
}
/*********************************************************************** /***********************************************************************
* DEBUG_Print * DEBUG_Print
* *

View file

@ -46,7 +46,8 @@ C_SRCS = \
ASM_SRCS = \ ASM_SRCS = \
$(SPEC16_FILES) \ $(SPEC16_FILES) \
call16.S \ call16.S \
call32.S call32.S \
except.S
.SUFFIXES: .spec .SUFFIXES: .spec

192
if1632/except.S Normal file
View file

@ -0,0 +1,192 @@
/*
* Win32 exception assembly functions
*
* Copyright (c) 1996 Onno Hovers, (onno@stack.urc.tue.nl)
*
*/
#ifndef __ELF__
.globl _EXC_CallUnhandledExceptionFilter
.extern _pTopExcHandler
_EXC_CallUnhandledExceptionFilter:
#else /* __ELF__ */
.globl EXC_CallUnhandledExceptionFilter
.extern pTopExcHandler
EXC_CallUnhandledExceptionFilter:
#endif /* __ELF__ */
leal 4(%esp),%eax
pushl %eax
#ifndef __ELF__
call *_pTopExcHandler
#else /* __ELF__ */
call *pTopExcHandler
#endif /* __ELF__ */
movl %ebp,%esp
ret
/*******************************************************************
*
* RaiseException (KERNEL32. 418 )
* RtlUnwind (KERNEL32. 443 )
*
* we need to save our context before a call to
*
* -RaiseException
* -RtlUnwind
*
* after these functions we need to restore that context structure as
* the actual context so changes made to the context structure in an
* exception-handler will be reflected in the context after these
* functions return. Fortunately both functions have 4 DWORD params.
* we pass the function to be called as a fifth parameter to ContextCall
*
*/
.equ CONTEXT_SegSs, -4
.equ CONTEXT_Esp, -8
.equ CONTEXT_EFlags, -12
.equ CONTEXT_SegCs, -16
.equ CONTEXT_Eip, -20
.equ CONTEXT_Ebp, -24
.equ CONTEXT_Eax, -28
.equ CONTEXT_Ecx, -32
.equ CONTEXT_Edx, -36
.equ CONTEXT_Ebx, -40
.equ CONTEXT_Esi, -44
.equ CONTEXT_Edi, -48
.equ CONTEXT_SegDs, -52
.equ CONTEXT_SegEs, -56
.equ CONTEXT_SegFs, -60
.equ CONTEXT_SegGs, -64
.equ FLOAT_Cr0NpxState, -68
.equ FLOAT_RegisterArea, -148
.equ FLOAT_DataSelector, -152
.equ FLOAT_DataOffset, -156
.equ FLOAT_ErrorSelector, -160
.equ FLOAT_ErrorOffset, -164
.equ FLOAT_TagWord, -168
.equ FLOAT_StatusWord, -172
.equ FLOAT_ControlWord, -176
.equ CONTEXT_FloatSave, -176
.equ CONTEXT_Dr7, -180
.equ CONTEXT_Dr6, -184
.equ CONTEXT_Dr3, -188
.equ CONTEXT_Dr2, -192
.equ CONTEXT_Dr1, -196
.equ CONTEXT_Dr0, -200
.equ CONTEXT_ContextFlags, -204
.equ CONTEXT, -204
.equ CONTEXTSIZE, 204
.equ CONTEXTFLAGS, 0x10007
.equ ORIG_ESP, 16 /** cdecl !!! **/
.equ PARM_ARG4, 28
.equ PARM_ARG3, 24
.equ PARM_ARG2, 20
.equ PARM_ARG1, 16
.equ PARM_RETURN, 12
.equ PARM_CALLFUNC, 8
.equ PARM_EBP, 4
.equ PARM_EFLAGS, 0
#ifndef __ELF__
.globl _RaiseException
.extern _EXC_RaiseException
_RaiseException:
push $_EXC_RaiseException
jmp ContextCall
.globl _RtlUnwind
_RtlUnwind:
push $_EXC_RtlUnwind
#else /* __ELF__ */
.globl RaiseException
.extern EXC_RaiseException
RaiseException:
push $EXC_RaiseException
jmp ContextCall
.globl RtlUnwind
RtlUnwind:
push $EXC_RtlUnwind
#endif /* __ELF__ */
ContextCall:
pushl %ebp
pushfl
movl %esp, %ebp
subl $CONTEXTSIZE, %esp
movl %eax, CONTEXT_Eax(%ebp)
leal ORIG_ESP(%ebp), %eax
movl %eax, CONTEXT_Esp(%ebp)
movl PARM_EFLAGS(%ebp), %eax
movl %eax, CONTEXT_EFlags(%ebp)
movl PARM_EBP(%ebp), %eax
movl %eax, CONTEXT_Ebp(%ebp)
movl PARM_RETURN(%ebp), %eax
movl %eax, CONTEXT_Eip(%ebp)
movl %edi, CONTEXT_Edi(%ebp)
movl %esi, CONTEXT_Esi(%ebp)
movl %ebx, CONTEXT_Ebx(%ebp)
movl %edx, CONTEXT_Edx(%ebp)
movl %ecx, CONTEXT_Ecx(%ebp)
xorl %eax, %eax
movw %ss, %ax
movl %eax, CONTEXT_SegSs(%ebp)
movw %cs, %ax
movl %eax, CONTEXT_SegCs(%ebp)
movw %gs, %ax
movl %eax, CONTEXT_SegGs(%ebp)
movw %fs, %ax
movl %eax, CONTEXT_SegFs(%ebp)
movw %es, %ax
movl %eax, CONTEXT_SegEs(%ebp)
movw %ds, %ax
movl %eax, CONTEXT_SegDs(%ebp)
fsave CONTEXT_FloatSave(%ebp)
movl $CONTEXTFLAGS, %eax
movl %eax, CONTEXT_ContextFlags(%ebp)
pushl %ebp
leal CONTEXT(%ebp), %eax
pushl %eax
pushl PARM_ARG4(%ebp)
pushl PARM_ARG3(%ebp)
pushl PARM_ARG2(%ebp)
pushl PARM_ARG1(%ebp)
call *PARM_CALLFUNC(%ebp)
addl $20,%esp
popl %ebp
lds CONTEXT_Esp(%ebp),%edi
movl CONTEXT_Eip(%ebp),%eax
movl %eax,-4(%edi)
movl CONTEXT_EFlags(%ebp),%eax
movl %eax,-8(%edi)
movl CONTEXT_Edi(%ebp),%eax
movl %eax,-12(%edi)
movl CONTEXT_SegDs(%ebp),%eax
movw %ax,%ds
movl CONTEXT_SegEs(%ebp),%eax
movw %ax,%es
movl CONTEXT_SegFs(%ebp),%eax
movw %ax,%fs
movl CONTEXT_SegGs(%ebp),%eax
movw %ax,%gs
frstor CONTEXT_FloatSave(%ebp)
movl CONTEXT_Ecx(%ebp),%ecx
movl CONTEXT_Edx(%ebp),%edx
movl CONTEXT_Ebx(%ebp),%ebx
movl CONTEXT_Esi(%ebp),%esi
movl CONTEXT_Eax(%ebp),%eax
movl CONTEXT_Ebp(%ebp),%ebp
lea -12(%edi),%esp
popl %edi
popfl
ret

View file

@ -445,7 +445,7 @@ base 1
0440 stub ResumeThread 0440 stub ResumeThread
0441 stub RtlFillMemory 0441 stub RtlFillMemory
0442 stub RtlMoveMemory 0442 stub RtlMoveMemory
0443 stub RtlUnwind 0443 stdcall RtlUnwind(ptr long ptr long) RtlUnwind
0444 stub RtlZeroMemory 0444 stub RtlZeroMemory
0445 stub ScrollConsoleScreenBufferA 0445 stub ScrollConsoleScreenBufferA
0446 stub ScrollConsoleScreenBufferW 0446 stub ScrollConsoleScreenBufferW
@ -518,7 +518,7 @@ base 1
0513 stub SetThreadLocale 0513 stub SetThreadLocale
0514 stub SetThreadPriority 0514 stub SetThreadPriority
0515 stub SetTimeZoneInformation 0515 stub SetTimeZoneInformation
0516 stub SetUnhandledExceptionFilter 0516 stdcall SetUnhandledExceptionFilter(ptr) SetUnhandledExceptionFilter
0517 stub SetVDMCurrentDirectories 0517 stub SetVDMCurrentDirectories
0518 stub SetVolumeLabelA 0518 stub SetVolumeLabelA
0519 stub SetVolumeLabelW 0519 stub SetVolumeLabelW
@ -539,7 +539,7 @@ base 1
0534 stub TransactNamedPipe 0534 stub TransactNamedPipe
0535 stub TransmitCommChar 0535 stub TransmitCommChar
0536 stub TrimVirtualBuffer 0536 stub TrimVirtualBuffer
0537 stub UnhandledExceptionFilter 0537 stdcall UnhandledExceptionFilter(ptr) UnhandledExceptionFilter
0538 stub UnlockFile 0538 stub UnlockFile
0539 stub UnlockFileEx 0539 stub UnlockFileEx
0540 stub UnmapViewOfFile 0540 stub UnmapViewOfFile

View file

@ -7,7 +7,7 @@ id 7
4 pascal16 ToAscii(word word ptr ptr word) ToAscii 4 pascal16 ToAscii(word word ptr ptr word) ToAscii
5 pascal16 AnsiToOem(ptr ptr) AnsiToOem 5 pascal16 AnsiToOem(ptr ptr) AnsiToOem
6 pascal16 OemToAnsi(ptr ptr) OemToAnsi 6 pascal16 OemToAnsi(ptr ptr) OemToAnsi
#7 pascal SetSpeed 7 return SetSpeed 2 65535
#100 pascal ScreenSwitchEnable #100 pascal ScreenSwitchEnable
#126 pascal GetTableSeg #126 pascal GetTableSeg
#127 pascal NewTable #127 pascal NewTable

View file

@ -13,7 +13,7 @@ id 2
12 pascal16 KillTimer(word word) KillTimer 12 pascal16 KillTimer(word word) KillTimer
13 pascal GetTickCount() GetTickCount 13 pascal GetTickCount() GetTickCount
14 pascal GetTimerResolution() GetTimerResolution 14 pascal GetTimerResolution() GetTimerResolution
15 pascal GetCurrentTime() GetTickCount 15 pascal GetCurrentTime() GetCurrentTime
16 pascal16 ClipCursor(ptr) ClipCursor 16 pascal16 ClipCursor(ptr) ClipCursor
17 pascal16 GetCursorPos(ptr) GetCursorPos 17 pascal16 GetCursorPos(ptr) GetCursorPos
18 pascal16 SetCapture(word) SetCapture 18 pascal16 SetCapture(word) SetCapture

View file

@ -31,9 +31,10 @@ typedef struct tagCLASS
#pragma pack(4) #pragma pack(4)
#endif #endif
extern void CLASS_DumpClass( HCLASS hClass );
HCLASS CLASS_FindClassByName( SEGPTR name, HINSTANCE hinstance, CLASS **ptr ); extern void CLASS_WalkClasses(void);
CLASS * CLASS_FindClassPtr( HCLASS hclass ); extern HCLASS CLASS_FindClassByName( SEGPTR name, HINSTANCE hinstance,
CLASS **ptr );
extern CLASS * CLASS_FindClassPtr( HCLASS hclass );
#endif /* CLASS_H */ #endif /* CLASS_H */

View file

@ -89,10 +89,6 @@ extern void DEBUG_Print( const DBG_ADDR *addr, int count, char format );
extern void DEBUG_PrintAddress( const DBG_ADDR *addr, int addrlen ); extern void DEBUG_PrintAddress( const DBG_ADDR *addr, int addrlen );
extern void DEBUG_Help(void); extern void DEBUG_Help(void);
extern void DEBUG_List( DBG_ADDR *addr, int count ); extern void DEBUG_List( DBG_ADDR *addr, int count );
extern void DEBUG_InitWalk(void);
extern void DEBUG_WndWalk( HWND );
extern void DEBUG_WndDump( HWND );
extern void DEBUG_QueueDump( HQUEUE );
/* debugger/memory.c */ /* debugger/memory.c */
extern BOOL DEBUG_IsBadReadPtr( const DBG_ADDR *address, int size ); extern BOOL DEBUG_IsBadReadPtr( const DBG_ADDR *address, int size );

283
include/except.h Normal file
View file

@ -0,0 +1,283 @@
/*
* except.h
* Copyright (c) 1996, Onno Hovers (onno@stack.urc.tue.nl)
*/
#ifndef __WINE_EXCEPT_H
#define __WINE_EXCEPT_H
#include"windows.h"
/*
* general definitions
*/
#ifndef PVOID
#define PVOID void *
#endif
/*
* exception codes
*/
#define STATUS_WAIT_0 0x00000000
#define STATUS_ABANDONED_WAIT_0 0x00000080
#define STATUS_USER_APC 0x000000C0
#define STATUS_TIMEOUT 0x00000102
#define STATUS_PENDING 0x00000103
#define STATUS_DATATYPE_MISALIGNMENT 0x80000002
#define STATUS_BREAKPOINT 0x80000003
#define STATUS_SINGLE_STEP 0x80000004
#define STATUS_ACCESS_VIOLATION 0xC0000005
#define STATUS_IN_PAGE_ERROR 0xC0000006
#define STATUS_NO_MEMORY 0xC0000017
#define STATUS_ILLEGAL_INSTRUCTION 0xC000001D
#define STATUS_NONCONTINUABLE_EXCEPTION 0xC0000025
#define STATUS_INVALID_DISPOSITION 0xC0000026
#define STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008C
#define STATUS_FLOAT_DENORMAL_OPERAND 0xC000008D
#define STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008E
#define STATUS_FLOAT_INEXACT_RESULT 0xC000008F
#define STATUS_FLOAT_INVALID_OPERATION 0xC0000090
#define STATUS_FLOAT_OVERFLOW 0xC0000091
#define STATUS_FLOAT_STACK_CHECK 0xC0000092
#define STATUS_FLOAT_UNDERFLOW 0xC0000093
#define STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094
#define STATUS_INTEGER_OVERFLOW 0xC0000095
#define STATUS_PRIVILEGED_INSTRUCTION 0xC0000096
#define STATUS_STACK_OVERFLOW 0xC00000FD
#define STATUS_CONTROL_C_EXIT 0xC000013A
#define EXCEPTION_ACCESS_VIOLATION STATUS_ACCESS_VIOLATION
#define EXCEPTION_DATATYPE_MISALIGNMENT STATUS_DATATYPE_MISALIGNMENT
#define EXCEPTION_BREAKPOINT STATUS_BREAKPOINT
#define EXCEPTION_SINGLE_STEP STATUS_SINGLE_STEP
#define EXCEPTION_ARRAY_BOUNDS_EXCEEDED STATUS_ARRAY_BOUNDS_EXCEEDED
#define EXCEPTION_FLT_DENORMAL_OPERAND STATUS_FLOAT_DENORMAL_OPERAND
#define EXCEPTION_FLT_DIVIDE_BY_ZERO STATUS_FLOAT_DIVIDE_BY_ZERO
#define EXCEPTION_FLT_INEXACT_RESULT STATUS_FLOAT_INEXACT_RESULT
#define EXCEPTION_FLT_INVALID_OPERATION STATUS_FLOAT_INVALID_OPERATION
#define EXCEPTION_FLT_OVERFLOW STATUS_FLOAT_OVERFLOW
#define EXCEPTION_FLT_STACK_CHECK STATUS_FLOAT_STACK_CHECK
#define EXCEPTION_FLT_UNDERFLOW STATUS_FLOAT_UNDERFLOW
#define EXCEPTION_INT_DIVIDE_BY_ZERO STATUS_INTEGER_DIVIDE_BY_ZERO
#define EXCEPTION_INT_OVERFLOW STATUS_INTEGER_OVERFLOW
#define EXCEPTION_PRIV_INSTRUCTION STATUS_PRIVILEGED_INSTRUCTION
#define EXCEPTION_IN_PAGE_ERROR STATUS_IN_PAGE_ERROR
/*
* return values from the actual exception handlers
*/
#define ExceptionContinueExecution 0
#define ExceptionContinueSearch 1
#define ExceptionNestedException 2
#define ExceptionCollidedUnwind 3
/*
* return values from filters in except() and from UnhandledExceptionFilter
*/
#define EXCEPTION_EXECUTE_HANDLER 1
#define EXCEPTION_CONTINUE_SEARCH 0
#define EXCEPTION_CONTINUE_EXECUTION -1
/*
* from OS/2 2.0 exception handling
* Win32 seems to use the same flags as ExceptionFlags in an EXCEPTION_RECORD
*/
#define EH_NONCONTINUABLE 0x01
#define EH_UNWINDING 0x02
#define EH_EXIT_UNWIND 0x04
#define EH_STACK_INVALID 0x08
#define EH_NESTED_CALL 0x10
#define EXCEPTION_CONTINUABLE 0
#define EXCEPTION_NONCONTINUABLE EH_NONCONTINUABLE
/*
* data types
*/
/*
* The i386 context used by Win32 for almost everything.
*/
#define SIZE_OF_80387_REGISTERS 80
typedef struct _FLOATING_SAVE_AREA
{
DWORD ControlWord;
DWORD StatusWord;
DWORD TagWord;
DWORD ErrorOffset;
DWORD ErrorSelector;
DWORD DataOffset;
DWORD DataSelector;
BYTE RegisterArea[SIZE_OF_80387_REGISTERS];
DWORD Cr0NpxState;
} FLOATING_SAVE_AREA;
typedef struct __CONTEXT
{
DWORD ContextFlags;
DWORD Dr0;
DWORD Dr1;
DWORD Dr2;
DWORD Dr3;
DWORD Dr6;
DWORD Dr7;
FLOATING_SAVE_AREA FloatSave;
DWORD SegGs;
DWORD SegFs;
DWORD SegEs;
DWORD SegDs;
DWORD Edi;
DWORD Esi;
DWORD Ebx;
DWORD Edx;
DWORD Ecx;
DWORD Eax;
DWORD Ebp;
DWORD Eip;
DWORD SegCs;
DWORD EFlags;
DWORD Esp;
DWORD SegSs;
} CONTEXT;
typedef struct __CONTEXT *PCONTEXT;
/*
* The exception record used by Win32 to give additional information
* about exception to exception handlers.
*/
#define EXCEPTION_MAXIMUM_PARAMETERS 15
typedef struct __EXCEPTION_RECORD
{
DWORD ExceptionCode;
DWORD ExceptionFlags;
struct __EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress;
DWORD NumberParameters;
DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD;
typedef struct __EXCEPTION_RECORD_MIN
{
DWORD ExceptionCode;
DWORD ExceptionFlags;
struct __EXCEPTION_RECORD *ExceptionRecord;
PVOID ExceptionAddress;
DWORD NumberParameters;
DWORD ExceptionInformation[0];
} EXCEPTION_RECORD_MIN;
typedef struct __EXCEPTION_RECORD *PEXCEPTION_RECORD;
/*
* The exception pointers structure passed to exception filters
* in except() and the UnhandledExceptionFilter().
*/
typedef struct __EXCEPTION_POINTERS
{
PEXCEPTION_RECORD ExceptionRecord;
PCONTEXT ContextRecord;
} EXCEPTION_POINTERS;
typedef struct __EXCEPTION_POINTERS *PEXCEPTION_POINTERS;
/*
* the function pointer to a exception handler
*/
/* forward definition */
struct __EXCEPTION_FRAME;
typedef DWORD ( *PEXCEPTION_HANDLER)( PEXCEPTION_RECORD pexcrec,
struct __EXCEPTION_FRAME *pestframe,
PCONTEXT pcontext,
PVOID pdispatcher);
/*
* function pointer to a UnhandledExceptionFilter();
*/
typedef long (WINAPI *__PTOP_EXCFILTER)
(PEXCEPTION_POINTERS ExceptionInfo);
typedef __PTOP_EXCFILTER PTOP_LEVER_EXCEPTION_FILTER;
typedef __PTOP_EXCFILTER LPTOP_LEVEL_EXCEPTION_FILTER;
/*
* The exception frame, used for registering exception handlers
* Win32 cares only about this, but compilers generally emit
* larger exception frames for their own use.
*/
typedef struct __EXCEPTION_FRAME
{
struct __EXCEPTION_FRAME *Prev;
PEXCEPTION_HANDLER Handler;
} EXCEPTION_FRAME;
typedef struct __EXCEPTION_FRAME *PEXCEPTION_FRAME;
extern PEXCEPTION_FRAME TebExceptionFrame asm("%fs:0");
#define EXC_GetFrame() TebExceptionFrame
#define EXC_SetFrame(a) (TebExceptionFrame=(a))
/*
* Function definitions
*/
void EXC_RaiseException(DWORD exccode, DWORD excflags,
DWORD nargs, const LPDWORD pargs,
PCONTEXT pcontext);
void EXC_RtlUnwind( PEXCEPTION_FRAME pestframe,
LPVOID unusedEIP,
PEXCEPTION_RECORD pexcrec,
DWORD contextEAX,
PCONTEXT pcontext );
DWORD EXC_CallUnhandledExceptionFilter( PEXCEPTION_RECORD precord,
PCONTEXT pcontext);
void EXC_Init(void);
BOOL WINAPI RaiseException(DWORD exccode, DWORD excflags,
DWORD nargs, const LPDWORD pargs);
/*
* this undocumented function is called when an exception
* handler wants all the frames to be unwound. RtlUnwind
* calls all exception handlers with the EH_UNWIND or
* EH_EXIT_UNWIND flags set in the exception record
*
* This prototype assumes RtlUnwind takes the same
* parameters as OS/2 2.0 DosUnwindException
* Disassembling RtlUnwind shows this is true, except for
* the TargetEIP parameter, which is unused. There is
* a fourth parameter, that is used as the eax in the
* context.
*/
BOOL WINAPI RtlUnwind( PEXCEPTION_FRAME pestframe,
LPVOID unusedEIP,
PEXCEPTION_RECORD pexcrec,
DWORD contextEAX );
DWORD WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers);
__PTOP_EXCFILTER WINAPI SetUnhandledExceptionFilter(
LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);
#endif /* __WINE_EXCEPT_H */

View file

@ -10,6 +10,7 @@
int KERN32_Init(void); int KERN32_Init(void);
void SetLastError(DWORD error); void SetLastError(DWORD error);
DWORD ErrnoToLastError(int errno_num); DWORD ErrnoToLastError(int errno_num);
void ExitProcess(DWORD exitcode);
/* Code page information. /* Code page information.
*/ */

View file

@ -25,6 +25,7 @@ typedef struct {
WORD CtlID; WORD CtlID;
LPLISTSTRUCT lpFirst; LPLISTSTRUCT lpFirst;
HWND hSelf; HWND hSelf;
DWORD dwStyle; /* added for COMBOLBOX style faking */
HWND hParent; HWND hParent;
HFONT hFont; HFONT hFont;
BOOL bRedrawFlag; BOOL bRedrawFlag;

View file

@ -1,83 +1,20 @@
/* /*
* Message queues definitions * Message definitions
* *
* Copyright 1993 Alexandre Julliard * Copyright 1993 Alexandre Julliard
*/ */
#ifndef MESSAGE_H #ifndef __WINE_MESSAGE_H
#define MESSAGE_H #define __WINE_MESSAGE_H
#include "windows.h" #include "windows.h"
#ifndef WINELIB
#pragma pack(1)
#endif
/* Message as stored in the queue (contains the extraInfo field) */
typedef struct tagQMSG
{
DWORD extraInfo; /* Only in 3.1 */
MSG msg;
} QMSG;
typedef struct tagMESSAGEQUEUE
{
HANDLE next; /* 00 Next queue */
HTASK hTask; /* 02 hTask owning the queue */
WORD msgSize; /* 04 Size of messages in the queue */
WORD msgCount; /* 06 Number of waiting messages */
WORD nextMessage; /* 08 Next message to be retrieved */
WORD nextFreeMessage; /* 0a Next available slot in the queue */
WORD queueSize; /* 0c Size of the queue */
DWORD GetMessageTimeVal WINE_PACKED; /* 0e Value for GetMessageTime */
DWORD GetMessagePosVal WINE_PACKED; /* 12 Value for GetMessagePos */
WORD reserved1; /* 16 Unknown */
DWORD GetMessageExtraInfoVal; /* 18 Value for GetMessageExtraInfo */
WORD reserved2; /* 1c Unknown */
LPARAM lParam WINE_PACKED; /* 1e Next 4 values set by SendMessage */
WPARAM wParam; /* 22 */
UINT msg; /* 24 */
HWND hWnd; /* 26 */
DWORD SendMessageReturn; /* 28 Return value for SendMessage */
WORD wPostQMsg; /* 2c PostQuitMessage flag */
WORD wExitCode; /* 2e PostQuitMessage exit code */
WORD reserved3[3]; /* 30 Unknown */
WORD wWinVersion; /* 36 Expected Windows version */
HQUEUE InSendMessageHandle; /* 38 Queue of task that sent a message */
HTASK hSendingTask; /* 3a Handle of task that sent a message */
HTASK hPrevSendingTask; /* 3c Handle of previous sender */
WORD wPaintCount; /* 3e Number of WM_PAINT needed */
WORD wTimerCount; /* 40 Number of timers for this task */
WORD tempStatus; /* 42 State reset by GetQueueStatus */
WORD status; /* 44 Queue state */
WORD wakeMask; /* 46 Task wake-up mask */
WORD SendMsgReturnPtrs[3]; /* 48 Near ptr to return values (?) */
HANDLE hCurHook; /* 4e Current hook */
HANDLE hooks[WH_NB_HOOKS]; /* 50 Task hooks list */
WORD reserved4[3]; /* 68 Unknown */
QMSG messages[1]; /* 6e Queue messages */
} MESSAGEQUEUE;
#ifndef WINELIB
#pragma pack(4)
#endif
extern DWORD MSG_WineStartTicks; /* Ticks at Wine startup */ extern DWORD MSG_WineStartTicks; /* Ticks at Wine startup */
extern void MSG_IncPaintCount( HANDLE hQueue );
extern void MSG_DecPaintCount( HANDLE hQueue );
extern void MSG_IncTimerCount( HANDLE hQueue );
extern void MSG_DecTimerCount( HANDLE hQueue );
extern void MSG_Synchronize(); extern void MSG_Synchronize();
extern BOOL MSG_WaitXEvent( LONG maxWait ); extern BOOL MSG_WaitXEvent( LONG maxWait );
extern BOOL MSG_CreateSysMsgQueue( int size );
extern BOOL MSG_DeleteMsgQueue( HANDLE hQueue );
extern HTASK MSG_GetQueueTask( HANDLE hQueue );
extern void hardware_event( WORD message, WORD wParam, LONG lParam,
int xPos, int yPos, DWORD time, DWORD extraInfo );
extern BOOL MSG_GetHardwareMessage( LPMSG msg ); extern BOOL MSG_GetHardwareMessage( LPMSG msg );
extern BOOL MSG_InternalGetMessage( SEGPTR msg, HWND hwnd, HWND hwndOwner, extern BOOL MSG_InternalGetMessage( SEGPTR msg, HWND hwnd, HWND hwndOwner,
short code, WORD flags, BOOL sendIdle ); short code, WORD flags, BOOL sendIdle );
#endif /* MESSAGE_H */ #endif /* __WINE_MESSAGE_H */

83
include/queue.h Normal file
View file

@ -0,0 +1,83 @@
/*
* Message queues definitions
*
* Copyright 1993 Alexandre Julliard
*/
#ifndef __WINE_QUEUE_H
#define __WINE_QUEUE_H
#include "windows.h"
#ifndef WINELIB
#pragma pack(1)
#endif
/* Message as stored in the queue (contains the extraInfo field) */
typedef struct tagQMSG
{
DWORD extraInfo; /* Only in 3.1 */
MSG msg;
} QMSG;
typedef struct tagMESSAGEQUEUE
{
HQUEUE next; /* 00 Next queue */
HTASK hTask; /* 02 hTask owning the queue */
WORD msgSize; /* 04 Size of messages in the queue */
WORD msgCount; /* 06 Number of waiting messages */
WORD nextMessage; /* 08 Next message to be retrieved */
WORD nextFreeMessage; /* 0a Next available slot in the queue */
WORD queueSize; /* 0c Size of the queue */
DWORD GetMessageTimeVal WINE_PACKED; /* 0e Value for GetMessageTime */
DWORD GetMessagePosVal WINE_PACKED; /* 12 Value for GetMessagePos */
WORD reserved1; /* 16 Unknown */
DWORD GetMessageExtraInfoVal; /* 18 Value for GetMessageExtraInfo */
WORD reserved2; /* 1c Unknown */
LPARAM lParam WINE_PACKED; /* 1e Next 4 values set by SendMessage */
WPARAM wParam; /* 22 */
UINT msg; /* 24 */
HWND hWnd; /* 26 */
DWORD SendMessageReturn; /* 28 Return value for SendMessage */
WORD wPostQMsg; /* 2c PostQuitMessage flag */
WORD wExitCode; /* 2e PostQuitMessage exit code */
WORD reserved3[3]; /* 30 Unknown */
WORD wWinVersion; /* 36 Expected Windows version */
HQUEUE InSendMessageHandle; /* 38 Queue of task that sent a message */
HTASK hSendingTask; /* 3a Handle of task that sent a message */
HTASK hPrevSendingTask; /* 3c Handle of previous sender */
WORD wPaintCount; /* 3e Number of WM_PAINT needed */
WORD wTimerCount; /* 40 Number of timers for this task */
WORD tempStatus; /* 42 State reset by GetQueueStatus */
WORD status; /* 44 Queue state */
WORD wakeMask; /* 46 Task wake-up mask */
WORD SendMsgReturnPtrs[3]; /* 48 Near ptr to return values (?) */
HANDLE hCurHook; /* 4e Current hook */
HANDLE hooks[WH_NB_HOOKS]; /* 50 Task hooks list */
WORD reserved4[3]; /* 68 Unknown */
QMSG messages[1]; /* 6e Queue messages */
} MESSAGEQUEUE;
#ifndef WINELIB
#pragma pack(4)
#endif
extern void QUEUE_DumpQueue( HQUEUE hQueue );
extern void QUEUE_WalkQueues(void);
extern MESSAGEQUEUE *QUEUE_GetSysQueue(void);
extern void QUEUE_IncPaintCount( HQUEUE hQueue );
extern void QUEUE_DecPaintCount( HQUEUE hQueue );
extern void QUEUE_IncTimerCount( HQUEUE hQueue );
extern void QUEUE_DecTimerCount( HQUEUE hQueue );
extern BOOL QUEUE_CreateSysMsgQueue( int size );
extern BOOL QUEUE_DeleteMsgQueue( HQUEUE hQueue );
extern HTASK QUEUE_GetQueueTask( HQUEUE hQueue );
extern BOOL QUEUE_AddMsg( HQUEUE hQueue, MSG * msg, DWORD extraInfo );
extern int QUEUE_FindMsg( MESSAGEQUEUE * msgQueue, HWND hwnd,
int first, int last );
extern void QUEUE_RemoveMsg( MESSAGEQUEUE * msgQueue, int pos );
extern void hardware_event( WORD message, WORD wParam, LONG lParam,
int xPos, int yPos, DWORD time, DWORD extraInfo );
#endif /* __WINE_QUEUE_H */

View file

@ -5,18 +5,16 @@
#ifndef __WINE_SPY_H #ifndef __WINE_SPY_H
#define __WINE_SPY_H #define __WINE_SPY_H
#define SPY_DISPATCHMESSAGE 0x0099 #define SPY_DISPATCHMESSAGE 0x0100
#define SPY_SENDMESSAGE 0x0100 #define SPY_SENDMESSAGE 0x0101
#define SPY_DEFWNDPROC 0x0101 #define SPY_DEFWNDPROC 0x0102
#define SPY_RESULT_OK 0x0000 #define SPY_RESULT_OK 0x0000
#define SPY_RESULT_INVALIDHWND 0x0001 #define SPY_RESULT_INVALIDHWND 0x0001
#define SPY_MAX_MSGNUM WM_USER extern void SPY_EnterMessage( int iFlag, HWND hwnd, UINT msg,
#define SPY_MAX_INDENTLEVEL 64 WPARAM wParam, LPARAM lParam );
extern void SPY_ExitMessage( int iFlag, HWND hwnd, UINT msg, LRESULT lReturn );
extern void EnterSpyMessage( int, HWND, WORD, WORD, LONG); extern int SPY_Init(void);
extern void ExitSpyMessage( int, HWND, WORD, LONG);
extern void SpyInit( void);
#endif /* __WINE_SPY_H */ #endif /* __WINE_SPY_H */

View file

@ -73,7 +73,7 @@ typedef struct
WORD version; /* Expected Windows version */ WORD version; /* Expected Windows version */
HANDLE hInstance; /* Instance handle for this task */ HANDLE hInstance; /* Instance handle for this task */
HMODULE hModule; /* Module handle */ HMODULE hModule; /* Module handle */
HANDLE hQueue; /* Selector of task message queue */ HQUEUE hQueue; /* Selector of task message queue */
HTASK hParent; /* Selector of TDB of parent task */ HTASK hParent; /* Selector of TDB of parent task */
WORD signal_flags; /* Flags related to signal handler */ WORD signal_flags; /* Flags related to signal handler */
DWORD sighandler WINE_PACKED; /* Signal handler */ DWORD sighandler WINE_PACKED; /* Signal handler */

View file

@ -75,6 +75,8 @@ typedef struct tagWND
/* Window functions */ /* Window functions */
extern WND *WIN_FindWndPtr( HWND hwnd ); extern WND *WIN_FindWndPtr( HWND hwnd );
extern void WIN_DumpWindow( HWND hwnd );
extern void WIN_WalkWindows( HWND hwnd, int indent );
extern Window WIN_GetXWindow( HWND hwnd ); extern Window WIN_GetXWindow( HWND hwnd );
extern BOOL WIN_UnlinkWindow( HWND hwnd ); extern BOOL WIN_UnlinkWindow( HWND hwnd );
extern BOOL WIN_LinkWindow( HWND hwnd, HWND hwndInsertAfter ); extern BOOL WIN_LinkWindow( HWND hwnd, HWND hwndInsertAfter );

View file

@ -2222,6 +2222,14 @@ typedef struct
typedef COMPAREITEMSTRUCT NEAR* PCOMPAREITEMSTRUCT; typedef COMPAREITEMSTRUCT NEAR* PCOMPAREITEMSTRUCT;
typedef COMPAREITEMSTRUCT FAR* LPCOMPAREITEMSTRUCT; typedef COMPAREITEMSTRUCT FAR* LPCOMPAREITEMSTRUCT;
/* WM_KEYUP/DOWN/CHAR HIWORD(lParam) flags */
#define KF_EXTENDED 0x0100
#define KF_DLGMODE 0x0800
#define KF_MENUMODE 0x1000
#define KF_ALTDOWN 0x2000
#define KF_REPEAT 0x4000
#define KF_UP 0x8000
/* Virtual key codes */ /* Virtual key codes */
#define VK_LBUTTON 0x01 #define VK_LBUTTON 0x01
#define VK_RBUTTON 0x02 #define VK_RBUTTON 0x02
@ -2947,7 +2955,7 @@ WORD GetSystemPaletteUse(HDC);
VOID GetSystemTime(LPSYSTEMTIME); /* Win32 */ VOID GetSystemTime(LPSYSTEMTIME); /* Win32 */
DWORD GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT); DWORD GetTabbedTextExtent(HDC,LPSTR,int,int,LPINT);
HINSTANCE GetTaskDS(void); HINSTANCE GetTaskDS(void);
HGLOBAL GetTaskQueue(HTASK); HQUEUE GetTaskQueue(HTASK);
BYTE GetTempDrive(BYTE); BYTE GetTempDrive(BYTE);
INT GetTempFileName(BYTE,LPCSTR,UINT,LPSTR); INT GetTempFileName(BYTE,LPCSTR,UINT,LPSTR);
WORD GetTextAlign(HDC); WORD GetTextAlign(HDC);
@ -3122,7 +3130,7 @@ BOOL Polygon(HDC,LPPOINT,int);
BOOL Polyline(HDC,LPPOINT,int); BOOL Polyline(HDC,LPPOINT,int);
BOOL PostAppMessage(HANDLE,WORD,WORD,LONG); BOOL PostAppMessage(HANDLE,WORD,WORD,LONG);
BOOL PostMessage(HWND,WORD,WORD,LONG); BOOL PostMessage(HWND,WORD,WORD,LONG);
void PostQuitMessage(int); void PostQuitMessage(INT);
WORD PrestoChangoSelector(WORD,WORD); WORD PrestoChangoSelector(WORD,WORD);
void ProfClear(void); void ProfClear(void);
void ProfFinish(void); void ProfFinish(void);
@ -3244,7 +3252,7 @@ void SetSysColors(int,LPINT,COLORREF*);
HWND SetSysModalWindow(HWND); HWND SetSysModalWindow(HWND);
WORD SetSystemPaletteUse(HDC,WORD); WORD SetSystemPaletteUse(HDC,WORD);
WORD SetSystemTimer(HWND,WORD,WORD,FARPROC); WORD SetSystemTimer(HWND,WORD,WORD,FARPROC);
HGLOBAL SetTaskQueue(HTASK,HGLOBAL); HQUEUE SetTaskQueue(HTASK,HQUEUE);
WORD SetTextAlign(HDC,WORD); WORD SetTextAlign(HDC,WORD);
short SetTextCharacterExtra(HDC,short); short SetTextCharacterExtra(HDC,short);
DWORD SetTextColor(HDC,DWORD); DWORD SetTextColor(HDC,DWORD);

View file

@ -22,7 +22,7 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
#include "dialog.h" #include "dialog.h"
#include "directory.h" #include "directory.h"
#include "drive.h" #include "drive.h"
#include "message.h" #include "queue.h"
#include "syscolor.h" #include "syscolor.h"
#include "sysmetrics.h" #include "sysmetrics.h"
#include "gdi.h" #include "gdi.h"
@ -54,7 +54,8 @@ int MAIN_Init(void)
/* Load the configuration file */ /* Load the configuration file */
if (!PROFILE_LoadWineIni()) return 0; if (!PROFILE_LoadWineIni()) return 0;
SpyInit(); /* Initialize message spying */
if (!SPY_Init()) return 0;
#ifndef WINELIB #ifndef WINELIB
/* Initialize relay code */ /* Initialize relay code */
@ -120,7 +121,10 @@ int MAIN_Init(void)
/* Create system message queue */ /* Create system message queue */
queueSize = GetProfileInt( "windows", "TypeAhead", 120 ); queueSize = GetProfileInt( "windows", "TypeAhead", 120 );
if (!MSG_CreateSysMsgQueue( queueSize )) return 0; if (!QUEUE_CreateSysMsgQueue( queueSize )) return 0;
/* Set double click time */
SetDoubleClickTime( GetProfileInt( "windows", "DoubleClickSpeed", 452 ) );
return 1; return 1;
} }

View file

@ -22,8 +22,6 @@
#if !defined(BSD4_4) || defined(linux) || defined(__FreeBSD__) #if !defined(BSD4_4) || defined(linux) || defined(__FreeBSD__)
char * cstack[4096]; char * cstack[4096];
#endif #endif
struct sigaction segv_act;
struct sigaction usr2_act;
#ifdef linux #ifdef linux
extern void ___sig_restore(); extern void ___sig_restore();
@ -56,27 +54,32 @@ static void win_fault(int signal, void *siginfo, ucontext_t *context)
static void win_fault(int signal, int code, struct sigcontext *context) static void win_fault(int signal, int code, struct sigcontext *context)
{ {
#endif #endif
if (signal != SIGTRAP) if (signal == SIGTRAP)
{
/* If SIGTRAP not caused by breakpoint or single step
don't jump into the debugger */
if (!(EFL_reg(context) & STEP_FLAG))
{
DBG_ADDR addr;
addr.seg = CS_reg(context);
addr.off = EIP_reg(context) - 1;
if (DEBUG_FindBreakpoint(&addr) == -1) return;
}
}
else if (signal != SIGHUP)
{ {
if (CS_reg(context) == WINE_CODE_SELECTOR) if (CS_reg(context) == WINE_CODE_SELECTOR)
{ {
fprintf(stderr, "Segmentation fault in Wine program (%x:%lx)." fprintf(stderr, "Segmentation fault in Wine program (%x:%lx)."
" Please debug\n", " Please debug.\n",
CS_reg(context), EIP_reg(context) ); CS_reg(context), EIP_reg(context) );
} }
else if (INSTR_EmulateInstruction( context )) return; else
fprintf( stderr,"In win_fault %x:%lx\n", {
CS_reg(context), EIP_reg(context) ); if (INSTR_EmulateInstruction( context )) return;
} fprintf( stderr, "Segmentation fault in Windows program %x:%lx.\n",
CS_reg(context), EIP_reg(context) );
/* If SIGTRAP not caused by breakpoint or single step }
don't jump into the debugger */
if ((signal == SIGTRAP) && !(EFL_reg(context) & STEP_FLAG))
{
DBG_ADDR addr;
addr.seg = CS_reg(context);
addr.off = EIP_reg(context) - 1;
if (DEBUG_FindBreakpoint(&addr) == -1) return;
} }
XUngrabPointer(display, CurrentTime); XUngrabPointer(display, CurrentTime);
@ -85,131 +88,104 @@ static void win_fault(int signal, int code, struct sigcontext *context)
wine_debug( signal, context ); /* Enter our debugger */ wine_debug( signal, context ); /* Enter our debugger */
} }
/**********************************************************************
* SIGNAL_SetHandler
*/
static void SIGNAL_SetHandler( int sig, void (*func)() )
{
int ret;
struct sigaction sig_act;
#ifdef linux
sig_act.sa_handler = func;
/* Point to the top of the stack, minus 4 just in case, and make
it aligned */
sig_act.sa_restorer =
(void (*)()) (((unsigned int)(cstack) + sizeof(cstack) - 4) & ~3);
ret = wine_sigaction( sig, &sig_act, NULL );
#endif /* linux */
#if defined(__NetBSD__) || defined(__FreeBSD__)
sig_act.sa_handler = func;
sig_act.sa_flags = SA_ONSTACK;
sig_act.sa_mask = sig_mask;
ret = sigaction( sig, &sig_act, NULL );
#endif /* __FreeBSD__ || __NetBSD__ */
#if defined (__svr4__)
sig_act.sa_handler = func;
sig_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
sig_act.sa_mask = sig_mask;
ret = sigaction( sig, &sig_act, NULL );
#endif /* __svr4__ */
if (ret < 0)
{
perror( "sigaction" );
exit(1);
}
}
/**********************************************************************
* init_wine_signals
*/
void init_wine_signals(void) void init_wine_signals(void)
{ {
extern void stop_wait(int a); extern void stop_wait(int a);
#ifdef linux
segv_act.sa_handler = (__sighandler_t) win_fault;
/* Point to the top of the stack, minus 4 just in case, and make
it aligned */
segv_act.sa_restorer =
(void (*)()) (((unsigned int)(cstack) + sizeof(cstack) - 4) & ~3);
/* Point to the top of the stack, minus 4 just in case, and make
it aligned */
wine_sigaction(SIGSEGV, &segv_act, NULL);
wine_sigaction(SIGILL, &segv_act, NULL);
wine_sigaction(SIGFPE, &segv_act, NULL);
#ifdef SIGBUS
wine_sigaction(SIGBUS, &segv_act, NULL);
#endif
wine_sigaction(SIGTRAP, &segv_act, NULL); /* For breakpoints */
#ifdef CONFIG_IPC
usr2_act.sa_restorer= segv_act.sa_restorer;
usr2_act.sa_handler = (__sighandler_t) stop_wait;
wine_sigaction(SIGUSR2, &usr2_act, NULL);
#endif /* CONFIG_IPC */
#endif /* linux */
#if defined(__NetBSD__) || defined(__FreeBSD__) #if defined(__NetBSD__) || defined(__FreeBSD__)
sigset_t sig_mask; sigset_t sig_mask;
struct sigaltstack ss; struct sigaltstack ss;
#if !defined (__FreeBSD__) #if !defined (__FreeBSD__)
if ((ss.ss_base = malloc(MINSIGSTKSZ)) == NULL) { if ((ss.ss_base = malloc(MINSIGSTKSZ)) == NULL) {
#else #else
if ((ss.ss_sp = malloc(MINSIGSTKSZ)) == NULL) { if ((ss.ss_sp = malloc(MINSIGSTKSZ)) == NULL) {
#endif #endif
fprintf(stderr, "Unable to allocate signal stack (%d bytes)\n", fprintf(stderr, "Unable to allocate signal stack (%d bytes)\n",
MINSIGSTKSZ); MINSIGSTKSZ);
exit(1); exit(1);
} }
ss.ss_size = MINSIGSTKSZ; ss.ss_size = MINSIGSTKSZ;
ss.ss_flags = 0; ss.ss_flags = 0;
if (sigaltstack(&ss, NULL) < 0) { if (sigaltstack(&ss, NULL) < 0) {
perror("sigstack"); perror("sigstack");
exit(1); exit(1);
} }
sigemptyset(&sig_mask); sigemptyset(&sig_mask);
segv_act.sa_handler = (void (*)) win_fault;
segv_act.sa_flags = SA_ONSTACK;
segv_act.sa_mask = sig_mask;
if (sigaction(SIGBUS, &segv_act, NULL) < 0) {
perror("sigaction: SIGBUS");
exit(1);
}
segv_act.sa_handler = (void (*)) win_fault;
segv_act.sa_flags = SA_ONSTACK;
segv_act.sa_mask = sig_mask;
if (sigaction(SIGSEGV, &segv_act, NULL) < 0) {
perror("sigaction: SIGSEGV");
exit(1);
}
segv_act.sa_handler = (void (*)) win_fault; /* For breakpoints */
segv_act.sa_flags = SA_ONSTACK;
segv_act.sa_mask = sig_mask;
if (sigaction(SIGTRAP, &segv_act, NULL) < 0) {
perror("sigaction: SIGTRAP");
exit(1);
}
#ifdef CONFIG_IPC
usr2_act.sa_handler = (void (*)) stop_wait; /* For breakpoints */
usr2_act.sa_flags = SA_ONSTACK;
usr2_act.sa_mask = sig_mask;
if (sigaction(SIGUSR2, &usr2_act, NULL) < 0) {
perror("sigaction: SIGUSR2");
exit(1);
}
#endif /* CONFIG_IPC */
#endif /* __FreeBSD__ || __NetBSD__ */ #endif /* __FreeBSD__ || __NetBSD__ */
#if defined (__svr4__)
sigset_t sig_mask;
struct sigaltstack ss;
if ((ss.ss_sp = malloc(SIGSTKSZ) ) == NULL) {
fprintf(stderr, "Unable to allocate signal stack (%d bytes)\n",
SIGSTKSZ);
exit(1);
}
ss.ss_size = SIGSTKSZ;
ss.ss_flags = 0;
if (sigaltstack(&ss, NULL) < 0) {
perror("sigstack");
exit(1);
}
sigemptyset(&sig_mask);
segv_act.sa_handler = (void (*)) win_fault;
segv_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
segv_act.sa_mask = sig_mask;
if (sigaction(SIGBUS, &segv_act, NULL) < 0) {
perror("sigaction: SIGBUS");
exit(1);
}
segv_act.sa_handler = (void (*)) win_fault;
segv_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
segv_act.sa_mask = sig_mask;
if (sigaction(SIGSEGV, &segv_act, NULL) < 0) {
perror("sigaction: SIGSEGV");
exit(1);
}
segv_act.sa_handler = (void (*)) win_fault; /* For breakpoints */ #if defined (__svr4__)
segv_act.sa_flags = SA_ONSTACK | SA_SIGINFO; sigset_t sig_mask;
segv_act.sa_mask = sig_mask; struct sigaltstack ss;
if (sigaction(SIGTRAP, &segv_act, NULL) < 0) {
perror("sigaction: SIGTRAP");
exit(1);
}
#ifdef CONFIG_IPC
usr2_act.sa_handler = (void (*)) stop_wait; /* For breakpoints */
usr2_act.sa_flags = SA_ONSTACK | SA_SIGINFO;
usr2_act.sa_mask = sig_mask;
if (sigaction(SIGUSR2, &usr2_act, NULL) < 0) {
perror("sigaction: SIGUSR2");
exit(1);
}
#endif /* CONFIG_IPC */
if ((ss.ss_sp = malloc(SIGSTKSZ) ) == NULL) {
fprintf(stderr, "Unable to allocate signal stack (%d bytes)\n",
SIGSTKSZ);
exit(1);
}
ss.ss_size = SIGSTKSZ;
ss.ss_flags = 0;
if (sigaltstack(&ss, NULL) < 0) {
perror("sigstack");
exit(1);
}
sigemptyset(&sig_mask);
#endif /* __svr4__ */ #endif /* __svr4__ */
SIGNAL_SetHandler( SIGSEGV, (void (*)())win_fault );
SIGNAL_SetHandler( SIGILL, (void (*)())win_fault );
SIGNAL_SetHandler( SIGFPE, (void (*)())win_fault );
SIGNAL_SetHandler( SIGTRAP, (void (*)())win_fault ); /* For debugger */
SIGNAL_SetHandler( SIGHUP, (void (*)())win_fault ); /* For forced break */
#ifdef SIGBUS
SIGNAL_SetHandler( SIGBUS, (void (*)())win_fault );
#endif
#ifdef CONFIG_IPC
SIGNAL_SetHandler( SIGUSR2, (void (*)())stop_wait ); /* For IPC */
#endif
} }
#endif /* ifndef WINELIB */ #endif /* ifndef WINELIB */

View file

@ -16,11 +16,11 @@
#include "debugger.h" #include "debugger.h"
#include "global.h" #include "global.h"
#include "instance.h" #include "instance.h"
#include "message.h"
#include "miscemu.h" #include "miscemu.h"
#include "module.h" #include "module.h"
#include "neexe.h" #include "neexe.h"
#include "options.h" #include "options.h"
#include "queue.h"
#include "selectors.h" #include "selectors.h"
#include "toolhelp.h" #include "toolhelp.h"
#include "stddebug.h" #include "stddebug.h"
@ -583,7 +583,7 @@ static void TASK_DeleteTask( HTASK hTask )
/* Free the message queue */ /* Free the message queue */
MSG_DeleteMsgQueue( pTask->hQueue ); QUEUE_DeleteMsgQueue( pTask->hQueue );
/* Free the selector aliases */ /* Free the selector aliases */
@ -988,9 +988,9 @@ HANDLE GetCodeHandle( FARPROC proc )
/*********************************************************************** /***********************************************************************
* SetTaskQueue (KERNEL.34) * SetTaskQueue (KERNEL.34)
*/ */
HGLOBAL SetTaskQueue( HANDLE hTask, HGLOBAL hQueue ) HQUEUE SetTaskQueue( HANDLE hTask, HQUEUE hQueue )
{ {
HGLOBAL hPrev; HQUEUE hPrev;
TDB *pTask; TDB *pTask;
if (!hTask) hTask = hCurrentTask; if (!hTask) hTask = hCurrentTask;
@ -1004,7 +1004,7 @@ HGLOBAL SetTaskQueue( HANDLE hTask, HGLOBAL hQueue )
/*********************************************************************** /***********************************************************************
* GetTaskQueue (KERNEL.35) * GetTaskQueue (KERNEL.35)
*/ */
HGLOBAL GetTaskQueue( HANDLE hTask ) HQUEUE GetTaskQueue( HANDLE hTask )
{ {
TDB *pTask; TDB *pTask;

View file

@ -194,8 +194,8 @@ _LoadKey(HKEY hKey,char *from)
f=fopen(from,"r"); f=fopen(from,"r");
if (f==NULL) { if (f==NULL) {
perror("fopen-registry-read"); dprintf_reg(stddeb,"fopen-registry-read");
return; return;
} }
switch ((DWORD)hKey) { switch ((DWORD)hKey) {
case HKEY_CLASSES_ROOT: case HKEY_CLASSES_ROOT:

View file

@ -1,4 +1,5 @@
/* SPY.C /*
* Message spying routines
* *
* Copyright 1994, Bob Amstadt * Copyright 1994, Bob Amstadt
* 1995, Alex Korobka * 1995, Alex Korobka
@ -6,16 +7,18 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <X11/Xlib.h>
#include <X11/Xresource.h>
#include <string.h> #include <string.h>
#include "windows.h" #include "windows.h"
#include "module.h"
#include "options.h" #include "options.h"
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
#include "spy.h" #include "spy.h"
const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] = #define SPY_MAX_MSGNUM WM_USER
#define SPY_INDENT_UNIT 4 /* 4 spaces */
static const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
{ {
"WM_NULL", /* 0x00 */ "WM_NULL", /* 0x00 */
"WM_CREATE", "WM_CREATE",
@ -75,10 +78,12 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
"WM_QUERYDRAGICON", "WM_QUERYDRAGICON",
"WM_QUERYSAVESTATE", "WM_QUERYSAVESTATE",
"WM_COMPAREITEM", "WM_COMPAREITEM",
"WM_TESTING", NULL, "WM_TESTING",
NULL,
"WM_OTHERWINDOWCREATED", "WM_OTHERWINDOWCREATED",
"WM_OTHERWINDOWDESTROYED", "WM_OTHERWINDOWDESTROYED",
"WM_ACTIVATESHELLWINDOW", NULL, "WM_ACTIVATESHELLWINDOW",
NULL,
NULL, /* 0x40 */ NULL, /* 0x40 */
"WM_COMPACTING", NULL, NULL, "WM_COMPACTING", NULL, NULL,
@ -391,164 +396,121 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] =
"WM_USER" "WM_USER"
}; };
static BOOL SpyFilters [SPY_MAX_MSGNUM+1];
static BOOL SpyIncludes[SPY_MAX_MSGNUM+1];
static int iSpyMessageIndentLevel = 0; static BOOL SPY_Exclude[SPY_MAX_MSGNUM+1] = { FALSE, };
char lpstrSpyMessageIndent[SPY_MAX_INDENTLEVEL]; /* referenced in debugger/info.c */ static int SPY_IndentLevel = 0;
static char *lpstrSpyMessageFromWine = "Wine";
static char lpstrSpyMessageFromTask[10];
static char *lpstrSpyMessageFromSelf = "self";
static char *lpstrSpyMessageFrom = NULL;
#define SPY_EXCLUDE(msg) \
(SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
/********************************************************************** /***********************************************************************
* EnterSpyMessage * SPY_GetMsgName
*/ */
void EnterSpyMessage(int iFlag, HWND hWnd, WORD msg, WORD wParam, LONG lParam) static const char *SPY_GetMsgName( UINT msg )
{ {
HTASK hTask = GetWindowTask(hWnd); static char buffer[20];
WORD wCheckMsg = (msg > WM_USER)? WM_USER: msg;
if( !SpyIncludes[wCheckMsg] || SpyFilters[wCheckMsg]) return;
/* each SPY_SENDMESSAGE must be complemented by call to ExitSpyMessage */
switch(iFlag)
{
case SPY_DISPATCHMESSAGE:
if(msg <= WM_USER)
{
if(MessageTypeNames[msg])
dprintf_message(stddeb,"("NPFMT") message [%04x] %s dispatched wp=%04x lp=%08lx\n",
hWnd, msg, MessageTypeNames[msg], wParam, lParam);
else
dprintf_message(stddeb,"("NPFMT") message [%04x] dispatched wp=%04x lp=%08lx\n",
hWnd, msg, wParam, lParam);
}
else
dprintf_message(stddeb,"("NPFMT") message [%04x] WM_USER+%04d dispatched wp=%04x lp=%08lx\n",
hWnd, msg, msg-WM_USER ,wParam ,lParam);
break;
case SPY_SENDMESSAGE:
if(hTask == GetCurrentTask())
lpstrSpyMessageFrom = lpstrSpyMessageFromSelf;
else if(hTask == NULL)
lpstrSpyMessageFrom = lpstrSpyMessageFromWine;
else
{
sprintf(lpstrSpyMessageFromTask, "task "NPFMT, hTask);
lpstrSpyMessageFrom = lpstrSpyMessageFromTask;
}
if(msg <= WM_USER)
{
if(MessageTypeNames[msg])
dprintf_message(stddeb,"%s("NPFMT") message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
lpstrSpyMessageIndent,
hWnd, msg, MessageTypeNames[msg],
lpstrSpyMessageFrom,
wParam, lParam);
else
dprintf_message(stddeb,"%s("NPFMT") message [%04x] sent from %s wp=%04x lp=%08lx\n",
lpstrSpyMessageIndent,
hWnd, msg,
lpstrSpyMessageFrom,
wParam, lParam);
}
else
dprintf_message(stddeb,"%s("NPFMT") message [%04x] WM_USER+%04x sent from %s wp=%04x lp=%08lx\n",
lpstrSpyMessageIndent,
hWnd, msg, msg-WM_USER,
lpstrSpyMessageFrom,
wParam, lParam);
if(SPY_MAX_INDENTLEVEL > iSpyMessageIndentLevel )
{
iSpyMessageIndentLevel++;
lpstrSpyMessageIndent[iSpyMessageIndentLevel]='\0';
lpstrSpyMessageIndent[iSpyMessageIndentLevel-1] ='\t';
}
break;
case SPY_DEFWNDPROC:
if(msg <= WM_USER)
if(MessageTypeNames[msg])
dprintf_message(stddeb, "%s("NPFMT") DefWindowProc: %s [%04x] wp=%04x lp=%08lx\n",
lpstrSpyMessageIndent,
hWnd, MessageTypeNames[msg], msg, wParam, lParam );
else
dprintf_message(stddeb, "%s("NPFMT") DefWindowProc: [%04x] wp=%04x lp=%08lx\n",
lpstrSpyMessageIndent,
hWnd, msg, wParam, lParam );
else
dprintf_message(stddeb, "%s("NPFMT") DefWindowProc: WM_USER+%d [%04x] wp=%04x lp=%08lx\n",
lpstrSpyMessageIndent,
hWnd, msg - WM_USER, msg, wParam, lParam );
break;
default:
}
if (msg <= SPY_MAX_MSGNUM)
{
if (!MessageTypeNames[msg]) return "???";
return MessageTypeNames[msg];
}
sprintf( buffer, "WM_USER+%04x\n", msg - WM_USER );
return buffer;
} }
/**********************************************************************
* ExitSpyMessage /***********************************************************************
* SPY_EnterMessage
*/ */
void ExitSpyMessage(int iFlag, HWND hWnd, WORD msg, LONG lReturn) void SPY_EnterMessage( int iFlag, HWND hWnd, UINT msg,
WPARAM wParam, LPARAM lParam )
{ {
WORD wCheckMsg = (msg > WM_USER)? WM_USER: msg; if (!debugging_message || SPY_EXCLUDE(msg)) return;
if( !SpyIncludes[wCheckMsg] || SpyFilters[wCheckMsg]) return; /* each SPY_SENDMESSAGE must be complemented by call to ExitSpyMessage */
switch(iFlag)
if( iSpyMessageIndentLevel )
{ {
iSpyMessageIndentLevel--; case SPY_DISPATCHMESSAGE:
lpstrSpyMessageIndent[iSpyMessageIndentLevel]='\0'; dprintf_message(stddeb,"("NPFMT") message [%04x] %s dispatched wp=%04x lp=%08lx\n",
} hWnd, msg, SPY_GetMsgName( msg ),
wParam, lParam);
break;
switch(iFlag) case SPY_SENDMESSAGE:
{
char taskName[30];
HTASK hTask = GetWindowTask(hWnd);
if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
else if (!hTask) strcpy( taskName, "Wine" );
else sprintf( taskName, "task "NPFMT" %s",
hTask, MODULE_GetModuleName( GetExePtr(hTask) ) );
dprintf_message(stddeb,"%*s("NPFMT") message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
SPY_IndentLevel, "", hWnd, msg,
SPY_GetMsgName( msg ), taskName, wParam, lParam );
SPY_IndentLevel += SPY_INDENT_UNIT;
}
break;
case SPY_DEFWNDPROC:
dprintf_message(stddeb, "%*s("NPFMT") DefWindowProc: %s [%04x] wp=%04x lp=%08lx\n",
SPY_IndentLevel, "", hWnd, SPY_GetMsgName( msg ),
msg, wParam, lParam );
break;
}
}
/***********************************************************************
* SPY_ExitMessage
*/
void SPY_ExitMessage( int iFlag, HWND hWnd, UINT msg, LRESULT lReturn )
{
if (!debugging_message || SPY_EXCLUDE(msg)) return;
if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
switch(iFlag)
{ {
case SPY_RESULT_INVALIDHWND: case SPY_RESULT_INVALIDHWND:
dprintf_message(stddeb,"%s("NPFMT") message [%04x] HAS INVALID HWND\n", dprintf_message(stddeb,"%*s("NPFMT") message [%04x] %s HAS INVALID HWND\n",
lpstrSpyMessageIndent, hWnd, msg); SPY_IndentLevel, "", hWnd, msg,
break; SPY_GetMsgName( msg ) );
case SPY_RESULT_OK: break;
dprintf_message(stddeb,"%s("NPFMT") message [%04x] returned %08lx\n", case SPY_RESULT_OK:
lpstrSpyMessageIndent, hWnd, msg, lReturn); dprintf_message(stddeb,"%*s("NPFMT") message [%04x] %s returned %08lx\n",
break; SPY_IndentLevel, "", hWnd, msg,
default: SPY_GetMsgName( msg ), lReturn );
break;
} }
} }
/**********************************************************************
* SpyInit /***********************************************************************
* SPY_Init
*/ */
void SpyInit(void) int SPY_Init(void)
{ {
int i; int i;
char lpstrBuffer[512]; char buffer[512];
for(i=0; i <= SPY_MAX_MSGNUM; i++) SpyFilters[i] = SpyIncludes[i] = FALSE; PROFILE_GetWineIniString( "Spy", "Include", "", buffer, sizeof(buffer) );
if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
PROFILE_GetWineIniString( "spy", "Exclude", "", {
lpstrBuffer, sizeof(lpstrBuffer) ); dprintf_message( stddeb, "SpyInit: Include=%s\n", buffer );
dprintf_message(stddeb,"SpyInit: Exclude=%s\n",lpstrBuffer); for (i = 0; i <= SPY_MAX_MSGNUM; i++)
if( *lpstrBuffer != 0 ) SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
if(strstr(lpstrBuffer,"EXCLUDEALL")) }
for(i=0; i <= SPY_MAX_MSGNUM; i++) SpyFilters[i] = TRUE;
else
for(i=0; i <= SPY_MAX_MSGNUM; i++)
if(MessageTypeNames[i])
if(strstr(lpstrBuffer,MessageTypeNames[i])) SpyFilters[i] = TRUE;
PROFILE_GetWineIniString( "spy", "Include", "INCLUDEALL",
lpstrBuffer, sizeof(lpstrBuffer) );
dprintf_message(stddeb,"SpyInit: Include=%s\n",lpstrBuffer);
if( *lpstrBuffer != 0 )
if(strstr(lpstrBuffer,"INCLUDEALL"))
for(i=0; i <= SPY_MAX_MSGNUM; i++) SpyIncludes[i] = TRUE;
else
for(i=0; i <= SPY_MAX_MSGNUM; i++)
if(MessageTypeNames[i])
if(strstr(lpstrBuffer,MessageTypeNames[i])) SpyIncludes[i] = TRUE;
PROFILE_GetWineIniString( "Spy", "Exclude", "", buffer, sizeof(buffer) );
if (buffer[0])
{
dprintf_message( stddeb, "SpyInit: Exclude=%s\n", buffer );
if (!strcmp( buffer, "EXCLUDEALL" ))
for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
else
for (i = 0; i <= SPY_MAX_MSGNUM; i++)
SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
}
return 1;
} }

View file

@ -1,14 +1,15 @@
/* /*
static char RCSId[] = "$Id: user.c,v 1.2 1993/07/04 04:04:21 root Exp root $"; * Misc. USER functions
static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; *
*/ * Copyright 1993 Robert J. Amstadt
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "windows.h" #include "windows.h"
#include "gdi.h" #include "gdi.h"
#include "user.h" #include "user.h"
#include "win.h" #include "win.h"
#include "message.h"
#include "toolhelp.h" #include "toolhelp.h"
#define USER_HEAP_SIZE 0x10000 #define USER_HEAP_SIZE 0x10000
@ -63,26 +64,6 @@ BOOL SystemHeapInfo( SYSHEAPINFO *pHeapInfo )
} }
/***********************************************************************
* TimerCount (TOOLHELP.80)
*/
BOOL TimerCount( TIMERINFO *pTimerInfo )
{
/* FIXME
* In standard mode, dwmsSinceStart = dwmsThisVM
*
* I tested this, under Windows in enhanced mode, and
* if you never switch VM (ie start/stop DOS) these
* values should be the same as well.
*
* Also, Wine should adjust for the hardware timer
* to reduce the amount of error to ~1ms.
* I can't be bothered, can you?
*/
pTimerInfo->dwmsSinceStart = pTimerInfo->dwmsThisVM = GetTickCount();
return TRUE;
}
/*********************************************************************** /***********************************************************************
* USER_HeapInit * USER_HeapInit
*/ */
@ -96,6 +77,27 @@ BOOL USER_HeapInit(void)
#endif #endif
/***********************************************************************
* TimerCount (TOOLHELP.80)
*/
BOOL TimerCount( TIMERINFO *pTimerInfo )
{
/* FIXME
* In standard mode, dwmsSinceStart = dwmsThisVM
*
* I tested this, under Windows in enhanced mode, and
* if you never switch VM (ie start/stop DOS) these
* values should be the same as well.
*
* Also, Wine should adjust for the hardware timer
* to reduce the amount of error to ~1ms.
* I can't be bothered, can you?
*/
pTimerInfo->dwmsSinceStart = pTimerInfo->dwmsThisVM = GetTickCount();
return TRUE;
}
/********************************************************************** /**********************************************************************
* USER_InitApp * USER_InitApp
*/ */

View file

@ -7,6 +7,7 @@ C_SRCS = \
console.c \ console.c \
environment.c \ environment.c \
error.c \ error.c \
except.c \
file.c \ file.c \
gdi32.c \ gdi32.c \
heap.c \ heap.c \

212
win32/except.c Normal file
View file

@ -0,0 +1,212 @@
/*
* Win32 exception functions
*
* Copyright (c) 1996 Onno Hovers, (onno@stack.urc.tue.nl)
*
* Notes:
* What really happens behind the scenes of those new
* __try{...}__except(..){....} and
* __try{...}__finally{...}
* statements is simply not documented by Microsoft. There could be different
* reasons for this:
* One reason could be that they try to hide the fact that exception
* handling in Win32 looks almost the same as in OS/2 2.x.
* Another reason could be that Microsoft does not want others to write
* binary compatible implementations of the Win32 API (like us).
*
* Whatever the reason, THIS SUCKS!! Ensuring portabilty or future
* compatability may be valid reasons to keep some things undocumented.
* But exception handling is so basic to Win32 that it should be
* documented!
*
* Fixmes:
* -Most functions need better parameter checking.
* -I do not know how to handle exceptions within an exception handler.
* or what is done when ExceptionNestedException is returned from an
* exception handler
* -Real exceptions are not yet implemented. only the exception functions
* are implemented. A real implementation needs some new code in
* loader/signal.c. There would also be a need for showing debugging
* information in UnhandledExceptionFilter.
*
*/
#ifndef WINELIB
#include <stdio.h>
#include "windows.h"
#include "winerror.h"
#include "kernel32.h"
#include "stddebug.h"
#include "debug.h"
#include "except.h"
WINAPI DWORD KERNEL32_537(PEXCEPTION_POINTERS ptrs);
LPTOP_LEVEL_EXCEPTION_FILTER pTopExcHandler=
(LPTOP_LEVEL_EXCEPTION_FILTER) KERNEL32_537;
/*
* EXC_RtlUnwind
*
* This function is undocumented. This is the general idea of
* RtlUnwind, though. Note that error handling is not yet implemented
*
*/
void EXC_RtlUnwind(PEXCEPTION_FRAME pEndFrame,PVOID unusedEip,
PEXCEPTION_RECORD pRecord, DWORD returnEax,
PCONTEXT pcontext)
{
EXCEPTION_RECORD record;
DWORD dispatch;
int retval;
pcontext->Eax=returnEax;
/* build an exception record, if we do not have one */
if(!pRecord)
{
record.ExceptionCode= 0xC0000026; /* invalid disposition */
record.ExceptionFlags= 0;
record.ExceptionRecord= NULL;
record.ExceptionAddress=(PVOID) pcontext->Eip;
record.NumberParameters= 0;
pRecord=&record;
}
if(pEndFrame)
pRecord->ExceptionFlags|=EH_UNWINDING;
else
pRecord->ExceptionFlags|=EH_UNWINDING | EH_EXIT_UNWIND;
/* get chain of exception frames */
while((TebExceptionFrame!=NULL)&&
(TebExceptionFrame!=((void *)-1)) &&
(TebExceptionFrame!=pEndFrame))
{
dprintf_win32(stddeb,"calling exception handler at 0x%x\n",
(int) TebExceptionFrame->Handler);
dispatch=0;
retval=TebExceptionFrame->Handler(pRecord, TebExceptionFrame,
pcontext, &dispatch);
dprintf_win32(stddeb,"exception handler returns 0x%x, dispatch=0x%x\n",
retval, (int) dispatch);
if(retval==ExceptionCollidedUnwind)
TebExceptionFrame=(PVOID) dispatch;
else if(TebExceptionFrame!=pEndFrame)
TebExceptionFrame=TebExceptionFrame->Prev;
else
break;
}
}
/*
* EXC_RaiseException
*
*/
VOID EXC_RaiseException(DWORD dwExceptionCode,
DWORD dwExceptionFlags,
DWORD cArguments,
const LPDWORD lpArguments,
PCONTEXT pcontext)
{
PEXCEPTION_FRAME pframe;
EXCEPTION_RECORD record;
DWORD dispatch; /* is this used in raising exceptions ?? */
int retval;
int i;
/* compose an exception record */
record.ExceptionCode = dwExceptionCode;
record.ExceptionFlags = dwExceptionFlags;
record.ExceptionRecord = NULL;
record.NumberParameters = cArguments;
record.ExceptionAddress = (PVOID) pcontext->Eip;
for(i=0;i<cArguments;i++)
record.ExceptionInformation[i]=lpArguments[i];
/* get chain of exception frames */
retval=ExceptionContinueSearch;
pframe=TebExceptionFrame;
while((pframe!=NULL)&&(pframe!=((void *)0xFFFFFFFF)))
{
dprintf_win32(stddeb,"calling exception handler at 0x%x\n",
(int) pframe->Handler);
dispatch=0;
retval=pframe->Handler(&record,pframe,pcontext,&dispatch);
dprintf_win32(stddeb,"exception handler returns 0x%x, dispatch=0x%x\n",
retval, (int) dispatch);
if(retval==ExceptionContinueExecution)
break;
pframe=pframe->Prev;
}
if(retval!=ExceptionContinueExecution)
{
retval=EXC_CallUnhandledExceptionFilter(&record,pcontext);
if(retval!=EXCEPTION_CONTINUE_EXECUTION)
{
dprintf_win32(stddeb,"no handler wanted to handle "
"the exception, exiting\n" );
ExitProcess(dwExceptionCode); /* what status should be used here ? */
}
}
}
/*******************************************************************
* UnhandledExceptionFilter (KERNEL32.537)
*
* This is the unhandled exception code.
* Actually, this should show up a dialog box, with all kinds of
* fancy debugging information. It does nothing now!
*/
DWORD WINAPI UnhandledExceptionFilter(PEXCEPTION_POINTERS epointers)
{
PEXCEPTION_RECORD pRecord;
PCONTEXT pContext;
pRecord=epointers->ExceptionRecord;
pContext=epointers->ContextRecord;
if(pRecord->ExceptionFlags & (EH_UNWINDING | EH_EXIT_UNWIND) )
{
dprintf_win32(stddeb,"UnhandledExceptionFilter: exiting\n");
ExitProcess(pRecord->ExceptionCode);
}
else
{
RtlUnwind(0,pRecord,0,-1 );
}
/*
* This is just to avoid a warning, code should not get here
* if it does, EXC_RaiseException will terminate it.
*/
return EXCEPTION_CONTINUE_SEARCH;
}
/*************************************************************
* SetUnhandledExceptionFilter (KERNEL32.516)
*
*
*/
WINAPI LPTOP_LEVEL_EXCEPTION_FILTER
SetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER efilter)
{
pTopExcHandler=efilter;
return efilter;
}
#endif /* WINELIB */

View file

@ -15,19 +15,6 @@ at a later date. */
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
/***********************************************************************
* RaiseException (KERNEL32.??)
*
* Stub function - does not allow exceptions to be caught yet
*/
WINAPI VOID RaiseException(DWORD dwExceptionCode,
DWORD dwExceptionFlags,
DWORD cArguments,
const DWORD * lpArguments)
{
ExitProcess(dwExceptionCode); /* what status should be used here ? */
}
/*********************************************************************** /***********************************************************************
* GetProcAddress (KERNEL32.257) * GetProcAddress (KERNEL32.257)
* *

View file

@ -21,6 +21,7 @@ C_SRCS = \
nonclient.c \ nonclient.c \
painting.c \ painting.c \
property.c \ property.c \
queue.c \
scroll.c \ scroll.c \
syscolor.c \ syscolor.c \
sysmetrics.c \ sysmetrics.c \

View file

@ -22,6 +22,72 @@
static HCLASS firstClass = 0; static HCLASS firstClass = 0;
/***********************************************************************
* CLASS_DumpClass
*
* Dump the content of a class structure to stderr.
*/
void CLASS_DumpClass( HCLASS hClass )
{
CLASS *ptr;
char className[80];
int i;
if (!(ptr = CLASS_FindClassPtr( hClass )))
{
fprintf( stderr, "%04x is not a class handle\n", hClass );
return;
}
GlobalGetAtomName( ptr->atomName, className, sizeof(className) );
fprintf( stderr, "Class %04x:\n", hClass );
fprintf( stderr,
"next=%04x name=%04x '%s' style=%04x wndProc=%08lx\n"
"inst=%04x hdce=%04x icon=%04x cursor=%04x bkgnd=%04x\n"
"clsExtra=%d winExtra=%d #windows=%d\n",
ptr->hNext, ptr->atomName, className, ptr->wc.style,
(DWORD)ptr->wc.lpfnWndProc, ptr->wc.hInstance, ptr->hdce,
ptr->wc.hIcon, ptr->wc.hCursor, ptr->wc.hbrBackground,
ptr->wc.cbClsExtra, ptr->wc.cbWndExtra, ptr->cWindows );
if (ptr->wc.cbClsExtra)
{
fprintf( stderr, "extra bytes:" );
for (i = 0; i < ptr->wc.cbClsExtra; i++)
fprintf( stderr, " %02x", *((BYTE *)ptr->wExtra+i) );
fprintf( stderr, "\n" );
}
fprintf( stderr, "\n" );
}
/***********************************************************************
* CLASS_WalkClasses
*
* Walk the class list and print each class on stderr.
*/
void CLASS_WalkClasses(void)
{
HCLASS hClass = firstClass;
CLASS *ptr;
char className[80];
fprintf( stderr, "Class Name Style WndProc\n" );
while (hClass)
{
if (!(ptr = CLASS_FindClassPtr( hClass )))
{
fprintf( stderr, "*** Bad class %04x in list\n", hClass );
return;
}
GlobalGetAtomName( ptr->atomName, className, sizeof(className) );
fprintf( stderr, "%04x %-20.20s %04x %08lx\n",
hClass, className, ptr->wc.style, (DWORD)ptr->wc.lpfnWndProc);
hClass = ptr->hNext;
}
fprintf( stderr, "\n" );
}
/*********************************************************************** /***********************************************************************
* CLASS_FindClassByName * CLASS_FindClassByName
* *

View file

@ -152,7 +152,7 @@ static HRGN DCE_ClipWindows( HWND hwndStart, HWND hwndEnd,
if (!hwndStart) return hrgn; if (!hwndStart) return hrgn;
if (!(hrgnNew = CreateRectRgn( 0, 0, 0, 0 ))) if (!(hrgnNew = CreateRectRgn( 0, 0, 0, 0 )))
{ {
if (hrgn) DeleteObject( hrgn ); DeleteObject( hrgn );
return 0; return 0;
} }
for (; hwndStart != hwndEnd; hwndStart = wndPtr->hwndNext) for (; hwndStart != hwndEnd; hwndStart = wndPtr->hwndNext)
@ -165,10 +165,10 @@ static HRGN DCE_ClipWindows( HWND hwndStart, HWND hwndEnd,
wndPtr->rectWindow.bottom + yoffset ); wndPtr->rectWindow.bottom + yoffset );
if (!CombineRgn( hrgn, hrgn, hrgnNew, RGN_DIFF )) break; if (!CombineRgn( hrgn, hrgn, hrgnNew, RGN_DIFF )) break;
} }
DeleteObject( hrgnNew );
if (hwndStart != hwndEnd) /* something went wrong */ if (hwndStart != hwndEnd) /* something went wrong */
{ {
DeleteObject( hrgnNew ); DeleteObject( hrgn );
if (hrgn) DeleteObject( hrgn );
return 0; return 0;
} }
return hrgn; return hrgn;

View file

@ -54,7 +54,7 @@ LRESULT DefWindowProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
int len; int len;
WND * wndPtr = WIN_FindWndPtr( hwnd ); WND * wndPtr = WIN_FindWndPtr( hwnd );
EnterSpyMessage(SPY_DEFWNDPROC,hwnd,msg,wParam,lParam); SPY_EnterMessage( SPY_DEFWNDPROC, hwnd, msg, wParam, lParam );
switch(msg) switch(msg)
{ {

View file

@ -6,8 +6,11 @@
*/ */
#include <ctype.h> #include <ctype.h>
#include <signal.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#include <X11/keysym.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/Xresource.h> #include <X11/Xresource.h>
#include <X11/Xutil.h> #include <X11/Xutil.h>
@ -16,9 +19,9 @@
#include "windows.h" #include "windows.h"
#include "win.h" #include "win.h"
#include "class.h" #include "class.h"
#include "message.h"
#include "clipboard.h" #include "clipboard.h"
#include "options.h" #include "options.h"
#include "queue.h"
#include "winpos.h" #include "winpos.h"
#include "registers.h" #include "registers.h"
#include "stackframe.h" #include "stackframe.h"
@ -305,6 +308,11 @@ static void EVENT_key( XKeyEvent *event )
dprintf_key(stddeb,"WM_KEY??? : keysym=%lX, count=%u / %X / '%s'\n", dprintf_key(stddeb,"WM_KEY??? : keysym=%lX, count=%u / %X / '%s'\n",
keysym, count, Str[0], Str); keysym, count, Str[0], Str);
/* Ctrl-Alt-Return enters the debugger */
if ((keysym == XK_Return) && (event->type == KeyPress) &&
(event->state & ControlMask) && (event->state & Mod1Mask))
kill( getpid(), SIGHUP );
xkey = LOWORD(keysym); xkey = LOWORD(keysym);
key_type = HIBYTE(xkey); key_type = HIBYTE(xkey);
key = LOBYTE(xkey); key = LOBYTE(xkey);
@ -348,7 +356,7 @@ static void EVENT_key( XKeyEvent *event )
KeyStateTable[vkey] ^= 0x80; KeyStateTable[vkey] ^= 0x80;
KeyStateTable[vkey] |= 0x01; KeyStateTable[vkey] |= 0x01;
keylp.lp1.count = 1; keylp.lp1.count = 1;
keylp.lp1.code = LOBYTE(event->keycode); keylp.lp1.code = LOBYTE(event->keycode) - 8;
keylp.lp1.extended = (extended ? 1 : 0); keylp.lp1.extended = (extended ? 1 : 0);
keylp.lp1.context = (event->state & Mod1Mask ? 1 : 0); keylp.lp1.context = (event->state & Mod1Mask ? 1 : 0);
keylp.lp1.previous = (KeyDown ? 0 : 1); keylp.lp1.previous = (KeyDown ? 0 : 1);
@ -379,7 +387,7 @@ static void EVENT_key( XKeyEvent *event )
if (vkey == VK_MENU) ALTKeyState = FALSE; if (vkey == VK_MENU) ALTKeyState = FALSE;
KeyStateTable[vkey] &= 0xf0; KeyStateTable[vkey] &= 0xf0;
keylp.lp1.count = 1; keylp.lp1.count = 1;
keylp.lp1.code = LOBYTE(event->keycode); keylp.lp1.code = LOBYTE(event->keycode) - 8;
keylp.lp1.extended = (extended ? 1 : 0); keylp.lp1.extended = (extended ? 1 : 0);
keylp.lp1.context = (event->state & Mod1Mask ? 1 : 0); keylp.lp1.context = (event->state & Mod1Mask ? 1 : 0);
keylp.lp1.previous = 1; keylp.lp1.previous = 1;

View file

@ -15,7 +15,7 @@
*/ */
#include "hook.h" #include "hook.h"
#include "message.h" #include "queue.h"
#include "user.h" #include "user.h"
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"

View file

@ -19,195 +19,19 @@
#include "winpos.h" #include "winpos.h"
#include "atom.h" #include "atom.h"
#include "dde.h" #include "dde.h"
#include "queue.h"
#include "stddebug.h" #include "stddebug.h"
/* #define DEBUG_MSG */ /* #define DEBUG_MSG */
#include "debug.h" #include "debug.h"
#define HWND_BROADCAST ((HWND)0xffff) #define HWND_BROADCAST ((HWND)0xffff)
#define MAX_QUEUE_SIZE 120 /* Max. size of a message queue */
extern BOOL TIMER_CheckTimer( LONG *next, MSG *msg, extern BOOL TIMER_CheckTimer( LONG *next, MSG *msg,
HWND hwnd, BOOL remove ); /* timer.c */ HWND hwnd, BOOL remove ); /* timer.c */
DWORD MSG_WineStartTicks; /* Ticks at Wine startup */ DWORD MSG_WineStartTicks; /* Ticks at Wine startup */
/* ------- Internal Queues ------ */ static WORD doubleClickSpeed = 452;
static HANDLE hmemSysMsgQueue = 0;
static MESSAGEQUEUE *sysMsgQueue = NULL;
static HANDLE hFirstQueue = 0;
/* ------- Miscellaneous ------ */
static int doubleClickSpeed = 452;
/***********************************************************************
* MSG_CreateMsgQueue
*
* Creates a message queue. Doesn't link it into queue list!
*/
static HANDLE MSG_CreateMsgQueue( int size )
{
HANDLE hQueue;
MESSAGEQUEUE * msgQueue;
int queueSize;
queueSize = sizeof(MESSAGEQUEUE) + size * sizeof(QMSG);
if (!(hQueue = GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT, queueSize )))
return 0;
msgQueue = (MESSAGEQUEUE *) GlobalLock( hQueue );
msgQueue->msgSize = sizeof(QMSG);
msgQueue->queueSize = size;
msgQueue->wWinVersion = 0; /* FIXME? */
GlobalUnlock( hQueue );
return hQueue;
}
/***********************************************************************
* MSG_DeleteMsgQueue
*
* Unlinks and deletes a message queue.
*/
BOOL MSG_DeleteMsgQueue( HANDLE hQueue )
{
MESSAGEQUEUE * msgQueue = (MESSAGEQUEUE*)GlobalLock(hQueue);
HANDLE *pPrev;
if (!hQueue || !msgQueue)
{
dprintf_msg(stddeb,"DeleteMsgQueue: invalid argument.\n");
return 0;
}
pPrev = &hFirstQueue;
while (*pPrev && (*pPrev != hQueue))
{
MESSAGEQUEUE *msgQ = (MESSAGEQUEUE*)GlobalLock(*pPrev);
pPrev = &msgQ->next;
}
if (*pPrev) *pPrev = msgQueue->next;
GlobalFree( hQueue );
return 1;
}
/***********************************************************************
* MSG_CreateSysMsgQueue
*
* Create the system message queue, and set the double-click speed.
* Must be called only once.
*/
BOOL MSG_CreateSysMsgQueue( int size )
{
if (size > MAX_QUEUE_SIZE) size = MAX_QUEUE_SIZE;
else if (size <= 0) size = 1;
if (!(hmemSysMsgQueue = MSG_CreateMsgQueue( size ))) return FALSE;
sysMsgQueue = (MESSAGEQUEUE *) GlobalLock( hmemSysMsgQueue );
doubleClickSpeed = GetProfileInt( "windows", "DoubleClickSpeed", 452 );
return TRUE;
}
/***********************************************************************
* MSG_AddMsg
*
* Add a message to the queue. Return FALSE if queue is full.
*/
static int MSG_AddMsg( HANDLE hQueue, MSG * msg, DWORD extraInfo )
{
int pos;
MESSAGEQUEUE *msgQueue;
if (!(msgQueue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return FALSE;
pos = msgQueue->nextFreeMessage;
/* Check if queue is full */
if ((pos == msgQueue->nextMessage) && (msgQueue->msgCount > 0)) {
fprintf(stderr,"MSG_AddMsg // queue is full !\n");
return FALSE;
}
/* Store message */
msgQueue->messages[pos].msg = *msg;
msgQueue->messages[pos].extraInfo = extraInfo;
if (pos < msgQueue->queueSize-1) pos++;
else pos = 0;
msgQueue->nextFreeMessage = pos;
msgQueue->msgCount++;
msgQueue->status |= QS_POSTMESSAGE;
msgQueue->tempStatus |= QS_POSTMESSAGE;
return TRUE;
}
/***********************************************************************
* MSG_FindMsg
*
* Find a message matching the given parameters. Return -1 if none available.
*/
static int MSG_FindMsg(MESSAGEQUEUE * msgQueue, HWND hwnd, int first, int last)
{
int i, pos = msgQueue->nextMessage;
dprintf_msg(stddeb,"MSG_FindMsg: hwnd=0x"NPFMT"\n\n", hwnd );
if (!msgQueue->msgCount) return -1;
if (!hwnd && !first && !last) return pos;
for (i = 0; i < msgQueue->msgCount; i++)
{
MSG * msg = &msgQueue->messages[pos].msg;
if (!hwnd || (msg->hwnd == hwnd))
{
if (!first && !last) return pos;
if ((msg->message >= first) && (msg->message <= last)) return pos;
}
if (pos < msgQueue->queueSize-1) pos++;
else pos = 0;
}
return -1;
}
/***********************************************************************
* MSG_RemoveMsg
*
* Remove a message from the queue (pos must be a valid position).
*/
static void MSG_RemoveMsg( MESSAGEQUEUE * msgQueue, int pos )
{
if (pos >= msgQueue->nextMessage)
{
for ( ; pos > msgQueue->nextMessage; pos--)
msgQueue->messages[pos] = msgQueue->messages[pos-1];
msgQueue->nextMessage++;
if (msgQueue->nextMessage >= msgQueue->queueSize)
msgQueue->nextMessage = 0;
}
else
{
for ( ; pos < msgQueue->nextFreeMessage; pos++)
msgQueue->messages[pos] = msgQueue->messages[pos+1];
if (msgQueue->nextFreeMessage) msgQueue->nextFreeMessage--;
else msgQueue->nextFreeMessage = msgQueue->queueSize-1;
}
msgQueue->msgCount--;
if (!msgQueue->msgCount) msgQueue->status &= ~QS_POSTMESSAGE;
msgQueue->tempStatus = 0;
}
/***********************************************************************
* MSG_GetQueueTask
*/
HTASK MSG_GetQueueTask( HANDLE hQueue )
{
MESSAGEQUEUE *msgQ = GlobalLock( hQueue );
return (msgQ) ? msgQ->hTask : 0 ;
}
/*********************************************************************** /***********************************************************************
* MSG_TranslateMouseMsg * MSG_TranslateMouseMsg
@ -372,6 +196,7 @@ static BOOL MSG_TranslateKeyboardMsg( MSG *msg, BOOL remove )
static BOOL MSG_PeekHardwareMsg( MSG *msg, HWND hwnd, WORD first, WORD last, static BOOL MSG_PeekHardwareMsg( MSG *msg, HWND hwnd, WORD first, WORD last,
BOOL remove ) BOOL remove )
{ {
MESSAGEQUEUE *sysMsgQueue = QUEUE_GetSysQueue();
int i, pos = sysMsgQueue->nextMessage; int i, pos = sysMsgQueue->nextMessage;
for (i = 0; i < sysMsgQueue->msgCount; i++, pos++) for (i = 0; i < sysMsgQueue->msgCount; i++, pos++)
@ -410,7 +235,7 @@ static BOOL MSG_PeekHardwareMsg( MSG *msg, HWND hwnd, WORD first, WORD last,
MSG tmpMsg = *msg; /* FIXME */ MSG tmpMsg = *msg; /* FIXME */
HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION,
0, (LPARAM)MAKE_SEGPTR(&tmpMsg) ); 0, (LPARAM)MAKE_SEGPTR(&tmpMsg) );
MSG_RemoveMsg( sysMsgQueue, pos ); QUEUE_RemoveMsg( sysMsgQueue, pos );
} }
return TRUE; return TRUE;
} }
@ -419,135 +244,23 @@ static BOOL MSG_PeekHardwareMsg( MSG *msg, HWND hwnd, WORD first, WORD last,
/********************************************************************** /**********************************************************************
* SetDoubleClickTime (USER.20) * SetDoubleClickTime (USER.20)
*/ */
void SetDoubleClickTime( WORD interval ) void SetDoubleClickTime( WORD interval )
{ {
if (interval == 0) doubleClickSpeed = interval ? interval : 500;
doubleClickSpeed = 500;
else
doubleClickSpeed = interval;
} }
/********************************************************************** /**********************************************************************
* GetDoubleClickTime (USER.21) * GetDoubleClickTime (USER.21)
*/ */
WORD GetDoubleClickTime() WORD GetDoubleClickTime()
{ {
return (WORD)doubleClickSpeed; return doubleClickSpeed;
} }
/***********************************************************************
* MSG_IncPaintCount
*/
void MSG_IncPaintCount( HANDLE hQueue )
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return;
queue->wPaintCount++;
queue->status |= QS_PAINT;
queue->tempStatus |= QS_PAINT;
}
/***********************************************************************
* MSG_DecPaintCount
*/
void MSG_DecPaintCount( HANDLE hQueue )
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return;
queue->wPaintCount--;
if (!queue->wPaintCount) queue->status &= ~QS_PAINT;
}
/***********************************************************************
* MSG_IncTimerCount
*/
void MSG_IncTimerCount( HANDLE hQueue )
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return;
queue->wTimerCount++;
queue->status |= QS_TIMER;
queue->tempStatus |= QS_TIMER;
}
/***********************************************************************
* MSG_DecTimerCount
*/
void MSG_DecTimerCount( HANDLE hQueue )
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return;
queue->wTimerCount--;
if (!queue->wTimerCount) queue->status &= ~QS_TIMER;
}
/***********************************************************************
* hardware_event
*
* Add an event to the system message queue.
* Note: the position is relative to the desktop window.
*/
void hardware_event( WORD message, WORD wParam, LONG lParam,
int xPos, int yPos, DWORD time, DWORD extraInfo )
{
MSG *msg;
int pos;
if (!sysMsgQueue) return;
pos = sysMsgQueue->nextFreeMessage;
/* Merge with previous event if possible */
if ((message == WM_MOUSEMOVE) && sysMsgQueue->msgCount)
{
if (pos > 0) pos--;
else pos = sysMsgQueue->queueSize - 1;
msg = &sysMsgQueue->messages[pos].msg;
if ((msg->message == message) && (msg->wParam == wParam))
sysMsgQueue->msgCount--; /* Merge events */
else
pos = sysMsgQueue->nextFreeMessage; /* Don't merge */
}
/* Check if queue is full */
if ((pos == sysMsgQueue->nextMessage) && sysMsgQueue->msgCount)
{
/* Queue is full, beep (but not on every mouse motion...) */
if (message != WM_MOUSEMOVE) MessageBeep(0);
return;
}
/* Store message */
msg = &sysMsgQueue->messages[pos].msg;
msg->hwnd = 0;
msg->message = message;
msg->wParam = wParam;
msg->lParam = lParam;
msg->time = time;
msg->pt.x = xPos & 0xffff;
msg->pt.y = yPos & 0xffff;
sysMsgQueue->messages[pos].extraInfo = extraInfo;
if (pos < sysMsgQueue->queueSize - 1) pos++;
else pos = 0;
sysMsgQueue->nextFreeMessage = pos;
sysMsgQueue->msgCount++;
}
/*********************************************************************** /***********************************************************************
* MSG_GetHardwareMessage * MSG_GetHardwareMessage
* *
@ -560,13 +273,14 @@ BOOL MSG_GetHardwareMessage( LPMSG msg )
{ {
int pos; int pos;
XEvent event; XEvent event;
MESSAGEQUEUE *sysMsgQueue = QUEUE_GetSysQueue();
while(1) while(1)
{ {
if ((pos = MSG_FindMsg( sysMsgQueue, 0, 0, 0 )) != -1) if ((pos = QUEUE_FindMsg( sysMsgQueue, 0, 0, 0 )) != -1)
{ {
*msg = sysMsgQueue->messages[pos].msg; *msg = sysMsgQueue->messages[pos].msg;
MSG_RemoveMsg( sysMsgQueue, pos ); QUEUE_RemoveMsg( sysMsgQueue, pos );
break; break;
} }
XNextEvent( display, &event ); XNextEvent( display, &event );
@ -576,91 +290,6 @@ BOOL MSG_GetHardwareMessage( LPMSG msg )
} }
/***********************************************************************
* SetMessageQueue (USER.266)
*/
BOOL SetMessageQueue( int size )
{
HANDLE hQueue, hNewQueue;
MESSAGEQUEUE *queuePtr;
if ((size > MAX_QUEUE_SIZE) || (size <= 0)) return TRUE;
if( !(hNewQueue = MSG_CreateMsgQueue( size )))
{
dprintf_msg(stddeb,"SetMessageQueue: failed!\n");
return FALSE;
}
/* Free the old message queue */
if ((hQueue = GetTaskQueue(0)) != 0) MSG_DeleteMsgQueue( hQueue );
/* Link new queue into list */
queuePtr = (MESSAGEQUEUE *)GlobalLock( hNewQueue );
queuePtr->hTask = GetCurrentTask();
queuePtr->next = hFirstQueue;
hFirstQueue = hNewQueue;
SetTaskQueue( 0, hNewQueue );
return TRUE;
}
/***********************************************************************
* GetWindowTask (USER.224)
*/
HTASK GetWindowTask( HWND hwnd )
{
WND *wndPtr = WIN_FindWndPtr( hwnd );
MESSAGEQUEUE *queuePtr;
if (!wndPtr) return 0;
queuePtr = (MESSAGEQUEUE *)GlobalLock( wndPtr->hmemTaskQ );
if (!queuePtr) return 0;
return queuePtr->hTask;
}
/***********************************************************************
* PostQuitMessage (USER.6)
*/
void PostQuitMessage( int exitCode )
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return;
queue->wPostQMsg = TRUE;
queue->wExitCode = exitCode;
}
/***********************************************************************
* GetQueueStatus (USER.334)
*/
DWORD GetQueueStatus( UINT flags )
{
MESSAGEQUEUE *queue;
DWORD ret;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
ret = MAKELONG( queue->tempStatus, queue->status );
queue->tempStatus = 0;
return ret & MAKELONG( flags, flags );
}
/***********************************************************************
* GetInputState (USER.335)
*/
BOOL GetInputState()
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return FALSE;
return queue->status & (QS_KEY | QS_MOUSEBUTTON);
}
/*********************************************************************** /***********************************************************************
* MSG_Synchronize * MSG_Synchronize
* *
@ -796,7 +425,7 @@ static BOOL MSG_PeekMessage( LPMSG msg, HWND hwnd, WORD first, WORD last,
} }
/* Now find a normal message */ /* Now find a normal message */
pos = MSG_FindMsg( msgQueue, hwnd, first, last ); pos = QUEUE_FindMsg( msgQueue, hwnd, first, last );
if (pos != -1) if (pos != -1)
{ {
QMSG *qmsg = &msgQueue->messages[pos]; QMSG *qmsg = &msgQueue->messages[pos];
@ -805,7 +434,7 @@ static BOOL MSG_PeekMessage( LPMSG msg, HWND hwnd, WORD first, WORD last,
msgQueue->GetMessagePosVal = *(DWORD *)&msg->pt; msgQueue->GetMessagePosVal = *(DWORD *)&msg->pt;
msgQueue->GetMessageExtraInfoVal = qmsg->extraInfo; msgQueue->GetMessageExtraInfoVal = qmsg->extraInfo;
if (flags & PM_REMOVE) MSG_RemoveMsg( msgQueue, pos ); if (flags & PM_REMOVE) QUEUE_RemoveMsg( msgQueue, pos );
break; break;
} }
@ -966,7 +595,7 @@ BOOL PostMessage( HWND hwnd, WORD message, WORD wParam, LONG lParam )
wndPtr = WIN_FindWndPtr( hwnd ); wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr || !wndPtr->hmemTaskQ) return FALSE; if (!wndPtr || !wndPtr->hmemTaskQ) return FALSE;
return MSG_AddMsg( wndPtr->hmemTaskQ, &msg, 0 ); return QUEUE_AddMsg( wndPtr->hmemTaskQ, &msg, 0 );
} }
/*********************************************************************** /***********************************************************************
@ -985,7 +614,7 @@ BOOL PostAppMessage( HTASK hTask, WORD message, WORD wParam, LONG lParam )
msg.pt.x = 0; msg.pt.x = 0;
msg.pt.y = 0; msg.pt.y = 0;
return MSG_AddMsg( GetTaskQueue(hTask), &msg, 0 ); return QUEUE_AddMsg( GetTaskQueue(hTask), &msg, 0 );
} }
@ -1028,17 +657,17 @@ LRESULT SendMessage( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
return TRUE; return TRUE;
} }
EnterSpyMessage(SPY_SENDMESSAGE, hwnd, msg, wParam, lParam); SPY_EnterMessage( SPY_SENDMESSAGE, hwnd, msg, wParam, lParam );
HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 1, (LPARAM)MAKE_SEGPTR(&msgstruct) ); HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 1, (LPARAM)MAKE_SEGPTR(&msgstruct) );
if (!(wndPtr = WIN_FindWndPtr( hwnd ))) if (!(wndPtr = WIN_FindWndPtr( hwnd )))
{ {
ExitSpyMessage(SPY_RESULT_INVALIDHWND,hwnd,msg,0); SPY_ExitMessage( SPY_RESULT_INVALIDHWND, hwnd, msg, 0 );
return 0; return 0;
} }
ret = CallWindowProc( wndPtr->lpfnWndProc, msgstruct.hWnd, msgstruct.wMsg, ret = CallWindowProc( wndPtr->lpfnWndProc, msgstruct.hWnd, msgstruct.wMsg,
msgstruct.wParam, msgstruct.lParam ); msgstruct.wParam, msgstruct.lParam );
ExitSpyMessage(SPY_RESULT_OK,hwnd,msg,ret); SPY_ExitMessage( SPY_RESULT_OK, hwnd, msg, ret );
return ret; return ret;
} }
@ -1059,7 +688,7 @@ void WaitMessage( void )
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return; if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return;
if ((queue->wPostQMsg) || if ((queue->wPostQMsg) ||
(queue->status & (QS_SENDMESSAGE | QS_PAINT)) || (queue->status & (QS_SENDMESSAGE | QS_PAINT)) ||
(queue->msgCount) || (sysMsgQueue->msgCount) ) (queue->msgCount) || (QUEUE_GetSysQueue()->msgCount) )
return; return;
if ((queue->status & QS_TIMER) && if ((queue->status & QS_TIMER) &&
TIMER_CheckTimer( &nextExp, &msg, 0, FALSE)) TIMER_CheckTimer( &nextExp, &msg, 0, FALSE))
@ -1095,8 +724,8 @@ LONG DispatchMessage( const MSG* msg )
LONG retval; LONG retval;
int painting; int painting;
EnterSpyMessage( SPY_DISPATCHMESSAGE, msg->hwnd, msg->message, SPY_EnterMessage( SPY_DISPATCHMESSAGE, msg->hwnd, msg->message,
msg->wParam, msg->lParam ); msg->wParam, msg->lParam );
/* Process timer messages */ /* Process timer messages */
if ((msg->message == WM_TIMER) || (msg->message == WM_SYSTIMER)) if ((msg->message == WM_TIMER) || (msg->message == WM_SYSTIMER))
@ -1134,42 +763,6 @@ LONG DispatchMessage( const MSG* msg )
} }
/***********************************************************************
* GetMessagePos (USER.119)
*/
DWORD GetMessagePos(void)
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
return queue->GetMessagePosVal;
}
/***********************************************************************
* GetMessageTime (USER.120)
*/
LONG GetMessageTime(void)
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
return queue->GetMessageTimeVal;
}
/***********************************************************************
* GetMessageExtraInfo (USER.288)
*/
LONG GetMessageExtraInfo(void)
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
return queue->GetMessageExtraInfoVal;
}
/*********************************************************************** /***********************************************************************
* RegisterWindowMessage (USER.118) * RegisterWindowMessage (USER.118)
*/ */
@ -1190,14 +783,18 @@ DWORD GetTickCount(void)
return ((t.tv_sec * 1000) + (t.tv_usec / 1000)) - MSG_WineStartTicks; return ((t.tv_sec * 1000) + (t.tv_usec / 1000)) - MSG_WineStartTicks;
} }
/*********************************************************************** /***********************************************************************
* GetCurrentTime (effectively identical to GetTickCount) * GetCurrentTime (USER.15)
*
* (effectively identical to GetTickCount)
*/ */
DWORD GetCurrentTime(void) DWORD GetCurrentTime(void)
{ {
return GetTickCount(); return GetTickCount();
} }
/*********************************************************************** /***********************************************************************
* InSendMessage (USER.192 * InSendMessage (USER.192
* *

View file

@ -8,7 +8,7 @@
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include "win.h" #include "win.h"
#include "message.h" #include "queue.h"
#include "gdi.h" #include "gdi.h"
#include "stddebug.h" #include "stddebug.h"
/* #define DEBUG_WIN */ /* #define DEBUG_WIN */
@ -32,7 +32,7 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps )
if (!(hrgnUpdate = CreateRectRgn( 0, 0, 0, 0 ))) return 0; if (!(hrgnUpdate = CreateRectRgn( 0, 0, 0, 0 ))) return 0;
if (wndPtr->hrgnUpdate || (wndPtr->flags & WIN_INTERNAL_PAINT)) if (wndPtr->hrgnUpdate || (wndPtr->flags & WIN_INTERNAL_PAINT))
MSG_DecPaintCount( wndPtr->hmemTaskQ ); QUEUE_DecPaintCount( wndPtr->hmemTaskQ );
wndPtr->hrgnUpdate = 0; wndPtr->hrgnUpdate = 0;
wndPtr->flags &= ~(WIN_NEEDS_BEGINPAINT | WIN_INTERNAL_PAINT); wndPtr->flags &= ~(WIN_NEEDS_BEGINPAINT | WIN_INTERNAL_PAINT);
@ -168,7 +168,7 @@ BOOL RedrawWindow( HWND hwnd, LPRECT rectUpdate, HRGN hrgnUpdate, UINT flags )
else /* No update region yet */ else /* No update region yet */
{ {
if (!(wndPtr->flags & WIN_INTERNAL_PAINT)) if (!(wndPtr->flags & WIN_INTERNAL_PAINT))
MSG_IncPaintCount( wndPtr->hmemTaskQ ); QUEUE_IncPaintCount( wndPtr->hmemTaskQ );
if (hrgnUpdate) if (hrgnUpdate)
{ {
wndPtr->hrgnUpdate = CreateRectRgn( 0, 0, 0, 0 ); wndPtr->hrgnUpdate = CreateRectRgn( 0, 0, 0, 0 );
@ -206,7 +206,7 @@ BOOL RedrawWindow( HWND hwnd, LPRECT rectUpdate, HRGN hrgnUpdate, UINT flags )
} }
if (!wndPtr->hrgnUpdate) /* No more update region */ if (!wndPtr->hrgnUpdate) /* No more update region */
if (!(wndPtr->flags & WIN_INTERNAL_PAINT)) if (!(wndPtr->flags & WIN_INTERNAL_PAINT))
MSG_DecPaintCount( wndPtr->hmemTaskQ ); QUEUE_DecPaintCount( wndPtr->hmemTaskQ );
} }
if (flags & RDW_NOFRAME) wndPtr->flags &= ~WIN_NEEDS_NCPAINT; if (flags & RDW_NOFRAME) wndPtr->flags &= ~WIN_NEEDS_NCPAINT;
if (flags & RDW_NOERASE) wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND; if (flags & RDW_NOERASE) wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
@ -217,13 +217,13 @@ BOOL RedrawWindow( HWND hwnd, LPRECT rectUpdate, HRGN hrgnUpdate, UINT flags )
if (flags & RDW_INTERNALPAINT) if (flags & RDW_INTERNALPAINT)
{ {
if (!wndPtr->hrgnUpdate && !(wndPtr->flags & WIN_INTERNAL_PAINT)) if (!wndPtr->hrgnUpdate && !(wndPtr->flags & WIN_INTERNAL_PAINT))
MSG_IncPaintCount( wndPtr->hmemTaskQ ); QUEUE_IncPaintCount( wndPtr->hmemTaskQ );
wndPtr->flags |= WIN_INTERNAL_PAINT; wndPtr->flags |= WIN_INTERNAL_PAINT;
} }
else if (flags & RDW_NOINTERNALPAINT) else if (flags & RDW_NOINTERNALPAINT)
{ {
if (!wndPtr->hrgnUpdate && (wndPtr->flags & WIN_INTERNAL_PAINT)) if (!wndPtr->hrgnUpdate && (wndPtr->flags & WIN_INTERNAL_PAINT))
MSG_DecPaintCount( wndPtr->hmemTaskQ ); QUEUE_DecPaintCount( wndPtr->hmemTaskQ );
wndPtr->flags &= ~WIN_INTERNAL_PAINT; wndPtr->flags &= ~WIN_INTERNAL_PAINT;
} }

484
windows/queue.c Normal file
View file

@ -0,0 +1,484 @@
/*
* Message queues related functions
*
* Copyright 1993, 1994 Alexandre Julliard
*/
#include <stdlib.h>
#include "module.h"
#include "queue.h"
#include "win.h"
#include "stddebug.h"
#include "debug.h"
#define MAX_QUEUE_SIZE 120 /* Max. size of a message queue */
static HQUEUE hFirstQueue = 0;
static HQUEUE hmemSysMsgQueue = 0;
static MESSAGEQUEUE *sysMsgQueue = NULL;
/***********************************************************************
* QUEUE_DumpQueue
*/
void QUEUE_DumpQueue( HQUEUE hQueue )
{
MESSAGEQUEUE *pq;
if (!(pq = (MESSAGEQUEUE*) GlobalLock( hQueue )) ||
GlobalSize(hQueue) < sizeof(MESSAGEQUEUE) + pq->queueSize*sizeof(QMSG))
{
fprintf( stderr, NPFMT " is not a queue handle\n", hQueue );
return;
}
fprintf( stderr,
"next: %12.4x Intertask SendMessage:\n"
"hTask: %11.4x ----------------------\n"
"msgSize: %9.4x hWnd: %10.4x\n"
"msgCount: %8.4x msg: %11.4x\n"
"msgNext: %9.4x wParam: %8.4x\n"
"msgFree: %9.4x lParam: %8.8x\n"
"qSize: %11.4x lRet: %10.8x\n"
"wWinVer: %9.4x ISMH: %10.4x\n"
"paints: %10.4x hSendTask: %5.4x\n"
"timers: %10.4x hPrevSend: %5.4x\n"
"wakeBits: %8.4x\n"
"wakeMask: %8.4x\n"
"hCurHook: %8.4x\n",
pq->next, pq->hTask, pq->msgSize, pq->hWnd,
pq->msgCount, pq->msg, pq->nextMessage, pq->wParam,
pq->nextFreeMessage, (unsigned)pq->lParam, pq->queueSize,
(unsigned)pq->SendMessageReturn, pq->wWinVersion, pq->InSendMessageHandle,
pq->wPaintCount, pq->hSendingTask, pq->wTimerCount,
pq->hPrevSendingTask, pq->status, pq->wakeMask, pq->hCurHook);
}
/***********************************************************************
* QUEUE_WalkQueues
*/
void QUEUE_WalkQueues(void)
{
HQUEUE hQueue = hFirstQueue;
fprintf( stderr, "Queue Size Msgs Task\n" );
while (hQueue)
{
MESSAGEQUEUE *queue = (MESSAGEQUEUE *)GlobalLock( hQueue );
if (!queue)
{
fprintf( stderr, "*** Bad queue handle "NPFMT"\n", hQueue );
return;
}
fprintf( stderr, "%04x %5d %4d %04x %s\n",
hQueue, queue->msgSize, queue->msgCount, queue->hTask,
MODULE_GetModuleName( GetExePtr(queue->hTask) ) );
hQueue = queue->next;
}
fprintf( stderr, "\n" );
}
/***********************************************************************
* QUEUE_CreateMsgQueue
*
* Creates a message queue. Doesn't link it into queue list!
*/
static HQUEUE QUEUE_CreateMsgQueue( int size )
{
HQUEUE hQueue;
MESSAGEQUEUE * msgQueue;
int queueSize;
queueSize = sizeof(MESSAGEQUEUE) + size * sizeof(QMSG);
if (!(hQueue = GlobalAlloc( GMEM_FIXED | GMEM_ZEROINIT, queueSize )))
return 0;
msgQueue = (MESSAGEQUEUE *) GlobalLock( hQueue );
msgQueue->msgSize = sizeof(QMSG);
msgQueue->queueSize = size;
msgQueue->wWinVersion = 0; /* FIXME? */
GlobalUnlock( hQueue );
return hQueue;
}
/***********************************************************************
* QUEUE_DeleteMsgQueue
*
* Unlinks and deletes a message queue.
*/
BOOL QUEUE_DeleteMsgQueue( HQUEUE hQueue )
{
MESSAGEQUEUE * msgQueue = (MESSAGEQUEUE*)GlobalLock(hQueue);
HQUEUE *pPrev;
if (!hQueue || !msgQueue)
{
dprintf_msg(stddeb,"DeleteMsgQueue: invalid argument.\n");
return 0;
}
pPrev = &hFirstQueue;
while (*pPrev && (*pPrev != hQueue))
{
MESSAGEQUEUE *msgQ = (MESSAGEQUEUE*)GlobalLock(*pPrev);
pPrev = &msgQ->next;
}
if (*pPrev) *pPrev = msgQueue->next;
GlobalFree( hQueue );
return 1;
}
/***********************************************************************
* QUEUE_CreateSysMsgQueue
*
* Create the system message queue, and set the double-click speed.
* Must be called only once.
*/
BOOL QUEUE_CreateSysMsgQueue( int size )
{
if (size > MAX_QUEUE_SIZE) size = MAX_QUEUE_SIZE;
else if (size <= 0) size = 1;
if (!(hmemSysMsgQueue = QUEUE_CreateMsgQueue( size ))) return FALSE;
sysMsgQueue = (MESSAGEQUEUE *) GlobalLock( hmemSysMsgQueue );
return TRUE;
}
/***********************************************************************
* QUEUE_GetSysQueue
*/
MESSAGEQUEUE *QUEUE_GetSysQueue(void)
{
return sysMsgQueue;
}
/***********************************************************************
* QUEUE_AddMsg
*
* Add a message to the queue. Return FALSE if queue is full.
*/
BOOL QUEUE_AddMsg( HQUEUE hQueue, MSG * msg, DWORD extraInfo )
{
int pos;
MESSAGEQUEUE *msgQueue;
if (!(msgQueue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return FALSE;
pos = msgQueue->nextFreeMessage;
/* Check if queue is full */
if ((pos == msgQueue->nextMessage) && (msgQueue->msgCount > 0))
{
fprintf(stderr,"MSG_AddMsg // queue is full !\n");
return FALSE;
}
/* Store message */
msgQueue->messages[pos].msg = *msg;
msgQueue->messages[pos].extraInfo = extraInfo;
if (pos < msgQueue->queueSize-1) pos++;
else pos = 0;
msgQueue->nextFreeMessage = pos;
msgQueue->msgCount++;
msgQueue->status |= QS_POSTMESSAGE;
msgQueue->tempStatus |= QS_POSTMESSAGE;
return TRUE;
}
/***********************************************************************
* QUEUE_FindMsg
*
* Find a message matching the given parameters. Return -1 if none available.
*/
int QUEUE_FindMsg( MESSAGEQUEUE * msgQueue, HWND hwnd, int first, int last )
{
int i, pos = msgQueue->nextMessage;
dprintf_msg(stddeb,"MSG_FindMsg: hwnd=0x"NPFMT"\n\n", hwnd );
if (!msgQueue->msgCount) return -1;
if (!hwnd && !first && !last) return pos;
for (i = 0; i < msgQueue->msgCount; i++)
{
MSG * msg = &msgQueue->messages[pos].msg;
if (!hwnd || (msg->hwnd == hwnd))
{
if (!first && !last) return pos;
if ((msg->message >= first) && (msg->message <= last)) return pos;
}
if (pos < msgQueue->queueSize-1) pos++;
else pos = 0;
}
return -1;
}
/***********************************************************************
* QUEUE_RemoveMsg
*
* Remove a message from the queue (pos must be a valid position).
*/
void QUEUE_RemoveMsg( MESSAGEQUEUE * msgQueue, int pos )
{
if (pos >= msgQueue->nextMessage)
{
for ( ; pos > msgQueue->nextMessage; pos--)
msgQueue->messages[pos] = msgQueue->messages[pos-1];
msgQueue->nextMessage++;
if (msgQueue->nextMessage >= msgQueue->queueSize)
msgQueue->nextMessage = 0;
}
else
{
for ( ; pos < msgQueue->nextFreeMessage; pos++)
msgQueue->messages[pos] = msgQueue->messages[pos+1];
if (msgQueue->nextFreeMessage) msgQueue->nextFreeMessage--;
else msgQueue->nextFreeMessage = msgQueue->queueSize-1;
}
msgQueue->msgCount--;
if (!msgQueue->msgCount) msgQueue->status &= ~QS_POSTMESSAGE;
msgQueue->tempStatus = 0;
}
/***********************************************************************
* hardware_event
*
* Add an event to the system message queue.
* Note: the position is relative to the desktop window.
*/
void hardware_event( WORD message, WORD wParam, LONG lParam,
int xPos, int yPos, DWORD time, DWORD extraInfo )
{
MSG *msg;
int pos;
if (!sysMsgQueue) return;
pos = sysMsgQueue->nextFreeMessage;
/* Merge with previous event if possible */
if ((message == WM_MOUSEMOVE) && sysMsgQueue->msgCount)
{
if (pos > 0) pos--;
else pos = sysMsgQueue->queueSize - 1;
msg = &sysMsgQueue->messages[pos].msg;
if ((msg->message == message) && (msg->wParam == wParam))
sysMsgQueue->msgCount--; /* Merge events */
else
pos = sysMsgQueue->nextFreeMessage; /* Don't merge */
}
/* Check if queue is full */
if ((pos == sysMsgQueue->nextMessage) && sysMsgQueue->msgCount)
{
/* Queue is full, beep (but not on every mouse motion...) */
if (message != WM_MOUSEMOVE) MessageBeep(0);
return;
}
/* Store message */
msg = &sysMsgQueue->messages[pos].msg;
msg->hwnd = 0;
msg->message = message;
msg->wParam = wParam;
msg->lParam = lParam;
msg->time = time;
msg->pt.x = xPos & 0xffff;
msg->pt.y = yPos & 0xffff;
sysMsgQueue->messages[pos].extraInfo = extraInfo;
if (pos < sysMsgQueue->queueSize - 1) pos++;
else pos = 0;
sysMsgQueue->nextFreeMessage = pos;
sysMsgQueue->msgCount++;
}
/***********************************************************************
* QUEUE_GetQueueTask
*/
HTASK QUEUE_GetQueueTask( HQUEUE hQueue )
{
MESSAGEQUEUE *queue = GlobalLock( hQueue );
return (queue) ? queue->hTask : 0 ;
}
/***********************************************************************
* QUEUE_IncPaintCount
*/
void QUEUE_IncPaintCount( HQUEUE hQueue )
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return;
queue->wPaintCount++;
queue->status |= QS_PAINT;
queue->tempStatus |= QS_PAINT;
}
/***********************************************************************
* QUEUE_DecPaintCount
*/
void QUEUE_DecPaintCount( HQUEUE hQueue )
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return;
queue->wPaintCount--;
if (!queue->wPaintCount) queue->status &= ~QS_PAINT;
}
/***********************************************************************
* QUEUE_IncTimerCount
*/
void QUEUE_IncTimerCount( HQUEUE hQueue )
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return;
queue->wTimerCount++;
queue->status |= QS_TIMER;
queue->tempStatus |= QS_TIMER;
}
/***********************************************************************
* QUEUE_DecTimerCount
*/
void QUEUE_DecTimerCount( HQUEUE hQueue )
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( hQueue ))) return;
queue->wTimerCount--;
if (!queue->wTimerCount) queue->status &= ~QS_TIMER;
}
/***********************************************************************
* PostQuitMessage (USER.6)
*/
void PostQuitMessage( INT exitCode )
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return;
queue->wPostQMsg = TRUE;
queue->wExitCode = (WORD)exitCode;
}
/***********************************************************************
* GetWindowTask (USER.224)
*/
HTASK GetWindowTask( HWND hwnd )
{
WND *wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr) return 0;
return QUEUE_GetQueueTask( wndPtr->hmemTaskQ );
}
/***********************************************************************
* SetMessageQueue (USER.266)
*/
BOOL SetMessageQueue( int size )
{
HQUEUE hQueue, hNewQueue;
MESSAGEQUEUE *queuePtr;
if ((size > MAX_QUEUE_SIZE) || (size <= 0)) return TRUE;
if( !(hNewQueue = QUEUE_CreateMsgQueue( size )))
{
dprintf_msg(stddeb,"SetMessageQueue: failed!\n");
return FALSE;
}
/* Free the old message queue */
if ((hQueue = GetTaskQueue(0)) != 0) QUEUE_DeleteMsgQueue( hQueue );
/* Link new queue into list */
queuePtr = (MESSAGEQUEUE *)GlobalLock( hNewQueue );
queuePtr->hTask = GetCurrentTask();
queuePtr->next = hFirstQueue;
hFirstQueue = hNewQueue;
SetTaskQueue( 0, hNewQueue );
return TRUE;
}
/***********************************************************************
* GetQueueStatus (USER.334)
*/
DWORD GetQueueStatus( UINT flags )
{
MESSAGEQUEUE *queue;
DWORD ret;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
ret = MAKELONG( queue->tempStatus, queue->status );
queue->tempStatus = 0;
return ret & MAKELONG( flags, flags );
}
/***********************************************************************
* GetInputState (USER.335)
*/
BOOL GetInputState()
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return FALSE;
return queue->status & (QS_KEY | QS_MOUSEBUTTON);
}
/***********************************************************************
* GetMessagePos (USER.119)
*/
DWORD GetMessagePos(void)
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
return queue->GetMessagePosVal;
}
/***********************************************************************
* GetMessageTime (USER.120)
*/
LONG GetMessageTime(void)
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
return queue->GetMessageTimeVal;
}
/***********************************************************************
* GetMessageExtraInfo (USER.288)
*/
LONG GetMessageExtraInfo(void)
{
MESSAGEQUEUE *queue;
if (!(queue = (MESSAGEQUEUE *)GlobalLock( GetTaskQueue(0) ))) return 0;
return queue->GetMessageExtraInfoVal;
}

View file

@ -5,7 +5,7 @@
*/ */
#include "windows.h" #include "windows.h"
#include "message.h" #include "queue.h"
#include "stddebug.h" #include "stddebug.h"
/* #define DEBUG_TIMER */ /* #define DEBUG_TIMER */
#include "debug.h" #include "debug.h"
@ -173,7 +173,7 @@ static WORD TIMER_SetTimer( HWND hwnd, WORD id, WORD timeout,
dprintf_timer(stddeb, "Timer added: %p, "NPFMT", %04x, %04x, %08lx\n", dprintf_timer(stddeb, "Timer added: %p, "NPFMT", %04x, %04x, %08lx\n",
pTimer, pTimer->hwnd, pTimer->msg, pTimer->id, (DWORD)pTimer->proc); pTimer, pTimer->hwnd, pTimer->msg, pTimer->id, (DWORD)pTimer->proc);
TIMER_InsertTimer( pTimer ); TIMER_InsertTimer( pTimer );
MSG_IncTimerCount( GetTaskQueue(0) ); QUEUE_IncTimerCount( GetTaskQueue(0) );
if (!id) if (!id)
return TRUE; return TRUE;
else else
@ -207,7 +207,7 @@ static BOOL TIMER_KillTimer( HWND hwnd, WORD id, BOOL sys )
pTimer->timeout = 0; pTimer->timeout = 0;
pTimer->proc = 0; pTimer->proc = 0;
TIMER_RemoveTimer( pTimer ); TIMER_RemoveTimer( pTimer );
MSG_DecTimerCount( GetTaskQueue(0) ); QUEUE_DecTimerCount( GetTaskQueue(0) );
return TRUE; return TRUE;
} }

View file

@ -15,8 +15,8 @@
#include "sysmetrics.h" #include "sysmetrics.h"
#include "cursoricon.h" #include "cursoricon.h"
#include "event.h" #include "event.h"
#include "message.h"
#include "nonclient.h" #include "nonclient.h"
#include "queue.h"
#include "winpos.h" #include "winpos.h"
#include "color.h" #include "color.h"
#include "shm_main_blk.h" #include "shm_main_blk.h"
@ -51,6 +51,97 @@ WND * WIN_FindWndPtr( HWND hwnd )
} }
/***********************************************************************
* WIN_DumpWindow
*
* Dump the content of a window structure to stderr.
*/
void WIN_DumpWindow( HWND hwnd )
{
CLASS *classPtr;
WND *ptr;
char className[80];
int i;
if (!(ptr = WIN_FindWndPtr( hwnd )))
{
fprintf( stderr, "%04x is not a window handle\n", hwnd );
return;
}
if (!GetClassName( hwnd, className, sizeof(className ) ))
strcpy( className, "#NULL#" );
fprintf( stderr, "Window %04x:\n", hwnd );
fprintf( stderr,
"next=%04x child=%04x parent=%04x owner=%04x class=%04x '%s'\n"
"inst=%04x taskQ=%04x updRgn=%04x active=%04x hdce=%04x idmenu=%04x\n"
"style=%08lx exstyle=%08lx wndproc=%08lx text=%04x '%s'\n"
"client=%d,%d-%d,%d window=%d,%d-%d,%d iconpos=%d,%d maxpos=%d,%d\n"
"sysmenu=%04x flags=%04x props=%04x vscroll=%04x hscroll=%04x\n",
ptr->hwndNext, ptr->hwndChild, ptr->hwndParent, ptr->hwndOwner,
ptr->hClass, className, ptr->hInstance, ptr->hmemTaskQ,
ptr->hrgnUpdate, ptr->hwndLastActive, ptr->hdce, ptr->wIDmenu,
ptr->dwStyle, ptr->dwExStyle, (DWORD)ptr->lpfnWndProc, ptr->hText,
ptr->hText ? (char*)USER_HEAP_LIN_ADDR(ptr->hText) : "",
ptr->rectClient.left, ptr->rectClient.top, ptr->rectClient.right,
ptr->rectClient.bottom, ptr->rectWindow.left, ptr->rectWindow.top,
ptr->rectWindow.right, ptr->rectWindow.bottom, ptr->ptIconPos.x,
ptr->ptIconPos.y, ptr->ptMaxPos.x, ptr->ptMaxPos.y, ptr->hSysMenu,
ptr->flags, ptr->hProp, ptr->hVScroll, ptr->hHScroll );
if ((classPtr = CLASS_FindClassPtr( ptr->hClass )) &&
classPtr->wc.cbWndExtra)
{
fprintf( stderr, "extra bytes:" );
for (i = 0; i < classPtr->wc.cbWndExtra; i++)
fprintf( stderr, " %02x", *((BYTE*)ptr->wExtra+i) );
fprintf( stderr, "\n" );
}
fprintf( stderr, "\n" );
}
/***********************************************************************
* WIN_WalkWindows
*
* Walk the windows tree and print each window on stderr.
*/
void WIN_WalkWindows( HWND hwnd, int indent )
{
WND *ptr;
CLASS *classPtr;
char className[80];
if (!hwnd) hwnd = hwndDesktop;
if (!indent) /* first time around */
fprintf( stderr, "%-16.16s %-8.8s %-6.6s %-17.17s %-8.8s %s\n",
"hwnd", " wndPtr", "queue", "Class Name", " Style", " WndProc");
while (hwnd)
{
fprintf( stderr, "%*s%04x%*s", indent, "", hwnd, 13-indent, "" );
if (!(ptr = WIN_FindWndPtr( hwnd )))
{
fprintf( stderr, "*** Invalid window handle\n" );
return;
}
if (!(classPtr = CLASS_FindClassPtr( ptr->hClass ))) strcpy( className, "#NULL#" );
else GlobalGetAtomName( classPtr->atomName, className, sizeof(className) );
fprintf( stderr, "%08lx %-6.4x %-17.17s %08x %04x:%04x\n",
(DWORD)ptr, ptr->hmemTaskQ, className,
(unsigned) ptr->dwStyle,
HIWORD(ptr->lpfnWndProc),
LOWORD(ptr->lpfnWndProc));
if (ptr->hwndChild) WIN_WalkWindows( ptr->hwndChild, indent+1 );
hwnd = ptr->hwndNext;
}
}
/*********************************************************************** /***********************************************************************
* WIN_GetXWindow * WIN_GetXWindow
* *
@ -209,7 +300,7 @@ static void WIN_DestroyWindow( HWND hwnd )
if ((wndPtr->hrgnUpdate) || (wndPtr->flags & WIN_INTERNAL_PAINT)) if ((wndPtr->hrgnUpdate) || (wndPtr->flags & WIN_INTERNAL_PAINT))
{ {
if (wndPtr->hrgnUpdate) DeleteObject( wndPtr->hrgnUpdate ); if (wndPtr->hrgnUpdate) DeleteObject( wndPtr->hrgnUpdate );
MSG_DecPaintCount( wndPtr->hmemTaskQ ); QUEUE_DecPaintCount( wndPtr->hmemTaskQ );
} }
if (!(wndPtr->dwStyle & WS_CHILD)) if (!(wndPtr->dwStyle & WS_CHILD))
{ {

View file

@ -12,6 +12,7 @@
#include "event.h" #include "event.h"
#include "hook.h" #include "hook.h"
#include "message.h" #include "message.h"
#include "queue.h"
#include "stackframe.h" #include "stackframe.h"
#include "winpos.h" #include "winpos.h"
#include "nonclient.h" #include "nonclient.h"
@ -632,12 +633,8 @@ BOOL SetWindowPlacement( HWND hwnd, WINDOWPLACEMENT *wndpl )
BOOL ACTIVATEAPP_callback(HWND hWnd, LPARAM lParam) BOOL ACTIVATEAPP_callback(HWND hWnd, LPARAM lParam)
{ {
ACTIVATESTRUCT *lpActStruct = (ACTIVATESTRUCT*)lParam; ACTIVATESTRUCT *lpActStruct = (ACTIVATESTRUCT*)lParam;
WND *wndPtr = WIN_FindWndPtr( hWnd );
if( !wndPtr || hWnd == GetDesktopWindow()) return 1;
if( MSG_GetQueueTask(wndPtr->hmemTaskQ) != lpActStruct->hTaskSendTo ) if (GetWindowTask(hWnd) != lpActStruct->hTaskSendTo) return 1;
return 1;
SendMessage( hWnd, WM_ACTIVATEAPP, lpActStruct->wFlag, SendMessage( hWnd, WM_ACTIVATEAPP, lpActStruct->wFlag,
(LPARAM)((lpActStruct->hWindowTask)?lpActStruct->hWindowTask:0)); (LPARAM)((lpActStruct->hWindowTask)?lpActStruct->hWindowTask:0));
@ -742,10 +739,10 @@ BOOL WINPOS_SetActiveWindow( HWND hWnd, BOOL fMouse, BOOL fChangeFocus )
/* send WM_ACTIVATEAPP if necessary */ /* send WM_ACTIVATEAPP if necessary */
if (hActiveQ != wndPtr->hmemTaskQ) if (hActiveQ != wndPtr->hmemTaskQ)
{ {
HTASK hT = MSG_GetQueueTask( hActiveQ ); HTASK hT = QUEUE_GetQueueTask( hActiveQ );
actStruct.wFlag = 0; /* deactivate */ actStruct.wFlag = 0; /* deactivate */
actStruct.hWindowTask = MSG_GetQueueTask(wndPtr->hmemTaskQ); actStruct.hWindowTask = QUEUE_GetQueueTask(wndPtr->hmemTaskQ);
actStruct.hTaskSendTo = hT; actStruct.hTaskSendTo = hT;
/* send WM_ACTIVATEAPP to top-level windows /* send WM_ACTIVATEAPP to top-level windows
@ -755,7 +752,7 @@ BOOL WINPOS_SetActiveWindow( HWND hWnd, BOOL fMouse, BOOL fChangeFocus )
actStruct.wFlag = 1; /* activate */ actStruct.wFlag = 1; /* activate */
actStruct.hWindowTask = hT; actStruct.hWindowTask = hT;
actStruct.hTaskSendTo = MSG_GetQueueTask( wndPtr->hmemTaskQ ); actStruct.hTaskSendTo = QUEUE_GetQueueTask( wndPtr->hmemTaskQ );
EnumWindows( enumCallback , (LPARAM)&actStruct ); EnumWindows( enumCallback , (LPARAM)&actStruct );