Mercurial > emacs
annotate oldXMenu/Activate.c @ 47576:b31c8ab7336a
Sync with version 2.0.20. Lengthy ChangeLog follows:
2002-09-22 Kai Gro?ohann <grossjoh@ls6.informatik.uni-dortmund.de>
Version 2.0.20 released.
2002-09-20 Kai Gro?ohann <grossjoh@ls6.informatik.uni-dortmund.de>
* net/tramp.el (tramp-completion-function-alist): Escape open
paren in docstring.
(tramp-user-regexp, tramp-host-regexp): Allow empty strings.
(tramp-handle-insert-file-contents): Call tramp-message-for-buffer
instead of tramp-message.
(tramp-open-connection-rsh): Handle empty string as user name.
(tramp-open-connection-su): Handle empty string as host name.
Handle nil user name.
(tramp-handle-file-local-copy, tramp-handle-write-region)
(tramp-completion-handle-file-name-all-completions)
(tramp-open-connection-telnet, tramp-open-connection-rsh)
(tramp-open-connection-su, tramp-post-connection)
(tramp-maybe-open-connection, tramp-method-out-of-band-p)
(tramp-get-connection-function, tramp-get-remote-sh)
(tramp-get-rsh-program, tramp-get-rsh-args)
(tramp-get-rcp-program, tramp-get-rcp-args)
(tramp-get-rcp-keep-date-arg, tramp-get-su-program)
(tramp-get-su-args, tramp-get-telnet-program)
(tramp-get-telnet-args): Use `tramp-find-method', perhaps require
additional args USER, HOST.
(tramp-action-password, tramp-open-connection-telnet)
(tramp-open-connection-su, tramp-open-connection-multi)
(tramp-method-out-of-band-p): `tramp-method-out-of-band-p' now
takes USER and HOST arguments, to be able to use
`tramp-find-method'. Update callers.
(tramp-find-method): New function.
2002-09-20 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-handle-insert-directory): Handle "--dired"
in SWITCHES (by removing it).
2002-09-18 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-file-name-handler): Add `file-remote-p'
property.
2002-09-17 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (top-level): Maybe autoload uudecode-decode-region.
2002-09-16 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-bug): Add tramp-methods.
2002-09-16 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-methods): Update docstring:
tramp-encoding-command, tramp-decoding-command,
tramp-encoding-function and tramp-decoding-function are not
parameters anymore.
(tramp-uuencode-region): Autoload it.
2002-09-13 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
Version 2.0.19 released.
* net/tramp-uu.el: New file, implements uuencode in Lisp.
* net/tramp.el (tramp-coding-commands): Use
`tramp-uuencode-region' as local encoder for the uuencode based
entries.
2002-09-13 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-handle-write-region): Wrong parens.
2002-09-13 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
Version 2.0.18 released.
* net/tramp.el (tramp-perl-decode): Perl changes to accomodate
older versions of Perl. Now tested with 5.004. Suggestion from
Michael Albinus.
2002-09-12 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-find-inline-encoding): Call
tramp-call-local-coding-command with nil for INPUT and OUTPUT.
(tramp-call-local-coding-command): OUTPUT equals nil means to
discard the output. INPUT equals nil means /dev/null.
2002-09-12 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-encoding-shell): Default to environment
variable COMSPEC on Windows.
(tramp-handle-write-region): More debugging output.
(tramp-find-inline-encoding): Ditto.
2002-09-11 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-completion-handle-file-name-all-completions):
Define `result1'.
(tramp-parse-hosts-group): Discard IPv6 entries.
2002-09-11 Kai Gro?ohann <grossjoh@ls6.informatik.uni-dortmund.de>
* net/tramp.el (tramp-post-connection): Only send Perl
mime-encode/decode implementations when using inline method.
(tramp-handle-file-local-copy)
(tramp-handle-write-region, tramp-post-connection)
(tramp-coding-commands, tramp-find-inline-encoding): For the
inline encodings, distinguish between local and remote commands,
instead of between commands and functions. (The local commands
can be functions, too.) If the local host is a Windows machine,
we can't expect the same commands to work there as on the remote
host.
(tramp-call-local-coding-command): New function for calling local
encoding and decoding commands.
(tramp-set-remote-encoding, tramp-get-remote-encoding)
(tramp-set-remote-decoding, tramp-get-remote-decoding)
(tramp-set-local-encoding, tramp-get-local-encoding)
(tramp-set-local-decoding, tramp-get-local-decoding): New
functions.
(tramp-get-encoding-command, tramp-set-encoding-command)
(tramp-get-decoding-command, tramp-set-decoding-command)
(tramp-get-encoding-function, tramp-set-encoding-function)
(tramp-get-decoding-function, tramp-set-decoding-function): Old
functions, removed.
2002-09-10 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-open-connection-setup-interactive-shell):
Change command to invoke /bin/sh slightly to make it compatible
with the `rc' shell. Suggested by Daniel Pittman.
2002-09-10 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-handle-write-region): Added missing
`)'. Hope it's the right place.
2002-09-09 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-open-connection-setup-interactive-shell): Do
"exec env PS1='$ ' /bin/sh" instead of just "exec /bin/sh" in
order to get a sane shell prompt. If people have ${CWD}, say, in
their shell prompt, then the default login shell might display
something harmless, but the /bin/sh will display a dollar sign
which confused the subsequent prompt recognition.
(tramp-multi-action-password): More debugging output.
(tramp-encoding-shell): Renamed from tramp-sh-program. More
documentation. Default to cmd.exe on Windows NT.
(tramp-encoding-command-switch): New variable. Use instead of
hard-wired "-c" which is only good for /bin/sh.
(tramp-encoding-reads-stdin): New variable. If t, commands are
called like "/bin/sh -c COMMAND <INPUT", if nil, they are called
like "/bin/sh -c COMMAND INPUT", ie the input file is the last
argument.
(tramp-multi-sh-program): Always default to tramp-encoding-shell.
(tramp-handle-file-local-copy, tramp-handle-write-region): Respect
tramp-encoding-shell and friends.
(tramp-find-inline-encoding): Use new-style calls for checking if
the local commands work.
2002-09-07 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-methods): Remove `tramp-completion-function'
entries. They are handled now by
`tramp-completion-function-alist'.
(tramp-completion-function): Defvar removed. I've never used
it. Hmm.
(tramp-get-completion-function)
(tramp-get-completion-rsh, tramp-get-completion-ssh)
(tramp-get-completion-telnet, tramp-get-completion-su): Functions
removed as well. Not necessary any longer due to extended
customization means.
(tramp-completion-function-alist): New defcustom. Holds all
FUNCTION FILE pairs used for user and host name completion
relevant for METHOD.
(tramp-completion-function-alist-rsh)
(tramp-completion-function-alist-ssh)
(tramp-completion-function-alist-telnet)
(tramp-completion-function-alist-su): Defconst for initializing
`tramp-completion-function-alist'. Unfortunately, mainly UNIX-like
values are known for me until now. Needs to be completed for at
least VMS++ like operating systems.
(tramp-set-completion-function)
(tramp-get-completion-function): New functions for configuration
of `tramp-completion-function-alist'. The old definition of
`tramp-get-completion-function' has been discarded.
(tramp-completion-handle-file-name-all-completions): Change
function call for user/host completion according to definition in
`tramp-completion-function-alist'.
(tramp-parse-passwd): Added exception handling for "root", because
`tramp-get-completion-su' (the previous place for this stuff)
doesn't exist any longer.
2002-09-07 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-enter-password): Use
`tramp-password-end-of-line' to terminate the line.
(tramp-bug): Include new variable `tramp-password-end-of-line'.
(tramp-password-end-of-line): New variable. People who use plink
under Windows might have to issue "\r\n" after the password, but
they need to send just "\n" after the other commands. So this
variable was introduced to complement `tramp-rsh-end-of-line'.
(tramp-wait-for-output, tramp-post-connection): Allow "\r" at end
of line of the output delimiter.
2002-09-06 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-handle-file-local-copy, tramp-find-shell)
(tramp-open-connection-setup-interactive-shell): Add some comments
about Douglas Grey Stephen's suggestions to make Tramp work better
with plink under Windows. I'm not sure what to think of them, but
now I have a guinea pig to try it out on. Said guinea pig is
having other problems, though... Also remove some commented-out
code.
2002-09-06 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-get-completion-methods): Algorithm slightly
tuned.
(tramp-get-completion-user-host): Accept user names as they are if
typed until "@".
(tramp-completion-mode): Replace `last-input-char' by modern
`last-input-event'. Check for `event-modifiers'.
2002-09-06 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (file-expand-wildcards): Corrected check to see if
advising is necessary.
2002-09-05 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-postfix-single-method-format)
(tramp-postfix-multi-method-format)
(tramp-postfix-multi-hop-format)
(tramp-postfix-user-format): New format strings.
(tramp-postfix-single-method-regexp)
(tramp-postfix-multi-method-regexp)
(tramp-postfix-multi-hop-regexp)
(tramp-postfix-user-regexp)
(tramp-make-multi-tramp-file-format)
(tramp-make-tramp-file-name): Apply them.
(tramp-completion-handle-file-name-all-completions): Fix for
invoking ange-ftp in case of "/ftp:xxx" file names.
2002-09-04 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-prefix-format)
(tramp-postfix-host-format): New format strings.
(tramp-prefix-regexp, tramp-method-regexp)
(tramp-postfix-single-method-regexp)
(tramp-postfix-multi-method-regexp)
(tramp-postfix-multi-hop-regexp)
(tramp-user-regexp, tramp-postfix-user-regexp)
(tramp-host-regexp, tramp-postfix-host-regexp)
(tramp-path-regexp): New atomar regular expressions. If
corresponding format strings exist, derived from them.
(tramp-file-name-structure)
(tramp-multi-file-name-structure)
(tramp-multi-file-name-hop-structure)
(tramp-make-multi-tramp-file-format)
(tramp-completion-mode)
(tramp-completion-dissect-file-name)
(tramp-parse-rhosts-group)
(tramp-parse-shosts-group)
(tramp-parse-hosts-group)
(tramp-parse-passwd-group): Apply these expressions.
(tramp-file-name-structure-unified)
(tramp-file-name-structure-separate)
(tramp-make-tramp-file-format-unified)
(tramp-make-tramp-file-format-separate)
(tramp-make-tramp-file-format)
(tramp-make-tramp-file-user-nil-format-unified)
(tramp-make-tramp-file-user-nil-format-separate)
(tramp-make-tramp-file-user-nil-format)
(tramp-multi-file-name-structure-unified)
(tramp-multi-file-name-structure-separate)
(tramp-multi-file-name-hop-structure-unified)
(tramp-multi-file-name-hop-structure-separate)
(tramp-make-multi-tramp-file-format-unified)
(tramp-make-multi-tramp-file-format-separate): Removed.
(tramp-make-tramp-file-name): Allow partial tramp file
names. Generate tramp file format on-the-fly depending on
parameters. Apply atomar format strings resp expressions.
(tramp-get-completion-methods)
(tramp-get-completion-user-host): Apply
`tramp-make-tramp-file-name'.
(tramp-parse-hosts-group): Take all host names and IP addresses
into account.
(tramp-bug): Remove `tramp-make-tramp-file-format'.
2002-09-01 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-methods): Add `tramp-completion-function'
for "su" and "sudo".
(tramp-get-completion-telnet): Implement it.
(tramp-parse-hosts)
(tramp-parse-hosts-group)
(tramp-get-completion-su)
(tramp-parse-passwd)
(tramp-parse-passwd-group): New functions.
2002-08-31 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-completion-mode): Check for
`last-input-char'.
(tramp-completion-file-name-handler-alist): Add handler for
`file-exists-p.
(tramp-completion-handle-file-exists-p): New function.
(tramp-completion-handle-file-name-completion): Simplified.
(tramp-completion-dissect-file-name): Regexp's reorganised.
(tramp-completion-handle-file-name-all-completions): Call
completion-function only if `user' or `host' is given.
(tramp-get-completion-user-host): New function.
(tramp-get-completion-rsh)
(tramp-get-completion-ssh): Apply it.
2002-08-29 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-completion-file-name-handler-alist): Add
handler for `expand-file-name'.
(tramp-completion-handle-expand-file-name): New function.
2002-08-26 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-completion-mode): New function.
(tramp-completion-handle-file-name-directory)
(tramp-completion-handle-file-name-all-completions): Apply it.
(tramp-methods): Remove double definition of `ssh1-old' and
`ssh2-old'.
(tramp-point-at-eol): New defalias.
(tramp-parse-rhosts-group)
(tramp-parse-shosts-group):: Apply it.
2002-08-25 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-get-completion-methods)
(tramp-get-completion-rsh)
(tramp-get-completion-ssh): Add "[" for Xemacs.
(tramp-completion-file-name-regexp-separate): Expression adapted.
(tramp-completion-file-name-handler-alist): Add handler for
`file-name-directory' and `file-name-nondirectory'.
(tramp-completion-handle-file-name-directory)
(tramp-completion-handle-file-name-nondirectory)
(tramp-completion-run-real-handler): New functions.
(tramp-completion-file-name-handler)
(tramp-completion-handle-file-name-all-completions): Apply
`tramp-completion-run-real-handler'.
(tramp-parse-rhosts)
(tramp-parse-shosts): Use `with-temp-buffer'. `result? renamed to
`res' (otherwise side effects in XEmacs).
2002-08-24 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-completion-file-name-regexp)
(tramp-completion-file-name-handler-alist)
(tramp-flatten-list)
(tramp-completion-dissect-file-name)
(tramp-get-completion-rsh)
(tramp-parse-rhosts)
(tramp-parse-rhosts-group)
(tramp-get-completion-ssh): Doc string tuned.
(tramp-methods): Doc string and custom type extended for
`tramp-completion-function'.
(tramp-completion-function): Variable added. Is it really used?
Other variables like `tramp-completion-function' aren't used.
(tramp-completion-file-name-handler-alist): Add handler for
`file-name-completion'.
(tramp-completion-handle-file-name-completion): New function.
2002-08-18 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-parse-rhosts)
(tramp-parse-rhosts-group)
(tramp-parse-shosts)
(tramp-parse-shosts-group): New functions.
2002-08-17 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-completion-dissect-file-name)
(tramp-completion-dissect-file-name1): New functions.
2002-08-16 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-get-completion-function)
(tramp-get-completion-rsh)
(tramp-get-completion-ssh)
(tramp-get-completion-telnet): New functions.
(tramp-methods): Add `tramp-completion-function' for all methods.
2002-08-15 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-get-completion-methods): New function.
(tramp-find-default-method): Allow host to be nil (like user).
2002-08-14 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-completion-file-name-regexp-unified)
(tramp-completion-file-name-regexp-separate)
(tramp-completion-file-name-regexp)
(tramp-completion-file-name-handler-alist): New defcustoms.
(tramp-completion-file-name-handler): New function. Add
`tramp-completion-file-name-handler' to `file-name-handler-alist'.
(tramp-run-real-handler): Add `tramp-completion-file-name-handler'
to `inhibit-file-name-handlers'.
(tramp-completion-handle-file-name-all-completions)
(tramp-completion-handle-file-name-completion): New functions.
2002-08-12 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-invoke-ange-ftp): `tramp-disable-ange-ftp'
must be called again after activating `ange-ftp'.
(tramp-ange-ftp-file-name-p): Check for Xemacs.
2002-08-08 Michael Albinus <Michael.Albinus@alcatel.de>
* net/tramp.el (tramp-do-copy-or-rename-file): Don't pass
KEEP-DATE to tramp-invoke-ange-ftp 'rename.
(tramp-handle-write-region): Don't pass LOCKNAME and CONFIRM to
tramp-invoke-ange-ftp 'write-region.
(tramp-handle-set-file-modes): Change order of FILENAME and MODE
passing to tramp-invoke-ange-ftp 'set-file-modes.
(tramp-flatten-list): New function. Maybe this functionality does
exist already elsewhere in the libraries.
(tramp-invoke-ange-ftp): Apply `tramp-flatten-list' to parameter
list in order to avoid nested lists, f.e. when invoked from
`tramp-handle-dired-call-process'.
2002-09-05 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-chunksize): New kluge variable.
(tramp-send-region): If tramp-chunksize is non-nil, send region in
parts and sleep 0.1 seconds between chunks.
2002-09-03 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-handle-insert-directory): Use
`insert-buffer-substring' instead of `insert-buffer', which is not
supposed to be used from Lisp. Remember old point in a variable
instead of using `mark'. Suggestion from Stefan Monnier.
(tramp-unified-filenames): New variable. Use it in default value
of other filename variables.
(file-expand-wildcards): Don't advise unless "[" and "]" are used
in the filename format.
2002-09-01 Kai Gro?ohann <Kai.Grossjohann@CS.Uni-Dortmund.DE>
* net/tramp.el (tramp-methods): Remove duplicate definition of
ssh1-old and ssh2-old.
author | Kai Großjohann <kgrossjo@eu.uu.net> |
---|---|
date | Sun, 22 Sep 2002 13:23:36 +0000 |
parents | 17275bfd5698 |
children | 23a1cea22d13 |
rev | line source |
---|---|
44752
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
1 /* $Header: /cvsroot/emacs//emacs/oldXMenu/Activate.c,v 1.3 2000/07/21 14:36:24 gerd Exp $ */ |
25858 | 2 /* Copyright Massachusetts Institute of Technology 1985 */ |
3 | |
4 #include "copyright.h" | |
5 | |
6 /* | |
7 * XMenu: MIT Project Athena, X Window system menu package | |
8 * | |
9 * XMenuActivate - Maps a given menu to the display and activates | |
10 * the menu for user selection. The user is allowed to | |
11 * specify which pane and selection will be current, | |
12 * the X and Y location of the menu (relative to the | |
13 * parent window) and the mouse button event mask that | |
14 * will be used to identify a selection request. | |
15 * | |
16 * A menu selection is shown to be current by placing | |
17 * a highlight box around the selection as the mouse | |
18 * cursor enters its active region. Inactive selections | |
19 * will not be highlighted. As the mouse cursor moved | |
20 * from one menu pane to another menu pane the pane being | |
21 * entered is raised and made current and the pane being | |
22 * left is lowered. | |
23 * | |
24 * Anytime XMenuActivate returns, the p_num and | |
25 * s_num are left at their last known values (i.e., | |
26 * the last known current pane and selection indices). | |
27 * The following are the defined return states: | |
28 * | |
29 * 1) If at any time an error occurs the data | |
30 * pointer is left untouched and XM_FAILURE | |
31 * is returned. | |
32 * | |
33 * 2) When a selection request is received (i.e., | |
34 * when the specified mouse event occurs) the | |
35 * data pointer will be set to the data | |
36 * associated with the particular selection | |
37 * current at the time of the selection request | |
38 * and XM_SUCCESS is returned. | |
39 * | |
40 * 3) If no selection was current at the time a | |
41 * selection request is made the data pointer | |
42 * will be left untouched and XM_NO_SELECT will | |
43 * be returned. | |
44 * | |
45 * 4) If the selection that was current at the time | |
46 * a selection request is made is not an active | |
47 * selection the data pointer will be left | |
48 * untouched and XM_IA_SELECT will be returned. | |
49 * | |
50 * Since X processes events in an asynchronous manner | |
51 * it is likely that XMenuActivate will encounter | |
52 * a "foreign event" while it is executing. Foreign | |
53 * events are handled in one of three ways: | |
54 * | |
55 * 1) The event is discarded. This is the default | |
56 * mode and requires no action on the part of the | |
57 * application. | |
58 * | |
59 * 2) The application has identified an asynchronous | |
60 * event handler that will be called and the | |
61 * foreign event handed off to it. Note: | |
62 * AEQ mode disables this mode temporarily. | |
63 * | |
64 * 3) The application has enabled asynchronous event | |
65 * queuing mode. In this mode all foreign events | |
66 * will be queued up untill XMenuActivate | |
67 * terminates; at which time they will be | |
68 * returned to the X event queue. As long as | |
69 * AEQ mode is enabled any asynchronous event | |
70 * handler as temporarily disabled. | |
71 * | |
72 * Any events encountered while taking down the menu | |
73 * (i.e., exposure events from occluded windows) will | |
74 * automatically be returned to the X event queue after | |
75 * XMenuActivate has cleaned the queue of any of its own | |
76 * events that are no longer needed. | |
77 * | |
78 * Author: Tony Della Fera, DEC | |
79 * March 12, 1986 | |
80 * | |
81 */ | |
82 | |
83 #include <config.h> | |
84 #include "XMenuInt.h" | |
85 | |
44752
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
86 /* For debug, set this to 0 to not grab the keyboard on menu popup */ |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
87 int x_menu_grab_keyboard = 1; |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
88 |
25858 | 89 int |
27457
bbfd0e676041
(XMenuActivate): Add parameter HELP_CALLBACK.
Gerd Moellmann <gerd@gnu.org>
parents:
25858
diff
changeset
|
90 XMenuActivate(display, menu, p_num, s_num, x_pos, y_pos, event_mask, data, |
bbfd0e676041
(XMenuActivate): Add parameter HELP_CALLBACK.
Gerd Moellmann <gerd@gnu.org>
parents:
25858
diff
changeset
|
91 help_callback) |
25858 | 92 register Display *display; /* Display to put menu on. */ |
93 register XMenu *menu; /* Menu to activate. */ | |
94 int *p_num; /* Pane number selected. */ | |
95 int *s_num; /* Selection number selected. */ | |
96 int x_pos; /* X coordinate of menu position. */ | |
97 int y_pos; /* Y coordinate of menu position. */ | |
98 unsigned int event_mask; /* Mouse button event mask. */ | |
99 char **data; /* Pointer to return data value. */ | |
27457
bbfd0e676041
(XMenuActivate): Add parameter HELP_CALLBACK.
Gerd Moellmann <gerd@gnu.org>
parents:
25858
diff
changeset
|
100 void (* help_callback) (); /* Help callback. */ |
25858 | 101 { |
102 int status; /* X routine call status. */ | |
103 int orig_x; /* Upper left menu origin X coord. */ | |
104 int orig_y; /* Upper left menu origin Y coord. */ | |
105 int ret_val; /* Return value. */ | |
106 | |
107 register XMPane *p_ptr; /* Current XMPane. */ | |
108 register XMPane *event_xmp; /* Event XMPane pointer. */ | |
109 register XMPane *cur_p; /* Current pane. */ | |
110 register XMSelect *cur_s; /* Current selection. */ | |
111 XMWindow *event_xmw; /* Event XMWindow pointer. */ | |
112 XEvent event; /* X input event. */ | |
113 XEvent peek_event; /* X input peek ahead event. */ | |
114 | |
115 Bool selection = False; /* Selection has been made. */ | |
116 Bool forward = True; /* Moving forward in the pane list. */ | |
117 | |
118 Window root, child; | |
119 int root_x, root_y, win_x, win_y; | |
120 unsigned int mask; | |
121 | |
122 /* | |
123 * Define and allocate a foreign event queue to hold events | |
124 * that don't belong to XMenu. These events are later restored | |
125 * to the X event queue. | |
126 */ | |
127 typedef struct _xmeventque { | |
128 XEvent event; | |
129 struct _xmeventque *next; | |
130 } XMEventQue; | |
131 | |
132 XMEventQue *feq = NULL; /* Foreign event queue. */ | |
133 XMEventQue *feq_tmp; /* Foreign event queue temporary. */ | |
134 | |
135 /* | |
136 * If there are no panes in the menu then return failure | |
137 * because the menu is not initialized. | |
138 */ | |
139 if (menu->p_count == 0) { | |
140 _XMErrorCode = XME_NOT_INIT; | |
141 return(XM_FAILURE); | |
142 } | |
143 | |
144 /* | |
145 * Find the desired current pane. | |
146 */ | |
147 cur_p = _XMGetPanePtr(menu, *p_num); | |
148 if (cur_p == NULL) { | |
149 return(XM_FAILURE); | |
150 } | |
151 cur_p->activated = cur_p->active; | |
152 | |
153 /* | |
154 * Find the desired current selection. | |
155 * If the current selection index is out of range a null current selection | |
156 * will be assumed and the cursor will be placed in the current pane | |
157 * header. | |
158 */ | |
159 cur_s = _XMGetSelectionPtr(cur_p, *s_num); | |
160 | |
161 /* | |
162 * Compute origin of menu so that cursor is in | |
163 * Correct pane and selection. | |
164 */ | |
165 _XMTransToOrigin(display, | |
166 menu, | |
167 cur_p, cur_s, | |
168 x_pos, y_pos, | |
169 &orig_x, &orig_y); | |
170 menu->x_pos = orig_x; /* Store X and Y coords of menu. */ | |
171 menu->y_pos = orig_y; | |
172 | |
173 if (XMenuRecompute(display, menu) == XM_FAILURE) { | |
174 return(XM_FAILURE); | |
175 } | |
176 | |
177 /* | |
178 * Flush the window creation queue. | |
179 * This batches all window creates since lazy evaluation | |
180 * is more efficient than individual evaluation. | |
181 * This routine also does an XFlush(). | |
182 */ | |
183 if (_XMWinQueFlush(display, menu, cur_p, cur_s) == _FAILURE) { | |
184 return(XM_FAILURE); | |
185 } | |
186 | |
187 /* | |
188 * Make sure windows are in correct order (in case we were passed | |
189 * an already created menu in incorrect order.) | |
190 */ | |
191 for(p_ptr = menu->p_list->next; p_ptr != cur_p; p_ptr = p_ptr->next) | |
192 XRaiseWindow(display, p_ptr->window); | |
193 for(p_ptr = menu->p_list->prev; p_ptr != cur_p->prev; p_ptr = p_ptr->prev) | |
194 XRaiseWindow(display, p_ptr->window); | |
195 | |
196 /* | |
197 * Make sure all selection windows are mapped. | |
198 */ | |
199 for ( | |
200 p_ptr = menu->p_list->next; | |
201 p_ptr != menu->p_list; | |
202 p_ptr = p_ptr->next | |
203 ){ | |
204 XMapSubwindows(display, p_ptr->window); | |
205 } | |
206 | |
207 /* | |
208 * Synchronize the X buffers and the event queue. | |
209 * From here on, all events in the queue that don't belong to | |
210 * XMenu are sent back to the application via an application | |
211 * provided event handler or discarded if the application has | |
212 * not provided an event handler. | |
213 */ | |
214 XSync(display, 0); | |
215 | |
216 /* | |
217 * Grab the mouse for menu input. | |
218 */ | |
219 | |
220 status = XGrabPointer( | |
221 display, | |
222 menu->parent, | |
223 True, | |
224 event_mask, | |
225 GrabModeAsync, | |
226 GrabModeAsync, | |
227 None, | |
228 menu->mouse_cursor, | |
229 CurrentTime | |
230 ); | |
44752
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
231 if (status == Success && x_menu_grab_keyboard) |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
232 { |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
233 status = XGrabKeyboard (display, |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
234 menu->parent, |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
235 False, |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
236 GrabModeAsync, |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
237 GrabModeAsync, |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
238 CurrentTime); |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
239 if (status != Success) |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
240 XUngrabPointer(display, CurrentTime); |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
241 } |
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
242 |
25858 | 243 if (status == _X_FAILURE) { |
244 _XMErrorCode = XME_GRAB_MOUSE; | |
245 return(XM_FAILURE); | |
246 } | |
247 | |
248 /* | |
249 * Map the menu panes. | |
250 */ | |
251 XMapWindow(display, cur_p->window); | |
252 for (p_ptr = menu->p_list->next; | |
253 p_ptr != cur_p; | |
254 p_ptr = p_ptr->next) | |
255 XMapWindow(display, p_ptr->window); | |
256 for (p_ptr = cur_p->next; | |
257 p_ptr != menu->p_list; | |
258 p_ptr = p_ptr->next) | |
259 XMapWindow(display, p_ptr->window); | |
260 | |
261 XRaiseWindow(display, cur_p->window); /* Make sure current */ | |
262 /* pane is on top. */ | |
263 | |
264 cur_s = NULL; /* Clear current selection. */ | |
265 | |
266 /* | |
267 * Begin event processing loop. | |
268 */ | |
269 while (1) { | |
270 XNextEvent(display, &event); /* Get next event. */ | |
271 switch (event.type) { /* Dispatch on the event type. */ | |
272 case Expose: | |
273 event_xmp = (XMPane *)XLookUpAssoc(display, | |
274 menu->assoc_tab, | |
275 event.xexpose.window); | |
276 if (event_xmp == NULL) { | |
277 /* | |
278 * If AEQ mode is enabled then queue the event. | |
279 */ | |
280 if (menu->aeq) { | |
281 feq_tmp = (XMEventQue *)malloc(sizeof(XMEventQue)); | |
282 if (feq_tmp == NULL) { | |
283 _XMErrorCode = XME_CALLOC; | |
284 return(XM_FAILURE); | |
285 } | |
286 feq_tmp->event = event; | |
287 feq_tmp->next = feq; | |
288 feq = feq_tmp; | |
289 } | |
290 else if (_XMEventHandler) (*_XMEventHandler)(&event); | |
291 break; | |
292 } | |
293 if (event_xmp->activated) { | |
294 XSetWindowBackground(display, | |
295 event_xmp->window, | |
296 menu->bkgnd_color); | |
297 } | |
298 else { | |
299 XSetWindowBackgroundPixmap(display, | |
300 event_xmp->window, | |
301 menu->inact_pixmap); | |
302 } | |
303 _XMRefreshPane(display, menu, event_xmp); | |
304 break; | |
305 case EnterNotify: | |
306 /* | |
307 * First wait a small period of time, and see | |
308 * if another EnterNotify event follows hard on the | |
309 * heels of this one. i.e., the user is simply | |
310 * "passing through". If so, ignore this one. | |
311 */ | |
312 | |
313 event_xmw = (XMWindow *)XLookUpAssoc(display, | |
314 menu->assoc_tab, | |
315 event.xcrossing.window); | |
316 if (event_xmw == NULL) break; | |
317 if (event_xmw->type == SELECTION) { | |
318 /* | |
319 * We have entered a selection. | |
320 */ | |
321 /* if (XPending(display) == 0) usleep(150000); */ | |
322 if (XPending(display) != 0) { | |
323 XPeekEvent(display, &peek_event); | |
324 if(peek_event.type == LeaveNotify) { | |
325 break; | |
326 } | |
327 } | |
328 cur_s = (XMSelect *)event_xmw; | |
30365
5eece465cb5d
(XMenuActivate): Call help callback with two more
Gerd Moellmann <gerd@gnu.org>
parents:
27457
diff
changeset
|
329 help_callback (cur_s->help_string, |
5eece465cb5d
(XMenuActivate): Call help callback with two more
Gerd Moellmann <gerd@gnu.org>
parents:
27457
diff
changeset
|
330 cur_p->serial, cur_s->serial); |
27457
bbfd0e676041
(XMenuActivate): Add parameter HELP_CALLBACK.
Gerd Moellmann <gerd@gnu.org>
parents:
25858
diff
changeset
|
331 |
25858 | 332 /* |
333 * If the pane we are in is active and the | |
334 * selection entered is active then activate | |
335 * the selection. | |
336 */ | |
337 if (cur_p->active && cur_s->active > 0) { | |
338 cur_s->activated = 1; | |
339 _XMRefreshSelection(display, menu, cur_s); | |
340 } | |
341 } | |
342 else { | |
343 /* | |
344 * We have entered a pane. | |
345 */ | |
346 /* if (XPending(display) == 0) usleep(150000); */ | |
347 if (XPending(display) != 0) { | |
348 XPeekEvent(display, &peek_event); | |
349 if (peek_event.type == EnterNotify) break; | |
350 } | |
351 XQueryPointer(display, | |
352 menu->parent, | |
353 &root, &child, | |
354 &root_x, &root_y, | |
355 &win_x, &win_y, | |
356 &mask); | |
357 event_xmp = (XMPane *)XLookUpAssoc(display, | |
358 menu->assoc_tab, | |
359 child); | |
360 if (event_xmp == NULL) break; | |
361 if (event_xmp == cur_p) break; | |
362 if (event_xmp->serial > cur_p->serial) forward = True; | |
363 else forward = False; | |
364 p_ptr = cur_p; | |
365 while (p_ptr != event_xmp) { | |
366 if (forward) p_ptr = p_ptr->next; | |
367 else p_ptr = p_ptr->prev; | |
368 XRaiseWindow(display, p_ptr->window); | |
369 } | |
370 if (cur_p->activated) { | |
371 cur_p->activated = False; | |
372 XSetWindowBackgroundPixmap(display, | |
373 cur_p->window, | |
374 menu->inact_pixmap); | |
375 _XMRefreshPane(display, menu, cur_p); | |
376 } | |
377 if (event_xmp->active) event_xmp->activated = True; | |
378 #if 1 | |
379 /* | |
380 * i suspect the we don't get an EXPOSE event when backing | |
381 * store is enabled; the menu windows content is probably | |
382 * not drawn in when it should be in that case. | |
383 * in that case, this is probably an ugly fix! | |
384 * i hope someone more familiar with this code would | |
385 * take it from here. -- caveh@eng.sun.com. | |
386 */ | |
387 XSetWindowBackground(display, | |
388 event_xmp->window, | |
389 menu->bkgnd_color); | |
390 _XMRefreshPane(display, menu, event_xmp); | |
391 #endif | |
392 cur_p = event_xmp; | |
393 } | |
394 break; | |
395 case LeaveNotify: | |
396 event_xmw = (XMWindow *)XLookUpAssoc( | |
397 display, | |
398 menu->assoc_tab, | |
399 event.xcrossing.window | |
400 ); | |
401 if (event_xmw == NULL) break; | |
402 if(cur_s == NULL) break; | |
403 | |
404 /* | |
405 * If the current selection was activated then | |
406 * deactivate it. | |
407 */ | |
408 if (cur_s->activated) { | |
409 cur_s->activated = False; | |
410 _XMRefreshSelection(display, menu, cur_s); | |
411 } | |
412 cur_s = NULL; | |
413 break; | |
414 | |
415 case ButtonPress: | |
416 case ButtonRelease: | |
417 *p_num = cur_p->serial; | |
418 /* | |
419 * Check to see if there is a current selection. | |
420 */ | |
421 if (cur_s != NULL) { | |
422 /* | |
423 * Set the selection number to the current selection. | |
424 */ | |
425 *s_num = cur_s->serial; | |
426 /* | |
427 * If the current selection was activated then | |
428 * we have a valid selection otherwise we have | |
429 * an inactive selection. | |
430 */ | |
431 if (cur_s->activated) { | |
432 *data = cur_s->data; | |
433 ret_val = XM_SUCCESS; | |
434 } | |
435 else { | |
436 ret_val = XM_IA_SELECT; | |
437 } | |
438 } | |
439 else { | |
440 /* | |
441 * No selection was current. | |
442 */ | |
443 ret_val = XM_NO_SELECT; | |
444 } | |
445 selection = True; | |
446 break; | |
447 default: | |
448 /* | |
449 * If AEQ mode is enabled then queue the event. | |
450 */ | |
451 if (menu->aeq) { | |
452 feq_tmp = (XMEventQue *)malloc(sizeof(XMEventQue)); | |
453 if (feq_tmp == NULL) { | |
454 _XMErrorCode = XME_CALLOC; | |
455 return(XM_FAILURE); | |
456 } | |
457 feq_tmp->event = event; | |
458 feq_tmp->next = feq; | |
459 feq = feq_tmp; | |
460 } | |
461 else if (_XMEventHandler) (*_XMEventHandler)(&event); | |
462 } | |
463 /* | |
464 * If a selection has been made, break out of the event loop. | |
465 */ | |
466 if (selection == True) break; | |
467 } | |
468 | |
469 /* | |
470 * Unmap the menu. | |
471 */ | |
472 for ( p_ptr = menu->p_list->next; | |
473 p_ptr != menu->p_list; | |
474 p_ptr = p_ptr->next) | |
475 { | |
476 XUnmapWindow(display, p_ptr->window); | |
477 } | |
478 | |
479 /* | |
480 * Ungrab the mouse. | |
481 */ | |
482 XUngrabPointer(display, CurrentTime); | |
44752
17275bfd5698
Add calls to GrabKeyboard to remove strange
Jan Djärv <jan.h.d@swipnet.se>
parents:
30365
diff
changeset
|
483 XUngrabKeyboard(display, CurrentTime); |
25858 | 484 |
485 /* | |
486 * Restore bits under where the menu was if we managed | |
487 * to save them and free the pixmap. | |
488 */ | |
489 | |
490 /* | |
491 * If there is a current selection deactivate it. | |
492 */ | |
493 if (cur_s != NULL) cur_s->activated = 0; | |
494 | |
495 /* | |
496 * Deactivate the current pane. | |
497 */ | |
498 cur_p->activated = 0; | |
499 XSetWindowBackgroundPixmap(display, cur_p->window, menu->inact_pixmap); | |
500 | |
501 /* | |
502 * Synchronize the X buffers and the X event queue. | |
503 */ | |
504 XSync(display, 0); | |
505 | |
506 /* | |
507 * Dispatch any events remaining on the queue. | |
508 */ | |
509 while (QLength(display)) { | |
510 /* | |
511 * Fetch the next event. | |
512 */ | |
513 XNextEvent(display, &event); | |
514 | |
515 /* | |
516 * Discard any events left on the queue that belong to XMenu. | |
517 * All others are held and then returned to the event queue. | |
518 */ | |
519 switch (event.type) { | |
520 case Expose: | |
521 case EnterNotify: | |
522 case LeaveNotify: | |
523 case ButtonPress: | |
524 case ButtonRelease: | |
525 /* | |
526 * Does this event belong to one of XMenu's windows? | |
527 * If so, discard it and process the next event. | |
528 * If not fall through and treat it as a foreign event. | |
529 */ | |
530 event_xmp = (XMPane *)XLookUpAssoc( | |
531 display, | |
532 menu->assoc_tab, | |
533 event.xbutton.window | |
534 ); | |
535 if (event_xmp != NULL) continue; | |
536 default: | |
537 /* | |
538 * This is a foreign event. | |
539 * Queue it for later return to the X event queue. | |
540 */ | |
541 feq_tmp = (XMEventQue *)malloc(sizeof(XMEventQue)); | |
542 if (feq_tmp == NULL) { | |
543 _XMErrorCode = XME_CALLOC; | |
544 return(XM_FAILURE); | |
545 } | |
546 feq_tmp->event = event; | |
547 feq_tmp->next = feq; | |
548 feq = feq_tmp; | |
549 } | |
550 } | |
551 /* | |
552 * Return any foreign events that were queued to the X event queue. | |
553 */ | |
554 while (feq != NULL) { | |
555 feq_tmp = feq; | |
556 XPutBackEvent(display, &feq_tmp->event); | |
557 feq = feq_tmp->next; | |
558 free((char *)feq_tmp); | |
559 } | |
560 | |
561 /* | |
562 * Return successfully. | |
563 */ | |
564 _XMErrorCode = XME_NO_ERROR; | |
565 return(ret_val); | |
566 | |
567 } |