# HG changeset patch # User Katsumi Yamaoka # Date 1263997451 0 # Node ID 46c08e6b42d6eb930714e9824f47efef96d72e80 # Parent f1cb61394e72707789bc2ef2bea06abd6ed8270d# Parent 89b4f7566280b5203107cf09ad65d69ae0f267fa Merge from mainline. diff -r f1cb61394e72 -r 46c08e6b42d6 admin/ChangeLog --- a/admin/ChangeLog Mon Jan 18 14:40:12 2010 +0000 +++ b/admin/ChangeLog Wed Jan 20 14:24:11 2010 +0000 @@ -1,3 +1,8 @@ +2010-01-20 Glenn Morris + + * revdiff: Remove file that only works with CVS, and isn't really + needed with Bazaar (given the in-built revision options of bzr diff). + 2010-01-12 Glenn Morris * emacs-pretesters, make-announcement: Use bug-gnu-emacs rather diff -r f1cb61394e72 -r 46c08e6b42d6 admin/revdiff --- a/admin/revdiff Mon Jan 18 14:40:12 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,137 +0,0 @@ -#! /usr/bin/perl - -# Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, -# 2010 Free Software Foundation, Inc. -# -# This file is part of GNU Emacs. - -# GNU Emacs is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. - -# GNU Emacs is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with GNU Emacs. If not, see . - - -use File::Basename; - -if (@ARGV < 3) -{ - print <', use the Nth revision before the current one for OLD. - -If NEW is + or -, build diffs between revisions OLD -and OLD +/- . - -Examples: - -revdiff FILE - -1 get the latest change of FILE -revdiff FILE -1 +1 also gets the latest change of FILE -revdiff FILE 1.500 +2 get diffs 1.500-1.501 and 1.501-1.502. - -USAGE - exit 1; -} - -$file = shift @ARGV; -$old = shift @ARGV; - -sub diffit -{ - my ($old, $new) = @_; - print "cvs diff -r$old -r$new $file >$file-$old-$new.diff\n"; - system "cvs diff -r$old -r$new $file >$file-$old-$new.diff"; -} - -sub current_revision ($) -{ - my ($file) = @_; - my $dir = dirname ($file); - my $base = basename ($file); - my $entries = "$dir/CVS/Entries"; - die "Can't find $entries" unless -f $entries; - open (IN, "<$entries") or die "Cannot open $entries"; - my $rev; - while ($line = ) - { - if ($line =~ m,/$base/([^/]+),) - { - $rev = $1; - break; - } - } - die "Cannot determine current revision of $file" unless $rev; - close (IN); - return $rev; -} - -if ($old eq "-") - { - $old = current_revision ($file); - } -elsif ($old =~ /^-(\d+)$/) - { - my $offset = $1; - $old = current_revision ($file); - die "Internal error" unless $old =~ /(.*)\.(\d+)$/; - my $minor = $2 - $offset; - $old = sprintf ("%d.%d", $1, $minor); - } - -while (@ARGV) - { - my $new = shift @ARGV; - if ($new =~ /^[+]\d+$/) - { - my $n = $new; - for ($i = 0; $i < $n; ++$i) - { - unless ($old =~ /(.*)\.(\d+)$/) - { - die "Internal error"; - } - my $j = $2 + 1; - $new = "$1.$j"; - diffit ($old, $new); - $old = $new; - } - } - elsif ($new =~ /^[-]\d+$/) - { - my $n = - $new; - for ($i = 0; $i < $n; ++$i) - { - unless ($old =~ /(.*)\.(\d+)$/) - { - die "Internal error"; - } - my $j = $2 - 1; - $new = "$1.$j"; - diffit ($new, $old); - $old = $new; - } - } - else - { - diffit ($old, $new); - $old = $new; - } - } - -# Local Variables: -# mode: cperl -# End: - -# arch-tag: 2798b20d-c7f2-4c78-8378-7bb529c36a09 diff -r f1cb61394e72 -r 46c08e6b42d6 lisp/ChangeLog --- a/lisp/ChangeLog Mon Jan 18 14:40:12 2010 +0000 +++ b/lisp/ChangeLog Wed Jan 20 14:24:11 2010 +0000 @@ -1,3 +1,39 @@ +2010-01-20 Glenn Morris + + * indent.el (tab-always-indent): Fix custom-type. + +2010-01-19 Alan Mackenzie + + * progmodes/cc-defs.el: Fix bug#5395: typing '#' in an empty + buffer throws "args out of range". + (c-set-cpp-delimiters, c-clear-cpp-delimiters): Check for EOB + playing the role of delimiter. + +2010-01-18 Stephen Leake + + * lisp/progmodes/ada-mode.el: Fix bug#5400. + (ada-matching-decl-start-re): Move into ada-goto-decl-start. + (ada-goto-decl-start): Rename from ada-goto-matching-decl-start; callers + changed. Delete RECURSIVE parameter; never used. Improve doc string. + Improve comments in "is" portion. Handle null procedure declaration. + (ada-move-to-end): Improve doc string. + +2010-01-18 Óscar Fuentes + + * ido.el (ido-cur-list): Initialize to nil. + Remove obsolete information from commentary. + (ido-choice-list): Initialize to nil. + (ido-get-bufname): Reject minibuffers. + (ido-make-buffer-list): If "default" is a nonexistent + buffer, ignore it, as per the function's comment. + (ido-kill-buffer-internal): New function. + (ido-kill-buffer-at-head): Use it. + (ido-visit-buffer): Likewise. + +2010-01-18 Chong Yidong + + * calendar/time-date.el (date-to-time): Doc fix (Bug#5408). + 2010-01-18 Juanma Barranquero * cedet/ede/locate.el (ede-locate-file-in-project) @@ -92,7 +128,7 @@ 2010-01-17 Stephen Leake - * progmodes/ada-mode.el: Fix bug#1920, bug#5400. + * progmodes/ada-mode.el: Fix bug#1920. (ada-ident-re): Delete ., allow multibyte characters. (ada-goto-label-re): New; matches goto labels. (ada-block-label-re): New; matches block labels. diff -r f1cb61394e72 -r 46c08e6b42d6 lisp/calendar/time-date.el --- a/lisp/calendar/time-date.el Mon Jan 18 14:40:12 2010 +0000 +++ b/lisp/calendar/time-date.el Wed Jan 20 14:24:11 2010 +0000 @@ -98,7 +98,8 @@ ;;;###autoload (defun date-to-time (date) - "Parse a string DATE that represents a date-time and return a time value." + "Parse a string DATE that represents a date-time and return a time value. +If DATE lacks timezone information, GMT is assumed." (condition-case () (apply 'encode-time (parse-time-string diff -r f1cb61394e72 -r 46c08e6b42d6 lisp/ido.el --- a/lisp/ido.el Mon Jan 18 14:40:12 2010 +0000 +++ b/lisp/ido.el Wed Jan 20 14:24:11 2010 +0000 @@ -1042,11 +1042,11 @@ ;; Stores the current list of items that will be searched through. ;; The list is ordered, so that the most interesting item comes first, ;; although by default, the files visible in the current frame are put -;; at the end of the list. Created by `ido-make-item-list'. -(defvar ido-cur-list) +;; at the end of the list. +(defvar ido-cur-list nil) ;; Stores the choice list for ido-completing-read -(defvar ido-choice-list) +(defvar ido-choice-list nil) ;; Stores the list of items which are ignored when building ;; `ido-cur-list'. It is in no specific order. @@ -3344,7 +3344,7 @@ (if ido-temp-list (nconc ido-temp-list ido-current-buffers) (setq ido-temp-list ido-current-buffers)) - (if default + (if (and default (buffer-live-p (get-buffer default))) (progn (setq ido-temp-list (delete default ido-temp-list)) @@ -3590,6 +3590,7 @@ ;; Used by `ido-get-buffers-in-frames' to walk through all windows (let ((buf (buffer-name (window-buffer win)))) (unless (or (member buf ido-bufs-in-frame) + (minibufferp buf) (member buf ido-ignore-item-temp-list)) ;; Only add buf if it is not already in list. ;; This prevents same buf in two different windows being @@ -3830,6 +3831,27 @@ ;;(add-hook 'completion-setup-hook 'completion-setup-function) (display-completion-list completion-list))))))) +(defun ido-kill-buffer-internal (buf) + "Kill buffer BUF and rebuild ido's buffer list if needed." + (if (not (kill-buffer buf)) + ;; buffer couldn't be killed. + (setq ido-rescan t) + ;; else buffer was killed so remove name from list. + (setq ido-cur-list (delq buf ido-cur-list)) + ;; Some packages, like uniquify.el, may rename buffers when one + ;; is killed, so we need to test this condition to avoid using + ;; an outdated list of buffer names. We don't want to always + ;; rebuild the list of buffers, as this alters the previous + ;; buffer order that the user was seeing on the prompt. However, + ;; when we rebuild the list, we try to keep the previous second + ;; buffer as the first one. + (catch 'update + (dolist (b ido-cur-list) + (unless (get-buffer b) + (setq ido-cur-list (ido-make-buffer-list (cadr ido-matches))) + (setq ido-rescan t) + (throw 'update nil)))))) + ;;; KILL CURRENT BUFFER (defun ido-kill-buffer-at-head () "Kill the buffer at the head of `ido-matches'. @@ -3840,7 +3862,7 @@ (let ((enable-recursive-minibuffers t) (buf (ido-name (car ido-matches)))) (when buf - (kill-buffer buf) + (ido-kill-buffer-internal buf) ;; Check if buffer still exists. (if (get-buffer buf) ;; buffer couldn't be killed. @@ -3884,7 +3906,7 @@ ((eq method 'kill) (if record (ido-record-command 'kill-buffer buffer)) - (kill-buffer buffer)) + (ido-kill-buffer-internal buffer)) ((eq method 'other-window) (if record diff -r f1cb61394e72 -r 46c08e6b42d6 lisp/indent.el --- a/lisp/indent.el Mon Jan 18 14:40:12 2010 +0000 +++ b/lisp/indent.el Wed Jan 20 14:24:11 2010 +0000 @@ -1,7 +1,7 @@ ;;; indent.el --- indentation commands for Emacs -;; Copyright (C) 1985, 1995, 2001, 2002, 2003, 2004, -;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +;; Copyright (C) 1985, 1995, 2001, 2002, 2003, 2004, 2005, 2006, 2007, +;; 2008, 2009, 2010 Free Software Foundation, Inc. ;; Maintainer: FSF @@ -55,7 +55,11 @@ Some programming language modes have their own variable to control this, e.g., `c-tab-always-indent', and do not respect this variable." :group 'indent - :type '(choice (const nil) (const t) (const always))) + :type '(choice + (const :tag "Always indent" t) + (const :tag "Indent if inside indentation, else TAB" nil) + (const :tag "Indent, or if already indented complete" complete))) + (defun indent-according-to-mode () "Indent line in proper way for current major mode. diff -r f1cb61394e72 -r 46c08e6b42d6 lisp/progmodes/ada-mode.el --- a/lisp/progmodes/ada-mode.el Mon Jan 18 14:40:12 2010 +0000 +++ b/lisp/progmodes/ada-mode.el Wed Jan 20 14:24:11 2010 +0000 @@ -677,14 +677,6 @@ "\\>")) "Regexp used in `ada-goto-matching-start'.") -(defvar ada-matching-decl-start-re - (eval-when-compile - (concat "\\<" - (regexp-opt - '("is" "separate" "end" "declare" "if" "new" "begin" "generic" "when") t) - "\\>")) - "Regexp used in `ada-goto-matching-decl-start'.") - (defvar ada-loop-start-re "\\<\\(for\\|while\\|loop\\)\\>" "Regexp for the start of a loop.") @@ -2476,7 +2468,7 @@ ((and (= (downcase (char-after)) ?b) (looking-at "begin\\>")) (save-excursion - (if (ada-goto-matching-decl-start t) + (if (ada-goto-decl-start t) (list (progn (back-to-indentation) (point)) 0) (ada-indent-on-previous-lines nil orgpoint orgpoint)))) @@ -2855,7 +2847,7 @@ (if (looking-at "\\") (progn (setq indent (list (point) 0)) - (if (ada-goto-matching-decl-start t) + (if (ada-goto-decl-start t) (list (progn (back-to-indentation) (point)) 0) indent)) (list (progn (back-to-indentation) (point)) 0) @@ -3421,7 +3413,6 @@ match-dat nil))) - (defun ada-goto-next-non-ws (&optional limit skip-goto-label) "Skip to next non-whitespace character. Skips spaces, newlines and comments, and possibly goto labels. @@ -3502,13 +3493,13 @@ (if (save-excursion (ada-goto-previous-word) (looking-at (concat "\\<" defun-name "\\> *:"))) - t ; do nothing + t ; name matches ;; else ;; ;; 'accept' or 'package' ? ;; (unless (looking-at ada-subprog-start-re) - (ada-goto-matching-decl-start)) + (ada-goto-decl-start)) ;; ;; 'begin' of 'procedure'/'function'/'task' or 'declare' ;; @@ -3541,14 +3532,20 @@ (buffer-substring (point) (progn (forward-sexp 1) (point)))))))) -(defun ada-goto-matching-decl-start (&optional noerror recursive) - "Move point to the matching declaration start of the current 'begin'. -If NOERROR is non-nil, it only returns nil if no match was found." +(defun ada-goto-decl-start (&optional noerror) + "Move point to the declaration start of the current construct. +If NOERROR is non-nil, return nil if no match was found; +otherwise throw error." (let ((nest-count 1) + (regexp (eval-when-compile + (concat "\\<" + (regexp-opt + '("is" "separate" "end" "declare" "if" "new" "begin" "generic" "when") t) + "\\>"))) ;; first should be set to t if we should stop at the first ;; "begin" we encounter. - (first (not recursive)) + (first t) (count-generic nil) (stop-at-when nil) ) @@ -3572,7 +3569,7 @@ ;; search backward for interesting keywords (while (and (not (zerop nest-count)) - (ada-search-ignore-string-comment ada-matching-decl-start-re t)) + (ada-search-ignore-string-comment regexp t)) ;; ;; calculate nest-depth ;; @@ -3605,7 +3602,6 @@ (if (looking-at "end") (ada-goto-matching-start 1 noerror t) - ;; (ada-goto-matching-decl-start noerror t) (setq loop-again nil) (unless (looking-at "begin") @@ -3633,34 +3629,50 @@ (setq first t)) ;; ((looking-at "is") - ;; check if it is only a type definition, but not a protected - ;; type definition, which should be handled like a procedure. - (if (or (looking-at "is[ \t]+<>") - (save-excursion - (forward-comment -10000) - (forward-char -1) - - ;; Detect if we have a closing parenthesis (Could be - ;; either the end of subprogram parameters or (<>) - ;; in a type definition - (if (= (char-after) ?\)) - (progn - (forward-char 1) - (backward-sexp 1) - (forward-comment -10000) - )) - (skip-chars-backward "a-zA-Z0-9_.'") - (ada-goto-previous-word) - (and - (looking-at "\\<\\(sub\\)?type\\|case\\>") + ;; look for things to ignore + (if + (or + ;; generic formal parameter + (looking-at "is[ t]+<>") + + ;; A type definition, or a case statement. Note that the + ;; goto-matching-start above on 'end record' leaves us at + ;; 'record', not at 'type'. + ;; + ;; We get to a case statement here by calling + ;; 'ada-move-to-end' from inside a case statement; then + ;; we are not ignoring 'when'. + (save-excursion + ;; Skip type discriminants or case argument function call param list + (forward-comment -10000) + (forward-char -1) + (if (= (char-after) ?\)) + (progn + (forward-char 1) + (backward-sexp 1) + (forward-comment -10000) + )) + ;; skip type or case argument name + (skip-chars-backward "a-zA-Z0-9_.'") + (ada-goto-previous-word) + (and + ;; if it's a protected type, it's the decl start we + ;; are looking for; since we didn't see the 'end' + ;; above, we are inside it. + (looking-at "\\<\\(sub\\)?type\\|case\\>") (save-match-data (ada-goto-previous-word) (not (looking-at "\\")))) - )) ; end of `or' - (goto-char (match-beginning 0)) - (progn - (setq nest-count (1- nest-count)) - (setq first nil)))) + ) ; end of type definition p + + ;; null procedure declaration + (save-excursion (ada-goto-next-word) (looking-at "\\")) + );; end or + ;; skip this construct + nil + ;; this is the right "is" + (setq nest-count (1- nest-count)) + (setq first nil))) ;; ((looking-at "new") @@ -4115,7 +4127,7 @@ Assumes point to be at the end of a statement." (or (ada-in-paramlist-p) (save-excursion - (ada-goto-matching-decl-start t)))) + (ada-goto-decl-start t)))) (defun ada-looking-at-semi-or () @@ -4409,7 +4421,7 @@ ;; ada-move-to-declaration (looking-at "\\") - (ada-goto-matching-decl-start) + (ada-goto-decl-start) (setq pos (point)))) ) ; end of save-excursion @@ -4421,7 +4433,7 @@ (set-syntax-table previous-syntax-table)))) (defun ada-move-to-end () - "Move point to the matching end of the block around point. + "Move point to the end of the block around point. Moves to 'begin' if in a declarative part." (interactive) (let ((pos (point)) @@ -4471,7 +4483,7 @@ (ada-goto-matching-end 0)) ;; package start ((save-excursion - (setq decl-start (and (ada-goto-matching-decl-start t) (point))) + (setq decl-start (and (ada-goto-decl-start t) (point))) (and decl-start (looking-at "\\"))) (ada-goto-matching-end 1)) diff -r f1cb61394e72 -r 46c08e6b42d6 lisp/progmodes/cc-defs.el --- a/lisp/progmodes/cc-defs.el Mon Jan 18 14:40:12 2010 +0000 +++ b/lisp/progmodes/cc-defs.el Wed Jan 20 14:24:11 2010 +0000 @@ -1217,12 +1217,14 @@ ;; This macro does a hidden buffer change. `(progn (c-put-char-property ,beg 'category 'c-cpp-delimiter) - (c-put-char-property ,end 'category 'c-cpp-delimiter))) + (if (< ,end (point-max)) + (c-put-char-property ,end 'category 'c-cpp-delimiter)))) (defmacro c-clear-cpp-delimiters (beg end) ;; This macro does a hidden buffer change. `(progn (c-clear-char-property ,beg 'category) - (c-clear-char-property ,end 'category))) + (if (< ,end (point-max)) + (c-clear-char-property ,end 'category)))) (defsubst c-comment-out-cpps () ;; Render all preprocessor constructs syntactically commented out. diff -r f1cb61394e72 -r 46c08e6b42d6 src/ChangeLog --- a/src/ChangeLog Mon Jan 18 14:40:12 2010 +0000 +++ b/src/ChangeLog Wed Jan 20 14:24:11 2010 +0000 @@ -1,3 +1,25 @@ +2010-01-20 Kenichi Handa + + * coding.c (consume_chars): If ! multibyte and the encoder is ccl, + treat the source as actual byte sequence. + +2010-01-19 Alan Mackenzie + + Fix spurious before-change-functions invocation from (insert ?\n). + * textprop.c (set_text_properties): rename parameter + `signal_after_change_p' to `coherent_change_p', and make the + invocation of `modify_region' conditional on it. + +2010-01-19 Jan Djärv + + * xsettings.c (apply_xft_settings): Save settings in Vxft_settings + for debug purpose. + (syms_of_xsettings): Declare xft-settings. + +2010-01-18 Chong Yidong + + * editfns.c (Fcurrent_time_string): Doc fix (Bug#5408). + 2010-01-16 Stefan Monnier * xterm.c (event_handler_gdk): Block input (Bug#5037). diff -r f1cb61394e72 -r 46c08e6b42d6 src/coding.c --- a/src/coding.c Mon Jan 18 14:40:12 2010 +0000 +++ b/src/coding.c Wed Jan 20 14:24:11 2010 +0000 @@ -7417,7 +7417,8 @@ { EMACS_INT bytes; - if (coding->encoder == encode_coding_raw_text) + if (coding->encoder == encode_coding_raw_text + || coding->encoder == encode_coding_ccl) c = *src++, pos++; else if ((bytes = MULTIBYTE_LENGTH (src, src_end)) > 0) c = STRING_CHAR_ADVANCE_NO_UNIFY (src), pos += bytes; diff -r f1cb61394e72 -r 46c08e6b42d6 src/editfns.c --- a/src/editfns.c Mon Jan 18 14:40:12 2010 +0000 +++ b/src/editfns.c Wed Jan 20 14:24:11 2010 +0000 @@ -1897,7 +1897,7 @@ } DEFUN ("current-time-string", Fcurrent_time_string, Scurrent_time_string, 0, 1, 0, - doc: /* Return the current time, as a human-readable string. + doc: /* Return the current local time, as a human-readable string. Programs can use this function to decode a time, since the number of columns in each field is fixed if the year is in the range 1000-9999. diff -r f1cb61394e72 -r 46c08e6b42d6 src/textprop.c --- a/src/textprop.c Mon Jan 18 14:40:12 2010 +0000 +++ b/src/textprop.c Wed Jan 20 14:24:11 2010 +0000 @@ -1346,13 +1346,15 @@ /* Replace properties of text from START to END with new list of properties PROPERTIES. OBJECT is the buffer or string containing the text. OBJECT nil means use the current buffer. - SIGNAL_AFTER_CHANGE_P nil means don't signal after changes. Value - is nil if the function _detected_ that it did not replace any - properties, non-nil otherwise. */ + COHERENT_CHANGE_P nil means this is being called as an internal + subroutine, rather than as a change primitive with checking of + read-only, invoking change hooks, etc.. Value is nil if the + function _detected_ that it did not replace any properties, non-nil + otherwise. */ Lisp_Object -set_text_properties (start, end, properties, object, signal_after_change_p) - Lisp_Object start, end, properties, object, signal_after_change_p; +set_text_properties (start, end, properties, object, coherent_change_p) + Lisp_Object start, end, properties, object, coherent_change_p; { register INTERVAL i; Lisp_Object ostart, oend; @@ -1397,12 +1399,12 @@ return Qnil; } - if (BUFFERP (object)) + if (BUFFERP (object) && !NILP (coherent_change_p)) modify_region (XBUFFER (object), XINT (start), XINT (end), 1); set_text_properties_1 (start, end, properties, object, i); - if (BUFFERP (object) && !NILP (signal_after_change_p)) + if (BUFFERP (object) && !NILP (coherent_change_p)) signal_after_change (XINT (start), XINT (end) - XINT (start), XINT (end) - XINT (start)); return Qt; diff -r f1cb61394e72 -r 46c08e6b42d6 src/xsettings.c --- a/src/xsettings.c Mon Jan 18 14:40:12 2010 +0000 +++ b/src/xsettings.c Wed Jan 20 14:24:11 2010 +0000 @@ -42,6 +42,8 @@ static struct x_display_info *first_dpyinfo; static Lisp_Object Qfont_name, Qfont_render; static int use_system_font; +static Lisp_Object Vxft_settings; + #ifdef HAVE_GCONF static GConfClient *gconf_client; @@ -406,12 +408,13 @@ FcPattern *pat; struct xsettings settings, oldsettings; int changed = 0; + char buf[256]; if (!read_xft_settings (dpyinfo, &settings)) return; memset (&oldsettings, 0, sizeof (oldsettings)); - + buf[0] = '\0'; pat = FcPatternCreate (); XftDefaultSubstitute (dpyinfo->display, XScreenNumberOfScreen (dpyinfo->screen), @@ -428,20 +431,30 @@ FcPatternDel (pat, FC_ANTIALIAS); FcPatternAddBool (pat, FC_ANTIALIAS, settings.aa); ++changed; + oldsettings.aa = settings.aa; } + sprintf (buf, "Antialias: %d", oldsettings.aa); + if ((settings.seen & SEEN_HINTING) != 0 && oldsettings.hinting != settings.hinting) { FcPatternDel (pat, FC_HINTING); FcPatternAddBool (pat, FC_HINTING, settings.hinting); ++changed; + oldsettings.hinting = settings.hinting; } + if (strlen (buf) > 0) strcat (buf, ", "); + sprintf (buf+strlen (buf), "Hinting: %d", oldsettings.hinting); if ((settings.seen & SEEN_RGBA) != 0 && oldsettings.rgba != settings.rgba) { FcPatternDel (pat, FC_RGBA); FcPatternAddInteger (pat, FC_RGBA, settings.rgba); + oldsettings.rgba = settings.rgba; ++changed; } + if (strlen (buf) > 0) strcat (buf, ", "); + sprintf (buf+strlen (buf), "RGBA: %d", oldsettings.rgba); + /* Older fontconfig versions don't have FC_LCD_FILTER. */ if ((settings.seen & SEEN_LCDFILTER) != 0 && oldsettings.lcdfilter != settings.lcdfilter) @@ -449,14 +462,22 @@ FcPatternDel (pat, FC_LCD_FILTER); FcPatternAddInteger (pat, FC_LCD_FILTER, settings.lcdfilter); ++changed; + oldsettings.lcdfilter = settings.lcdfilter; } + if (strlen (buf) > 0) strcat (buf, ", "); + sprintf (buf+strlen (buf), "LCDFilter: %d", oldsettings.lcdfilter); + if ((settings.seen & SEEN_HINTSTYLE) != 0 && oldsettings.hintstyle != settings.hintstyle) { FcPatternDel (pat, FC_HINT_STYLE); FcPatternAddInteger (pat, FC_HINT_STYLE, settings.hintstyle); ++changed; + oldsettings.hintstyle = settings.hintstyle; } + if (strlen (buf) > 0) strcat (buf, ", "); + sprintf (buf+strlen (buf), "Hintstyle: %d", oldsettings.hintstyle); + if ((settings.seen & SEEN_DPI) != 0 && oldsettings.dpi != settings.dpi && settings.dpi > 0) { @@ -465,7 +486,8 @@ FcPatternDel (pat, FC_DPI); FcPatternAddDouble (pat, FC_DPI, settings.dpi); ++changed; - + oldsettings.dpi = settings.dpi; + /* Change the DPI on this display and all frames on the display. */ dpyinfo->resy = dpyinfo->resx = settings.dpi; FOR_EACH_FRAME (tail, frame) @@ -474,12 +496,16 @@ XFRAME (frame)->resy = XFRAME (frame)->resx = settings.dpi; } + if (strlen (buf) > 0) strcat (buf, ", "); + sprintf (buf+strlen (buf), "DPI: %lf", oldsettings.dpi); + if (changed) { XftDefaultSet (dpyinfo->display, pat); if (send_event_p) store_font_changed_event (Qfont_render, XCAR (dpyinfo->name_list_element)); + Vxft_settings = make_string (buf, strlen (buf)); } else FcPatternDestroy (pat); @@ -638,6 +664,10 @@ doc: /* *Non-nil means to use the system defined font. */); use_system_font = 0; + DEFVAR_LISP ("xft-settings", &Vxft_settings, + doc: /* Font settings applied to Xft. */); + Vxft_settings = make_string ("", 0); + #ifdef HAVE_XFT Fprovide (intern_c_string ("font-render-setting"), Qnil); #ifdef HAVE_GCONF