diff lisp/gtk-init.el @ 462:0784d089fdc9 r21-2-46

Import from CVS: tag r21-2-46
author cvs
date Mon, 13 Aug 2007 11:44:37 +0200
parents
children 54fa1a5c2d12
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/gtk-init.el	Mon Aug 13 11:44:37 2007 +0200
@@ -0,0 +1,332 @@
+;;; gtk-init.el --- initialization code for mswindows
+;; Copyright (C) 1990, 1993, 1994 Free Software Foundation, Inc.
+;; Copyright (C) 1995 Board of Trustees, University of Illinois.
+;; Copyright (C) 1995, 1996 Ben Wing.
+
+;; Author: various
+;; Rewritten for Gtk by: William Perry
+
+;; This file is part of XEmacs.
+
+;; XEmacs is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; XEmacs is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with XEmacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+
+(defvar gtk-win-initted nil)
+(defvar gtk-pre-win-initted nil)
+(defvar gtk-post-win-initted nil)
+
+(defvar gtk-command-switch-alist
+  '(
+    ;; GNOME Options
+    ("--disable-sound" . nil)
+    ("--enable-sound"  . nil)
+    ("--espeaker"      . t)
+
+    ;; GTK Options
+    ("--gdk-debug"    . t)
+    ("--gdk-no-debug" . t)
+    ("--display"      . t)
+    ("--sync"         . nil)
+    ("--no-xshm"      . nil)
+    ("--name"         . t)
+    ("--class"        . t)
+    ("--gxid_host"    . t)
+    ("--gxid_port"    . t)
+    ("--xim-preedit"  . t)
+    ("--xim-status"   . t)
+    ("--gtk-debug"    . t)
+    ("--gtk-no-debug" . t)
+    ("--gtk-module"   . t)
+
+    ;; Glib options
+    ("--g-fatal-warnings" . nil)
+
+    ;; Session management options
+    ("--sm-client-id"     . t)
+    ("--sm-config-prefix" . t)
+    ("--sm-disable"       . t)
+    )
+
+  "An assoc list of command line arguments that should in gtk-initial-argv-list.
+This is necessary because GTK and GNOME consider it a fatal error if they receive
+unknown command line arguments (perfectly reasonable).  But this means that if
+the user specifies a file name on the command line they will be unable to start.
+So we filter the command line and allow only items in this list in.
+
+The CDR of the assoc list is whether it accepts an argument.  All options are in
+GNU long form though.")
+
+(defun init-pre-gtk-win ()
+  "Initialize Gtk GUI at startup (pre).  Don't call this."
+  (when (not gtk-pre-win-initted)
+    (setq initial-frame-plist (if initial-frame-unmapped-p
+				  '(initially-unmapped t)
+				nil)
+	  gtk-pre-win-initted t)))
+
+(defun gtk-init-handle-geometry (arg)
+  "Set up initial geometry info for GTK devices."
+  (setq gtk-initial-geometry (pop command-line-args-left)))
+
+(defun gtk-filter-arguments ()
+  (let ((accepted nil)
+	(rejected nil)
+	(todo nil))
+    (setq todo (mapcar (lambda (argdesc)
+			 (if (cdr argdesc)
+			     ;; Need to look for --foo=bar
+			     (concat "^" (car argdesc) "=")
+			   ;; Just a simple arg
+			   (concat "^" (regexp-quote (car argdesc)) "$")))
+		       gtk-command-switch-alist))
+
+    (while command-line-args-left
+      (if (catch 'found
+	    (mapc (lambda (r)
+		    (if (string-match r (car command-line-args-left))
+			(throw 'found t))) todo)
+	    (mapc (lambda (argdesc)
+		    (if (cdr argdesc)
+			;; This time we only care about argument items
+			;; that take an argument.  We'll check to see if
+			;; someone used --foo bar instead of --foo=bar
+			(if (string-match (concat "^" (car argdesc) "$") (car command-line-args-left))
+			    ;; Yup!  Need to push
+			    (progn
+			      (push (pop command-line-args-left) accepted)
+			      (throw 'found t)))))
+		  gtk-command-switch-alist)
+	    nil)
+	  (push (pop command-line-args-left) accepted)
+	(push (pop command-line-args-left) rejected)))
+    (setq command-line-args-left (nreverse rejected))
+    (nreverse accepted)))
+
+(defun init-gtk-win ()
+  "Initialize Gtk GUI at startup.  Don't call this."
+  (unless gtk-win-initted
+    (init-pre-gtk-win)
+    (setq gtk-initial-argv-list (cons (car command-line-args) (gtk-filter-arguments))
+	  gtk-initial-geometry (nth 1 (member "-geometry" command-line-args-left)))
+    (make-gtk-device)
+    (init-post-gtk-win)
+    (setq gtk-win-initted t)))
+
+(defun init-post-gtk-win ()
+  (unless gtk-post-win-initted
+    (if (and (not (featurep 'infodock)) (featurep 'toolbar))
+        (init-x-toolbar))
+    (if (and (featurep 'infodock) (featurep 'toolbar))
+	(require 'id-x-toolbar))
+
+    (when (featurep 'mule)
+      (define-specifier-tag 'mule-fonts
+	(lambda (device) (eq 'gtk (device-type device))))
+      (set-face-font
+       'default
+       '("-*-fixed-medium-r-*--16-*-iso8859-1"
+	 "-*-fixed-medium-r-*--*-iso8859-1"
+	 "-*-fixed-medium-r-*--*-iso8859-2"
+	 "-*-fixed-medium-r-*--*-iso8859-3"
+	 "-*-fixed-medium-r-*--*-iso8859-4"
+	 "-*-fixed-medium-r-*--*-iso8859-7"
+	 "-*-fixed-medium-r-*--*-iso8859-8"
+	 "-*-fixed-medium-r-*--*-iso8859-5"
+	 "-*-fixed-medium-r-*--*-iso8859-9"
+
+	 ;; Following 3 fonts proposed by Teruhiko.Kurosaka@Japan.eng.sun
+	 "-sun-gothic-medium-r-normal--14-120-75-75-c-60-jisx0201.1976-0"
+	 "-sun-gothic-medium-r-normal--14-120-75-75-c-120-jisx0208.1983-0"
+	 "-wadalab-gothic-medium-r-normal--14-120-75-75-c-120-jisx0212.1990-0"
+	 ;; Other Japanese fonts
+	 "-*-fixed-medium-r-*--*-jisx0201.1976-*"
+	 "-*-fixed-medium-r-*--*-jisx0208.1983-*"
+	 "-*-fixed-medium-r-*--*-jisx0212*-*"
+
+	 ;; Chinese fonts
+	 "-*-*-medium-r-*--*-gb2312.1980-*"
+       
+	 ;; Use One font specification for CNS chinese
+	 ;; Too many variations in font naming
+	 "-*-fixed-medium-r-*--*-cns11643*-*"
+	 ;; "-*-fixed-medium-r-*--*-cns11643*2"
+	 ;; "-*-fixed-medium-r-*--*-cns11643*3"
+	 ;; "-*-fixed-medium-r-*--*-cns11643*4"
+	 ;; "-*-fixed-medium-r-*--*-cns11643.5-0"
+	 ;; "-*-fixed-medium-r-*--*-cns11643.6-0"
+	 ;; "-*-fixed-medium-r-*--*-cns11643.7-0"
+       
+	 "-*-fixed-medium-r-*--*-big5*-*"
+	 "-*-fixed-medium-r-*--*-sisheng_cwnn-0"
+
+	 ;; Other fonts
+       
+	 ;; "-*-fixed-medium-r-*--*-viscii1.1-1"
+       
+	 ;; "-*-fixed-medium-r-*--*-mulearabic-0"
+	 ;; "-*-fixed-medium-r-*--*-mulearabic-1"
+	 ;; "-*-fixed-medium-r-*--*-mulearabic-2"
+
+	 ;; "-*-fixed-medium-r-*--*-muleipa-1"
+	 ;; "-*-fixed-medium-r-*--*-ethio-*"
+
+	 "-*-mincho-medium-r-*--*-ksc5601.1987-*" ; Korean
+	 "-*-fixed-medium-r-*--*-tis620.2529-1" ; Thai
+	 )
+       'global '(mule-fonts) 'append))
+    
+    (add-hook 'zmacs-deactivate-region-hook
+	      (lambda ()
+		(if (console-on-window-system-p)
+		    (disown-selection))))
+    (add-hook 'zmacs-activate-region-hook
+	      (lambda ()
+		(if (console-on-window-system-p)
+		    (activate-region-as-selection))))
+    (add-hook 'zmacs-update-region-hook
+	      (lambda ()
+		(if (console-on-window-system-p)
+		    (activate-region-as-selection))))
+
+    (define-key global-map 'menu 'popup-mode-menu)
+    (setq gtk-post-win-initted t)))
+    
+(push '("-geometry" . gtk-init-handle-geometry) command-switch-alist)
+
+;;; Stuff to get compose keys working on GTK
+(eval-when-compile
+  (defmacro gtk-define-dead-key (key map)
+    `(when (gtk-keysym-on-keyboard-p ',key)
+       (define-key function-key-map [,key] ',map))))
+
+(defun gtk-initialize-compose ()
+  "Enable compose processing"
+  (autoload 'compose-map	    "gtk-compose" nil t 'keymap)
+  (autoload 'compose-acute-map	    "gtk-compose" nil t 'keymap)
+  (autoload 'compose-grave-map	    "gtk-compose" nil t 'keymap)
+  (autoload 'compose-cedilla-map    "gtk-compose" nil t 'keymap)
+  (autoload 'compose-diaeresis-map  "gtk-compose" nil t 'keymap)
+  (autoload 'compose-circumflex-map "gtk-compose" nil t 'keymap)
+  (autoload 'compose-tilde-map	    "gtk-compose" nil t 'keymap)
+
+  (when (gtk-keysym-on-keyboard-p 'multi-key)
+    (define-key function-key-map [multi-key] 'compose-map))
+
+  ;; The dead keys might really be called just about anything, depending
+  ;; on the vendor.  MIT thinks that the prefixes are "SunFA_", "D", and
+  ;; "hpmute_" for Sun, DEC, and HP respectively.  However, OpenWindows 3
+  ;; thinks that the prefixes are "SunXK_FA_", "DXK_", and "hpXK_mute_".
+  ;; And HP (who don't mention Sun and DEC at all) use "XK_mute_".
+  ;; Go figure.
+
+  ;; Presumably if someone is running OpenWindows, they won't be using
+  ;; the DEC or HP keysyms, but if they are defined then that is possible,
+  ;; so in that case we accept them all.
+
+  ;; If things seem not to be working, you might want to check your
+  ;; /usr/lib/X11/XKeysymDB file to see if your vendor has an equally
+  ;; mixed up view of what these keys should be called.
+
+  ;; Canonical names:
+  (gtk-define-dead-key acute			compose-acute-map)
+  (gtk-define-dead-key grave			compose-grave-map)
+  (gtk-define-dead-key cedilla			compose-cedilla-map)
+  (gtk-define-dead-key diaeresis		compose-diaeresis-map)
+  (gtk-define-dead-key circumflex		compose-circumflex-map)
+  (gtk-define-dead-key tilde			compose-tilde-map)
+  (gtk-define-dead-key degree			compose-ring-map)
+
+  ;; Sun according to MIT:
+  (gtk-define-dead-key SunFA_Acute		compose-acute-map)
+  (gtk-define-dead-key SunFA_Grave		compose-grave-map)
+  (gtk-define-dead-key SunFA_Cedilla		compose-cedilla-map)
+  (gtk-define-dead-key SunFA_Diaeresis		compose-diaeresis-map)
+  (gtk-define-dead-key SunFA_Circum		compose-circumflex-map)
+  (gtk-define-dead-key SunFA_Tilde		compose-tilde-map)
+
+  ;; Sun according to OpenWindows 2:
+  (gtk-define-dead-key Dead_Grave		compose-grave-map)
+  (gtk-define-dead-key Dead_Circum		compose-circumflex-map)
+  (gtk-define-dead-key Dead_Tilde		compose-tilde-map)
+
+  ;; Sun according to OpenWindows 3:
+  (gtk-define-dead-key SunXK_FA_Acute		compose-acute-map)
+  (gtk-define-dead-key SunXK_FA_Grave		compose-grave-map)
+  (gtk-define-dead-key SunXK_FA_Cedilla		compose-cedilla-map)
+  (gtk-define-dead-key SunXK_FA_Diaeresis	compose-diaeresis-map)
+  (gtk-define-dead-key SunXK_FA_Circum		compose-circumflex-map)
+  (gtk-define-dead-key SunXK_FA_Tilde		compose-tilde-map)
+
+  ;; DEC according to MIT:
+  (gtk-define-dead-key Dacute_accent		compose-acute-map)
+  (gtk-define-dead-key Dgrave_accent		compose-grave-map)
+  (gtk-define-dead-key Dcedilla_accent		compose-cedilla-map)
+  (gtk-define-dead-key Dcircumflex_accent	compose-circumflex-map)
+  (gtk-define-dead-key Dtilde			compose-tilde-map)
+  (gtk-define-dead-key Dring_accent		compose-ring-map)
+
+  ;; DEC according to OpenWindows 3:
+  (gtk-define-dead-key DXK_acute_accent		compose-acute-map)
+  (gtk-define-dead-key DXK_grave_accent		compose-grave-map)
+  (gtk-define-dead-key DXK_cedilla_accent	compose-cedilla-map)
+  (gtk-define-dead-key DXK_circumflex_accent	compose-circumflex-map)
+  (gtk-define-dead-key DXK_tilde		compose-tilde-map)
+  (gtk-define-dead-key DXK_ring_accent		compose-ring-map)
+
+  ;; HP according to MIT:
+  (gtk-define-dead-key hpmute_acute		compose-acute-map)
+  (gtk-define-dead-key hpmute_grave		compose-grave-map)
+  (gtk-define-dead-key hpmute_diaeresis		compose-diaeresis-map)
+  (gtk-define-dead-key hpmute_asciicircum	compose-circumflex-map)
+  (gtk-define-dead-key hpmute_asciitilde	compose-tilde-map)
+
+  ;; Empirically discovered on Linux XFree86 MetroX:
+  (gtk-define-dead-key usldead_acute		compose-acute-map)
+  (gtk-define-dead-key usldead_grave		compose-grave-map)
+  (gtk-define-dead-key usldead_diaeresis	compose-diaeresis-map)
+  (gtk-define-dead-key usldead_asciicircum	compose-circumflex-map)
+  (gtk-define-dead-key usldead_asciitilde	compose-tilde-map)
+
+  ;; HP according to OpenWindows 3:
+  (gtk-define-dead-key hpXK_mute_acute		compose-acute-map)
+  (gtk-define-dead-key hpXK_mute_grave		compose-grave-map)
+  (gtk-define-dead-key hpXK_mute_diaeresis	compose-diaeresis-map)
+  (gtk-define-dead-key hpXK_mute_asciicircum	compose-circumflex-map)
+  (gtk-define-dead-key hpXK_mute_asciitilde	compose-tilde-map)
+
+  ;; HP according to HP-UX 8.0:
+  (gtk-define-dead-key XK_mute_acute		compose-acute-map)
+  (gtk-define-dead-key XK_mute_grave		compose-grave-map)
+  (gtk-define-dead-key XK_mute_diaeresis	compose-diaeresis-map)
+  (gtk-define-dead-key XK_mute_asciicircum	compose-circumflex-map)
+  (gtk-define-dead-key XK_mute_asciitilde	compose-tilde-map)
+
+  ;; Xfree86 seems to use lower case and a hyphen
+  (gtk-define-dead-key dead-acute		compose-acute-map)
+  (gtk-define-dead-key dead-grave		compose-grave-map)
+  (gtk-define-dead-key dead-cedilla		compose-cedilla-map)
+  (gtk-define-dead-key dead-diaeresis		compose-diaeresis-map)
+  (gtk-define-dead-key dead-circum		compose-circumflex-map)
+  (gtk-define-dead-key dead-circumflex		compose-circumflex-map)
+  (gtk-define-dead-key dead-tilde		compose-tilde-map)
+  )
+
+(when (featurep 'gtk)
+  (add-hook
+   'create-console-hook
+   (lambda (console)
+     (letf (((selected-console) console))
+       (when (eq 'gtk (console-type console))
+	 (gtk-initialize-compose))))))