Mercurial > hg > xemacs-beta
view tests/Dnd/droptest.el @ 934:c925bacdda60
[xemacs-hg @ 2002-07-29 09:21:12 by michaels]
2002-07-17 Marcus Crestani <crestani@informatik.uni-tuebingen.de>
Markus Kaltenbach <makalten@informatik.uni-tuebingen.de>
Mike Sperber <mike@xemacs.org>
configure flag to turn these changes on: --use-kkcc
First we added a dumpable flag to lrecord_implementation. It shows,
if the object is dumpable and should be processed by the dumper.
* lrecord.h (struct lrecord_implementation): added dumpable flag
(MAKE_LRECORD_IMPLEMENTATION): fitted the different makro definitions
to the new lrecord_implementation and their calls.
Then we changed mark_object, that it no longer needs a mark method for
those types that have pdump descritions.
* alloc.c:
(mark_object): If the object has a description, the new mark algorithm
is called, and the object is marked according to its description.
Otherwise it uses the mark method like before.
These procedures mark objects according to their descriptions. They
are modeled on the corresponding pdumper procedures.
(mark_with_description):
(get_indirect_count):
(structure_size):
(mark_struct_contents):
These procedures still call mark_object, this is needed while there are
Lisp_Objects without descriptions left.
We added pdump descriptions for many Lisp_Objects:
* extents.c: extent_auxiliary_description
* database.c: database_description
* gui.c: gui_item_description
* scrollbar.c: scrollbar_instance_description
* toolbar.c: toolbar_button_description
* event-stream.c: command_builder_description
* mule-charset.c: charset_description
* device-msw.c: devmode_description
* dialog-msw.c: mswindows_dialog_id_description
* eldap.c: ldap_description
* postgresql.c: pgconn_description
pgresult_description
* tooltalk.c: tooltalk_message_description
tooltalk_pattern_description
* ui-gtk.c: emacs_ffi_description
emacs_gtk_object_description
* events.c:
* events.h:
* event-stream.c:
* event-Xt.c:
* event-gtk.c:
* event-tty.c:
To write a pdump description for Lisp_Event, we converted every struct
in the union event to a Lisp_Object. So we created nine new
Lisp_Objects: Lisp_Key_Data, Lisp_Button_Data, Lisp_Motion_Data,
Lisp_Process_Data, Lisp_Timeout_Data, Lisp_Eval_Data,
Lisp_Misc_User_Data, Lisp_Magic_Data, Lisp_Magic_Eval_Data.
We also wrote makro selectors and mutators for the fields of the new
designed Lisp_Event and added everywhere these new abstractions.
We implemented XD_UNION support in (mark_with_description), so
we can describe exspecially console/device specific data with XD_UNION.
To describe with XD_UNION, we added a field to these objects, which
holds the variant type of the object. This field is initialized in
the appendant constructor. The variant is an integer, it has also to
be described in an description, if XD_UNION is used.
XD_UNION is used in following descriptions:
* console.c: console_description
(get_console_variant): returns the variant
(create_console): added variant initialization
* console.h (console_variant): the different console types
* console-impl.h (struct console): added enum console_variant contype
* device.c: device_description
(Fmake_device): added variant initialization
* device-impl.h (struct device): added enum console_variant devtype
* objects.c: image_instance_description
font_instance_description
(Fmake_color_instance): added variant initialization
(Fmake_font_instance): added variant initialization
* objects-impl.h (struct Lisp_Color_Instance): added color_instance_type
* objects-impl.h (struct Lisp_Font_Instance): added font_instance_type
* process.c: process_description
(make_process_internal): added variant initialization
* process.h (process_variant): the different process types
author | michaels |
---|---|
date | Mon, 29 Jul 2002 09:21:25 +0000 |
parents | 3ecd8885ac67 |
children | bc4f2511bbea |
line wrap: on
line source
;; a short example how to use the new Drag'n'Drop API in ;; combination with extents. ;; (defun dnd-drop-message (event object text) (message "Dropped %s with :%s" text object) ;; signal that we have done something with the data t) (defun do-nothing (event object) ;; signal that the data is still unprocessed nil) (defun start-drag (event what &optional typ) ;; short drag interface, until the real one is implemented (cond ((featurep 'offix) (if (numberp typ) (offix-start-drag event what typ) (offix-start-drag event what))) ((featurep 'cde) (if (not typ) (funcall (intern "cde-start-drag-internal") event nil (list what)) (funcall (intern "cde-start-drag-internal") event t what))) (t display-message 'error "no valid drag protocols implemented"))) (defun start-region-drag (event) (interactive "_e") (if (click-inside-extent-p event zmacs-region-extent) ;; okay, this is a drag (cond ((featurep 'offix) (offix-start-drag-region event (extent-start-position zmacs-region-extent) (extent-end-position zmacs-region-extent))) ((featurep 'cde) ;; should also work with CDE (cde-start-drag-region event (extent-start-position zmacs-region-extent) (extent-end-position zmacs-region-extent))) (t (error "No offix or CDE support compiled in"))))) (defun make-drop-targets () (let ((buf (get-buffer-create "*DND misc-user extent test buffer*")) (s nil) (e nil)) (set-buffer buf) (pop-to-buffer buf) (setq s (point)) (insert "[ DROP TARGET 1]") (setq e (point)) (setq ext (make-extent s e)) (set-extent-property ext 'experimental-dragdrop-drop-functions '((do-nothing t t) (dnd-drop-message t t "on target 1"))) (set-extent-property ext 'mouse-face 'highlight) (insert " ") (setq s (point)) (insert "[ DROP TARGET 2]") (setq e (point)) (setq ext (make-extent s e)) (set-extent-property ext 'experimental-dragdrop-drop-functions '((dnd-drop-message t t "on target 2"))) (set-extent-property ext 'mouse-face 'highlight) (insert " ") (setq s (point)) (insert "[ DROP TARGET 3]") (setq e (point)) (setq ext (make-extent s e)) (set-extent-property ext 'experimental-dragdrop-drop-functions '((dnd-drop-message t t "on target 3"))) (set-extent-property ext 'mouse-face 'highlight) (newline 2))) (defun make-drag-starters () (let ((buf (get-buffer-create "*DND misc-user extent test buffer*")) (s nil) (e nil) (ext nil) (kmap nil)) (set-buffer buf) (pop-to-buffer buf) (erase-buffer buf) (insert "Try to drag data from one of the upper extents to one\nof the lower extents. Make sure that your minibuffer is big\ncause it is used to display the data.\n\nYou may also try to select some of this text and drag it with button2.\n\nTo ") (setq s (point)) (insert "EXIT") (setq e (point)) (insert " this demo, press 'q'.") (setq ext (make-extent s e)) (setq kmap (make-keymap)) (define-key kmap [button1] 'end-dnd-demo) (set-extent-property ext 'keymap kmap) (set-extent-property ext 'mouse-face 'highlight) (newline 2) (setq s (point)) (insert "[ TEXT DRAG TEST ]") (setq e (point)) (setq ext (make-extent s e)) (set-extent-property ext 'mouse-face 'isearch) (setq kmap (make-keymap)) (define-key kmap [button1] 'text-drag) (set-extent-property ext 'keymap kmap) (insert " ") (setq s (point)) (insert "[ FILE DRAG TEST ]") (setq e (point)) (setq ext (make-extent s e)) (set-extent-property ext 'mouse-face 'isearch) (setq kmap (make-keymap)) (if (featurep 'cde) (define-key kmap [button1] 'cde-file-drag) (define-key kmap [button1] 'file-drag)) (set-extent-property ext 'keymap kmap) (insert " ") (setq s (point)) (insert "[ FILES DRAG TEST ]") (setq e (point)) (setq ext (make-extent s e)) (set-extent-property ext 'mouse-face 'isearch) (setq kmap (make-keymap)) (define-key kmap [button1] 'files-drag) (set-extent-property ext 'keymap kmap) (insert " ") (setq s (point)) (insert "[ URL DRAG TEST ]") (setq e (point)) (setq ext (make-extent s e)) (set-extent-property ext 'mouse-face 'isearch) (setq kmap (make-keymap)) (if (featurep 'cde) (define-key kmap [button1] 'cde-file-drag) (define-key kmap [button1] 'url-drag)) (set-extent-property ext 'keymap kmap) (newline 3))) (defun text-drag (event) (interactive "@e") (start-drag event "That's a test")) (defun file-drag (event) (interactive "@e") (start-drag event "/tmp/DropTest.xpm" 2)) (defun cde-file-drag (event) (interactive "@e") (start-drag event '("/tmp/DropTest.xpm") t)) (defun url-drag (event) (interactive "@e") (start-drag event "http://www.xemacs.org/" 8)) (defun files-drag (event) (interactive "@e") (start-drag event '("/tmp/DropTest.html" "/tmp/DropTest.xpm" "/tmp/DropTest.tex") 3)) (setq experimental-dragdrop-drop-functions '((do-nothing t t) ;; CDE does not have any button info... (dnd-drop-message 0 t "cde-drop somewhere else") (dnd-drop-message 2 t "region somewhere else") (dnd-drop-message 1 t "drag-source somewhere else") (do-nothing t t))) (make-drag-starters) (make-drop-targets) (defun end-dnd-demo () (interactive) (global-set-key [button2] button2-func) (bury-buffer)) (setq lmap (make-keymap)) (use-local-map lmap) (local-set-key [q] 'end-dnd-demo) (setq button2-func (lookup-key global-map [button2])) (global-set-key [button2] 'start-region-drag)