From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: don@donarmstrong.com (Emacs bug Tracking System) Newsgroups: gmane.emacs.bugs Subject: bug#642: marked as done (23.0.60; garbled text (wrong font?) in About GNU Emacs screen) Date: Sun, 23 Nov 2008 07:30:03 -0800 Message-ID: References: <49297533.3040505@f2s.com> <001001c8f4dd$9e12a170$0200a8c0@us.oracle.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----------=_1227454203-32684-0" X-Trace: ger.gmane.org 1227454313 9740 80.91.229.12 (23 Nov 2008 15:31:53 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 23 Nov 2008 15:31:53 +0000 (UTC) To: Jason Rumney Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Nov 23 16:32:56 2008 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1L4GwR-0005wB-3m for geb-bug-gnu-emacs@m.gmane.org; Sun, 23 Nov 2008 16:32:51 +0100 Original-Received: from localhost ([127.0.0.1]:51914 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1L4GvH-0007g9-KF for geb-bug-gnu-emacs@m.gmane.org; Sun, 23 Nov 2008 10:30:55 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1L4Gur-0007WR-F7 for bug-gnu-emacs@gnu.org; Sun, 23 Nov 2008 10:30:29 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1L4Gun-0007Uw-IN for bug-gnu-emacs@gnu.org; Sun, 23 Nov 2008 10:30:29 -0500 Original-Received: from [199.232.76.173] (port=36394 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1L4Gum-0007Up-W9 for bug-gnu-emacs@gnu.org; Sun, 23 Nov 2008 10:30:25 -0500 Original-Received: from rzlab.ucr.edu ([138.23.92.77]:43780) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1L4Guk-00026R-40 for bug-gnu-emacs@gnu.org; Sun, 23 Nov 2008 10:30:25 -0500 Original-Received: from rzlab.ucr.edu (rzlab.ucr.edu [127.0.0.1]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id mANFUAJ9000810; Sun, 23 Nov 2008 07:30:10 -0800 Original-Received: (from debbugs@localhost) by rzlab.ucr.edu (8.13.8/8.13.8/Submit) id mANFU3u6000329; Sun, 23 Nov 2008 07:30:03 -0800 X-Mailer: MIME-tools 5.420 (Entity 5.420) X-Loop: don@donarmstrong.com X-Emacs-PR-Message: closed 642 X-Emacs-PR-Package: emacs,w32 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:22605 Archived-At: This is a multi-part message in MIME format... ------------=_1227454203-32684-0 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 Your message dated Sun, 23 Nov 2008 23:22:27 +0800 with message-id <49297533.3040505@f2s.com> and subject line Re: bug#642: 23.0.60;garbled text (wrong font?) in About G= NU Emacs screen has caused the Emacs bug report #642, regarding 23.0.60; garbled text (wrong font?) in About GNU Emacs screen to be marked as done. This means that you claim that the problem has been dealt with. If this is not the case it is now your responsibility to reopen the bug report if necessary, and/or fix the problem forthwith. (NB: If you are a system administrator and have no idea what this message is talking about, this may indicate a serious mail system misconfiguration somewhere. Please contact don@donarmstrong.com immediately.) --=20 642: http://emacsbugs.donarmstrong.com/cgi-bin/bugreport.cgi?bug=3D642 Emacs Bug Tracking System Contact don@donarmstrong.com with problems ------------=_1227454203-32684-0 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 3.2.3-bugs.debian.org_2005_01_02 (2007-08-08) on rzlab.ucr.edu X-Spam-Level: X-Spam-Status: No, score=-2.9 required=4.0 tests=AWL,BAYES_00,CT_IMAGE, DC_IMAGE_SPAM_HTML,DC_IMAGE_SPAM_TEXT,DC_PNG_UNO_LARGO,FOURLA, MIME_QP_LONG_LINE,NEXTPART,RCVD_IN_DNSWL_MED,UNPARSEABLE_RELAY autolearn=no version=3.2.3-bugs.debian.org_2005_01_02 Received: (at submit) by emacsbugs.donarmstrong.com; 2 Aug 2008 20:26:22 +0000 Received: from fencepost.gnu.org (fencepost.gnu.org [140.186.70.10]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id m72KQGH1020973 for ; Sat, 2 Aug 2008 13:26:17 -0700 Received: from mail.gnu.org ([199.232.76.166]:41469 helo=mx10.gnu.org) by fencepost.gnu.org with esmtp (Exim 4.67) (envelope-from ) id 1KPNfB-00085W-DK for emacs-pretest-bug@gnu.org; Sat, 02 Aug 2008 16:25:18 -0400 Received: from Debian-exim by monty-python.gnu.org with spam-scanned (Exim 4.60) (envelope-from ) id 1KPNfy-0002pq-Mx for emacs-pretest-bug@gnu.org; Sat, 02 Aug 2008 16:26:14 -0400 Received: from rgminet01.oracle.com ([148.87.113.118]:35829) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KPNfw-0002om-Q4 for emacs-pretest-bug@gnu.org; Sat, 02 Aug 2008 16:26:06 -0400 Received: from agmgw2.us.oracle.com (agmgw2.us.oracle.com [152.68.180.213]) by rgminet01.oracle.com (Switch-3.2.4/Switch-3.1.6) with ESMTP id m72KPqMC015764 for ; Sat, 2 Aug 2008 14:25:52 -0600 Received: from acsmt357.oracle.com (acsmt357.oracle.com [141.146.40.157]) by agmgw2.us.oracle.com (Switch-3.2.0/Switch-3.2.0) with ESMTP id m72I51EQ031086 for ; Sat, 2 Aug 2008 14:25:51 -0600 Received: from inet-141-146-46-1.oracle.com by acsmt353.oracle.com with ESMTP id 11198767291217708591; Sat, 02 Aug 2008 13:23:11 -0700 Received: from dradamslap1 (/69.181.100.12) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Sat, 02 Aug 2008 13:23:08 -0700 From: "Drew Adams" To: Subject: 23.0.60; garbled text (wrong font?) in About GNU Emacs screen Date: Sat, 2 Aug 2008 13:23:25 -0700 Message-ID: <001001c8f4dd$9e12a170$0200a8c0@us.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0011_01C8F4A2.F1B3C970" X-Mailer: Microsoft Office Outlook 11 Thread-Index: Acj03Z21aAQ7E2/PQUK6d1zqYtwkEQ== X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198 X-Brightmail-Tracker: AAAAAQAAAAI= X-Brightmail-Tracker: AAAAAQAAAAI= X-Whitelist: TRUE X-Whitelist: TRUE X-detected-kernel: by monty-python.gnu.org: Linux 2.4-2.6 This is a multi-part message in MIME format. ------=_NextPart_000_0011_01C8F4A2.F1B3C970 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit emacs -Q --debug-init -l ".../path/to/hexrgb.el" -l ".../path/to/oneonone.el" -f "1on1-emacs" See attached files hexrgb.el and oneonone.el, and screenshot. This is a regression wrt a build of 2008-07-26, where there was no such problem. In GNU Emacs 23.0.60.1 (i386-mingw-nt5.1.2600) of 2008-08-01 on LENNART-69DE564 Windowing system distributor `Microsoft Corp.', version 5.1.2600 configured using `configure --with-gcc (3.4) --no-opt --cflags -Ic:/g/include -fno-crossjumping' Important settings: value of $LC_ALL: nil value of $LC_COLLATE: nil value of $LC_CTYPE: nil value of $LC_MESSAGES: nil value of $LC_MONETARY: nil value of $LC_NUMERIC: nil value of $LC_TIME: nil value of $LANG: ENU value of $XMODIFIERS: nil locale-coding-system: cp1252 default-enable-multibyte-characters: t ------=_NextPart_000_0011_01C8F4A2.F1B3C970 Content-Type: application/octet-stream; name="hexrgb.el" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="hexrgb.el" ;;; hexrgb.el --- Functions to manipulate colors, including RGB hex = strings.=0A= ;;=0A= ;; Filename: hexrgb.el=0A= ;; Description: Functions to manipulate colors, including RGB hex = strings.=0A= ;; Author: Drew Adams=0A= ;; Maintainer: Drew Adams=0A= ;; Copyright (C) 2004-2008, Drew Adams, all rights reserved.=0A= ;; Created: Mon Sep 20 22:58:45 2004=0A= ;; Version: 21.0=0A= ;; Last-Updated: Tue Jan 01 13:37:31 2008 (-28800 Pacific Standard Time)=0A= ;; By: dradams=0A= ;; Update #: 540=0A= ;; URL: http://www.emacswiki.org/cgi-bin/wiki/hexrgb.el=0A= ;; Keywords: number, hex, rgb, color, background, frames, display=0A= ;; Compatibility: GNU Emacs 20.x, GNU Emacs 21.x, GNU Emacs 22.x=0A= ;;=0A= ;; Features that might be required by this library:=0A= ;;=0A= ;; None=0A= ;;=0A= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A= ;;=0A= ;;; Commentary:=0A= ;;=0A= ;; Functions to manipulate colors, including RGB hex strings.=0A= ;;=0A= ;; This library provides functions for converting between RGB (red,=0A= ;; green, blue) color components and HSV (hue, saturation, value)=0A= ;; color components. It helps you convert among Emacs color values=0A= ;; (whole numbers from 0 through 65535), RGB and HSV floating-point=0A= ;; components (0.0 through 1.0), Emacs color-name strings (such as=0A= ;; "blue"), and hex RGB color strings (such as "#FC43A7912").=0A= ;;=0A= ;; An RGB hex string, such as used as a frame `background-color'=0A= ;; property, is a string of 1 + (3 * n) characters, the first of=0A= ;; which is "#". The other characters are hexadecimal digits, in=0A= ;; three groups representing (from the left): red, green, and blue=0A= ;; hex codes.=0A= ;;=0A= ;; Constants defined here:=0A= ;;=0A= ;; `hexrgb-defined-colors', `hexrgb-defined-colors-alist'.=0A= ;;=0A= ;; Commands defined here:=0A= ;;=0A= ;; `hexrgb-blue', `hexrgb-complement', `hexrgb-green',=0A= ;; `hexrgb-hue', `hexrgb-read-color', `hexrgb-red',=0A= ;; `hexrgb-saturation', `hexrgb-value'.=0A= ;;=0A= ;; Non-interactive functions defined here:=0A= ;;=0A= ;; `hexrgb-approx-equal', `hexrgb-color-name-to-hex',=0A= ;; `hexrgb-color-values-to-hex', `hexrgb-color-value-to-float',=0A= ;; `hexrgb-float-to-color-value', `hexrgb-hex-char-to-integer',=0A= ;; `hexrgb-hex-to-color-values', `hexrgb-hex-to-hsv',=0A= ;; `hexrgb-hex-to-rgb', `hexrgb-hsv-to-hex', `hexrgb-hex-to-int',=0A= ;; `hexrgb-hsv-to-rgb', `hexrgb-increment-blue',=0A= ;; `hexrgb-increment-equal-rgb', `hexrgb-increment-green',=0A= ;; `hexrgb-increment-hex', `hexrgb-increment-red',=0A= ;; `hexrgb-int-to-hex', `hexrgb-rgb-hex-string-p',=0A= ;; `hexrgb-rgb-to-hex', `hexrgb-rgb-to-hsv'.=0A= ;;=0A= ;;=0A= ;; Add this to your initialization file (~/.emacs or ~/_emacs):=0A= ;;=0A= ;; (require 'hexrgb)=0A= ;;=0A= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A= ;;=0A= ;;; Change log:=0A= ;;=0A= ;; 2007/12/30 dadams=0A= ;; Added: hexrgb-hex-to-color-values.=0A= ;; 2007/10/20 dadams=0A= ;; hexrgb-read-color: Treat pseudo colors too (e.g. *point = foreground*).=0A= ;; 2007/01/21 dadams=0A= ;; hexrgb-read-color: Error if empty string (and not = allow-empty-name-p).=0A= ;; 2006/06/06 dadams=0A= ;; Added: hexrgb-defined-colors(-alist). Use instead of = (x-defined-colors).=0A= ;; hexrgb-(red|green|blue): Added interactive specs.=0A= ;; 2006/06/04 dadams=0A= ;; hexrgb-read-color: Added optional arg allow-empty-name-p.=0A= ;; 2006/06/02 dadams=0A= ;; Added: hexrgb-rgb-hex-string-p. Used it.=0A= ;; 2006/05/30 dadams=0A= ;; Added: hexrgb-hex-to-(hsv|rgb), hexrgb-hsv-to-hex, = hexrgb-color-name-to-hex,=0A= ;; hexrgb-complement, hexrgb-read-color, hexrgb-hue, = hexrgb-saturation,=0A= ;; hexrgb-value, hexrgb-red, hexrgb-blue, hexrgb-green.=0A= ;; approx-equal: Add optional fuzz factor arguments. Changed the = algorithm.=0A= ;; Renamed: approx-equal to hexrgb-approx-equal.=0A= ;; hexrgb-rgb-to-hsv: Changed test from < to <=3D: (when (<=3D hue = 0.0)...).=0A= ;; hexrgb-hsv-to-rgb: Treat hue =3D 0.0 (int 0) the same as hue =3D = 1.0 (int 6).=0A= ;; hexrgb-rgb-to-hex, hexrgb-increment-hex: Corrected doc strings.=0A= ;; 2006/05/22 dadams=0A= ;; Added: hexrgb-hsv-to-hex, hexrgb-rgb-to-hex. Require cl.el when = byte-compile.=0A= ;; 2005/08/09 dadams=0A= ;; hexrgb-rgb-to-hsv: Side-stepped Emacs-20 bug in comparing NaN.=0A= ;; hexrgb-increment-*: Added optional arg wrap-p.=0A= ;; hexrgb-increment-hex: Prevent wrap if not wrap-p.=0A= ;; 2005/08/02 dadams=0A= ;; hexrgb-rgb-to-hes: Bug fix: If delta is zero, then so are hue and = saturation.=0A= ;; 2005/06/24 dadams=0A= ;; hexrgb-rgb-to-hsv: Bug fix: test for NaN (e.g. on divide by zero).=0A= ;; 2005/02/08 dadams=0A= ;; hexrgb-hsv-to-rgb: Bug fix (typo: p, q -> pp, qq; added ww).=0A= ;; 2005/01/09 dadams=0A= ;; hexrgb-int-to-hex: Fixed bug in hexrgb-int-to-hex: nb-digits not = respected.=0A= ;; Added: hexrgb-hsv-to-rgb, hexrgb-rgb-to-hsv, approx-equal.=0A= ;; Renamed old hexrgb-increment-value to hexrgb-increment-equal-rgb.=0A= ;; 2005/01/05 dadams=0A= ;; hexrgb-int-to-hex: Used a suggestion from Juri Linkov.=0A= ;;=0A= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A= ;;=0A= ;; This program is free software; you can redistribute it and/or modify=0A= ;; it under the terms of the GNU General Public License as published by=0A= ;; the Free Software Foundation; either version 2, or (at your option)=0A= ;; any later version.=0A= =0A= ;; This program is distributed in the hope that it will be useful,=0A= ;; but WITHOUT ANY WARRANTY; without even the implied warranty of=0A= ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the=0A= ;; GNU General Public License for more details.=0A= =0A= ;; You should have received a copy of the GNU General Public License=0A= ;; along with this program; see the file COPYING. If not, write to=0A= ;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth=0A= ;; Floor, Boston, MA 02110-1301, USA.=0A= ;;=0A= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A= ;;=0A= ;;; Code:=0A= =0A= (eval-when-compile (require 'cl)) ;; case; plus, for Emacs < 20: when, = unless=0A= =0A= ;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A= =0A= =0A= ;; Not used here, but put here to be available to libraries that use = `hexrgb.el'.=0A= ;;;###autoload=0A= (defconst hexrgb-defined-colors (eval-when-compile (x-defined-colors))=0A= "List of all supported colors.")=0A= =0A= ;;;###autoload=0A= (defconst hexrgb-defined-colors-alist (eval-when-compile (mapcar #'list = (x-defined-colors)))=0A= "Alist of all supported colors, for use in completion.")=0A= =0A= ;;;###autoload=0A= (defun hexrgb-read-color (&optional convert-to-RGB-p allow-empty-name-p = prompt)=0A= "Read a color name or RGB hex value: #RRRRGGGGBBBB.=0A= Completion is available for color names, but not for RGB hex strings.=0A= If you input an RGB hex string, it must have the form #XXXXXXXXXXXX or=0A= XXXXXXXXXXXX, where each X is a hex digit. The number of Xs must be a=0A= multiple of 3, with the same number of Xs for each of red, green, and=0A= blue. The order is red, green, blue.=0A= =0A= In addition to standard color names and RGB hex values, the following=0A= are available as color candidates. In each case, the corresponding=0A= color is used.=0A= =0A= * `*copied foreground*' - last copied foreground, if available=0A= * `*copied background*' - last copied background, if available=0A= * `*mouse-2 foreground*' - foreground where you click `mouse-2'=0A= * `*mouse-2 background*' - background where you click `mouse-2'=0A= * `*point foreground*' - foreground under the cursor=0A= * `*point background*' - background under the cursor=0A= =0A= \(You can copy a color using eyedropper commands such as=0A= `eyedrop-pick-foreground-at-mouse'.)=0A= =0A= Checks input to be sure it represents a valid color. If not, raises=0A= an error (but see exception for empty input with non-nil=0A= ALLOW-EMPTY-NAME-P).=0A= =0A= Interactively, or with optional arg CONVERT-TO-RGB-P non-nil, converts=0A= an input color name to an RGB hex string. Returns the RGB hex string.=0A= =0A= Optional arg ALLOW-EMPTY-NAME-P controls what happens if you enter an=0A= empty color name (that is, you just hit `RET'). If non-nil, then=0A= `hexrgb-read-color' returns an empty color name, \"\". If nil, then=0A= it raises an error. Programs must test for \"\" if ALLOW-EMPTY-NAME-P=0A= is non-nil. They can then perform an appropriate action in case of=0A= empty input.=0A= =0A= Optional arg PROMPT is the prompt. Nil means use a default prompt."=0A= (interactive "p") ; Always convert to RGB = interactively.=0A= (let* ((completion-ignore-case t)=0A= (colors (if (fboundp 'eyedrop-foreground-at-point)=0A= (append (and eyedrop-picked-foreground '(("*copied = foreground*")))=0A= (and eyedrop-picked-background '(("*copied = background*")))=0A= '(("*mouse-2 foreground*") ("*mouse-2 = background*")=0A= ("*point foreground*") ("*point = background*"))=0A= hexrgb-defined-colors-alist)=0A= hexrgb-defined-colors-alist))=0A= (color (completing-read (or prompt "Color (name or #R+G+B+): ") = colors))=0A= hex-string)=0A= (when (fboundp 'eyedrop-foreground-at-point)=0A= (cond ((string=3D "*copied foreground*" color) (setq color = eyedrop-picked-foreground))=0A= ((string=3D "*copied background*" color) (setq color = eyedrop-picked-background))=0A= ((string=3D "*point foreground*" color) (setq color = (eyedrop-foreground-at-point)))=0A= ((string=3D "*point background*" color) (setq color = (eyedrop-background-at-point)))=0A= ((string=3D "*mouse-2 foreground*" color)=0A= (setq color (prog1 (eyedrop-foreground-at-mouse=0A= (read-event "Click `mouse-2' to choose = foreground color - "))=0A= (read-event)))) ; Discard mouse up event.=0A= ((string=3D "*mouse-2 background*" color)=0A= (setq color (prog1 (eyedrop-background-at-mouse=0A= (read-event "Click `mouse-2' to choose = background color - "))=0A= (read-event)))))) ; Discard mouse up event.=0A= (setq hex-string (or (string-match = "^#\\([a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]\\)+$" color)=0A= (and (string-match = "^\\([a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]\\)+$" color)=0A= t)))=0A= (if (and allow-empty-name-p (string=3D "" color))=0A= ""=0A= (when (and hex-string (not (eq 0 hex-string)))=0A= (setq color (concat "#" color))) ; No #; add it.=0A= (unless hex-string=0A= (when (or (string=3D "" color)=0A= (not (if (fboundp 'test-completion) ; Not defined in = Emacs 20.=0A= (test-completion color colors)=0A= (try-completion color colors))))=0A= (error "No such color: %S" color))=0A= (when convert-to-RGB-p (setq color (hexrgb-color-name-to-hex = color))))=0A= (when (interactive-p) (message "Color: `%s'" color))=0A= color)))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-rgb-hex-string-p (color &optional laxp)=0A= "Non-nil if COLOR is an RGB string #XXXXXXXXXXXX.=0A= Each X is a hex digit. The number of Xs must be a multiple of 3, with=0A= the same number of Xs for each of red, green, and blue.=0A= =0A= Non-nil optional arg LAXP means that the initial `#' is optional. In=0A= that case, for a valid string of hex digits: when # is present 0 is=0A= returned; otherwise, t is returned."=0A= (or (string-match "^#\\([a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]\\)+$" color)=0A= (and laxp (string-match = "^\\([a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]\\)+$" color) t)))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-complement (color)=0A= "Return the color that is the complement of COLOR."=0A= (interactive (list (hexrgb-read-color)))=0A= (setq color (hexrgb-color-name-to-hex color))=0A= (let ((red (hexrgb-red color))=0A= (green (hexrgb-green color))=0A= (blue (hexrgb-blue color)))=0A= (setq color (hexrgb-rgb-to-hex (- 1.0 red) (- 1.0 green) (- 1.0 = blue))))=0A= (when (interactive-p) (message "Complement: `%s'" color))=0A= color)=0A= =0A= ;;;###autoload=0A= (defun hexrgb-hue (color)=0A= "Return the hue component of COLOR, in range 0 to 1 inclusive.=0A= COLOR is a color name or hex RGB string that starts with \"#\"."=0A= (interactive (list (hexrgb-read-color)))=0A= (setq color (hexrgb-color-name-to-hex color))=0A= (car (hexrgb-rgb-to-hsv (hexrgb-red color) (hexrgb-green color) = (hexrgb-blue color))))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-saturation (color)=0A= "Return the saturation component of COLOR, in range 0 to 1 inclusive.=0A= COLOR is a color name or hex RGB string that starts with \"#\"."=0A= (interactive (list (hexrgb-read-color)))=0A= (setq color (hexrgb-color-name-to-hex color))=0A= (cadr (hexrgb-rgb-to-hsv (hexrgb-red color) (hexrgb-green color) = (hexrgb-blue color))))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-value (color)=0A= "Return the value component of COLOR, in range 0 to 1 inclusive.=0A= COLOR is a color name or hex RGB string that starts with \"#\"."=0A= (interactive (list (hexrgb-read-color)))=0A= (setq color (hexrgb-color-name-to-hex color))=0A= (caddr (hexrgb-rgb-to-hsv (hexrgb-red color) (hexrgb-green color) = (hexrgb-blue color))))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-red (color)=0A= "Return the red component of COLOR, in range 0 to 1 inclusive.=0A= COLOR is a color name or hex RGB string that starts with \"#\"."=0A= (interactive (list (hexrgb-read-color)))=0A= (setq color (hexrgb-color-name-to-hex color))=0A= (/ (hexrgb-hex-to-int (substring color 1 (1+ (/ (1- (length color)) = 3))))=0A= (expt 16.0 (/ (1- (length color)) 3.0))))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-green (color)=0A= "Return the green component of COLOR, in range 0 to 1 inclusive.=0A= COLOR is a color name or hex RGB string that starts with \"#\"."=0A= (interactive (list (hexrgb-read-color)))=0A= (setq color (hexrgb-color-name-to-hex color))=0A= (let* ((len (/ (1- (length color)) 3))=0A= (start (1+ len)))=0A= (/ (hexrgb-hex-to-int (substring color start (+ start len)))=0A= (expt 16.0 (/ (1- (length color)) 3.0)))))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-blue (color)=0A= "Return the blue component of COLOR, in range 0 to 1 inclusive.=0A= COLOR is a color name or hex RGB string that starts with \"#\"."=0A= (interactive (list (hexrgb-read-color)))=0A= (setq color (hexrgb-color-name-to-hex color))=0A= (let* ((len (/ (1- (length color)) 3))=0A= (start (+ 1 len len)))=0A= (/ (hexrgb-hex-to-int (substring color start (+ start len)))=0A= (expt 16.0 (/ (1- (length color)) 3.0)))))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-rgb-to-hsv (red green blue)=0A= "Convert RED, GREEN, BLUE components to HSV (hue, saturation, value).=0A= Each input component is 0.0 to 1.0, inclusive.=0A= Returns a list of HSV components of value 0.0 to 1.0, inclusive."=0A= (let* ((min (min red green blue))=0A= (max (max red green blue))=0A= (value max)=0A= (delta (- max min))=0A= hue saturation)=0A= (if (hexrgb-approx-equal 0.0 delta)=0A= (setq hue 0.0 saturation 0.0) ; Gray scale - no color; only = value.=0A= (if (and (condition-case nil=0A= (setq saturation (/ delta max))=0A= (arith-error nil))=0A= (or (< emacs-major-version 21) ; Emacs 20 bug makes next = test fail falsely.=0A= (not (equal 0.0e+NaN saturation)))) ; Must be a = number, not NaN.=0A= (if (hexrgb-approx-equal 0.0 saturation)=0A= (setq hue 0.0 saturation 0.0) ; Again, no color; only = value.=0A= ;; Color=0A= (if (hexrgb-approx-equal red max)=0A= (setq hue (/ (- green blue) delta)) ; Between yellow & = magenta.=0A= (if (hexrgb-approx-equal green max)=0A= (setq hue (+ 2.0 (/ (- blue red) delta))) ; Between = cyan & yellow.=0A= (setq hue (+ 4.0 (/ (- red green) delta))))) ; Between = magenta & cyan.=0A= (setq hue (/ hue 6.0))=0A= (when (<=3D hue 0.0)(setq hue (+ hue 1.0))))=0A= (setq saturation 0.0 hue 0.0))) ; Div by zero (max=3D0): H:=3D0, = S:=3D0. (Hue undefined.)=0A= (list hue saturation value)))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-hsv-to-rgb (hue saturation value)=0A= "Convert HUE, SATURATION, VALUE components to RGB (red, green, blue).=0A= Each input component is 0.0 to 1.0, inclusive.=0A= Returns a list of RGB components of value 0.0 to 1.0, inclusive."=0A= (let (red green blue int-hue fract pp qq tt ww)=0A= (if (hexrgb-approx-equal 0.0 saturation)=0A= (setq red value green value blue value) ; Gray=0A= (setq hue (* hue 6.0) ; Sectors: 0 to 5=0A= int-hue (floor hue)=0A= fract (- hue int-hue)=0A= pp (* value (- 1 saturation))=0A= qq (* value (- 1 (* saturation fract)))=0A= ww (* value (- 1 (* saturation (- 1 (- hue int-hue))))))=0A= (case int-hue=0A= ((0 6) (setq red value green ww blue pp))=0A= (1 (setq red qq green value blue pp))=0A= (2 (setq red pp green value blue ww))=0A= (3 (setq red pp green qq blue value))=0A= (4 (setq red ww green pp blue value))=0A= (otherwise (setq red value green pp blue qq))))=0A= (list red green blue)))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-hsv-to-hex (hue saturation value)=0A= "Return the hex RBG color string for inputs HUE, SATURATION, VALUE.=0A= The inputs are each in the range 0 to 1.=0A= The output string is of the form \"#RRRRGGGGBBBB\"."=0A= (hexrgb-color-values-to-hex=0A= (mapcar (lambda (x) (floor (* x 65535.0))) (hexrgb-hsv-to-rgb hue = saturation value))))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-rgb-to-hex (red green blue)=0A= "Return the hex RBG color string for inputs RED, GREEN, BLUE.=0A= The inputs are each in the range 0 to 1.=0A= The output string is of the form \"#RRRRGGGGBBBB\"."=0A= (hexrgb-color-values-to-hex=0A= (mapcar (lambda (x) (floor (* x 65535.0))) (list red green blue))))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-hex-to-hsv (color)=0A= "Return a list of HSV (hue, saturation, value) color components.=0A= Each component is a value from 0.0 to 1.0, inclusive.=0A= COLOR is a color name or a hex RGB string that starts with \"#\" and=0A= is followed by an equal number of hex digits for red, green, and blue=0A= components."=0A= (let ((rgb-components (hexrgb-hex-to-rgb color)))=0A= (apply #'hexrgb-rgb-to-hsv rgb-components)))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-hex-to-rgb (color)=0A= "Return a list of RGB (red, green, blue) color components.=0A= Each component is a value from 0.0 to 1.0, inclusive.=0A= COLOR is a color name or a hex RGB string that starts with \"#\" and=0A= is followed by an equal number of hex digits for red, green, and blue=0A= components."=0A= (unless (hexrgb-rgb-hex-string-p color) (setq color = (hexrgb-color-name-to-hex color)))=0A= (let ((len (/ (1- (length color)) 3)))=0A= (list (/ (hexrgb-hex-to-int (substring color 1 (1+ len))) 65535.0)=0A= (/ (hexrgb-hex-to-int (substring color (1+ len) (+ 1 len = len))) 65535.0)=0A= (/ (hexrgb-hex-to-int (substring color (+ 1 len len))) = 65535.0))))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-color-name-to-hex (color)=0A= "Return the RGB hex string for the COLOR name, starting with \"#\".=0A= If COLOR is already a string starting with \"#\", then just return it."=0A= (let ((components (x-color-values color)))=0A= (unless components (error "No such color: %S" color))=0A= (unless (hexrgb-rgb-hex-string-p color)=0A= (setq color (hexrgb-color-values-to-hex components))))=0A= color)=0A= =0A= ;; Just hard-code 4 as the number of hex digits, since `x-color-values'=0A= ;; seems to produce appropriate integer values for this value.=0A= ;;=0A= ;; Color "components" would be better in the name than color "value"=0A= ;; but this name follows the Emacs tradition (e.g. `x-color-values',=0A= ;; 'ps-color-values', `ps-e-x-color-values').=0A= ;;;###autoload=0A= (defun hexrgb-color-values-to-hex (values)=0A= "Convert list of rgb color VALUES to a hex string, #XXXXXXXXXXXX.=0A= Each X in the string is a hexadecimal digit.=0A= Input VALUES is as for the output of `x-color-values'."=0A= (concat "#"=0A= (hexrgb-int-to-hex (nth 0 values) 4) ; red=0A= (hexrgb-int-to-hex (nth 1 values) 4) ; green=0A= (hexrgb-int-to-hex (nth 2 values) 4))) ; blue=0A= =0A= ;;;###autoload=0A= (defun hexrgb-hex-to-color-values (color)=0A= "Convert hex COLOR to a list of rgb color values.=0A= COLOR is a hex rgb color string, #XXXXXXXXXXXX=0A= Each X in the string is a hexadecimal digit. There are 3N X's, N > 0.=0A= The output list is as for `x-color-values'."=0A= (let* ((hex-strgp (string-match=0A= = "^\\(#\\)?\\(\\([a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]\\)+\\)$"=0A= color))=0A= (ndigits (/ (if (eq (match-beginning 1) (match-end 1))=0A= (length color)=0A= (1- (length color)))=0A= 3))=0A= red green blue)=0A= (unless hex-strgp (error "Invalid RGB color string: %s" color))=0A= (setq color (substring color (match-beginning 2) (match-end 2))=0A= red (hexrgb-hex-to-int (substring color 0 ndigits))=0A= green (hexrgb-hex-to-int (substring color ndigits (* 2 = ndigits)))=0A= blue (hexrgb-hex-to-int (substring color ndigits (* 3 = ndigits))))=0A= (list red green blue)))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-increment-red (hex nb-digits increment &optional wrap-p)=0A= "Increment red value of rgb string HEX by INCREMENT.=0A= String HEX starts with \"#\". Each color is NB-DIGITS hex digits long.=0A= If optional arg WRAP-P is non-nil, then the result wraps around zero.=0A= For example, incrementing \"#FFFFFFFFF\" by 1 will cause it to wrap=0A= around to \"#000000000\"."=0A= (concat "#"=0A= (hexrgb-increment-hex (substring hex 1 (1+ nb-digits)) = increment nb-digits wrap-p)=0A= (substring hex (1+ nb-digits) (1+ (* nb-digits 2)))=0A= (substring hex (1+ (* nb-digits 2)))))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-increment-green (hex nb-digits increment &optional wrap-p)=0A= "Increment green value of rgb string HEX by INCREMENT.=0A= String HEX starts with \"#\". Each color is NB-DIGITS hex digits long.=0A= For example, incrementing \"#FFFFFFFFF\" by 1 will cause it to wrap=0A= around to \"#000000000\"."=0A= (concat=0A= "#" (substring hex 1 (1+ nb-digits))=0A= (hexrgb-increment-hex (substring hex (1+ nb-digits) (1+ (* nb-digits = 2)))=0A= increment=0A= nb-digits=0A= wrap-p)=0A= (substring hex (1+ (* nb-digits 2)))))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-increment-blue (hex nb-digits increment &optional wrap-p)=0A= "Increment blue value of rgb string HEX by INCREMENT.=0A= String HEX starts with \"#\". Each color is NB-DIGITS hex digits long.=0A= For example, incrementing \"#FFFFFFFFF\" by 1 will cause it to wrap=0A= around to \"#000000000\"."=0A= (concat "#" (substring hex 1 (1+ (* nb-digits 2)))=0A= (hexrgb-increment-hex (substring hex (1+ (* nb-digits 2)))=0A= increment=0A= nb-digits=0A= wrap-p)))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-increment-equal-rgb (hex nb-digits increment &optional = wrap-p)=0A= "Increment each color value (r,g,b) of rgb string HEX by INCREMENT.=0A= String HEX starts with \"#\". Each color is NB-DIGITS hex digits long.=0A= For example, incrementing \"#FFFFFFFFF\" by 1 will cause it to wrap=0A= around to \"#000000000\"."=0A= (concat=0A= "#" (hexrgb-increment-hex (substring hex 1 (1+ nb-digits)) increment = nb-digits wrap-p)=0A= (hexrgb-increment-hex (substring hex (1+ nb-digits) (1+ (* nb-digits = 2)))=0A= increment=0A= nb-digits=0A= wrap-p)=0A= (hexrgb-increment-hex (substring hex (1+ (* nb-digits 2))) increment = nb-digits wrap-p)))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-increment-hex (hex increment nb-digits &optional wrap-p)=0A= "Increment HEX number (a string NB-DIGITS long) by INCREMENT.=0A= For example, incrementing \"FFFFFFFFF\" by 1 will cause it to wrap=0A= around to \"000000000\"."=0A= (let* ((int (hexrgb-hex-to-int hex))=0A= (new-int (+ increment int)))=0A= (if (or wrap-p=0A= (and (>=3D int 0) ; Not too large for the = machine.=0A= (>=3D new-int 0) ; For the case where increment = < 0.=0A= (<=3D (length (format (concat "%X") new-int)) = nb-digits))) ; Not too long.=0A= (hexrgb-int-to-hex new-int nb-digits) ; Use incremented number.=0A= hex))) ; Don't increment.=0A= =0A= ;;;###autoload=0A= (defun hexrgb-hex-to-int (hex)=0A= "Convert HEX string argument to an integer.=0A= The characters of HEX must be hex characters."=0A= (let* ((factor 1)=0A= (len (length hex))=0A= (indx (1- len))=0A= (int 0))=0A= (while (>=3D indx 0)=0A= (setq int (+ int (* factor (hexrgb-hex-char-to-integer (aref hex = indx)))))=0A= (setq indx (1- indx))=0A= (setq factor (* 16 factor)))=0A= int))=0A= =0A= ;; From `hexl.el'. This is the same as `hexl-hex-char-to-integer' = defined there.=0A= ;;;###autoload=0A= (defun hexrgb-hex-char-to-integer (character)=0A= "Take a CHARACTER and return its value as if it were a hex digit."=0A= (if (and (>=3D character ?0) (<=3D character ?9))=0A= (- character ?0)=0A= (let ((ch (logior character 32)))=0A= (if (and (>=3D ch ?a) (<=3D ch ?f))=0A= (- ch (- ?a 10))=0A= (error "Invalid hex digit `%c'" ch)))))=0A= =0A= ;; Originally, I used the code from `int-to-hex-string' in `float.el'.=0A= ;; This version is thanks to Juri Linkov .=0A= ;;=0A= ;;;###autoload=0A= (defun hexrgb-int-to-hex (int &optional nb-digits)=0A= "Convert integer argument INT to a #XXXXXXXXXXXX format hex string.=0A= Each X in the output string is a hexadecimal digit.=0A= NB-DIGITS is the number of hex digits. If INT is too large to be=0A= represented with NB-DIGITS, then the result is truncated from the=0A= left. So, for example, INT=3D256 and NB-DIGITS=3D2 returns \"00\", since=0A= the hex equivalent of 256 decimal is 100, which is more than 2 digits."=0A= (setq nb-digits (or nb-digits 4))=0A= (substring (format (concat "%0" (int-to-string nb-digits) "X") int) (- = nb-digits)))=0A= =0A= ;; Inspired by Elisp Info manual, node "Comparison of Numbers".=0A= ;;;###autoload=0A= (defun hexrgb-approx-equal (x y &optional rfuzz afuzz)=0A= "Return non-nil if numbers X and Y are approximately equal.=0A= RFUZZ is a relative fuzz factor. AFUZZ is an absolute fuzz factor.=0A= RFUZZ defaults to 1.0e-8. AFUZZ defaults to (/ RFUZZ 10).=0A= The algorithm is:=0A= (< (abs (- X Y)) (+ AFUZZ (* RFUZZ (+ (abs X) (abs Y)))))."=0A= (setq rfuzz (or rfuzz 1.0e-8) afuzz (or afuzz (/ rfuzz 10)))=0A= (< (abs (- x y)) (+ afuzz (* rfuzz (+ (abs x) (abs y))))))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-color-value-to-float (n)=0A= "Return the floating-point equivalent of color value N.=0A= N must be an integer between 0 and 65535, or else an error is raised."=0A= (unless (and (wholenump n) (<=3D n 65535))=0A= (error "Not a whole number less than 65536"))=0A= (/ (float n) 65535.0))=0A= =0A= ;;;###autoload=0A= (defun hexrgb-float-to-color-value (x)=0A= "Return the color value equivalent of floating-point number X.=0A= X must be between 0.0 and 1.0, or else an error is raised."=0A= (unless (and (numberp x) (<=3D 0.0 x) (<=3D x 1.0))=0A= (error "Not a floating-point number between 0.0 and 1.0"))=0A= (floor (* x 65535.0)))=0A= =0A= ;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A= =0A= (provide 'hexrgb)=0A= =0A= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A= ;;; hexrgb.el ends here=0A= ------=_NextPart_000_0011_01C8F4A2.F1B3C970 Content-Type: application/octet-stream; name="oneonone.el" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="oneonone.el" ;;; oneonone.el --- Frame configuration that uses one frame per window.=0A= ;;=0A= ;; Filename: oneonone.el=0A= ;; Description: Frame configuration that uses one frame per window.=0A= ;; Author: Drew Adams=0A= ;; Maintainer: Drew Adams=0A= ;; Copyright (C) 1999-2008, Drew Adams, all rights reserved.=0A= ;; Created: Fri Apr 2 12:34:20 1999=0A= ;; Version: 21.1=0A= ;; Last-Updated: Tue Feb 12 07:08:17 2008 (Pacific Standard Time)=0A= ;; By: dradams=0A= ;; Update #: 2344=0A= ;; URL: http://www.emacswiki.org/cgi-bin/wiki/oneonone.el=0A= ;; Keywords: local, frames=0A= ;; Compatibility: GNU Emacs 20.x, GNU Emacs 21.x, GNU Emacs 22.x=0A= ;;=0A= ;; Features that might be required by this library:=0A= ;;=0A= ;; `avoid', `cl', `files+', `frame-cmds', `frame-fns', `hexrgb',=0A= ;; `misc-fns', `oneonone', `strings', `thingatpt', `thingatpt+',=0A= ;; `zoom-frm'.=0A= ;;=0A= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A= ;;=0A= ;;; Commentary:=0A= ;;=0A= ;; Frame configuration that uses one frame per window.=0A= ;;=0A= ;; This library is part of One-on-One Emacs, a collection of=0A= ;; libraries that try to make Emacs more frame-oriented and less=0A= ;; window-oriented.=0A= ;;=0A= ;; This library sets up Emacs to use multiple frames: individual=0A= ;; frames are used, by default, instead of Emacs windows. That is,=0A= ;; the default is to use a frame for each Emacs window: one window on=0A= ;; one frame.=0A= ;;=0A= ;; You can configure each of the frames defined here.=0A= ;;=0A= ;; Default properties are defined here for normal frames and=0A= ;; "special" frames, which show "special-display buffers" (see Emacs=0A= ;; manual for info on such frames).=0A= ;;=0A= ;; In addition, these user options control the creation of three=0A= ;; separate, specialized frames:=0A= ;;=0A= ;; - `1on1-*Help*-frame-flag' - *Help* buffer frame=0A= ;; - `1on1-*Completions*-frame-flag' - *Completions* buffer frame=0A= ;; - `1on1-minibuffer-frame-flag' - minibuffer frame=0A= ;;=0A= ;; Buffers *Help* and *Completions* are always displayed in their own=0A= ;; frames. In addition, if `1on1-*Help*-frame-flag' or=0A= ;; `1on1-*Completions*-frame-flag' is non-nil, then the *Help* or=0A= ;; *Completions* frame has a special (customizable) appearance.=0A= ;;=0A= ;; If `1on1-minibuffer-frame-flag' is non-nil (the default value),=0A= ;; then the minibuffer is shown in its own frame,=0A= ;; `1on1-minibuffer-frame'; this is the only frame to have a=0A= ;; minibuffer. If you customize `1on1-minibuffer-frame-flag' to nil,=0A= ;; then each frame will have its own minibuffer, as usual, and there=0A= ;; will be no standalone minibuffer frame.=0A= ;; =0A= ;; By default, if you use a standalone minibuffer frame, it is=0A= ;; automatically sized to the full width of your display and placed=0A= ;; at the bottom of the display. During minibuffer input, you can=0A= ;; use `1on1-fit-minibuffer-frame' (bind to `C-o') to resize its=0A= ;; height to fit the input text - the height is reset when inputting=0A= ;; is done. To help you perceive changes to different minibuffer=0A= ;; recursion levels, the background color of the minibuffer frame is=0A= ;; changed slightly with each recursion-depth change.=0A= ;;=0A= ;; This library is especially useful if used in combination with=0A= ;; One-on-One Emacs libraries `autofit-frame.el', which automatically=0A= ;; fits frames to their sole window, and `fit-frame.el', which lets=0A= ;; you fit a frame to its selected window manually. Library=0A= ;; `autofit-frame.el' uses library `fit-frame.el'.=0A= ;;=0A= ;; Because Emacs is not really designed to be frame-oriented, there=0A= ;; are many built-in and standard functions that produce=0A= ;; less-than-optimal results when frames, instead of windows, are the=0A= ;; default. In other One-on-One Emacs libraries, I have fixed most=0A= ;; of these built-in functions to play well with frames.=0A= ;;=0A= ;; For more information on One-on-One Emacs see=0A= ;; http://www.emacswiki.org/cgi-bin/wiki/OneOnOneEmacs.=0A= ;;=0A= ;; To use this library, put the following at the *END* of your init=0A= ;; file, `.emacs' (or `_emacs'). In particular, if your init file=0A= ;; contains a `custom-set-variables' expression, then the following=0A= ;; must appear *AFTER* that expression, in order for this to take=0A= ;; into account your customizations of any `1on1-' user options.=0A= ;;=0A= ;; (require 'oneonone)=0A= ;; (1on1-emacs)=0A= ;;=0A= ;; Initial frame: By default, the initial Emacs frame is like all=0A= ;; other normal (non-special-display) frames; that is,=0A= ;; `initial-frame-alist' effectively uses the frame properties=0A= ;; defined in `default-frame-alist'. If you would like the initial=0A= ;; frame to be different, set `default-frame-alist' to nil after=0A= ;; requiring `oneonone.el' but before executing `1on1-emacs':=0A= ;;=0A= ;; (require 'oneonone)=0A= ;; (setq default-frame-alist nil)=0A= ;; (setq initial-frame-alist '((background-color . "White"))); e.g.=0A= ;; (1on1-emacs)=0A= ;;=0A= ;; If you want the text cursor to change to a box when Emacs is idle,=0A= ;; then add this line also to your init file:=0A= ;;=0A= ;; (toggle-box-cursor-when-idle 1) ; Turn on box cursor when idle.=0A= ;;=0A= ;; Info and Customize frames: I recommend that you put the following=0A= ;; code in your init file, so that Info and Customize buffers will=0A= ;; display in their own frames. Which code to use depends on your=0A= ;; version of GNU Emacs.=0A= ;;=0A= ;; (cond ((< emacs-major-version 21)=0A= ;; (remove-hook 'same-window-buffer-names "*info*"))=0A= ;; ((=3D emacs-version 21)=0A= ;; (remove-hook 'same-window-buffer-names "*info*")=0A= ;; (remove-hook 'same-window-regexps "\\`\\*Customiz.*\\*\\'"))=0A= ;; (t=0A= ;; (remove-hook 'same-window-regexps = "\\*info\\*\\(\\|<[0-9]+>\\)")=0A= ;; (remove-hook 'same-window-regexps = "\\`\\*Customiz.*\\*\\'")))=0A= ;;=0A= ;; Recommended key bindings (requires library `fit-frame.el'):=0A= ;;=0A= ;; (define-key minibuffer-local-map "\C-o"=0A= ;; '1on1-fit-minibuffer-frame)=0A= ;; (define-key minibuffer-local-must-match-map "\C-o"=0A= ;; '1on1-fit-minibuffer-frame)=0A= ;; (define-key minibuffer-local-completion-map "\C-o"=0A= ;; '1on1-fit-minibuffer-frame)=0A= ;;=0A= ;;=0A= ;; Notes on user options defined here:=0A= ;; ---------------------------------=0A= ;;=0A= ;; Some user options are used here only as conveniences to define=0A= ;; frame-parameter alists. They are defined using `defvar', not=0A= ;; `defcustom', because you cannot use Customize to define them=0A= ;; independently of the alist user options they help to define. The=0A= ;; alists themselves are the variables to customize. If you want to=0A= ;; change the `defvar' variables individually and then use them to=0A= ;; set the alist variables, then use `setq', not Customize, to change=0A= ;; them, and restart Emacs for their changes to take effect.=0A= ;;=0A= ;; Changes to any user options defined here with `defcustom' will=0A= ;; take effect as soon as `1on1-emacs' is executed, so you can do=0A= ;; `M-x 1on1-emacs' to see their changes (no need to restart=0A= ;; Emacs).=0A= ;;=0A= ;; User options `1on1-color-minibuffer-frame-on-setup-increment' and=0A= ;; `1on1-color-minibuffer-frame-on-exit-increment' determine how much=0A= ;; to change the color of the minibuffer frame when the minibuffer is=0A= ;; entered and exitted. They are hue increments, and should be=0A= ;; opposite in sign. They should cancel each other out, so that the=0A= ;; color returns to what it was initially at any given=0A= ;; recursive-minibuffer depth. However, because of the way HSV and=0A= ;; RGB color-component conversion works, the best cancellation does=0A= ;; not occur when these have the same absolute value. And, how much=0A= ;; their absolute values should differ depends on that magnitude.=0A= ;; It's best to just set one of these to an increment you like, and=0A= ;; then fiddle with the other until they more or less cancel.=0A= ;;=0A= ;;=0A= ;; New functions and macros defined here (each has prefix `1on1-'):=0A= ;;=0A= ;; `box-cursor-when-idle', `change-cursor-on-input-method',=0A= ;; `change-cursor-on-overwrite/read-only',=0A= ;; `color-minibuffer-frame-on-exit',=0A= ;; `color-minibuffer-frame-on-setup',=0A= ;; `color-isearch-minibuffer-frame', `display-*Completions*-frame',=0A= ;; `display-*Help*-frame', `emacs', `fit-minibuffer-frame',=0A= ;; `flash-ding-minibuffer-frame', `increment-color-hue',=0A= ;; `minibuffer-prompt-end', `reset-minibuffer-frame',=0A= ;; `set-box-cursor-when-idle-interval', `set-cursor-type',=0A= ;; `set-minibuffer-frame-top/bottom', `set-minibuffer-frame-width',=0A= ;; `setup-minibuffer-frame-coloring',=0A= ;; `setup-mode-line'. `toggle-box-cursor-when-idle'.=0A= ;;=0A= ;; Customizable user options defined here (each has prefix `1on1-'):=0A= ;;=0A= ;; `*Completions*-frame-flag', `*Completions*-frame-at-right-flag',=0A= ;; `*Help*-frame-flag', `active-minibuffer-frame-background',=0A= ;; `active-mode-line-background',=0A= ;; `change-cursor-on-overwrite/read-only-flag',=0A= ;; `color-minibuffer-frame-on-exit-increment',=0A= ;; `color-minibuffer-frame-on-setup-increment',=0A= ;; `color-mode-line-flag', `completions-frame-background',=0A= ;; `completions-frame-mouse+cursor-color',=0A= ;; `completions-frame-width', `default-frame-alist',=0A= ;; `help-frame-background', `help-frame-mouse+cursor-color',=0A= ;; `inactive-minibuffer-frame-background',=0A= ;; `inactive-mode-line-background',=0A= ;; `isearch-minibuffer-frame-background', `minibuffer-frame-alist',=0A= ;; `minibuffer-frame-left', `minibuffer-frame-top/bottom',=0A= ;; `minibuffer-frame-width', `minibuffer-frame-width-percent',=0A= ;; `special-display-frame-alist'.=0A= ;;=0A= ;; Non-customizable user options defined here (prefix `1on1-'):=0A= ;;=0A= ;; `default-frame-background', `default-frame-cursor-color',=0A= ;; `default-frame-cursor-color-input-method',=0A= ;; `default-frame-cursor-type',=0A= ;; `default-frame-cursor-type-overwrite/read-only',=0A= ;; `default-frame-font', `default-frame-foreground',=0A= ;; `default-frame-menu-bar-lines', `default-frame-mouse-color',=0A= ;; `default-frame-size', `default-frame-upper-left-corner',=0A= ;; `default-special-frame-background',=0A= ;; `default-special-frame-cursor-color',=0A= ;; `default-special-frame-font',=0A= ;; `default-special-frame-foreground',=0A= ;; `default-special-frame-menu-bar-lines',=0A= ;; `default-special-frame-mouse-color',=0A= ;; `default-special-frame-size',=0A= ;; `default-special-frame-upper-left-corner',=0A= ;; `minibuffer-frame-background', `minibuffer-frame-cursor-color',=0A= ;; `minibuffer-frame-flag', `minibuffer-frame-font',=0A= ;; `minibuffer-frame-foreground', `minibuffer-frame-height',=0A= ;; `minibuffer-frame-mouse-color'.=0A= ;;=0A= ;; Other new variables defined here (each has prefix `1on1-'):=0A= ;;=0A= ;; `box-cursor-when-idle-p', `box-cursor-when-idle-interval',=0A= ;; `box-cursor-when-idle-timer', `last-cursor-type',=0A= ;; `minibuffer-frame'.=0A= ;;=0A= ;;=0A= ;; ***** NOTE: These EMACS PRIMITIVES have been REDEFINED HERE:=0A= ;;=0A= ;; `abort-recursive-edit', `top-level' -=0A= ;; Reset color of minibuffer frame to "inactive" color.=0A= ;;=0A= ;; `y-or-n-p' - Temporarily color minibuffer frame to "active" color.=0A= ;;=0A= ;;=0A= ;; Acknowledgements:=0A= ;;=0A= ;; The cursor-changing on input method and read-only was inspired by=0A= ;; Juri Linkov . Joe Casadonte =0A= ;; wrote a similar hook (`joc-cursor-type-set-hook'), which he got=0A= ;; from Steve Kemp...=0A= ;;=0A= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A= ;;=0A= ;;; Change log:=0A= ;;=0A= ;; 2007/12/05 dadams=0A= ;; 1on1-minibuffer-frame-left: Added :type.=0A= ;; 1on1-color-mode-line-flag, 1on1-minibuffer-frame-flag: defvar -> = defcustom.=0A= ;; 1on1-(minibuffer|(special-)default)-frame-*: Removed * doc-string = prefix.=0A= ;; 2007/11/22 dadams=0A= ;; Added: 1on1-reset-minibuffer-frame, 1on1-fit-minibuffer-frame,=0A= ;; 1on1-minibuffer-prompt-end. Recommend C-o key binding.=0A= ;; Use 1on1-reset-minibuffer-frame on minibuffer-exit-hook.=0A= ;; 2007/08/14 dadams=0A= ;; 1on1-emacs:=0A= ;; Add *Completions* to special-display-buffer-names even if=0A= ;; 1on1-*Completions*-frame-flag is nil, so minibuffer gets = focus.=0A= ;; Set w(in)32-grab-focus-on-raise to nil.=0A= ;; 1on1-display-*Completions*-frame:=0A= ;; Don't change mouse pointer unless 1on1-*Completions*-frame-flag.=0A= ;; 1on1-minibuffer-frame-background: Use std minibuffer-frame-alist = bg, if defined.=0A= ;; 2007/05/28 dadams=0A= ;; 1on1-display-*Completions*-frame:=0A= ;; Wrap zoom-frm-out in condition-case (hack for Emacs 23 problem = changing size).=0A= ;; 2007/03/10 dadams=0A= ;; Added: 1on1-completions-frame-width. Use it in 1on1-emacs.=0A= ;; 2007/02/08 dadams=0A= ;; Removed: ^L-appearance-vector.=0A= ;; 1on1-emacs: No longer change ^L appearance - use my library = pp-c-l.el to do that.=0A= ;; 2007/02/04 dadams=0A= ;; 1on1-emacs:=0A= ;; Initialize standard-display-table if nil (default is nil!). = Thx to FidelSalas.=0A= ;; 2006/12/27 dadams=0A= ;; 1on1-change-cursor-on-input-method: Respect = 1on1-change-cursor-on-input-method-flag=0A= ;; 2006/12/12 dadams=0A= ;; Added: 1on1-^L-appearance-vector.=0A= ;; 1on1-emacs: Use 1on1-^L-appearance-vector to set ^L appearance.=0A= ;; 2006/12/11 dadams=0A= ;; 1on1-set-minibuffer-frame-top/bottom: 2 chars up, not 1, to fit = Emacs 22 better.=0A= ;; 2006/10/28 dadams=0A= ;; 1on1-(in)active-minibuffer-frame-background,=0A= ;; 1on1-isearch-minibuffer-frame-background, = 1on1-(in)active-mode-line-background,=0A= ;; 1on1-(help|completions)-frame-background,=0A= ;; 1on1-(help|completions)-frame-mouse+cursor-color,=0A= ;; 1on1-default-frame-cursor-color(-input-method):=0A= ;; Changed :type to 'color for Emacs 21+.=0A= ;; 2006/09/14 dadams=0A= ;; Removed mode-line position enhancements - use new library = modeline-posn.el.=0A= ;; Removed: 1on1-color-mode-line-column-flag, = 1on1-mode-line-column-limit.=0A= ;; 2006/09/04 dadams=0A= ;; 1on1-box-cursor-when-idle-timer: Cancel beforehand, and cancel = after defining.=0A= ;; 1on1-toggle-box-cursor-when-idle:=0A= ;; Use 1on1-box-cursor-when-idle-off on pre-command-hook.=0A= ;; Don't read an event; just turn it on.=0A= ;; Added: 1on1-box-cursor-when-idle-off.=0A= ;; 2006/09/02 dadams=0A= ;; 1on1-toggle-box-cursor-when-idle: Corrected.=0A= ;; 2006/08/27 dadams=0A= ;; Added: 1on1-box-cursor-when-idle(-p|-interval|-timer), = 1on1-last-cursor-type,=0A= ;; (1on1-)toggle-box-cursor-when-idle, = 1on1-set-box-cursor-when-idle-interval.=0A= ;; 2006/08/13 dadams=0A= ;; defalias set-cursor-type to 1on1-set-cursor-type.=0A= ;; 2006/07/25 dadams=0A= ;; Added: 1on1-minibuffer-frame-left. Use in = 1on1-minibuffer-frame-alist.=0A= ;; 2006/03/31 dadams=0A= ;; 1on1-default-frame-alist:=0A= ;; Changed (left|right)-fringe code, to reflect Emacs 22 change.=0A= ;; 2006/03/17 dadams=0A= ;; Renamed:=0A= ;; 1on1-color-active-minibuffer-frame to = 1on1-color-minibuffer-frame-on-setup,=0A= ;; 1on1-color-inactive-minibuffer-frame to = 1on1-color-minibuffer-frame-on-exit.=0A= ;; 1on1-color-minibuffer-frame-on-setup:=0A= ;; Redefined so hue depends on minibuffer-depth.=0A= ;; 2006/03/14 dadams=0A= ;; 1on1-color-(in)active-minibuffer-frame: Change hue for each = minibuffer recursion.=0A= ;; Added: 1on1-increment-color-hue.=0A= ;; Require hexrgb.el=0A= ;; 2006/03/13 dadams=0A= ;; 1on1-color-inactive-minibuffer-frame:=0A= ;; Change color only when not in recursive minibuffer.=0A= ;; abort-recursive-edit: Change minibuffer color after, not before, = abort.=0A= ;; 2006/01/07 dadams=0A= ;; Added :link=0A= ;; 2005/12/14 dadams=0A= ;; Added: 1on1-*Completions*-frame-at-right-flag.=0A= ;; Use in 1on1-display-*Completions*-frame.=0A= ;; 2005/11/28 dadams=0A= ;; Added: 1on1-change-cursor-on-overwrite-flag,=0A= ;; 1on1-change-cursor-on-input-method-flag, = 1on1-default-frame-cursor-type,=0A= ;; 1on1-default-frame-cursor-type-overwrite, = 1on1-default-frame-cursor-color,=0A= ;; 1on1-default-frame-cursor-color-input-mode, = 1on1-change-cursor-on-overwrite,=0A= ;; 1on1-change-cursor-on-insert-mode, 1on1-set-cursor-type = (thanks to=0A= ;; Juri Linkov for the last three).=0A= ;; 1on1-emacs: Use 1on1-change-cursor-* in post-command-hook.=0A= ;; 1on1-mode-line-column-limit: Corrected custom group.=0A= ;; 2005/11/22 dadams=0A= ;; Added: 1on1-setup-mode-line, 1on1-mode-line-column-limit,=0A= ;; 1on1-color-mode-line(-column)-flag, = 1on1-(in)active-mode-line-background.=0A= ;; 2005/10/28 dadams=0A= ;; 1on1-display-*Completions*-frame: Zoom to smaller font.=0A= ;; 2005/07/31 dadams=0A= ;; 1on1-emacs: Do not set initial-frame-alist to default-frame-alist = (D. Reitter).=0A= ;; 2005/07/25 dadams=0A= ;; Added :prefix to defgroup.=0A= ;; 2005/07/17 dadams=0A= ;; Switched default colors for = 1on1-(in)active-minibuffer-frame-background,=0A= ;; so active is the brighter color. Change inactive to LightBlue.=0A= ;; 2005/06/01 dadams=0A= ;; Corrected typo that gave minibuffer frame a vertical scroll bar.=0A= ;; 2005/05/29 dadams=0A= ;; *-alist: Use values from standard alist variables, if available = (that is,=0A= ;; don't override user settings.)=0A= ;; 2005/05/28 dadams=0A= ;; Renamed: 1on1-separate-minibuffer-frame-flag -> = 1on1-minibuffer-frame-flag,=0A= ;; 1on1-separate-*Help*-frame-flag -> 1on1-*Help*-frame-flag,=0A= ;; 1on1-separate-*Completions*-frame-flag -> = 1on1-*Completions*-frame-flag.=0A= ;; Added: setup-minibuffer-frame-coloring.=0A= ;; Added info in doc strings about use of each variable = (restart/1on1-emacs).=0A= ;; Corrected 1on1-minibuffer-frame-alist and = 1on1-special-display-frame-alist=0A= ;; for menu-bar-lines (nil).=0A= ;; 1on1-set-minibuffer-frame-top/bottom: Rewrote with = modify-frame-parameters.=0A= ;; 1on1-emacs:=0A= ;; Make sensitive to any changes to = 1on1-*[Help|Completions]*-frame-flag.=0A= ;; Move defcustom's, defvar's, and defun's outside 1on1-emacs.=0A= ;; If 1on1-minibuffer-frame already exists, just modify it.=0A= ;; Don't step on other parameters in standard alists; just append = new values.=0A= ;; 2005/05/23 dadams=0A= ;; Changed some individual frame-parameter variables from defcustom = to defvar.=0A= ;; Left them as user options, however, so you can change them with=0A= ;; set-variable before loading oneonone.el.=0A= ;; Renamed:=0A= ;; 1on1-upper-left-frame-corner-default ->=0A= ;; 1on1-default-frame-upper-left-corner=0A= ;; 1on1-default-special-display-frame-size ->=0A= ;; 1on1-default-special-frame-size=0A= ;; 1on1-upper-left-special-display-frame-corner-default ->=0A= ;; 1on1-default-special-frame-upper-left-corner=0A= ;; Split 1on1-menu-bar-lines into: = 1on1-default-special-frame-menu-bar-lines,=0A= ;; 1on1-default-frame-menu-bar-lines=0A= ;; 2005/05/18 dadams=0A= ;; Fixed typo: "oneoneone" -> "oneonone".=0A= ;; 2005/05/17 dadams=0A= ;; Updated to work with Emacs 22.x.=0A= ;; 2005/05/09 dadams=0A= ;; Major reorganization/rewrite. Created, from previous version = setup-frames.el.=0A= ;; Added prefix "1on1-".=0A= ;; Encapsulated stuff in new command 1on1-emacs.=0A= ;; 2005/01/29 dadams=0A= ;; 1on1-default-frame-font: Fixed bug - misplaced parens, so no good = if not Windows.=0A= ;; 2005/01/19 dadams=0A= ;; Use defcustom now.=0A= ;; Removed (put ... 'variable-interactive...).=0A= ;; 1on1-minibuffer-frame-top/bottom: Must be an integer (for = set-frame-position).=0A= ;; 2004/12/18 dadams=0A= ;; Bind after-make-frame-functions to nil when create = 1on1-minibuffer-frame.=0A= ;; 2004/11/26 dadams=0A= ;; Removed ;;;###autoload's.=0A= ;; 2004/11/20 dadams=0A= ;; Refined to deal with Emacs 21 < 21.3.50 (soon to be 22.x)=0A= ;; 2004/10/01 dadams=0A= ;; Ensure loaded before compile.=0A= ;; No fringe.=0A= ;; Remove *info* and *Customiz.* buffers from `same-window-regexps'=0A= ;; 2004/09/21 dadams=0A= ;; Updated to work with Emacs 21 (and Emacs 20).=0A= ;; 2004/03/19 dadams=0A= ;; 1on1-minibuffer-frame-width -> 1on1-set-minibuffer-frame-width.=0A= ;; added 1on1-set-minibuffer-frame-top/bottom.=0A= ;; 2001/01/05 dadams=0A= ;; 1. 1on1-minibuffer-frame-width: Use 1on1-minibuffer-frame arg for = frame-char-width.=0A= ;; 2. Don't define width when initially set = 1on1-minibuffer-frame-alist. Instead,=0A= ;; use set-frame-width afterward, so 1on1-minibuffer-frame-width = uses correct=0A= ;; character size.=0A= ;; 2001/01/05 dadams=0A= ;; 1. These vars no longer user options (interactively changeable):=0A= ;; 1on1-completions-frame-background, = 1on1-completions-frame-mouse+cursor-color,=0A= ;; 1on1-help-frame-background, 1on1-help-frame-mouse+cursor-color,=0A= ;; 1on1-minibuffer-frame-cursor-color, 1on1-minibuffer-frame-font,=0A= ;; 1on1-minibuffer-frame-foreground, 1on1-minibuffer-frame-height,=0A= ;; 1on1-minibuffer-frame-mouse-color, = 1on1-minibuffer-frame-top/bottom,=0A= ;; 1on1-minibuffer-frame-width.=0A= ;; 2. Added: 1on1-minibuffer-frame-width (function),=0A= ;; 1on1-minibuffer-frame-width-percent (var).=0A= ;; 3. Changed var 1on1-minibuffer-frame-width to nil default (now = use *-percent).=0A= ;; 2000/09/27 dadams=0A= ;; 1. Added: 1on1-display-*Completions*-frame, = 1on1-display-*Help*-frame.=0A= ;; 2. *Help* & *Completions* frames not created here. Instead, use=0A= ;; special-display-buffer-names & display-*-frame fns to define = them.=0A= ;; 3. Added: top-level, abort-recursive-edit.=0A= ;; 1999/08/24 dadams=0A= ;; 1. Windows: win32-grab-focus-on-raise =3D nil.=0A= ;; 2. 1on1-default-frame-font different if Windows.=0A= ;; 3. Added: 1on1-separate-minibuffer-frame-flag, = 1on1-menu-bar-lines,=0A= ;; 1on1-upper-left-frame-corner-default, 1on1-default-frame-size,=0A= ;; 1on1-upper-left-special-display-frame-corner-default,=0A= ;; 1on1-default-special-display-frame-size, = 1on1-default-special-frame-foreground,=0A= ;; 1on1-default-special-frame-background, = 1on1-default-special-frame-font,=0A= ;; 1on1-default-special-frame-mouse-color, = 1on1-default-special-frame-cursor-color.=0A= ;; 4. Use new vars to define default-frame-alist, = special-display-frame-alist.=0A= ;; 5. Only create built-in frames if = 1on1-separate-minibuffer-frame-flag.=0A= ;; 6. Protected refs to x-* vars.=0A= ;;=0A= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A= ;;=0A= ;; This program is free software; you can redistribute it and/or modify=0A= ;; it under the terms of the GNU General Public License as published by=0A= ;; the Free Software Foundation; either version 2, or (at your option)=0A= ;; any later version.=0A= =0A= ;; This program is distributed in the hope that it will be useful,=0A= ;; but WITHOUT ANY WARRANTY; without even the implied warranty of=0A= ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the=0A= ;; GNU General Public License for more details.=0A= =0A= ;; You should have received a copy of the GNU General Public License=0A= ;; along with this program; see the file COPYING. If not, write to=0A= ;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth=0A= ;; Floor, Boston, MA 02110-1301, USA.=0A= ;;=0A= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A= ;;=0A= ;;; Code:=0A= =0A= (eval-and-compile (require 'cl)) ;; remove-if (plus, for Emacs < 20, = when, unless)=0A= =0A= (require 'frame-cmds nil t) ;; (no error if not found): rename-frame=0A= (require 'files+ nil t) ;; (no error if not found): = switch-to-buffer-other-frame=0A= (require 'zoom-frm nil t) ;; (no error if not found): zoom-frm-out=0A= (require 'hexrgb) ;; hexrgb-color-values-to-hex, hexrgb-hsv-to-rgb, = hexrgb-rgb-to-hsv=0A= =0A= =0A= ;; Ensure that this is loaded before compiling it.=0A= (provide 'oneonone)=0A= (require 'oneonone)=0A= =0A= =0A= ;; To quiet the byte compiler=0A= (unless (> emacs-major-version 21)=0A= (defvar x-pointer-box-spiral)=0A= (defvar x-pointer-xterm))=0A= =0A= ;;;;;;;;;;;;;;;;;;;;;;;;=0A= =0A= =0A= (defgroup One-On-One nil=0A= "Options to define initial frame configuration."=0A= :prefix "1on1-" :group 'frames=0A= :link `(url-link :tag "Send Bug Report"=0A= ,(concat "mailto:" "drew.adams" "@" "oracle" ".com?subject=3D\=0A= oneonone.el bug: \=0A= &body=3DDescribe bug here, starting with `emacs -q'. \=0A= Don't forget to mention your Emacs and library versions."))=0A= :link '(url-link :tag "Other Libraries by Drew"=0A= "http://www.emacswiki.org/cgi-bin/wiki/DrewsElispLibraries")=0A= :link '(url-link :tag "Download" = "http://www.emacswiki.org/cgi-bin/wiki/oneonone.el")=0A= :link '(url-link :tag "Description"=0A= "http://www.emacswiki.org/cgi-bin/wiki/OneOnOneEmacs")=0A= :link '(emacs-commentary-link :tag "Commentary" "oneonone")=0A= )=0A= =0C=0A= =0A= =0A= ;;; Minibuffer frame: ********************************=0A= ;;;=0A= (defvar 1on1-minibuffer-frame nil=0A= "Minibuffer-only frame used by One-on-One Emacs.=0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil.")=0A= =0A= (defcustom 1on1-minibuffer-frame-flag t=0A= "*Non-nil means use a separate, specialized frame for the minibuffer.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect."=0A= :type 'boolean :group 'One-On-One)=0A= =0A= (defvar 1on1-minibuffer-frame-foreground "Red"=0A= "Default foreground color for the minibuffer frame.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil.=0A= =0A= This is used only to define the standard value of=0A= `1on1-minibuffer-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= (defvar 1on1-minibuffer-frame-background=0A= (or (cdr (assq 'background-color minibuffer-frame-alist)) "LightBlue")=0A= "Initial color of the `1on1-minibuffer-frame' background.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil.=0A= =0A= This is used only to define the standard value of=0A= `1on1-minibuffer-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= (defcustom 1on1-active-minibuffer-frame-background "PaleGoldenrod"=0A= "*The color of the `1on1-minibuffer-frame' when it is active.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil."=0A= :type (if (>=3D emacs-major-version 21) 'color 'string) :group = 'One-On-One)=0A= =0A= (defcustom 1on1-inactive-minibuffer-frame-background = 1on1-minibuffer-frame-background=0A= "*The color of the `1on1-minibuffer-frame' when it is inactive.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil."=0A= :type (if (>=3D emacs-major-version 21) 'color 'string) :group = 'One-On-One)=0A= =0A= (defcustom 1on1-isearch-minibuffer-frame-background "bisque"=0A= "*Color of the `1on1-minibuffer-frame' when `isearch' is active.=0A= See `1on1-color-isearch-minibuffer-frame'.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil."=0A= :type (if (>=3D emacs-major-version 21) 'color 'string) :group = 'One-On-One)=0A= =0A= (defcustom 1on1-color-mode-line-flag t=0A= "*Non-nil means use `1on1-(in)active-mode-line-background'.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect."=0A= :type 'boolean :group 'One-On-One)=0A= =0A= (defcustom 1on1-color-minibuffer-frame-on-exit-increment 5=0A= "Increment to change minibuffer-frame hue when minibuffer is exited.=0A= This should be opposite in sign to=0A= `1on1-color-minibuffer-frame-on-setup-increment.'"=0A= :type 'integer :group 'One-On-One)=0A= =0A= (defcustom 1on1-color-minibuffer-frame-on-setup-increment -10=0A= "Increment to change minibuffer-frame hue when minibuffer is entered.=0A= This should be opposite in sign to=0A= `1on1-color-minibuffer-frame-on-exit-increment.'"=0A= :type 'integer :group 'One-On-One)=0A= =0A= (defcustom 1on1-active-mode-line-background = 1on1-active-minibuffer-frame-background=0A= "*The color of the mode-line when it is active.=0A= Note: This is not used if `1on1-color-mode-line-flag' is nil."=0A= :type (if (>=3D emacs-major-version 21) 'color 'string) :group = 'One-On-One)=0A= =0A= (defcustom 1on1-inactive-mode-line-background "LightGray"=0A= "*The color of the mode-line when it is inactive.=0A= Note: This is not used if `1on1-color-mode-line-flag' is nil."=0A= :type (if (>=3D emacs-major-version 21) 'color 'string) :group = 'One-On-One)=0A= =0A= (defvar 1on1-minibuffer-frame-font=0A= (if (eq system-type 'windows-nt)=0A= "-*-Lucida Console-normal-r-*-*-14-112-96-96-c-*-iso8859-1"=0A= ;;;;;;;"-*-Lucida Console-normal-r-*-*-15-*-*-*-c-*-*-ansi-"=0A= "-Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO8859-1")=0A= "Default font for the minibuffer frame.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil.=0A= =0A= This is used only to define the standard value of=0A= `1on1-minibuffer-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= (defvar 1on1-minibuffer-frame-mouse-color "Black"=0A= "Default mouse color for the minibuffer frame.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil.=0A= =0A= This is used only to define the standard value of=0A= `1on1-minibuffer-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= (defvar 1on1-minibuffer-frame-cursor-color "Black"=0A= "Default text cursor color for the minibuffer frame.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil.=0A= =0A= This is used only to define the standard value of=0A= `1on1-minibuffer-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= (defvar 1on1-minibuffer-frame-height 2=0A= "Height of minibuffer frame, in characters.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil.=0A= =0A= This is used only to define the standard value of=0A= `1on1-minibuffer-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= (defcustom 1on1-minibuffer-frame-left 0=0A= "*Position of left edge of minibuffer frame, in pixels.=0A= An integer. If negative, then the position is that of the frame=0A= bottom relative to the screen right (not left) edge.=0A= =0A= See `default-frame-alist' for an explanation of frame parameters.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil.=0A= =0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type 'integer :group 'One-On-One)=0A= =0A= (defcustom 1on1-minibuffer-frame-top/bottom nil=0A= "*Position of top (or bottom) of minibuffer frame, in pixels.=0A= If nil, function `1on1-set-minibuffer-frame-top/bottom' will position=0A= minibuffer at bottom of display.=0A= =0A= An integer. If negative, then the position is that of the frame=0A= bottom relative to the screen bottom.=0A= =0A= See `default-frame-alist' for an explanation of frame parameters.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil.=0A= =0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type '(choice (const :tag "Use function = `1on1-set-minibuffer-frame-top/bottom'" nil)=0A= (integer :tag "Pixels from top (>=3D 0) or bottom (< = 0)" :value 0))=0A= :group 'One-On-One)=0A= =0A= (defcustom 1on1-minibuffer-frame-width nil=0A= "Width, in characters, for minibuffer frame.=0A= If nil, then function `1on1-set-minibuffer-frame-width' is used instead.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil.=0A= =0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type '(choice (const :tag "Use function = `1on1-set-minibuffer-frame-width'" nil)=0A= (integer :tag "Width, in characters, for minibuffer = frame" :value 0))=0A= :group 'One-On-One)=0A= =0A= (defcustom 1on1-minibuffer-frame-width-percent 100=0A= "Max percent of the total display width to give to minibuffer frame.=0A= See function `1on1-set-minibuffer-frame-width'.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil.=0A= =0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type 'integer :group 'One-On-One)=0A= =0A= ;; Use values from the standard list, when available. However, we have = no way of=0A= ;; distinguishing values predefined in vanilla Emacs from user settings.=0A= (defcustom 1on1-minibuffer-frame-alist=0A= (list=0A= (or (assq 'foreground-color minibuffer-frame-alist)=0A= (cons 'foreground-color 1on1-minibuffer-frame-foreground))=0A= (or (assq 'background-color minibuffer-frame-alist)=0A= (cons 'background-color 1on1-minibuffer-frame-background))=0A= (or (assq 'font minibuffer-frame-alist)=0A= (cons 'font 1on1-minibuffer-frame-font))=0A= (or (assq 'mouse-color minibuffer-frame-alist)=0A= (cons 'mouse-color 1on1-minibuffer-frame-mouse-color))=0A= (or (assq 'cursor-color minibuffer-frame-alist)=0A= (cons 'cursor-color 1on1-minibuffer-frame-cursor-color))=0A= (or (assq 'menu-bar-lines minibuffer-frame-alist)=0A= (cons 'menu-bar-lines nil))=0A= (or (assq 'left minibuffer-frame-alist)=0A= (cons 'left 1on1-minibuffer-frame-left))=0A= (or (assq 'height minibuffer-frame-alist)=0A= (cons 'height 1on1-minibuffer-frame-height))=0A= (or (assq 'icon-type minibuffer-frame-alist)=0A= (cons 'icon-type (< emacs-major-version 21))) ; `t' for Emacs 21 = too?=0A= (or (assq 'minibuffer minibuffer-frame-alist)=0A= (cons 'minibuffer 'only))=0A= (or (assq 'user-position minibuffer-frame-alist)=0A= (cons 'user-position t))=0A= (or (assq 'vertical-scroll-bars minibuffer-frame-alist) ; No scroll = bar.=0A= (cons 'vertical-scroll-bars nil))=0A= (or (assq 'name minibuffer-frame-alist)=0A= (cons 'name "Emacs Minibuffer")))=0A= "Frame-parameter alist for the standalone minibuffer frame=0A= `1on1-minibuffer-frame'.=0A= =0A= Note: This is not used if `1on1-minibuffer-frame-flag' is nil.=0A= =0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= ;; If we didn't need Emacs 20 compatibility, this could be:=0A= ;; :type '(alist :key-type symbol :value-type sexp)=0A= :type '(repeat (cons :format "%v" (symbol :tag "Frame Parameter") = (sexp :tag "Value")))=0A= :group 'One-On-One)=0A= =0C=0A= =0A= =0A= ;;; *Help* frame: ********************************=0A= ;;; Display of *Help* buffer in custom frame.=0A= ;;; Background, height, cursor and pointer colors.=0A= ;;;=0A= (defcustom 1on1-*Help*-frame-flag t=0A= "*Non-nil means use a special appearance for the *Help* frame.=0A= =0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type 'boolean :group 'One-On-One)=0A= =0A= (defcustom 1on1-help-frame-background "Thistle"=0A= "Default background color for the *Help* buffer's frame.=0A= =0A= Note: This is not used if `1on1-*Help*-frame-flag' is nil.=0A= =0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type (if (>=3D emacs-major-version 21) 'color 'string) :group = 'One-On-One)=0A= =0A= (defcustom 1on1-help-frame-mouse+cursor-color "Blue Violet"=0A= "Default color for cursor & pointer of *Help* frame.=0A= =0A= Note: This is not used if `1on1-*Help*-frame-flag' is nil.=0A= =0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type (if (>=3D emacs-major-version 21) 'color 'string) :group = 'One-On-One)=0A= =0C=0A= =0A= =0A= ;;; *Completions* frame: ********************************=0A= ;;; Display of *Completion* buffer in custom frame.=0A= ;;; Background, height, cursor and pointer colors.=0A= ;;;=0A= (defcustom 1on1-*Completions*-frame-flag t=0A= "*Non-nil means use a special appearance for the *Completions* frame.=0A= =0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type 'boolean :group 'One-On-One)=0A= =0A= (defcustom 1on1-*Completions*-frame-at-right-flag nil=0A= "*Non-nil means place *Completions* frame at right edge of display.=0A= This can be useful to make *Completions* more visible.=0A= This has no effect if `1on1-*Completions*-frame-flag' is nil."=0A= :type 'boolean :group 'One-On-One)=0A= =0A= (defcustom 1on1-completions-frame-background "LavenderBlush2"=0A= "Default background color for the *Completions* buffer's frame.=0A= =0A= Note: This is not used if `1on1-*Completions*-frame-flag' is nil.=0A= =0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type (if (>=3D emacs-major-version 21) 'color 'string) :group = 'One-On-One)=0A= =0A= (defcustom 1on1-completions-frame-mouse+cursor-color "VioletRed"=0A= "Default color for cursor & pointer of *Completions* frame.=0A= =0A= Note: This is not used if `1on1-*Completions*-frame-flag' is nil.=0A= =0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type (if (>=3D emacs-major-version 21) 'color 'string) :group = 'One-On-One)=0A= =0A= (defcustom 1on1-completions-frame-width 100=0A= "Width, in characters, for *Completions* frame.=0A= If this is nil, then the pertinent default frame width is used.=0A= =0A= Note: This is not used if `1on1-*Completions*-frame-flag' is nil.=0A= =0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type 'integer :group 'One-On-One)=0A= =0C=0A= =0A= =0A= ;;; Default for normal frames: `1on1-default-frame-alist' = **************************=0A= ;;;=0A= (defvar 1on1-default-frame-foreground "Black"=0A= "Default foreground color for non-special frames.=0A= This is used only to define the standard value of=0A= `1on1-default-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= (defvar 1on1-default-frame-background "LightBlue"=0A= "Default background color for non-special frames.=0A= This is used only to define the standard value of=0A= `1on1-default-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= (defvar 1on1-default-frame-font=0A= (if (eq system-type 'windows-nt)=0A= "-*-Lucida Console-normal-r-*-*-14-112-96-96-c-*-iso8859-1"=0A= ;;;;;;"-*-Lucida Console-normal-r-*-*-15-*-*-*-c-*-*-ansi-"=0A= "-Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO8859-1")=0A= "Default font for non-special frames.=0A= This is used only to define the standard value of=0A= `1on1-default-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= (defvar 1on1-default-frame-mouse-color "Red"=0A= "Default mouse-pointer color for non-special frames.=0A= This is used only to define the standard value of=0A= `1on1-default-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= (defcustom 1on1-change-cursor-on-input-method-flag t=0A= "*Non-nil means to use a different cursor when using an input method.=0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type 'boolean :group 'One-On-One)=0A= =0A= (defcustom 1on1-default-frame-cursor-color "Red"=0A= "*Default text cursor color for non-special frames.=0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect. Furthermore, if=0A= `1on1-change-cursor-on-input-method-flag' is nil when you rerun=0A= `1on1-emacs', you will need to toggle that variable to non-nil (and=0A= back to nil, if that's the value you want). Otherwise, the new value=0A= will take effect only after you restart Emacs."=0A= :type (if (>=3D emacs-major-version 21) 'color 'string) :group = 'One-On-One)=0A= =0A= (defcustom 1on1-default-frame-cursor-color-input-method "Orange"=0A= "*Default cursor color for non-special frames if using an input method.=0A= This has no effect if `1on1-change-cursor-on-input-method-flag' is nil.=0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type (if (>=3D emacs-major-version 21) 'color 'string) :group = 'One-On-One)=0A= =0A= (defcustom 1on1-change-cursor-on-overwrite/read-only-flag t=0A= "*Non-nil means use a different cursor when overwrite mode or = read-only.=0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= :type 'boolean :group 'One-On-One)=0A= =0A= (defcustom 1on1-default-frame-cursor-type 'bar=0A= "*Default text cursor type for non-special frames.=0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect. Furthermore, if=0A= `1on1-change-cursor-on-overwrite/read-only-flag' is nil when you rerun=0A= `1on1-emacs', you will need to toggle that variable to non-nil (and=0A= back to nil, if that's the value you want). Otherwise, the new value=0A= will take effect only after you restart Emacs."=0A= :type 'symbol :group 'One-On-One)=0A= =0A= (defvar 1on1-last-cursor-type 1on1-default-frame-cursor-type "Saved last = cursor type.")=0A= =0A= (defcustom 1on1-default-frame-cursor-type-overwrite/read-only 'box=0A= "*Default text cursor type for overwrite mode or read-only buffer.=0A= This applies only to non-special frames. This has no effect if=0A= `1on1-change-cursor-on-overwrite/read-only-flag' is nil. If you=0A= customize this variable, you will need to rerun `1on1-emacs' for the=0A= new value to take effect."=0A= :type 'symbol :group 'One-On-One)=0A= =0A= (defvar 1on1-box-cursor-when-idle-p t=0A= "Non-nil means to use a box cursor whenever Emacs is idle.=0A= Do NOT change this yourself; instead, use = `\\[toggle-box-cursor-when-idle]'.")=0A= =0A= (defvar 1on1-box-cursor-when-idle-interval 2=0A= "Number of seconds to wait before changing cursor type to box.=0A= Do NOT change this yourself to change the wait period; instead, use=0A= `\\[1on1-set-box-cursor-when-idle-interval]'.")=0A= =0A= (defvar 1on1-box-cursor-when-idle-timer=0A= (progn ; Cancel to prevent duplication.=0A= (when (boundp '1on1-box-cursor-when-idle-timer)=0A= (cancel-timer 1on1-box-cursor-when-idle-timer))=0A= (run-with-idle-timer 1on1-box-cursor-when-idle-interval t = '1on1-box-cursor-when-idle))=0A= "Timer used to change the cursor to a box cursor when Emacs is idle.")=0A= =0A= ;; Turn it off, by default. You must use `toggle-box-cursor-when-idle' = to turn it on.=0A= (cancel-timer 1on1-box-cursor-when-idle-timer)=0A= =0A= (defvar 1on1-default-frame-menu-bar-lines 1=0A= "Number of lines used for the menu bar in non-special frames.=0A= This is used only to define the standard value of=0A= `1on1-default-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= (defvar 1on1-default-frame-upper-left-corner '(0 . 0)=0A= "Position of upper left frame corner.=0A= A cons whose car is the distance from the top in pixels=0A= and whose cdr is the distance from the left in pixels.=0A= =0A= This is used only to define the standard value of=0A= `1on1-default-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= (defvar 1on1-default-frame-size '(80 . 35)=0A= "Default frame size.=0A= A cons whose car is the frame width in pixels=0A= and whose cdr is the frame height in pixels.=0A= =0A= This is used only to define the standard value of=0A= `1on1-default-frame-alist'. Customize that variable, not this one.=0A= If you change this variable, you will need to restart Emacs for it to=0A= take effect.")=0A= =0A= ;; Use values from the standard list, when available. However, we have = no way of=0A= ;; distinguishing values predefined in vanilla Emacs from user settings.=0A= (defcustom 1on1-default-frame-alist=0A= (list=0A= (or (assq 'foreground-color default-frame-alist)=0A= (cons 'foreground-color 1on1-default-frame-foreground))=0A= (or (assq 'background-color default-frame-alist)=0A= (cons 'background-color 1on1-default-frame-background))=0A= (or (assq 'font default-frame-alist)=0A= (cons 'font 1on1-default-frame-font))=0A= (or (assq 'mouse-color default-frame-alist)=0A= (cons 'mouse-color 1on1-default-frame-mouse-color))=0A= (or (assq 'cursor-color default-frame-alist)=0A= (cons 'cursor-color 1on1-default-frame-cursor-color))=0A= (or (assq 'cursor-type default-frame-alist)=0A= (cons 'cursor-type 1on1-default-frame-cursor-type))=0A= (or (assq 'menu-bar-lines default-frame-alist)=0A= (cons 'menu-bar-lines 1on1-default-frame-menu-bar-lines))=0A= (or (assq 'top default-frame-alist)=0A= (cons 'top (car 1on1-default-frame-upper-left-corner)))=0A= (or (assq 'left default-frame-alist)=0A= (cons 'left (cdr 1on1-default-frame-upper-left-corner)))=0A= (or (assq 'width default-frame-alist)=0A= (cons 'width (car 1on1-default-frame-size)))=0A= (or (assq 'height default-frame-alist)=0A= (cons 'height (cdr 1on1-default-frame-size)))=0A= (or (assq 'minibuffer default-frame-alist)=0A= (cons 'minibuffer (not 1on1-minibuffer-frame-flag)))=0A= (or (assq 'user-position default-frame-alist)=0A= (cons 'user-position t))=0A= (or (assq 'vertical-scroll-bars default-frame-alist)=0A= (cons 'vertical-scroll-bars 'right))=0A= (or (assq 'icon-type default-frame-alist)=0A= (cons 'icon-type (< emacs-major-version 21))) ; `t' for Emacs 21 = too?=0A= (or (assq 'tool-bar-lines default-frame-alist)=0A= (cons 'tool-bar-lines 1)) ; Emacs 21+=0A= (if (cdr (assq 'left-fringe default-frame-alist))=0A= (assq 'left-fringe default-frame-alist)=0A= (cons 'left-fringe 0)) ; Emacs 21+=0A= (if (cdr (assq 'right-fringe default-frame-alist))=0A= (assq 'right-fringe default-frame-alist)=0A= (cons 'right-fringe 0)) ; Emacs 21+=0A= (or (assq 'fringe default-frame-alist)=0A= (cons 'fringe 0))) ; Emacs 21, but not 21.3.50 - = REMOVE after 22.x=0A= "Properties to be used for One-on-One Emacs `default-frame-alist'.=0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= ;; If we didn't need Emacs 20 compatibility, this could be:=0A= ;; :type '(alist :key-type symbol :value-type sexp)=0A= :type '(repeat (cons :format "%v" (symbol :tag "Frame Parameter") = (sexp :tag "Value")))=0A= :group 'One-On-One)=0A= =0C=0A= =0A= =0A= ;;; Special-display frames: `1on1-special-display-frame-alist' = ************************=0A= ;;;=0A= (defvar 1on1-default-special-frame-foreground "Black"=0A= "Default foreground color for special display frames.=0A= =0A= This is used only to define the standard value of=0A= `1on1-special-display-frame-alist'. Customize that variable, not this=0A= one. If you change this variable, you will need to restart Emacs for=0A= it to take effect.")=0A= =0A= (defvar 1on1-default-special-frame-background "LightSteelBlue"=0A= "Default background color for special display frames.=0A= =0A= This is used only to define the standard value of=0A= `1on1-special-display-frame-alist'. Customize that variable, not this=0A= one. If you change this variable, you will need to restart Emacs for=0A= it to take effect.")=0A= =0A= (defvar 1on1-default-special-frame-font=0A= (if (eq system-type 'windows-nt)=0A= "-*-Lucida Console-normal-r-*-*-14-112-96-96-c-*-iso8859-1"=0A= ;;;;;;;;"-*-Lucida Console-normal-r-*-*-15-*-*-*-c-*-*-ansi-"=0A= "-Misc-Fixed-Medium-R-Normal--15-140-75-75-C-90-ISO8859-1")=0A= "Default font for special display frames.=0A= =0A= This is used only to define the standard value of=0A= `1on1-special-display-frame-alist'. Customize that variable, not this=0A= one. If you change this variable, you will need to restart Emacs for=0A= it to take effect.")=0A= =0A= (defvar 1on1-default-special-frame-mouse-color "Yellow"=0A= "Default mouse color for special display frames.=0A= =0A= This is used only to define the standard value of=0A= `1on1-special-display-frame-alist'. Customize that variable, not this=0A= one. If you change this variable, you will need to restart Emacs for=0A= it to take effect.")=0A= =0A= (defvar 1on1-default-special-frame-cursor-color "Yellow"=0A= "Default text cursor color for special display frames.=0A= =0A= This is used only to define the standard value of=0A= `1on1-special-display-frame-alist'. Customize that variable, not this=0A= one. If you change this variable, you will need to restart Emacs for=0A= it to take effect.")=0A= =0A= (defvar 1on1-default-special-frame-menu-bar-lines 1=0A= "Number of lines used for the menu bar of special display frames.=0A= =0A= This is used only to define the standard value of=0A= `1on1-special-display-frame-alist'. Customize that variable, not this=0A= one. If you change this variable, you will need to restart Emacs for=0A= it to take effect.")=0A= =0A= (defvar 1on1-default-special-frame-upper-left-corner '(0 . 0)=0A= "Position of upper left corner of special display frames.=0A= A cons whose car is the distance from the top in pixels=0A= and whose cdr is the distance from the left in pixels.=0A= =0A= This is used only to define the standard value of=0A= `1on1-special-display-frame-alist'. Customize that variable, not this=0A= one. If you change this variable, you will need to restart Emacs for=0A= it to take effect.")=0A= =0A= (defvar 1on1-default-special-frame-size '(80 . 20)=0A= "Default size of special display frames.=0A= A cons whose car is the frame width in pixels=0A= and whose cdr is the frame height in pixels.=0A= =0A= This is used only to define the standard value of=0A= `1on1-special-display-frame-alist'. Customize that variable, not this=0A= one. If you change this variable, you will need to restart Emacs for=0A= it to take effect.")=0A= =0A= ;; Use values from the standard list, when available. However, we have = no way of=0A= ;; distinguishing values predefined in vanilla Emacs from user settings.=0A= (defcustom 1on1-special-display-frame-alist=0A= (list=0A= (or (assq 'font special-display-frame-alist)=0A= (cons 'font 1on1-default-special-frame-font))=0A= (or (assq 'width special-display-frame-alist)=0A= (cons 'width (car 1on1-default-special-frame-size)))=0A= (or (assq 'height special-display-frame-alist)=0A= (cons 'height (cdr 1on1-default-special-frame-size)))=0A= (or (assq 'mouse-color special-display-frame-alist)=0A= (cons 'mouse-color 1on1-default-special-frame-mouse-color))=0A= (or (assq 'cursor-color special-display-frame-alist)=0A= (cons 'cursor-color 1on1-default-special-frame-cursor-color))=0A= (or (assq 'menu-bar-lines special-display-frame-alist)=0A= (cons 'menu-bar-lines 1on1-default-special-frame-menu-bar-lines))=0A= (or (assq 'foreground-color special-display-frame-alist)=0A= (cons 'foreground-color 1on1-default-special-frame-foreground))=0A= (or (assq 'background-color special-display-frame-alist)=0A= (cons 'background-color 1on1-default-special-frame-background))=0A= (or (assq 'top special-display-frame-alist)=0A= (cons 'top (car 1on1-default-special-frame-upper-left-corner)))=0A= (or (assq 'left special-display-frame-alist)=0A= (cons 'left (cdr 1on1-default-special-frame-upper-left-corner)))=0A= (or (assq 'unsplittable special-display-frame-alist)=0A= (cons 'unsplittable t))=0A= (or (assq 'user-position special-display-frame-alist)=0A= (cons 'user-position t))=0A= (or (assq 'vertical-scroll-bars special-display-frame-alist)=0A= (cons 'vertical-scroll-bars 'right)))=0A= "Properties to be used for One-on-One `special-display-frame-alist'.=0A= If you customize this variable, you will need to rerun `1on1-emacs'=0A= for the new value to take effect."=0A= ;; If we didn't need Emacs 20 compatibility, this could be:=0A= ;; :type '(alist :key-type symbol :value-type sexp)=0A= :type '(repeat (cons :format "%v" (symbol :tag "Frame Parameter") = (sexp :tag "Value")))=0A= :group 'One-On-One)=0A= =0C=0A= =0A= =0A= ;;; Main command ***************************************=0A= ;;;=0A= ;;;###autoload=0A= (defun 1on1-emacs ()=0A= "One-on-One Emacs setup.=0A= Use `1on1-default-frame-alist' and `1on1-special-display-frame-alist'.=0A= =0A= If `1on1-minibuffer-frame-flag' is non-nil, then create=0A= minibuffer-only frame, `1on1-minibuffer-frame', using=0A= `1on1-minibuffer-frame-alist'.=0A= =0A= If `1on1-separate-minibuffer-*Help*-flag' is non-nil, then use=0A= special frame for *Help* buffer.=0A= =0A= If `1on1-separate-minibuffer-*Completions*-flag' is non-nil, then=0A= use special frame for *Completions* buffer."=0A= (interactive)=0A= (setq default-frame-alist (append 1on1-default-frame-alist = default-frame-alist)=0A= special-display-frame-alist (append = 1on1-special-display-frame-alist=0A= special-display-frame-alist))=0A= =0A= ;; *Help* frame=0A= (if 1on1-*Help*-frame-flag=0A= (add-to-list=0A= 'special-display-buffer-names=0A= (list "*Help*" '1on1-display-*Help*-frame=0A= (list (cons 'background-color 1on1-help-frame-background)=0A= (cons 'mouse-color 1on1-help-frame-mouse+cursor-color)=0A= (cons 'cursor-color = 1on1-help-frame-mouse+cursor-color)=0A= '(height . 40))))=0A= (setq special-display-buffer-names=0A= (remove-if (lambda (elt) (equal "*Help*" (car elt)))=0A= special-display-buffer-names)))=0A= =0A= ;; *Completions* frame=0A= ;; If `1on1-minibuffer-frame-flag' is non-nil, then *Completions* = frame must be treated=0A= ;; specially, so that it gets focus from the minibuffer frame. This = is so, even if=0A= ;; `1on1-*Completions*-frame-flag' is nil.=0A= (if 1on1-minibuffer-frame-flag=0A= (if 1on1-*Completions*-frame-flag=0A= (add-to-list=0A= 'special-display-buffer-names=0A= `("*Completions*" 1on1-display-*Completions*-frame=0A= ((background-color ,@1on1-completions-frame-background)=0A= (mouse-color = ,@1on1-completions-frame-mouse+cursor-color)=0A= (cursor-color = ,@1on1-completions-frame-mouse+cursor-color)=0A= ,@(and 1on1-completions-frame-width=0A= `((width ,@1on1-completions-frame-width))))))=0A= (add-to-list 'special-display-buffer-names=0A= `("*Completions*" = 1on1-display-*Completions*-frame)))=0A= (setq special-display-buffer-names=0A= (remove-if (lambda (elt) (equal "*Completions*" (car elt)))=0A= special-display-buffer-names)))=0A= =0A= ;; Minibuffer frame=0A= (when 1on1-minibuffer-frame-flag=0A= ;; `display-buffer' (& `*-other-window' fns) will use separate = frames.=0A= (setq pop-up-frames t=0A= pop-up-frame-alist (append default-frame-alist = pop-up-frame-alist))=0A= =0A= ;; Set up `1on1-minibuffer-frame'.=0A= (setq minibuffer-frame-alist (append 1on1-minibuffer-frame-alist=0A= minibuffer-frame-alist))=0A= (if 1on1-minibuffer-frame=0A= (modify-frame-parameters 1on1-minibuffer-frame = 1on1-minibuffer-frame-alist)=0A= (setq 1on1-minibuffer-frame=0A= (let ((after-make-frame-functions nil)) ; E.g. inhibit = `fit-frame'.=0A= (make-frame 1on1-minibuffer-frame-alist))))=0A= =0A= ;; Resize and reposition it. If variable = `1on1-minibuffer-frame-width'=0A= ;; or `1on1-minibuffer-frame-top/bottom' is nil, calculate = automatically.=0A= (1on1-set-minibuffer-frame-width)=0A= (1on1-set-minibuffer-frame-top/bottom)=0A= =0A= ;; Rename minibuffer frame. (`rename-frame' is defined in = `frame-cmds.el'.)=0A= (when (fboundp 'rename-frame)=0A= (rename-frame 1on1-minibuffer-frame "Emacs minibuffer = \=0A= show/hide: hold CTRL + click in window"))=0A= (setq minibuffer-auto-raise t)=0A= ;; Background colors of minibuffer frame: 3 states=0A= (add-hook 'isearch-mode-hook '1on1-color-isearch-minibuffer-frame)=0A= (add-hook 'isearch-mode-end-hook = '1on1-color-minibuffer-frame-on-exit)=0A= (add-hook 'minibuffer-setup-hook = '1on1-color-minibuffer-frame-on-setup)=0A= (add-hook 'minibuffer-exit-hook '1on1-color-minibuffer-frame-on-exit)=0A= ;; Redefine built-in fns so they color minibuffer frame.=0A= (1on1-setup-minibuffer-frame-coloring))=0A= =0A= ;; Hooks.=0A= (if 1on1-change-cursor-on-overwrite/read-only-flag=0A= (add-hook 'post-command-hook = '1on1-change-cursor-on-overwrite/read-only)=0A= (1on1-set-cursor-type 1on1-default-frame-cursor-type)=0A= (remove-hook 'post-command-hook = '1on1-change-cursor-on-overwrite/read-only))=0A= (if 1on1-change-cursor-on-input-method-flag=0A= (add-hook 'post-command-hook '1on1-change-cursor-on-input-method)=0A= (setq current-input-method nil)=0A= (1on1-change-cursor-on-input-method)=0A= (remove-hook 'post-command-hook '1on1-change-cursor-on-input-method))=0A= (add-hook 'minibuffer-exit-hook '1on1-reset-minibuffer-frame)=0A= =0A= (setq w32-grab-focus-on-raise nil=0A= win32-grab-focus-on-raise nil) ; older name=0A= (1on1-setup-mode-line))=0A= =0A= ;; This is inspired by code from Juri Linkov .=0A= (defun 1on1-change-cursor-on-input-method ()=0A= "Set cursor type depending on whether an input method is used or not."=0A= (when 1on1-change-cursor-on-input-method-flag=0A= (set-cursor-color=0A= (if current-input-method=0A= 1on1-default-frame-cursor-color-input-method=0A= (let ((bufname (buffer-name (current-buffer))))=0A= (cond=0A= ((string=3D "*Help*" bufname) = 1on1-help-frame-mouse+cursor-color)=0A= ((string=3D "*Completions*" bufname) = 1on1-completions-frame-mouse+cursor-color)=0A= ((eq 1on1-minibuffer-frame (selected-frame))=0A= 1on1-minibuffer-frame-cursor-color)=0A= ((special-display-p bufname) = 1on1-default-special-frame-cursor-color)=0A= (t 1on1-default-frame-cursor-color)))))))=0A= =0A= ;; This is from Juri Linkov , with read-only added.=0A= (defun 1on1-change-cursor-on-overwrite/read-only ()=0A= "Set cursor type differently for overwrite mode and read-only buffer.=0A= That is, use one cursor type for overwrite mode and read-only buffers,=0A= and another cursor type otherwise."=0A= (1on1-set-cursor-type (if (or buffer-read-only overwrite-mode)=0A= = 1on1-default-frame-cursor-type-overwrite/read-only=0A= 1on1-default-frame-cursor-type)))=0A= =0A= (unless (fboundp 'set-cursor-type) (defalias 'set-cursor-type = '1on1-set-cursor-type))=0A= ;; This is essentially from Juri Linkov .=0A= (defun 1on1-set-cursor-type (cursor-type)=0A= "Set the cursor type of the selected frame to CURSOR-TYPE.=0A= When called interactively, prompt for the type to use.=0A= To get the frame's current cursor type, use `frame-parameters'."=0A= (interactive=0A= (list (intern (completing-read "Cursor type: "=0A= (mapcar 'list '("box" "hollow" "bar" = "hbar" nil))))))=0A= (modify-frame-parameters (selected-frame) (list (cons 'cursor-type = cursor-type))))=0A= =0A= (defun 1on1-box-cursor-when-idle ()=0A= "Change the cursor to a box cursor when Emacs is idle."=0A= (let ((type (cdr (assoc 'cursor-type (frame-parameters)))))=0A= (unless (eq type 'box)=0A= (setq 1on1-last-cursor-type type)=0A= (1on1-set-cursor-type 'box)))) =0A= =0A= (defun 1on1-box-cursor-when-idle-off ()=0A= "Turn off changing the cursor to a box cursor when Emacs is idle."=0A= (when 1on1-last-cursor-type (1on1-set-cursor-type = 1on1-last-cursor-type)))=0A= =0A= (defalias 'toggle-box-cursor-when-idle '1on1-toggle-box-cursor-when-idle)=0A= (defun 1on1-toggle-box-cursor-when-idle (&optional arg)=0A= "Turn on or off automatically changing to a box cursor when idle.=0A= When on, the cursor is changed to a box whenever Emacs is idle.=0A= With prefix argument, turn on if ARG > 0; else turn off."=0A= (interactive "P")=0A= (setq 1on1-box-cursor-when-idle-p=0A= (if arg (> (prefix-numeric-value arg) 0) (not = 1on1-box-cursor-when-idle-p)))=0A= (cond (1on1-box-cursor-when-idle-p=0A= (timer-activate-when-idle 1on1-box-cursor-when-idle-timer)=0A= (add-hook 'pre-command-hook '1on1-box-cursor-when-idle-off)=0A= (message "Turned ON making cursor a box when Emacs is idle."))=0A= (t=0A= (cancel-timer 1on1-box-cursor-when-idle-timer)=0A= (remove-hook 'pre-command-hook '1on1-box-cursor-when-idle-off)=0A= (message "Turned OFF making cursor a box when Emacs is = idle."))))=0A= =0A= (defun 1on1-set-box-cursor-when-idle-interval (secs)=0A= "Set wait until automatically change to a box cursor when Emacs is = idle.=0A= Whenever Emacs is idle for this many seconds it will change the cursor=0A= to a box.=0A= =0A= To turn on or off automatically changing to a box cursor when idle,=0A= use `\\[toggle-box-cursor-when-idle]."=0A= (interactive=0A= "nSeconds to idle, before changing to a box cursor: ")=0A= (timer-set-idle-time 1on1-box-cursor-when-idle-timer=0A= (setq 1on1-box-cursor-when-idle-interval secs)=0A= t))=0A= =0A= (defun 1on1-display-*Help*-frame (buf &optional args)=0A= "Display *Help* buffer in its own frame.=0A= `special-display-function' is used to do the actual displaying.=0A= BUF and ARGS are the arguments to `special-display-function'."=0A= (let ((old-ptr-shape x-pointer-shape)=0A= return-window)=0A= (when (boundp 'x-pointer-xterm)=0A= (setq x-pointer-shape x-pointer-xterm))=0A= (setq return-window (select-window (funcall special-display-function = buf args)))=0A= (raise-frame)=0A= (setq x-pointer-shape old-ptr-shape)=0A= return-window))=0A= =0A= (defun 1on1-display-*Completions*-frame (buf &optional args)=0A= "Display *Completions* buffer in its own frame.=0A= `special-display-function' is used to do the actual displaying.=0A= Completion input events are redirected to `1on1-minibuffer-frame'.=0A= BUF and ARGS are the arguments to `special-display-function'."=0A= (let ((old-ptr-shape x-pointer-shape)=0A= return-window)=0A= (when (and 1on1-*Completions*-frame-flag (boundp = 'x-pointer-box-spiral))=0A= (setq x-pointer-shape x-pointer-box-spiral))=0A= (setq return-window (select-window (funcall special-display-function = buf args)))=0A= (when (fboundp 'zoom-frm-out)=0A= (condition-case nil (progn (zoom-frm-out) (zoom-frm-out)) ; In = `zoom-frm.el'.=0A= (error nil)))=0A= =0A= ;; We reposition frame this way, instead of binding = `special-display-frame-alist'=0A= ;; with this value, because `after-make-frame-functions' might = resize frame.=0A= (when 1on1-*Completions*-frame-at-right-flag=0A= (modify-frame-parameters=0A= (selected-frame) ; Hard-code 7 here - what does = it depend on?=0A= `((left . ,(- (x-display-pixel-width) (+ (frame-pixel-width) = 7))))))=0A= (raise-frame)=0A= (when (boundp '1on1-minibuffer-frame)=0A= (redirect-frame-focus (selected-frame) 1on1-minibuffer-frame))=0A= (when (and 1on1-*Completions*-frame-flag (boundp = 'x-pointer-box-spiral))=0A= (setq x-pointer-shape old-ptr-shape))=0A= return-window))=0A= =0A= (defun 1on1-set-minibuffer-frame-top/bottom ()=0A= "Set position of minibuffer frame.=0A= Use `1on1-minibuffer-frame-top/bottom' if non-nil.=0A= Else, place minibuffer at bottom of display."=0A= (when (boundp '1on1-minibuffer-frame)=0A= (modify-frame-parameters=0A= 1on1-minibuffer-frame=0A= `((top ,@ (or 1on1-minibuffer-frame-top/bottom=0A= (- (* 2 (frame-char-height = 1on1-minibuffer-frame)))))))))=0A= =0A= (defun 1on1-set-minibuffer-frame-width ()=0A= "Set width of minibuffer frame, in characters.=0A= Use `1on1-minibuffer-frame-width' if not nil.=0A= Else, set width relative to character size of `1on1-minibuffer-frame'=0A= and display size, and depending on=0A= `1on1-minibuffer-frame-width-percent':=0A= =0A= (/ (* 1on1-minibuffer-frame-width-percent (x-display-pixel-width))=0A= (* 100 (frame-char-width 1on1-minibuffer-frame)))"=0A= (when (boundp '1on1-minibuffer-frame)=0A= (set-frame-width=0A= 1on1-minibuffer-frame=0A= (or 1on1-minibuffer-frame-width=0A= (/ (* 1on1-minibuffer-frame-width-percent = (x-display-pixel-width))=0A= (* 100 (frame-char-width 1on1-minibuffer-frame)))))))=0A= =0A= (defun 1on1-color-minibuffer-frame-on-setup ()=0A= "Change background of minibuffer frame to reflect the minibuffer depth.=0A= Use this when increasing the minibuffer recursion depth."=0A= (when (boundp '1on1-minibuffer-frame)=0A= (save-window-excursion=0A= (select-frame 1on1-minibuffer-frame)=0A= (set-background-color 1on1-active-minibuffer-frame-background)=0A= (let ((count (minibuffer-depth)))=0A= (while (> count 1)=0A= (set-background-color (1on1-increment-color-hue ; Change bg = hue slightly.=0A= (frame-parameter nil 'background-color)=0A= = 1on1-color-minibuffer-frame-on-setup-increment))=0A= (setq count (1- count)))))))=0A= =0A= (defun 1on1-color-minibuffer-frame-on-exit ()=0A= "Change background of minibuffer frame to reflect the minibuffer depth.=0A= Use this when reducing the minibuffer recursion depth."=0A= (when (boundp '1on1-minibuffer-frame)=0A= (save-window-excursion=0A= (select-frame 1on1-minibuffer-frame)=0A= (if (< (minibuffer-depth) 2)=0A= (set-background-color = 1on1-inactive-minibuffer-frame-background)=0A= (set-background-color (1on1-increment-color-hue ; Change bg hue = slightly.=0A= (frame-parameter nil 'background-color)=0A= = 1on1-color-minibuffer-frame-on-exit-increment))))))=0A= =0A= ;; This is essentially a version of `doremi-increment-color-component' = for hue only.=0A= (defun 1on1-increment-color-hue (color increment)=0A= "Increase hue component of COLOR by INCREMENT."=0A= (unless (string-match "#" color) ; Convert color name to #hhh...=0A= (setq color (hexrgb-color-values-to-hex (x-color-values color))))=0A= ;; Convert RGB to HSV=0A= (let* ((rgb (x-color-values color))=0A= (red (/ (float (nth 0 rgb)) 65535.0)) ; Convert from 0-65535 = to 0.0-1.0=0A= (green (/ (float (nth 1 rgb)) 65535.0))=0A= (blue (/ (float (nth 2 rgb)) 65535.0))=0A= (hsv (hexrgb-rgb-to-hsv red green blue))=0A= (hue (nth 0 hsv))=0A= (saturation (nth 1 hsv))=0A= (value (nth 2 hsv)))=0A= (setq hue (+ hue (/ increment 100.0)))=0A= (when (> hue 1.0) (setq hue (1- hue)))=0A= (hexrgb-color-values-to-hex (mapcar (lambda (x) (floor (* x = 65535.0)))=0A= (hexrgb-hsv-to-rgb hue = saturation value)))))=0A= =0A= (defun 1on1-color-isearch-minibuffer-frame ()=0A= "Use `1on1-isearch-minibuffer-frame-background' for minibuffer."=0A= (and (boundp '1on1-minibuffer-frame)=0A= (save-window-excursion=0A= (select-frame 1on1-minibuffer-frame)=0A= (set-background-color=0A= ;; Can also try `x-defined-colors', defined in `x-win.el'.=0A= ;; It contains all colors currently supported by X windows.=0A= (if (x-color-defined-p = 1on1-isearch-minibuffer-frame-background)=0A= 1on1-isearch-minibuffer-frame-background=0A= "white")))))=0A= =0A= (defun 1on1-flash-ding-minibuffer-frame (&optional do-not-terminate)=0A= "Ring bell (`ding'), after flashing minibuffer frame, if relevant.=0A= Terminates any keyboard macro executing, unless arg DO-NOT-TERMINATE = non-nil."=0A= (flash-ding do-not-terminate (and (boundp '1on1-minibuffer-frame)=0A= 1on1-minibuffer-frame)))=0A= =0A= (defun 1on1-setup-minibuffer-frame-coloring ()=0A= "Redefine some built-in functions so they color the minibuffer frame.=0A= Functions redefined: `y-or-n-p', `top-level', `abort-recursive-exit'."=0A= =0A= (or (fboundp 'old-y-or-n-p)=0A= (fset 'old-y-or-n-p (symbol-function 'y-or-n-p)))=0A= =0A= ;; REPLACES ORIGINAL (built-in function):=0A= ;; Temporarily colors minibuffer frame to "active" color.=0A= ;;=0A= (defun y-or-n-p (prompt)=0A= "Ask user a \"y or n\" question. Return t if answer is \"y\".=0A= Takes one argument, which is the string to display to ask the question.=0A= It should end in a space; `y-or-n-p' adds `(y or n) ' to it.=0A= No confirmation of answer is requested; a single character is enough.=0A= Also accepts SPC to mean yes, or DEL to mean no."=0A= (1on1-color-minibuffer-frame-on-setup)=0A= (prog1 (old-y-or-n-p prompt) (1on1-color-minibuffer-frame-on-exit)))=0A= =0A= =0A= (or (fboundp 'old-top-level)=0A= (fset 'old-top-level (symbol-function 'top-level)))=0A= =0A= ;; REPLACES ORIGINAL (built-in function):=0A= ;; Resets color of minibuffer frame to "inactive" color.=0A= ;;=0A= (defun top-level ()=0A= "Exit all recursive editing levels."=0A= (interactive)=0A= (1on1-color-minibuffer-frame-on-exit)=0A= (old-top-level))=0A= =0A= =0A= (or (fboundp 'old-abort-recursive-edit)=0A= (fset 'old-abort-recursive-edit (symbol-function = 'abort-recursive-edit)))=0A= =0A= ;; REPLACES ORIGINAL (built-in function):=0A= ;; Resets color of minibuffer frame to "inactive" color.=0A= ;;=0A= (defun abort-recursive-edit ()=0A= "Abort command that requested this recursive edit or minibuffer = input."=0A= (interactive)=0A= (1on1-color-minibuffer-frame-on-exit)=0A= (old-abort-recursive-edit)))=0A= =0A= (defun 1on1-setup-mode-line ()=0A= "Set up mode-line faces."=0A= (when 1on1-color-mode-line-flag=0A= (set-face-background 'modeline 1on1-active-mode-line-background)=0A= (when (facep 'mode-line-inactive) ; Emacs 22=0A= (set-face-background 'mode-line-inactive = 1on1-inactive-mode-line-background))))=0A= =0A= (defun 1on1-reset-minibuffer-frame ()=0A= (when 1on1-minibuffer-frame=0A= (set-frame-size 1on1-minibuffer-frame=0A= (frame-width 1on1-minibuffer-frame)=0A= 1on1-minibuffer-frame-height)=0A= (1on1-set-minibuffer-frame-top/bottom)))=0A= =0A= ;; Bind this to some key in the minibuffer completion maps. I use `C-o'.=0A= ;;;###autoload=0A= (defun 1on1-fit-minibuffer-frame ()=0A= "Fit the standalone minibuffer frame height to its contents.=0A= Repeat to increase the height by 1.=0A= Bind this in minibuffer keymaps to a key such as `C-o' that you can=0A= use during minibuffer input."=0A= (interactive)=0A= (unless (require 'fit-frame nil t)=0A= (error "You need to load library `fit-frame.el' to use this = command"))=0A= ;; We could assume the minibuffer frame is `1on1-minibuffer-frame', = but we don't.=0A= (when (and (active-minibuffer-window)=0A= (save-selected-window=0A= (select-window (minibuffer-window))=0A= ;; We should be able to use just (one-window-p),=0A= ;; but an Emacs bug means we need this:=0A= (one-window-p nil 'selected-frame)))=0A= (let* ((frame (save-selected-window=0A= (select-window (minibuffer-window)) = (selected-frame)))=0A= (frame-height (frame-height frame)))=0A= (cond ((eq last-command this-command)=0A= (set-frame-height frame (1+ (frame-height frame)))=0A= (1on1-set-minibuffer-frame-top/bottom)=0A= (condition-case nil=0A= (scroll-down (frame-height frame))=0A= (error nil)))=0A= (t=0A= (let* ((beg (1on1-minibuffer-prompt-end))=0A= (frame-width (frame-width frame))=0A= (fit-frame-min-width frame-width)=0A= (window-min-width frame-width)=0A= (fit-frame-max-width frame-width)=0A= (fit-frame-empty-width frame-width)=0A= (fit-frame-empty-special-display-width frame-width)=0A= (fit-frame-min-height frame-height)=0A= (window-min-height frame-height)=0A= (fit-frame-empty-height frame-height)=0A= (fit-frame-empty-special-display-height = frame-height))=0A= (fit-frame frame)=0A= (when (>=3D emacs-major-version 21)=0A= (set-frame-height frame (1+ (frame-height frame)))) ; A = little extra.=0A= (1on1-set-minibuffer-frame-top/bottom)=0A= (condition-case nil (scroll-down (frame-height frame)) = (error nil))))))))=0A= =0A= (defun 1on1-minibuffer-prompt-end ()=0A= "Version of `minibuffer-prompt-end' that works for Emacs 20 and later."=0A= (if (fboundp 'minibuffer-prompt-end) (minibuffer-prompt-end) = (point-min)))=0A= =0A= ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;=0A= ;;; oneonone.el ends here=0A= ------=_NextPart_000_0011_01C8F4A2.F1B3C970 Content-Type: image/png; name="bug-garbled-about-emacs.png" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="bug-garbled-about-emacs.png" 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 ------=_NextPart_000_0011_01C8F4A2.F1B3C970-- ------------=_1227454203-32684-0 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit X-Spam-Checker-Version: SpamAssassin 3.2.3-bugs.debian.org_2005_01_02 (2007-08-08) on rzlab.ucr.edu X-Spam-Level: X-Spam-Status: No, score=-7.0 required=4.0 tests=BAYES_00,HAS_BUG_NUMBER autolearn=ham version=3.2.3-bugs.debian.org_2005_01_02 Received: (at 642-done) by emacsbugs.donarmstrong.com; 23 Nov 2008 15:23:12 +0000 Received: from ti-out-0910.google.com (ti-out-0910.google.com [209.85.142.189]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id mANFN9L6031340 for <642-done@emacsbugs.donarmstrong.com>; Sun, 23 Nov 2008 07:23:10 -0800 Received: by ti-out-0910.google.com with SMTP id b6so999532tic.1 for <642-done@emacsbugs.donarmstrong.com>; Sun, 23 Nov 2008 07:23:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:date:from :user-agent:mime-version:to:cc:subject:references:in-reply-to :content-type:content-transfer-encoding:sender; bh=LGhZ81PCzc4XAog/ld2n2ffsdzSz2LMZBhIXWWI2RaA=; b=thfVMs4enTVOQXe9XUDi+CpfIOgFY594IWgrOa5UOkzuO0TvDcppbOKDVvB53X/R52 vb8w3VyHi+ESMI7YJJdZD6ZaPDFzXR++q2tG6wfmLPLRmefus0fDJ9iQuv0d1k9ol0du qqfhhTu4oTd9WqoSc2nLCvm97ZSPpNb+U+E/k= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:cc:subject :references:in-reply-to:content-type:content-transfer-encoding :sender; b=XunWv918OOgAUAeOumGmI63wFPkxQkCyTqlbRf0k1NVoTy1f/+fsw0g7/HyTAQf4Sr rAOGVYELITa05qrP57+ot9uzeMyidIQ0hzHo5lUHftrIgWnvePOl0m0SOeN760u+Lb5p fbHvoHs6oo1suODm7YNUCeVvGcX9JemSjUI8s= Received: by 10.110.63.6 with SMTP id l6mr3563116tia.50.1227453788378; Sun, 23 Nov 2008 07:23:08 -0800 (PST) Received: from ?192.168.1.3? ([118.100.161.60]) by mx.google.com with ESMTPS id 2sm6934051tif.0.2008.11.23.07.23.04 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sun, 23 Nov 2008 07:23:07 -0800 (PST) Message-ID: <49297533.3040505@f2s.com> Date: Sun, 23 Nov 2008 23:22:27 +0800 From: Jason Rumney User-Agent: Thunderbird 2.0.0.18 (Windows/20081105) MIME-Version: 1.0 To: Drew Adams CC: 642-done@emacsbugs.donarmstrong.com Subject: Re: bug#642: 23.0.60;garbled text (wrong font?) in About GNU Emacs screen References: <001001c8f4dd$9e12a170$0200a8c0@us.oracle.com><4894CC33.4000501@gnu.org> <005101c93a0b$44fe0840$c2b22382@us.oracle.com> <002a01c9488c$a4fb8c60$0200a8c0@us.oracle.com> In-Reply-To: <002a01c9488c$a4fb8c60$0200a8c0@us.oracle.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Sender: Jason Rumney Drew Adams wrote: > Here is some more info about this. > > The display shows problems with font families Times and Helvetica. I use the > standard Times and Helvetica Type1 fonts on Windows XP. E.g., the Times Roman > font file is named TIR_____.PFM; the Helvetica file is HV_____.PFM. > Thanks for your extra information. I think this is related to the fact that the Uniscribe font backend can only use opentype and truetype fonts, but Windows by default defines font substitutions for Helvetica and Times to map to the Truetype fonts "Arial" and "Times New Roman". So the uniscribe backend picks these substitutes up, but somehow things get confused so the Type-1 fonts end up being loaded. I've added some code to specifically reject these substitutes, which are detected by comparing the font's "full name" with the name used to load it. Unfortunately this also catches many legitimate fonts, so I've had to pick out these two specific problematic substitutions. If there are any other specific fonts that cause this problem, then we will need to add rules for them too. ------------=_1227454203-32684-0--