diff lisp/gtk-init.el @ 4477:e34711681f30

Don't determine whether to call general device-type code at startup, rather decide in the device-specific code itself. lisp/ChangeLog addition: 2008-07-07 Aidan Kehoe <kehoea@parhasard.net> Patch to make it up to the device-specific code whether various Lisp functions should be called during device creation, not relying on the startup code to decide this. Also, rename initial-window-system to initial-device-type (which makes more sense in this scheme), always set it. * startup.el (command-line): Use initial-device-type, not initial-window-system; just call #'make-device, leave the special behaviour to be done the first time a console type is initialised to be decided on by the respective console code. * x-init.el (x-app-defaults-directory): Declare that it should be bound. (x-define-dead-key): Have the macro take a DEVICE argument. (x-initialize-compose): Have the function take a DEVICE argument, and use it when checking if various keysyms are available on the keyboard. (x-initialize-keyboard): Have the function take a DEVICE argument, allowing device-specific keyboard initialisation. (make-device-early-x-entry-point-called-p): New. (make-device-late-x-entry-point-called-p): New. Rename pre-x-win-initted, x-win-initted. (make-device-early-x-entry-point): Rename init-pre-x-win, take the call to make-x-device out (it should be called from the device-creation code, not vice-versa). (make-device-late-x-entry-point): Rename init-post-x-win, have it take a DEVICE argument, use that DEVICE argument when working out what device-specific things need doing. Don't use create-console-hook in core code. * x-win-xfree86.el (x-win-init-xfree86): Take a DEVICE argument; use it. * x-win-sun.el (x-win-init-sun): Take a DEVICE argument; use it. * mule/mule-x-init.el: Remove #'init-mule-x-win, an empty function. * tty-init.el (make-device-early-tty-entry-point-called-p): New. Rename pre-tty-win-initted. (make-device-early-tty-entry-point): New. Rename init-pre-tty-win. (make-frame-after-init-entry-point): New. Rename init-post-tty-win to better reflect when it's called. * gtk-init.el (gtk-early-lisp-options-file): New. Move this path to a documented variable. (gtk-command-switch-alist): Wrap the docstring to fewer than 79 columns. (make-device-early-gtk-entry-point-called-p): New. (make-device-late-gtk-entry-point-called-p): New. Renamed gtk-pre-win-initted, gtk-post-win-initted to these. (make-device-early-gtk-entry-point): New. (make-device-late-gtk-entry-point): New. Renamed init-pre-gtk-win, init-post-gtk-win to these. Have make-device-late-gtk-entry-point take a device argument, and use it; have make-device-early-gtk-entry-point load the GTK-specific startup code, instead of doing that in C. (init-gtk-win): Deleted, functionality moved to the GTK device creation code. (gtk-define-dead-key): Have it take a DEVICE argument; use this argument. (gtk-initialize-compose): Ditto. * coding.el (set-terminal-coding-system): Correct the docstring; the function isn't broken. src/ChangeLog addition: 2008-07-07 Aidan Kehoe <kehoea@parhasard.net> Patch to make it up to the device-specific code whether various Lisp functions should be called during device creation, not relying on the startup code to decide this. Also, rename initial-window-system to initial-device-type (which makes more sense in this scheme), always set it. * redisplay.c (Vinitial_device_type): New. (Vinitial_window_system): Removed. Rename initial-window-system to initial-device type, making it a stream if we're noninteractive. Update its docstring. * device-x.c (Qmake_device_early_x_entry_point, Qmake_device_late_x_entry_point): New. Rename Qinit_pre_x_win, Qinit_post_x_win. (x_init_device): Call #'make-device-early-x-entry-point earlier, now we rely on it to find the application class and the app-defaults directory. (x_finish_init_device): Call #'make-device-late-x-entry-point with the created device. (Vx_app_defaults_directory): Always make this available, to simplify code in x-init.el. * device-tty.c (Qmake_device_early_tty_entry_point): New. Rename Qinit_pre_tty_win, rename Qinit_post_tty_win and move to frame-tty.c as Qmake_frame_after_init_entry_point. (tty_init_device): Call #'make-device-early-tty-entry-point before doing anything. * frame-tty.c (Qmake_frame_after_init_entry_point): New. * frame-tty.c (tty_after_init_frame): Have it call the better-named #'make-frame-after-init-entry-point function instead of #'init-post-tty-win (since it's called after frame, not device, creation). * device-msw.c (Qmake_device_early_mswindows_entry_point, Qmake_device_late_mswindows_entry_point): New. Rename Qinit_pre_mswindows_win, Qinit_post_mswindows_win. (mswindows_init_device): Call #'make-device-early-mswindows-entry-point here, instead of having its predecessor call us. (mswindows_finish_init_device): Call #'make-device-early-mswindows-entry-point, for symmetry with the other device types (though it's an empty function). * device-gtk.c (Qmake_device_early_gtk_entry_point, Qmake_device_late_gtk_entry_point): New. Rename Qinit_pre_gtk_win, Qinit_post_gtk_win. (gtk_init_device): Call #'make-device-early-gtk-entry-point; don't load ~/.xemacs/gtk-options.el ourselves, leave that to lisp. (gtk_finish_init_device): Call #'make-device-late-gtk-entry-point with the created device as an argument.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 09 Jul 2008 20:46:22 +0200
parents 461fdb92f3b6
children 308d34e9f07d
line wrap: on
line diff
--- a/lisp/gtk-init.el	Sun Jul 06 19:46:19 2008 +0300
+++ b/lisp/gtk-init.el	Wed Jul 09 20:46:22 2008 +0200
@@ -24,15 +24,19 @@
 ;; Boston, MA 02111-1307, USA.
 
 (globally-declare-boundp
- '(gtk-initial-argv-list
-   gtk-initial-geometry))
+ '(gtk-initial-argv-list gtk-initial-geometry))
 
 (globally-declare-fboundp
  '(gtk-keysym-on-keyboard-p))
 
-(defvar gtk-win-initted nil)
-(defvar gtk-pre-win-initted nil)
-(defvar gtk-post-win-initted nil)
+(defvar gtk-early-lisp-options-file "~/.xemacs/gtk-options.el"
+  "Path where GTK-specific early options should be stored.
+
+This allows the user to set initial geometry without using GNOME and session
+management, and, since it is read before GTK is initialized, it avoids
+window flicker on resizing.
+
+It is normally not useful to change without recompiling XEmacs.")
 
 (defvar gtk-command-switch-alist
   '(
@@ -66,27 +70,51 @@
     ("--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.
+  "An assoc list of command line args that should be 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.  For the
+moment, all options are in GNU long form.")
+
+(defvar make-device-early-gtk-entry-point-called-p nil
+  "Whether `make-device-early-gtk-entry-point' has been called, at least once.
+
+Much of the GTK-specific Lisp init code should only be called the first time
+a GTK device is created; this variable allows for that.")
 
-The CDR of the assoc list is whether it accepts an argument.  All options are in
-GNU long form though.")
+(defvar make-device-late-gtk-entry-point-called-p nil
+  "Whether `make-device-late-gtk-entry-point' has been called, at least once.
+
+Much of the GTK-specific Lisp init code should only be called the first time
+a GTK device is created; this variable allows for that.")
 
-(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 make-device-early-gtk-entry-point ()
+  "Entry point to set up the Lisp environment before GTK device creation."
+  (unless make-device-early-gtk-entry-point-called-p
+    (setq initial-frame-plist
+          (and initial-frame-unmapped-p '(initially-unmapped t))
+          gtk-initial-argv-list
+          (cons (car command-line-args) (gtk-filter-arguments))
+	  gtk-initial-geometry
+          (nth 1 (member "-geometry" command-line-args-left))
+	  make-device-early-gtk-entry-point-called-p t)
+    (unless vanilla-inhibiting
+      (load gtk-early-lisp-options-file t t 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 make-device-late-gtk-entry-point (device)
+  "Entry-Point to do any Lisp-level GTK device-specific initialization."
+  (gtk-initialize-compose device)
+  (unless make-device-late-gtk-entry-point-called-p
+    (setq make-device-late-gtk-entry-point-called-p t)))
+
 (defun gtk-filter-arguments ()
   (let ((accepted nil)
 	(rejected nil)
@@ -121,29 +149,15 @@
     (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
-    (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)
+  (defmacro gtk-define-dead-key (key map device)
+    `(when (gtk-keysym-on-keyboard-p ',key device)
        (define-key function-key-map [,key] ',map))))
 
-(defun gtk-initialize-compose ()
+(defun gtk-initialize-compose (device)
   "Enable compose processing"
   (autoload 'compose-map	    "gtk-compose" nil t 'keymap)
   (autoload 'compose-acute-map	    "gtk-compose" nil t 'keymap)
@@ -153,7 +167,7 @@
   (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)
+  (when (gtk-keysym-on-keyboard-p 'multi-key device)
     (define-key function-key-map [multi-key] 'compose-map))
 
   ;; The dead keys might really be called just about anything, depending
@@ -172,93 +186,85 @@
   ;; 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)
+  (gtk-define-dead-key acute			compose-acute-map device)
+  (gtk-define-dead-key grave			compose-grave-map device)
+  (gtk-define-dead-key cedilla			compose-cedilla-map device)
+  (gtk-define-dead-key diaeresis		compose-diaeresis-map device)
+  (gtk-define-dead-key circumflex		compose-circumflex-map device)
+  (gtk-define-dead-key tilde			compose-tilde-map device)
+  (gtk-define-dead-key degree			compose-ring-map device)
 
   ;; 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)
+  (gtk-define-dead-key SunFA_Acute		compose-acute-map device)
+  (gtk-define-dead-key SunFA_Grave		compose-grave-map device)
+  (gtk-define-dead-key SunFA_Cedilla		compose-cedilla-map device)
+  (gtk-define-dead-key SunFA_Diaeresis		compose-diaeresis-map device)
+  (gtk-define-dead-key SunFA_Circum		compose-circumflex-map device)
+  (gtk-define-dead-key SunFA_Tilde		compose-tilde-map device)
 
   ;; 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)
+  (gtk-define-dead-key Dead_Grave		compose-grave-map device)
+  (gtk-define-dead-key Dead_Circum		compose-circumflex-map device)
+  (gtk-define-dead-key Dead_Tilde		compose-tilde-map device)
 
   ;; 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)
+  (gtk-define-dead-key SunXK_FA_Acute		compose-acute-map device)
+  (gtk-define-dead-key SunXK_FA_Grave		compose-grave-map device)
+  (gtk-define-dead-key SunXK_FA_Cedilla		compose-cedilla-map device)
+  (gtk-define-dead-key SunXK_FA_Diaeresis	compose-diaeresis-map device)
+  (gtk-define-dead-key SunXK_FA_Circum		compose-circumflex-map device)
+  (gtk-define-dead-key SunXK_FA_Tilde		compose-tilde-map device)
 
   ;; 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)
+  (gtk-define-dead-key Dacute_accent		compose-acute-map device)
+  (gtk-define-dead-key Dgrave_accent		compose-grave-map device)
+  (gtk-define-dead-key Dcedilla_accent		compose-cedilla-map device)
+  (gtk-define-dead-key Dcircumflex_accent	compose-circumflex-map device)
+  (gtk-define-dead-key Dtilde			compose-tilde-map device)
+  (gtk-define-dead-key Dring_accent		compose-ring-map device)
 
   ;; 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)
+  (gtk-define-dead-key DXK_acute_accent		compose-acute-map device)
+  (gtk-define-dead-key DXK_grave_accent		compose-grave-map device)
+  (gtk-define-dead-key DXK_cedilla_accent	compose-cedilla-map device)
+  (gtk-define-dead-key DXK_circumflex_accent	compose-circumflex-map device)
+  (gtk-define-dead-key DXK_tilde		compose-tilde-map device)
+  (gtk-define-dead-key DXK_ring_accent		compose-ring-map device)
 
   ;; 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)
+  (gtk-define-dead-key hpmute_acute		compose-acute-map device)
+  (gtk-define-dead-key hpmute_grave		compose-grave-map device)
+  (gtk-define-dead-key hpmute_diaeresis		compose-diaeresis-map device)
+  (gtk-define-dead-key hpmute_asciicircum	compose-circumflex-map device)
+  (gtk-define-dead-key hpmute_asciitilde	compose-tilde-map device)
 
   ;; 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)
+  (gtk-define-dead-key usldead_acute		compose-acute-map device)
+  (gtk-define-dead-key usldead_grave		compose-grave-map device)
+  (gtk-define-dead-key usldead_diaeresis	compose-diaeresis-map device)
+  (gtk-define-dead-key usldead_asciicircum	compose-circumflex-map device)
+  (gtk-define-dead-key usldead_asciitilde	compose-tilde-map device)
 
   ;; 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)
+  (gtk-define-dead-key hpXK_mute_acute		compose-acute-map device)
+  (gtk-define-dead-key hpXK_mute_grave		compose-grave-map device)
+  (gtk-define-dead-key hpXK_mute_diaeresis	compose-diaeresis-map device)
+  (gtk-define-dead-key hpXK_mute_asciicircum	compose-circumflex-map device)
+  (gtk-define-dead-key hpXK_mute_asciitilde	compose-tilde-map device)
 
   ;; 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)
+  (gtk-define-dead-key XK_mute_acute		compose-acute-map device)
+  (gtk-define-dead-key XK_mute_grave		compose-grave-map device)
+  (gtk-define-dead-key XK_mute_diaeresis	compose-diaeresis-map device)
+  (gtk-define-dead-key XK_mute_asciicircum	compose-circumflex-map device)
+  (gtk-define-dead-key XK_mute_asciitilde	compose-tilde-map device)
 
   ;; 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)
-  )
+  (gtk-define-dead-key dead-acute		compose-acute-map device)
+  (gtk-define-dead-key dead-grave		compose-grave-map device)
+  (gtk-define-dead-key dead-cedilla		compose-cedilla-map device)
+  (gtk-define-dead-key dead-diaeresis		compose-diaeresis-map device)
+  (gtk-define-dead-key dead-circum		compose-circumflex-map device)
+  (gtk-define-dead-key dead-circumflex		compose-circumflex-map device)
+  (gtk-define-dead-key dead-tilde		compose-tilde-map device))
 
-(when (featurep 'gtk)
-  (add-hook
-   'create-console-hook
-   (lambda (console)
-     (letf (((selected-console) console))
-       (when (eq 'gtk (console-type console))
-	 (gtk-initialize-compose))))))