Mercurial > hg > xemacs-beta
view lisp/dragdrop.el @ 4981:4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
-------------------- ChangeLog entries follow: --------------------
modules/ChangeLog addition:
2010-02-05 Ben Wing <ben@xemacs.org>
* postgresql/postgresql.c:
* postgresql/postgresql.c (CHECK_LIVE_CONNECTION):
* postgresql/postgresql.c (Fpq_connectdb):
* postgresql/postgresql.c (Fpq_connect_start):
* postgresql/postgresql.c (Fpq_lo_import):
* postgresql/postgresql.c (Fpq_lo_export):
* ldap/eldap.c (Fldap_open):
* ldap/eldap.c (Fldap_search_basic):
* ldap/eldap.c (Fldap_add):
* ldap/eldap.c (Fldap_modify):
* ldap/eldap.c (Fldap_delete):
* canna/canna_api.c (Fcanna_initialize):
* canna/canna_api.c (Fcanna_store_yomi):
* canna/canna_api.c (Fcanna_parse):
* canna/canna_api.c (Fcanna_henkan_begin):
EXTERNAL_TO_C_STRING returns its argument instead of storing it
in a parameter, and is renamed to EXTERNAL_TO_ITEXT. Similar
things happen to related macros. See entry in src/ChangeLog.
More Mule-izing of postgresql.c. Extract out common code
between `pq-connectdb' and `pq-connect-start'. Fix places
that signal an error string using a formatted string to instead
follow the standard and have a fixed reason followed by the
particular error message stored as one of the frobs.
src/ChangeLog addition:
2010-02-05 Ben Wing <ben@xemacs.org>
* console-msw.c (write_string_to_mswindows_debugging_output):
* console-msw.c (Fmswindows_message_box):
* console-x.c (x_perhaps_init_unseen_key_defaults):
* console.c:
* database.c (dbm_get):
* database.c (dbm_put):
* database.c (dbm_remove):
* database.c (berkdb_get):
* database.c (berkdb_put):
* database.c (berkdb_remove):
* database.c (Fopen_database):
* device-gtk.c (gtk_init_device):
* device-msw.c (msprinter_init_device_internal):
* device-msw.c (msprinter_default_printer):
* device-msw.c (msprinter_init_device):
* device-msw.c (sync_printer_with_devmode):
* device-msw.c (Fmsprinter_select_settings):
* device-x.c (sanity_check_geometry_resource):
* device-x.c (Dynarr_add_validified_lisp_string):
* device-x.c (x_init_device):
* device-x.c (Fx_put_resource):
* device-x.c (Fx_valid_keysym_name_p):
* device-x.c (Fx_set_font_path):
* dialog-msw.c (push_lisp_string_as_unicode):
* dialog-msw.c (handle_directory_dialog_box):
* dialog-msw.c (handle_file_dialog_box):
* dialog-x.c (dbox_descriptor_to_widget_value):
* editfns.c (Fformat_time_string):
* editfns.c (Fencode_time):
* editfns.c (Fset_time_zone_rule):
* emacs.c (make_argc_argv):
* emacs.c (Fdump_emacs):
* emodules.c (emodules_load):
* eval.c:
* eval.c (maybe_signal_error_1):
* event-msw.c (Fdde_alloc_advise_item):
* event-msw.c (mswindows_dde_callback):
* event-msw.c (mswindows_wnd_proc):
* fileio.c (report_error_with_errno):
* fileio.c (Fsysnetunam):
* fileio.c (Fdo_auto_save):
* font-mgr.c (extract_fcapi_string):
* font-mgr.c (Ffc_config_app_font_add_file):
* font-mgr.c (Ffc_config_app_font_add_dir):
* font-mgr.c (Ffc_config_filename):
* frame-gtk.c (gtk_set_frame_text_value):
* frame-gtk.c (gtk_create_widgets):
* frame-msw.c (mswindows_init_frame_1):
* frame-msw.c (mswindows_set_title_from_ibyte):
* frame-msw.c (msprinter_init_frame_3):
* frame-x.c (x_set_frame_text_value):
* frame-x.c (x_set_frame_properties):
* frame-x.c (start_drag_internal_1):
* frame-x.c (x_cde_transfer_callback):
* frame-x.c (x_create_widgets):
* glyphs-eimage.c (my_jpeg_output_message):
* glyphs-eimage.c (jpeg_instantiate):
* glyphs-eimage.c (gif_instantiate):
* glyphs-eimage.c (png_instantiate):
* glyphs-eimage.c (tiff_instantiate):
* glyphs-gtk.c (xbm_instantiate_1):
* glyphs-gtk.c (gtk_xbm_instantiate):
* glyphs-gtk.c (gtk_xpm_instantiate):
* glyphs-gtk.c (gtk_xface_instantiate):
* glyphs-gtk.c (cursor_font_instantiate):
* glyphs-gtk.c (gtk_redisplay_widget):
* glyphs-gtk.c (gtk_widget_instantiate_1):
* glyphs-gtk.c (gtk_add_tab_item):
* glyphs-msw.c (mswindows_xpm_instantiate):
* glyphs-msw.c (bmp_instantiate):
* glyphs-msw.c (mswindows_resource_instantiate):
* glyphs-msw.c (xbm_instantiate_1):
* glyphs-msw.c (mswindows_xbm_instantiate):
* glyphs-msw.c (mswindows_xface_instantiate):
* glyphs-msw.c (mswindows_redisplay_widget):
* glyphs-msw.c (mswindows_widget_instantiate):
* glyphs-msw.c (add_tree_item):
* glyphs-msw.c (add_tab_item):
* glyphs-msw.c (mswindows_combo_box_instantiate):
* glyphs-msw.c (mswindows_widget_query_string_geometry):
* glyphs-x.c (x_locate_pixmap_file):
* glyphs-x.c (xbm_instantiate_1):
* glyphs-x.c (x_xbm_instantiate):
* glyphs-x.c (extract_xpm_color_names):
* glyphs-x.c (x_xpm_instantiate):
* glyphs-x.c (x_xface_instantiate):
* glyphs-x.c (autodetect_instantiate):
* glyphs-x.c (safe_XLoadFont):
* glyphs-x.c (cursor_font_instantiate):
* glyphs-x.c (x_redisplay_widget):
* glyphs-x.c (Fchange_subwindow_property):
* glyphs-x.c (x_widget_instantiate):
* glyphs-x.c (x_tab_control_redisplay):
* glyphs.c (pixmap_to_lisp_data):
* gui-x.c (menu_separator_style_and_to_external):
* gui-x.c (add_accel_and_to_external):
* gui-x.c (button_item_to_widget_value):
* hpplay.c (player_error_internal):
* hpplay.c (play_sound_file):
* hpplay.c (play_sound_data):
* intl.c (Fset_current_locale):
* lisp.h:
* menubar-gtk.c (gtk_xemacs_set_accel_keys):
* menubar-msw.c (populate_menu_add_item):
* menubar-msw.c (populate_or_checksum_helper):
* menubar-x.c (menu_item_descriptor_to_widget_value_1):
* nt.c (init_user_info):
* nt.c (get_long_basename):
* nt.c (nt_get_resource):
* nt.c (init_mswindows_environment):
* nt.c (get_cached_volume_information):
* nt.c (mswindows_readdir):
* nt.c (read_unc_volume):
* nt.c (mswindows_stat):
* nt.c (mswindows_getdcwd):
* nt.c (mswindows_executable_type):
* nt.c (Fmswindows_short_file_name):
* ntplay.c (nt_play_sound_file):
* objects-gtk.c:
* objects-gtk.c (gtk_valid_color_name_p):
* objects-gtk.c (gtk_initialize_font_instance):
* objects-gtk.c (gtk_font_list):
* objects-msw.c (font_enum_callback_2):
* objects-msw.c (parse_font_spec):
* objects-x.c (x_parse_nearest_color):
* objects-x.c (x_valid_color_name_p):
* objects-x.c (x_initialize_font_instance):
* objects-x.c (x_font_instance_truename):
* objects-x.c (x_font_list):
* objects-xlike-inc.c (XFUN):
* objects-xlike-inc.c (xft_find_charset_font):
* process-nt.c (mswindows_report_winsock_error):
* process-nt.c (nt_create_process):
* process-nt.c (get_internet_address):
* process-nt.c (nt_open_network_stream):
* process-unix.c:
* process-unix.c (allocate_pty):
* process-unix.c (get_internet_address):
* process-unix.c (unix_canonicalize_host_name):
* process-unix.c (unix_open_network_stream):
* realpath.c:
* select-common.h (lisp_data_to_selection_data):
* select-gtk.c (symbol_to_gtk_atom):
* select-gtk.c (atom_to_symbol):
* select-msw.c (symbol_to_ms_cf):
* select-msw.c (mswindows_register_selection_data_type):
* select-x.c (symbol_to_x_atom):
* select-x.c (x_atom_to_symbol):
* select-x.c (hack_motif_clipboard_selection):
* select-x.c (Fx_store_cutbuffer_internal):
* sound.c (Fplay_sound_file):
* sound.c (Fplay_sound):
* sound.h (sound_perror):
* sysdep.c:
* sysdep.c (qxe_allocating_getcwd):
* sysdep.c (qxe_execve):
* sysdep.c (copy_in_passwd):
* sysdep.c (qxe_getpwnam):
* sysdep.c (qxe_ctime):
* sysdll.c (dll_open):
* sysdll.c (dll_function):
* sysdll.c (dll_variable):
* sysdll.c (search_linked_libs):
* sysdll.c (dll_error):
* sysfile.h:
* sysfile.h (PATHNAME_CONVERT_OUT_TSTR):
* sysfile.h (PATHNAME_CONVERT_OUT_UTF_8):
* sysfile.h (PATHNAME_CONVERT_OUT):
* sysfile.h (LISP_PATHNAME_CONVERT_OUT):
* syswindows.h (ITEXT_TO_TSTR):
* syswindows.h (LOCAL_FILE_FORMAT_TO_TSTR):
* syswindows.h (TSTR_TO_LOCAL_FILE_FORMAT):
* syswindows.h (LOCAL_FILE_FORMAT_TO_INTERNAL_MSWIN):
* syswindows.h (LISP_LOCAL_FILE_FORMAT_MAYBE_URL_TO_TSTR):
* text.h:
* text.h (eicpy_ext_len):
* text.h (enum new_dfc_src_type):
* text.h (EXTERNAL_TO_ITEXT):
* text.h (GET_STRERROR):
* tooltalk.c (check_status):
* tooltalk.c (Fadd_tooltalk_message_arg):
* tooltalk.c (Fadd_tooltalk_pattern_attribute):
* tooltalk.c (Fadd_tooltalk_pattern_arg):
* win32.c (tstr_to_local_file_format):
* win32.c (mswindows_lisp_error_1):
* win32.c (mswindows_report_process_error):
* win32.c (Fmswindows_shell_execute):
* win32.c (mswindows_read_link_1):
Changes involving external/internal format conversion,
mostly code cleanup and renaming.
1. Eliminate the previous macros like LISP_STRING_TO_EXTERNAL
that stored its result in a parameter. The new version of
LISP_STRING_TO_EXTERNAL returns its result through the
return value, same as the previous NEW_LISP_STRING_TO_EXTERNAL.
Use the new-style macros throughout the code.
2. Rename C_STRING_TO_EXTERNAL and friends to ITEXT_TO_EXTERNAL,
in keeping with overall naming rationalization involving
Itext and related types.
Macros involved in previous two:
EXTERNAL_TO_C_STRING -> EXTERNAL_TO_ITEXT
EXTERNAL_TO_C_STRING_MALLOC -> EXTERNAL_TO_ITEXT_MALLOC
SIZED_EXTERNAL_TO_C_STRING -> SIZED_EXTERNAL_TO_ITEXT
SIZED_EXTERNAL_TO_C_STRING_MALLOC -> SIZED_EXTERNAL_TO_ITEXT_MALLOC
C_STRING_TO_EXTERNAL -> ITEXT_TO_EXTERNAL
C_STRING_TO_EXTERNAL_MALLOC -> ITEXT_TO_EXTERNAL_MALLOC
LISP_STRING_TO_EXTERNAL
LISP_STRING_TO_EXTERNAL_MALLOC
LISP_STRING_TO_TSTR
C_STRING_TO_TSTR -> ITEXT_TO_TSTR
TSTR_TO_C_STRING -> TSTR_TO_ITEXT
The following four still return their values through parameters,
since they have more than one value to return:
C_STRING_TO_SIZED_EXTERNAL -> ITEXT_TO_SIZED_EXTERNAL
LISP_STRING_TO_SIZED_EXTERNAL
C_STRING_TO_SIZED_EXTERNAL_MALLOC -> ITEXT_TO_SIZED_EXTERNAL_MALLOC
LISP_STRING_TO_SIZED_EXTERNAL_MALLOC
Sometimes additional casts had to be inserted, since the old
macros played strange games and completely defeated the type system
of the store params.
3. Rewrite many places where direct calls to TO_EXTERNAL_FORMAT
occurred with calls to one of the convenience macros listed above,
or to make_extstring().
4. Eliminate SIZED_C_STRING macros (they were hardly used, anyway)
and use a direct call to TO_EXTERNAL_FORMAT or TO_INTERNAL_FORMAT.
4. Use LISP_PATHNAME_CONVERT_OUT in many places instead of something
like LISP_STRING_TO_EXTERNAL(..., Qfile_name).
5. Eliminate some temporary variables that are no longer necessary
now that we return a value rather than storing it into a variable.
6. Some Mule-izing in database.c.
7. Error functions:
-- A bit of code cleanup in maybe_signal_error_1.
-- Eliminate report_file_type_error; it's just an alias for
signal_error_2 with params in a different order.
-- Fix some places in the hostname-handling code that directly
inserted externally-retrieved error strings into the
supposed ASCII "reason" param instead of doing the right thing
and sticking text descriptive of what was going on in "reason"
and putting the external message in a frob.
8. Use Ascbyte instead of CIbyte in process-unix.c and maybe one
or two other places.
9. Some code cleanup in copy_in_passwd() in sysdep.c.
10. Fix a real bug due to accidental variable shadowing in
tstr_to_local_file_format() in win32.c.
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Fri, 05 Feb 2010 11:02:24 -0600 |
parents | bc4f2511bbea |
children | f00192e1cd49 308d34e9f07d |
line wrap: on
line source
;;; dragdrop.el --- window system-independent Drag'n'Drop support. ;; Copyright (C) 1998 Oliver Graf <ograf@fga.de> ;; Maintainer: XEmacs Development Team, Oliver Graf <ograf@fga.de> ;; Keywords: mouse, gui, dumped ;; 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. ;;; Synched up with: Not in FSF. ;;; Commentary: ;; This file is dumped with XEmacs (when drag'n'drop support is compiled in). ;;; Code: ;; we need mouse-set-point (require 'mouse) (provide 'dragdrop) ;; I think this is a better name for the custom group ;; looks better in the menu and the group display as dragdrop ;; Anyway: is dragdrop- a good prefix for all this? ;; What if someone trys drop<TAB> in the minibuffer? (defgroup drag-n-drop nil "*{EXPERIMENTAL} Window system-independent drag'n'drop support." :group 'editing) (defcustom dragdrop-drop-at-point nil "*{EXPERIMENTAL} If non-nil, drop text at the cursor location. Otherwise, the cursor will be moved to the location of the pointer drop before text is inserted." :type 'boolean :group 'drag-n-drop) (defcustom dragdrop-autoload-tm-view nil "*{EXPERIMENTAL} If non-nil, autoload tm-view to decode MIME data. Otherwise, the buffer is only decoded if tm-view is already available." :type 'boolean :group 'drag-n-drop) ;; the widget for editing the drop-functions (define-widget 'dragdrop-function-widget 'list "*{EXPERIMENTAL} Widget for editing drop dispatch functions." :args `((choice :tag "Function" (function-item experimental-dragdrop-drop-url-default) (function-item experimental-dragdrop-drop-mime-default) (function-item experimental-dragdrop-drop-log-function) (function :tag "Other" nil)) (choice :tag "Button" :value t (choice-item :tag "Ignore" t) (choice-item 0) (choice-item 1) (choice-item 2) (choice-item 3) (choice-item 4) (choice-item 5) (choice-item 6) (choice-item 7)) (radio-button-choice :tag "Modifiers" (const :tag "Ignore Modifier Keys" t) (checklist :greedy t :format "Modifier Keys:\n%v" :extra-offset 6 (const shift) (const control) (const meta) (const alt) (const hyper) (const super))) (repeat :inline t :value nil :tag "Extra Function Arguments" (sexp :tag "Arg" :value nil))) :value '(nil t t)) (defcustom experimental-dragdrop-drop-functions '((experimental-dragdrop-drop-url-default t t) (experimental-dragdrop-drop-mime-default t t)) "*{EXPERIMENTAL} This is the standart drop function search list. Each element is a list of a function, a button selector, a modifier selector and optional argumets to the function call. The function must accept at least two arguments: first is the event of the drop, second the object data, followed by any of the optional arguments provided in this list. The functions are called in order, until one returns t." :group 'drag-n-drop :type '(repeat dragdrop-function-widget)) (defgroup dnd-debug nil "*{EXPERIMENTAL} Drag'n'Drop debugging options." :group 'drag-n-drop) (defcustom dragdrop-drop-log nil "*{EXPERIMENTAL} If non-nil, every drop is logged. The name of the buffer is set in the custom 'dragdrop-drop-log-name" :group 'dnd-debug :type 'boolean) (defcustom dragdrop-drop-log-name "*drop log buffer*" "*{EXPERIMENTAL} The name of the buffer used to log drops. Set dragdrop-drop-log to non-nil to enable this feature." :group 'dnd-debug :type 'string) (defvar dragdrop-drop-log-buffer nil "*{EXPERIMENTAL} Buffer to log drops in debug mode.") ;; ;; Drop API ;; (defun dragdrop-drop-dispatch (object) "*{EXPERIMENTAL} This function identifies DROP type misc-user-events. It calls functions which will handle the drag." (let ((event current-mouse-event)) (and dragdrop-drop-log (experimental-dragdrop-drop-log-function event object)) (dragdrop-drop-find-functions event object))) (defun dragdrop-drop-find-functions (event object) "Finds valid drop-handle functions and executes them to dispose the drop. It does this by looking for extent-properties called 'experimental-dragdrop-drop-functions and for variables named like this." (catch 'dragdrop-drop-is-done (and (event-over-text-area-p event) ;; let's search the extents (catch 'dragdrop-extents-done (let ((window (event-window event)) (pos (event-point event)) (cpos (event-closest-point event)) (buffer nil)) (or window (throw 'dragdrop-extents-done nil)) (or pos (setq pos cpos)) (select-window window) (setq buffer (window-buffer)) (let ((ext (extent-at pos buffer 'experimental-dragdrop-drop-functions))) (while (not (eq ext nil)) (dragdrop-drop-do-functions (extent-property ext 'experimental-dragdrop-drop-functions) event object) (setq ext (extent-at pos buffer 'experimental-dragdrop-drop-functions ext))))))) ;; now look into the variable experimental-dragdrop-drop-functions (dragdrop-drop-do-functions experimental-dragdrop-drop-functions event object))) (defun dragdrop-compare-mods (first-mods second-mods) "Returns t if both first-mods and second-mods contain the same elements. Order is not important." (let ((moda (copy-sequence first-mods)) (modb (copy-sequence second-mods))) (while (and (not (eq moda ())) (not (eq modb ()))) (setq modb (delete (car moda) modb)) (setq moda (delete (car moda) moda))) (and (eq moda ()) (eq modb ())))) (defun dragdrop-drop-do-functions (drop-funs event object) "Calls all functions in drop-funs with object until one returns t. Returns t if one of drop-funs returns t. Otherwise returns nil." (let ((flist nil) (button (event-button event)) (mods (event-modifiers event))) (while (not (eq drop-funs ())) (setq flist (car drop-funs)) (and (or (eq (cadr flist) t) (= (cadr flist) button)) (or (eq (caddr flist) t) (dragdrop-compare-mods (caddr flist) mods)) (apply (car flist) `(,event ,object ,@(cdddr flist))) ;; (funcall (car flist) event object) (throw 'dragdrop-drop-is-done t)) (setq drop-funs (cdr drop-funs)))) nil) (defun experimental-dragdrop-drop-log-function (event object &optional message buffer) "*{EXPERIMENTAL} Logs any drops into a buffer. If buffer is nil, it inserts the data into a buffer called after dragdrop-drop-log-name. If dragdrop-drop-log is non-nil, this is done automatically for each drop. The function always returns nil." (save-excursion (cond ((buffer-live-p buffer) (set-buffer buffer)) ((stringp buffer) (set-buffer (get-buffer-create buffer))) ((buffer-live-p dragdrop-drop-log-buffer) (set-buffer dragdrop-drop-log-buffer)) (t (setq dragdrop-drop-log-buffer (get-buffer-create dragdrop-drop-log-name)) (set-buffer dragdrop-drop-log-buffer))) (insert (format "* %s: %s\n" (current-time-string) (if message message "received a drop"))) (insert (format " at %d,%d (%d,%d) with button %d and mods %s\n" (event-x event) (event-y event) (event-x-pixel event) (event-y-pixel event) (event-button event) (event-modifiers event))) (insert (format " data is of type %s (%d %s)\n" (cond ((eq (car object) 'dragdrop-URL) "URL") ((eq (car object) 'dragdrop-MIME) "MIME") (t "UNKNOWN")) (length (cdr object)) (if (= (length (cdr object)) 1) "element" "elements"))) (let ((i 1) (data (cdr object))) (while (not (eq data ())) (insert (format " Element %d: %S\n" i (car data))) (setq i (1+ i)) (setq data (cdr data)))) (insert "----------\n")) nil) (defun experimental-dragdrop-drop-url-default (event object) "*{EXPERIMENTAL} Default handler for dropped URL data. Finds files and URLs. Returns nil if object does not contain URL data." (cond ((eq (car object) 'dragdrop-URL) (let* ((data (cdr object)) (frame (event-channel event)) (x pop-up-windows) (window (or (event-window event) (frame-selected-window frame) (frame-highest-window frame 0)))) (setq pop-up-windows nil) (while (not (eq data ())) (cond ((dragdrop-is-some-url "file" (car data)) ;; if it is some file, pop it to a buffer (cond (window (select-window window))) (switch-to-buffer (find-file-noselect (substring (car data) 5)))) ;; to-do: open ftp URLs with efs... (t ;; some other URL, try to fire up some browser for it (if-fboundp 'browse-url (browse-url (car data)) (display-message 'error "Can't show URL, no browser selected")))) (undo-boundary) (setq data (cdr data))) (make-frame-visible frame) (setq pop-up-windows x) t)) (t nil))) (defun experimental-dragdrop-drop-mime-default (event object) "*{EXPERIMENTAL} Default handler for dropped MIME data. Inserts text into buffer, creates MIME buffers for other types. Returns nil if object does not contain MIME data." (cond ((eq (car object) 'dragdrop-MIME) (let ((ldata (cdr object)) (frame (event-channel event)) (x pop-up-windows) (data nil)) ;; how should this be handled??? ;; insert drops of text/* into buffer ;; create new buffer if pointer is outside buffer... ;; but there are many other ways... ;; ;; first thing: check if it's only text/plain and if the ;; drop happened inside some buffer. if yes insert it into ;; this buffer (hope it is not encoded in some MIME way) ;; ;; Remember: ("text/plain" "dosnotmatter" "somedata") ;; drops are inserted at mouse-point, if inside a buffer (while (not (eq ldata ())) (setq data (car ldata)) (if (and (listp data) (= (length data) 3) (listp (car data)) (stringp (caar data)) (string= (caar data) "text/plain") (event-over-text-area-p event)) (let ((window (event-window event))) (and window (select-window window)) (and (not dragdrop-drop-at-point) (mouse-set-point event)) (insert (caddr data))) (let ((buf (get-buffer-create "*MIME-Drop data*"))) (set-buffer buf) (pop-to-buffer buf nil frame) (or (featurep 'tm-view) (and dragdrop-autoload-tm-view (require 'tm-view))) (cond ((stringp data) ;; this is some raw MIME stuff ;; create some buffer and let tm do the job ;; ;; this is always the same buffer!!! ;; change? (erase-buffer) (insert data) (and (featurep 'tm-view) (declare-fboundp (mime/viewer-mode buf)))) ((and (listp data) (= (length data) 3)) ;; change the internal content-type representation to the ;; way tm does it ("content/type" (key . value)*) ;; but for now list will do the job ;; ;; this is always the same buffer!!! ;; change? (erase-buffer) (insert (caddr data)) (and (featurep 'tm-view) ;; this list of (car data) should be done before ;; enqueing the event (declare-fboundp (mime/viewer-mode buf (car data) (cadr data))))) (t (display-message 'error "Wrong drop data"))))) (undo-boundary) (setq ldata (cdr ldata))) (make-frame-visible frame) (setq pop-up-windows x)) t) (t nil))) (defun dragdrop-is-some-url (method url) "Returns true if method equals the start of url. If method does not end into ':' this is appended before the compare." (cond ((and (stringp url) (stringp method) (> (length url) (length method))) ;; is this ?: check efficient enough? (if (not (string= (substring method -1) ":")) (setq method (concat method ":"))) (string= method (substring url 0 (length method)))) (t nil))) ;; ;; Drag API ;; (defun experimental-dragdrop-drag (event object) "*{EXPERIMENTAL} The generic drag function. Tries to do the best with object in the selected protocol. Object must comply to the standart drag'n'drop object format." (error "Not implemented")) (defun experimental-dragdrop-drag-region (event begin end) "*{EXPERIMENTAL} Drag a region. This function uses special data types if the low-level protocol requires it. It does so by calling dragdrop-drag-pure-text." (experimental-dragdrop-drag-pure-text event (buffer-substring-no-properties begin end))) (defun experimental-dragdrop-drag-pure-text (event text) "*{EXPERIMENTAL} Drag text-only data. Takes care of special low-level protocol data types. Text must be a list of strings." (error "Not implemented")) (defun experimental-dragdrop-drag-pure-file (event file) "*{EXPERIMENTAL} Drag filepath-only data. Takes care of special low-level protocol data types. file must be a list of strings." (error "Not implemented")) ;; ;; The following ones come from frame.el but the better belong here ;; until changed ;; (defun cde-start-drag (event type data) "Implement the CDE drag operation. Calls the internal function cde-start-drag-internal to do the actual work." (interactive "_eXX") (if (featurep 'cde) ;; Avoid build-time doc string warning by calling the function ;; in the following roundabout way: (funcall (intern "cde-start-drag-internal") event type data) (error "CDE functionality not compiled in."))) (defun cde-start-drag-region (event begin end) "Implement the CDE drag operation for a region. Calls the internal function CDE-start-drag-internal to do the actual work. This always does buffer transfers." ;; Oliver Graf <ograf@fga.de> (interactive "_er") (if (featurep 'cde) (funcall (intern "cde-start-drag-internal") event nil (list (buffer-substring-no-properties begin end))) (error "CDE functionality not compiled in."))) (defun gtk-start-drag (event data &optional type) (interactive "esi") (if (featurep 'gtk) (declare-fboundp (gtk-start-drag-internal event data type)) (error "GTK functionality not compiled in."))) (defun gtk-start-drag-region (event begin end) (interactive "_er") (if (featurep 'gtk) (declare-fboundp (gtk-start-drag-internal event (buffer-substring-no-properties begin end) "text/plain")) (error "GTK functionality not compiled in."))) ;;; dragdrop.el ends here