Mercurial > hg > xemacs-beta
view lisp/gtk-widget-accessors.el @ 4697:0d6d0edf1253
lisp beginning-end-of-defun-function Changelog entry
hg diff
diff -r ecc468b62551 lisp/ChangeLog
--- a/lisp/ChangeLog Mon Sep 21 21:40:35 2009 +0200
+++ b/lisp/ChangeLog Tue Sep 22 21:11:51 2009 +0200
@@ -1,3 +1,12 @@ 2009-09-20 Aidan Kehoe <kehoea@parhasa
+2009-09-22 Andreas Roehler <andreas.roehler@online.de>
+
+ * lisp.el (beginning-of-defun-raw):
+ new variable: beginning-of-defun-function,
+ beginning-of-defun may call FUNCTION determining start position
+ * lisp.el (end-of-defun):
+ new variable: end-of-defun-function,
+ end-of-defun may call FUNCTION determining the end position
+
;;;;;;;;;;;;;;;;;;;;;;;;
hg diff -p -r 4695 -r 4696
diff -r fee33ab25966 -r ecc468b62551 lisp/lisp.el
--- a/lisp/lisp.el Sun Sep 20 23:50:05 2009 +0100
+++ b/lisp/lisp.el Mon Sep 21 21:40:35 2009 +0200
@@ -155,6 +155,21 @@ Negative arg -N means kill N sexps after
(interactive "p")
(kill-sexp (- (or arg 1))))
+
+;; derived stuff from GNU Emacs
+(defvar beginning-of-defun-function nil
+ "If non-nil, function for `beginning-of-defun-raw' to call.
+This is used to find the beginning of the defun instead of using the
+normal recipe (see `beginning-of-defun'). Modes can define this
+if defining `defun-prompt-regexp' is not sufficient to handle the mode's
+needs.")
+
+(defvar end-of-defun-function nil
+ "If non-nil, function for `end-of-defun' to call.
+This is used to find the end of the defun instead of using the normal
+recipe (see `end-of-defun'). Modes can define this if the
+normal method is not appropriate.")
+
(defun beginning-of-defun (&optional arg)
"Move backward to the beginning of a defun.
With argument, do it that many times. Negative arg -N
@@ -175,13 +190,17 @@ This is identical to beginning-of-defun,
This is identical to beginning-of-defun, except that point does not move
to the beginning of the line when `defun-prompt-regexp' is non-nil."
(interactive "p")
- (and arg (< arg 0) (not (eobp)) (forward-char 1))
- (and (re-search-backward (if defun-prompt-regexp
- (concat "^\\s(\\|"
- "\\(" defun-prompt-regexp "\\)\\s(")
- "^\\s(")
- nil 'move (or arg 1))
- (progn (goto-char (1- (match-end 0)))) t))
+ ;; (and arg (< arg 0) (not (eobp)) (forward-char 1))
+ (unless arg (setq arg 1))
+ (cond
+ (beginning-of-defun-function
+ (funcall beginning-of-defun-function arg))
+ (t (re-search-backward (if defun-prompt-regexp
+ (concat "^\\s(\\|"
+ "\\(" defun-prompt-regexp "\\)\\s(")
+ "^\\s(")
+ nil 'move (or arg 1))
+ (progn (goto-char (1- (match-end 0)))) t)))
;; XEmacs change (optional buffer parameter)
(defun buffer-end (arg &optional buffer)
@@ -198,6 +217,10 @@ the open-parenthesis that starts a defun
;; XEmacs change (for zmacs regions)
(interactive "_p")
(if (or (null arg) (= arg 0)) (setq arg 1))
+ (if end-of-defun-function
+ (if (> arg 0)
+ (dotimes (i arg)
+ (funcall end-of-defun-function)))
(let ((first t))
(while (and (> arg 0) (< (point) (point-max)))
(let ((pos (point))) ; XEmacs -- remove unused npos.
@@ -229,7 +252,7 @@ the open-parenthesis that starts a defun
(if (looking-at "\\s<\\|\n")
(forward-line 1)))
(goto-char (point-min)))))
- (setq arg (1+ arg)))))
+ (setq arg (1+ arg))))))
(defun mark-defun ()
"Put mark at end of this defun, point at beginning.
| author | Andreas Roehler <andreas.roehler@online.de> |
|---|---|
| date | Tue, 22 Sep 2009 21:14:03 +0200 |
| parents | 11502791fc1c |
| children | db7068430402 |
line wrap: on
line source
(globally-declare-fboundp '(gtk-fundamental-type)) (require 'gtk-ffi) (defconst GTK_TYPE_INVALID 0) (defconst GTK_TYPE_NONE 1) (defconst GTK_TYPE_CHAR 2) (defconst GTK_TYPE_UCHAR 3) (defconst GTK_TYPE_BOOL 4) (defconst GTK_TYPE_INT 5) (defconst GTK_TYPE_UINT 6) (defconst GTK_TYPE_LONG 7) (defconst GTK_TYPE_ULONG 8) (defconst GTK_TYPE_FLOAT 9) (defconst GTK_TYPE_DOUBLE 10) (defconst GTK_TYPE_STRING 11) (defconst GTK_TYPE_ENUM 12) (defconst GTK_TYPE_FLAGS 13) (defconst GTK_TYPE_BOXED 14) (defconst GTK_TYPE_POINTER 15) (defconst GTK_TYPE_SIGNAL 16) (defconst GTK_TYPE_ARGS 17) (defconst GTK_TYPE_CALLBACK 18) (defconst GTK_TYPE_C_CALLBACK 19) (defconst GTK_TYPE_FOREIGN 20) (defconst GTK_TYPE_OBJECT 21) (defconst gtk-value-accessor-names '("INVALID" "NONE" "CHAR" "UCHAR" "BOOL" "INT" "UINT" "LONG" "ULONG" "FLOAT" "DOUBLE" "STRING" "ENUM" "FLAGS" "BOXED" "POINTER" "SIGNAL" "ARGS" "CALLBACK" "C_CALLBACK" "FOREIGN" "OBJECT")) (defun define-widget-accessors (gtk-class wrapper prefix args) "Output stub C code to access parts of a widget from lisp. GTK-CLASS is the GTK class to grant access to. WRAPPER is a fragment to construct GTK C macros for typechecking/etc. (ie: WIDGET) ARGS is a list of (type . name) cons cells. Defines a whole slew of functions to access & set the slots in the structure." (set-buffer (get-buffer-create "emacs-widget-accessors.c")) (goto-char (point-max)) (let ((arg) (base-arg-type nil) (lisp-func-name nil) (c-func-name nil) (func-names nil)) (setq gtk-class (symbol-name gtk-class) wrapper (upcase wrapper)) (while (setq arg (pop args)) (setq lisp-func-name (format "gtk-%s-%s" prefix (cdr arg)) lisp-func-name (replace-in-string lisp-func-name "_" "-") c-func-name (concat "F" (replace-in-string lisp-func-name "-" "_"))) (insert "DEFUN (\"" lisp-func-name "\", " c-func-name ", 1, 1, 0, /*\n" "Access the `" (symbol-name (cdr arg)) "' slot of OBJ, a " gtk-class " object.\n" "*/\n" "\t(obj))\n" "{\n" (format "\t%s *the_obj = NULL;\n" gtk-class) "\tGtkArg arg;\n" "\n" "\tCHECK_GTK_OBJECT (obj);\n" "\n" (format "\tif (!GTK_IS_%s (XGTK_OBJECT (obj)->object))\n" wrapper) "\t{\n" (format "\t\twtaerror (\"Object is not a %s\", obj);\n" gtk-class) "\t};\n" "\n" (format "\tthe_obj = GTK_%s (XGTK_OBJECT (obj)->object);\n" wrapper) (format "\targ.type = gtk_type_from_name (\"%s\");\n" (symbol-name (car arg)))) ; (format "\targ.type = GTK_TYPE_%s;\n" (or ; (nth (gtk-fundamental-type (car arg)) ; gtk-value-accessor-names) ; (case (car arg) ; (GtkListOfString "STRING_LIST") ; (GtkListOfObject "OBJECT_LIST") ; (otherwise ; "POINTER"))))) (setq base-arg-type (gtk-fundamental-type (car arg))) (cond ((= base-arg-type GTK_TYPE_OBJECT) (insert (format "\tGTK_VALUE_OBJECT (arg) = GTK_OBJECT (the_obj->%s);" (cdr arg)))) ((or (= base-arg-type GTK_TYPE_POINTER) (= base-arg-type GTK_TYPE_BOXED)) (insert (format "\tGTK_VALUE_%s (arg) = (void *)the_obj->%s;" (nth (gtk-fundamental-type (car arg)) gtk-value-accessor-names) (cdr arg)))) (t (insert (format "\tGTK_VALUE_%s (arg) = the_obj->%s;" (or (nth (gtk-fundamental-type (car arg)) gtk-value-accessor-names) "POINTER") (cdr arg))))) (insert "\n" "\treturn (gtk_type_to_lisp (&arg));\n" "}\n\n") (push c-func-name func-names)) func-names)) (defun import-widget-accessors (file syms-function-name &rest description) "Import multiple widgets, and emit a suitable vars_of_foo() function for them.\n" (declare (special c-mode-common-hook c-mode-hook)) (let ((c-mode-common-hook nil) (c-mode-hook nil)) (find-file file)) (erase-buffer) (insert "/* This file was automatically generated by ../lisp/gtk-widget-accessors.el */\n" "/* DO NOT EDIT BY HAND!!! */\n") (let ((c-funcs nil)) (while description (setq c-funcs (nconc (define-widget-accessors (pop description) (pop description) (pop description) (pop description)) c-funcs))) (goto-char (point-max)) (insert "void " syms-function-name " (void)\n" "{\n\t" (mapconcat (lambda (x) (concat "DEFSUBR (" x ");")) c-funcs "\n\t") "\n}")) (save-buffer)) ;; Because the new FFI layer imports GTK types lazily, we need to load ;; up all of the gtk types we know about, or we get errors about ;; unknown GTK types later on. (mapatoms (lambda (sym) (if (string-match "gtk-[^-]+-get-type" (symbol-name sym)) (funcall sym)))) (import-widget-accessors "../src/emacs-widget-accessors.c" "syms_of_widget_accessors " 'GtkAdjustment "ADJUSTMENT" "adjustment" '((gfloat . lower) (gfloat . upper) (gfloat . value) (gfloat . step_increment) (gfloat . page_increment) (gfloat . page_size)) 'GtkWidget "WIDGET" "widget" '((GtkStyle . style) (GdkWindow . window) (GtkStateType . state) (GtkString . name) (GtkWidget . parent)) 'GtkButton "BUTTON" "button" '((GtkWidget . child) (gboolean . in_button) (gboolean . button_down)) 'GtkCombo "COMBO" "combo" '((GtkWidget . entry) (GtkWidget . button) (GtkWidget . popup) (GtkWidget . popwin) (GtkWidget . list)) 'GtkGammaCurve "GAMMA_CURVE" "gamma-curve" '((GtkWidget . table) (GtkWidget . curve) (gfloat . gamma) (GtkWidget . gamma_dialog) (GtkWidget . gamma_text)) 'GtkCheckMenuItem "CHECK_MENU_ITEM" "check-menu-item" '((gboolean . active)) 'GtkNotebook "NOTEBOOK" "notebook" '((GtkPositionType . tab_pos)) 'GtkText "TEXT" "text" '((GtkAdjustment . hadj) (GtkAdjustment . vadj)) 'GtkFileSelection "FILE_SELECTION" "file-selection" '((GtkWidget . dir_list) (GtkWidget . file_list) (GtkWidget . selection_entry) (GtkWidget . selection_text) (GtkWidget . main_vbox) (GtkWidget . ok_button) (GtkWidget . cancel_button) (GtkWidget . help_button) (GtkWidget . action_area)) 'GtkFontSelectionDialog "FONT_SELECTION_DIALOG" "font-selection-dialog" '((GtkWidget . fontsel) (GtkWidget . main_vbox) (GtkWidget . action_area) (GtkWidget . ok_button) (GtkWidget . apply_button) (GtkWidget . cancel_button)) 'GtkColorSelectionDialog "COLOR_SELECTION_DIALOG" "color-selection-dialog" '((GtkWidget . colorsel) (GtkWidget . main_vbox) (GtkWidget . ok_button) (GtkWidget . reset_button) (GtkWidget . cancel_button) (GtkWidget . help_button)) 'GtkDialog "DIALOG" "dialog" '((GtkWidget . vbox) (GtkWidget . action_area)) 'GtkInputDialog "INPUT_DIALOG" "input-dialog" '((GtkWidget . close_button) (GtkWidget . save_button)) 'GtkPlug "PLUG" "plug" '((GdkWindow . socket_window) (gint . same_app)) 'GtkObject "OBJECT" "object" '((guint . flags) (guint . ref_count)) 'GtkPaned "PANED" "paned" '((GtkWidget . child1) (GtkWidget . child2) (gboolean . child1_resize) (gboolean . child2_resize) (gboolean . child1_shrink) (gboolean . child2_shrink)) 'GtkCList "CLIST" "clist" '((gint . rows) (gint . columns) (GtkAdjustment . hadjustment) (GtkAdjustment . vadjustment) (GtkSortType . sort_type) (gint . focus_row) (gint . sort_column)) 'GtkList "LIST" "list" '((GtkListOfObject . children) (GtkListOfObject . selection)) 'GtkTree "TREE" "tree" '((GtkListOfObject . children) (GtkTree . root_tree) (GtkWidget . tree_owner) (GtkListOfObject . selection)) 'GtkTreeItem "TREE_ITEM" "tree-item" '((GtkWidget . subtree)) 'GtkScrolledWindow "SCROLLED_WINDOW" "scrolled-window" '((GtkWidget . hscrollbar) (GtkWidget . vscrollbar) (gboolean . hscrollbar_visible) (gboolean . vscrollbar_visible)) )
