From ddbc8cca0625fba7aefda3cd3c517d1536a07022 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 20 Jan 2006 10:27:08 +0000 Subject: [PATCH] *** empty log message *** --- configure | 768 ++++++++++++++++++++------------------- configure.ac | 34 +- reconf | 1 + src/command.C | 21 +- src/feature.h | 10 + src/iom_conf.h | 1 + src/main.C | 28 +- src/misc.C | 39 +- src/perl/option-popup | 2 + src/perl/selection-popup | 1 + src/rxvt.h | 278 +++++++------- src/rxvtperl.xs | 378 ++++++++++++------- src/screen.C | 152 ++++---- src/typemap | 28 ++ src/urxvt.pm | 59 ++- src/xdefaults.C | 8 +- 16 files changed, 1010 insertions(+), 798 deletions(-) diff --git a/configure b/configure index 3ed78941..b9835b58 100755 --- a/configure +++ b/configure @@ -309,7 +309,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os VERSION DATE LSMDATE LIBVERSION CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX CPP INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LINKER CXXCPP EGREP INSTALL_LIBRXVT RXVTNAME MV RM CP LN SED ECHO CMP TIC X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS XPM_CPPFLAGS XPM_CFLAGS XPM_LIBS rxvt_int16_typedef rxvt_uint16_typedef rxvt_int32_typedef rxvt_uint32_typedef rxvt_intp_define rxvt_u_intp_define PERL PERLLIB PERLFLAGS PERLPRIVLIBEXP IF_PERL PERL_O DEBUG DINCLUDE DLIB include_stdint_h include_stdarg_h include_stdlib_h include_unistd_h include_string_h include_fcntl_h include_util_h include_assert_h include_sys_ioctl_h include_sys_select_h include_sys_strredir_h include_sys_time_h include_time_h LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os host host_cpu host_vendor host_os VERSION DATE LSMDATE LIBVERSION CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX CPP INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA EGREP LINKER INSTALL_LIBRXVT RXVTNAME MV RM CP LN SED ECHO CMP TIC CXXCPP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS XPM_CPPFLAGS XPM_CFLAGS XPM_LIBS rxvt_int16_typedef rxvt_uint16_typedef rxvt_int32_typedef rxvt_uint32_typedef rxvt_intp_define rxvt_u_intp_define PERL PERLLIB PERLFLAGS PERLPRIVLIBEXP IF_PERL PERL_O DEBUG DINCLUDE DLIB include_stdint_h include_stdarg_h include_stdlib_h include_unistd_h include_string_h include_fcntl_h include_util_h include_assert_h include_sys_ioctl_h include_sys_select_h include_sys_strredir_h include_sys_time_h include_time_h LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. @@ -3053,357 +3053,6 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - -if test -z "$orig_CXXFLAGS"; then - if test x$GCC = xyes && test "x$GXX" = xyes; then - CXXFLAGS="-g -O3" - else - CXXFLAGS="-O" - fi - CFLAGS="$CXXFLAGS" -fi - -LINKER="$CXX" -if test x$GCC = xyes && test x$GXX = xyes; then - -echo "$as_me:$LINENO: checking for main in -lsupc++" >&5 -echo $ECHO_N "checking for main in -lsupc++... $ECHO_C" >&6 -if test "${ac_cv_lib_supcpp_main+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lsupc++ $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - - -int -main () -{ -main (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_supcpp_main=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_supcpp_main=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_supcpp_main" >&5 -echo "${ECHO_T}$ac_cv_lib_supcpp_main" >&6 -if test $ac_cv_lib_supcpp_main = yes; then - - LINKER="$CC" - LIBS="$LIBS -lsupc++" - -fi - -fi -LINKER=$LINKER - - - -cat >>confdefs.h <<\_ACEOF -#define _GNU_SOURCE 1 -_ACEOF - - -case $host in - *-*-solaris* ) - -cat >>confdefs.h <<\_ACEOF -#define _XOPEN_SOURCE_EXTENDED 1 -_ACEOF - - -cat >>confdefs.h <<\_ACEOF -#define _XOPEN_SOURCE 2 -_ACEOF - - -cat >>confdefs.h <<\_ACEOF -#define __EXTENSIONS__ 1 -_ACEOF - - ;; -esac - - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 -echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 -if test -z "$CXXCPP"; then - if test "${ac_cv_prog_CXXCPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -echo "$as_me:$LINENO: result: $CXXCPP" >&5 -echo "${ECHO_T}$CXXCPP" >&6 -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether non-existent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_cxx_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -ac_ext=cc -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu echo "$as_me:$LINENO: checking for egrep" >&5 @@ -3488,7 +3137,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3542,7 +3191,7 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -3560,19 +3209,171 @@ else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done -fi -LIBS=$ac_func_search_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5 -echo "${ECHO_T}$ac_cv_search_strerror" >&6 -if test "$ac_cv_search_strerror" != no; then - test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done +fi +LIBS=$ac_func_search_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5 +echo "${ECHO_T}$ac_cv_search_strerror" >&6 +if test "$ac_cv_search_strerror" != no; then + test "$ac_cv_search_strerror" = "none required" || LIBS="$ac_cv_search_strerror $LIBS" + +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +LINKER="$CXX" +if test x$GCC = xyes && test x$GXX = xyes; then + echo "$as_me:$LINENO: checking for main in -lsupc++" >&5 +echo $ECHO_N "checking for main in -lsupc++... $ECHO_C" >&6 +if test "${ac_cv_lib_supcpp_main+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsupc++ $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +int +main () +{ +main (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_supcpp_main=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_supcpp_main=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_supcpp_main" >&5 +echo "${ECHO_T}$ac_cv_lib_supcpp_main" >&6 +if test $ac_cv_lib_supcpp_main = yes; then + + LINKER="$CC" + LIBS="$LIBS -lsupc++" + +fi + +fi +LINKER=$LINKER + + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +if test -z "$orig_CXXFLAGS"; then + if test x$GCC = xyes && test "x$GXX" = xyes; then + CXXFLAGS="-g -O3 -Os -fno-threadsafe-statics -fno-enforce-eh-specs" + +cat >conftest.$ac_ext <<_ACEOF +int i; +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + echo didididid +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +CXXFLAGS="-g -O3" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + else + CXXFLAGS="-O" + fi + CFLAGS="$CXXFLAGS" +fi + + +cat >>confdefs.h <<\_ACEOF +#define _GNU_SOURCE 1 +_ACEOF + + +case $host in + *-*-solaris* ) + +cat >>confdefs.h <<\_ACEOF +#define _XOPEN_SOURCE_EXTENDED 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define _XOPEN_SOURCE 2 +_ACEOF + -fi +cat >>confdefs.h <<\_ACEOF +#define __EXTENSIONS__ 1 +_ACEOF + + ;; +esac echo "$as_me:$LINENO: checking for setlocale" >&5 @@ -5114,6 +4915,237 @@ fi +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6 +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +echo "$as_me:$LINENO: result: $CXXCPP" >&5 +echo "${ECHO_T}$CXXCPP" >&6 +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_cxx_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + if test "x$ac_path_x_has_been_run" != xyes; then echo "$as_me:$LINENO: checking for X" >&5 @@ -13548,9 +13580,8 @@ s,@CPP@,$CPP,;t t s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t s,@INSTALL_DATA@,$INSTALL_DATA,;t t -s,@LINKER@,$LINKER,;t t -s,@CXXCPP@,$CXXCPP,;t t s,@EGREP@,$EGREP,;t t +s,@LINKER@,$LINKER,;t t s,@INSTALL_LIBRXVT@,$INSTALL_LIBRXVT,;t t s,@RXVTNAME@,$RXVTNAME,;t t s,@MV@,$MV,;t t @@ -13561,6 +13592,7 @@ s,@SED@,$SED,;t t s,@ECHO@,$ECHO,;t t s,@CMP@,$CMP,;t t s,@TIC@,$TIC,;t t +s,@CXXCPP@,$CXXCPP,;t t s,@X_CFLAGS@,$X_CFLAGS,;t t s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t s,@X_LIBS@,$X_LIBS,;t t diff --git a/configure.ac b/configure.ac index 6bb91797..792f9356 100644 --- a/configure.ac +++ b/configure.ac @@ -33,29 +33,35 @@ AC_PROG_CXX AC_PROG_CPP AC_PROG_INSTALL +AC_AIX +AC_ISC_POSIX + AC_LANG(C) +dnl check wetehr we can link with gcc -lsupc++ +LINKER="$CXX" +if test x$GCC = xyes && test x$GXX = xyes; then + AC_CHECK_LIB(supc++, main, [ + LINKER="$CC" + LIBS="$LIBS -lsupc++" + ]) +fi +AC_SUBST(LINKER,[$LINKER]) + +AC_LANG(C++) dnl# -------------------------------------------------------------------------- -dnl# Supply default CFLAGS, if not specified by `CFLAGS=flags ./configure' +dnl# Supply default CXXLAGS, if not specified by `CXXLAGS=flags ./configure' dnl# if test -z "$orig_CXXFLAGS"; then if test x$GCC = xyes && test "x$GXX" = xyes; then - CXXFLAGS="-g -O3" + CXXFLAGS="-g -O3 -Os -fno-threadsafe-statics -fno-enforce-eh-specs" + AC_COMPILE_IFELSE([int i;], [echo didididid], [CXXFLAGS="-g -O3"]) else CXXFLAGS="-O" fi CFLAGS="$CXXFLAGS" fi -LINKER="$CXX" -if test x$GCC = xyes && test x$GXX = xyes; then - AC_CHECK_LIB(supc++, main, [ - LINKER="$CC" - LIBS="$LIBS -lsupc++" - ]) -fi -AC_SUBST(LINKER,[$LINKER]) - AC_DEFINE(_GNU_SOURCE, 1, Use all glibc features.) case $host in @@ -70,12 +76,6 @@ dnl if test x$GXX = xyes; then dnl CXXFLAGS="$CXXFLAGS" dnl I once had -fno-exceptions, but I am using them now... dnl fi -AC_LANG(C++) - -dnl# system hacks -AC_AIX -AC_ISC_POSIX - dnl# FreeBSD needs to link libxpg4 AC_CHECK_FUNC(setlocale, [], [AC_CHECK_LIB(xpg4, setlocale, [LIBS="$LIBS -lxpg4"])]) diff --git a/reconf b/reconf index 9a3eec99..9a619b32 100755 --- a/reconf +++ b/reconf @@ -8,6 +8,7 @@ if [ "x$HOSTNAME" = xcerebro -o "x$HOSTNAME" = xfuji ]; then CC=ccache\ gcc-4.0 CXX=ccache\ g++-4.0 export CC CXX + unset CXXFLAGS CFLAGS fi ./configure --prefix=/opt/rxvt --with-name=rxvt --enable-menubar \ diff --git a/src/command.C b/src/command.C index 5a0ab75b..fd8a4d99 100644 --- a/src/command.C +++ b/src/command.C @@ -66,9 +66,6 @@ #define IS_CONTROL(ch) !((ch) & 0xffffff60UL) -// exception thrown when the command parser runs out of input data -class out_of_input { } out_of_input; - #if ENABLE_FRILLS || ISO_14755 #define ISO_14755_STARTED 0x80000000UL @@ -1046,7 +1043,7 @@ rxvt_term::cursor_blink_cb (time_watcher &w) hidden_cursor = !hidden_cursor; want_refresh = 1; - w.start (w.at + BLINK_INTERVAL); + w.start (w.at + CURSOR_BLINK_INTERVAL); } #endif @@ -1715,7 +1712,7 @@ skip_switch: ; want_refresh = 1; } - cursor_blink_ev.start (NOW + BLINK_INTERVAL); + cursor_blink_ev.start (NOW + CURSOR_BLINK_INTERVAL); } #endif @@ -1753,7 +1750,7 @@ rxvt_term::focus_in () #endif #if CURSOR_BLINK if (OPTION (Opt_cursorBlink)) - cursor_blink_ev.start (NOW + BLINK_INTERVAL); + cursor_blink_ev.start (NOW + CURSOR_BLINK_INTERVAL); #endif #if OFF_FOCUS_FADING if (rs[Rs_fade]) @@ -2833,7 +2830,7 @@ rxvt_term::cmd_parse () // read the next character wchar_t -rxvt_term::next_char () +rxvt_term::next_char () NOTHROW { while (cmdbuf_ptr < cmdbuf_endp) { @@ -2864,20 +2861,22 @@ rxvt_term::next_char () // read the next octet uint32_t -rxvt_term::next_octet () +rxvt_term::next_octet () NOTHROW { return cmdbuf_ptr < cmdbuf_endp ? (unsigned char)*cmdbuf_ptr++ : NOCHAR; } +static class out_of_input out_of_input; + /* rxvt_cmd_getc () - Return next input character */ /* * Return the next input character after first passing any keyboard input * to the command. */ wchar_t -rxvt_term::cmd_getc () +rxvt_term::cmd_getc () THROW ((class out_of_input)) { wchar_t c = next_char (); @@ -2888,7 +2887,7 @@ rxvt_term::cmd_getc () } uint32_t -rxvt_term::cmd_get8 () +rxvt_term::cmd_get8 () THROW ((class out_of_input)) { uint32_t c = next_octet (); @@ -4048,7 +4047,7 @@ rxvt_term::privcases (int mode, unsigned long bit) /* we're not using priv _yet_ */ void -rxvt_term::process_terminal_mode (int mode, int priv __attribute__ ((unused)), unsigned int nargs, const int *arg) +rxvt_term::process_terminal_mode (int mode, int priv UNUSED, unsigned int nargs, const int *arg) { unsigned int i, j; int state; diff --git a/src/feature.h b/src/feature.h index 0d842cf0..7438f186 100644 --- a/src/feature.h +++ b/src/feature.h @@ -59,6 +59,16 @@ * report bugs, too!), but don't _expect_ them to work. */ +/* + * The cursor blink interval, in seconds. + */ +#define CURSOR_BLINK_INTERVAL 0.5 + +/* + * The text blink interval, in seconds. + */ +#define TEXT_BLINK_INTERVAL CURSOR_BLINK_INTERVAL + /* * Avoid enabling the colour cursor (-cr, cursorColor, cursorColor2) */ diff --git a/src/iom_conf.h b/src/iom_conf.h index 3729950c..91c65ccb 100644 --- a/src/iom_conf.h +++ b/src/iom_conf.h @@ -26,6 +26,7 @@ #define IOM_TIME 1 #define IOM_CHECK 1 #define IOM_SIG 1 +#define IOM_IDLE 1 #define IOM_CHILD 1 #endif diff --git a/src/main.C b/src/main.C index c45e7528..d52b140e 100644 --- a/src/main.C +++ b/src/main.C @@ -50,10 +50,13 @@ vector rxvt_term::termlist; +// used to tell global functions which terminal instance is "active" +rxvt_t rxvt_current_term; + static char curlocale[128], savelocale[128]; bool -rxvt_set_locale (const char *locale) +rxvt_set_locale (const char *locale) NOTHROW { if (!locale || !strncmp (locale, curlocale, 128)) return false; @@ -64,14 +67,14 @@ rxvt_set_locale (const char *locale) } void -rxvt_push_locale (const char *locale) +rxvt_push_locale (const char *locale) NOTHROW { strcpy (savelocale, curlocale); rxvt_set_locale (locale); } void -rxvt_pop_locale () +rxvt_pop_locale () NOTHROW { rxvt_set_locale (savelocale); } @@ -184,9 +187,6 @@ rxvt_term::rxvt_term () #ifdef KEYSYM_RESOURCE keyboard = new keyboard_manager; - - if (!keyboard) - rxvt_fatal ("out of memory, aborting.\n"); #endif } @@ -202,8 +202,6 @@ void rxvt_term::emergency_cleanup () rxvt_term::~rxvt_term () { - HOOK_INVOKE ((this, HOOK_DESTROY, DT_END)); - termlist.erase (find (termlist.begin (), termlist.end(), this)); emergency_cleanup (); @@ -306,6 +304,9 @@ rxvt_term::destroy () if (destroy_ev.active) return; + if (HOOK_INVOKE ((this, HOOK_DESTROY, DT_END))) + return; + #if ENABLE_OVERLAY scr_overlay_off (); #endif @@ -510,9 +511,6 @@ rxvt_term::init (int argc, const char *const *argv) } #endif - XMapWindow (disp, vt); - XMapWindow (disp, parent[0]); - set_colorfgbg (); init_command (cmd_argv); @@ -526,6 +524,9 @@ rxvt_term::init (int argc, const char *const *argv) HOOK_INVOKE ((this, HOOK_START, DT_END)); + XMapWindow (disp, vt); + XMapWindow (disp, parent[0]); + return true; } @@ -633,7 +634,7 @@ rxvt_calloc (size_t number, size_t size) return p; } -void * +void * rxvt_realloc (void *ptr, size_t size) { void *p = realloc (ptr, size); @@ -1591,7 +1592,4 @@ rxvt_term::IMSetStatusPosition () } #endif /* USE_XIM */ -/*----------------------------------------------------------------------*/ -rxvt_t rxvt_current_term; - /*----------------------- end-of-file (C source) -----------------------*/ diff --git a/src/misc.C b/src/misc.C index 0cb20126..48c953d9 100644 --- a/src/misc.C +++ b/src/misc.C @@ -165,13 +165,7 @@ rxvt_utf8towcs (const char *str, int len) } char * -rxvt_strdup (const char *str) -{ - return str ? strdup (str) : 0; -} - -char * -rxvt_r_basename (const char *str) +rxvt_r_basename (const char *str) NOTHROW { char *base = strrchr (str, '/'); @@ -182,7 +176,7 @@ rxvt_r_basename (const char *str) * Print an error message */ void -rxvt_vlog (const char *fmt, va_list arg_ptr) +rxvt_vlog (const char *fmt, va_list arg_ptr) NOTHROW { char msg[1024]; @@ -195,7 +189,7 @@ rxvt_vlog (const char *fmt, va_list arg_ptr) } void -rxvt_log (const char *fmt,...) +rxvt_log (const char *fmt,...) NOTHROW { va_list arg_ptr; @@ -208,7 +202,7 @@ rxvt_log (const char *fmt,...) * Print an error message */ void -rxvt_warn (const char *fmt,...) +rxvt_warn (const char *fmt,...) NOTHROW { va_list arg_ptr; @@ -220,7 +214,7 @@ rxvt_warn (const char *fmt,...) } void -rxvt_fatal (const char *fmt,...) +rxvt_fatal (const char *fmt,...) THROW ((class rxvt_failure_exception)) { va_list arg_ptr; @@ -233,11 +227,10 @@ rxvt_fatal (const char *fmt,...) rxvt_exit_failure (); } -class rxvt_failure_exception rxvt_failure_exception; - void -rxvt_exit_failure () +rxvt_exit_failure () THROW ((class rxvt_failure_exception)) { + static class rxvt_failure_exception rxvt_failure_exception; throw (rxvt_failure_exception); } @@ -250,7 +243,7 @@ rxvt_exit_failure () * return: strlen (S2) */ int -rxvt_Str_match (const char *s1, const char *s2) +rxvt_Str_match (const char *s1, const char *s2) NOTHROW { int n = strlen (s2); @@ -258,7 +251,7 @@ rxvt_Str_match (const char *s1, const char *s2) } const char * -rxvt_Str_skip_space (const char *str) +rxvt_Str_skip_space (const char *str) NOTHROW { if (str) while (*str && isspace (*str)) @@ -272,7 +265,7 @@ rxvt_Str_skip_space (const char *str) * in place. */ char * -rxvt_Str_trim (char *str) +rxvt_Str_trim (char *str) NOTHROW { char *r, *s; @@ -319,7 +312,7 @@ rxvt_Str_trim (char *str) * returns the converted string length */ int -rxvt_Str_escaped (char *str) +rxvt_Str_escaped (char *str) NOTHROW { char ch, *s, *d; int i, num, append = 0; @@ -395,7 +388,7 @@ rxvt_Str_escaped (char *str) * Caller should free each entry and array when done */ char ** -rxvt_splitcommastring (const char *cs) +rxvt_splitcommastring (const char *cs) NOTHROW { int l, n, p; const char *s, *t; @@ -426,7 +419,7 @@ rxvt_splitcommastring (const char *cs) } void -rxvt_freecommastring (char **cs) +rxvt_freecommastring (char **cs) NOTHROW { for (int i = 0; cs[i]; ++i) free (cs[i]); @@ -448,7 +441,7 @@ rxvt_freecommastring (char **cs) * FILE is either semi-colon or zero terminated */ char * -rxvt_File_search_path (const char *pathlist, const char *file, const char *ext) +rxvt_File_search_path (const char *pathlist, const char *file, const char *ext) NOTHROW { int maxpath, len; const char *p, *path; @@ -520,7 +513,7 @@ rxvt_File_search_path (const char *pathlist, const char *file, const char *ext) } char * -rxvt_File_find (const char *file, const char *ext, const char *path) +rxvt_File_find (const char *file, const char *ext, const char *path) NOTHROW { char *f; @@ -539,7 +532,7 @@ rxvt_File_find (const char *file, const char *ext, const char *path) #endif // should not be used in interactive programs, for obvious reasons -void rxvt_usleep (int usecs) +void rxvt_usleep (int usecs) NOTHROW { #if HAVE_NANOSLEEP struct timespec ts; diff --git a/src/perl/option-popup b/src/perl/option-popup index 4ac50ca4..151d8ec2 100644 --- a/src/perl/option-popup +++ b/src/perl/option-popup @@ -4,6 +4,8 @@ sub on_start { my ($self) = @_; $self->grab_button (2, urxvt::ControlMask); + + () } sub on_button_press { diff --git a/src/perl/selection-popup b/src/perl/selection-popup index 2db8a90c..b71b240d 100644 --- a/src/perl/selection-popup +++ b/src/perl/selection-popup @@ -74,6 +74,7 @@ sub on_button_press { /^(http|ftp|telnet|irc|news):\// and $add_button->("run $self->{browser}" => sub { $self->exec_async ($self->{browser}, $_) }); + warn "hook for $self $self->{term}\n";#d# for my $hook (@{ $self->{term}{selection_popup_hook} || [] }) { if (my ($title, $cb) = $hook->($popup)) { $add_button->($title, $cb); diff --git a/src/rxvt.h b/src/rxvt.h index c090b81e..3c9adae9 100644 --- a/src/rxvt.h +++ b/src/rxvt.h @@ -96,41 +96,71 @@ typedef struct { # define STDERR_FILENO 2 #endif +/****************************************************************************/ + +#ifndef __attribute__ +# if __GNUC__ +# if (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || (__GNUC__ < 2) +# define __attribute__(x) +# endif +# endif +# define __attribute__(x) +#endif + +#define NORETURN __attribute__ ((noreturn)) +#define UNUSED __attribute__ ((unused)) + +// increases code size unless -fno-enforce-eh-specs +#if __GNUC__ +# define NOTHROW +# define THROW(x) +#else +# define NOTHROW throw() +# define THROW(x) throw x +#endif + +// exception thrown on fatal (per-instance) errors +class rxvt_failure_exception { }; + +// exception thrown when the command parser runs out of input data +class out_of_input { }; + /* ***************************************************************************** * PROTOTYPES ***************************************************************************** */ // main.C -RETSIGTYPE rxvt_Child_signal (int sig); -RETSIGTYPE rxvt_Exit_signal (int sig); -void rxvt_clean_exit (); +RETSIGTYPE rxvt_Child_signal (int sig) NOTHROW; +RETSIGTYPE rxvt_Exit_signal (int sig) NOTHROW; +void rxvt_clean_exit () NOTHROW; void * rxvt_malloc (size_t size); void * rxvt_calloc (size_t number, size_t size); void * rxvt_realloc (void *ptr, size_t size); -// util.C +// misc.C char * rxvt_wcstombs (const wchar_t *str, int len = -1); wchar_t * rxvt_mbstowcs (const char *str, int len = -1); char * rxvt_wcstoutf8 (const wchar_t *str, int len = -1); wchar_t * rxvt_utf8towcs (const char *str, int len = -1); -char * rxvt_strdup (const char *str); -// misc.C -char * rxvt_r_basename (const char *str); -void rxvt_vlog (const char *fmt, va_list arg_ptr); -void rxvt_log (const char *fmt,...); -void rxvt_warn (const char *fmt,...); -void rxvt_fatal (const char *fmt,...); -void rxvt_exit_failure (); -int rxvt_Str_match (const char *s1, const char *s2); -const char * rxvt_Str_skip_space (const char *str); -char * rxvt_Str_trim (char *str); -int rxvt_Str_escaped (char *str); -char ** rxvt_splitcommastring (const char *cs); -void rxvt_freecommastring (char **cs); -char * rxvt_File_find (const char *file, const char *ext, const char *path); -void rxvt_usleep (int usecs); +#define rxvt_strdup(s) ((s) ? strdup(s) : 0) + +char * rxvt_r_basename (const char *str) NOTHROW; +void rxvt_vlog (const char *fmt, va_list arg_ptr) NOTHROW; +void rxvt_log (const char *fmt,...) NOTHROW; +void rxvt_warn (const char *fmt,...) NOTHROW; +void rxvt_fatal (const char *fmt, ...) THROW ((class rxvt_failure_exception)) NORETURN; +void rxvt_exit_failure () THROW ((class rxvt_failure_exception)) NORETURN; + +int rxvt_Str_match (const char *s1, const char *s2) NOTHROW; +const char * rxvt_Str_skip_space (const char *str) NOTHROW; +char * rxvt_Str_trim (char *str) NOTHROW; +int rxvt_Str_escaped (char *str) NOTHROW; +char ** rxvt_splitcommastring (const char *cs) NOTHROW; +void rxvt_freecommastring (char **cs) NOTHROW; +char * rxvt_File_find (const char *file, const char *ext, const char *path) NOTHROW; +void rxvt_usleep (int usecs) NOTHROW; ///////////////////////////////////////////////////////////////////////////// @@ -837,35 +867,13 @@ enum { # define D_SIZE(x) #endif -extern class rxvt_failure_exception { } rxvt_failure_exception; - typedef callback1 log_callback; typedef callback1 getfd_callback; -extern void rxvt_vlog (const char *fmt, va_list arg_ptr); -extern void rxvt_log (const char *fmt, ...); -extern void rxvt_warn (const char *fmt, ...); -extern void rxvt_fatal (const char *fmt, ...) __attribute__ ((noreturn)); -extern void rxvt_exit_failure () __attribute__ ((noreturn)); - #define SET_LOCALE(locale) rxvt_set_locale (locale) -extern bool rxvt_set_locale (const char *locale); -extern void rxvt_push_locale (const char *locale); -extern void rxvt_pop_locale (); - -/****************************************************************************/ - -#define BLINK_INTERVAL 0.5 -#define TEXT_BLINK_INTERVAL 0.5 - -#ifndef __attribute__ -# ifdef __GNUC__ -# if (__GNUC__ == 2 && __GNUC_MINOR__ < 5) || (__GNUC__ < 2) -# define __attribute__(x) -# endif -# endif -# define __attribute__(x) -#endif +extern bool rxvt_set_locale (const char *locale) NOTHROW; +extern void rxvt_push_locale (const char *locale) NOTHROW; +extern void rxvt_pop_locale () NOTHROW; /****************************************************************************/ @@ -1118,14 +1126,14 @@ struct rxvt_term : zero_initialized, rxvt_vars { text_t **ov_text; rend_t **ov_rend; - void scr_swap_overlay (); - void scr_overlay_new (int x, int y, int w, int h); - void scr_overlay_off (); + void scr_swap_overlay () NOTHROW; + void scr_overlay_new (int x, int y, int w, int h) NOTHROW; + void scr_overlay_off () NOTHROW; void scr_overlay_set (int x, int y, text_t text, - rend_t rend = OVERLAY_RSTYLE); - void scr_overlay_set (int x, int y, const char *s); - void scr_overlay_set (int x, int y, const wchar_t *s); + rend_t rend = OVERLAY_RSTYLE) NOTHROW; + void scr_overlay_set (int x, int y, const char *s) NOTHROW; + void scr_overlay_set (int x, int y, const wchar_t *s) NOTHROW; #endif vector allocated; // free these memory blocks with free() @@ -1168,11 +1176,11 @@ struct rxvt_term : zero_initialized, rxvt_vars { #endif // modifies first argument(!) - void paste (char *data, unsigned int len); + void paste (char *data, unsigned int len) NOTHROW; long vt_emask, vt_emask_perl; - void vt_select_input () const + void vt_select_input () const NOTHROW { XSelectInput (display->display, vt, vt_emask | vt_emask_perl); } @@ -1197,7 +1205,7 @@ struct rxvt_term : zero_initialized, rxvt_vars { void pty_cb (io_watcher &w, short revents); io_watcher pty_ev; - void incr_cb (time_watcher &w); time_watcher incr_ev; + void incr_cb (time_watcher &w) NOTHROW; time_watcher incr_ev; #ifdef CURSOR_BLINK void cursor_blink_cb (time_watcher &w); time_watcher cursor_blink_ev; @@ -1270,7 +1278,7 @@ struct rxvt_term : zero_initialized, rxvt_vars { void im_destroy (); void im_cb (); im_watcher im_ev; void im_set_size (XRectangle &size); - void im_set_position (XPoint &pos); + void im_set_position (XPoint &pos) NOTHROW; void im_set_color (unsigned long &fg, unsigned long &bg); void im_set_preedit_area (XRectangle &preedit_rect, XRectangle &status_rect, const XRectangle &needed_rect); @@ -1282,22 +1290,14 @@ struct rxvt_term : zero_initialized, rxvt_vars { void resize_scrollbar (); - void pixel_position (int *x, int *y); - - void selection_click (int clicks, int x, int y); - void selection_extend (int x, int y, int flag); - void selection_rotate (int x, int y); - - /* autoconvert */ - // command.C void lookup_key (XKeyEvent &ev); unsigned int cmd_write (const char *str, unsigned int count); - wchar_t next_char (); - wchar_t cmd_getc (); - uint32_t next_octet (); - uint32_t cmd_get8 (); + wchar_t next_char () NOTHROW; + wchar_t cmd_getc () THROW ((class out_of_input)); + uint32_t next_octet () NOTHROW; + uint32_t cmd_get8 () THROW ((class out_of_input)); bool cmd_parse (); void mouse_report (XButtonEvent &ev); @@ -1341,7 +1341,7 @@ struct rxvt_term : zero_initialized, rxvt_vars { // screen.C - void lalloc (line_t &l) const + void lalloc (line_t &l) const NOTHROW { l.t = (text_t *)talloc->alloc (); l.r = (rend_t *)ralloc->alloc (); @@ -1355,7 +1355,7 @@ struct rxvt_term : zero_initialized, rxvt_vars { } #endif - void lresize (line_t &l) const + void lresize (line_t &l) const NOTHROW { if (!l.t) return; @@ -1369,7 +1369,7 @@ struct rxvt_term : zero_initialized, rxvt_vars { scr_blank_line (l, prev_ncol, ncol - prev_ncol, DEFAULT_RSTYLE); } - int fgcolor_of (rend_t r) const + int fgcolor_of (rend_t r) const NOTHROW { int base = GET_BASEFG (r); #ifndef NO_BRIGHTCOLOR @@ -1383,7 +1383,7 @@ struct rxvt_term : zero_initialized, rxvt_vars { return base; } - int bgcolor_of (rend_t r) const + int bgcolor_of (rend_t r) const NOTHROW { int base = GET_BASEBG (r); #ifndef NO_BRIGHTCOLOR @@ -1397,12 +1397,12 @@ struct rxvt_term : zero_initialized, rxvt_vars { return base; } - bool option (uint32_t opt) const + bool option (uint32_t opt) const NOTHROW { return OPTION (opt); } - void set_option (uint32_t opt, bool set) + void set_option (uint32_t opt, bool set) NOTHROW { if (set) options |= opt; @@ -1410,77 +1410,83 @@ struct rxvt_term : zero_initialized, rxvt_vars { options &= ~opt; } - void scr_blank_line (line_t &l, unsigned int col, unsigned int width, rend_t efs) const; - void scr_blank_screen_mem (line_t &l, rend_t efs) const; - int scr_scroll_text (int row1, int row2, int count); + void scr_blank_line (line_t &l, unsigned int col, unsigned int width, rend_t efs) const NOTHROW; + void scr_blank_screen_mem (line_t &l, rend_t efs) const NOTHROW; + int scr_scroll_text (int row1, int row2, int count) NOTHROW; void scr_reset (); - void scr_release (); - void scr_clear (bool really = false); - void scr_refresh (); - bool scr_refresh_rend (rend_t mask, rend_t value); - void scr_erase_screen (int mode); + void scr_release () NOTHROW; + void scr_clear (bool really = false) NOTHROW; + void scr_refresh () NOTHROW; + bool scr_refresh_rend (rend_t mask, rend_t value) NOTHROW; + void scr_erase_screen (int mode) NOTHROW; #if ENABLE_FRILLS - void scr_erase_savelines (); - void scr_backindex (); - void scr_forwardindex (); + void scr_erase_savelines () NOTHROW; + void scr_backindex () NOTHROW; + void scr_forwardindex () NOTHROW; #endif - void scr_touch (bool refresh); - void scr_expose (int x, int y, int width, int height, bool refresh); + void scr_touch (bool refresh) NOTHROW; + void scr_expose (int x, int y, int width, int height, bool refresh) NOTHROW; rxvt_fontset *scr_find_fontset (rend_t r = DEFAULT_RSTYLE); - void scr_recolour (); - void scr_remap_chars (); - void scr_remap_chars (line_t &l); + void scr_recolour () NOTHROW; + void scr_remap_chars () NOTHROW; + void scr_remap_chars (line_t &l) NOTHROW; enum cursor_mode { SAVE, RESTORE }; - void scr_poweron (); - void scr_cursor (cursor_mode mode); - void scr_do_wrap (); - int scr_change_screen (int scrn); - void scr_color (unsigned int color, int fgbg); - void scr_rendition (int set, int style); - void scr_add_lines (const wchar_t *str, int len, int minlines = 0); - void scr_backspace (); - void scr_tab (int count, bool ht = false); - void scr_gotorc (int row, int col, int relative); - void scr_index (enum page_dirn direction); - void scr_erase_line (int mode); - void scr_E (); - void scr_insdel_lines (int count, int insdel); - void scr_insdel_chars (int count, int insdel); - void scr_scroll_region (int top, int bot); - void scr_cursor_visible (int mode); - void scr_autowrap (int mode); - void scr_relative_origin (int mode); - void scr_insert_mode (int mode); - void scr_set_tab (int mode); - void scr_rvideo_mode (int mode); - void scr_report_position (); - void set_font_style (); - void scr_charset_choose (int set); - void scr_charset_set (int set, unsigned int ch); - void scr_move_to (int y, int len); - bool scr_page (enum page_dirn direction, int nlines); - bool scr_changeview (int new_view_start); - void scr_bell (); - void scr_printscreen (int fullhist); - void scr_xor_rect (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle1, rend_t rstyle2); - void scr_xor_span (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle); - void scr_reverse_selection (); - void scr_dump (int fd); - void selection_check (int check_more); - void selection_paste (Window win, Atom prop, bool delete_prop); - void selection_property (Window win, Atom prop); - void selection_request (Time tm, int selnum); - int selection_request_other (Atom target, int selnum); - void selection_clear (); + void scr_poweron () NOTHROW; + void scr_cursor (cursor_mode mode) NOTHROW; + void scr_do_wrap () NOTHROW; + int scr_change_screen (int scrn) NOTHROW; + void scr_color (unsigned int color, int fgbg) NOTHROW; + void scr_rendition (int set, int style) NOTHROW; + void scr_add_lines (const wchar_t *str, int len, int minlines = 0) NOTHROW; + void scr_backspace () NOTHROW; + void scr_tab (int count, bool ht = false) NOTHROW; + void scr_gotorc (int row, int col, int relative) NOTHROW; + void scr_index (enum page_dirn direction) NOTHROW; + void scr_erase_line (int mode) NOTHROW; + void scr_E () NOTHROW; + void scr_insdel_lines (int count, int insdel) NOTHROW; + void scr_insdel_chars (int count, int insdel) NOTHROW; + void scr_scroll_region (int top, int bot) NOTHROW; + void scr_cursor_visible (int mode) NOTHROW; + void scr_autowrap (int mode) NOTHROW; + void scr_relative_origin (int mode) NOTHROW; + void scr_insert_mode (int mode) NOTHROW; + void scr_set_tab (int mode) NOTHROW; + void scr_rvideo_mode (int mode) NOTHROW; + void scr_report_position () NOTHROW; + void set_font_style () NOTHROW; + void scr_charset_choose (int set) NOTHROW; + void scr_charset_set (int set, unsigned int ch) NOTHROW; + void scr_move_to (int y, int len) NOTHROW; + bool scr_page (enum page_dirn direction, int nlines) NOTHROW; + bool scr_changeview (int new_view_start) NOTHROW; + void scr_bell () NOTHROW; + void scr_printscreen (int fullhist) NOTHROW; + void scr_xor_rect (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle1, rend_t rstyle2) NOTHROW; + void scr_xor_span (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle) NOTHROW; + void scr_reverse_selection () NOTHROW; + void scr_dump (int fd) NOTHROW; + + void selection_check (int check_more) NOTHROW; + void selection_paste (Window win, Atom prop, bool delete_prop) NOTHROW; + void selection_property (Window win, Atom prop) NOTHROW; + void selection_request (Time tm, int selnum) NOTHROW; + int selection_request_other (Atom target, int selnum) NOTHROW; + void selection_clear () NOTHROW; void selection_make (Time tm); - bool selection_grab (Time tm); - void selection_start_colrow (int col, int row); - void selection_delimit_word (enum page_dirn dirn, const row_col_t *mark, row_col_t *ret); - void selection_extend_colrow (int32_t col, int32_t row, int button3, int buttonpress, int clickchange); - void selection_remove_trailing_spaces (); - void selection_send (const XSelectionRequestEvent &rq); + bool selection_grab (Time tm) NOTHROW; + void selection_start_colrow (int col, int row) NOTHROW; + void selection_delimit_word (enum page_dirn dirn, const row_col_t *mark, row_col_t *ret) NOTHROW; + void selection_extend_colrow (int32_t col, int32_t row, int button3, int buttonpress, int clickchange) NOTHROW; + void selection_remove_trailing_spaces () NOTHROW; + void selection_send (const XSelectionRequestEvent &rq) NOTHROW; + void selection_click (int clicks, int x, int y) NOTHROW; + void selection_extend (int x, int y, int flag) NOTHROW; + void selection_rotate (int x, int y) NOTHROW; + + void pixel_position (int *x, int *y) NOTHROW; #if defined(NEXT_SCROLLBAR) // scrollbar-next.C diff --git a/src/rxvtperl.xs b/src/rxvtperl.xs index 7b8ad6e2..84f42203 100644 --- a/src/rxvtperl.xs +++ b/src/rxvtperl.xs @@ -52,7 +52,7 @@ #undef ROW #define ROW(n) THIS->row_buf [LINENO (n)] -#define ENABLE_PERL_FRILLS 1 +typedef int CHAINED UNUSED; ///////////////////////////////////////////////////////////////////////////// @@ -120,13 +120,15 @@ SvPTR (SV *sv, const char *klass) ///////////////////////////////////////////////////////////////////////////// +#define SvWATCHER(sv) (perl_watcher *)SvPTR (sv, "urxvt::watcher") + struct perl_watcher { SV *cbsv; HV *self; perl_watcher () - : cbsv (newSV (0)) + : cbsv (0) { } @@ -137,7 +139,8 @@ struct perl_watcher void cb (SV *cb) { - sv_setsv (cbsv, cb); + SvREFCNT_dec (cbsv); + cbsv = newSVsv (cb); } void invoke (const char *type, SV *self, int arg = -1); @@ -171,9 +174,9 @@ perl_watcher::invoke (const char *type, SV *self, int arg) } #define newSVtimer(timer) new_ref (timer->self, "urxvt::timer") -#define SvTIMER(sv) (timer *)SvPTR (sv, "urxvt::timer") +#define SvTIMER(sv) (timer *)(perl_watcher *)SvPTR (sv, "urxvt::timer") -struct timer : time_watcher, perl_watcher +struct timer : perl_watcher, time_watcher { tstamp interval; @@ -192,9 +195,9 @@ struct timer : time_watcher, perl_watcher }; #define newSViow(iow) new_ref (iow->self, "urxvt::iow") -#define SvIOW(sv) (iow *)SvPTR (sv, "urxvt::iow") +#define SvIOW(sv) (iow *)(perl_watcher *)SvPTR (sv, "urxvt::iow") -struct iow : io_watcher, perl_watcher +struct iow : perl_watcher, io_watcher { iow () : io_watcher (this, &iow::execute) @@ -207,6 +210,38 @@ struct iow : io_watcher, perl_watcher } }; +#define newSViw(iw) new_ref (iw->self, "urxvt::iw") +#define SvIW(sv) (iw *)(perl_watcher *)SvPTR (sv, "urxvt::iw") + +struct iw : perl_watcher, idle_watcher +{ + iw () + : idle_watcher (this, &iw::execute) + { + } + + void execute (idle_watcher &w) + { + invoke ("urxvt::iw", newSViw (this)); + } +}; + +#define newSVpw(pw) new_ref (pw->self, "urxvt::pw") +#define SvPW(sv) (pw *)(perl_watcher *)SvPTR (sv, "urxvt::pw") + +struct pw : perl_watcher, child_watcher +{ + pw () + : child_watcher (this, &pw::execute) + { + } + + void execute (child_watcher &w, int status) + { + invoke ("urxvt::pw", newSVpw (this), status); + } +}; + ///////////////////////////////////////////////////////////////////////////// #define SvOVERLAY(sv) (overlay *)SvPTR (sv, "urxvt::overlay") @@ -915,95 +950,6 @@ _new (...) void rxvt_term::destroy () -#if ENABLE_PERL_FRILLS - -void -rxvt_term::XListProperties (U32 window) - PPCODE: -{ - int count; - Atom *props = XListProperties (THIS->display->display, (Window)window, &count); - - EXTEND (SP, count); - while (count--) - PUSHs (newSVuv ((U32)props [count])); - - XFree (props); -} - -void -rxvt_term::XGetWindowProperty (U32 window, U32 property) - PPCODE: -{ - Atom type; - int format; - unsigned long nitems; - unsigned long bytes_after; - unsigned char *prop; - XGetWindowProperty (THIS->display->display, (Window)window, (Atom)property, - 0, 1<<30, 0, AnyPropertyType, - &type, &format, &nitems, &bytes_after, &prop); - if (type != None) - { - EXTEND (SP, 3); - PUSHs (newSVuv ((U32)type)); - PUSHs (newSViv (format)); - PUSHs (newSVpvn ((char *)prop, nitems * format / 8)); - XFree (prop); - } -} - -void -rxvt_term::XChangeWindowProperty (U32 window, U32 property, U32 type, int format, SV *data) - CODE: -{ - STRLEN len; - char *data_ = SvPVbyte (data, len); - - XChangeProperty (THIS->display->display, (Window)window, (Atom)property, - type, format, PropModeReplace, - (unsigned char *)data, len * 8 / format); -} - -void -rxvt_term::XDeleteProperty (U32 window, U32 property) - CODE: - XDeleteProperty (THIS->display->display, (Window)window, (Atom)property); - -U32 -rxvt_term::DefaultRootWindow () - CODE: - RETVAL = (U32)THIS->display->root; - OUTPUT: - RETVAL - -U32 -rxvt_term::XCreateSimpleWindow (U32 parent, int x, int y, unsigned int width, unsigned int height) - CODE: - RETVAL = XCreateSimpleWindow (THIS->display->display, (Window)parent, - x, y, width, height, 0, - THIS->pix_colors_focused[Color_border], - THIS->pix_colors_focused[Color_border]); - OUTPUT: - RETVAL - -void -rxvt_term::XReparentWindow (U32 window, U32 parent, int x = 0, int y = 0) - CODE: - XReparentWindow (THIS->display->display, (Window)window, (Window)parent, x, y); - -void -rxvt_term::XMapWindow (U32 window) - CODE: - XMapWindow (THIS->display->display, (Window)window); - -void -rxvt_term::XUnmapWindow (U32 window) - CODE: - XUnmapWindow (THIS->display->display, (Window)window); - -#endif - void rxvt_term::set_should_invoke (int htype, int inc) CODE: @@ -1017,7 +963,7 @@ rxvt_term::grab_button (int button, U32 modifiers) GrabModeSync, GrabModeSync, None, GRAB_CURSOR); bool -rxvt_term::grab (U32 eventtime, int sync = 0) +rxvt_term::grab (Time eventtime, int sync = 0) CODE: { int mode = sync ? GrabModeSync : GrabModeAsync; @@ -1202,17 +1148,17 @@ rxvt_term::pty_ev_events (int events = EVENT_UNDEF) OUTPUT: RETVAL -U32 +Window rxvt_term::parent () CODE: - RETVAL = (U32)THIS->parent [0]; + RETVAL = THIS->parent [0]; OUTPUT: RETVAL -U32 +Window rxvt_term::vt () CODE: - RETVAL = (U32)THIS->vt; + RETVAL = THIS->vt; OUTPUT: RETVAL @@ -1578,14 +1524,14 @@ rxvt_term::cur_charset () #rxvt_term::selection_clear () void -rxvt_term::selection_make (U32 eventtime, bool rect = false) +rxvt_term::selection_make (Time eventtime, bool rect = false) CODE: THIS->selection.op = SELECTION_CONT; THIS->selection.rect = rect; THIS->selection_make (eventtime); int -rxvt_term::selection_grab (U32 eventtime) +rxvt_term::selection_grab (Time eventtime) void rxvt_term::selection (SV *newtext = 0) @@ -1663,6 +1609,96 @@ rxvt_term::overlay (int x, int y, int w, int h, int rstyle = OVERLAY_RSTYLE, int OUTPUT: RETVAL +############################################################################# +# Various X Utility Functions +############################################################################# + +void +rxvt_term::XListProperties (Window window) + PPCODE: +{ + int count; + Atom *props = XListProperties (THIS->display->display, window, &count); + + EXTEND (SP, count); + while (count--) + PUSHs (newSVuv ((U32)props [count])); + + XFree (props); +} + +void +rxvt_term::XGetWindowProperty (Window window, Atom property) + PPCODE: +{ + Atom type; + int format; + unsigned long nitems; + unsigned long bytes_after; + unsigned char *prop; + XGetWindowProperty (THIS->display->display, window, property, + 0, 1<<30, 0, AnyPropertyType, + &type, &format, &nitems, &bytes_after, &prop); + if (type != None) + { + EXTEND (SP, 3); + PUSHs (newSVuv ((U32)type)); + PUSHs (newSViv (format)); + PUSHs (newSVpvn ((char *)prop, nitems * format / 8)); + XFree (prop); + } +} + +void +rxvt_term::XChangeWindowProperty (Window window, Atom property, Atom type, int format, SV *data) + CODE: +{ + STRLEN len; + char *data_ = SvPVbyte (data, len); + + XChangeProperty (THIS->display->display, window, property, + type, format, PropModeReplace, + (unsigned char *)data, len * 8 / format); +} + +void +XDeleteProperty (rxvt_term *term, Window window, Atom property) + C_ARGS: term->display->display, window, property + +Window +rxvt_term::DefaultRootWindow () + CODE: + RETVAL = THIS->display->root; + OUTPUT: + RETVAL + +Window +XCreateSimpleWindow (rxvt_term *term, Window parent, int x, int y, unsigned int width, unsigned int height) + C_ARGS: term->display->display, (Window)parent, + x, y, width, height, 0, + term->pix_colors_focused[Color_border], + term->pix_colors_focused[Color_border] + +void +XReparentWindow (rxvt_term *term, Window window, Window parent, int x = 0, int y = 0) + C_ARGS: term->display->display, window, parent, x, y + +void +XMapWindow (rxvt_term *term, Window window) + C_ARGS: term->display->display, window + +void +XUnmapWindow (rxvt_term *term, Window window) + C_ARGS: term->display->display, window + +void +XMoveResizeWindow (rxvt_term *term, Window window, int x, int y, unsigned int width, unsigned int height) + C_ARGS: term->display->display, (Window)window, x, y, width, height + +############################################################################# +# urxvt::overlay +############################################################################# + MODULE = urxvt PACKAGE = urxvt::overlay void @@ -1677,6 +1713,23 @@ overlay::hide () void overlay::DESTROY () +############################################################################# +# urxvt::watcher +############################################################################# + +MODULE = urxvt PACKAGE = urxvt::watcher + +CHAINED +perl_watcher::cb (SV *cb) + CODE: + THIS->cb (cb); + OUTPUT: + RETVAL + +############################################################################# +# urxvt::timer +############################################################################# + MODULE = urxvt PACKAGE = urxvt::timer SV * @@ -1684,19 +1737,11 @@ timer::new () CODE: timer *w = new timer; w->start (NOW); - RETVAL = newSVptr ((void *)w, "urxvt::timer"); + RETVAL = newSVptr ((void *)(perl_watcher *)w, "urxvt::timer"); w->self = (HV *)SvRV (RETVAL); OUTPUT: RETVAL -timer * -timer::cb (SV *cb) - CODE: - THIS->cb (cb); - RETVAL = THIS; - OUTPUT: - RETVAL - NV timer::at () CODE: @@ -1704,101 +1749,152 @@ timer::at () OUTPUT: RETVAL -timer * +CHAINED timer::interval (NV interval) CODE: THIS->interval = interval; - RETVAL = THIS; OUTPUT: RETVAL -timer * +CHAINED timer::set (NV tstamp) CODE: THIS->set (tstamp); - RETVAL = THIS; OUTPUT: RETVAL -timer * +CHAINED timer::start (NV tstamp = THIS->at) - CODE: + CODE: THIS->start (tstamp); - RETVAL = THIS; OUTPUT: RETVAL -timer * +CHAINED timer::after (NV delay) CODE: THIS->start (NOW + delay); - RETVAL = THIS; OUTPUT: RETVAL -timer * +CHAINED timer::stop () CODE: THIS->stop (); - RETVAL = THIS; OUTPUT: RETVAL void timer::DESTROY () +############################################################################# +# urxvt::iow +############################################################################# + MODULE = urxvt PACKAGE = urxvt::iow SV * iow::new () CODE: iow *w = new iow; - RETVAL = newSVptr ((void *)w, "urxvt::iow"); + RETVAL = newSVptr ((void *)(perl_watcher *)w, "urxvt::iow"); w->self = (HV *)SvRV (RETVAL); OUTPUT: RETVAL -iow * -iow::cb (SV *cb) - CODE: - THIS->cb (cb); - RETVAL = THIS; - OUTPUT: - RETVAL - -iow * +CHAINED iow::fd (int fd) CODE: THIS->fd = fd; - RETVAL = THIS; OUTPUT: RETVAL -iow * +CHAINED iow::events (short events) CODE: THIS->events = events; - RETVAL = THIS; OUTPUT: RETVAL -iow * +CHAINED iow::start () - CODE: + CODE: THIS->start (); - RETVAL = THIS; OUTPUT: RETVAL -iow * +CHAINED iow::stop () CODE: THIS->stop (); - RETVAL = THIS; OUTPUT: RETVAL void iow::DESTROY () +############################################################################# +# urxvt::iw +############################################################################# + +MODULE = urxvt PACKAGE = urxvt::iw + +SV * +iw::new () + CODE: + iw *w = new iw; + RETVAL = newSVptr ((void *)(perl_watcher *)w, "urxvt::iw"); + w->self = (HV *)SvRV (RETVAL); + OUTPUT: + RETVAL + +CHAINED +iow::start () + CODE: + THIS->start (); + OUTPUT: + RETVAL + +CHAINED +iow::stop () + CODE: + THIS->stop (); + OUTPUT: + RETVAL + +void +iw::DESTROY () + +############################################################################# +# urxvt::pw +############################################################################# + +MODULE = urxvt PACKAGE = urxvt::pw + +SV * +pw::new () + CODE: + pw *w = new pw; + RETVAL = newSVptr ((void *)(perl_watcher *)w, "urxvt::pw"); + w->self = (HV *)SvRV (RETVAL); + OUTPUT: + RETVAL + +CHAINED +pw::start (int pid) + CODE: + THIS->start (pid); + OUTPUT: + RETVAL + +CHAINED +iow::stop () + CODE: + THIS->stop (); + OUTPUT: + RETVAL + +void +pw::DESTROY () + diff --git a/src/screen.C b/src/screen.C index 37f3558e..7c63e125 100644 --- a/src/screen.C +++ b/src/screen.C @@ -117,7 +117,7 @@ inline void fill_text (text_t *start, text_t value, int len) /* Fill part/all of a line with blanks. */ void -rxvt_term::scr_blank_line (line_t &l, unsigned int col, unsigned int width, rend_t efs) const +rxvt_term::scr_blank_line (line_t &l, unsigned int col, unsigned int width, rend_t efs) const NOTHROW { if (!l.t) { @@ -144,7 +144,7 @@ rxvt_term::scr_blank_line (line_t &l, unsigned int col, unsigned int width, rend /* ------------------------------------------------------------------------- */ /* Fill a full line with blanks - make sure it is allocated first */ void -rxvt_term::scr_blank_screen_mem (line_t &l, rend_t efs) const +rxvt_term::scr_blank_screen_mem (line_t &l, rend_t efs) const NOTHROW { scr_blank_line (l, 0, ncol, efs); @@ -427,7 +427,7 @@ rxvt_term::scr_reset () * Free everything. That way malloc debugging can find leakage. */ void -rxvt_term::scr_release () +rxvt_term::scr_release () NOTHROW { delete talloc; talloc = 0; delete ralloc; ralloc = 0; @@ -445,7 +445,7 @@ rxvt_term::scr_release () * Hard reset */ void -rxvt_term::scr_poweron () +rxvt_term::scr_poweron () NOTHROW { scr_release (); prev_nrow = prev_ncol = 0; @@ -464,7 +464,7 @@ rxvt_term::scr_poweron () * XTERM_SEQ: Restore cursor: ESC 8 */ void -rxvt_term::scr_cursor (cursor_mode mode) +rxvt_term::scr_cursor (cursor_mode mode) NOTHROW { screen_t *s; @@ -513,7 +513,7 @@ rxvt_term::scr_cursor (cursor_mode mode) * XTERM_SEQ: Secondary screen: ESC [ ? 4 7 l */ int -rxvt_term::scr_change_screen (int scrn) +rxvt_term::scr_change_screen (int scrn) NOTHROW { want_refresh = 1; view_start = 0; @@ -554,7 +554,7 @@ rxvt_term::scr_change_screen (int scrn) // clear WrapNext indicator, solidifying position on next line void -rxvt_term::scr_do_wrap () +rxvt_term::scr_do_wrap () NOTHROW { if (!(screen.flags & Screen_WrapNext)) return; @@ -574,7 +574,7 @@ rxvt_term::scr_do_wrap () * Change the colour for following text */ void -rxvt_term::scr_color (unsigned int color, int fgbg) +rxvt_term::scr_color (unsigned int color, int fgbg) NOTHROW { if (!IN_RANGE_INC (color, minCOLOR, maxTermCOLOR)) color = fgbg; @@ -590,7 +590,7 @@ rxvt_term::scr_color (unsigned int color, int fgbg) * Change the rendition style for following text */ void -rxvt_term::scr_rendition (int set, int style) +rxvt_term::scr_rendition (int set, int style) NOTHROW { if (set) rstyle |= style; @@ -607,7 +607,7 @@ rxvt_term::scr_rendition (int set, int style) * count negative ==> scroll down */ int -rxvt_term::scr_scroll_text (int row1, int row2, int count) +rxvt_term::scr_scroll_text (int row1, int row2, int count) NOTHROW { if (count == 0 || (row1 > row2)) return 0; @@ -735,7 +735,7 @@ rxvt_term::scr_scroll_text (int row1, int row2, int count) * Add text given in of length to screen struct */ void -rxvt_term::scr_add_lines (const wchar_t *str, int len, int minlines) +rxvt_term::scr_add_lines (const wchar_t *str, int len, int minlines) NOTHROW { if (len <= 0) /* sanity */ return; @@ -999,7 +999,7 @@ rxvt_term::scr_add_lines (const wchar_t *str, int len, int minlines) * XTERM_SEQ: CTRL-H */ void -rxvt_term::scr_backspace () +rxvt_term::scr_backspace () NOTHROW { want_refresh = 1; @@ -1027,7 +1027,7 @@ rxvt_term::scr_backspace () * XTERM_SEQ: CTRL-I */ void -rxvt_term::scr_tab (int count, bool ht) +rxvt_term::scr_tab (int count, bool ht) NOTHROW { int i, x; @@ -1104,7 +1104,7 @@ rxvt_term::scr_tab (int count, bool ht) */ #if ENABLE_FRILLS void -rxvt_term::scr_backindex () +rxvt_term::scr_backindex () NOTHROW { if (screen.cur.col > 0) scr_gotorc (0, -1, R_RELATIVE | C_RELATIVE); @@ -1121,7 +1121,7 @@ rxvt_term::scr_backindex () */ #if ENABLE_FRILLS void -rxvt_term::scr_forwardindex () +rxvt_term::scr_forwardindex () NOTHROW { if (screen.cur.col < ncol - 1) scr_gotorc (0, 1, R_RELATIVE | C_RELATIVE); @@ -1144,7 +1144,7 @@ rxvt_term::scr_forwardindex () * Goto Row/Column */ void -rxvt_term::scr_gotorc (int row, int col, int relative) +rxvt_term::scr_gotorc (int row, int col, int relative) NOTHROW { want_refresh = 1; ZERO_SCROLLBACK (); @@ -1192,7 +1192,7 @@ rxvt_term::scr_gotorc (int row, int col, int relative) * direction should be UP or DN */ void -rxvt_term::scr_index (enum page_dirn direction) +rxvt_term::scr_index (enum page_dirn direction) NOTHROW { int dirn; @@ -1221,7 +1221,7 @@ rxvt_term::scr_index (enum page_dirn direction) * XTERM_SEQ: Clear whole line : ESC [ 2 K */ void -rxvt_term::scr_erase_line (int mode) +rxvt_term::scr_erase_line (int mode) NOTHROW { unsigned int col, num; @@ -1275,7 +1275,7 @@ rxvt_term::scr_erase_line (int mode) * XTERM_SEQ: Clear whole screen : ESC [ 2 J */ void -rxvt_term::scr_erase_screen (int mode) +rxvt_term::scr_erase_screen (int mode) NOTHROW { int num; int32_t row; @@ -1345,7 +1345,7 @@ rxvt_term::scr_erase_screen (int mode) #if ENABLE_FRILLS void -rxvt_term::scr_erase_savelines () +rxvt_term::scr_erase_savelines () NOTHROW { want_refresh = 1; ZERO_SCROLLBACK (); @@ -1360,7 +1360,7 @@ rxvt_term::scr_erase_savelines () * XTERM_SEQ: Screen Alignment Test: ESC # 8 */ void -rxvt_term::scr_E () +rxvt_term::scr_E () NOTHROW { rend_t fs; @@ -1391,7 +1391,7 @@ rxvt_term::scr_E () * Insert/Delete lines */ void -rxvt_term::scr_insdel_lines (int count, int insdel) +rxvt_term::scr_insdel_lines (int count, int insdel) NOTHROW { int end; @@ -1421,7 +1421,7 @@ rxvt_term::scr_insdel_lines (int count, int insdel) * Insert/Delete characters from the current position */ void -rxvt_term::scr_insdel_chars (int count, int insdel) +rxvt_term::scr_insdel_chars (int count, int insdel) NOTHROW { int col, row; rend_t tr; @@ -1519,7 +1519,7 @@ rxvt_term::scr_insdel_chars (int count, int insdel) * XTERM_SEQ: Set region - inclusive: ESC [ ; r */ void -rxvt_term::scr_scroll_region (int top, int bot) +rxvt_term::scr_scroll_region (int top, int bot) NOTHROW { max_it (top, 0); min_it (bot, nrow - 1); @@ -1539,7 +1539,7 @@ rxvt_term::scr_scroll_region (int top, int bot) * XTERM_SEQ: Make cursor invisible: ESC [ ? 25 l */ void -rxvt_term::scr_cursor_visible (int mode) +rxvt_term::scr_cursor_visible (int mode) NOTHROW { want_refresh = 1; @@ -1556,7 +1556,7 @@ rxvt_term::scr_cursor_visible (int mode) * XTERM_SEQ: Unset Wraparound: ESC [ ? 7 l */ void -rxvt_term::scr_autowrap (int mode) +rxvt_term::scr_autowrap (int mode) NOTHROW { if (mode) screen.flags |= Screen_Autowrap; @@ -1575,7 +1575,7 @@ rxvt_term::scr_autowrap (int mode) * XTERM_SEQ: Set Relative: ESC [ ? 6 l */ void -rxvt_term::scr_relative_origin (int mode) +rxvt_term::scr_relative_origin (int mode) NOTHROW { if (mode) screen.flags |= Screen_Relative; @@ -1592,7 +1592,7 @@ rxvt_term::scr_relative_origin (int mode) * XTERM_SEQ: Set Replace mode: ESC [ ? 4 l */ void -rxvt_term::scr_insert_mode (int mode) +rxvt_term::scr_insert_mode (int mode) NOTHROW { if (mode) screen.flags |= Screen_Insert; @@ -1608,7 +1608,7 @@ rxvt_term::scr_insert_mode (int mode) * XTERM_SEQ: Clear all tabs : ESC [ 3 g */ void -rxvt_term::scr_set_tab (int mode) +rxvt_term::scr_set_tab (int mode) NOTHROW { if (mode < 0) memset (tabs, 0, ncol * sizeof (char)); @@ -1623,7 +1623,7 @@ rxvt_term::scr_set_tab (int mode) * XTERM_SEQ: Normal video : ESC [ ? 5 l */ void -rxvt_term::scr_rvideo_mode (int mode) +rxvt_term::scr_rvideo_mode (int mode) NOTHROW { XGCValues gcvalue; @@ -1655,7 +1655,7 @@ rxvt_term::scr_rvideo_mode (int mode) * XTERM_SEQ: Report position: ESC [ 6 n */ void -rxvt_term::scr_report_position () +rxvt_term::scr_report_position () NOTHROW { tt_printf ("\033[%d;%dR", screen.cur.row + 1, screen.cur.col + 1); } @@ -1668,7 +1668,7 @@ rxvt_term::scr_report_position () * Set font style */ void -rxvt_term::set_font_style () +rxvt_term::set_font_style () NOTHROW { #if 0 switch (charsets [screen.charset]) @@ -1700,7 +1700,7 @@ rxvt_term::set_font_style () * XTERM_SEQ: Invoke G3 character set: ESC O */ void -rxvt_term::scr_charset_choose (int set) +rxvt_term::scr_charset_choose (int set) NOTHROW { screen.charset = set; set_font_style (); @@ -1716,7 +1716,7 @@ rxvt_term::scr_charset_choose (int set) * See set_font_style for possible values for */ void -rxvt_term::scr_charset_set (int set, unsigned int ch) +rxvt_term::scr_charset_set (int set, unsigned int ch) NOTHROW { charsets[set] = (unsigned char)ch; set_font_style (); @@ -1731,7 +1731,7 @@ rxvt_term::scr_charset_set (int set, unsigned int ch) * refresh matching text. */ bool -rxvt_term::scr_refresh_rend (rend_t mask, rend_t value) +rxvt_term::scr_refresh_rend (rend_t mask, rend_t value) NOTHROW { bool found = false; @@ -1761,7 +1761,7 @@ enum { }; void -rxvt_term::scr_expose (int x, int y, int ewidth, int eheight, bool refresh) +rxvt_term::scr_expose (int x, int y, int ewidth, int eheight, bool refresh) NOTHROW { int i; row_col_t rc[RC_COUNT]; @@ -1805,7 +1805,7 @@ rxvt_term::scr_expose (int x, int y, int ewidth, int eheight, bool refresh) * Refresh the entire screen */ void -rxvt_term::scr_touch (bool refresh) +rxvt_term::scr_touch (bool refresh) NOTHROW { scr_expose (0, 0, width, height, refresh); } @@ -1816,7 +1816,7 @@ rxvt_term::scr_touch (bool refresh) * the top of the screen */ void -rxvt_term::scr_move_to (int y, int len) +rxvt_term::scr_move_to (int y, int len) NOTHROW { scr_changeview ((top_row - nrow) * (len - y) / len + (nrow - 1)); } @@ -1827,7 +1827,7 @@ rxvt_term::scr_move_to (int y, int len) * direction should be UP or DN */ bool -rxvt_term::scr_page (enum page_dirn direction, int nlines) +rxvt_term::scr_page (enum page_dirn direction, int nlines) NOTHROW { int new_view_start = direction == UP ? view_start - nlines @@ -1837,7 +1837,7 @@ rxvt_term::scr_page (enum page_dirn direction, int nlines) } bool -rxvt_term::scr_changeview (int new_view_start) +rxvt_term::scr_changeview (int new_view_start) NOTHROW { clamp_it (new_view_start, top_row, 0); @@ -1855,7 +1855,7 @@ rxvt_term::scr_changeview (int new_view_start) /* ------------------------------------------------------------------------- */ void -rxvt_term::scr_bell () +rxvt_term::scr_bell () NOTHROW { #ifndef NO_BELL @@ -1882,7 +1882,7 @@ rxvt_term::scr_bell () /* ------------------------------------------------------------------------- */ /* ARGSUSED */ void -rxvt_term::scr_printscreen (int fullhist) +rxvt_term::scr_printscreen (int fullhist) NOTHROW { #ifdef PRINTPIPE int nrows, row_start; @@ -1941,7 +1941,7 @@ rxvt_term::scr_printscreen (int fullhist) * screen.text/screen.rend contain what the screen will change to. */ void -rxvt_term::scr_refresh () +rxvt_term::scr_refresh () NOTHROW { unsigned char must_clear, /* use draw_string not draw_image_string */ showcursor; /* show the cursor */ @@ -2392,7 +2392,7 @@ rxvt_term::scr_refresh () } void -rxvt_term::scr_remap_chars (line_t &l) +rxvt_term::scr_remap_chars (line_t &l) NOTHROW { if (!l.t) return; @@ -2404,7 +2404,7 @@ rxvt_term::scr_remap_chars (line_t &l) } void -rxvt_term::scr_remap_chars () +rxvt_term::scr_remap_chars () NOTHROW { for (int i = total_rows; i--; ) scr_remap_chars (row_buf [i]); @@ -2417,7 +2417,7 @@ rxvt_term::scr_remap_chars () } void -rxvt_term::scr_recolour () +rxvt_term::scr_recolour () NOTHROW { if (1 #if TRANSPARENT @@ -2448,7 +2448,7 @@ rxvt_term::scr_recolour () /* ------------------------------------------------------------------------- */ void -rxvt_term::scr_clear (bool really) +rxvt_term::scr_clear (bool really) NOTHROW { if (!mapped) return; @@ -2461,7 +2461,7 @@ rxvt_term::scr_clear (bool really) } void -rxvt_term::scr_xor_rect (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle1, rend_t rstyle2) +rxvt_term::scr_xor_rect (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle1, rend_t rstyle2) NOTHROW { int view_end = view_start + nrow; int row, col; @@ -2483,7 +2483,7 @@ rxvt_term::scr_xor_rect (int beg_row, int beg_col, int end_row, int end_col, ren } void -rxvt_term::scr_xor_span (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle) +rxvt_term::scr_xor_span (int beg_row, int beg_col, int end_row, int end_col, rend_t rstyle) NOTHROW { int view_end = view_start + nrow; int row, col; @@ -2510,7 +2510,7 @@ rxvt_term::scr_xor_span (int beg_row, int beg_col, int end_row, int end_col, ren /* ------------------------------------------------------------------------- */ void -rxvt_term::scr_reverse_selection () +rxvt_term::scr_reverse_selection () NOTHROW { if (selection.op && current_screen == selection.screen @@ -2536,7 +2536,7 @@ rxvt_term::scr_reverse_selection () */ #if 0 void -rxvt_term::scr_dump (int fd) +rxvt_term::scr_dump (int fd) NOTHROW { int row, wrote; unsigned int width, towrite; @@ -2565,7 +2565,7 @@ rxvt_term::scr_dump (int fd) * CHARACTER SELECTION * * ------------------------------------------------------------------------- */ void -rxvt_term::selection_check (int check_more) +rxvt_term::selection_check (int check_more) NOTHROW { row_col_t pos; @@ -2596,7 +2596,7 @@ rxvt_term::selection_check (int check_more) * Paste a selection direct to the command fd */ void -rxvt_term::paste (char *data, unsigned int len) +rxvt_term::paste (char *data, unsigned int len) NOTHROW { /* convert normal newline chars into common keyboard Return key sequence */ for (unsigned int i = 0; i < len; i++) @@ -2612,7 +2612,7 @@ rxvt_term::paste (char *data, unsigned int len) * EXT: SelectionNotify */ void -rxvt_term::selection_paste (Window win, Atom prop, bool delete_prop) +rxvt_term::selection_paste (Window win, Atom prop, bool delete_prop) NOTHROW { if (prop == None) /* check for failed XConvertSelection */ { @@ -2774,7 +2774,7 @@ bailout: } void -rxvt_term::incr_cb (time_watcher &w) +rxvt_term::incr_cb (time_watcher &w) NOTHROW { selection_wait = Sel_none; @@ -2785,7 +2785,7 @@ rxvt_term::incr_cb (time_watcher &w) } void -rxvt_term::selection_property (Window win, Atom prop) +rxvt_term::selection_property (Window win, Atom prop) NOTHROW { if (prop == None || selection_wait != Sel_incr) return; @@ -2804,7 +2804,7 @@ rxvt_term::selection_property (Window win, Atom prop) * EXT: button 2 release */ void -rxvt_term::selection_request (Time tm, int selnum) +rxvt_term::selection_request (Time tm, int selnum) NOTHROW { /* After making a selection with selection_make this function will always * return the internal selection, which is not correct IMO, now much more since @@ -2840,7 +2840,7 @@ rxvt_term::selection_request (Time tm, int selnum) } int -rxvt_term::selection_request_other (Atom target, int selnum) +rxvt_term::selection_request_other (Atom target, int selnum) NOTHROW { Atom sel; @@ -2869,7 +2869,7 @@ rxvt_term::selection_request_other (Atom target, int selnum) * EXT: SelectionClear */ void -rxvt_term::selection_clear () +rxvt_term::selection_clear () NOTHROW { want_refresh = 1; free (selection.text); @@ -3014,7 +3014,7 @@ rxvt_term::selection_make (Time tm) } bool -rxvt_term::selection_grab (Time tm) +rxvt_term::selection_grab (Time tm) NOTHROW { selection_time = tm; @@ -3047,7 +3047,7 @@ rxvt_term::selection_grab (Time tm) * EXT: button 1 press */ void -rxvt_term::selection_click (int clicks, int x, int y) +rxvt_term::selection_click (int clicks, int x, int y) NOTHROW { clicks = ((clicks - 1) % 3) + 1; selection.clicks = clicks; /* save clicks so extend will work */ @@ -3076,7 +3076,7 @@ rxvt_term::selection_click (int clicks, int x, int y) * Mark a selection at the specified col/row */ void -rxvt_term::selection_start_colrow (int col, int row) +rxvt_term::selection_start_colrow (int col, int row) NOTHROW { want_refresh = 1; @@ -3112,7 +3112,7 @@ rxvt_term::selection_start_colrow (int col, int row) #define DELIMIT_REND(x) 1 void -rxvt_term::selection_delimit_word (enum page_dirn dirn, const row_col_t *mark, row_col_t *ret) +rxvt_term::selection_delimit_word (enum page_dirn dirn, const row_col_t *mark, row_col_t *ret) NOTHROW { int col, row, dirnadd, tcol, trow, w1, w2; row_col_t bound; @@ -3196,7 +3196,7 @@ rxvt_term::selection_delimit_word (enum page_dirn dirn, const row_col_t *mark, r * flag == 2 ==> button 3 motion */ void -rxvt_term::selection_extend (int x, int y, int flag) +rxvt_term::selection_extend (int x, int y, int flag) NOTHROW { int col = clamp (Pixel2Col (x), 0, ncol); int row = clamp (Pixel2Row (y), 0, nrow - 1); @@ -3232,7 +3232,7 @@ rxvt_term::selection_extend (int x, int y, int flag) * Extend the selection to the specified col/row */ void -rxvt_term::selection_extend_colrow (int32_t col, int32_t row, int button3, int buttonpress, int clickchange) +rxvt_term::selection_extend_colrow (int32_t col, int32_t row, int button3, int buttonpress, int clickchange) NOTHROW { row_col_t pos; enum { @@ -3428,7 +3428,7 @@ rxvt_term::selection_extend_colrow (int32_t col, int32_t row, int button3, int b #if ENABLE_FRILLS void -rxvt_term::selection_remove_trailing_spaces () +rxvt_term::selection_remove_trailing_spaces () NOTHROW { int32_t end_col, end_row; text_t *stp; @@ -3476,7 +3476,7 @@ rxvt_term::selection_remove_trailing_spaces () * EXT: button 3 double click */ void -rxvt_term::selection_rotate (int x, int y) +rxvt_term::selection_rotate (int x, int y) NOTHROW { selection.clicks = selection.clicks % 3 + 1; selection_extend_colrow (Pixel2Col (x), Pixel2Row (y), 1, 0, 1); @@ -3488,7 +3488,7 @@ rxvt_term::selection_rotate (int x, int y) * EXT: SelectionRequest */ void -rxvt_term::selection_send (const XSelectionRequestEvent &rq) +rxvt_term::selection_send (const XSelectionRequestEvent &rq) NOTHROW { XSelectionEvent ev; dDisp; @@ -3626,7 +3626,7 @@ rxvt_term::selection_send (const XSelectionRequestEvent &rq) * return col/row values corresponding to x/y pixel values */ void -rxvt_term::pixel_position (int *x, int *y) +rxvt_term::pixel_position (int *x, int *y) NOTHROW { *x = Pixel2Col (*x); /* max_it (*x, 0); min_it (*x, (int)ncol - 1); */ @@ -3637,7 +3637,7 @@ rxvt_term::pixel_position (int *x, int *y) /* ------------------------------------------------------------------------- */ #ifdef USE_XIM void -rxvt_term::im_set_position (XPoint &pos) +rxvt_term::im_set_position (XPoint &pos) NOTHROW { XWindowAttributes xwa; @@ -3650,7 +3650,7 @@ rxvt_term::im_set_position (XPoint &pos) #if ENABLE_OVERLAY void -rxvt_term::scr_overlay_new (int x, int y, int w, int h) +rxvt_term::scr_overlay_new (int x, int y, int w, int h) NOTHROW { if (nrow < 1 || ncol < 1) return; @@ -3705,7 +3705,7 @@ rxvt_term::scr_overlay_new (int x, int y, int w, int h) } void -rxvt_term::scr_overlay_off () +rxvt_term::scr_overlay_off () NOTHROW { if (!ov_text) return; @@ -3723,7 +3723,7 @@ rxvt_term::scr_overlay_off () } void -rxvt_term::scr_overlay_set (int x, int y, text_t text, rend_t rend) +rxvt_term::scr_overlay_set (int x, int y, text_t text, rend_t rend) NOTHROW { if (!ov_text || x >= ov_w - 2 || y >= ov_h - 2) return; @@ -3735,14 +3735,14 @@ rxvt_term::scr_overlay_set (int x, int y, text_t text, rend_t rend) } void -rxvt_term::scr_overlay_set (int x, int y, const char *s) +rxvt_term::scr_overlay_set (int x, int y, const char *s) NOTHROW { while (*s) scr_overlay_set (x++, y, *s++); } void -rxvt_term::scr_overlay_set (int x, int y, const wchar_t *s) +rxvt_term::scr_overlay_set (int x, int y, const wchar_t *s) NOTHROW { while (*s) { @@ -3758,7 +3758,7 @@ rxvt_term::scr_overlay_set (int x, int y, const wchar_t *s) } void -rxvt_term::scr_swap_overlay () +rxvt_term::scr_swap_overlay () NOTHROW { if (!ov_text) return; diff --git a/src/typemap b/src/typemap index 23799ae8..2344c719 100644 --- a/src/typemap +++ b/src/typemap @@ -1,22 +1,50 @@ rxvt_term * T_TERM + +perl_watcher * T_WATCHER timer * T_TIMER iow * T_IOW +pw * T_PW +iw * T_IW + overlay * T_OVERLAY +Time T_UV +Atom T_UV +Window T_UV + +CHAINED T_CHAINED + + INPUT + T_TERM $var = SvTERM ($arg); +T_WATCHER + $var = SvWATCHER ($arg); T_TIMER $var = SvTIMER ($arg); T_IOW $var = SvIOW ($arg); +T_PW + $var = SvPW ($arg); +T_IW + $var = SvIW ($arg); T_OVERLAY $var = SvOVERLAY ($arg); + OUTPUT + T_TERM $arg = newSVterm ($var); T_TIMER $arg = newSVtimer ($var); T_IOW $arg = newSViow ($var); +T_PW + $arg = newSVpw ($var); +T_IW + $arg = newSViw ($var); +T_CHAINED + $arg = newSVsv (ST(0)); + diff --git a/src/urxvt.pm b/src/urxvt.pm index 6b7aeaf5..de9d4e98 100644 --- a/src/urxvt.pm +++ b/src/urxvt.pm @@ -325,7 +325,13 @@ place. =item on_start $term Called at the very end of initialisation of a new terminal, just before -returning to the mainloop. +trying to map (display) the toplevel and returning to the mainloop. + +=item on_destroy $term + +Called whenever something tries to destroy terminal, before doing anything +yet. If this hook returns true, then destruction is skipped, but this is +rarely a good idea. =item on_reset $term @@ -501,6 +507,8 @@ use List::Util (); our $VERSION = 1; our $TERM; +our @TERM_INIT; +our @TERM_EXT; our @HOOKNAME; our %HOOKTYPE = map +($HOOKNAME[$_] => $_), 0..$#HOOKNAME; our %OPTION; @@ -532,6 +540,22 @@ The basename of the installed binaries, usually C. The current terminal. This variable stores the current C object, whenever a callback/hook is executing. +=item @urxvt::TERM_INIT + +All coderefs in this array will be called as methods of the next newly +created C object (during the C phase). The array +gets cleared before the codereferences that were in it are being executed, +so coderefs can push themselves onto it again if they so desire. + +This complements to the perl-eval commandline option, but gets executed +first. + +=item @urxvt::TERM_EXT + +Works similar to C<@TERM_INIT>, but contains perl package/class names, which +get registered as normal extensions after calling the hooks in C<@TERM_INIT> +but before other extensions. Gets cleared just like C<@TERM_INIT>. + =back =head2 Functions in the C Package @@ -662,8 +686,6 @@ my %extension_pkg; sub extension_package($) { my ($path) = @_; - no strict 'refs'; - $extension_pkg{$path} ||= do { $path =~ /([^\/\\]+)$/; my $pkg = $1; @@ -675,8 +697,6 @@ sub extension_package($) { open my $fh, "<:raw", $path or die "$path: $!"; - @{"$pkg\::ISA"} = urxvt::term::extension::; - my $source = "package $pkg; use strict; use utf8;\n" . "#line 1 \"$path\"\n{\n" @@ -702,7 +722,16 @@ sub invoke { my %ext_arg; - for (map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2) { + { + my @init = @TERM_INIT; + @TERM_INIT = (); + $_->($TERM) for @init; + my @pkg = @TERM_EXT; + @TERM_EXT = (); + $TERM->register_package ($_) for @pkg; + } + + for (grep $_, map { split /,/, $TERM->resource ("perl_ext_$_") } 1, 2) { if ($_ eq "default") { $ext_arg{$_} ||= [] for qw(selection option-popup selection-popup searchable-scrollback); } elsif (/^-(.*)$/) { @@ -737,7 +766,8 @@ sub invoke { keys %$cb; while (my ($pkg, $cb) = each %$cb) { - $retval ||= eval { $cb->($TERM->{_pkg}{$pkg}, @_) }; + my $retval_ = eval { $cb->($TERM->{_pkg}{$pkg}, @_) }; + $retval ||= $retval_; if ($@) { $TERM->ungrab; # better to lose the grab than the session @@ -906,6 +936,12 @@ package urxvt::term; sub register_package { my ($self, $pkg, $argv) = @_; + no strict 'refs'; + + urxvt::verbose 6, "register package $pkg to $self"; + + @{"$pkg\::ISA"} = urxvt::term::extension::; + my $proxy = bless { _pkg => $pkg, argv => $argv, @@ -1641,6 +1677,15 @@ sub DESTROY { =back +=cut + +package urxvt::watcher; + +@urxvt::timer::ISA = __PACKAGE__; +@urxvt::iow::ISA = __PACKAGE__; +@urxvt::pw::ISA = __PACKAGE__; +@urxvt::iw::ISA = __PACKAGE__; + =head2 The C Class This class implements timer watchers/events. Time is represented as a diff --git a/src/xdefaults.C b/src/xdefaults.C index 645a5cec..f6ee7e5d 100644 --- a/src/xdefaults.C +++ b/src/xdefaults.C @@ -596,12 +596,12 @@ rxvt_term::get_options (int argc, const char *const *argv) */ /* ARGSUSED */ int -rxvt_define_key (XrmDatabase *database __attribute__((unused)), - XrmBindingList bindings __attribute__((unused)), +rxvt_define_key (XrmDatabase *database UNUSED, + XrmBindingList bindings UNUSED, XrmQuarkList quarks, - XrmRepresentation *type __attribute__((unused)), + XrmRepresentation *type UNUSED, XrmValue *value, - XPointer closure __attribute__((unused))) + XPointer closure UNUSED) { int last; -- 2.34.1