diff options
author | Alan Mackenzie <acm@muc.de> | 2011-10-28 14:02:04 +0000 |
---|---|---|
committer | Alan Mackenzie <acm@muc.de> | 2011-10-28 14:02:04 +0000 |
commit | bc97a826f8ea89a269f6043be3148930f023e2b2 (patch) | |
tree | e927788ae7ba1058100dfb6c211ff57e6440de4c | |
parent | c0f13227ab16ad9a87a16182e9d9ace5d2f7a6d9 (diff) | |
parent | 9aba60432c25b060680eb7db698b20b05d7b94a0 (diff) | |
download | emacs-bc97a826f8ea89a269f6043be3148930f023e2b2.tar.gz |
Merge
-rw-r--r-- | lisp/ChangeLog | 58 | ||||
-rw-r--r-- | lisp/mail/rmail.el | 1 | ||||
-rw-r--r-- | lisp/progmodes/gdb-mi.el | 42 | ||||
-rw-r--r-- | lisp/vc/log-edit.el | 14 | ||||
-rw-r--r-- | src/ChangeLog | 33 | ||||
-rw-r--r-- | src/emacs.c | 1 | ||||
-rw-r--r-- | src/keyboard.c | 124 | ||||
-rw-r--r-- | src/lisp.h | 20 | ||||
-rw-r--r-- | src/w32.h | 1 | ||||
-rw-r--r-- | src/w32font.c | 149 |
10 files changed, 340 insertions, 103 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 6aa1bddb9f3..bf4d87d3405 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,57 @@ +2011-10-28 Alan Mackenzie <acm@muc.de> + + Amend to indent and fontify macros "which include their own semicolon" + correctly, using the "virtual semicolon" mechanism. + + * cc-defs.el: Update "virtual semicolon" comments. + + * cc-engine.el (c-crosses-statement-barrier-p): Recoded to scan one line at + at time rather than having \n and \r explicitly in c-stmt-delim-chars + (for some modes, e.g. AWK). + (c-forward-label): Amend for virtual semicolons. + (c-at-macro-vsemi-p, c-macro-vsemi-status-unknown-p): New functions + + * cc-fonts.el (c-font-lock-declarations): Take account of the new C macros. + + * cc-langs.el (c-at-vsemi-p-fn, c-vsemi-status-unknown-p-fn): move to + earlier in the file. + (c-opt-cpp-symbol, c-line-comment-start-regexp): New language variables. + (c-opt-cpp-macro-define): Make into a full language variable. + (c-stmt-delim-chars, c-stmt-delim-chars-with-comma): Special value for + AWK Mode (including \n, \r) removed, no longer needed. + + * cc-mode.el (c-mode, c++-mode, objc-mode): Invoke + c-make-macro-with-semi-re. (Erroneously committed early, in previous + version, 5.259.) + + * cc-vars.el (c-macro-with-semi-re, c-macro-names-with-semicolon): New + variables. + (c-make-macro-with-semi-re): New function + + * cc-mode.texi (Indentation Commands): Mention "macros with semicolons". + (Other Special Indentations): Add an xref to "Macros with ;". + (Customizing Macros): Add stuff about syntax in macros. Add an xref to + "Macros with ;". + (Macros with ;): New page. + + + +2011-10-28 Stefan Monnier <monnier@iro.umontreal.ca> + + * vc/log-edit.el: Fill empty field rather than adding new one. + (log-edit-add-field): New function. + (log-edit-insert-changelog): Use it. + +2011-10-28 Mark Lillibridge <mark.lillibridge@hp.com> (tiny change) + + * mail/rmail.el (rmail-mode-map): Add M-C-f as in rmailsum (bug#9802). + +2011-10-28 Stefan Monnier <monnier@iro.umontreal.ca> + + * progmodes/gdb-mi.el: Warn the user when -i=mi is missing. + (gdb--check-interpreter): New function. + (gdb): Use it. + 2011-10-27 Glenn Morris <rgm@gnu.org> * emacs-lisp/cl-extra.el (most-positive-float, most-negative-float) @@ -21,8 +75,8 @@ * subr.el (change-major-mode-after-body-hook): New hook. (run-mode-hooks): Run it. - * emacs-lisp/easy-mmode.el (define-globalized-minor-mode): Use - change-major-mode-before-body-hook. + * emacs-lisp/easy-mmode.el (define-globalized-minor-mode): + Use change-major-mode-before-body-hook. * simple.el (fundamental-mode): * emacs-lisp/derived.el (define-derived-mode): Revert 2010-04-28 diff --git a/lisp/mail/rmail.el b/lisp/mail/rmail.el index 770050efb08..603a615192a 100644 --- a/lisp/mail/rmail.el +++ b/lisp/mail/rmail.el @@ -1008,6 +1008,7 @@ The buffer is expected to be narrowed to just the header of the message." (define-key map "\e\C-l" 'rmail-summary-by-labels) (define-key map "\e\C-r" 'rmail-summary-by-recipients) (define-key map "\e\C-s" 'rmail-summary-by-regexp) + (define-key map "\e\C-f" 'rmail-summary-by-senders) (define-key map "\e\C-t" 'rmail-summary-by-topic) (define-key map "m" 'rmail-mail) (define-key map "\em" 'rmail-retry-failure) diff --git a/lisp/progmodes/gdb-mi.el b/lisp/progmodes/gdb-mi.el index 22db7b2e5f4..dde00d753ac 100644 --- a/lisp/progmodes/gdb-mi.el +++ b/lisp/progmodes/gdb-mi.el @@ -43,21 +43,10 @@ ;; M-x gdb will start the debugger. -;; This file uses GDB/MI as the primary interface to GDB. It is still under -;; development and is part of a process to migrate Emacs from annotations (as -;; used in gdb-ui.el) to GDB/MI. It runs gdb with GDB/MI (-interp=mi) and -;; access CLI using "-interpreter-exec console cli-command". This code works -;; without gdb-ui.el and uses MI tokens instead of queues. Eventually MI -;; should be asynchronous. - -;; This mode will PARTLY WORK WITH RECENT GDB RELEASES (status in modeline -;; doesn't update properly when execution commands are issued from GUD buffer) -;; and WORKS BEST when GDB runs asynchronously: maint set linux-async on. -;; -;; You need development version of GDB 7.0 for the thread buffer to work. - -;; This file replaces gdb-ui.el and is for development with GDB. Use the -;; release branch of Emacs 22 for the latest version of gdb-ui.el. +;; This file uses GDB/MI as the primary interface to GDB. It runs gdb with +;; GDB/MI (-interp=mi) and access CLI using "-interpreter-exec console +;; cli-command". This code works without gdb-ui.el and uses MI tokens instead +;; of queues. Eventually MI should be asynchronous. ;; Windows Platforms: @@ -599,6 +588,22 @@ NOARG must be t when this macro is used outside `gud-def'" (concat (gdb-gud-context-command ,cmd1 ,noall) " " ,cmd2) ,(when (not noarg) 'arg))) +(defun gdb--check-interpreter (proc string) + (unless (zerop (length string)) + (let ((filter (process-get proc 'gud-normal-filter))) + (set-process-filter proc filter) + (unless (memq (aref string 0) '(?^ ?~ ?@ ?& ?* ?=)) + ;; Apparently we're not running with -i=mi. + (let ((msg "Error: you did not specify -i=mi on GDB's command line!")) + (message msg) + (setq string (concat (propertize msg 'font-lock-face 'error) + "\n" string))) + ;; Use the old gud-gbd filter, not because it works, but because it + ;; will properly display GDB's answers rather than hanging waiting for + ;; answers that aren't coming. + (set (make-local-variable 'gud-marker-filter) #'gud-gdb-marker-filter)) + (funcall filter proc string)))) + ;;;###autoload (defun gdb (command-line) "Run gdb on program FILE in buffer *gud-FILE*. @@ -665,6 +670,13 @@ detailed description of this mode. "Multiple debugging requires restarting in text command mode")) ;; (gud-common-init command-line nil 'gud-gdbmi-marker-filter) + + ;; Setup a temporary process filter to warn when GDB was not started + ;; with -i=mi. + (let ((proc (get-buffer-process gud-comint-buffer))) + (process-put proc 'gud-normal-filter (process-filter proc)) + (set-process-filter proc #'gdb--check-interpreter)) + (set (make-local-variable 'gud-minor-mode) 'gdbmi) (setq comint-input-sender 'gdb-send) (when (ring-empty-p comint-input-ring) ; cf shell-mode diff --git a/lisp/vc/log-edit.el b/lisp/vc/log-edit.el index c421304442f..f57429c76c7 100644 --- a/lisp/vc/log-edit.el +++ b/lisp/vc/log-edit.el @@ -593,6 +593,13 @@ to build the Fixes: header.") (put 'log-edit-rewrite-fixes 'safe-local-variable (lambda (v) (and (stringp (car-safe v)) (stringp (cdr v))))) +(defun log-edit-add-field (field value) + (rfc822-goto-eoh) + (if (save-excursion (re-search-backward (concat "^" field ":\\([ \t]*\\)$") + nil t)) + (replace-match (concat " " value) t t nil 1) + (insert field ": " value "\n" (if (looking-at "\n") "" "\n")))) + (defun log-edit-insert-changelog (&optional use-first) "Insert a log message by looking at the ChangeLog. The idea is to write your ChangeLog entries first, and then use this @@ -620,9 +627,7 @@ regardless of user name or time." (log-edit-insert-changelog-entries (log-edit-files))))) (log-edit-set-common-indentation) ;; Add an Author: field if appropriate. - (when author - (rfc822-goto-eoh) - (insert "Author: " author "\n" (if (looking-at "\n") "" "\n"))) + (when author (log-edit-add-field "Author" author)) ;; Add a Fixes: field if applicable. (when (consp log-edit-rewrite-fixes) (rfc822-goto-eoh) @@ -632,8 +637,7 @@ regardless of user name or time." (fixes (match-substitute-replacement (cdr log-edit-rewrite-fixes)))) (delete-region start end) - (rfc822-goto-eoh) - (insert "Fixes: " fixes "\n" (if (looking-at "\n") "" "\n"))))) + (log-edit-add-field "Fixes" fixes)))) (and log-edit-strip-single-file-name (progn (rfc822-goto-eoh) (if (looking-at "\n") (forward-char 1)) diff --git a/src/ChangeLog b/src/ChangeLog index 0d421223228..50fc953024a 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,32 @@ +2011-10-28 Stefan Monnier <monnier@iro.umontreal.ca> + + * lisp.h (struct Lisp_Symbol): Update comments. + +2011-10-28 Juanma Barranquero <lekktu@gmail.com> + + * w32font.c (w32_load_unicows_or_gdi32): Add missing return. + +2011-10-28 Eli Zaretskii <eliz@gnu.org> + + Fix Emacs on Windows 9X (bug#8562). Thanks to oslsachem + <oslsachem@gmail.com> for helping to debug this. + + * w32font.c (g_b_init_is_w9x, g_b_init_get_outline_metrics_w) + (g_b_init_get_text_metrics_w, g_b_init_get_glyph_outline_w) + (g_b_init_get_glyph_outline_w): New static variables. + (GetOutlineTextMetricsW_Proc, GetTextMetricsW_Proc) + (GetGlyphOutlineW_Proc): New typedefs. + (w32_load_unicows_or_gdi32, get_outline_metrics_w) + (get_text_metrics_w, get_glyph_outline_w, globals_of_w32font): + New functions. + (w32font_open_internal, compute_metrics): + Call get_outline_metrics_w, get_text_metrics_w, and get_glyph_outline_w + instead of calling the "wide" APIs directly. + + * emacs.c (main) [HAVE_NTGUI]: Call globals_of_w32font. + + * w32.h (syms_of_w32font): Add prototype. + 2011-10-27 Juanma Barranquero <lekktu@gmail.com> * window.c (Fframe_root_window, Fframe_first_window, Fwindow_end) @@ -18,8 +47,8 @@ 2011-10-27 Chong Yidong <cyd@gnu.org> - * gnutls.c (emacs_gnutls_deinit): New function. Deallocate - credentials structures as well as calling gnutls_deinit. + * gnutls.c (emacs_gnutls_deinit): New function. + Deallocate credentials structures as well as calling gnutls_deinit. (Fgnutls_deinit, Fgnutls_boot): Use it. * process.c (make_process): Initialize GnuTLS credentials to NULL. diff --git a/src/emacs.c b/src/emacs.c index 073156bb0c9..12be7bc0808 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -1591,6 +1591,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem /* Initialization that must be done even if the global variable initialized is non zero. */ #ifdef HAVE_NTGUI + globals_of_w32font (); globals_of_w32fns (); globals_of_w32menu (); globals_of_w32select (); diff --git a/src/keyboard.c b/src/keyboard.c index eb316947dcb..95604550c80 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -73,7 +73,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ #include "nsterm.h" #endif -/* Variables for blockinput.h: */ +/* Variables for blockinput.h: */ /* Non-zero if interrupt input is blocked right now. */ volatile int interrupt_input_blocked; @@ -338,7 +338,7 @@ static Lisp_Object Qconfig_changed_event; Lisp_Object Qevent_kind; static Lisp_Object Qevent_symbol_elements; -/* menu and tool bar item parts */ +/* Menu and tool bar item parts. */ static Lisp_Object Qmenu_enable; static Lisp_Object QCenable, QCvisible, QChelp, QCkeys, QCkey_sequence; Lisp_Object QCfilter; @@ -835,7 +835,7 @@ recursive_edit_unwind (Lisp_Object buffer) #if 0 /* These two functions are now replaced with - temporarily_switch_to_single_kboard. */ + temporarily_switch_to_single_kboard. */ static void any_kboard_state () { @@ -1038,7 +1038,7 @@ cmd_error (Lisp_Object data) Vquit_flag = Qnil; Vinhibit_quit = Qnil; -#if 0 /* This shouldn't be necessary anymore. --lorentey */ +#if 0 /* This shouldn't be necessary anymore. --lorentey */ if (command_loop_level == 0 && minibuf_level == 0) any_kboard_state (); #endif @@ -1131,7 +1131,7 @@ command_loop (void) #if 0 /* This shouldn't be necessary anymore. --lorentey */ /* Reset single_kboard in case top-level set it while evaluating an -f option, or we are stuck there for some - other reason. */ + other reason. */ any_kboard_state (); #endif internal_catch (Qtop_level, command_loop_2, Qnil); @@ -1492,8 +1492,8 @@ command_loop_1 (void) if (!NILP (Vquit_flag)) { Vexecuting_kbd_macro = Qt; - QUIT; /* Make some noise. */ - /* Will return since macro now empty. */ + QUIT; /* Make some noise. */ + /* Will return since macro now empty. */ } } @@ -1512,7 +1512,7 @@ command_loop_1 (void) Vdisable_point_adjustment = Qnil; /* Process filters and timers may have messed with deactivate-mark. - reset it before we execute the command. */ + reset it before we execute the command. */ Vdeactivate_mark = Qnil; /* Remap command through active keymaps. */ @@ -1552,7 +1552,7 @@ command_loop_1 (void) } else { - /* Here for a command that isn't executed directly */ + /* Here for a command that isn't executed directly. */ #ifdef HAVE_WINDOW_SYSTEM int scount = SPECPDL_INDEX (); @@ -1960,7 +1960,7 @@ void poll_for_input_1 (void) { /* Tell ns_read_socket() it is being called asynchronously so it can avoid - doing anything dangerous. */ + doing anything dangerous. */ #ifdef HAVE_NS ++handling_signal; #endif @@ -2000,7 +2000,7 @@ start_polling (void) #ifdef POLL_FOR_INPUT /* XXX This condition was (read_socket_hook && !interrupt_input), but read_socket_hook is not global anymore. Let's pretend that - it's always set. */ + it's always set. */ if (!interrupt_input) { /* Turn alarm handling on unconditionally. It might have @@ -2037,7 +2037,7 @@ input_polling_used (void) #ifdef POLL_FOR_INPUT /* XXX This condition was (read_socket_hook && !interrupt_input), but read_socket_hook is not global anymore. Let's pretend that - it's always set. */ + it's always set. */ return !interrupt_input; #else return 0; @@ -2052,7 +2052,7 @@ stop_polling (void) #ifdef POLL_FOR_INPUT /* XXX This condition was (read_socket_hook && !interrupt_input), but read_socket_hook is not global anymore. Let's pretend that - it's always set. */ + it's always set. */ if (!interrupt_input) ++poll_suppress_count; #endif @@ -2390,7 +2390,7 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, real event came from. Normally, a switch-frame event selects internal_last_event_frame after each command is read, but events read from a macro should never cause a new frame to be - selected. */ + selected. */ Vlast_event_frame = internal_last_event_frame = Qmacro; /* Exit the macro if we are at the end. @@ -2500,7 +2500,7 @@ read_char (int commandflag, ptrdiff_t nmaps, Lisp_Object *maps, Try this before the sit-for, because the sit-for would do the wrong thing if we are supposed to do menu prompting. If EVENT_HAS_PARAMETERS then we are reading - after a mouse event so don't try a minibuf menu. */ + after a mouse event so don't try a minibuf menu. */ c = Qnil; if (nmaps > 0 && INTERACTIVE && !NILP (prev_event) && ! EVENT_HAS_PARAMETERS (prev_event) @@ -4980,8 +4980,8 @@ static const char *const lispy_function_keys[] = "break", /* 0xff6b */ 0, 0, 0, 0, - 0, 0, 0, 0, "backtab", 0, 0, 0, /* 0xff70... */ - 0, 0, 0, 0, 0, 0, 0, "kp-numlock", /* 0xff78... */ + 0, 0, 0, 0, "backtab", 0, 0, 0, /* 0xff70... */ + 0, 0, 0, 0, 0, 0, 0, "kp-numlock", /* 0xff78... */ "kp-space", /* 0xff80 */ /* IsKeypadKey */ 0, 0, 0, 0, 0, 0, 0, 0, "kp-tab", /* 0xff89 */ @@ -5093,14 +5093,14 @@ static Lisp_Object *const scroll_bar_parts[] = { static Lisp_Object button_down_location; /* Information about the most recent up-going button event: Which - button, what location, and what time. */ + button, what location, and what time. */ static int last_mouse_button; static int last_mouse_x; static int last_mouse_y; static Time button_down_time; -/* The number of clicks in this multiple-click. */ +/* The number of clicks in this multiple-click. */ static int double_click_count; @@ -5344,7 +5344,7 @@ make_lispy_event (struct input_event *event) #ifdef HAVE_NS /* NS_NONKEY_EVENTs are just like NON_ASCII_KEYSTROKE_EVENTs, - except that they are non-key events (last-nonmenu-event is nil). */ + except that they are non-key events (last-nonmenu-event is nil). */ case NS_NONKEY_EVENT: #endif @@ -5830,7 +5830,7 @@ make_lispy_event (struct input_event *event) Fcons (make_number (event->timestamp), Fcons (part, Qnil))))); - /* Always treat scroll bar events as clicks. */ + /* Always treat scroll bar events as clicks. */ event->modifiers |= click_modifier; event->modifiers &= ~up_modifier; @@ -6694,7 +6694,7 @@ lucid_event_type_list_p (Lisp_Object object) If READABLE_EVENTS_FILTER_EVENTS is set in FLAGS, ignore internal events (FOCUS_IN_EVENT). If READABLE_EVENTS_IGNORE_SQUEEZABLES is set in FLAGS, ignore mouse - movements and toolkit scroll bar thumb drags. */ + movements and toolkit scroll bar thumb drags. */ static void get_input_pending (int *addr, int flags) @@ -6728,7 +6728,7 @@ gobble_input (int expected) #ifdef POLL_FOR_INPUT /* XXX This condition was (read_socket_hook && !interrupt_input), but read_socket_hook is not global anymore. Let's pretend that - it's always set. */ + it's always set. */ if (!interrupt_input && poll_suppress_count == 0) { SIGMASKTYPE mask; @@ -6803,7 +6803,7 @@ read_avail_input (int expected) if (store_user_signal_events ()) expected = 0; - /* Loop through the available terminals, and call their input hooks. */ + /* Loop through the available terminals, and call their input hooks. */ t = terminal_list; while (t) { @@ -6824,15 +6824,15 @@ read_avail_input (int expected) expected = 0; } - if (nr == -1) /* Not OK to read input now. */ + if (nr == -1) /* Not OK to read input now. */ { err = 1; } - else if (nr == -2) /* Non-transient error. */ + else if (nr == -2) /* Non-transient error. */ { - /* The terminal device terminated; it should be closed. */ + /* The terminal device terminated; it should be closed. */ - /* Kill Emacs if this was our last terminal. */ + /* Kill Emacs if this was our last terminal. */ if (!terminal_list->next_terminal) /* Formerly simply reported no input, but that sometimes led to a failure of Emacs to terminate. @@ -6844,7 +6844,7 @@ read_avail_input (int expected) alone in its group. */ kill (getpid (), SIGHUP); - /* XXX Is calling delete_terminal safe here? It calls delete_frame. */ + /* XXX Is calling delete_terminal safe here? It calls delete_frame. */ { Lisp_Object tmp; XSETTERMINAL (tmp, t); @@ -6934,7 +6934,7 @@ tty_read_avail_input (struct terminal *terminal, return 0; #endif /* subprocesses */ - if (!terminal->name) /* Don't read from a dead terminal. */ + if (!terminal->name) /* Don't read from a dead terminal. */ return 0; if (terminal->type != output_termcap @@ -6942,15 +6942,15 @@ tty_read_avail_input (struct terminal *terminal, abort (); /* XXX I think the following code should be moved to separate hook - functions in system-dependent files. */ + functions in system-dependent files. */ #ifdef WINDOWSNT return 0; #else /* not WINDOWSNT */ - if (! tty->term_initted) /* In case we get called during bootstrap. */ + if (! tty->term_initted) /* In case we get called during bootstrap. */ return 0; if (! tty->input) - return 0; /* The terminal is suspended. */ + return 0; /* The terminal is suspended. */ #ifdef MSDOS n_to_read = dos_keysns (); @@ -6976,7 +6976,7 @@ tty_read_avail_input (struct terminal *terminal, Gpm_GetEvent closes gpm_fd and clears it to -1, which is why we save it in `fd' so close_gpm can remove it from the select masks. - gpm==-1 if a protocol error or EWOULDBLOCK; the latter is normal. */ + gpm==-1 if a protocol error or EWOULDBLOCK; the latter is normal. */ while (gpm = Gpm_GetEvent (&event), gpm == 1) { nread += handle_one_term_event (tty, &event, &gpm_hold_quit); } @@ -6996,7 +6996,7 @@ tty_read_avail_input (struct terminal *terminal, if (ioctl (fileno (tty->input), FIONREAD, &n_to_read) < 0) { if (! noninteractive) - return -2; /* Close this terminal. */ + return -2; /* Close this terminal. */ else n_to_read = 0; } @@ -7029,16 +7029,16 @@ tty_read_avail_input (struct terminal *terminal, process group won't get SIGHUP's at logout time. BSDI adheres to this part standard and returns -1 from read (0) with errno==EIO when the control tty is taken away. - Jeffrey Honig <jch@bsdi.com> says this is generally safe. */ + Jeffrey Honig <jch@bsdi.com> says this is generally safe. */ if (nread == -1 && errno == EIO) - return -2; /* Close this terminal. */ + return -2; /* Close this terminal. */ #if defined (AIX) && defined (_BSD) /* The kernel sometimes fails to deliver SIGHUP for ptys. This looks incorrect, but it isn't, because _BSD causes O_NDELAY to be defined in fcntl.h as O_NONBLOCK, and that causes a value other than 0 when there is no input. */ if (nread == 0) - return -2; /* Close this terminal. */ + return -2; /* Close this terminal. */ #endif } while ( @@ -7116,7 +7116,7 @@ tty_read_avail_input (struct terminal *terminal, buf.code = cbuf[i]; /* Set the frame corresponding to the active tty. Note that the value of selected_frame is not reliable here, redisplay tends - to temporarily change it. */ + to temporarily change it. */ buf.frame_or_window = tty->top_frame; buf.arg = Qnil; @@ -7139,7 +7139,7 @@ handle_async_input (void) pending_signals = pending_atimers; #endif /* Tell ns_read_socket() it is being called asynchronously so it can avoid - doing anything dangerous. */ + doing anything dangerous. */ #ifdef HAVE_NS ++handling_signal; #endif @@ -7197,7 +7197,7 @@ input_available_signal (int signo) This function exists so that the UNBLOCK_INPUT macro in blockinput.h can have some way to take care of input we put off dealing with, without assuming that every file which uses - UNBLOCK_INPUT also has #included the files necessary to get SIGIO. */ + UNBLOCK_INPUT also has #included the files necessary to get SIGIO. */ void reinvoke_input_signal (void) { @@ -7224,7 +7224,7 @@ struct user_signal_info struct user_signal_info *next; }; -/* List of user signals. */ +/* List of user signals. */ static struct user_signal_info *user_signals = NULL; void @@ -7761,7 +7761,7 @@ parse_menu_item (Lisp_Object item, int inmenubar) { tem = XCAR (item); if (SYMBOLP (tem) || STRINGP (tem) || VECTORP (tem)) - /* Be GC protected. Set keyhint to item instead of tem. */ + /* Be GC protected. Set keyhint to item instead of tem. */ keyhint = item; } else if (EQ (tem, QCkeys)) @@ -7844,7 +7844,7 @@ parse_menu_item (Lisp_Object item, int inmenubar) if (inmenubar > 0) return 1; - { /* This is a command. See if there is an equivalent key binding. */ + { /* This is a command. See if there is an equivalent key binding. */ Lisp_Object keyeq = AREF (item_properties, ITEM_PROPERTY_KEYEQ); /* The previous code preferred :key-sequence to :keys, so we @@ -8400,7 +8400,7 @@ append_tool_bar_item (void) These are done in different ways, depending on how the input will be read. Menus using X are done after auto-saving in read-char, getting the input event from Fx_popup_menu; menus using the minibuf use read_char recursively - and do auto-saving in the inner call of read_char. */ + and do auto-saving in the inner call of read_char. */ static Lisp_Object read_char_x_menu_prompt (ptrdiff_t nmaps, Lisp_Object *maps, @@ -8620,14 +8620,14 @@ read_char_minibuf_menu_prompt (int commandflag, tem = XVECTOR (item_properties)->contents[ITEM_PROPERTY_KEYEQ]; if (!NILP (tem)) - /* Insert equivalent keybinding. */ + /* Insert equivalent keybinding. */ s = concat2 (s, tem); #endif tem = XVECTOR (item_properties)->contents[ITEM_PROPERTY_TYPE]; if (EQ (tem, QCradio) || EQ (tem, QCtoggle)) { - /* Insert button prefix. */ + /* Insert button prefix. */ Lisp_Object selected = XVECTOR (item_properties)->contents[ITEM_PROPERTY_SELECTED]; if (EQ (tem, QCradio)) @@ -8861,7 +8861,7 @@ keyremap_step (Lisp_Object *keybuf, int bufsize, volatile keyremap *fkey, /* If keybuf[fkey->start..fkey->end] is bound in the map and we're in a position to do the key remapping, replace it with - the binding and restart with fkey->start at the end. */ + the binding and restart with fkey->start at the end. */ if ((VECTORP (next) || STRINGP (next)) && doit) { int len = XFASTINT (Flength (next)); @@ -9025,7 +9025,7 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, /* Non-zero if we are trying to map a key by changing an upper-case letter to lower case, or a shifted function key to an unshifted - one. */ + one. */ int shift_translated = 0; /* If we receive a `switch-frame' or `select-window' event in the middle of @@ -9033,7 +9033,7 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, While we're reading, we keep the event here. */ Lisp_Object delayed_switch_frame; - /* See the comment below... */ + /* See the comment below... */ #if defined (GOBBLE_FIRST_EVENT) Lisp_Object first_event; #endif @@ -9308,7 +9308,7 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, if (!found) { /* Don't touch interrupted_kboard when it's been - deleted. */ + deleted. */ delayed_switch_frame = Qnil; goto replay_entire_sequence; } @@ -9416,7 +9416,7 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, { /* If we're at the beginning of a key sequence, and the caller says it's okay, go ahead and return this event. If we're - in the midst of a key sequence, delay it until the end. */ + in the midst of a key sequence, delay it until the end. */ if (t > 0 || !can_return_switch_frame) { delayed_switch_frame = key; @@ -9713,7 +9713,7 @@ read_key_sequence (Lisp_Object *keybuf, int bufsize, Lisp_Object prompt, Down-clicks are eliminated. Double-downs reduce to downs, then are eliminated. Triple-downs reduce to double-downs, then to downs, - then are eliminated. */ + then are eliminated. */ if (modifiers & (down_modifier | drag_modifier | double_modifier | triple_modifier)) { @@ -10822,7 +10822,7 @@ set_waiting_for_input (struct timeval *time_to_clear) waiting_for_input = 1; /* If handle_interrupt was called before and buffered a C-g, - make it run again now, to avoid timing error. */ + make it run again now, to avoid timing error. */ if (!NILP (Vquit_flag)) quit_throw_to_read_char (); } @@ -10843,7 +10843,7 @@ clear_waiting_for_input (void) static void interrupt_signal (int signalnum) /* If we don't have an argument, some */ - /* compilers complain in signal calls. */ + /* compilers complain in signal calls. */ { /* Must preserve main program's value of errno. */ int old_errno = errno; @@ -10851,12 +10851,12 @@ interrupt_signal (int signalnum) /* If we don't have an argument, some */ SIGNAL_THREAD_CHECK (signalnum); - /* See if we have an active terminal on our controlling tty. */ + /* See if we have an active terminal on our controlling tty. */ terminal = get_named_tty ("/dev/tty"); if (!terminal) { /* If there are no frames there, let's pretend that we are a - well-behaving UN*X program and quit. */ + well-behaving UN*X program and quit. */ Fkill_emacs (Qnil); } else @@ -10884,7 +10884,7 @@ interrupt_signal (int signalnum) /* If we don't have an argument, some */ Otherwise it sets the Lisp variable quit-flag not-nil. This causes eval to throw, when it gets a chance. If quit-flag is already - non-nil, it stops the job right away. */ + non-nil, it stops the job right away. */ static void handle_interrupt (void) @@ -10893,7 +10893,7 @@ handle_interrupt (void) cancel_echoing (); - /* XXX This code needs to be revised for multi-tty support. */ + /* XXX This code needs to be revised for multi-tty support. */ if (!NILP (Vquit_flag) && get_named_tty ("/dev/tty")) { /* If SIGINT isn't blocked, don't let us be interrupted by @@ -11003,7 +11003,7 @@ handle_interrupt (void) wait_reading_process_output() under HAVE_NS because of the call to ns_select there (needed because otherwise events aren't picked up outside of polling since we don't get SIGIO like X and we don't have a - separate event loop thread like W32. */ + separate event loop thread like W32. */ #ifndef HAVE_NS if (waiting_for_input && !echoing) quit_throw_to_read_char (); @@ -11452,7 +11452,7 @@ init_keyboard (void) session may have multiple display types, so we always handle SIGINT. There is special code in interrupt_signal to exit Emacs on SIGINT when there are no termcap frames on the - controlling terminal. */ + controlling terminal. */ signal (SIGINT, interrupt_signal); #ifndef DOS_NT /* For systems with SysV TERMIO, C-g is set up for both SIGINT and @@ -12249,7 +12249,7 @@ Currently, the only supported values for this variable are `sigusr1' and `sigusr2'. */); Vdebug_on_event = intern_c_string ("sigusr2"); - /* Create the initial keyboard. */ + /* Create the initial keyboard. */ initial_kboard = (KBOARD *) xmalloc (sizeof (KBOARD)); init_kboard (initial_kboard); /* Vwindow_system is left at t for now. */ diff --git a/src/lisp.h b/src/lisp.h index 1bbb5633fe5..df8812f73b7 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -162,7 +162,7 @@ extern int suppress_checking EXTERNALLY_VISIBLE; /* First, try and define DECL_ALIGN(type,var) which declares a static variable VAR of type TYPE with the added requirement that it be - TYPEBITS-aligned. */ + TYPEBITS-aligned. */ #ifndef NO_DECL_ALIGN # ifndef DECL_ALIGN # if HAVE_ATTRIBUTE_ALIGNED @@ -1084,11 +1084,9 @@ enum symbol_redirect SYMBOL_PLAINVAL = 4, SYMBOL_VARALIAS = 1, SYMBOL_LOCALIZED = 2, - SYMBOL_FORWARDED = 3 + SYMBOL_FORWARDED = 3 }; -/* In a symbol, the markbit of the plist is used as the gc mark bit */ - struct Lisp_Symbol { unsigned gcmarkbit : 1; @@ -1097,8 +1095,7 @@ struct Lisp_Symbol 0 : it's a plain var, the value is in the `value' field. 1 : it's a varalias, the value is really in the `alias' symbol. 2 : it's a localized var, the value is in the `blv' object. - 3 : it's a forwarding variable, the value is in `forward'. - */ + 3 : it's a forwarding variable, the value is in `forward'. */ enum symbol_redirect redirect : 3; /* Non-zero means symbol is constant, i.e. changing its value @@ -1115,15 +1112,12 @@ struct Lisp_Symbol unsigned declared_special : 1; /* The symbol's name, as a Lisp string. - The name "xname" is used to intentionally break code referring to the old field "name" of type pointer to struct Lisp_String. */ Lisp_Object xname; - /* Value of the symbol or Qunbound if unbound. If this symbol is a - defvaralias, `alias' contains the symbol for which it is an - alias. Use the SYMBOL_VALUE and SET_SYMBOL_VALUE macros to get - and set a symbol's value, to take defvaralias into account. */ + /* Value of the symbol or Qunbound if unbound. Which alternative of the + union is used depends on the `redirect' field above. */ union { Lisp_Object value; struct Lisp_Symbol *alias; @@ -1318,7 +1312,7 @@ struct Lisp_Misc_Any /* Supertype of all Misc types. */ enum Lisp_Misc_Type type : 16; /* = Lisp_Misc_??? */ unsigned gcmarkbit : 1; int spacer : 15; - /* Make it as long as "Lisp_Free without padding". */ + /* Make it as long as "Lisp_Free without padding". */ void *fill; }; @@ -3603,7 +3597,7 @@ extern void init_system_name (void); #define SWITCH_ENUM_CAST(x) (x) -/* Use this to suppress gcc's warnings. */ +/* Use this to suppress gcc's warnings. */ #ifdef lint /* Use CODE only if lint checking is in effect. */ diff --git a/src/w32.h b/src/w32.h index f1915125c90..a3ca1130ce6 100644 --- a/src/w32.h +++ b/src/w32.h @@ -139,6 +139,7 @@ extern void term_w32select (void); extern void syms_of_w32menu (void); extern void globals_of_w32menu (void); extern void syms_of_fontset (void); +extern void syms_of_w32font (void); extern int _sys_read_ahead (int fd); extern int _sys_wait_accept (int fd); diff --git a/src/w32font.c b/src/w32font.c index f47b7a46b1e..6c1b4d0bc20 100644 --- a/src/w32font.c +++ b/src/w32font.c @@ -145,6 +145,138 @@ struct font_callback_data style variations if the font name is not specified. */ static void list_all_matching_fonts (struct font_callback_data *); +static BOOL g_b_init_is_w9x; +static BOOL g_b_init_get_outline_metrics_w; +static BOOL g_b_init_get_text_metrics_w; +static BOOL g_b_init_get_glyph_outline_w; +static BOOL g_b_init_get_glyph_outline_w; + +typedef UINT (WINAPI * GetOutlineTextMetricsW_Proc) ( + HDC hdc, + UINT cbData, + LPOUTLINETEXTMETRICW lpotmw); +typedef BOOL (WINAPI * GetTextMetricsW_Proc) ( + HDC hdc, + LPTEXTMETRICW lptmw); +typedef DWORD (WINAPI * GetGlyphOutlineW_Proc) ( + HDC hdc, + UINT uChar, + UINT uFormat, + LPGLYPHMETRICS lpgm, + DWORD cbBuffer, + LPVOID lpvBuffer, + const MAT2 *lpmat2); + +/* Several "wide" functions we use to support the font backends are + unavailable on Windows 9X, unless UNICOWS.DLL is installed (their + versions in the default libraries are non-functional stubs). On NT + and later systems, these functions are in GDI32.DLL. The following + helper function attempts to load UNICOWS.DLL on Windows 9X, and + refuses to let Emacs start up if that library is not found. On NT + and later versions, it simply loads GDI32.DLL, which should always + be available. */ +static HMODULE +w32_load_unicows_or_gdi32 (void) +{ + static BOOL is_9x = 0; + OSVERSIONINFO os_ver; + HMODULE ret; + if (g_b_init_is_w9x == 0) + { + g_b_init_is_w9x = 1; + ZeroMemory (&os_ver, sizeof (OSVERSIONINFO)); + os_ver.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); + if (GetVersionEx (&os_ver)) + is_9x = (os_ver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS); + } + if (is_9x) + { + ret = LoadLibrary ("Unicows.dll"); + if (!ret) + { + int button; + + button = MessageBox (NULL, + "Emacs cannot load the UNICOWS.DLL library.\n" + "This library is essential for using Emacs\n" + "on this system. You need to install it.\n\n" + "However, you can still use Emacs by invoking\n" + "it with the '-nw' command-line option.\n\n" + "Emacs will exit when you click OK.", + "Emacs cannot load UNICOWS.DLL", + MB_ICONERROR | MB_TASKMODAL + | MB_SETFOREGROUND | MB_OK); + switch (button) + { + case IDOK: + default: + exit (1); + } + } + } + else + ret = LoadLibrary ("Gdi32.dll"); + return ret; +} + +/* The following 3 functions call the problematic "wide" APIs via + function pointers, to avoid linking against the non-standard + libunicows on W9X. */ +static UINT WINAPI +get_outline_metrics_w(HDC hdc, UINT cbData, LPOUTLINETEXTMETRICW lpotmw) +{ + static GetOutlineTextMetricsW_Proc s_pfn_Get_Outline_Text_MetricsW = NULL; + HMODULE hm_unicows = NULL; + if (g_b_init_get_outline_metrics_w == 0) + { + g_b_init_get_outline_metrics_w = 1; + hm_unicows = w32_load_unicows_or_gdi32 (); + if (hm_unicows) + s_pfn_Get_Outline_Text_MetricsW = (GetOutlineTextMetricsW_Proc) + GetProcAddress (hm_unicows, "GetOutlineTextMetricsW"); + } + if (s_pfn_Get_Outline_Text_MetricsW == NULL) + abort (); /* cannot happen */ + return s_pfn_Get_Outline_Text_MetricsW (hdc, cbData, lpotmw); +} + +static BOOL WINAPI +get_text_metrics_w(HDC hdc, LPTEXTMETRICW lptmw) +{ + static GetTextMetricsW_Proc s_pfn_Get_Text_MetricsW = NULL; + HMODULE hm_unicows = NULL; + if (g_b_init_get_text_metrics_w == 0) + { + g_b_init_get_text_metrics_w = 1; + hm_unicows = w32_load_unicows_or_gdi32 (); + if (hm_unicows) + s_pfn_Get_Text_MetricsW = (GetTextMetricsW_Proc) + GetProcAddress (hm_unicows, "GetTextMetricsW"); + } + if (s_pfn_Get_Text_MetricsW == NULL) + abort (); /* cannot happen */ + return s_pfn_Get_Text_MetricsW (hdc, lptmw); +} + +static DWORD WINAPI +get_glyph_outline_w (HDC hdc, UINT uChar, UINT uFormat, LPGLYPHMETRICS lpgm, + DWORD cbBuffer, LPVOID lpvBuffer, const MAT2 *lpmat2) +{ + static GetGlyphOutlineW_Proc s_pfn_Get_Glyph_OutlineW = NULL; + HMODULE hm_unicows = NULL; + if (g_b_init_get_glyph_outline_w == 0) + { + g_b_init_get_glyph_outline_w = 1; + hm_unicows = w32_load_unicows_or_gdi32 (); + if (hm_unicows) + s_pfn_Get_Glyph_OutlineW = (GetGlyphOutlineW_Proc) + GetProcAddress (hm_unicows, "GetGlyphOutlineW"); + } + if (s_pfn_Get_Glyph_OutlineW == NULL) + abort (); /* cannot happen */ + return s_pfn_Get_Glyph_OutlineW (hdc, uChar, uFormat, lpgm, cbBuffer, + lpvBuffer, lpmat2); +} static int memq_no_quit (Lisp_Object elt, Lisp_Object list) @@ -816,11 +948,11 @@ w32font_open_internal (FRAME_PTR f, Lisp_Object font_entity, old_font = SelectObject (dc, hfont); /* Try getting the outline metrics (only works for truetype fonts). */ - len = GetOutlineTextMetricsW (dc, 0, NULL); + len = get_outline_metrics_w (dc, 0, NULL); if (len) { metrics = (OUTLINETEXTMETRICW *) alloca (len); - if (GetOutlineTextMetricsW (dc, len, metrics)) + if (get_outline_metrics_w (dc, len, metrics)) memcpy (&w32_font->metrics, &metrics->otmTextMetrics, sizeof (TEXTMETRICW)); else @@ -828,7 +960,7 @@ w32font_open_internal (FRAME_PTR f, Lisp_Object font_entity, } if (!metrics) - GetTextMetricsW (dc, &w32_font->metrics); + get_text_metrics_w (dc, &w32_font->metrics); w32_font->cached_metrics = NULL; w32_font->n_cache_blocks = 0; @@ -2306,7 +2438,7 @@ compute_metrics (HDC dc, struct w32font_info *w32_font, unsigned int code, transform.eM11.value = 1; transform.eM22.value = 1; - if (GetGlyphOutlineW (dc, code, options, &gm, 0, NULL, &transform) + if (get_glyph_outline_w (dc, code, options, &gm, 0, NULL, &transform) != GDI_ERROR) { metrics->lbearing = gm.gmptGlyphOrigin.x; @@ -2581,3 +2713,12 @@ versions of Windows) characters. */); w32font_driver.type = Qgdi; register_font_driver (&w32font_driver, NULL); } + +void +globals_of_w32font (void) +{ + g_b_init_is_w9x = 0; + g_b_init_get_outline_metrics_w = 0; + g_b_init_get_text_metrics_w = 0; + g_b_init_get_glyph_outline_w = 0; +} |