annotate src/event-gtk.c @ 665:fdefd0186b75

[xemacs-hg @ 2001-09-20 06:28:42 by ben] The great integral types renaming. The purpose of this is to rationalize the names used for various integral types, so that they match their intended uses and follow consist conventions, and eliminate types that were not semantically different from each other. The conventions are: -- All integral types that measure quantities of anything are signed. Some people disagree vociferously with this, but their arguments are mostly theoretical, and are vastly outweighed by the practical headaches of mixing signed and unsigned values, and more importantly by the far increased likelihood of inadvertent bugs: Because of the broken "viral" nature of unsigned quantities in C (operations involving mixed signed/unsigned are done unsigned, when exactly the opposite is nearly always wanted), even a single error in declaring a quantity unsigned that should be signed, or even the even more subtle error of comparing signed and unsigned values and forgetting the necessary cast, can be catastrophic, as comparisons will yield wrong results. -Wsign-compare is turned on specifically to catch this, but this tends to result in a great number of warnings when mixing signed and unsigned, and the casts are annoying. More has been written on this elsewhere. -- All such quantity types just mentioned boil down to EMACS_INT, which is 32 bits on 32-bit machines and 64 bits on 64-bit machines. This is guaranteed to be the same size as Lisp objects of type `int', and (as far as I can tell) of size_t (unsigned!) and ssize_t. The only type below that is not an EMACS_INT is Hashcode, which is an unsigned value of the same size as EMACS_INT. -- Type names should be relatively short (no more than 10 characters or so), with the first letter capitalized and no underscores if they can at all be avoided. -- "count" == a zero-based measurement of some quantity. Includes sizes, offsets, and indexes. -- "bpos" == a one-based measurement of a position in a buffer. "Charbpos" and "Bytebpos" count text in the buffer, rather than bytes in memory; thus Bytebpos does not directly correspond to the memory representation. Use "Membpos" for this. -- "Char" refers to internal-format characters, not to the C type "char", which is really a byte. -- For the actual name changes, see the script below. I ran the following script to do the conversion. (NOTE: This script is idempotent. You can safely run it multiple times and it will not screw up previous results -- in fact, it will do nothing if nothing has changed. Thus, it can be run repeatedly as necessary to handle patches coming in from old workspaces, or old branches.) There are two tags, just before and just after the change: `pre-integral-type-rename' and `post-integral-type-rename'. When merging code from the main trunk into a branch, the best thing to do is first merge up to `pre-integral-type-rename', then apply the script and associated changes, then merge from `post-integral-type-change' to the present. (Alternatively, just do the merging in one operation; but you may then have a lot of conflicts needing to be resolved by hand.) Script `fixtypes.sh' follows: ----------------------------------- cut ------------------------------------ files="*.[ch] s/*.h m/*.h config.h.in ../configure.in Makefile.in.in ../lib-src/*.[ch] ../lwlib/*.[ch]" gr Memory_Count Bytecount $files gr Lstream_Data_Count Bytecount $files gr Element_Count Elemcount $files gr Hash_Code Hashcode $files gr extcount bytecount $files gr bufpos charbpos $files gr bytind bytebpos $files gr memind membpos $files gr bufbyte intbyte $files gr Extcount Bytecount $files gr Bufpos Charbpos $files gr Bytind Bytebpos $files gr Memind Membpos $files gr Bufbyte Intbyte $files gr EXTCOUNT BYTECOUNT $files gr BUFPOS CHARBPOS $files gr BYTIND BYTEBPOS $files gr MEMIND MEMBPOS $files gr BUFBYTE INTBYTE $files gr MEMORY_COUNT BYTECOUNT $files gr LSTREAM_DATA_COUNT BYTECOUNT $files gr ELEMENT_COUNT ELEMCOUNT $files gr HASH_CODE HASHCODE $files ----------------------------------- cut ------------------------------------ `fixtypes.sh' is a Bourne-shell script; it uses 'gr': ----------------------------------- cut ------------------------------------ #!/bin/sh # Usage is like this: # gr FROM TO FILES ... # globally replace FROM with TO in FILES. FROM and TO are regular expressions. # backup files are stored in the `backup' directory. from="$1" to="$2" shift 2 echo ${1+"$@"} | xargs global-replace "s/$from/$to/g" ----------------------------------- cut ------------------------------------ `gr' in turn uses a Perl script to do its real work, `global-replace', which follows: ----------------------------------- cut ------------------------------------ : #-*- Perl -*- ### global-modify --- modify the contents of a file by a Perl expression ## Copyright (C) 1999 Martin Buchholz. ## Copyright (C) 2001 Ben Wing. ## Authors: Martin Buchholz <martin@xemacs.org>, Ben Wing <ben@xemacs.org> ## Maintainer: Ben Wing <ben@xemacs.org> ## Current Version: 1.0, May 5, 2001 # This program 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. # # This program 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. eval 'exec perl -w -S $0 ${1+"$@"}' if 0; use strict; use FileHandle; use Carp; use Getopt::Long; use File::Basename; (my $myName = $0) =~ s@.*/@@; my $usage=" Usage: $myName [--help] [--backup-dir=DIR] [--line-mode] [--hunk-mode] PERLEXPR FILE ... Globally modify a file, either line by line or in one big hunk. Typical usage is like this: [with GNU print, GNU xargs: guaranteed to handle spaces, quotes, etc. in file names] find . -name '*.[ch]' -print0 | xargs -0 $0 's/\bCONST\b/const/g'\n [with non-GNU print, xargs] find . -name '*.[ch]' -print | xargs $0 's/\bCONST\b/const/g'\n The file is read in, either line by line (with --line-mode specified) or in one big hunk (with --hunk-mode specified; it's the default), and the Perl expression is then evalled with \$_ set to the line or hunk of text, including the terminating newline if there is one. It should destructively modify the value there, storing the changed result in \$_. Files in which any modifications are made are backed up to the directory specified using --backup-dir, or to `backup' by default. To disable this, use --backup-dir= with no argument. Hunk mode is the default because it is MUCH MUCH faster than line-by-line. Use line-by-line only when it matters, e.g. you want to do a replacement only once per line (the default without the `g' argument). Conversely, when using hunk mode, *ALWAYS* use `g'; otherwise, you will only make one replacement in the entire file! "; my %options = (); $Getopt::Long::ignorecase = 0; &GetOptions ( \%options, 'help', 'backup-dir=s', 'line-mode', 'hunk-mode', ); die $usage if $options{"help"} or @ARGV <= 1; my $code = shift; die $usage if grep (-d || ! -w, @ARGV); sub SafeOpen { open ((my $fh = new FileHandle), $_[0]); confess "Can't open $_[0]: $!" if ! defined $fh; return $fh; } sub SafeClose { close $_[0] or confess "Can't close $_[0]: $!"; } sub FileContents { my $fh = SafeOpen ("< $_[0]"); my $olddollarslash = $/; local $/ = undef; my $contents = <$fh>; $/ = $olddollarslash; return $contents; } sub WriteStringToFile { my $fh = SafeOpen ("> $_[0]"); binmode $fh; print $fh $_[1] or confess "$_[0]: $!\n"; SafeClose $fh; } foreach my $file (@ARGV) { my $changed_p = 0; my $new_contents = ""; if ($options{"line-mode"}) { my $fh = SafeOpen $file; while (<$fh>) { my $save_line = $_; eval $code; $changed_p = 1 if $save_line ne $_; $new_contents .= $_; } } else { my $orig_contents = $_ = FileContents $file; eval $code; if ($_ ne $orig_contents) { $changed_p = 1; $new_contents = $_; } } if ($changed_p) { my $backdir = $options{"backup-dir"}; $backdir = "backup" if !defined ($backdir); if ($backdir) { my ($name, $path, $suffix) = fileparse ($file, ""); my $backfulldir = $path . $backdir; my $backfile = "$backfulldir/$name"; mkdir $backfulldir, 0755 unless -d $backfulldir; print "modifying $file (original saved in $backfile)\n"; rename $file, $backfile; } WriteStringToFile ($file, $new_contents); } } ----------------------------------- cut ------------------------------------ In addition to those programs, I needed to fix up a few other things, particularly relating to the duplicate definitions of types, now that some types merged with others. Specifically: 1. in lisp.h, removed duplicate declarations of Bytecount. The changed code should now look like this: (In each code snippet below, the first and last lines are the same as the original, as are all lines outside of those lines. That allows you to locate the section to be replaced, and replace the stuff in that section, verifying that there isn't anything new added that would need to be kept.) --------------------------------- snip ------------------------------------- /* Counts of bytes or chars */ typedef EMACS_INT Bytecount; typedef EMACS_INT Charcount; /* Counts of elements */ typedef EMACS_INT Elemcount; /* Hash codes */ typedef unsigned long Hashcode; /* ------------------------ dynamic arrays ------------------- */ --------------------------------- snip ------------------------------------- 2. in lstream.h, removed duplicate declaration of Bytecount. Rewrote the comment about this type. The changed code should now look like this: --------------------------------- snip ------------------------------------- #endif /* The have been some arguments over the what the type should be that specifies a count of bytes in a data block to be written out or read in, using Lstream_read(), Lstream_write(), and related functions. Originally it was long, which worked fine; Martin "corrected" these to size_t and ssize_t on the grounds that this is theoretically cleaner and is in keeping with the C standards. Unfortunately, this practice is horribly error-prone due to design flaws in the way that mixed signed/unsigned arithmetic happens. In fact, by doing this change, Martin introduced a subtle but fatal error that caused the operation of sending large mail messages to the SMTP server under Windows to fail. By putting all values back to be signed, avoiding any signed/unsigned mixing, the bug immediately went away. The type then in use was Lstream_Data_Count, so that it be reverted cleanly if a vote came to that. Now it is Bytecount. Some earlier comments about why the type must be signed: This MUST BE SIGNED, since it also is used in functions that return the number of bytes actually read to or written from in an operation, and these functions can return -1 to signal error. Note that the standard Unix read() and write() functions define the count going in as a size_t, which is UNSIGNED, and the count going out as an ssize_t, which is SIGNED. This is a horrible design flaw. Not only is it highly likely to lead to logic errors when a -1 gets interpreted as a large positive number, but operations are bound to fail in all sorts of horrible ways when a number in the upper-half of the size_t range is passed in -- this number is unrepresentable as an ssize_t, so code that checks to see how many bytes are actually written (which is mandatory if you are dealing with certain types of devices) will get completely screwed up. --ben */ typedef enum lstream_buffering --------------------------------- snip ------------------------------------- 3. in dumper.c, there are four places, all inside of switch() statements, where XD_BYTECOUNT appears twice as a case tag. In each case, the two case blocks contain identical code, and you should *REMOVE THE SECOND* and leave the first.
author ben
date Thu, 20 Sep 2001 06:31:11 +0000
parents 37fe04af1590
children 943eaba38521
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1 /* The event_stream interface for X11 with gtk, and/or tty frames.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2 Copyright (C) 1991-5, 1997 Free Software Foundation, Inc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
3 Copyright (C) 1995 Sun Microsystems, Inc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
4 Copyright (C) 1996 Ben Wing.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
5 Copyright (C) 2000 William Perry.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
6
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
7 This file is part of XEmacs.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
8
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
9 XEmacs is free software; you can redistribute it and/or modify it
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
10 under the terms of the GNU General Public License as published by the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
11 Free Software Foundation; either version 2, or (at your option) any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
12 later version.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
13
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
14 XEmacs is distributed in the hope that it will be useful, but WITHOUT
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
17 for more details.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
18
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
19 You should have received a copy of the GNU General Public License
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
20 along with XEmacs; see the file COPYING. If not, write to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
21 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
22 Boston, MA 02111-1307, USA. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
23
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
24 /* This file is heavily based upon event-Xt.c */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
25
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
26 /* Synched up with: Not in FSF. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
27
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
28 #include <config.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
29 #include "lisp.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
30
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
31 #include "console-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
32
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
33 #include "blocktype.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
34 #include "buffer.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
35 #include "commands.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
36 #include "console.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
37 #include "console-tty.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
38 #include "events.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
39 #include "frame.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
40 #include "objects-gtk.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
41 #include "process.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
42 #include "redisplay.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
43 #include "elhash.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
44
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
45 #include "gtk-xemacs.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
46
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
47 #include "systime.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
48 #include "sysproc.h" /* for MAXDESC */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
49
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
50 #ifdef FILE_CODING
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
51 #include "lstream.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
52 #include "file-coding.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
53 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
54
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
55 #include <gdk/gdkkeysyms.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
56
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
57 #ifdef HAVE_DRAGNDROP
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
58 #include "dragdrop.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
59 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
60
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
61 #if defined (HAVE_OFFIX_DND)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
62 #include "offix.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
63 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
64
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
65 #include "events-mod.h"
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
66
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
67 #include <gdk/gdkx.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
68
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
69 static struct event_stream *gtk_event_stream;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
70
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
71 /* Do we accept events sent by other clients? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
72 int gtk_allow_sendevents;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
73
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
74 static int process_events_occurred;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
75 static int tty_events_occurred;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
76
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
77 /* Mask of bits indicating the descriptors that we wait for input on */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
78 extern SELECT_TYPE input_wait_mask, process_only_mask, tty_only_mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
79
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
80 static Lisp_Object gtk_keysym_to_emacs_keysym ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
81 void debug_process_finalization (struct Lisp_Process *p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
82 gboolean emacs_gtk_event_handler (GtkWidget *wid /* unused */,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
83 GdkEvent *event,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
84 gpointer closure /* unused */);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
85
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
86 static int last_quit_check_signal_tick_count;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
87
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
88 Lisp_Object Qkey_mapping;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
89 Lisp_Object Qsans_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
90
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
91 static void enqueue_gtk_dispatch_event (Lisp_Object event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
92
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
93 #define IS_MODIFIER_KEY(keysym) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
94 ((((keysym) >= GDK_Shift_L) && ((keysym) <= GDK_Hyper_R)) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
95 || ((keysym) == GDK_Mode_switch) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
96 || ((keysym) == GDK_Num_Lock))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
97
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
98
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
99
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
100 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
101 /* magic-event handling */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
102 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
103 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
104 handle_focus_event_1 (struct frame *f, int in_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
105 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
106 /* We don't want to handle the focus change now, because we might
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
107 be in an accept-process-output, sleep-for, or sit-for. So
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
108 we enqueue it.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
109
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
110 Actually, we half handle it: we handle it as far as changing the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
111 box cursor for redisplay, but we don't call any hooks or do any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
112 select-frame stuff until after the sit-for.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
113 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
114
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
115 if (in_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
116 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
117 GTK_WIDGET_SET_FLAGS (FRAME_GTK_TEXT_WIDGET (f), GTK_HAS_FOCUS);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
118 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
119 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
120 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
121 GTK_WIDGET_UNSET_FLAGS (FRAME_GTK_TEXT_WIDGET (f), GTK_HAS_FOCUS);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
122 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
123 gtk_widget_grab_focus (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
124 gtk_widget_draw_focus (FRAME_GTK_TEXT_WIDGET (f));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
125
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
126 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
127 Lisp_Object frm;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
128 Lisp_Object conser;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
129 struct gcpro gcpro1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
130
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
131 XSETFRAME (frm, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
132 conser = Fcons (frm, Fcons (FRAME_DEVICE (f), in_p ? Qt : Qnil));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
133 GCPRO1 (conser);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
134
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
135 emacs_handle_focus_change_preliminary (conser);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
136 enqueue_magic_eval_event (emacs_handle_focus_change_final,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
137 conser);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
138 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
139 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
140 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
141
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
142 /* both GDK_MAP and GDK_VISIBILITY_NOTIFY can cause this
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
143 JV is_visible has the same semantics as f->visible*/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
144 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
145 change_frame_visibility (struct frame *f, int is_visible)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
146 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
147 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
148
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
149 XSETFRAME (frame, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
150
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
151 if (!FRAME_VISIBLE_P (f) && is_visible)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
152 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
153 FRAME_VISIBLE_P (f) = is_visible;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
154 /* This improves the double flicker when uniconifying a frame
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
155 some. A lot of it is not showing a buffer which has changed
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
156 while the frame was iconified. To fix it further requires
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
157 the good 'ol double redisplay structure. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
158 MARK_FRAME_WINDOWS_STRUCTURE_CHANGED (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
159 va_run_hook_with_args (Qmap_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
160 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
161 else if (FRAME_VISIBLE_P (f) && !is_visible)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
162 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
163 FRAME_VISIBLE_P (f) = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
164 va_run_hook_with_args (Qunmap_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
165 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
166 else if (FRAME_VISIBLE_P (f) * is_visible < 0)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
167 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
168 FRAME_VISIBLE_P(f) = - FRAME_VISIBLE_P(f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
169 if (FRAME_REPAINT_P (f))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
170 MARK_FRAME_WINDOWS_STRUCTURE_CHANGED (f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
171 va_run_hook_with_args (Qmap_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
172 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
173 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
174
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
175 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
176 handle_map_event (struct frame *f, GdkEvent *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
177 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
178 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
179
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
180 XSETFRAME (frame, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
181 if (event->any.type == GDK_MAP)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
182 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
183 FRAME_GTK_TOTALLY_VISIBLE_P (f) = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
184 change_frame_visibility (f, 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
185 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
186 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
187 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
188 FRAME_GTK_TOTALLY_VISIBLE_P (f) = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
189 change_frame_visibility (f, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
190 /* Calling Fframe_iconified_p is the only way we have to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
191 correctly update FRAME_ICONIFIED_P */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
192 Fframe_iconified_p (frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
193 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
194 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
195
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
196 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
197 handle_client_message (struct frame *f, GdkEvent *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
198 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
199 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
200
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
201 XSETFRAME (frame, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
202
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
203 /* The event-Xt code used to handle WM_DELETE_WINDOW here, but we
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
204 handle that directly in frame-gtk.c */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
205
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
206 if (event->client.message_type == gdk_atom_intern ("WM_PROTOCOLS", 0) &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
207 (GdkAtom) event->client.data.l[0] == gdk_atom_intern ("WM_TAKE_FOCUS", 0))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
208 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
209 handle_focus_event_1 (f, 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
210 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
211 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
212
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
213 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
214 emacs_gtk_handle_magic_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
215 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
216 /* This function can GC */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
217 GdkEvent *event = &emacs_event->event.magic.underlying_gdk_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
218 struct frame *f = XFRAME (EVENT_CHANNEL (emacs_event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
219
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
220 if (!FRAME_LIVE_P (f))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
221 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
222
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
223 switch (event->any.type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
224 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
225 case GDK_CLIENT_EVENT:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
226 handle_client_message (f, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
227 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
228
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
229 case GDK_FOCUS_CHANGE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
230 handle_focus_event_1 (f, event->focus_change.in);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
231 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
232
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
233 case GDK_MAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
234 case GDK_UNMAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
235 handle_map_event (f, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
236 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
237
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
238 case GDK_ENTER_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
239 if (event->crossing.detail != GDK_NOTIFY_INFERIOR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
240 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
241 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
242
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
243 XSETFRAME (frame, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
244 /* FRAME_X_MOUSE_P (f) = 1; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
245 va_run_hook_with_args (Qmouse_enter_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
246 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
247 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
248
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
249 case GDK_LEAVE_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
250 if (event->crossing.detail != GDK_NOTIFY_INFERIOR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
251 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
252 Lisp_Object frame;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
253
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
254 XSETFRAME (frame, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
255 /* FRAME_X_MOUSE_P (f) = 0; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
256 va_run_hook_with_args (Qmouse_leave_frame_hook, 1, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
257 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
258 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
259
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
260 case GDK_VISIBILITY_NOTIFY: /* window visiblity has changed */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
261 if (event->visibility.window == GET_GTK_WIDGET_WINDOW (FRAME_GTK_SHELL_WIDGET (f)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
262 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
263 FRAME_GTK_TOTALLY_VISIBLE_P (f) =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
264 (event->visibility.state == GDK_VISIBILITY_UNOBSCURED);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
265 /* Note that the fvwm pager only sends VisibilityNotify when
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
266 changing pages. Is this all we need to do ? JV */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
267 /* Nope. We must at least trigger a redisplay here.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
268 Since this case seems similar to MapNotify, I've
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
269 factored out some code to change_frame_visibility().
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
270 This triggers the necessary redisplay and runs
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
271 (un)map-frame-hook. - dkindred@cs.cmu.edu */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
272 /* Changed it again to support the tristate visibility flag */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
273 change_frame_visibility (f, (event->visibility.state
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
274 != GDK_VISIBILITY_FULLY_OBSCURED) ? 1 : -1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
275 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
276 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
277
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
278 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
279 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
280 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
281 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
282
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
283 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
284 /* Gtk to Emacs event conversion */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
285 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
286
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
287 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
288 keysym_obeys_caps_lock_p (guint sym, struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
289 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
290 struct gtk_device *gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
291 /* Eeeeevil hack. Don't apply Caps_Lock to things that aren't alphabetic
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
292 characters, where "alphabetic" means something more than simply A-Z.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
293 That is, if Caps_Lock is down, typing ESC doesn't produce Shift-ESC.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
294 But if shift-lock is down, then it does. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
295 if (gd->lock_interpretation == GDK_Shift_Lock)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
296 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
297
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
298 return
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
299 ((sym >= GDK_A) && (sym <= GDK_Z)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
300 ((sym >= GDK_a) && (sym <= GDK_z)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
301 ((sym >= GDK_Agrave) && (sym <= GDK_Odiaeresis)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
302 ((sym >= GDK_agrave) && (sym <= GDK_odiaeresis)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
303 ((sym >= GDK_Ooblique) && (sym <= GDK_Thorn)) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
304 ((sym >= GDK_oslash) && (sym <= GDK_thorn));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
305 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
306
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
307 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
308 set_last_server_timestamp (struct device *d, GdkEvent *gdk_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
309 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
310 guint32 t;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
311 switch (gdk_event->type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
312 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
313 case GDK_KEY_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
314 case GDK_KEY_RELEASE: t = gdk_event->key.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
315 case GDK_BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
316 case GDK_2BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
317 case GDK_3BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
318 case GDK_BUTTON_RELEASE: t = gdk_event->button.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
319 case GDK_ENTER_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
320 case GDK_LEAVE_NOTIFY: t = gdk_event->crossing.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
321 case GDK_MOTION_NOTIFY: t = gdk_event->motion.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
322 case GDK_PROPERTY_NOTIFY: t = gdk_event->property.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
323 case GDK_SELECTION_CLEAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
324 case GDK_SELECTION_REQUEST:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
325 case GDK_SELECTION_NOTIFY: t = gdk_event->selection.time; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
326 default: return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
327 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
328 DEVICE_GTK_LAST_SERVER_TIMESTAMP (d) = t;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
329 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
330
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
331 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
332 gtk_keysym_to_emacs_keysym (guint keysym, int simple_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
333 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
334 char *name;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
335 if (keysym >= GDK_exclam && keysym <= GDK_asciitilde)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
336 /* We must assume that the X keysym numbers for the ASCII graphic
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
337 characters are the same as their ASCII codes. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
338 return make_char (keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
339
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
340 switch (keysym)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
341 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
342 /* These would be handled correctly by the default case, but by
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
343 special-casing them here we don't garbage a string or call
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
344 intern(). */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
345 case GDK_BackSpace: return QKbackspace;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
346 case GDK_Tab: return QKtab;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
347 case GDK_Linefeed: return QKlinefeed;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
348 case GDK_Return: return QKreturn;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
349 case GDK_Escape: return QKescape;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
350 case GDK_space: return QKspace;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
351 case GDK_Delete: return QKdelete;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
352 case 0: return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
353 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
354 if (simple_p) return Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
355 /* !!#### not Mule-ized */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
356 name = gdk_keyval_name (keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
357 if (!name || !name[0])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
358 /* This happens if there is a mismatch between the Xlib of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
359 XEmacs and the Xlib of the X server...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
360
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
361 Let's hard-code in some knowledge of common keysyms introduced
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
362 in recent X11 releases. Snarfed from X11/keysymdef.h
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
363
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
364 Probably we should add some stuff here for X11R6. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
365 switch (keysym)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
366 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
367 case 0xFF95: return KEYSYM ("kp-home");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
368 case 0xFF96: return KEYSYM ("kp-left");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
369 case 0xFF97: return KEYSYM ("kp-up");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
370 case 0xFF98: return KEYSYM ("kp-right");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
371 case 0xFF99: return KEYSYM ("kp-down");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
372 case 0xFF9A: return KEYSYM ("kp-prior");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
373 case 0xFF9B: return KEYSYM ("kp-next");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
374 case 0xFF9C: return KEYSYM ("kp-end");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
375 case 0xFF9D: return KEYSYM ("kp-begin");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
376 case 0xFF9E: return KEYSYM ("kp-insert");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
377 case 0xFF9F: return KEYSYM ("kp-delete");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
378
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
379 case 0x1005FF10: return KEYSYM ("SunF36"); /* labeled F11 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
380 case 0x1005FF11: return KEYSYM ("SunF37"); /* labeled F12 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
381 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
382 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
383 char buf [64];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
384 sprintf (buf, "unknown-keysym-0x%X", (int) keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
385 return KEYSYM (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
386 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
387 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
388 /* If it's got a one-character name, that's good enough. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
389 if (!name[1])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
390 return make_char (name[0]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
391
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
392 /* If it's in the "Keyboard" character set, downcase it.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
393 The case of those keysyms is too totally random for us to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
394 force anyone to remember them.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
395 The case of the other character sets is significant, however.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
396 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
397 if ((((unsigned int) keysym) & (~0x1FF)) == ((unsigned int) 0xFE00))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
398 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
399 char buf [255];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
400 char *s1, *s2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
401 for (s1 = name, s2 = buf; *s1; s1++, s2++) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
402 if (*s1 == '_') {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
403 *s2 = '-';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
404 } else {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
405 *s2 = tolower (* (unsigned char *) s1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
406 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
407 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
408 *s2 = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
409 return KEYSYM (buf);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
410 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
411 return KEYSYM (name);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
412 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
413 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
414
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
415 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
416 gtk_to_emacs_keysym (struct device *d, GdkEventKey *event, int simple_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
417 /* simple_p means don't try too hard (ASCII only) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
418 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
419 if (event->length != 1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
420 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
421 #ifdef FILE_CODING
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
422 /* Generate multiple emacs events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
423 Emchar ch;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
424 Lisp_Object instream, fb_instream;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
425 Lstream *istr;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
426 struct gcpro gcpro1, gcpro2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
427
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
428 fb_instream =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
429 make_fixed_buffer_input_stream ((unsigned char *) event->string, event->length);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
430
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
431 /* ### Use Fget_coding_system (Vcomposed_input_coding_system) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
432 instream =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
433 make_decoding_input_stream (XLSTREAM (fb_instream),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
434 Fget_coding_system (Qundecided));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
435
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
436 istr = XLSTREAM (instream);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
437
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
438 GCPRO2 (instream, fb_instream);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
439 while ((ch = Lstream_get_emchar (istr)) != EOF)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
440 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
441 Lisp_Object emacs_event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
442 struct Lisp_Event *ev = XEVENT (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
443 ev->channel = DEVICE_CONSOLE (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
444 ev->event_type = key_press_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
445 ev->timestamp = event->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
446 ev->event.key.modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
447 ev->event.key.keysym = make_char (ch);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
448 enqueue_gtk_dispatch_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
449 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
450 Lstream_close (istr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
451 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
452 Lstream_delete (istr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
453 Lstream_delete (XLSTREAM (fb_instream));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
454 #else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
455 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
456 for (i = 0; i < event->length; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
457 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
458 Lisp_Object emacs_event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
459 struct Lisp_Event *ev = XEVENT (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
460 ev->channel = DEVICE_CONSOLE (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
461 ev->event_type = key_press_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
462 ev->timestamp = event->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
463 ev->event.key.modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
464 ev->event.key.keysym = make_char (event->string[i]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
465 enqueue_gtk_dispatch_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
466 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
467 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
468 if (IS_MODIFIER_KEY (event->keyval) || (event->keyval == GDK_Mode_switch))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
469 return (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
470 return (gtk_keysym_to_emacs_keysym (event->keyval, simple_p));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
471 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
472 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
473 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
474 if (IS_MODIFIER_KEY (event->keyval) || (event->keyval == GDK_Mode_switch))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
475 return (Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
476 return (gtk_keysym_to_emacs_keysym (event->keyval, simple_p));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
477 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
478 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
479
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
480
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
481 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
482 /* timeout events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
483 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
484
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
485 static int timeout_id_tick;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
486
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
487 struct GTK_timeout {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
488 int id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
489 guint timeout_id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
490 struct GTK_timeout *next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
491 } *pending_timeouts, *completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
492
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
493 struct GTK_timeout_blocktype
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
494 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
495 Blocktype_declare (struct GTK_timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
496 } *the_GTK_timeout_blocktype;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
497
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
498 /* called by the gtk main loop */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
499 static gint
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
500 gtk_timeout_callback (gpointer closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
501 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
502 struct GTK_timeout *timeout = (struct GTK_timeout *) closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
503 struct GTK_timeout *t2 = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
504
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
505 /* Remove this one from the list of pending timeouts */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
506 if (t2 == timeout)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
507 pending_timeouts = pending_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
508 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
509 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
510 while (t2->next && t2->next != timeout) t2 = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
511 assert (t2->next);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
512 t2->next = t2->next->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
513 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
514 /* Add this one to the list of completed timeouts */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
515 timeout->next = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
516 completed_timeouts = timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
517 return(FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
518 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
519
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
520 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
521 emacs_gtk_add_timeout (EMACS_TIME thyme)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
522 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
523 struct GTK_timeout *timeout = Blocktype_alloc (the_GTK_timeout_blocktype);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
524 EMACS_TIME current_time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
525 int milliseconds;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
526
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
527 timeout->id = timeout_id_tick++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
528 timeout->next = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
529 pending_timeouts = timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
530 EMACS_GET_TIME (current_time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
531 EMACS_SUB_TIME (thyme, thyme, current_time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
532 milliseconds = EMACS_SECS (thyme) * 1000 +
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
533 EMACS_USECS (thyme) / 1000;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
534 if (milliseconds < 1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
535 milliseconds = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
536 timeout->timeout_id = gtk_timeout_add (milliseconds,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
537 gtk_timeout_callback,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
538 (gpointer) timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
539 return timeout->id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
540 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
541
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
542 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
543 emacs_gtk_remove_timeout (int id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
544 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
545 struct GTK_timeout *timeout, *t2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
546
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
547 timeout = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
548
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
549 /* Find the timeout on the list of pending ones, if it's still there. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
550 if (pending_timeouts)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
551 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
552 if (id == pending_timeouts->id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
553 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
554 timeout = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
555 pending_timeouts = pending_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
556 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
557 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
558 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
559 t2 = pending_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
560 while (t2->next && t2->next->id != id) t2 = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
561 if ( t2->next) /*found it */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
562 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
563 timeout = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
564 t2->next = t2->next->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
565 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
566 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
567 /* if it was pending, we have removed it from the list */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
568 if (timeout)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
569 gtk_timeout_remove (timeout->timeout_id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
570 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
571
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
572 /* It could be that the call back was already called but we didn't convert
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
573 into an Emacs event yet */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
574 if (!timeout && completed_timeouts)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
575 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
576 /* Code duplication! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
577 if (id == completed_timeouts->id)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
578 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
579 timeout = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
580 completed_timeouts = completed_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
581 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
582 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
583 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
584 t2 = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
585 while (t2->next && t2->next->id != id) t2 = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
586 if ( t2->next) /*found it */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
587 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
588 timeout = t2->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
589 t2->next = t2->next->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
590 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
591 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
592 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
593
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
594 /* If we found the thing on the lists of timeouts,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
595 and removed it, deallocate
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
596 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
597 if (timeout)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
598 Blocktype_free (the_GTK_timeout_blocktype, timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
599 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
600
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
601 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
602 gtk_timeout_to_emacs_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
603 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
604 struct GTK_timeout *timeout = completed_timeouts;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
605 assert (timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
606 completed_timeouts = completed_timeouts->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
607 emacs_event->event_type = timeout_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
608 /* timeout events have nil as channel */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
609 emacs_event->timestamp = 0; /* #### wrong!! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
610 emacs_event->event.timeout.interval_id = timeout->id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
611 Blocktype_free (the_GTK_timeout_blocktype, timeout);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
612 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
613
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
614
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
615 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
616 /* process and tty events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
617 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
618
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
619 struct what_is_ready_closure
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
620 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
621 int fd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
622 Lisp_Object what;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
623 gint id;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
624 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
625
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
626 static Lisp_Object *filedesc_with_input;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
627 static struct what_is_ready_closure **filedesc_to_what_closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
628
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
629 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
630 init_what_input_once (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
631 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
632 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
633
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
634 filedesc_with_input = xnew_array (Lisp_Object, MAXDESC);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
635 filedesc_to_what_closure =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
636 xnew_array (struct what_is_ready_closure *, MAXDESC);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
637
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
638 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
639 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
640 filedesc_to_what_closure[i] = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
641 filedesc_with_input[i] = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
642 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
643
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
644 process_events_occurred = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
645 tty_events_occurred = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
646 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
647
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
648 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
649 mark_what_as_being_ready (struct what_is_ready_closure *closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
650 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
651 if (NILP (filedesc_with_input[closure->fd]))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
652 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
653 SELECT_TYPE temp_mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
654 FD_ZERO (&temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
655 FD_SET (closure->fd, &temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
656 /* Check to make sure there's *really* input available.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
657 Sometimes things seem to get confused and this gets called
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
658 for the tty fd when there's really only input available
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
659 on some process's fd. (It will subsequently get called
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
660 for that process's fd, so returning without setting any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
661 flags will take care of it.) To see the problem, uncomment
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
662 the stderr_out below, turn NORMAL_QUIT_CHECK_TIMEOUT_MSECS
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
663 down to 25, do sh -c 'xemacs -nw -q -f shell 2>/tmp/log'
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
664 and press return repeatedly. (Seen under AIX & Linux.)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
665 -dkindred@cs.cmu.edu */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
666 if (!poll_fds_for_input (temp_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
667 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
668 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
669 stderr_out ("mark_what_as_being_ready: no input available (fd=%d)\n",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
670 closure->fd);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
671 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
672 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
673 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
674 filedesc_with_input[closure->fd] = closure->what;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
675 if (PROCESSP (closure->what))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
676 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
677 /* Don't increment this if the current process is already marked
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
678 * as having input. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
679 process_events_occurred++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
680 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
681 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
682 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
683 tty_events_occurred++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
684 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
685 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
686 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
687
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
688 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
689 gtk_what_callback (gpointer closure, gint source, GdkInputCondition why)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
690 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
691 /* If closure is 0, then we got a fake event from a signal handler.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
692 The only purpose of this is to make XtAppProcessEvent() stop
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
693 blocking. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
694 if (closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
695 mark_what_as_being_ready ((struct what_is_ready_closure *) closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
696 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
697 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
698 fake_event_occurred++;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
699 drain_signal_event_pipe ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
700 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
701 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
702
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
703 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
704 select_filedesc (int fd, Lisp_Object what)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
705 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
706 struct what_is_ready_closure *closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
707
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
708 /* If somebody is trying to select something that's already selected
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
709 for, then something went wrong. The generic routines ought to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
710 detect this and error before here. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
711 assert (!filedesc_to_what_closure[fd]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
712
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
713 closure = xnew (struct what_is_ready_closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
714 closure->fd = fd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
715 closure->what = what;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
716 closure->id = gdk_input_add (fd, GDK_INPUT_READ,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
717 (GdkInputFunction) gtk_what_callback, closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
718 filedesc_to_what_closure[fd] = closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
719 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
720
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
721 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
722 unselect_filedesc (int fd)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
723 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
724 struct what_is_ready_closure *closure = filedesc_to_what_closure[fd];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
725
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
726 assert (closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
727 if (!NILP (filedesc_with_input[fd]))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
728 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
729 /* We are unselecting this process before we have drained the rest of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
730 the input from it, probably from status_notify() in the command loop.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
731 This can happen like so:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
732
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
733 - We are waiting in XtAppNextEvent()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
734 - Process generates output
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
735 - Process is marked as being ready
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
736 - Process dies, SIGCHLD gets generated before we return (!?)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
737 It could happen I guess.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
738 - sigchld_handler() marks process as dead
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
739 - Somehow we end up getting a new KeyPress event on the queue
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
740 at the same time (I'm really so sure how that happens but I'm
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
741 not sure it can't either so let's assume it can...).
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
742 - Key events have priority so we return that instead of the proc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
743 - Before dispatching the lisp key event we call status_notify()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
744 - Which deselects the process that SIGCHLD marked as dead.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
745
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
746 Thus we never remove it from _with_input and turn it into a lisp
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
747 event, so we need to do it here. But this does not mean that we're
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
748 throwing away the last block of output - status_notify() has already
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
749 taken care of running the proc filter or whatever.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
750 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
751 filedesc_with_input[fd] = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
752 if (PROCESSP (closure->what))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
753 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
754 assert (process_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
755 process_events_occurred--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
756 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
757 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
758 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
759 assert (tty_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
760 tty_events_occurred--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
761 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
762 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
763 gdk_input_remove (closure->id);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
764 xfree (closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
765 filedesc_to_what_closure[fd] = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
766 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
767
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
768 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
769 emacs_gtk_select_process (struct Lisp_Process *p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
770 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
771 Lisp_Object process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
772 int infd = event_stream_unixoid_select_process (p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
773
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
774 XSETPROCESS (process, p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
775 select_filedesc (infd, process);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
776 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
777
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
778 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
779 emacs_gtk_unselect_process (struct Lisp_Process *p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
780 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
781 int infd = event_stream_unixoid_unselect_process (p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
782
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
783 unselect_filedesc (infd);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
784 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
785
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
786 static USID
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
787 emacs_gtk_create_stream_pair (void* inhandle, void* outhandle,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
788 Lisp_Object* instream, Lisp_Object* outstream, int flags)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
789 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
790 USID u = event_stream_unixoid_create_stream_pair
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
791 (inhandle, outhandle, instream, outstream, flags);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
792 if (u != USID_ERROR)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
793 u = USID_DONTHASH;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
794 return u;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
795 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
796
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
797 static USID
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
798 emacs_gtk_delete_stream_pair (Lisp_Object instream, Lisp_Object outstream)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
799 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
800 event_stream_unixoid_delete_stream_pair (instream, outstream);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
801 return USID_DONTHASH;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
802 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
803
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
804 /* This is called from GC when a process object is about to be freed.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
805 If we've still got pointers to it in this file, we're gonna lose hard.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
806 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
807 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
808 debug_process_finalization (struct Lisp_Process *p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
809 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
810 #if 0 /* #### */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
811 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
812 Lisp_Object instr, outstr;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
813
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
814 get_process_streams (p, &instr, &outstr);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
815 /* if it still has fds, then it hasn't been killed yet. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
816 assert (NILP(instr));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
817 assert (NILP(outstr));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
818 /* Better not still be in the "with input" table; we know it's got no fds. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
819 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
820 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
821 Lisp_Object process = filedesc_fds_with_input [i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
822 assert (!PROCESSP (process) || XPROCESS (process) != p);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
823 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
824 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
825 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
826
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
827 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
828 gtk_process_to_emacs_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
829 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
830 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
831 Lisp_Object process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
832
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
833 assert (process_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
834 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
835 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
836 process = filedesc_with_input[i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
837 if (PROCESSP (process))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
838 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
839 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
840 assert (i < MAXDESC);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
841 filedesc_with_input[i] = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
842 process_events_occurred--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
843 /* process events have nil as channel */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
844 emacs_event->event_type = process_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
845 emacs_event->timestamp = 0; /* #### */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
846 emacs_event->event.process.process = process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
847 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
848
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
849 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
850 emacs_gtk_select_console (struct console *con)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
851 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
852 Lisp_Object console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
853 int infd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
854
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
855 if (CONSOLE_GTK_P (con))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
856 return; /* Gtk consoles are automatically selected for when we initialize them */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
857 infd = event_stream_unixoid_select_console (con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
858 XSETCONSOLE (console, con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
859 select_filedesc (infd, console);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
860 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
861
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
862 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
863 emacs_gtk_unselect_console (struct console *con)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
864 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
865 Lisp_Object console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
866 int infd;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
867
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
868 if (CONSOLE_GTK_P (con))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
869 return; /* X consoles are automatically selected for when we initialize them */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
870 infd = event_stream_unixoid_unselect_console (con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
871 XSETCONSOLE (console, con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
872 unselect_filedesc (infd);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
873 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
874
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
875 /* read an event from a tty, if one is available. Returns non-zero
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
876 if an event was available. Note that when this function is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
877 called, there should always be a tty marked as ready for input.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
878 However, the input condition might actually be EOF, so there
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
879 may not really be any input available. (In this case,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
880 read_event_from_tty_or_stream_desc() will arrange for the TTY device
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
881 to be deleted.) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
882
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
883 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
884 gtk_tty_to_emacs_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
885 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
886 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
887
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
888 assert (tty_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
889 for (i = 0; i < MAXDESC; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
890 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
891 Lisp_Object console = filedesc_with_input[i];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
892 if (CONSOLEP (console))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
893 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
894 assert (tty_events_occurred > 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
895 tty_events_occurred--;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
896 filedesc_with_input[i] = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
897 if (read_event_from_tty_or_stream_desc
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
898 (emacs_event, XCONSOLE (console), i))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
899 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
900 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
901 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
902
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
903 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
904 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
905
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
906
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
907 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
908 /* Drag 'n Drop handling */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
909 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
910 #ifdef HAVE_DRAGNDROP
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
911 #define TARGET_URI_LIST 0x00
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
912 #define TARGET_TEXT_PLAIN 0x01
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
913 #define TARGET_FILE_NAME 0x02
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
914 #define TARGET_NETSCAPE 0x03
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
915
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
916 static GdkAtom preferred_targets[10];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
917
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
918 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
919 dragndrop_data_received (GtkWidget *widget,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
920 GdkDragContext *context,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
921 gint x,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
922 gint y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
923 GtkSelectionData *data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
924 guint info,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
925 guint time)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
926 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
927 Lisp_Object event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
928 struct device *d = gtk_any_window_to_device (widget->window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
929 struct frame *f = gtk_any_widget_or_parent_to_frame (d, widget);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
930 struct Lisp_Event *ev = XEVENT (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
931 Lisp_Object l_type = Qnil, l_data = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
932 Lisp_Object l_dndlist = Qnil, l_item = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
933 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
934
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
935 GCPRO4 (l_type, l_data, l_dndlist, l_item);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
936
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
937 ev->event_type = misc_user_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
938 ev->timestamp = time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
939
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
940 XSETFRAME (ev->channel, f);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
941
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
942 ev->event.misc.x = x;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
943 ev->event.misc.y = y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
944
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
945 if (data->type == preferred_targets[TARGET_URI_LIST])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
946 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
947 /* newline-separated list of URLs */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
948 int start, end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
949 const char *string_data = (char *) data->data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
950
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
951 l_type = Qdragdrop_URL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
952
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
953 for (start = 0, end = 0; string_data && string_data[end]; end++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
954 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
955 if ((string_data[end] == '\r') && (string_data[end+1] == '\n'))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
956 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
957 l_item = make_string (&string_data[start], end - start);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
958 l_dndlist = Fcons (l_item, l_dndlist);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
959 ++end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
960 start = ++end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
961 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
962 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
963 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
964 else if (data->type == preferred_targets[TARGET_TEXT_PLAIN])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
965 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
966 /* Arbitrary string */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
967 l_type = Qdragdrop_MIME;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
968 l_dndlist = list1 (list3 (list1 (build_string ("text/plain")),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
969 build_string ("8_bit"),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
970 make_ext_string (data->data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
971 strlen ((char *)data->data),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
972 Qctext)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
973 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
974 else if (data->type == preferred_targets[TARGET_FILE_NAME])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
975 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
976 /* Random filename */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
977 char *hurl = dnd_url_hexify_string (data->data, "file:");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
978
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 589
diff changeset
979 l_dndlist = list1 (make_string ((Intbyte *)hurl, strlen (hurl)));
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
980 l_type = Qdragdrop_URL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
981
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
982 xfree (hurl);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
983 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
984 else if (data->type == preferred_targets[TARGET_NETSCAPE])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
985 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
986 /* Single URL */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
987 l_dndlist = list1 (make_string ((Extbyte *)data->data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
988 strlen ((char *)data->data)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
989 l_type = Qdragdrop_URL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
990 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
991 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
992 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
993 /* Unknown type - what to do?
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
994 We just pass it up to lisp - we already have a mime type.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
995 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
996 l_type = Qdragdrop_MIME;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
997 l_dndlist = list1 (list3 (list1 (build_string (gdk_atom_name (data->type))),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
998 build_string ("8bit"),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
999 make_ext_string ((Extbyte *) data->data,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1000 data->length, Qbinary)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1001 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1002
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1003 ev->event.misc.function = Qdragdrop_drop_dispatch;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1004 ev->event.misc.object = Fcons (l_type, l_dndlist);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1005
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1006 UNGCPRO;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1007
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1008 gtk_drag_finish (context, TRUE, FALSE, time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1009 enqueue_gtk_dispatch_event (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1010 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1011
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1012 gboolean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1013 dragndrop_dropped (GtkWidget *widget,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1014 GdkDragContext *drag_context,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1015 gint x,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1016 gint y,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1017 guint time,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1018 gpointer user_data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1019 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1020 /* Netscape drops things like:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1021 STRING
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1022 _SGI_ICON
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1023 _SGI_ICON_TYPE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1024 SGI_FILE
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1025 FILE_NAME
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1026 _NETSCAPE_URL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1027
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1028 gmc drops things like
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1029 application/x-mc-desktop-icon
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1030 text/uri-list
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1031 text/plain
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1032 _NETSCAPE_URL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1033
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1034 We prefer:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1035 text/uri-list
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1036 text/plain
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1037 FILE_NAME
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1038 _NETSCAPE_URL
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1039 first one
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1040 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1041 GdkAtom found = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1042 GList *list = drag_context->targets;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1043
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1044 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1045
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1046 if (!preferred_targets[0])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1047 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1048 preferred_targets[TARGET_URI_LIST] = gdk_atom_intern ("text/uri-list", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1049 preferred_targets[TARGET_TEXT_PLAIN] = gdk_atom_intern ("text/plain", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1050 preferred_targets[TARGET_FILE_NAME] = gdk_atom_intern ("FILE_NAME", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1051 preferred_targets[TARGET_NETSCAPE] = gdk_atom_intern ("_NETSCAPE_URL", FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1052 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1053
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1054 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1055 stderr_out ("Drop info available in the following formats: \n");
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1056 while (list)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1057 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1058 stderr_out ("\t%s\n", gdk_atom_name ((GdkAtom)list->data));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1059 list = list->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1060 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1061 list = drag_context->targets;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1062 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1063
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1064 while (list && !found)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1065 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1066 for (i = 0; preferred_targets[i] && !found; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1067 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1068 if ((GdkAtom) list->data == preferred_targets[i])
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1069 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1070 found = (GdkAtom) list->data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1071 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1072 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1073 list = list->next;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1074 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1075
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1076 if (!found)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1077 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1078 found = (GdkAtom) drag_context->targets->data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1079 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1080
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1081 gtk_drag_get_data (GTK_WIDGET (user_data), drag_context, found, time);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1082 return (TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1083 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1084 #endif /* HAVE_DRAGNDROP */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1085
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1086
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1087 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1088 /* get the next event from gtk */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1089 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1090
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1091 static Lisp_Object dispatch_event_queue, dispatch_event_queue_tail;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1092
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1093 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1094 enqueue_gtk_dispatch_event (Lisp_Object event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1095 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1096 enqueue_event (event, &dispatch_event_queue, &dispatch_event_queue_tail);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1097 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1098
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1099 static Lisp_Object
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1100 dequeue_gtk_dispatch_event (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1101 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1102 return dequeue_event (&dispatch_event_queue, &dispatch_event_queue_tail);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1103 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1104
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1105 /* This business exists because menu events "happen" when
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1106 menubar_selection_callback() is called from somewhere deep
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1107 within XtAppProcessEvent in emacs_Xt_next_event(). The
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1108 callback needs to terminate the modal loop in that function
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1109 or else it will continue waiting until another event is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1110 received.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1111
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1112 Same business applies to scrollbar events. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1113
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1114 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1115 signal_special_gtk_user_event (Lisp_Object channel, Lisp_Object function,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1116 Lisp_Object object)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1117 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1118 Lisp_Object event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1119
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1120 XEVENT (event)->event_type = misc_user_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1121 XEVENT (event)->channel = channel;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1122 XEVENT (event)->event.eval.function = function;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1123 XEVENT (event)->event.eval.object = object;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1124
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1125 enqueue_gtk_dispatch_event (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1126 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1127
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1128 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1129 emacs_gtk_next_event (struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1130 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1131 we_didnt_get_an_event:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1132
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1133 while (NILP (dispatch_event_queue) &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1134 !completed_timeouts &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1135 !fake_event_occurred &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1136 !process_events_occurred &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1137 !tty_events_occurred)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1138 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1139 gtk_main_iteration();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1140 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1141
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1142 if (!NILP (dispatch_event_queue))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1143 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1144 Lisp_Object event, event2;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1145 XSETEVENT (event2, emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1146 event = dequeue_gtk_dispatch_event ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1147 Fcopy_event (event, event2);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1148 Fdeallocate_event (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1149 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1150 else if (tty_events_occurred)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1151 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1152 if (!gtk_tty_to_emacs_event (emacs_event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1153 goto we_didnt_get_an_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1154 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1155 else if (completed_timeouts)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1156 gtk_timeout_to_emacs_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1157 else if (fake_event_occurred)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1158 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1159 /* A dummy event, so that a cycle of the command loop will occur. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1160 fake_event_occurred = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1161 /* eval events have nil as channel */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1162 emacs_event->event_type = eval_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1163 emacs_event->event.eval.function = Qidentity;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1164 emacs_event->event.eval.object = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1165 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1166 else /* if (process_events_occurred) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1167 gtk_process_to_emacs_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1168 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1169
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1170 int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1171 gtk_event_to_emacs_event (struct frame *frame, GdkEvent *gdk_event, struct Lisp_Event *emacs_event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1172 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1173 struct device *d = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1174 struct gtk_device *gd = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1175 gboolean accept_any_window = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1176
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1177 if (!frame)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1178 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1179 frame = XFRAME (Fselected_frame (Vdefault_gtk_device));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1180 accept_any_window = TRUE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1181 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1182
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1183 d = XDEVICE (FRAME_DEVICE (frame));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1184 gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1185
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1186 set_last_server_timestamp (d, gdk_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1187
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1188 switch (gdk_event->type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1189 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1190 /* XEmacs handles double and triple clicking on its own, and if
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1191 we capture these events, it royally confuses the code in
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1192 ../lisp/mouse.el */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1193 case GDK_2BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1194 case GDK_3BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1195 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1196
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1197 case GDK_BUTTON_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1198 case GDK_BUTTON_RELEASE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1199 /* We need to ignore button events outside our main window or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1200 things get ugly. The standard scrollbars in Gtk try to be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1201 nice and pass the button press events up to the parent
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1202 widget. This causes us no end of grief though. Effects
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1203 range from setting point to the wrong place to selecting
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1204 new windows. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1205 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1206 GdkWindow *w = gdk_window_at_pointer (NULL, NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1207
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1208 /* If you press mouse button and drag it around, and release
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1209 it outside the window, you will get a NULL GdkWindow at
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1210 pointer. We need to forward these events on to XEmacs so
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1211 that the mouse selection voodoo works.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1212 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1213 if (w && (w != gdk_window_lookup (GDK_ROOT_WINDOW ())))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1214 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1215 GdkEvent ev;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1216 GtkWidget *wid = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1217
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1218 ev.any.window = w;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1219 wid = gtk_get_event_widget (&ev);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1220
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1221 if (!GTK_IS_XEMACS (wid) && !accept_any_window)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1222 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1223 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1224 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1225 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1226 if (!accept_any_window)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1227 gtk_widget_grab_focus (FRAME_GTK_TEXT_WIDGET (frame));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1228 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1229 /* Fall through */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1230 case GDK_KEY_PRESS:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1231 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1232 unsigned int modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1233 int shift_p, lock_p;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1234 gboolean key_event_p = (gdk_event->type == GDK_KEY_PRESS);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1235 unsigned int *state =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1236 key_event_p ? &gdk_event->key.state : &gdk_event->button.state;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1237
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1238 /* If this is a synthetic KeyPress or Button event, and the user
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1239 has expressed a disinterest in this security hole, then drop
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1240 it on the floor. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1241 /* #### BILL!!! Should this be a generic check for ANY synthetic
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1242 event? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1243 if ((gdk_event->any.send_event) && !gtk_allow_sendevents)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1244 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1245
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1246 DEVICE_GTK_MOUSE_TIMESTAMP (d) =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1247 DEVICE_GTK_GLOBAL_MOUSE_TIMESTAMP (d) =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1248 key_event_p ? gdk_event->key.time : gdk_event->button.time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1249
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1250 if (*state & GDK_CONTROL_MASK) modifiers |= XEMACS_MOD_CONTROL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1251 if (*state & gd->MetaMask) modifiers |= XEMACS_MOD_META;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1252 if (*state & gd->SuperMask) modifiers |= XEMACS_MOD_SUPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1253 if (*state & gd->HyperMask) modifiers |= XEMACS_MOD_HYPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1254 if (*state & gd->AltMask) modifiers |= XEMACS_MOD_ALT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1255
589
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1256 {
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1257 int numero_de_botao = -1;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1258
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1259 if (!key_event_p)
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1260 numero_de_botao = gdk_event->button.button;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1261
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1262 /* the button gets noted either in the button or the modifiers
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1263 field, but not both. */
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1264 if (numero_de_botao != 1 && (*state & GDK_BUTTON1_MASK))
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1265 modifiers |= XEMACS_MOD_BUTTON1;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1266 if (numero_de_botao != 2 && (*state & GDK_BUTTON2_MASK))
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1267 modifiers |= XEMACS_MOD_BUTTON2;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1268 if (numero_de_botao != 3 && (*state & GDK_BUTTON3_MASK))
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1269 modifiers |= XEMACS_MOD_BUTTON3;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1270 if (numero_de_botao != 4 && (*state & GDK_BUTTON4_MASK))
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1271 modifiers |= XEMACS_MOD_BUTTON4;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1272 if (numero_de_botao != 5 && (*state & GDK_BUTTON5_MASK))
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1273 modifiers |= XEMACS_MOD_BUTTON5;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1274 }
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1275
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1276 /* Ignore the Caps_Lock key if:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1277 - any other modifiers are down, so that Caps_Lock doesn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1278 turn C-x into C-X, which would suck.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1279 - the event was a mouse event. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1280 if (modifiers || ! key_event_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1281 *state &= (~GDK_LOCK_MASK);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1282
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1283 shift_p = *state & GDK_SHIFT_MASK;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1284 lock_p = *state & GDK_LOCK_MASK;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1285
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1286 if (shift_p || lock_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1287 modifiers |= XEMACS_MOD_SHIFT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1288
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1289 if (key_event_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1290 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1291 GdkEventKey *key_event = &gdk_event->key;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1292 Lisp_Object keysym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1293
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1294 /* This used to compute the frame from the given X window and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1295 store it here, but we really don't care about the frame. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1296 emacs_event->channel = DEVICE_CONSOLE (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1297
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1298 /* Keysym mucking has already been done inside the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1299 GdkEventKey parsing */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1300 keysym = gtk_to_emacs_keysym (d, key_event, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1301
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1302 /* If the emacs keysym is nil, then that means that the X
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1303 keysym was either a Modifier or NoSymbol, which
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1304 probably means that we're in the midst of reading a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1305 Multi_key sequence, or a "dead" key prefix, or XIM
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1306 input. Ignore it. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1307 if (NILP (keysym))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1308 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1309
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1310 /* More Caps_Lock garbage: Caps_Lock should *only* add the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1311 shift modifier to two-case keys (that is, A-Z and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1312 related characters). So at this point (after looking up
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1313 the keysym) if the keysym isn't a dual-case alphabetic,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1314 and if the caps lock key was down but the shift key
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1315 wasn't, then turn off the shift modifier. Gag barf */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1316 /* #### type lossage: assuming equivalence of emacs and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1317 X keysyms */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1318 /* !!#### maybe fix for Mule */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1319 if (lock_p && !shift_p &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1320 ! (CHAR_OR_CHAR_INTP (keysym)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1321 && keysym_obeys_caps_lock_p
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1322 ((guint) XCHAR_OR_CHAR_INT (keysym), d)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1323 modifiers &= (~XEMACS_MOD_SHIFT);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1324
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1325 /* If this key contains two distinct keysyms, that is,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1326 "shift" generates a different keysym than the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1327 non-shifted key, then don't apply the shift modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1328 bit: it's implicit. Otherwise, if there would be no
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1329 other way to tell the difference between the shifted
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1330 and unshifted version of this key, apply the shift bit.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1331 Non-graphics, like Backspace and F1 get the shift bit
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1332 in the modifiers slot. Neither the characters "a",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1333 "A", "2", nor "@" normally have the shift bit set.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1334 However, "F1" normally does. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1335 if (modifiers & XEMACS_MOD_SHIFT)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1336 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1337 if (CHAR_OR_CHAR_INTP (keysym))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1338 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1339 modifiers &= ~XEMACS_MOD_SHIFT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1340 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1341 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1342
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1343 emacs_event->event_type = key_press_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1344 emacs_event->timestamp = key_event->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1345 emacs_event->event.key.modifiers = modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1346 emacs_event->event.key.keysym = keysym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1347 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1348 else /* Mouse press/release event */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1349 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1350 GdkEventButton *button_event = &gdk_event->button;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1351 XSETFRAME (emacs_event->channel, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1352
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1353 emacs_event->event_type = (button_event->type == GDK_BUTTON_RELEASE) ?
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1354 button_release_event : button_press_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1355
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1356 emacs_event->event.button.modifiers = modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1357 emacs_event->timestamp = button_event->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1358 emacs_event->event.button.button = button_event->button;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1359 emacs_event->event.button.x = button_event->x;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1360 emacs_event->event.button.y = button_event->y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1361 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1362 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1363 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1364 case GDK_KEY_RELEASE:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1365 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1366 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1367 case GDK_MOTION_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1368 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1369 GdkEventMotion *ev = &gdk_event->motion;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1370 unsigned int modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1371 gint x,y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1372 GdkModifierType mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1373
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1374 /* We use MOTION_HINT_MASK, so we will get only one motion
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1375 event until the next time we call gdk_window_get_pointer or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1376 the user clicks the mouse. So call gdk_window_get_pointer
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1377 now (meaning that the event will be in sync with the server
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1378 just before Fnext_event() returns). If the mouse is still
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1379 in motion, then the server will immediately generate
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1380 exactly one more motion event, which will be on the queue
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1381 waiting for us next time around. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1382 gdk_window_get_pointer (ev->window, &x, &y, &mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1383
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1384 DEVICE_GTK_MOUSE_TIMESTAMP (d) = ev->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1385
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1386 XSETFRAME (emacs_event->channel, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1387 emacs_event->event_type = pointer_motion_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1388 emacs_event->timestamp = ev->time;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1389 emacs_event->event.motion.x = x;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1390 emacs_event->event.motion.y = y;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1391 if (mask & GDK_SHIFT_MASK) modifiers |= XEMACS_MOD_SHIFT;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1392 if (mask & GDK_CONTROL_MASK) modifiers |= XEMACS_MOD_CONTROL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1393 if (mask & gd->MetaMask) modifiers |= XEMACS_MOD_META;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1394 if (mask & gd->SuperMask) modifiers |= XEMACS_MOD_SUPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1395 if (mask & gd->HyperMask) modifiers |= XEMACS_MOD_HYPER;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1396 if (mask & gd->AltMask) modifiers |= XEMACS_MOD_ALT;
589
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1397 if (mask & GDK_BUTTON1_MASK) modifiers |= XEMACS_MOD_BUTTON1;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1398 if (mask & GDK_BUTTON2_MASK) modifiers |= XEMACS_MOD_BUTTON2;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1399 if (mask & GDK_BUTTON3_MASK) modifiers |= XEMACS_MOD_BUTTON3;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1400 if (mask & GDK_BUTTON4_MASK) modifiers |= XEMACS_MOD_BUTTON4;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1401 if (mask & GDK_BUTTON5_MASK) modifiers |= XEMACS_MOD_BUTTON5;
37fe04af1590 [xemacs-hg @ 2001-05-31 02:00:29 by wmperry]
wmperry
parents: 563
diff changeset
1402
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1403 /* Currently ignores Shift_Lock but probably shouldn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1404 (but it definitely should ignore Caps_Lock). */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1405 emacs_event->event.motion.modifiers = modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1406 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1407 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1408
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1409 default: /* it's a magic event */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1410 return (0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1411 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1412 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1413 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1414 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1415
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1416 static const char *event_name (GdkEvent *);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1417
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1418 static gboolean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1419 generic_event_handler (GtkWidget *widget, GdkEvent *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1420 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1421 Lisp_Object emacs_event = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1422 if (!GTK_IS_XEMACS (widget))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1423 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1424 stderr_out ("Got a %s event for a non-XEmacs widget\n",event_name (event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1425 return (FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1426 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1427
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1428 emacs_event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1429
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1430 if (gtk_event_to_emacs_event (GTK_XEMACS_FRAME (widget), event, XEVENT (emacs_event)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1431 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1432 enqueue_gtk_dispatch_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1433 return (TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1434 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1435 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1436 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1437 Fdeallocate_event (emacs_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1438 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1439 return (FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1440 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1441
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1442 gint emacs_gtk_key_event_handler(GtkWidget *widget, GdkEventKey *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1443 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1444 return (generic_event_handler (widget, (GdkEvent *) event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1445 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1446
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1447 gint emacs_gtk_button_event_handler(GtkWidget *widget, GdkEventButton *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1448 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1449 return (generic_event_handler (widget, (GdkEvent *) event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1450 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1451
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1452 gint emacs_gtk_motion_event_handler (GtkWidget *widget, GdkEventMotion *event)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1453 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1454 return (generic_event_handler (widget, (GdkEvent *) event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1455 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1456
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1457 gboolean
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1458 emacs_shell_event_handler (GtkWidget *wid /* unused */,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1459 GdkEvent *event,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1460 gpointer closure)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1461 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1462 struct frame *frame = (struct frame *) closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1463 Lisp_Object lisp_event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1464 struct Lisp_Event *emacs_event = XEVENT (lisp_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1465 GdkEvent *gdk_event_copy = &emacs_event->event.magic.underlying_gdk_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1466 struct device *d = XDEVICE (FRAME_DEVICE (frame));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1467 gboolean ignore_p = FALSE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1468
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1469 set_last_server_timestamp (d, event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1470
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1471 #define FROB(event_member) gdk_event_copy->event_member = event->event_member
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1472
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1473 switch (event->type)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1474 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1475 case GDK_SELECTION_REQUEST:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1476 case GDK_SELECTION_CLEAR:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1477 case GDK_SELECTION_NOTIFY: FROB(selection); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1478 case GDK_PROPERTY_NOTIFY: FROB(property); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1479 case GDK_CLIENT_EVENT: FROB(client); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1480 case GDK_MAP:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1481 case GDK_UNMAP: FROB(any); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1482 case GDK_CONFIGURE: FROB(configure); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1483 case GDK_ENTER_NOTIFY:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1484 case GDK_LEAVE_NOTIFY: FROB(crossing); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1485 case GDK_FOCUS_CHANGE: FROB(focus_change); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1486 case GDK_VISIBILITY_NOTIFY: FROB(visibility); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1487 default:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1488 ignore_p = TRUE;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1489 /* Hrmm... do we really want to swallow all the other events as magic? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1490 *gdk_event_copy = *event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1491 break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1492 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1493 #undef FROB
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1494
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1495 emacs_event->event_type = magic_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1496 XSETFRAME (emacs_event->channel, frame);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1497
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1498 if (ignore_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1499 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1500 stderr_out ("Ignoring event... (%s)\n", event_name (event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1501 Fdeallocate_event (lisp_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1502 return (FALSE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1503 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1504 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1505 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1506 enqueue_gtk_dispatch_event (lisp_event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1507 return (TRUE);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1508 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1509 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1510
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1511
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1512 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1513 /* input pending / C-g checking */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1514 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1515 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1516 gtk_check_for_quit_char (struct device *d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1517
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1518 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1519 check_for_tty_quit_char (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1520 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1521 SELECT_TYPE temp_mask;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1522 int infd = DEVICE_INFD (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1523 struct console *con = XCONSOLE (DEVICE_CONSOLE (d));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1524 Emchar quit_char = CONSOLE_QUIT_CHAR (con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1525
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1526 FD_ZERO (&temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1527 FD_SET (infd, &temp_mask);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1528
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1529 while (1)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1530 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1531 Lisp_Object event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1532 Emchar the_char;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1533
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1534 if (!poll_fds_for_input (temp_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1535 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1536
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1537 event = Fmake_event (Qnil, Qnil);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1538 if (!read_event_from_tty_or_stream_desc (XEVENT (event), con, infd))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1539 /* EOF, or something ... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1540 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1541 /* #### bogus. quit-char should be allowed to be any sort
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1542 of event. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1543 the_char = event_to_character (XEVENT (event), 1, 0, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1544 if (the_char >= 0 && the_char == quit_char)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1545 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1546 Vquit_flag = Qt;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1547 /* do not queue the C-g. See above. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1548 return;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1549 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1550
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1551 /* queue the read event to be read for real later. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1552 enqueue_gtk_dispatch_event (event);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1553 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1554 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1555
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1556 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1557 emacs_gtk_quit_p (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1558 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1559 Lisp_Object devcons, concons;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1560
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1561 CONSOLE_LOOP (concons)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1562 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1563 struct console *con = XCONSOLE (XCAR (concons));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1564 if (!con->input_enabled)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1565 continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1566
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1567 CONSOLE_DEVICE_LOOP (devcons, con)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1568 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1569 struct device *d;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1570 d = XDEVICE (XCAR (devcons));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1571
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1572 if (DEVICE_GTK_P (d))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1573 /* emacs may be exiting */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1574 gtk_check_for_quit_char (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1575 else if (DEVICE_TTY_P (d))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1576 check_for_tty_quit_char (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1577 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1578 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1579 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1580
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1581 #include <gdk/gdkx.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1582
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1583 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1584 drain_gtk_queue (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1585
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1586 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1587 /* We can't just spin through here and wait for GTKs idea of the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1588 event queue to get empty, or the queue never gets drained. The
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1589 situation is as follows. A process event gets signalled, we put
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1590 it on the queue, then we go into Fnext_event(), which calls
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1591 drain_gtk_queue(). But gtk_events_pending() will always return
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1592 TRUE if there are file-descriptor (aka our process) events
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1593 pending. Using GDK_events_pending() only shows us windowing
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1594 system events.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1595 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1596 if (GDK_DISPLAY ())
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1597 while (gdk_events_pending ())
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1598 gtk_main_iteration ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1599 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1600
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1601 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1602 emacs_gtk_event_pending_p (int user_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1603 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1604 Lisp_Object event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1605 int tick_count_val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1606
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1607 /* If `user_p' is false, then this function returns whether there are any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1608 X, timeout, or fd events pending (that is, whether emacs_gtk_next_event()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1609 would return immediately without blocking).
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1610
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1611 if `user_p' is true, then this function returns whether there are any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1612 *user generated* events available (that is, whether there are keyboard
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1613 or mouse-click events ready to be read). This also implies that
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1614 emacs_Xt_next_event() would not block.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1615
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1616 In a non-SIGIO world, this also checks whether the user has typed ^G,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1617 since this is a convenient place to do so. We don't need to do this
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1618 in a SIGIO world, since input causes an interrupt.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1619 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1620
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1621 /* This function used to simply check whether there were any X
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1622 events (or if user_p was 1, it iterated over all the pending
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1623 X events using XCheckIfEvent(), looking for keystrokes and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1624 button events). That worked in the old cheesoid event loop,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1625 which didn't go through XtAppDispatchEvent(), but it doesn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1626 work any more -- X events may not result in anything. For
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1627 example, a button press in a blank part of the menubar appears
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1628 as an X event but will not result in any Emacs events (a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1629 button press that activates the menubar results in an Emacs
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1630 event through the stop_next_event mechanism).
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1631
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1632 The only accurate way of determining whether these X events
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1633 translate into Emacs events is to go ahead and dispatch them
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1634 until there's something on the dispatch queue. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1635
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1636 /* See if there are any user events already on the queue. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1637 EVENT_CHAIN_LOOP (event, dispatch_event_queue)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1638 if (!user_p || command_event_p (event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1639 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1640
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1641 /* See if there's any TTY input available.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1642 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1643 if (poll_fds_for_input (tty_only_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1644 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1645
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1646 if (!user_p)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1647 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1648 /* If not user_p and there are any timer or file-desc events
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1649 pending, we know there will be an event so we're through. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1650 /* XtInputMask pending_value; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1651
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1652 /* Note that formerly we just checked the value of XtAppPending()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1653 to determine if there was file-desc input. This doesn't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1654 work any more with the signal_event_pipe; XtAppPending()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1655 will says "yes" in this case but there isn't really any
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1656 input. Another way of fixing this problem is for the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1657 signal_event_pipe to generate actual input in the form
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1658 of an identity eval event or something. (#### maybe this
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1659 actually happens?) */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1660
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1661 if (poll_fds_for_input (process_only_mask))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1662 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1663
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1664 /* #### Is there any way to do this in Gtk? I don't think there
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1665 is a 'peek' for events */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1666 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1667 pending_value = XtAppPending (Xt_app_con);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1668
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1669 if (pending_value & XtIMTimer)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1670 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1671 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1672 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1673
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1674 /* XtAppPending() can be super-slow, esp. over a network connection.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1675 Quantify results have indicated that in some cases the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1676 call to detect_input_pending() completely dominates the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1677 running time of redisplay(). Fortunately, in a SIGIO world
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1678 we can more quickly determine whether there are any X events:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1679 if an event has happened since the last time we checked, then
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1680 a SIGIO will have happened. On a machine with broken SIGIO,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1681 we'll still be in an OK state -- the sigio_happened flag
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1682 will get set at least once a second, so we'll be no more than
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1683 one second behind reality. (In general it's OK if we
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1684 erroneously report no input pending when input is actually
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1685 pending() -- preemption is just a bit less efficient, that's
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1686 all. It's bad bad bad if you err the other way -- you've
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1687 promised that `next-event' won't block but it actually will,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1688 and some action might get delayed until the next time you
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1689 hit a key.)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1690 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1691
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1692 /* quit_check_signal_tick_count is volatile so try to avoid race conditions
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1693 by using a temporary variable */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1694 tick_count_val = quit_check_signal_tick_count;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1695 if (last_quit_check_signal_tick_count != tick_count_val)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1696 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1697 last_quit_check_signal_tick_count = tick_count_val;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1698
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1699 /* We need to drain the entire queue now -- if we only
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1700 drain part of it, we may later on end up with events
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1701 actually pending but detect_input_pending() returning
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1702 false because there wasn't another SIGIO. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1703
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1704 drain_gtk_queue ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1705
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1706 EVENT_CHAIN_LOOP (event, dispatch_event_queue)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1707 if (!user_p || command_event_p (event))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1708 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1709 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1710
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1711 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1712 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1713
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1714
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1715 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1716 /* initialization */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1717 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1718
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1719 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1720 syms_of_event_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1721 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
1722 DEFSYMBOL (Qkey_mapping);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 464
diff changeset
1723 DEFSYMBOL (Qsans_modifiers);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1724 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1725
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1726 void reinit_vars_of_event_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1727 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1728 gtk_event_stream = xnew (struct event_stream);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1729 gtk_event_stream->event_pending_p = emacs_gtk_event_pending_p;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1730 gtk_event_stream->next_event_cb = emacs_gtk_next_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1731 gtk_event_stream->handle_magic_event_cb= emacs_gtk_handle_magic_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1732 gtk_event_stream->add_timeout_cb = emacs_gtk_add_timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1733 gtk_event_stream->remove_timeout_cb = emacs_gtk_remove_timeout;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1734 gtk_event_stream->select_console_cb = emacs_gtk_select_console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1735 gtk_event_stream->unselect_console_cb = emacs_gtk_unselect_console;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1736 gtk_event_stream->select_process_cb = emacs_gtk_select_process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1737 gtk_event_stream->unselect_process_cb = emacs_gtk_unselect_process;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1738 gtk_event_stream->quit_p_cb = emacs_gtk_quit_p;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1739 gtk_event_stream->create_stream_pair_cb= emacs_gtk_create_stream_pair;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1740 gtk_event_stream->delete_stream_pair_cb= emacs_gtk_delete_stream_pair;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1741
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1742 the_GTK_timeout_blocktype = Blocktype_new (struct GTK_timeout_blocktype);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1743
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1744 /* this function only makes safe calls */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1745 init_what_input_once ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1746 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1747
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1748 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1749 vars_of_event_gtk (void)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1750 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1751 reinit_vars_of_event_gtk ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1752
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1753 dispatch_event_queue = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1754 staticpro (&dispatch_event_queue);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1755 dispatch_event_queue_tail = Qnil;
464
5aa1854ad537 Import from CVS: tag r21-2-47
cvs
parents: 462
diff changeset
1756 staticpro (&dispatch_event_queue_tail);
462
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1757
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1758 DEFVAR_BOOL ("gtk-allow-sendevents", &gtk_allow_sendevents /*
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1759 *Non-nil means to allow synthetic events. Nil means they are ignored.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1760 Beware: allowing emacs to process SendEvents opens a big security hole.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1761 */ );
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1762 gtk_allow_sendevents = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1763
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1764 last_quit_check_signal_tick_count = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1765 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1766
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1767 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1768 init_event_gtk_late (void) /* called when already initialized */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1769 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1770 timeout_id_tick = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1771 pending_timeouts = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1772 completed_timeouts = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1773
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1774 event_stream = gtk_event_stream;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1775
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1776 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1777 /* Shut GDK the hell up */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1778 gdk_error_trap_push ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1779 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1780
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1781 gdk_input_add (signal_event_pipe[0], GDK_INPUT_READ,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1782 (GdkInputFunction) gtk_what_callback, NULL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1783 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1784
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1785 /* Bogus utility routines */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1786 static const char *event_name (GdkEvent *ev)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1787 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1788 return (gtk_event_name (ev->any.type));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1789 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1790
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1791 /* This is down at the bottom of the file so I can avoid polluting the
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1792 generic code with this X specific CRAP! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1793
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1794 #include <gdk/gdkx.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1795 #include <X11/keysym.h>
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1796 /* #### BILL!!! Fix this please! */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1797
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1798
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1799 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1800 /* keymap handling */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1801 /************************************************************************/
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1802
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1803 /* X bogusly doesn't define the interpretations of any bits besides
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1804 ModControl, ModShift, and ModLock; so the Interclient Communication
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1805 Conventions Manual says that we have to bend over backwards to figure
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1806 out what the other modifier bits mean. According to ICCCM:
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1807
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1808 - Any keycode which is assigned ModControl is a "control" key.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1809
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1810 - Any modifier bit which is assigned to a keycode which generates Meta_L
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1811 or Meta_R is the modifier bit meaning "meta". Likewise for Super, Hyper,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1812 etc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1813
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1814 - Any keypress event which contains ModControl in its state should be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1815 interpreted as a "control" character.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1816
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1817 - Any keypress event which contains a modifier bit in its state which is
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1818 generated by a keycode whose corresponding keysym is Meta_L or Meta_R
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1819 should be interpreted as a "meta" character. Likewise for Super, Hyper,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1820 etc.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1821
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1822 - It is illegal for a keysym to be associated with more than one modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1823 bit.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1824
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1825 This means that the only thing that emacs can reasonably interpret as a
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1826 "meta" key is a key whose keysym is Meta_L or Meta_R, and which generates
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1827 one of the modifier bits Mod1-Mod5.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1828
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1829 Unfortunately, many keyboards don't have Meta keys in their default
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1830 configuration. So, if there are no Meta keys, but there are "Alt" keys,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1831 emacs will interpret Alt as Meta. If there are both Meta and Alt keys,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1832 then the Meta keys mean "Meta", and the Alt keys mean "Alt" (it used to
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1833 mean "Symbol," but that just confused the hell out of way too many people).
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1834
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1835 This works with the default configurations of the 19 keyboard-types I've
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1836 checked.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1837
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1838 Emacs detects keyboard configurations which violate the above rules, and
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1839 prints an error message on the standard-error-output. (Perhaps it should
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1840 use a pop-up-window instead.)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1841 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1842
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1843 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1844 gtk_reset_key_mapping (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1845 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1846 Display *display = GDK_DISPLAY ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1847 struct gtk_device *xd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1848 XModifierKeymap *map = (XModifierKeymap *) xd->x_keysym_map;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1849 KeySym *keysym, *keysym_end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1850 Lisp_Object hashtable;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1851 int key_code_count, keysyms_per_code;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1852
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1853 if (map)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1854 XFree ((char *) map);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1855 XDisplayKeycodes (display,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1856 &xd->x_keysym_map_min_code,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1857 &xd->x_keysym_map_max_code);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1858 key_code_count = xd->x_keysym_map_max_code - xd->x_keysym_map_min_code + 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1859 map = (XModifierKeymap *)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1860 XGetKeyboardMapping (display, xd->x_keysym_map_min_code, key_code_count,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1861 &xd->x_keysym_map_keysyms_per_code);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1862
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1863 xd->x_keysym_map = (void *)map;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1864 hashtable = xd->x_keysym_map_hashtable;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1865 if (HASH_TABLEP (hashtable))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1866 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1867 Fclrhash (hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1868 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1869 else
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1870 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1871 xd->x_keysym_map_hashtable = hashtable =
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1872 make_lisp_hash_table (128, HASH_TABLE_NON_WEAK, HASH_TABLE_EQUAL);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1873 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1874
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1875 for (keysym = (KeySym *) map,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1876 keysyms_per_code = xd->x_keysym_map_keysyms_per_code,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1877 keysym_end = keysym + (key_code_count * keysyms_per_code);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1878 keysym < keysym_end;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1879 keysym += keysyms_per_code)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1880 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1881 int j;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1882
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1883 if (keysym[0] == NoSymbol)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1884 continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1885
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1886 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1887 char *name = XKeysymToString (keysym[0]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1888 Lisp_Object sym = gtk_keysym_to_emacs_keysym (keysym[0], 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1889 if (name)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1890 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1891 Fputhash (build_string (name), Qsans_modifiers, hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1892 Fputhash (sym, Qsans_modifiers, hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1893 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1894 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1895
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1896 for (j = 1; j < keysyms_per_code; j++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1897 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1898 if (keysym[j] != keysym[0] &&
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1899 keysym[j] != NoSymbol)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1900 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1901 char *name = XKeysymToString (keysym[j]);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1902 Lisp_Object sym = gtk_keysym_to_emacs_keysym (keysym[j], 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1903 if (name && NILP (Fgethash (sym, hashtable, Qnil)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1904 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1905 Fputhash (build_string (name), Qt, hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1906 Fputhash (sym, Qt, hashtable);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1907 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1908 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1909 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1910 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1911 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1912
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1913 static const char *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1914 index_to_name (int indice)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1915 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1916 switch (indice)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1917 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1918 case ShiftMapIndex: return "ModShift";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1919 case LockMapIndex: return "ModLock";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1920 case ControlMapIndex: return "ModControl";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1921 case Mod1MapIndex: return "Mod1";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1922 case Mod2MapIndex: return "Mod2";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1923 case Mod3MapIndex: return "Mod3";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1924 case Mod4MapIndex: return "Mod4";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1925 case Mod5MapIndex: return "Mod5";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1926 default: return "???";
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1927 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1928 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1929
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1930 /* Boy, I really wish C had local functions... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1931 struct c_doesnt_have_closures /* #### not yet used */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1932 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1933 int warned_about_overlapping_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1934 int warned_about_predefined_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1935 int warned_about_duplicate_modifiers;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1936 int meta_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1937 int hyper_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1938 int super_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1939 int alt_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1940 int mode_bit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1941 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1942
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1943 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1944 gtk_reset_modifier_mapping (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1945 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1946 Display *display = GDK_DISPLAY ();
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1947 struct gtk_device *xd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1948 int modifier_index, modifier_key, column, mkpm;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1949 int warned_about_overlapping_modifiers = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1950 /* int warned_about_predefined_modifiers = 0; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1951 /* int warned_about_duplicate_modifiers = 0; */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1952 int meta_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1953 int hyper_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1954 int super_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1955 int alt_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1956 int mode_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1957 XModifierKeymap *map = (XModifierKeymap *) xd->x_modifier_keymap;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1958
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1959 xd->lock_interpretation = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1960
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1961 if (map)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1962 XFreeModifiermap (map);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1963
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1964 gtk_reset_key_mapping (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1965
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1966 xd->x_modifier_keymap = map = XGetModifierMapping (display);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1967
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1968 /* Boy, I really wish C had local functions...
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1969 */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1970
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1971 /* The call to warn_when_safe must be on the same line as the string or
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1972 make-msgfile won't pick it up properly (the newline doesn't confuse
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1973 it, but the backslash does). */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1974
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1975 #define store_modifier(name,old) \
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1976 old = modifier_index;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1977
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1978 mkpm = map->max_keypermod;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1979 for (modifier_index = 0; modifier_index < 8; modifier_index++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1980 for (modifier_key = 0; modifier_key < mkpm; modifier_key++) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1981 KeySym last_sym = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1982 for (column = 0; column < 4; column += 2) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1983 KeyCode code = map->modifiermap[modifier_index * mkpm
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1984 + modifier_key];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1985 KeySym sym = (code ? XKeycodeToKeysym (display, code, column) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1986 if (sym == last_sym) continue;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1987 last_sym = sym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1988 switch (sym) {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1989 case XK_Mode_switch:store_modifier ("Mode_switch", mode_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1990 case XK_Meta_L: store_modifier ("Meta_L", meta_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1991 case XK_Meta_R: store_modifier ("Meta_R", meta_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1992 case XK_Super_L: store_modifier ("Super_L", super_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1993 case XK_Super_R: store_modifier ("Super_R", super_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1994 case XK_Hyper_L: store_modifier ("Hyper_L", hyper_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1995 case XK_Hyper_R: store_modifier ("Hyper_R", hyper_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1996 case XK_Alt_L: store_modifier ("Alt_L", alt_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1997 case XK_Alt_R: store_modifier ("Alt_R", alt_bit); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1998 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
1999 case XK_Control_L: check_modifier ("Control_L", ControlMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2000 case XK_Control_R: check_modifier ("Control_R", ControlMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2001 case XK_Shift_L: check_modifier ("Shift_L", ShiftMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2002 case XK_Shift_R: check_modifier ("Shift_R", ShiftMask); break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2003 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2004 case XK_Shift_Lock: /* check_modifier ("Shift_Lock", LockMask); */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2005 xd->lock_interpretation = XK_Shift_Lock; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2006 case XK_Caps_Lock: /* check_modifier ("Caps_Lock", LockMask); */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2007 xd->lock_interpretation = XK_Caps_Lock; break;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2008
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2009 /* It probably doesn't make any sense for a modifier bit to be
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2010 assigned to a key that is not one of the above, but OpenWindows
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2011 assigns modifier bits to a couple of random function keys for
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2012 no reason that I can discern, so printing a warning here would
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2013 be annoying. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2014 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2015 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2016 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2017 #undef store_modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2018 #undef check_modifier
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2019 #undef modwarn
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2020 #undef modbarf
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2021
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2022 /* If there was no Meta key, then try using the Alt key instead.
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2023 If there is both a Meta key and an Alt key, then the Alt key
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2024 is not disturbed and remains an Alt key. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2025 if (! meta_bit && alt_bit)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2026 meta_bit = alt_bit, alt_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2027
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2028 /* mode_bit overrides everything, since it's processed down inside of
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2029 XLookupString() instead of by us. If Meta and Mode_switch both
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2030 generate the same modifier bit (which is an error), then we don't
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2031 interpret that bit as Meta, because we can't make XLookupString()
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2032 not interpret it as Mode_switch; and interpreting it as both would
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2033 be totally wrong. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2034 if (mode_bit)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2035 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2036 const char *warn = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2037 if (mode_bit == meta_bit) warn = "Meta", meta_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2038 else if (mode_bit == hyper_bit) warn = "Hyper", hyper_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2039 else if (mode_bit == super_bit) warn = "Super", super_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2040 else if (mode_bit == alt_bit) warn = "Alt", alt_bit = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2041 if (warn)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2042 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2043 warn_when_safe
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2044 (Qkey_mapping, Qwarning,
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2045 "XEmacs: %s is being used for both Mode_switch and %s.",
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2046 index_to_name (mode_bit), warn),
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2047 warned_about_overlapping_modifiers = 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2048 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2049 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2050 #undef index_to_name
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2051
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2052 xd->MetaMask = (meta_bit ? (1 << meta_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2053 xd->HyperMask = (hyper_bit ? (1 << hyper_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2054 xd->SuperMask = (super_bit ? (1 << super_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2055 xd->AltMask = (alt_bit ? (1 << alt_bit) : 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2056 xd->ModeMask = (mode_bit ? (1 << mode_bit) : 0); /* unused */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2057
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2058 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2059
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2060 void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2061 gtk_init_modifier_mapping (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2062 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2063 struct gtk_device *gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2064 gd->x_keysym_map_hashtable = Qnil;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2065 gd->x_keysym_map = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2066 gd->x_modifier_keymap = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2067 gtk_reset_modifier_mapping (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2068 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2069
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2070 #if 0
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2071 static int
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2072 gtk_key_is_modifier_p (KeyCode keycode, struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2073 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2074 struct gtk_device *xd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2075 KeySym *syms;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2076 KeySym *map = (KeySym *) xd->x_keysym_map;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2077 int i;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2078
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2079 if (keycode < xd->x_keysym_map_min_code ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2080 keycode > xd->x_keysym_map_max_code)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2081 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2082
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2083 syms = &map [(keycode - xd->x_keysym_map_min_code) *
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2084 xd->x_keysym_map_keysyms_per_code];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2085 for (i = 0; i < xd->x_keysym_map_keysyms_per_code; i++)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2086 if (IsModifierKey (syms [i]) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2087 syms [i] == XK_Mode_switch) /* why doesn't IsModifierKey count this? */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2088 return 1;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2089 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2090 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2091 #endif
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2092
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2093 struct _quit_predicate_closure {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2094 struct device *device;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2095 Bool *critical;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2096 };
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2097
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2098 static Bool
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2099 quit_char_predicate (Display *display, XEvent *event, XPointer data)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2100 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2101 struct _quit_predicate_closure *cl = (struct _quit_predicate_closure *) data;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2102 struct device *d = cl->device;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2103 struct frame *f = NULL;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2104 struct gtk_device *gd = DEVICE_GTK_DATA (d);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2105 char c, quit_char;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2106 Bool *critical = cl->critical;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2107 Lisp_Object keysym;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2108 GdkWindow *window = gdk_window_lookup (event->xany.window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2109 guint32 keycode = 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2110 GdkEventKey gdk_event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2111
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2112 if (window)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2113 f = gtk_any_window_to_frame (d, window);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2114
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2115 if (critical)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2116 *critical = False;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2117
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2118 if ((event->type != KeyPress) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2119 (! window) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2120 (! f) ||
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2121 (event->xkey.state
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2122 & (gd->MetaMask | gd->HyperMask | gd->SuperMask | gd->AltMask)))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2123 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2124 return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2125 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2126
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2127 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2128 char dummy[256];
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2129 XLookupString (&(event->xkey), dummy, 200, (KeySym *)&keycode, 0);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2130 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2131
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2132 memset (&gdk_event, 0, sizeof (gdk_event));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2133 gdk_event.type = GDK_KEY_PRESS;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2134 gdk_event.window = window;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2135 gdk_event.keyval = keycode;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2136 gdk_event.state = event->xkey.state;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2137
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2138 /* This duplicates some code that exists elsewhere, but it's relatively
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2139 fast and doesn't cons. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2140 keysym = gtk_to_emacs_keysym (d, &gdk_event, 1);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2141 if (NILP (keysym)) return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2142 if (CHAR_OR_CHAR_INTP (keysym))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2143 c = XCHAR_OR_CHAR_INT (keysym);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2144 /* Highly doubtful that these are the quit character, but... */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2145 else if (EQ (keysym, QKbackspace)) c = '\b';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2146 else if (EQ (keysym, QKtab)) c = '\t';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2147 else if (EQ (keysym, QKlinefeed)) c = '\n';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2148 else if (EQ (keysym, QKreturn)) c = '\r';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2149 else if (EQ (keysym, QKescape)) c = 27;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2150 else if (EQ (keysym, QKspace)) c = ' ';
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2151 else if (EQ (keysym, QKdelete)) c = 127;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2152 else return 0;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2153
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2154 if (event->xkey.state & gd->MetaMask) c |= 0x80;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2155 if ((event->xkey.state & ControlMask) && !(c >= 'A' && c <= 'Z'))
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2156 c &= 0x1F; /* unshifted control characters */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2157 quit_char = CONSOLE_QUIT_CHAR (XCONSOLE (DEVICE_CONSOLE (d)));
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2158
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2159 if (c == quit_char)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2160 return True;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2161 /* If we've got Control-Shift-G instead of Control-G, that means
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2162 we have a critical_quit. Caps_Lock is its own modifier, so it
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2163 won't cause ^G to act differently than before. */
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2164 if (event->xkey.state & ControlMask) c &= 0x1F;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2165 if (c == quit_char)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2166 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2167 if (critical) *critical = True;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2168 return True;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2169 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2170 return False;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2171 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2172
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2173 static void
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2174 gtk_check_for_quit_char (struct device *d)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2175 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2176 XEvent event;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2177 int queued;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2178 Bool critical_quit = False;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2179 struct _quit_predicate_closure closure;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2180
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2181 XEventsQueued (GDK_DISPLAY (), QueuedAfterReading);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2182
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2183 closure.device = d;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2184 closure.critical = &critical_quit;
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2185
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2186 queued = XCheckIfEvent (GDK_DISPLAY (), &event, quit_char_predicate, (char *) &closure);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2187
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2188 if (queued)
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2189 {
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2190 Vquit_flag = (critical_quit ? Qcritical : Qt);
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2191 }
0784d089fdc9 Import from CVS: tag r21-2-46
cvs
parents:
diff changeset
2192 }