SF.net SVN: geany: [1334] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Sun Feb 25 14:26:56 UTC 2007


Revision: 1334
          http://svn.sourceforge.net/geany/?rev=1334&view=rev
Author:   eht16
Date:     2007-02-25 06:26:55 -0800 (Sun, 25 Feb 2007)

Log Message:
-----------
Added custom commands to send selected text through some definable commands and replace the selection with the output.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/doc/geany.docbook
    trunk/geany.glade
    trunk/src/callbacks.c
    trunk/src/geany.h
    trunk/src/interface.c
    trunk/src/keybindings.c
    trunk/src/keybindings.h
    trunk/src/keyfile.c
    trunk/src/main.c
    trunk/src/tools.c
    trunk/src/tools.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2007-02-25 13:08:01 UTC (rev 1333)
+++ trunk/ChangeLog	2007-02-25 14:26:55 UTC (rev 1334)
@@ -1,3 +1,12 @@
+2007-02-25  Enrico Tröger  <enrico.troeger at uvena.de>
+
+ * geany.glade, doc/geany.docbook, src/geany.h, src/interface.c,
+   src/keybindings.c, src/keybindings.h, src/keyfile.c, src/main.c,
+   src/tools.c, src/tools.h:
+   Added custom commands to send selected text through some definable
+   commands and replace the selection with the output.
+
+
 2007-02-25  Nick Treleaven  <nick.treleaven at btinternet.com>
 
  * src/build.c:
@@ -6,7 +15,7 @@
    Should close #1668017.
 
 
-2007-02-24  Enrico Troeger  <enrico.troeger at uvena.de>
+2007-02-24  Enrico Tröger  <enrico.troeger at uvena.de>
 
  * configure.in, Makefile.am, README.I18N, po/intl_stats.sh, po/LINGUAS:
    Moved list of available translations to new file po/LINGUAS.
@@ -36,9 +45,9 @@
    Don't include filetype.none in the new file template menus.
 
 
-2007-02-20  Enrico Troeger  <enrico.troeger at uvena.de>
+2007-02-20  Enrico Tröger  <enrico.troeger at uvena.de>
 
- * src/sci_cb.c, src/sci_cb.c:
+ * src/sci_cb.c, src/sci_cb.h:
    Made auto_close_bracket() static and auto close brackets only when
    auto completion of constructs is enabled (closes #1665015).
  * doc/geany.1.in: Fixed typo.

Modified: trunk/doc/geany.docbook
===================================================================
--- trunk/doc/geany.docbook	2007-02-25 13:08:01 UTC (rev 1333)
+++ trunk/doc/geany.docbook	2007-02-25 14:26:55 UTC (rev 1334)
@@ -421,6 +421,28 @@
 					</para>
 				</note>
 			</section>
+			<section id="general_cc">
+				<title>Send text through definable commands</title>
+				<para>
+					You can define several custom commands in <application>Geany</application> and
+					send the current selection to one of these commands. The output of the command
+					will be used to replace the current selection. So, it is possible to use text
+					formatting tools with Geany in a general way.
+					The selected text will be sent to the standard input of the executed command,
+					so the command should be able to read from it and it should print all results
+					to its standard output which will be read by <application>Geany</application>.
+					To help finding errors in executing the command, the output of the program's
+					standard error will be printed on <application>Geany</application>'s standard
+					output.
+				</para>
+				<para>
+					To add a custom command, just go to the Set Custom Commands dialog in the
+					Format sub menu of the Edit and Popup menu. Then click on Add to get a new
+					text entry and type the command. You can also specify some command line options.
+					To delete a command,  just clear the text entry and press Ok. It will be deleted
+					automatically.
+				</para>
+			</section>
 		</section>
 		<section id="charset">
 			<title>Character sets and Unicode Byte-Order-Mark (BOM)</title>

Modified: trunk/geany.glade
===================================================================
--- trunk/geany.glade	2007-02-25 13:08:01 UTC (rev 1333)
+++ trunk/geany.glade	2007-02-25 14:26:55 UTC (rev 1334)
@@ -57,7 +57,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1537">
+			<widget class="GtkImage" id="image1676">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-new</property>
 			  <property name="icon_size">1</property>
@@ -147,7 +147,7 @@
 		      <signal name="activate" handler="on_save_all1_activate" last_modification_time="Thu, 02 Jun 2005 14:15:30 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1538">
+			<widget class="GtkImage" id="image1677">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-save</property>
 			  <property name="icon_size">1</property>
@@ -168,7 +168,7 @@
 		      <signal name="activate" handler="on_toolbutton23_clicked" last_modification_time="Mon, 24 Jul 2006 19:26:04 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1539">
+			<widget class="GtkImage" id="image1678">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-revert-to-saved</property>
 			  <property name="icon_size">1</property>
@@ -188,7 +188,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1540">
+			<widget class="GtkImage" id="image1679">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-revert-to-saved</property>
 			  <property name="icon_size">1</property>
@@ -268,7 +268,7 @@
 		      <signal name="activate" handler="on_close_all1_activate" last_modification_time="Thu, 02 Jun 2005 14:15:30 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1541">
+			<widget class="GtkImage" id="image1680">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-close</property>
 			  <property name="icon_size">1</property>
@@ -476,7 +476,7 @@
 			      <signal name="activate" handler="on_menu_increase_indent1_activate" last_modification_time="Tue, 01 Aug 2006 10:28:54 GMT"/>
 
 			      <child internal-child="image">
-				<widget class="GtkImage" id="image1542">
+				<widget class="GtkImage" id="image1681">
 				  <property name="visible">True</property>
 				  <property name="stock">gtk-indent</property>
 				  <property name="icon_size">1</property>
@@ -497,7 +497,7 @@
 			      <signal name="activate" handler="on_menu_decrease_indent1_activate" last_modification_time="Tue, 01 Aug 2006 10:28:54 GMT"/>
 
 			      <child internal-child="image">
-				<widget class="GtkImage" id="image1543">
+				<widget class="GtkImage" id="image1682">
 				  <property name="visible">True</property>
 				  <property name="stock">gtk-unindent</property>
 				  <property name="icon_size">1</property>
@@ -509,6 +509,32 @@
 			      </child>
 			    </widget>
 			  </child>
+
+			  <child>
+			    <widget class="GtkSeparatorMenuItem" id="separator37">
+			      <property name="visible">True</property>
+			    </widget>
+			  </child>
+
+			  <child>
+			    <widget class="GtkMenuItem" id="send_selection_to2">
+			      <property name="visible">True</property>
+			      <property name="label" translatable="yes">_Send Selection to</property>
+			      <property name="use_underline">True</property>
+
+			      <child>
+				<widget class="GtkMenu" id="send_selection_to2_menu">
+
+				  <child>
+				    <widget class="GtkMenuItem" id="invisible13">
+				      <property name="label" translatable="yes">invisible</property>
+				      <property name="use_underline">True</property>
+				    </widget>
+				  </child>
+				</widget>
+			      </child>
+			    </widget>
+			  </child>
 			</widget>
 		      </child>
 		    </widget>
@@ -527,7 +553,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1544">
+			<widget class="GtkImage" id="image1683">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-add</property>
 			  <property name="icon_size">1</property>
@@ -559,7 +585,7 @@
 		      <property name="use_underline">True</property>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1545">
+			<widget class="GtkImage" id="image1684">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-add</property>
 			  <property name="icon_size">1</property>
@@ -638,11 +664,23 @@
 		  </child>
 
 		  <child>
-		    <widget class="GtkMenuItem" id="insert_date1">
+		    <widget class="GtkImageMenuItem" id="insert_date1">
 		      <property name="visible">True</property>
 		      <property name="label" translatable="yes">Insert Dat_e</property>
 		      <property name="use_underline">True</property>
 
+		      <child internal-child="image">
+			<widget class="GtkImage" id="image1685">
+			  <property name="visible">True</property>
+			  <property name="stock">gtk-add</property>
+			  <property name="icon_size">1</property>
+			  <property name="xalign">0.5</property>
+			  <property name="yalign">0.5</property>
+			  <property name="xpad">0</property>
+			  <property name="ypad">0</property>
+			</widget>
+		      </child>
+
 		      <child>
 			<widget class="GtkMenu" id="insert_date1_menu">
 
@@ -729,7 +767,7 @@
 		      <signal name="activate" handler="on_replace1_activate" last_modification_time="Sun, 23 Oct 2005 13:22:36 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1546">
+			<widget class="GtkImage" id="image1686">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-find-and-replace</property>
 			  <property name="icon_size">1</property>
@@ -795,7 +833,7 @@
 		      <signal name="activate" handler="on_go_to_line1_activate" last_modification_time="Tue, 23 May 2006 17:10:49 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1547">
+			<widget class="GtkImage" id="image1687">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-jump-to</property>
 			  <property name="icon_size">1</property>
@@ -830,7 +868,7 @@
 		      <signal name="activate" handler="on_change_font1_activate" last_modification_time="Fri, 22 Apr 2005 18:58:45 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1548">
+			<widget class="GtkImage" id="image1688">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-select-font</property>
 			  <property name="icon_size">1</property>
@@ -1061,7 +1099,7 @@
 			      <property name="visible">True</property>
 			      <property name="label" translatable="yes">Convert and Set to _CR/LF (Win)</property>
 			      <property name="use_underline">True</property>
-			      <property name="active">True</property>
+			      <property name="active">False</property>
 			      <signal name="activate" handler="on_crlf_activate" last_modification_time="Thu, 28 Apr 2005 16:27:24 GMT"/>
 			    </widget>
 			  </child>
@@ -1071,7 +1109,7 @@
 			      <property name="visible">True</property>
 			      <property name="label" translatable="yes">Convert and Set to _LF (Unix)</property>
 			      <property name="use_underline">True</property>
-			      <property name="active">True</property>
+			      <property name="active">False</property>
 			      <property name="group">crlf</property>
 			      <signal name="activate" handler="on_lf_activate" last_modification_time="Thu, 28 Apr 2005 16:27:24 GMT"/>
 			    </widget>
@@ -1181,7 +1219,7 @@
 		      <signal name="activate" handler="on_project_new1_activate" last_modification_time="Thu, 18 Jan 2007 22:16:24 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1549">
+			<widget class="GtkImage" id="image1689">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-new</property>
 			  <property name="icon_size">1</property>
@@ -1202,7 +1240,7 @@
 		      <signal name="activate" handler="on_project_open1_activate" last_modification_time="Mon, 15 Jan 2007 17:34:17 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1550">
+			<widget class="GtkImage" id="image1690">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-open</property>
 			  <property name="icon_size">1</property>
@@ -1223,7 +1261,7 @@
 		      <signal name="activate" handler="on_project_close1_activate" last_modification_time="Mon, 15 Jan 2007 17:34:17 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1551">
+			<widget class="GtkImage" id="image1691">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-close</property>
 			  <property name="icon_size">1</property>
@@ -1281,7 +1319,7 @@
 		      <signal name="activate" handler="on_show_color_chooser1_activate" last_modification_time="Wed, 22 Jun 2005 18:10:21 GMT"/>
 
 		      <child internal-child="image">
-			<widget class="GtkImage" id="image1552">
+			<widget class="GtkImage" id="image1692">
 			  <property name="visible">True</property>
 			  <property name="stock">gtk-select-color</property>
 			  <property name="icon_size">1</property>
@@ -2531,7 +2569,7 @@
 	      <signal name="activate" handler="on_menu_increase_indent1_activate" last_modification_time="Tue, 01 Aug 2006 10:31:38 GMT"/>
 
 	      <child internal-child="image">
-		<widget class="GtkImage" id="image1516">
+		<widget class="GtkImage" id="image1669">
 		  <property name="visible">True</property>
 		  <property name="stock">gtk-indent</property>
 		  <property name="icon_size">1</property>
@@ -2552,7 +2590,7 @@
 	      <signal name="activate" handler="on_menu_decrease_indent1_activate" last_modification_time="Tue, 01 Aug 2006 10:31:38 GMT"/>
 
 	      <child internal-child="image">
-		<widget class="GtkImage" id="image1517">
+		<widget class="GtkImage" id="image1670">
 		  <property name="visible">True</property>
 		  <property name="stock">gtk-unindent</property>
 		  <property name="icon_size">1</property>
@@ -2564,6 +2602,32 @@
 	      </child>
 	    </widget>
 	  </child>
+
+	  <child>
+	    <widget class="GtkSeparatorMenuItem" id="separator38">
+	      <property name="visible">True</property>
+	    </widget>
+	  </child>
+
+	  <child>
+	    <widget class="GtkMenuItem" id="send_selection_to1">
+	      <property name="visible">True</property>
+	      <property name="label" translatable="yes">_Send Selection to</property>
+	      <property name="use_underline">True</property>
+
+	      <child>
+		<widget class="GtkMenu" id="send_selection_to1_menu">
+
+		  <child>
+		    <widget class="GtkMenuItem" id="invisible12">
+		      <property name="label" translatable="yes">invisible</property>
+		      <property name="use_underline">True</property>
+		    </widget>
+		  </child>
+		</widget>
+	      </child>
+	    </widget>
+	  </child>
 	</widget>
       </child>
     </widget>
@@ -2582,7 +2646,7 @@
       <property name="use_underline">True</property>
 
       <child internal-child="image">
-	<widget class="GtkImage" id="image1518">
+	<widget class="GtkImage" id="image1671">
 	  <property name="visible">True</property>
 	  <property name="stock">gtk-add</property>
 	  <property name="icon_size">1</property>
@@ -2614,7 +2678,7 @@
       <property name="use_underline">True</property>
 
       <child internal-child="image">
-	<widget class="GtkImage" id="image1519">
+	<widget class="GtkImage" id="image1672">
 	  <property name="visible">True</property>
 	  <property name="stock">gtk-add</property>
 	  <property name="icon_size">1</property>
@@ -2693,11 +2757,23 @@
   </child>
 
   <child>
-    <widget class="GtkMenuItem" id="insert_date2">
+    <widget class="GtkImageMenuItem" id="insert_date2">
       <property name="visible">True</property>
       <property name="label" translatable="yes">Insert Dat_e</property>
       <property name="use_underline">True</property>
 
+      <child internal-child="image">
+	<widget class="GtkImage" id="image1673">
+	  <property name="visible">True</property>
+	  <property name="stock">gtk-add</property>
+	  <property name="icon_size">1</property>
+	  <property name="xalign">0.5</property>
+	  <property name="yalign">0.5</property>
+	  <property name="xpad">0</property>
+	  <property name="ypad">0</property>
+	</widget>
+      </child>
+
       <child>
 	<widget class="GtkMenu" id="insert_date2_menu">
 
@@ -2726,7 +2802,7 @@
       <signal name="activate" handler="on_find_usage1_activate" last_modification_time="Fri, 27 May 2005 21:55:12 GMT"/>
 
       <child internal-child="image">
-	<widget class="GtkImage" id="image1520">
+	<widget class="GtkImage" id="image1674">
 	  <property name="visible">True</property>
 	  <property name="stock">gtk-find</property>
 	  <property name="icon_size">1</property>
@@ -2772,7 +2848,7 @@
       <signal name="activate" handler="on_go_to_line_activate" last_modification_time="Sat, 16 Jul 2005 11:20:32 GMT"/>
 
       <child internal-child="image">
-	<widget class="GtkImage" id="image1521">
+	<widget class="GtkImage" id="image1675">
 	  <property name="visible">True</property>
 	  <property name="stock">gtk-jump-to</property>
 	  <property name="icon_size">1</property>

Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c	2007-02-25 13:08:01 UTC (rev 1333)
+++ trunk/src/callbacks.c	2007-02-25 14:26:55 UTC (rev 1334)
@@ -2086,8 +2086,6 @@
 }
 
 
-
-
 void
 on_project_new1_activate               (GtkMenuItem     *menuitem,
                                         gpointer         user_data)

Modified: trunk/src/geany.h
===================================================================
--- trunk/src/geany.h	2007-02-25 13:08:01 UTC (rev 1333)
+++ trunk/src/geany.h	2007-02-25 14:26:55 UTC (rev 1334)
@@ -154,6 +154,7 @@
 	gchar				*datadir;
 	gchar				*docdir;
 	gchar				*custom_date_format;
+	gchar				**custom_commands;
 	gchar				*tools_browser_cmd;
 	gchar				*tools_make_cmd;
 	gchar				*tools_term_cmd;

Modified: trunk/src/interface.c
===================================================================
--- trunk/src/interface.c	2007-02-25 13:08:01 UTC (rev 1333)
+++ trunk/src/interface.c	2007-02-25 14:26:55 UTC (rev 1334)
@@ -37,7 +37,7 @@
   GtkWidget *menuitem1_menu;
   GtkWidget *menu_new1;
   GtkWidget *menu_new_with_template1;
-  GtkWidget *image1537;
+  GtkWidget *image1676;
   GtkWidget *menu_new_with_template1_menu;
   GtkWidget *invisible2;
   GtkWidget *separator12;
@@ -48,11 +48,11 @@
   GtkWidget *menu_save1;
   GtkWidget *menu_save_as1;
   GtkWidget *menu_save_all1;
-  GtkWidget *image1538;
+  GtkWidget *image1677;
   GtkWidget *menu_reload1;
-  GtkWidget *image1539;
+  GtkWidget *image1678;
   GtkWidget *menu_reload_as1;
-  GtkWidget *image1540;
+  GtkWidget *image1679;
   GtkWidget *menu_reload_as1_menu;
   GtkWidget *invisible7;
   GtkWidget *separator21;
@@ -62,7 +62,7 @@
   GtkWidget *separator14;
   GtkWidget *menu_close1;
   GtkWidget *menu_close_all1;
-  GtkWidget *image1541;
+  GtkWidget *image1680;
   GtkWidget *menu_separatormenuitem1;
   GtkWidget *menu_quit1;
   GtkWidget *edit1;
@@ -88,16 +88,20 @@
   GtkWidget *menu_duplicate_line1;
   GtkWidget *separator29;
   GtkWidget *menu_increase_indent1;
-  GtkWidget *image1542;
+  GtkWidget *image1681;
   GtkWidget *menu_decrease_indent1;
-  GtkWidget *image1543;
+  GtkWidget *image1682;
+  GtkWidget *separator37;
+  GtkWidget *send_selection_to2;
+  GtkWidget *send_selection_to2_menu;
+  GtkWidget *invisible13;
   GtkWidget *separator18;
   GtkWidget *insert_include2;
-  GtkWidget *image1544;
+  GtkWidget *image1683;
   GtkWidget *insert_include2_menu;
   GtkWidget *invisible4;
   GtkWidget *add_comments1;
-  GtkWidget *image1545;
+  GtkWidget *image1684;
   GtkWidget *add_comments1_menu;
   GtkWidget *menu_add_changelog_entry1;
   GtkWidget *insert_file_header1;
@@ -106,6 +110,7 @@
   GtkWidget *insert_gpl_notice2;
   GtkWidget *insert_bsd_license_notice2;
   GtkWidget *insert_date1;
+  GtkWidget *image1685;
   GtkWidget *insert_date1_menu;
   GtkWidget *invisible8;
   GtkWidget *separator9;
@@ -117,7 +122,7 @@
   GtkWidget *find_previous1;
   GtkWidget *find_in_files1;
   GtkWidget *replace1;
-  GtkWidget *image1546;
+  GtkWidget *image1686;
   GtkWidget *separator33;
   GtkWidget *find_nextsel1;
   GtkWidget *find_prevsel1;
@@ -125,11 +130,11 @@
   GtkWidget *next_message1;
   GtkWidget *separator32;
   GtkWidget *go_to_line1;
-  GtkWidget *image1547;
+  GtkWidget *image1687;
   GtkWidget *menuitem3;
   GtkWidget *menuitem3_menu;
   GtkWidget *menu_change_font1;
-  GtkWidget *image1548;
+  GtkWidget *image1688;
   GtkWidget *menu_separator4;
   GtkWidget *menu_fullscreen1;
   GtkWidget *menu_show_messages_window1;
@@ -171,18 +176,18 @@
   GtkWidget *menu_project1;
   GtkWidget *menu_project1_menu;
   GtkWidget *project_new1;
-  GtkWidget *image1549;
+  GtkWidget *image1689;
   GtkWidget *project_open1;
-  GtkWidget *image1550;
+  GtkWidget *image1690;
   GtkWidget *project_close1;
-  GtkWidget *image1551;
+  GtkWidget *image1691;
   GtkWidget *separator34;
   GtkWidget *project_properties1;
   GtkWidget *menu_build1;
   GtkWidget *tools1;
   GtkWidget *tools1_menu;
   GtkWidget *menu_choose_color1;
-  GtkWidget *image1552;
+  GtkWidget *image1692;
   GtkWidget *menu_count_words1;
   GtkWidget *menu_insert_special_chars1;
   GtkWidget *menu_item5;
@@ -283,9 +288,9 @@
   gtk_widget_show (menu_new_with_template1);
   gtk_container_add (GTK_CONTAINER (menuitem1_menu), menu_new_with_template1);
 
-  image1537 = gtk_image_new_from_stock ("gtk-new", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1537);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_new_with_template1), image1537);
+  image1676 = gtk_image_new_from_stock ("gtk-new", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1676);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_new_with_template1), image1676);
 
   menu_new_with_template1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_new_with_template1), menu_new_with_template1_menu);
@@ -328,25 +333,25 @@
   gtk_container_add (GTK_CONTAINER (menuitem1_menu), menu_save_all1);
   gtk_tooltips_set_tip (tooltips, menu_save_all1, _("Saves all open files"), NULL);
 
-  image1538 = gtk_image_new_from_stock ("gtk-save", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1538);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_save_all1), image1538);
+  image1677 = gtk_image_new_from_stock ("gtk-save", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1677);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_save_all1), image1677);
 
   menu_reload1 = gtk_image_menu_item_new_with_mnemonic (_("_Reload"));
   gtk_widget_show (menu_reload1);
   gtk_container_add (GTK_CONTAINER (menuitem1_menu), menu_reload1);
 
-  image1539 = gtk_image_new_from_stock ("gtk-revert-to-saved", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1539);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_reload1), image1539);
+  image1678 = gtk_image_new_from_stock ("gtk-revert-to-saved", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1678);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_reload1), image1678);
 
   menu_reload_as1 = gtk_image_menu_item_new_with_mnemonic (_("R_eload As"));
   gtk_widget_show (menu_reload_as1);
   gtk_container_add (GTK_CONTAINER (menuitem1_menu), menu_reload_as1);
 
-  image1540 = gtk_image_new_from_stock ("gtk-revert-to-saved", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1540);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_reload_as1), image1540);
+  image1679 = gtk_image_new_from_stock ("gtk-revert-to-saved", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1679);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_reload_as1), image1679);
 
   menu_reload_as1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_reload_as1), menu_reload_as1_menu);
@@ -387,9 +392,9 @@
   gtk_container_add (GTK_CONTAINER (menuitem1_menu), menu_close_all1);
   gtk_tooltips_set_tip (tooltips, menu_close_all1, _("Closes all open files"), NULL);
 
-  image1541 = gtk_image_new_from_stock ("gtk-close", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1541);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_close_all1), image1541);
+  image1680 = gtk_image_new_from_stock ("gtk-close", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1680);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_close_all1), image1680);
 
   menu_separatormenuitem1 = gtk_separator_menu_item_new ();
   gtk_widget_show (menu_separatormenuitem1);
@@ -497,18 +502,33 @@
   gtk_widget_show (menu_increase_indent1);
   gtk_container_add (GTK_CONTAINER (menu_format1_menu), menu_increase_indent1);
 
-  image1542 = gtk_image_new_from_stock ("gtk-indent", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1542);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_increase_indent1), image1542);
+  image1681 = gtk_image_new_from_stock ("gtk-indent", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1681);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_increase_indent1), image1681);
 
   menu_decrease_indent1 = gtk_image_menu_item_new_with_mnemonic (_("_Decrease Indent"));
   gtk_widget_show (menu_decrease_indent1);
   gtk_container_add (GTK_CONTAINER (menu_format1_menu), menu_decrease_indent1);
 
-  image1543 = gtk_image_new_from_stock ("gtk-unindent", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1543);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_decrease_indent1), image1543);
+  image1682 = gtk_image_new_from_stock ("gtk-unindent", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1682);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_decrease_indent1), image1682);
 
+  separator37 = gtk_separator_menu_item_new ();
+  gtk_widget_show (separator37);
+  gtk_container_add (GTK_CONTAINER (menu_format1_menu), separator37);
+  gtk_widget_set_sensitive (separator37, FALSE);
+
+  send_selection_to2 = gtk_menu_item_new_with_mnemonic (_("_Send Selection to"));
+  gtk_widget_show (send_selection_to2);
+  gtk_container_add (GTK_CONTAINER (menu_format1_menu), send_selection_to2);
+
+  send_selection_to2_menu = gtk_menu_new ();
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (send_selection_to2), send_selection_to2_menu);
+
+  invisible13 = gtk_menu_item_new_with_mnemonic (_("invisible"));
+  gtk_container_add (GTK_CONTAINER (send_selection_to2_menu), invisible13);
+
   separator18 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator18);
   gtk_container_add (GTK_CONTAINER (edit1_menu), separator18);
@@ -518,9 +538,9 @@
   gtk_widget_show (insert_include2);
   gtk_container_add (GTK_CONTAINER (edit1_menu), insert_include2);
 
-  image1544 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1544);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_include2), image1544);
+  image1683 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1683);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_include2), image1683);
 
   insert_include2_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (insert_include2), insert_include2_menu);
@@ -532,9 +552,9 @@
   gtk_widget_show (add_comments1);
   gtk_container_add (GTK_CONTAINER (edit1_menu), add_comments1);
 
-  image1545 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1545);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_comments1), image1545);
+  image1684 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1684);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (add_comments1), image1684);
 
   add_comments1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (add_comments1), add_comments1_menu);
@@ -569,10 +589,14 @@
   gtk_container_add (GTK_CONTAINER (add_comments1_menu), insert_bsd_license_notice2);
   gtk_tooltips_set_tip (tooltips, insert_bsd_license_notice2, _("Inserts a BSD licence notice (should be done at the beginning of the file)"), NULL);
 
-  insert_date1 = gtk_menu_item_new_with_mnemonic (_("Insert Dat_e"));
+  insert_date1 = gtk_image_menu_item_new_with_mnemonic (_("Insert Dat_e"));
   gtk_widget_show (insert_date1);
   gtk_container_add (GTK_CONTAINER (edit1_menu), insert_date1);
 
+  image1685 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1685);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_date1), image1685);
+
   insert_date1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (insert_date1), insert_date1_menu);
 
@@ -615,9 +639,9 @@
   gtk_widget_show (replace1);
   gtk_container_add (GTK_CONTAINER (search1_menu), replace1);
 
-  image1546 = gtk_image_new_from_stock ("gtk-find-and-replace", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1546);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (replace1), image1546);
+  image1686 = gtk_image_new_from_stock ("gtk-find-and-replace", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1686);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (replace1), image1686);
 
   separator33 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator33);
@@ -650,9 +674,9 @@
   gtk_widget_show (go_to_line1);
   gtk_container_add (GTK_CONTAINER (search1_menu), go_to_line1);
 
-  image1547 = gtk_image_new_from_stock ("gtk-jump-to", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1547);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (go_to_line1), image1547);
+  image1687 = gtk_image_new_from_stock ("gtk-jump-to", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1687);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (go_to_line1), image1687);
 
   menuitem3 = gtk_menu_item_new_with_mnemonic (_("_View"));
   gtk_widget_show (menuitem3);
@@ -666,9 +690,9 @@
   gtk_container_add (GTK_CONTAINER (menuitem3_menu), menu_change_font1);
   gtk_tooltips_set_tip (tooltips, menu_change_font1, _("Change the default font"), NULL);
 
-  image1548 = gtk_image_new_from_stock ("gtk-select-font", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1548);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_change_font1), image1548);
+  image1688 = gtk_image_new_from_stock ("gtk-select-font", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1688);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_change_font1), image1688);
 
   menu_separator4 = gtk_separator_menu_item_new ();
   gtk_widget_show (menu_separator4);
@@ -788,13 +812,11 @@
   crlf_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (crlf));
   gtk_widget_show (crlf);
   gtk_container_add (GTK_CONTAINER (menu_line_endings1_menu), crlf);
-  gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (crlf), TRUE);
 
   lf = gtk_radio_menu_item_new_with_mnemonic (crlf_group, _("Convert and Set to _LF (Unix)"));
   crlf_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (lf));
   gtk_widget_show (lf);
   gtk_container_add (GTK_CONTAINER (menu_line_endings1_menu), lf);
-  gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (lf), TRUE);
 
   cr = gtk_radio_menu_item_new_with_mnemonic (crlf_group, _("Convert and Set to CR (_Mac)"));
   crlf_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (cr));
@@ -852,25 +874,25 @@
   gtk_widget_show (project_new1);
   gtk_container_add (GTK_CONTAINER (menu_project1_menu), project_new1);
 
-  image1549 = gtk_image_new_from_stock ("gtk-new", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1549);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (project_new1), image1549);
+  image1689 = gtk_image_new_from_stock ("gtk-new", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1689);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (project_new1), image1689);
 
   project_open1 = gtk_image_menu_item_new_with_mnemonic (_("_Open"));
   gtk_widget_show (project_open1);
   gtk_container_add (GTK_CONTAINER (menu_project1_menu), project_open1);
 
-  image1550 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1550);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (project_open1), image1550);
+  image1690 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1690);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (project_open1), image1690);
 
   project_close1 = gtk_image_menu_item_new_with_mnemonic (_("_Close"));
   gtk_widget_show (project_close1);
   gtk_container_add (GTK_CONTAINER (menu_project1_menu), project_close1);
 
-  image1551 = gtk_image_new_from_stock ("gtk-close", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1551);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (project_close1), image1551);
+  image1691 = gtk_image_new_from_stock ("gtk-close", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1691);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (project_close1), image1691);
 
   separator34 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator34);
@@ -897,9 +919,9 @@
   gtk_container_add (GTK_CONTAINER (tools1_menu), menu_choose_color1);
   gtk_tooltips_set_tip (tooltips, menu_choose_color1, _("Open a color chooser dialog, to interactively pick colors from a palette."), NULL);
 
-  image1552 = gtk_image_new_from_stock ("gtk-select-color", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1552);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_choose_color1), image1552);
+  image1692 = gtk_image_new_from_stock ("gtk-select-color", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1692);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_choose_color1), image1692);
 
   menu_count_words1 = gtk_menu_item_new_with_mnemonic (_("_Word Count"));
   gtk_widget_show (menu_count_words1);
@@ -1524,7 +1546,7 @@
   GLADE_HOOKUP_OBJECT (window1, menuitem1_menu, "menuitem1_menu");
   GLADE_HOOKUP_OBJECT (window1, menu_new1, "menu_new1");
   GLADE_HOOKUP_OBJECT (window1, menu_new_with_template1, "menu_new_with_template1");
-  GLADE_HOOKUP_OBJECT (window1, image1537, "image1537");
+  GLADE_HOOKUP_OBJECT (window1, image1676, "image1676");
   GLADE_HOOKUP_OBJECT (window1, menu_new_with_template1_menu, "menu_new_with_template1_menu");
   GLADE_HOOKUP_OBJECT (window1, invisible2, "invisible2");
   GLADE_HOOKUP_OBJECT (window1, separator12, "separator12");
@@ -1535,11 +1557,11 @@
   GLADE_HOOKUP_OBJECT (window1, menu_save1, "menu_save1");
   GLADE_HOOKUP_OBJECT (window1, menu_save_as1, "menu_save_as1");
   GLADE_HOOKUP_OBJECT (window1, menu_save_all1, "menu_save_all1");
-  GLADE_HOOKUP_OBJECT (window1, image1538, "image1538");
+  GLADE_HOOKUP_OBJECT (window1, image1677, "image1677");
   GLADE_HOOKUP_OBJECT (window1, menu_reload1, "menu_reload1");
-  GLADE_HOOKUP_OBJECT (window1, image1539, "image1539");
+  GLADE_HOOKUP_OBJECT (window1, image1678, "image1678");
   GLADE_HOOKUP_OBJECT (window1, menu_reload_as1, "menu_reload_as1");
-  GLADE_HOOKUP_OBJECT (window1, image1540, "image1540");
+  GLADE_HOOKUP_OBJECT (window1, image1679, "image1679");
   GLADE_HOOKUP_OBJECT (window1, menu_reload_as1_menu, "menu_reload_as1_menu");
   GLADE_HOOKUP_OBJECT (window1, invisible7, "invisible7");
   GLADE_HOOKUP_OBJECT (window1, separator21, "separator21");
@@ -1549,7 +1571,7 @@
   GLADE_HOOKUP_OBJECT (window1, separator14, "separator14");
   GLADE_HOOKUP_OBJECT (window1, menu_close1, "menu_close1");
   GLADE_HOOKUP_OBJECT (window1, menu_close_all1, "menu_close_all1");
-  GLADE_HOOKUP_OBJECT (window1, image1541, "image1541");
+  GLADE_HOOKUP_OBJECT (window1, image1680, "image1680");
   GLADE_HOOKUP_OBJECT (window1, menu_separatormenuitem1, "menu_separatormenuitem1");
   GLADE_HOOKUP_OBJECT (window1, menu_quit1, "menu_quit1");
   GLADE_HOOKUP_OBJECT (window1, edit1, "edit1");
@@ -1575,16 +1597,20 @@
   GLADE_HOOKUP_OBJECT (window1, menu_duplicate_line1, "menu_duplicate_line1");
   GLADE_HOOKUP_OBJECT (window1, separator29, "separator29");
   GLADE_HOOKUP_OBJECT (window1, menu_increase_indent1, "menu_increase_indent1");
-  GLADE_HOOKUP_OBJECT (window1, image1542, "image1542");
+  GLADE_HOOKUP_OBJECT (window1, image1681, "image1681");
   GLADE_HOOKUP_OBJECT (window1, menu_decrease_indent1, "menu_decrease_indent1");
-  GLADE_HOOKUP_OBJECT (window1, image1543, "image1543");
+  GLADE_HOOKUP_OBJECT (window1, image1682, "image1682");
+  GLADE_HOOKUP_OBJECT (window1, separator37, "separator37");
+  GLADE_HOOKUP_OBJECT (window1, send_selection_to2, "send_selection_to2");
+  GLADE_HOOKUP_OBJECT (window1, send_selection_to2_menu, "send_selection_to2_menu");
+  GLADE_HOOKUP_OBJECT (window1, invisible13, "invisible13");
   GLADE_HOOKUP_OBJECT (window1, separator18, "separator18");
   GLADE_HOOKUP_OBJECT (window1, insert_include2, "insert_include2");
-  GLADE_HOOKUP_OBJECT (window1, image1544, "image1544");
+  GLADE_HOOKUP_OBJECT (window1, image1683, "image1683");
   GLADE_HOOKUP_OBJECT (window1, insert_include2_menu, "insert_include2_menu");
   GLADE_HOOKUP_OBJECT (window1, invisible4, "invisible4");
   GLADE_HOOKUP_OBJECT (window1, add_comments1, "add_comments1");
-  GLADE_HOOKUP_OBJECT (window1, image1545, "image1545");
+  GLADE_HOOKUP_OBJECT (window1, image1684, "image1684");
   GLADE_HOOKUP_OBJECT (window1, add_comments1_menu, "add_comments1_menu");
   GLADE_HOOKUP_OBJECT (window1, menu_add_changelog_entry1, "menu_add_changelog_entry1");
   GLADE_HOOKUP_OBJECT (window1, insert_file_header1, "insert_file_header1");
@@ -1593,6 +1619,7 @@
   GLADE_HOOKUP_OBJECT (window1, insert_gpl_notice2, "insert_gpl_notice2");
   GLADE_HOOKUP_OBJECT (window1, insert_bsd_license_notice2, "insert_bsd_license_notice2");
   GLADE_HOOKUP_OBJECT (window1, insert_date1, "insert_date1");
+  GLADE_HOOKUP_OBJECT (window1, image1685, "image1685");
   GLADE_HOOKUP_OBJECT (window1, insert_date1_menu, "insert_date1_menu");
   GLADE_HOOKUP_OBJECT (window1, invisible8, "invisible8");
   GLADE_HOOKUP_OBJECT (window1, separator9, "separator9");
@@ -1604,7 +1631,7 @@
   GLADE_HOOKUP_OBJECT (window1, find_previous1, "find_previous1");
   GLADE_HOOKUP_OBJECT (window1, find_in_files1, "find_in_files1");
   GLADE_HOOKUP_OBJECT (window1, replace1, "replace1");
-  GLADE_HOOKUP_OBJECT (window1, image1546, "image1546");
+  GLADE_HOOKUP_OBJECT (window1, image1686, "image1686");
   GLADE_HOOKUP_OBJECT (window1, separator33, "separator33");
   GLADE_HOOKUP_OBJECT (window1, find_nextsel1, "find_nextsel1");
   GLADE_HOOKUP_OBJECT (window1, find_prevsel1, "find_prevsel1");
@@ -1612,11 +1639,11 @@
   GLADE_HOOKUP_OBJECT (window1, next_message1, "next_message1");
   GLADE_HOOKUP_OBJECT (window1, separator32, "separator32");
   GLADE_HOOKUP_OBJECT (window1, go_to_line1, "go_to_line1");
-  GLADE_HOOKUP_OBJECT (window1, image1547, "image1547");
+  GLADE_HOOKUP_OBJECT (window1, image1687, "image1687");
   GLADE_HOOKUP_OBJECT (window1, menuitem3, "menuitem3");
   GLADE_HOOKUP_OBJECT (window1, menuitem3_menu, "menuitem3_menu");
   GLADE_HOOKUP_OBJECT (window1, menu_change_font1, "menu_change_font1");
-  GLADE_HOOKUP_OBJECT (window1, image1548, "image1548");
+  GLADE_HOOKUP_OBJECT (window1, image1688, "image1688");
   GLADE_HOOKUP_OBJECT (window1, menu_separator4, "menu_separator4");
   GLADE_HOOKUP_OBJECT (window1, menu_fullscreen1, "menu_fullscreen1");
   GLADE_HOOKUP_OBJECT (window1, menu_show_messages_window1, "menu_show_messages_window1");
@@ -1657,18 +1684,18 @@
   GLADE_HOOKUP_OBJECT (window1, menu_project1, "menu_project1");
   GLADE_HOOKUP_OBJECT (window1, menu_project1_menu, "menu_project1_menu");
   GLADE_HOOKUP_OBJECT (window1, project_new1, "project_new1");
-  GLADE_HOOKUP_OBJECT (window1, image1549, "image1549");
+  GLADE_HOOKUP_OBJECT (window1, image1689, "image1689");
   GLADE_HOOKUP_OBJECT (window1, project_open1, "project_open1");
-  GLADE_HOOKUP_OBJECT (window1, image1550, "image1550");
+  GLADE_HOOKUP_OBJECT (window1, image1690, "image1690");
   GLADE_HOOKUP_OBJECT (window1, project_close1, "project_close1");
-  GLADE_HOOKUP_OBJECT (window1, image1551, "image1551");
+  GLADE_HOOKUP_OBJECT (window1, image1691, "image1691");
   GLADE_HOOKUP_OBJECT (window1, separator34, "separator34");
   GLADE_HOOKUP_OBJECT (window1, project_properties1, "project_properties1");
   GLADE_HOOKUP_OBJECT (window1, menu_build1, "menu_build1");
   GLADE_HOOKUP_OBJECT (window1, tools1, "tools1");
   GLADE_HOOKUP_OBJECT (window1, tools1_menu, "tools1_menu");
   GLADE_HOOKUP_OBJECT (window1, menu_choose_color1, "menu_choose_color1");
-  GLADE_HOOKUP_OBJECT (window1, image1552, "image1552");
+  GLADE_HOOKUP_OBJECT (window1, image1692, "image1692");
   GLADE_HOOKUP_OBJECT (window1, menu_count_words1, "menu_count_words1");
   GLADE_HOOKUP_OBJECT (window1, menu_insert_special_chars1, "menu_insert_special_chars1");
   GLADE_HOOKUP_OBJECT (window1, menu_item5, "menu_item5");
@@ -1866,16 +1893,20 @@
   GtkWidget *menu_duplicate_line2;
   GtkWidget *separator31;
   GtkWidget *menu_increase_indent2;
-  GtkWidget *image1516;
+  GtkWidget *image1669;
   GtkWidget *menu_decrease_indent2;
-  GtkWidget *image1517;
+  GtkWidget *image1670;
+  GtkWidget *separator38;
+  GtkWidget *send_selection_to1;
+  GtkWidget *send_selection_to1_menu;
+  GtkWidget *invisible12;
   GtkWidget *separator17;
   GtkWidget *insert_include1;
-  GtkWidget *image1518;
+  GtkWidget *image1671;
   GtkWidget *insert_include1_menu;
   GtkWidget *invisible3;
   GtkWidget *comments;
-  GtkWidget *image1519;
+  GtkWidget *image1672;
   GtkWidget *comments_menu;
   GtkWidget *add_changelog_entry2;
   GtkWidget *insert_file_header2;
@@ -1884,16 +1915,17 @@
   GtkWidget *insert_gpl_notice1;
   GtkWidget *insert_bsd_license_notice1;
   GtkWidget *insert_date2;
+  GtkWidget *image1673;
   GtkWidget *insert_date2_menu;
   GtkWidget *invisible10;
   GtkWidget *separator7;
   GtkWidget *find_usage1;
-  GtkWidget *image1520;
+  GtkWidget *image1674;
   GtkWidget *goto_tag_definition1;
   GtkWidget *goto_tag_declaration1;
   GtkWidget *separator15;
   GtkWidget *go_to_line;
-  GtkWidget *image1521;
+  GtkWidget *image1675;
   GtkAccelGroup *accel_group;
   GtkTooltips *tooltips;
 
@@ -2000,18 +2032,33 @@
   gtk_widget_show (menu_increase_indent2);
   gtk_container_add (GTK_CONTAINER (menu_format2_menu), menu_increase_indent2);
 
-  image1516 = gtk_image_new_from_stock ("gtk-indent", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1516);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_increase_indent2), image1516);
+  image1669 = gtk_image_new_from_stock ("gtk-indent", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1669);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_increase_indent2), image1669);
 
   menu_decrease_indent2 = gtk_image_menu_item_new_with_mnemonic (_("_Decrease Indent"));
   gtk_widget_show (menu_decrease_indent2);
   gtk_container_add (GTK_CONTAINER (menu_format2_menu), menu_decrease_indent2);
 
-  image1517 = gtk_image_new_from_stock ("gtk-unindent", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1517);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_decrease_indent2), image1517);
+  image1670 = gtk_image_new_from_stock ("gtk-unindent", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1670);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_decrease_indent2), image1670);
 
+  separator38 = gtk_separator_menu_item_new ();
+  gtk_widget_show (separator38);
+  gtk_container_add (GTK_CONTAINER (menu_format2_menu), separator38);
+  gtk_widget_set_sensitive (separator38, FALSE);
+
+  send_selection_to1 = gtk_menu_item_new_with_mnemonic (_("_Send Selection to"));
+  gtk_widget_show (send_selection_to1);
+  gtk_container_add (GTK_CONTAINER (menu_format2_menu), send_selection_to1);
+
+  send_selection_to1_menu = gtk_menu_new ();
+  gtk_menu_item_set_submenu (GTK_MENU_ITEM (send_selection_to1), send_selection_to1_menu);
+
+  invisible12 = gtk_menu_item_new_with_mnemonic (_("invisible"));
+  gtk_container_add (GTK_CONTAINER (send_selection_to1_menu), invisible12);
+
   separator17 = gtk_separator_menu_item_new ();
   gtk_widget_show (separator17);
   gtk_container_add (GTK_CONTAINER (edit_menu1), separator17);
@@ -2021,9 +2068,9 @@
   gtk_widget_show (insert_include1);
   gtk_container_add (GTK_CONTAINER (edit_menu1), insert_include1);
 
-  image1518 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1518);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_include1), image1518);
+  image1671 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1671);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_include1), image1671);
 
   insert_include1_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (insert_include1), insert_include1_menu);
@@ -2035,9 +2082,9 @@
   gtk_widget_show (comments);
   gtk_container_add (GTK_CONTAINER (edit_menu1), comments);
 
-  image1519 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1519);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (comments), image1519);
+  image1672 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1672);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (comments), image1672);
 
   comments_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (comments), comments_menu);
@@ -2072,10 +2119,14 @@
   gtk_container_add (GTK_CONTAINER (comments_menu), insert_bsd_license_notice1);
   gtk_tooltips_set_tip (tooltips, insert_bsd_license_notice1, _("Inserts a BSD licence notice (should be done at the beginning of the file)"), NULL);
 
-  insert_date2 = gtk_menu_item_new_with_mnemonic (_("Insert Dat_e"));
+  insert_date2 = gtk_image_menu_item_new_with_mnemonic (_("Insert Dat_e"));
   gtk_widget_show (insert_date2);
   gtk_container_add (GTK_CONTAINER (edit_menu1), insert_date2);
 
+  image1673 = gtk_image_new_from_stock ("gtk-add", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1673);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (insert_date2), image1673);
+
   insert_date2_menu = gtk_menu_new ();
   gtk_menu_item_set_submenu (GTK_MENU_ITEM (insert_date2), insert_date2_menu);
 
@@ -2091,9 +2142,9 @@
   gtk_widget_show (find_usage1);
   gtk_container_add (GTK_CONTAINER (edit_menu1), find_usage1);
 
-  image1520 = gtk_image_new_from_stock ("gtk-find", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1520);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (find_usage1), image1520);
+  image1674 = gtk_image_new_from_stock ("gtk-find", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1674);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (find_usage1), image1674);
 
   goto_tag_definition1 = gtk_menu_item_new_with_mnemonic (_("Go to Tag Definition"));
   gtk_widget_show (goto_tag_definition1);
@@ -2113,9 +2164,9 @@
   gtk_container_add (GTK_CONTAINER (edit_menu1), go_to_line);
   gtk_tooltips_set_tip (tooltips, go_to_line, _("Goto to the entered line"), NULL);
 
-  image1521 = gtk_image_new_from_stock ("gtk-jump-to", GTK_ICON_SIZE_MENU);
-  gtk_widget_show (image1521);
-  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (go_to_line), image1521);
+  image1675 = gtk_image_new_from_stock ("gtk-jump-to", GTK_ICON_SIZE_MENU);
+  gtk_widget_show (image1675);
+  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (go_to_line), image1675);
 
   g_signal_connect ((gpointer) undo1, "activate",
                     G_CALLBACK (on_undo1_activate),
@@ -2221,16 +2272,20 @@
   GLADE_HOOKUP_OBJECT (edit_menu1, menu_duplicate_line2, "menu_duplicate_line2");
   GLADE_HOOKUP_OBJECT (edit_menu1, separator31, "separator31");
   GLADE_HOOKUP_OBJECT (edit_menu1, menu_increase_indent2, "menu_increase_indent2");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1516, "image1516");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1669, "image1669");
   GLADE_HOOKUP_OBJECT (edit_menu1, menu_decrease_indent2, "menu_decrease_indent2");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1517, "image1517");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1670, "image1670");
+  GLADE_HOOKUP_OBJECT (edit_menu1, separator38, "separator38");
+  GLADE_HOOKUP_OBJECT (edit_menu1, send_selection_to1, "send_selection_to1");
+  GLADE_HOOKUP_OBJECT (edit_menu1, send_selection_to1_menu, "send_selection_to1_menu");
+  GLADE_HOOKUP_OBJECT (edit_menu1, invisible12, "invisible12");
   GLADE_HOOKUP_OBJECT (edit_menu1, separator17, "separator17");
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_include1, "insert_include1");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1518, "image1518");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1671, "image1671");
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_include1_menu, "insert_include1_menu");
   GLADE_HOOKUP_OBJECT (edit_menu1, invisible3, "invisible3");
   GLADE_HOOKUP_OBJECT (edit_menu1, comments, "comments");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1519, "image1519");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1672, "image1672");
   GLADE_HOOKUP_OBJECT (edit_menu1, comments_menu, "comments_menu");
   GLADE_HOOKUP_OBJECT (edit_menu1, add_changelog_entry2, "add_changelog_entry2");
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_file_header2, "insert_file_header2");
@@ -2239,16 +2294,17 @@
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_gpl_notice1, "insert_gpl_notice1");
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_bsd_license_notice1, "insert_bsd_license_notice1");
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_date2, "insert_date2");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1673, "image1673");
   GLADE_HOOKUP_OBJECT (edit_menu1, insert_date2_menu, "insert_date2_menu");
   GLADE_HOOKUP_OBJECT (edit_menu1, invisible10, "invisible10");
   GLADE_HOOKUP_OBJECT (edit_menu1, separator7, "separator7");
   GLADE_HOOKUP_OBJECT (edit_menu1, find_usage1, "find_usage1");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1520, "image1520");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1674, "image1674");
   GLADE_HOOKUP_OBJECT (edit_menu1, goto_tag_definition1, "goto_tag_definition1");
   GLADE_HOOKUP_OBJECT (edit_menu1, goto_tag_declaration1, "goto_tag_declaration1");
   GLADE_HOOKUP_OBJECT (edit_menu1, separator15, "separator15");
   GLADE_HOOKUP_OBJECT (edit_menu1, go_to_line, "go_to_line");
-  GLADE_HOOKUP_OBJECT (edit_menu1, image1521, "image1521");
+  GLADE_HOOKUP_OBJECT (edit_menu1, image1675, "image1675");
   GLADE_HOOKUP_OBJECT_NO_REF (edit_menu1, tooltips, "tooltips");
 
   gtk_menu_set_accel_group (GTK_MENU (edit_menu1), accel_group);

Modified: trunk/src/keybindings.c
===================================================================
--- trunk/src/keybindings.c	2007-02-25 13:08:01 UTC (rev 1333)
+++ trunk/src/keybindings.c	2007-02-25 14:26:55 UTC (rev 1334)
@@ -39,6 +39,7 @@
 #include "sci_cb.h"
 #include "sciwrappers.h"
 #include "build.h"
+#include "tools.h"
 // include vte.h on non-Win32 systems, else define fake vte_init
 #ifdef HAVE_VTE
 # include "vte.h"
@@ -226,6 +227,12 @@
 		GDK_i, GDK_CONTROL_MASK, "edit_increaseindent", _("Increase indent"));
 	keys[GEANY_KEYS_EDIT_DECREASEINDENT] = fill(cb_func_edit,
 		GDK_i, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "edit_decreaseindent", _("Decrease indent"));
+	keys[GEANY_KEYS_EDIT_SENDTOCMD1] = fill(cb_func_edit,
+		GDK_1, GDK_CONTROL_MASK, "edit_sendtocmd1", _("Send Selection to custom command 1"));
+	keys[GEANY_KEYS_EDIT_SENDTOCMD2] = fill(cb_func_edit,
+		GDK_2, GDK_CONTROL_MASK, "edit_sendtocmd2", _("Send Selection to custom command 2"));
+	keys[GEANY_KEYS_EDIT_SENDTOCMD3] = fill(cb_func_edit,
+		GDK_3, GDK_CONTROL_MASK, "edit_sendtocmd3", _("Send Selection to custom command 3"));
 	keys[GEANY_KEYS_EDIT_GOTOMATCHINGBRACE] = fill(cb_func_edit,
 		GDK_less, GDK_SHIFT_MASK | GDK_CONTROL_MASK, "edit_gotomatchingbrace",
 		_("Goto matching brace"));
@@ -846,6 +853,18 @@
 		case GEANY_KEYS_EDIT_TOUPPERCASE:
 			on_to_upper_case1_activate(NULL, NULL);
 			break;
+		case GEANY_KEYS_EDIT_SENDTOCMD1:
+			if (g_strv_length(app->custom_commands) > 0)
+				tools_execute_custom_command(idx, app->custom_commands[0]);
+			break;
+		case GEANY_KEYS_EDIT_SENDTOCMD2:
+			if (g_strv_length(app->custom_commands) > 1)
+				tools_execute_custom_command(idx, app->custom_commands[1]);
+			break;
+		case GEANY_KEYS_EDIT_SENDTOCMD3:
+			if (g_strv_length(app->custom_commands) > 2)
+				tools_execute_custom_command(idx, app->custom_commands[2]);
+			break;
 	}
 }
 

Modified: trunk/src/keybindings.h
===================================================================
--- trunk/src/keybindings.h	2007-02-25 13:08:01 UTC (rev 1333)
+++ trunk/src/keybindings.h	2007-02-25 14:26:55 UTC (rev 1334)
@@ -100,6 +100,9 @@
 	GEANY_KEYS_EDIT_UNCOMMENTLINE,
 	GEANY_KEYS_EDIT_INCREASEINDENT,
 	GEANY_KEYS_EDIT_DECREASEINDENT,
+	GEANY_KEYS_EDIT_SENDTOCMD1,
+	GEANY_KEYS_EDIT_SENDTOCMD2,
+	GEANY_KEYS_EDIT_SENDTOCMD3,
 	GEANY_KEYS_EDIT_GOTOMATCHINGBRACE,
 	GEANY_KEYS_EDIT_AUTOCOMPLETE,
 	GEANY_KEYS_EDIT_CALLTIP,

Modified: trunk/src/keyfile.c
===================================================================
--- trunk/src/keyfile.c	2007-02-25 13:08:01 UTC (rev 1333)
+++ trunk/src/keyfile.c	2007-02-25 14:26:55 UTC (rev 1334)
@@ -150,6 +150,12 @@
 	}
 #endif
 	g_key_file_set_string(config, PACKAGE, "custom_date_format", app->custom_date_format);
+	if (app->custom_commands != NULL)
+	{
+		g_key_file_set_string_list(config, PACKAGE, "custom_commands",
+				(const gchar**) app->custom_commands, g_strv_length(app->custom_commands));
+	}
+
 	g_key_file_set_string(config, PACKAGE, "editor_font", app->editor_font);
 	g_key_file_set_string(config, PACKAGE, "tagbar_font", app->tagbar_font);
 	g_key_file_set_string(config, PACKAGE, "msgwin_font", app->msgwin_font);
@@ -335,6 +341,7 @@
 	app->brace_match_ltgt = utils_get_setting_boolean(config, PACKAGE, "brace_match_ltgt", FALSE);
 	app->switch_msgwin_pages = utils_get_setting_boolean(config, PACKAGE, "switch_msgwin_pages", FALSE);
 	app->custom_date_format = utils_get_setting_string(config, PACKAGE, "custom_date_format", "");
+	app->custom_commands = g_key_file_get_string_list(config, PACKAGE, "custom_commands", NULL, NULL);
 	app->editor_font = utils_get_setting_string(config, PACKAGE, "editor_font", GEANY_DEFAULT_FONT_EDITOR);
 	app->tagbar_font = utils_get_setting_string(config, PACKAGE, "tagbar_font", GEANY_DEFAULT_FONT_SYMBOL_LIST);
 	app->msgwin_font = utils_get_setting_string(config, PACKAGE, "msgwin_font", GEANY_DEFAULT_FONT_MSG_WINDOW);

Modified: trunk/src/main.c
===================================================================
--- trunk/src/main.c	2007-02-25 13:08:01 UTC (rev 1333)
+++ trunk/src/main.c	2007-02-25 14:26:55 UTC (rev 1334)
@@ -58,6 +58,7 @@
 #include "highlighting.h"
 #include "symbols.h"
 #include "project.h"
+#include "tools.h"
 
 #ifdef HAVE_SOCKET
 # include "socket.h"
@@ -602,6 +603,7 @@
 	ui_create_insert_menu_items();
 	ui_create_insert_date_menu_items();
 	keybindings_init();
+	tools_create_insert_custom_command_menu_items();
 	notebook_init();
 	filetypes_init_types();
 #ifdef GEANY_DEBUG
@@ -745,6 +747,7 @@
 	g_free(app->tools_browser_cmd);
 	g_free(app->tools_print_cmd);
 	g_free(app->tools_grep_cmd);
+	g_strfreev(app->custom_commands);
 	while (! g_queue_is_empty(app->recent_queue))
 	{
 		g_free(g_queue_pop_tail(app->recent_queue));

Modified: trunk/src/tools.c
===================================================================
--- trunk/src/tools.c	2007-02-25 13:08:01 UTC (rev 1333)
+++ trunk/src/tools.c	2007-02-25 14:26:55 UTC (rev 1334)
@@ -27,10 +27,25 @@
 
 #include "geany.h"
 
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+
+#ifdef G_OS_UNIX
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <signal.h>
+#endif
+
+#include "tools.h"
 #include "support.h"
 #include "document.h"
 #include "sciwrappers.h"
+#include "utils.h"
 #include "ui_utils.h"
+#include "callbacks.h"
+#include "msgwindow.h"
+#include "keybindings.h"
 
 
 enum
@@ -40,88 +55,88 @@
 	N_COLUMNS
 };
 
-static GtkWidget *special_characters_dialog = NULL;
-static GtkTreeStore *special_characters_store = NULL;
-static GtkTreeView *special_characters_tree = NULL;
+static GtkWidget *sc_dialog = NULL;
+static GtkTreeStore *sc_store = NULL;
+static GtkTreeView *sc_tree = NULL;
 
-static void on_tools_show_dialog_insert_special_chars_response
+static void sc_on_tools_show_dialog_insert_special_chars_response
 		(GtkDialog *dialog, gint response, gpointer user_data);
-static void on_special_characters_tree_row_activated
+static void sc_on_tree_row_activated
 		(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, gpointer user_data);
-static void special_characters_fill_store(GtkTreeStore *store);
-static gboolean special_characters_insert(GtkTreeModel *model, GtkTreeIter *iter);
+static void sc_fill_store(GtkTreeStore *store);
+static gboolean sc_insert(GtkTreeModel *model, GtkTreeIter *iter);
 
 
 
 void tools_show_dialog_insert_special_chars()
 {
-	if (special_characters_dialog == NULL)
+	if (sc_dialog == NULL)
 	{
 		gint height;
 		GtkCellRenderer *renderer;
 		GtkTreeViewColumn *column;
 		GtkWidget *swin, *vbox, *label;
 
-		special_characters_dialog = gtk_dialog_new_with_buttons(
+		sc_dialog = gtk_dialog_new_with_buttons(
 					_("Special characters"), GTK_WINDOW(app->window),
 					GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 					_("_Insert"), GTK_RESPONSE_OK, NULL);
-		vbox = ui_dialog_vbox_new(GTK_DIALOG(special_characters_dialog));
+		vbox = ui_dialog_vbox_new(GTK_DIALOG(sc_dialog));
 		gtk_box_set_spacing(GTK_BOX(vbox), 6);
 
 		height = GEANY_WINDOW_MINIMAL_HEIGHT;
-		gtk_window_set_default_size(GTK_WINDOW(special_characters_dialog), height * 0.8, height);
-		gtk_dialog_set_default_response(GTK_DIALOG(special_characters_dialog), GTK_RESPONSE_CANCEL);
+		gtk_window_set_default_size(GTK_WINDOW(sc_dialog), height * 0.8, height);
+		gtk_dialog_set_default_response(GTK_DIALOG(sc_dialog), GTK_RESPONSE_CANCEL);
 
 		label = gtk_label_new(_("Choose a special character from the list below and double click on it or use the button to insert it at the current cursor position."));
 		gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
 		gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
 		gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
 
-		special_characters_tree = GTK_TREE_VIEW(gtk_tree_view_new());
+		sc_tree = GTK_TREE_VIEW(gtk_tree_view_new());
 
-		special_characters_store = gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING);
-		gtk_tree_view_set_model(GTK_TREE_VIEW(special_characters_tree),
-								GTK_TREE_MODEL(special_characters_store));
+		sc_store = gtk_tree_store_new(N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING);
+		gtk_tree_view_set_model(GTK_TREE_VIEW(sc_tree),
+								GTK_TREE_MODEL(sc_store));
 
 		renderer = gtk_cell_renderer_text_new();
 		column = gtk_tree_view_column_new_with_attributes(
 								_("Character"), renderer, "text", COLUMN_CHARACTER, NULL);
 		gtk_tree_view_column_set_resizable(column, TRUE);
-		gtk_tree_view_append_column(GTK_TREE_VIEW(special_characters_tree), column);
+		gtk_tree_view_append_column(GTK_TREE_VIEW(sc_tree), column);
 
 		renderer = gtk_cell_renderer_text_new();
 		column = gtk_tree_view_column_new_with_attributes(
 								_("HTML (name)"), renderer, "text", COLUMN_HTML_NAME, NULL);
 		gtk_tree_view_column_set_resizable(column, TRUE);
-		gtk_tree_view_append_column(GTK_TREE_VIEW(special_characters_tree), column);
+		gtk_tree_view_append_column(GTK_TREE_VIEW(sc_tree), column);
 
 		swin = gtk_scrolled_window_new(NULL, NULL);
 		gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(swin), GTK_POLICY_AUTOMATIC,
 			GTK_POLICY_AUTOMATIC);
 		gtk_scrolled_window_add_with_viewport(
-					GTK_SCROLLED_WINDOW(swin), GTK_WIDGET(special_characters_tree));
+					GTK_SCROLLED_WINDOW(swin), GTK_WIDGET(sc_tree));
 
 		gtk_box_pack_start(GTK_BOX(vbox), swin, TRUE, TRUE, 0);
 
-		g_signal_connect((gpointer) special_characters_tree, "row-activated",
-					G_CALLBACK(on_special_characters_tree_row_activated), NULL);
+		g_signal_connect((gpointer) sc_tree, "row-activated",
+					G_CALLBACK(sc_on_tree_row_activated), NULL);
 
-		g_signal_connect((gpointer) special_characters_dialog, "response",
-					G_CALLBACK(on_tools_show_dialog_insert_special_chars_response), NULL);
+		g_signal_connect((gpointer) sc_dialog, "response",
+					G_CALLBACK(sc_on_tools_show_dialog_insert_special_chars_response), NULL);
 
-		special_characters_fill_store(special_characters_store);
+		sc_fill_store(sc_store);
 
 		//gtk_tree_view_expand_all(special_characters_tree);
-		gtk_tree_view_set_search_column(special_characters_tree, COLUMN_HTML_NAME);
+		gtk_tree_view_set_search_column(sc_tree, COLUMN_HTML_NAME);
 	}
-	gtk_widget_show_all(special_characters_dialog);
+	gtk_widget_show_all(sc_dialog);
 }
 
 
 // fill the tree model with data
 /// TODO move this in a file and make it extendable for more data types
-static void special_characters_fill_store(GtkTreeStore *store)
+static void sc_fill_store(GtkTreeStore *store)
 {
 	GtkTreeIter iter;
 	GtkTreeIter *parent_iter = NULL;
@@ -411,7 +426,7 @@
 
 /* just inserts the HTML_NAME coloumn of the selected row at current position
  * returns only TRUE if a valid selection(i.e. no category) could be found */
-static gboolean special_characters_insert(GtkTreeModel *model, GtkTreeIter *iter)
+static gboolean sc_insert(GtkTreeModel *model, GtkTreeIter *iter)
 {
 	gint idx = document_get_cur_idx();
 	gboolean result = FALSE;
@@ -433,7 +448,7 @@
 }
 
 
-static void on_tools_show_dialog_insert_special_chars_response(GtkDialog *dialog, gint response,
+static void sc_on_tools_show_dialog_insert_special_chars_response(GtkDialog *dialog, gint response,
 														gpointer user_data)
 {
 	if (response == GTK_RESPONSE_OK)
@@ -442,12 +457,12 @@
 		GtkTreeModel *model;
 		GtkTreeIter iter;
 
-		selection = gtk_tree_view_get_selection(special_characters_tree);
+		selection = gtk_tree_view_get_selection(sc_tree);
 
 		if (gtk_tree_selection_get_selected(selection, &model, &iter))
 		{
 			// only hide dialog if selection was not a category
-			if (special_characters_insert(model, &iter))
+			if (sc_insert(model, &iter))
 				gtk_widget_hide(GTK_WIDGET(dialog));
 		}
 	}
@@ -456,23 +471,404 @@
 }
 
 
-static void on_special_characters_tree_row_activated(GtkTreeView *treeview, GtkTreePath *path,
+static void sc_on_tree_row_activated(GtkTreeView *treeview, GtkTreePath *path,
 											  GtkTreeViewColumn *col, gpointer user_data)
 {
 	GtkTreeIter iter;
-	GtkTreeModel *model = GTK_TREE_MODEL(special_characters_store);
+	GtkTreeModel *model = GTK_TREE_MODEL(sc_store);
 
 	if (gtk_tree_model_get_iter(model, &iter, path))
 	{
 		// only hide dialog if selection was not a category
-		if (special_characters_insert(model, &iter))
-			gtk_widget_hide(special_characters_dialog);
+		if (sc_insert(model, &iter))
+			gtk_widget_hide(sc_dialog);
 		else
 		{	// double click on a category to toggle the expand or collapse it
-			if (gtk_tree_view_row_expanded(special_characters_tree, path))
-				gtk_tree_view_collapse_row(special_characters_tree, path);
+			if (gtk_tree_view_row_expanded(sc_tree, path))
+				gtk_tree_view_collapse_row(sc_tree, path);
 			else
-				gtk_tree_view_expand_row(special_characters_tree, path, FALSE);
+				gtk_tree_view_expand_row(sc_tree, path, FALSE);
 		}
 	}
 }
+
+
+/* custom commands code*/
+struct cc_dialog
+{
+	gint count;
+	GtkWidget *box;
+};
+
+
+static void cc_add_command(struct cc_dialog *cc, gint index)
+{
+	GtkWidget *label, *entry, *hbox;
+	gchar str[6];
+
+	hbox = gtk_hbox_new(FALSE, 5);
+	g_snprintf(str, 5, "%d:", cc->count);
+	label = gtk_label_new(str);
+
+	entry = gtk_entry_new();
+	if (index >= 0)
+		gtk_entry_set_text(GTK_ENTRY(entry), app->custom_commands[index]);
+	gtk_entry_set_max_length(GTK_ENTRY(entry), 255);
+	gtk_entry_set_width_chars(GTK_ENTRY(entry), 30);
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
+	gtk_widget_show_all(hbox);
+	gtk_container_add(GTK_CONTAINER(cc->box), hbox);
+	cc->count++;
+}
+
+
+static void cc_on_custom_commands_dlg_add_clicked(GtkToolButton *toolbutton, struct cc_dialog *cc)
+{
+	cc_add_command(cc, -1);
+}
+
+
+static gboolean cc_iofunc(GIOChannel *ioc, GIOCondition cond, gpointer data)
+{
+	if (cond & (G_IO_IN | G_IO_PRI))
+	{
+		gint idx = GPOINTER_TO_INT(data);
+		gchar *msg = NULL;
+		GString *str = g_string_sized_new(256);
+
+		while (g_io_channel_read_line(ioc, &msg, NULL, NULL, NULL) && msg != NULL)
+		{
+			g_string_append(str, msg);
+			g_free(msg);
+		}
+		/// without the following if we replace the selection several hundred times with "" because
+		/// we get to often in this callback but I don't know why
+		if (str->len > 0)
+		{
+			sci_replace_sel(doc_list[idx].sci, str->str);
+		}
+		g_string_free(str, TRUE);
+
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+
+static gboolean cc_iofunc_err(GIOChannel *ioc, GIOCondition cond, gpointer data)
+{
+	if (cond & (G_IO_IN | G_IO_PRI))
+	{
+		gchar *msg = NULL;
+
+		while (g_io_channel_read_line(ioc, &msg, NULL, NULL, NULL) && msg != NULL)
+		{
+			g_warning("%s: %s", (const gchar*) data, g_strstrip(msg));
+			g_free(msg);
+		}
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+
+/* Executes command (which should include all necessary command line args) and passes the current
+ * selection through the standard input of command. The whole output of command replaces the
+ * current selection. */
+void tools_execute_custom_command(gint idx, const gchar *command)
+{
+	GError *error = NULL;
+	GPid pid;
+	gchar **argv;
+	gint stdin_fd;
+	gint stdout_fd;
+	gint stderr_fd;
+
+	g_return_if_fail(DOC_IDX_VALID(idx) && command != NULL);
+
+	if (! sci_can_copy(doc_list[idx].sci))
+		return;
+
+	argv = g_strsplit(command, " ", -1);
+	msgwin_status_add(_("Passing data and executing custom command: %s"), command);
+
+	if (g_spawn_async_with_pipes(NULL, argv, NULL, G_SPAWN_SEARCH_PATH,
+						NULL, NULL, &pid, &stdin_fd, &stdout_fd, &stderr_fd, &error))
+	{
+		gchar *sel;
+		gint len;
+
+		// use GIOChannel to monitor stdout
+		/// TODO there is something wrong with the whole channel code because the callback is
+		/// called about several hundred times
+		utils_set_up_io_channel(stdout_fd, G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
+				cc_iofunc, GINT_TO_POINTER(idx));
+		// copy program's stderr to Geany's stdout to help error tracking
+		utils_set_up_io_channel(stderr_fd, G_IO_IN|G_IO_PRI|G_IO_ERR|G_IO_HUP|G_IO_NVAL,
+				cc_iofunc_err, (gpointer)command);
+
+		// get selection
+		len = sci_get_selected_text_length(doc_list[idx].sci);
+		sel = g_malloc0(len);
+		sci_get_selected_text(doc_list[idx].sci, sel);
+
+		// write data to the command
+		write(stdin_fd, sel, len - 1);
+		close(stdin_fd);
+		g_free(sel);
+	}
+	else
+	{
+		geany_debug("g_spawn_async_with_pipes() failed: %s", error->message);
+		g_error_free(error);
+	}
+
+	g_strfreev(argv);
+}
+
+
+static void cc_show_dialog_custom_commands()
+{
+	GtkWidget *dialog, *label, *vbox, *button;
+	gint i;
+	struct cc_dialog cc;
+
+	dialog = gtk_dialog_new_with_buttons(_("Set Custom Commands"), GTK_WINDOW(app->window),
+						GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+						GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL);
+	vbox = ui_dialog_vbox_new(GTK_DIALOG(dialog));
+	gtk_box_set_spacing(GTK_BOX(vbox), 6);
+
+	label = gtk_label_new(_("You can send the current selection to any of these commands and the output of the command replaces the current selection."));
+	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
+	gtk_container_add(GTK_CONTAINER(vbox), label);
+
+	cc.count = 1;
+	cc.box = gtk_vbox_new(FALSE, 0);
+	gtk_container_add(GTK_CONTAINER(vbox), cc.box);
+
+	if (app->custom_commands == NULL || g_strv_length(app->custom_commands) == 0)
+	{
+		cc_add_command(&cc, -1);
+	}
+	else
+	{
+		for (i = 0; i < g_strv_length(app->custom_commands); i++)
+		{
+			if (app->custom_commands[i][0] == '\0')
+				continue; // skip empty fields
+
+			cc_add_command(&cc, i);
+		}
+	}
+
+	button = gtk_button_new_from_stock("gtk-add");
+	g_signal_connect((gpointer) button, "clicked",
+			G_CALLBACK(cc_on_custom_commands_dlg_add_clicked), &cc);
+	gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);
+
+	gtk_widget_show_all(vbox);
+
+	if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
+	{
+		// get all hboxes which contain a label and an entry element
+		GList *children = gtk_container_get_children(GTK_CONTAINER(cc.box));
+		GList *tmp;
+		GSList *result_list = NULL;
+		gint i = 0;
+		gint len = 0;
+		gchar **result;
+		const gchar *text;
+
+		while (children != NULL)
+		{
+			// get the contents of each hbox
+			tmp = gtk_container_get_children(GTK_CONTAINER(children->data));
+
+			// first element of the list is the label, so skip it and get the entry element
+			tmp = tmp->next;
+
+			text = gtk_entry_get_text(GTK_ENTRY(tmp->data));
+
+			// if the content of the entry is non-empty, add it to the result array
+			if (text[0] != '\0')
+			{
+				result_list = g_slist_append(result_list, g_strdup(text));
+				len++;
+			}
+			children = children->next;
+		}
+		// create a new null-terminated array
+		result = g_new(gchar*, len + 1);
+		while (result_list != NULL)
+		{
+			result[i] = (gchar*) result_list->data;
+
+			result_list = result_list->next;
+			i++;
+		}
+		g_slist_free(result_list);
+		g_list_free(children);
+		result[len] = NULL; // null-terminate the array
+		g_strfreev(app->custom_commands);
+		app->custom_commands = result;
+		tools_create_insert_custom_command_menu_items();
+	}
+	gtk_widget_destroy(dialog);
+}
+
+
+/* enable or disable all custom command menu items when the sub menu is opened */
+static void cc_on_custom_command_menu_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+	gint idx = document_get_cur_idx();
+	gint i, len;
+	gboolean enable;
+	GList *children;
+
+	if (! DOC_IDX_VALID(idx)) return;
+
+	enable = sci_can_copy(doc_list[idx].sci);
+
+	children = gtk_container_get_children(GTK_CONTAINER(user_data));
+	len = g_list_length(children);
+	i = 0;
+	while (children != NULL)
+	{
+		if (i == (len - 2))
+			break; // stop before the last two elements (the seperator and the set entry)
+
+		gtk_widget_set_sensitive(GTK_WIDGET(children->data), enable);
+		children = children->next;
+		i++;
+	}
+}
+
+
+static void cc_on_custom_command_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+	gint idx = document_get_cur_idx();
+	gint command_idx;
+
+	if (! DOC_IDX_VALID(idx)) return;
+
+	command_idx = GPOINTER_TO_INT(user_data);
+
+	if (app->custom_commands == NULL ||
+		command_idx < 0 || command_idx > g_strv_length(app->custom_commands))
+	{
+		cc_show_dialog_custom_commands();
+		return;
+	}
+
+	// send it through the command and when the command returned the output the current selection
+	// will be replaced
+	tools_execute_custom_command(idx, app->custom_commands[command_idx]);
+}
+
+
+static void cc_insert_custom_command_items(GtkMenu *me, GtkMenu *mp, gchar *label, gint idx)
+{
+	GtkWidget *item;
+	gint key_idx = -1;
+
+	switch (idx)
+	{
+		case 0: key_idx = GEANY_KEYS_EDIT_SENDTOCMD1; break;
+		case 1: key_idx = GEANY_KEYS_EDIT_SENDTOCMD2; break;
+		case 2: key_idx = GEANY_KEYS_EDIT_SENDTOCMD3; break;
+	}
+
+	item = gtk_menu_item_new_with_label(label);
+	if (key_idx != -1)
+		gtk_widget_add_accelerator(item, "activate", gtk_accel_group_new(),
+			keys[key_idx]->key, keys[key_idx]->mods, GTK_ACCEL_VISIBLE);
+	gtk_container_add(GTK_CONTAINER(me), item);
+	gtk_widget_show(item);
+	g_signal_connect((gpointer) item, "activate", G_CALLBACK(cc_on_custom_command_activate),
+		GINT_TO_POINTER(idx));
+
+	item = gtk_menu_item_new_with_label(label);
+	if (key_idx != -1)
+		gtk_widget_add_accelerator(item, "activate", gtk_accel_group_new(),
+			keys[key_idx]->key, keys[key_idx]->mods, GTK_ACCEL_VISIBLE);
+	gtk_container_add(GTK_CONTAINER(mp), item);
+	gtk_widget_show(item);
+	g_signal_connect((gpointer) item, "activate", G_CALLBACK(cc_on_custom_command_activate),
+		GINT_TO_POINTER(idx));
+}
+
+
+void tools_create_insert_custom_command_menu_items()
+{
+	GtkMenu *menu_edit = GTK_MENU(lookup_widget(app->window, "send_selection_to2_menu"));
+	GtkMenu *menu_popup = GTK_MENU(lookup_widget(app->popup_menu, "send_selection_to1_menu"));
+	GtkWidget *item;
+	GList *me_children;
+	GList *mp_children;
+	static gboolean signal_set = FALSE;
+
+	// first clean the menus to be able to rebuild them
+	me_children = gtk_container_get_children(GTK_CONTAINER(menu_edit));
+	mp_children = gtk_container_get_children(GTK_CONTAINER(menu_popup));
+	while (me_children != NULL)
+	{
+		gtk_widget_destroy(GTK_WIDGET(me_children->data));
+		gtk_widget_destroy(GTK_WIDGET(mp_children->data));
+
+		me_children = me_children->next;
+		mp_children = mp_children->next;
+	}
+
+
+	if (app->custom_commands == NULL || g_strv_length(app->custom_commands) == 0)
+	{
+		item = gtk_menu_item_new_with_label(_("No custom commands defined."));
+		gtk_container_add(GTK_CONTAINER(menu_edit), item);
+		gtk_widget_set_sensitive(item, FALSE);
+		gtk_widget_show(item);
+		item = gtk_menu_item_new_with_label(_("No custom commands defined."));
+		gtk_container_add(GTK_CONTAINER(menu_popup), item);
+		gtk_widget_set_sensitive(item, FALSE);
+		gtk_widget_show(item);
+	}
+	else
+	{
+		gint i;
+		gint idx = 0;
+		for (i = 0; i < g_strv_length(app->custom_commands); i++)
+		{
+			if (app->custom_commands[i][0] != '\0') // skip empty fields
+			{
+				cc_insert_custom_command_items(menu_edit, menu_popup, app->custom_commands[i], idx);
+				idx++;
+			}
+		}
+	}
+
+	// separator and Set menu item
+	item = gtk_separator_menu_item_new();
+	gtk_container_add(GTK_CONTAINER(menu_edit), item);
+	gtk_widget_show(item);
+	item = gtk_separator_menu_item_new();
+	gtk_container_add(GTK_CONTAINER(menu_popup), item);
+	gtk_widget_show(item);
+
+	cc_insert_custom_command_items(menu_edit, menu_popup, _("Set Custom Commands"), -1);
+
+	if (! signal_set)
+	{
+		g_signal_connect((gpointer) lookup_widget(app->popup_menu, "send_selection_to1"),
+					"activate", G_CALLBACK(cc_on_custom_command_menu_activate), menu_popup);
+		g_signal_connect((gpointer) lookup_widget(app->window, "send_selection_to2"),
+					"activate", G_CALLBACK(cc_on_custom_command_menu_activate), menu_edit);
+		signal_set = TRUE;
+	}
+}
+
+
+

Modified: trunk/src/tools.h
===================================================================
--- trunk/src/tools.h	2007-02-25 13:08:01 UTC (rev 1333)
+++ trunk/src/tools.h	2007-02-25 14:26:55 UTC (rev 1334)
@@ -27,4 +27,8 @@
 
 void tools_show_dialog_insert_special_chars();
 
+void tools_create_insert_custom_command_menu_items();
+
+void tools_execute_custom_command(gint idx, const gchar *command);
+
 #endif


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