view src/make-src-depend @ 1268:fffe735e63ee

[xemacs-hg @ 2003-02-07 11:50:50 by ben] fixes for menu crashes + better preemption behavior This contains two related changes: (1) Fix problems with reentrant calling of lwlib and associated crashes when selecting menu items. (2) Improve redisplay handling of preemption. Turn on lazy lock and hold down page-down or page-up and you'll see what I mean. They are related because they both touch on the code that retrieves events and handles the internal queues. console-msw.h, event-msw.c, event-stream.c, events.h, menubar-msw.c, menubar-x.c, menubar.h: mswindows_protect_modal_loop() has been generalized to event_stream_protect_modal_loop(), and moved to event-stream.c. mswindows_in_modal_loop ->in_modal_loop likewise. Changes in event-msw.c and menubar-msw.c for the new names and calling format (use structures instead of static variables in menubar-msw.c). Delete former in_menu_callback and use in_modal_loop in its place. Remove emacs_mswindows_quit_check_disallowed_p(), superseded by in_modal_loop. Use event_stream_protect_modal_loop() in pre_activate_callback() so that we get no lwlib reentrancy. Rearrange some of the code in event-msw.c to be grouped better. Make mswindows_drain_windows_queue() respect in_modal_loop and do nothing if so. cmdloop.c, event-stream.c: Don't conditionalize on LWLIB_MENUBARS_LUCID when giving error when in_modal_loop, and give better error. event-Xt.c, event-gtk.c: If in_modal_loop, only retrieve process and timeout events. Don't retrieve any X events because processing them can lead to reentrancy in lwlib -> death. event-stream.c: Remove unused parameter to check_event_stream_ok() and change all callers. lisp.h, event-stream.c: Rearrange some functions for increased clarity -- in particular, group all the input-pending/QUIT-related stuff together, and put right next to next-event stuff, to which it's related. Add the concept of "HOW_MANY" -- when asking whether user input is pending, you can ask if at least HOW_MANY events are pending, not just if any are. Add parameter to detect_input_pending() for this. Change recursive_sit_for from a Lisp_Object (which could only be Qt or Qnil) to an int, like it should be. event-Xt.c, event-gtk.c, event-xlike-inc.c: New file. Abstract out similar code in event_{Xt/gtk}_pending_p() and write only once, using include-file tricks. Rewrite this function to implement HOW_MANY and only process events when not in_modal_loop. event-msw.c: Implement HOW_MANY and only process events when not in_modal_loop. event-tty.c: Implement HOW_MANY. redisplay.c: Add var `max-preempts' to control maximum number of preempts. (#### perhaps not useful) Rewrite preemption check so that, rather than preempting when any user events are available, only preempt when a certain number (currently 4) of them are backed up. This effectively allows redisplay to proceed to completion in the presence of a fast auto-repeat (usually the auto-repeating is generated dynamically as necessary), and you get much better display behavior with lazy-lock active. event-unixoid.c: Comment changes. event-stream.c: Rewrite discard-input much more simply and safely using the drain-queue functions. I think the old version might loop forever if called when in_modal_loop. SEMI-UNRELATED CHANGES: ----------------------- event-stream.c: Turn QUIT-checking back on when running the pre-idle hook so it can be quit out of. indent.c: Document exact functioning of `vertical-motion' better, and its differences from GNU Emacs.
author ben
date Fri, 07 Feb 2003 11:50:54 +0000
parents 0784d089fdc9
children f99d3d25df86
line wrap: on
line source

: #-*- Perl -*-
# Copyright (C) 1998 Free Software Foundation, Inc.

# This file is part of XEmacs.
#
# XEmacs is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2, or (at your option) any
# later version.
#
# XEmacs is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License
# along with XEmacs; see the file COPYING.  If not, write to
# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.

# Author: Martin Buchholz
eval 'exec perl -w -S $0 ${1+"$@"}'
  if 0;

use strict;
my ($myName, $srcdir, %exists, %uses, %generated_header);

($myName = $0) =~ s@.*/@@; my $usage ="
Usage: $myName

Generates Makefile dependencies for the XEmacs src directory.
The dependencies are written to stdout.\n";

die $usage if @ARGV;

($srcdir = $0) =~ s@[^/]+$@@;
$srcdir = "." if $srcdir eq "";
chdir $srcdir or die "$srcdir: $!";

opendir SRCDIR, "." or die "$srcdir: $!";
for (grep (/\.[ch]$/, readdir (SRCDIR))) { $exists{$_} = 1; }
closedir SRCDIR;

for (qw (config.h sheap-adjust.h paths.h Emacs.ad.h)) {
  $generated_header{$_} = 1;
}

# Although this is not technically true, it ought to be true,
# and makes the generated Makefile smaller.
$uses{'lisp.h'}{'config.h'} = 1;

for my $file (keys %exists) {
  open (FILE, $file) or die "$file: $!";
  undef $/; $_ = <FILE>;
  RemoveComments ($_);
  s/[ \t]+//g;
  # Find include dependencies
  for (/^\#include([^\n]+)/gm) {
    if (m@^\"([A-Za-z0-9._-]+\.[ch])\"@) {
      $uses{$file}{$1} = 1 if exists $exists{$1};
    } elsif (m@<([A-Za-z0-9._-]+\.h)>@) {
      $uses{$file}{$1} = 1 if exists $generated_header{$1};
    } elsif (m@\"../lwlib/([A-Za-z0-9._-]+\.h)\"@) {
      $uses{$file}{"\$(LWLIB_SRCDIR)/lwlib.h"} = 1;
    }
  }
}

# Make transitive closure of %uses
while (1) {
  my $changedP = 0;
  for my $x (keys %uses) {
    for my $y (keys %{$uses{$x}}) {
      for my $z (keys %{$uses{$y}}) {
	if (! exists $uses{$x}{$z}) {
	  $uses{$x}{$z} = 1;
	  $changedP = 1;
	}
      }
    }
  }
  last if !$changedP;
}

# Print file header
print
"## This file is automatically generated by \`$myName'.  Do not modify.

#if defined(USE_UNION_TYPE)
LISP_UNION_H=lisp-union.h
#else
LISP_UNION_H=lisp-disunion.h
#endif
";

my @LISP_H = ('lisp.h', sort keys %{$uses{'lisp.h'}});
print "LISP_H=@{[grep (!/lisp-(dis)?union\.h/, @LISP_H)]} \$(LISP_UNION_H)\n";

sub PrintDeps {
  my $file = shift;
  my $ofile = $file; $ofile =~ s/c$/o/; print "$ofile: ";
  if (exists $uses{$file}{'lisp.h'}) {
    delete @{%{$uses{$file}}}{@LISP_H};
    $uses{$file}{'$(LISP_H)'} = 1;
  }
  print "@{[sort keys %{$uses{$file}}]}\n";
}

sub PrintPatternDeps {
  my ($pattern, $CPP_SYMBOL) = @_;
  print "#if defined($CPP_SYMBOL)\n";
  for my $file (sort grep (/$pattern/ && /\.c$/, keys %uses)) {
    PrintDeps($file);
    delete $uses{$file};
  }
  print "#endif\n";
}

PrintPatternDeps ('-msw\\.',   "HAVE_MS_WINDOWS");
PrintPatternDeps ('-x\\.',     "HAVE_X_WINDOWS");
PrintPatternDeps ('-tty\\.',   "HAVE_TTY");
PrintPatternDeps ('-gtk\\.',   "HAVE_GTK");
PrintPatternDeps ('^database', "HAVE_DATABASE");
PrintPatternDeps ('^mule',     "MULE");
PrintPatternDeps ('^(?:External|extw-)', "EXTERNAL_WIDGET");

for my $file (sort grep (/\.c$/, keys %uses)) { PrintDeps($file); }

# Surprisingly robust regexp to remove comments from arbitrary C code
sub RemoveComments {
  $_[0] =~
    s{ (
	[^\"\'/]+ |
	(?:\"[^\"\\]*(?:\\.[^\"\\]*)*\" [^\"\'/]*)+ |
	(?:\'[^\'\\]*(?:\\.[^\'\\]*)*\' [^\"\'/]*)+
       )
       | / (?:
	    \*[^*]*\*+(?:[^/*][^*]*\*+)*/
	    |
	    /[^\n]*
	   )
     }{defined $1 ? $1 : ""}gsxeo;
}