;;; gnome-c-snippet.el --- GNOME-style code generation -*- lexical-binding: t; -*-
-;; Copyright (C) 2016 Daiki Ueno <ueno@gnu.org>
+;; Copyright (C) 2016 Free Software Foundation, Inc.
;; Author: Daiki Ueno <ueno@gnu.org>
;; Keywords: GNOME, C, coding style
-;; This file is not part of GNU Emacs.
+;; This file is part of GNU Emacs.
-;; This program 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 3 of the
-;; License, or (at your option) any later version.
+;; GNU Emacs 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 3 of the License, or
+;; (at your option) any later version.
-;; This program 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.
+;; GNU Emacs 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 this program. If not, see
-;; <http://www.gnu.org/licenses/>.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; FIXME: The snippets defined here could be rewritten in yasnippet
;;; Code:
"))
(defun gnome-c-snippet-insert-final-class-declaration (package
- class
- parent-package
- parent-class)
+ class
+ parent-package
+ parent-class)
"Insert final class declaration for PACKAGE and CLASS."
(interactive
(append (gnome-c-snippet--read-package-and-class
nil))
(defun gnome-c-snippet-insert-derivable-class-declaration (package
- class
- parent-package
- parent-class)
+ class
+ parent-package
+ parent-class)
"Insert derivable class declaration for PACKAGE and CLASS."
(interactive
(append (gnome-c-snippet--read-package-and-class
t))
(defun gnome-c-snippet-insert-interface-definition (package
- iface
- parent-package
- parent-class)
+ iface
+ parent-package
+ parent-class)
"Insert class definition for PACKAGE and CLASS."
(interactive
(append (gnome-c-snippet--read-package-and-class
"))
(defun gnome-c-snippet--insert-class-definition (package
- class
- parent-package
- parent-class
- abstract)
+ class
+ parent-package
+ parent-class
+ abstract)
(insert "\
G_DEFINE_" (if abstract "ABSTRACT_" "") "TYPE (" (gnome-c-snippet--format-PackageClass package class) ", "
(gnome-c-snippet--format-package_class package class) ", " (gnome-c-snippet--format-PACKAGE parent-package) "_TYPE_" (gnome-c-snippet--format-CLASS parent-class) ")
"))
(defun gnome-c-snippet-insert-class-definition (package
- class
- parent-package
- parent-class)
+ class
+ parent-package
+ parent-class)
"Insert class definition for PACKAGE and CLASS."
(interactive
(append (gnome-c-snippet--read-package-and-class
'gnome-c-snippet-parent-package
'gnome-c-snippet-parent-class)))
(gnome-c-snippet--insert-class-definition package
- class
- parent-package
- parent-class
- nil))
+ class
+ parent-package
+ parent-class
+ nil))
(defun gnome-c-snippet-insert-abstract-class-definition (package
- class
- parent-package
- parent-class)
+ class
+ parent-package
+ parent-class)
"Insert abstract class definition for PACKAGE and CLASS."
(interactive
(append (gnome-c-snippet--read-package-and-class
'gnome-c-snippet-parent-package
'gnome-c-snippet-parent-class)))
(gnome-c-snippet--insert-class-definition package
- class
- parent-package
- parent-class
- t))
+ class
+ parent-package
+ parent-class
+ t))
(defun gnome-c-snippet-insert-constructor (package class)
"Insert 'constructor' vfunc of GObjectClass for PACKAGE and CLASS."
(if gnome-c-snippet-align-arglist
(progn
(goto-char arglist-start)
- (gnome-c-align-at-point))
+ (gnome-c-align-arglist-at-point))
(indent-region arglist-start (point)))
(goto-char body-start)
(insert "{
" (gnome-c-snippet--format-PackageClass package class) " *self = "
(gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
- G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->constructed (object);
+ G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->constructed (type, n_construct_properties, construct_properties);
}
")
(indent-region body-start (point))))
(if gnome-c-snippet-align-arglist
(progn
(goto-char arglist-start)
- (gnome-c-align-at-point))
+ (gnome-c-align-arglist-at-point))
(indent-region arglist-start (point)))
(goto-char body-start)
(insert "{
(if gnome-c-snippet-align-arglist
(progn
(goto-char arglist-start)
- (gnome-c-align-at-point))
+ (gnome-c-align-arglist-at-point))
(indent-region arglist-start (point)))
(goto-char body-start)
(insert "{
" (gnome-c-snippet--format-PackageClass package class) " *self = "
-(gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
+ (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
switch (prop_id)
{
")
(indent-region body-start (point))))
+(defun gnome-c-snippet-insert-dispatch_properties_changed (package class)
+ "Insert 'dispatch_properties_changed vfunc of GObjectClass for
+PACKAGE and CLASS."
+ (interactive
+ (gnome-c-snippet--read-package-and-class
+ nil nil
+ 'gnome-c-snippet-package
+ 'gnome-c-snippet-class))
+ (let (arglist-start body-start)
+ (insert "\
+static void
+" (gnome-c-snippet--format-package_class package class) "_dispatch_properties_changed (")
+ (setq arglist-start (point-marker))
+ (insert "GObject *object,
+guint n_pspecs,
+GParamSpec **pspecs)\n")
+ (setq body-start (point-marker))
+ (if gnome-c-snippet-align-arglist
+ (progn
+ (goto-char arglist-start)
+ (gnome-c-align-arglist-at-point))
+ (indent-region arglist-start (point)))
+ (goto-char body-start)
+ (insert "{
+ " (gnome-c-snippet--format-PackageClass package class) " *self = "
+ (gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
+
+ G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->dispatch_properties_changed (object, n_pspecs, pspecs);
+}
+")
+ (indent-region body-start (point))))
+
(defun gnome-c-snippet-insert-notify (package class)
"Insert 'notify' vfunc of GObjectClass for PACKAGE and CLASS."
(interactive
nil nil
'gnome-c-snippet-package
'gnome-c-snippet-class))
- (let (body-start)
+ (let (arglist-start body-start)
(insert "\
static void
-" (gnome-c-snippet--format-package_class package class) "_notify (GObject *object)\n")
+" (gnome-c-snippet--format-package_class package class) "_notify (")
+ (setq arglist-start (point-marker))
+ (insert "GObject *object,
+GParamSpec *pspec)\n")
(setq body-start (point-marker))
+ (if gnome-c-snippet-align-arglist
+ (progn
+ (goto-char arglist-start)
+ (gnome-c-align-arglist-at-point))
+ (indent-region arglist-start (point)))
(insert "{
" (gnome-c-snippet--format-PackageClass package class) " *self = "
(gnome-c-snippet--format-PACKAGE_CLASS package class) " (object);
- G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->finalize (object);
+ G_OBJECT_CLASS (" (gnome-c-snippet--format-package_class package class) "_parent_class)->notify (object, pspec);
}
")
(indent-region body-start (point))))
("GObjectClass.get_property" . gnome-c-snippet-insert-get_property)
("GObjectClass.dispose" . gnome-c-snippet-insert-dispose)
("GObjectClass.finalize" . gnome-c-snippet-insert-finalize)
- ;; GObjectClass.dispatch_properties_changed
+ ("GObjectClass.dispatch_properties_changed" .
+ gnome-c-snippet-insert-dispatch_properties_changed)
("GObjectClass.notify" . gnome-c-snippet-insert-notify)
("GObjectClass.contructed" . gnome-c-snippet-insert-constructed)))