SF.net SVN: geany:[4162] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Sun Sep 6 16:51:12 UTC 2009


Revision: 4162
          http://geany.svn.sourceforge.net/geany/?rev=4162&view=rev
Author:   eht16
Date:     2009-09-06 16:51:11 +0000 (Sun, 06 Sep 2009)

Log Message:
-----------
Add new plugin signal: "document-before-save".
Add get_line_end_position(), set_target_start(), set_target_end(), replace_target() to the plugin API (patch by Eugene Arshinov, thanks).
Add new plugin signal: "document-filetype-set" (closes #2852286).

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/THANKS
    trunk/doc/plugins.dox
    trunk/plugins/geanyfunctions.h
    trunk/src/document.c
    trunk/src/geanyobject.c
    trunk/src/geanyobject.h
    trunk/src/plugindata.h
    trunk/src/plugins.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2009-09-06 16:50:47 UTC (rev 4161)
+++ trunk/ChangeLog	2009-09-06 16:51:11 UTC (rev 4162)
@@ -17,6 +17,14 @@
  * src/build.c, src/project.c:
    Use NZV() macro instead of strlen() to check for empty strings.
    Remove the FOREACH_GEANYBUILDCMD_ENTRY() macro.
+ * doc/plugins.dox, plugins/geanyfunctions.h, src/document.c,
+   src/geanyobject.c, src/geanyobject.h, src/plugindata.h,
+   src/plugins.c, THANKS:
+   Add new plugin signal: "document-before-save".
+   Add get_line_end_position(), set_target_start(), set_target_end(),
+   replace_target() to the plugin API
+   (patch by Eugene Arshinov, thanks).
+   Add new plugin signal: "document-filetype-set" (closes #2852286).
 
 
 2009-09-04  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>

Modified: trunk/THANKS
===================================================================
--- trunk/THANKS	2009-09-06 16:50:47 UTC (rev 4161)
+++ trunk/THANKS	2009-09-06 16:51:11 UTC (rev 4162)
@@ -65,7 +65,7 @@
 Simon Treny <simon(dot)treny(at)free(dot)fr> - Documents sidebar stock icons patch
 Elias Pschernig <elias(at)users(dot)sourceforge(dot)net> - Recent Projects menu patch
 Jesse Mayes <plasmasheep(at)gmail(dot)com> - Tango'ish Save All icon
-Eugene Arshinov <earshinov(at)gmail(dot)com> - Reload color schemes, split lines KB patches
+Eugene Arshinov <earshinov(at)gmail(dot)com> - Reload color schemes, split lines KB patches, and more
 Jon Strait <jstrait(at)moonloop(dot)net> - Markdown filetype patch
 
 Translators:

Modified: trunk/doc/plugins.dox
===================================================================
--- trunk/doc/plugins.dox	2009-09-06 16:50:47 UTC (rev 4161)
+++ trunk/doc/plugins.dox	2009-09-06 16:51:11 UTC (rev 4162)
@@ -116,6 +116,20 @@
  *  @param user_data user data.
  *  @endsignaldef
  *
+ *  @signaldef document-before-save
+ *  @signalproto
+ *  void user_function(GObject *obj, GeanyDocument *doc, gpointer user_data);
+ *  @endsignalproto
+ *  @signaldesc
+ *  Sent before a document is saved.
+ *
+ *  You need to include "document.h" for the declaration of GeanyDocument.
+ *
+ *  @param obj a GeanyObject instance, should be ignored.
+ *  @param doc the document to be saved.
+ *  @param user_data user data.
+ *  @endsignaldef
+ *
  *  @signaldef document-save
  *  @signalproto
  *  void user_function(GObject *obj, GeanyDocument *doc, gpointer user_data);
@@ -130,6 +144,23 @@
  *  @param user_data user data.
  *  @endsignaldef
  *
+ *  @signaldef document-filetype-set
+ *  @signalproto
+ *  void user_function(GObject *obj, GeanyDocument *doc, GeanyFiletype *filetype_old, gpointer user_data);
+ *  @endsignalproto
+ *  @signaldesc
+ *  Sent after the filetype of a document has been changed.
+ *  The previous filetype object is passed but it can be NULL (e.g. at startup).
+ *  The new filetype can be read with: @code
+ *     GeanyFiletype *ft = doc->filetype;
+ *  @endcode
+ *
+ *  @param obj a GeanyObject instance, should be ignored.
+ *  @param doc the saved document.
+ *  @param filetype_old the previous filetype of the document.
+ *  @param user_data user data.
+ *  @endsignaldef
+ *
  *  @signaldef document-activate
  *  @signalproto
  *  void user_function(GObject *obj, GeanyDocument *doc, gpointer user_data);

Modified: trunk/plugins/geanyfunctions.h
===================================================================
--- trunk/plugins/geanyfunctions.h	2009-09-06 16:50:47 UTC (rev 4161)
+++ trunk/plugins/geanyfunctions.h	2009-09-06 16:51:11 UTC (rev 4162)
@@ -160,6 +160,14 @@
 	geany_functions->p_sci->get_selection_contents
 #define sci_set_font \
 	geany_functions->p_sci->set_font
+#define sci_get_line_end_position \
+	geany_functions->p_sci->get_line_end_position
+#define sci_set_target_start \
+	geany_functions->p_sci->set_target_start
+#define sci_set_target_end \
+	geany_functions->p_sci->set_target_end
+#define sci_replace_target \
+	geany_functions->p_sci->replace_target
 #define templates_get_template_fileheader \
 	geany_functions->p_templates->get_template_fileheader
 #define utils_str_equal \

Modified: trunk/src/document.c
===================================================================
--- trunk/src/document.c	2009-09-06 16:50:47 UTC (rev 4161)
+++ trunk/src/document.c	2009-09-06 16:51:11 UTC (rev 4162)
@@ -1720,8 +1720,10 @@
 /**
  *  Save the document. Saving includes replacing tabs by spaces,
  *  stripping trailing spaces and adding a final new line at the end of the file (all only if
- *  user enabled these features). The filetype is set again or auto-detected if it wasn't
- *  set yet. After all, the "document-save" signal is emitted for plugins.
+ *  user enabled these features). Then the "document-before-save" signal is emitted,
+ *  allowing plugins to modify the document before it is saved, and data is
+ *  actually written to disk. The filetype is set again or auto-detected if it wasn't set yet.
+ *  After all, the "document-save" signal is emitted for plugins.
  *
  *  If the file is not modified, this functions does nothing unless force is set to @c TRUE.
  *
@@ -1760,6 +1762,9 @@
 	if (file_prefs.final_new_line)
 		editor_ensure_final_newline(doc->editor);
 
+	/* notify plugins which may wish to modify the document before it's saved */
+	g_signal_emit_by_name(geany_object, "document-before-save", doc);
+
 	len = sci_get_length(doc->editor->sci) + 1;
 	if (doc->has_bom && encodings_is_unicode_charset(doc->encoding))
 	{	/* always write a UTF-8 BOM because in this moment the text itself is still in UTF-8
@@ -2480,11 +2485,13 @@
 void document_set_filetype(GeanyDocument *doc, GeanyFiletype *type)
 {
 	gboolean ft_changed;
+	GeanyFiletype *old_ft;
 
 	g_return_if_fail(doc);
 	if (type == NULL)
 		type = filetypes[GEANY_FILETYPES_NONE];
 
+	old_ft = doc->file_type;
 	geany_debug("%s : %s (%s)",
 		(doc->file_name != NULL) ? doc->file_name : "unknown",
 		(type->name != NULL) ? type->name : "unknown",
@@ -2492,6 +2499,9 @@
 
 	ft_changed = (doc->file_type != type); /* filetype has changed */
 	document_load_config(doc, type, ft_changed);
+
+	if (ft_changed)
+		g_signal_emit_by_name(geany_object, "document-filetype-set", doc, old_ft);
 }
 
 

Modified: trunk/src/geanyobject.c
===================================================================
--- trunk/src/geanyobject.c	2009-09-06 16:50:47 UTC (rev 4161)
+++ trunk/src/geanyobject.c	2009-09-06 16:51:11 UTC (rev 4162)
@@ -91,6 +91,36 @@
 }
 
 
+static void geany_cclosure_marshal_VOID__POINTER_POINTER(GClosure *closure, GValue *ret_val,
+				guint n_param_vals, const GValue *param_values, gpointer hint, gpointer mdata)
+{
+	typedef gboolean (*GeanyMarshalFunc_VOID__POINTER_POINTER)
+		(gpointer data1, gconstpointer arg_1, gconstpointer arg_2, gpointer data2);
+
+	register GeanyMarshalFunc_VOID__POINTER_POINTER callback;
+	register GCClosure* cc = (GCClosure*) closure;
+	register gpointer data1, data2;
+
+	g_return_if_fail(n_param_vals == 3);
+
+	if (G_CCLOSURE_SWAP_DATA(closure))
+	{
+		data1 = closure->data;
+		data2 = g_value_peek_pointer(param_values + 0);
+	}
+	else
+	{
+		data1 = g_value_peek_pointer(param_values + 0);
+		data2 = closure->data;
+	}
+	callback = (GeanyMarshalFunc_VOID__POINTER_POINTER) (mdata ? mdata : cc->callback);
+	callback(data1,
+			  g_value_get_pointer(param_values + 1),
+			  g_value_get_pointer(param_values + 2),
+			  data2);
+}
+
+
 static gboolean boolean_handled_accumulator(GSignalInvocationHint *ihint, GValue *return_accu,
 											const GValue *handler_return, gpointer dummy)
 {
@@ -162,6 +192,15 @@
 		g_cclosure_marshal_VOID__POINTER,
 		G_TYPE_NONE, 1,
 		G_TYPE_POINTER);
+	geany_object_signals[GCB_DOCUMENT_BEFORE_SAVE] = g_signal_new (
+		"document-before-save",
+		G_OBJECT_CLASS_TYPE (g_object_class),
+		G_SIGNAL_RUN_FIRST,
+		G_STRUCT_OFFSET (GeanyObjectClass, document_before_save),
+		NULL, NULL,
+		g_cclosure_marshal_VOID__POINTER,
+		G_TYPE_NONE, 1,
+		G_TYPE_POINTER);
 	geany_object_signals[GCB_DOCUMENT_SAVE] = g_signal_new (
 		"document-save",
 		G_OBJECT_CLASS_TYPE (g_object_class),
@@ -171,6 +210,15 @@
 		g_cclosure_marshal_VOID__POINTER,
 		G_TYPE_NONE, 1,
 		G_TYPE_POINTER);
+	geany_object_signals[GCB_DOCUMENT_FILETYPE_SET] = g_signal_new (
+		"document-filetype-set",
+		G_OBJECT_CLASS_TYPE (g_object_class),
+		G_SIGNAL_RUN_FIRST,
+		G_STRUCT_OFFSET (GeanyObjectClass, document_filetype_set),
+		NULL, NULL,
+		geany_cclosure_marshal_VOID__POINTER_POINTER,
+		G_TYPE_NONE, 2,
+		G_TYPE_POINTER, G_TYPE_POINTER);
 	geany_object_signals[GCB_DOCUMENT_ACTIVATE] = g_signal_new (
 		"document-activate",
 		G_OBJECT_CLASS_TYPE (g_object_class),

Modified: trunk/src/geanyobject.h
===================================================================
--- trunk/src/geanyobject.h	2009-09-06 16:50:47 UTC (rev 4161)
+++ trunk/src/geanyobject.h	2009-09-06 16:51:11 UTC (rev 4162)
@@ -34,7 +34,9 @@
 {
 	GCB_DOCUMENT_NEW,
 	GCB_DOCUMENT_OPEN,
+	GCB_DOCUMENT_BEFORE_SAVE,
 	GCB_DOCUMENT_SAVE,
+	GCB_DOCUMENT_FILETYPE_SET,
 	GCB_DOCUMENT_ACTIVATE,
 	GCB_DOCUMENT_CLOSE,
 	GCB_PROJECT_OPEN,
@@ -76,7 +78,9 @@
 
 	void (*document_new)(GeanyDocument *doc);
 	void (*document_open)(GeanyDocument *doc);
+	void (*document_before_save)(GeanyDocument *doc);
 	void (*document_save)(GeanyDocument *doc);
+	void (*document_filetype_set)(GeanyDocument *doc, GeanyFiletype *filetype_old);
 	void (*document_activate)(GeanyDocument *doc);
 	void (*document_close)(GeanyDocument *doc);
 	void (*project_open)(GKeyFile *keyfile);

Modified: trunk/src/plugindata.h
===================================================================
--- trunk/src/plugindata.h	2009-09-06 16:50:47 UTC (rev 4161)
+++ trunk/src/plugindata.h	2009-09-06 16:51:11 UTC (rev 4162)
@@ -50,7 +50,7 @@
 enum {
 	/** The Application Programming Interface (API) version, incremented
 	 * whenever any plugin data types are modified or appended to. */
-	GEANY_API_VERSION = 153,
+	GEANY_API_VERSION = 154,
 
 	/** The Application Binary Interface (ABI) version, incremented whenever
 	 * existing fields in the plugin data types have to be changed or reordered. */
@@ -337,6 +337,10 @@
 	gchar*	(*get_contents_range) (struct _ScintillaObject *sci, gint start, gint end);
 	gchar*	(*get_selection_contents) (struct _ScintillaObject *sci);
 	void	(*set_font) (struct _ScintillaObject *sci, gint style, const gchar *font, gint size);
+	gint (*get_line_end_position) (ScintillaObject* sci, gint line);
+	void (*set_target_start) (ScintillaObject *sci, gint start);
+	void (*set_target_end) (ScintillaObject *sci, gint end);
+	gint (*replace_target) (ScintillaObject *sci, const gchar *text, gboolean regex);
 }
 SciFuncs;
 

Modified: trunk/src/plugins.c
===================================================================
--- trunk/src/plugins.c	2009-09-06 16:50:47 UTC (rev 4161)
+++ trunk/src/plugins.c	2009-09-06 16:51:11 UTC (rev 4162)
@@ -167,7 +167,11 @@
 	&sci_get_contents,
 	&sci_get_contents_range,
 	&sci_get_selection_contents,
-	&sci_set_font
+	&sci_set_font,
+	&sci_get_line_end_position,
+	&sci_set_target_start,
+	&sci_set_target_end,
+	&sci_replace_target
 };
 
 static TemplateFuncs template_funcs = {


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list