mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-06 20:00:46 -08:00
Merge
This commit is contained in:
commit
bc97a826f8
10 changed files with 340 additions and 103 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 ();
|
||||
|
|
|
|||
124
src/keyboard.c
124
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. */
|
||||
|
|
|
|||
20
src/lisp.h
20
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. */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
149
src/w32font.c
149
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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue