*** empty log message ***
authorroot <root>
Fri, 20 Jan 2006 10:27:08 +0000 (10:27 +0000)
committerroot <root>
Fri, 20 Jan 2006 10:27:08 +0000 (10:27 +0000)
16 files changed:
configure
configure.ac
reconf
src/command.C
src/feature.h
src/iom_conf.h
src/main.C
src/misc.C
src/perl/option-popup
src/perl/selection-popup
src/rxvt.h
src/rxvtperl.xs
src/screen.C
src/typemap
src/urxvt.pm
src/xdefaults.C

index 3ed7894..b9835b5 100755 (executable)
--- a/configure
+++ b/configure
@@ -309,7 +309,7 @@ ac_includes_default="\
 # include <unistd.h>
 #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 <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> 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 <limits.h>
-#else
-# include <assert.h>
-#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 <ac_nonexistent.h>
-_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 <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> 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 <limits.h>
-#else
-# include <assert.h>
-#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 <ac_nonexistent.h>
-_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 <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> 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 <limits.h>
+#else
+# include <assert.h>
+#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 <ac_nonexistent.h>
+_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 <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> 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 <limits.h>
+#else
+# include <assert.h>
+#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 <ac_nonexistent.h>
+_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
index 6bb9179..792f935 100644 (file)
@@ -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 9a3eec9..9a619b3 100755 (executable)
--- 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 \
index 5a0ab75..fd8a4d9 100644 (file)
@@ -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;
index 0d842cf..7438f18 100644 (file)
  */
 
 /*
+ * 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)
  */
 /* #define NO_CURSORCOLOR */
index 3729950..91c65cc 100644 (file)
@@ -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
index c45e752..d52b140 100644 (file)
 
 vector<rxvt_term *> 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) -----------------------*/
index 0cb2012..48c953d 100644 (file)
@@ -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;
index 4ac50ca..151d8ec 100644 (file)
@@ -4,6 +4,8 @@ sub on_start {
    my ($self) = @_;
 
    $self->grab_button (2, urxvt::ControlMask);
+
+   ()
 }
 
 sub on_button_press {
index 2db8a90..b71b240 100644 (file)
@@ -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);
index c090b81..3c9adae 100644 (file)
@@ -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<void, const char *> log_callback;
 typedef callback1<int, int> 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<void *> 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
index 7b8ad6e..84f4220 100644 (file)
@@ -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 ()
+
 
index 37f3558..7c63e12 100644 (file)
@@ -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 <str> of length <len> 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 <count> 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 <count> 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 <top> - <bot> inclusive: ESC [ <top> ; <bot> 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 <C>
  */
 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;
index 23799ae..2344c71 100644 (file)
@@ -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));
+
index 6b7aeaf..de9d4e9 100644 (file)
@@ -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<urxvt>.
 The current terminal. This variable stores the current C<urxvt::term>
 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<urxvt::term> object (during the C<on_init> 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<urxvt> 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<urxvt::timer> Class
 
 This class implements timer watchers/events. Time is represented as a
index 645a5ce..f6ee7e5 100644 (file)
@@ -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;