SF.net SVN: geany: [1078] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Sun Dec 10 21:29:06 UTC 2006


Revision: 1078
          http://svn.sourceforge.net/geany/?rev=1078&view=rev
Author:   eht16
Date:     2006-12-10 13:29:04 -0800 (Sun, 10 Dec 2006)

Log Message:
-----------
Added option to execute programs in the VTE instead of executing them in a terminal emulation window (closes #1594456).

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/build.c
    trunk/src/callbacks.c
    trunk/src/document.c
    trunk/src/keyfile.c
    trunk/src/prefs.c
    trunk/src/vte.c
    trunk/src/vte.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2006-12-09 17:03:03 UTC (rev 1077)
+++ trunk/ChangeLog	2006-12-10 21:29:04 UTC (rev 1078)
@@ -1,3 +1,11 @@
+2006-12-10  Enrico Tröger  <enrico.troeger at uvena.de>
+
+ * src/build.c, src/callbacks.c, src/document.c, src/keyfile.c,
+   src/prefs.c, src/vte.c, src/vte.h:
+   Added option to execute programs in the VTE instead of executing
+   them in a terminal emulation window (closes #1594456).
+
+
 2006-12-09  Nick Treleaven  <nick.treleaven at btinternet.com>
 
  * src/build.c:
@@ -29,7 +37,7 @@
    Use ui_button_new_with_image() in dialogs_show_unsaved_file().
 
 
-2006-12-08  Enrico Troeger  <enrico.troeger at uvena.de>
+2006-12-08  Enrico Tröger  <enrico.troeger at uvena.de>
 
  * src/build.c: Made the created run script for command execution a bit
                 more portable to other shells than bash (thanks to
@@ -41,7 +49,6 @@
  * src/msgwindow.c: Removed compiler warning.
  * src/sci_cb.c, src/sci_cb.h:
    Made sci_cb_get_indent and sci_Cb_auto_multiline static.
- * src/sci_cb.c, src/sci_cb.h:
    Improved auto completion of multi line comments and support
    /+ +/ for D files.
  * src/msgwindow.c: Fixed wrong check button state in view menu if

Modified: trunk/src/build.c
===================================================================
--- trunk/src/build.c	2006-12-09 17:03:03 UTC (rev 1077)
+++ trunk/src/build.c	2006-12-10 21:29:04 UTC (rev 1078)
@@ -44,6 +44,7 @@
 #include "msgwindow.h"
 #include "document.h"
 #include "keybindings.h"
+#include "vte.h"
 
 
 BuildInfo build_info = {GBO_COMPILE, 0, NULL, GEANY_FILETYPES_ALL, NULL};
@@ -493,6 +494,7 @@
 	gchar	*executable = NULL;
 	gchar	*script_name;
 	guint    term_argv_len, i;
+	gboolean autoclose = FALSE;
 	struct stat st;
 
 	if (! DOC_IDX_VALID(idx) || doc_list[idx].file_name == NULL) return (GPid) 1;
@@ -589,9 +591,14 @@
 	g_free(tmp);
 	cmd = utils_str_replace(cmd, "%e", executable);
 
+#ifdef HAVE_VTE
+	if (vte_info.load_vte && vc != NULL && vc->run_in_vte)
+		autoclose = TRUE; // don't wait for user input at the end of script when we are running in VTE
+#endif
+
 	// write a little shellscript to call the executable (similar to anjuta_launcher but "internal")
 	// (script_name should be ok in UTF8 without converting in locale because it contains no umlauts)
-	if (! build_create_shellscript(idx, script_name, cmd, FALSE))
+	if (! build_create_shellscript(idx, script_name, cmd, autoclose))
 	{
 		utf8_check_executable = utils_remove_ext_from_filename(doc_list[idx].file_name);
 		msgwin_status_add(_("Failed to execute %s (start-script could not be created)"),
@@ -600,39 +607,60 @@
 		goto free_strings;
 	}
 
-	argv = g_new0(gchar *, term_argv_len + 3);
-	for (i = 0; i < term_argv_len; i++)
+#ifdef HAVE_VTE
+	if (vte_info.load_vte && vc != NULL && vc->run_in_vte)
 	{
-		argv[i] = g_strdup(term_argv[i]);
+		gchar *cmd = g_strconcat(script_name, "\n", NULL);
+		// change into current directory if it is not done by default
+		if (! vc->follow_path) vte_cwd(doc_list[idx].file_name, TRUE);
+		vte_send_cmd(cmd);
+
+		// show the VTE
+		gtk_notebook_set_current_page(GTK_NOTEBOOK(msgwindow.notebook), MSG_VTE);
+		gtk_widget_grab_focus(vc->vte);
+		msgwin_show();
+
+		run_info.pid = 1;
+
+		g_free(cmd);
 	}
+	else
+#endif
+	{
+		argv = g_new0(gchar *, term_argv_len + 3);
+		for (i = 0; i < term_argv_len; i++)
+		{
+			argv[i] = g_strdup(term_argv[i]);
+		}
 #ifdef G_OS_WIN32
-	// command line arguments for cmd.exe
-	argv[term_argv_len   ]  = g_strdup("/Q /C");
-	argv[term_argv_len + 1] = g_path_get_basename(script_name);
+		// command line arguments for cmd.exe
+		argv[term_argv_len   ]  = g_strdup("/Q /C");
+		argv[term_argv_len + 1] = g_path_get_basename(script_name);
 #else
-	argv[term_argv_len   ]  = g_strdup("-e");
-	argv[term_argv_len + 1] = g_strdup(script_name);
+		argv[term_argv_len   ]  = g_strdup("-e");
+		argv[term_argv_len + 1] = g_strdup(script_name);
 #endif
-	argv[term_argv_len + 2] = NULL;
+		argv[term_argv_len + 2] = NULL;
 
-	if (! g_spawn_async_with_pipes(working_dir, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
-						NULL, NULL, &(run_info.pid), NULL, NULL, NULL, &error))
-	{
-		geany_debug("g_spawn_async_with_pipes() failed: %s", error->message);
-		msgwin_status_add(_("Process failed (%s)"), error->message);
-		unlink(script_name);
-		g_error_free(error);
-		error = NULL;
-		result_id = (GPid) 0;
-		goto free_strings;
+		if (! g_spawn_async_with_pipes(working_dir, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
+							NULL, NULL, &(run_info.pid), NULL, NULL, NULL, &error))
+		{
+			geany_debug("g_spawn_async_with_pipes() failed: %s", error->message);
+			msgwin_status_add(_("Process failed (%s)"), error->message);
+			unlink(script_name);
+			g_error_free(error);
+			error = NULL;
+			result_id = (GPid) 0;
+			goto free_strings;
+		}
+
+		if (run_info.pid > 0)
+		{
+			g_child_watch_add(run_info.pid, (GChildWatchFunc) run_exit_cb, NULL);
+			build_menu_update(idx);
+		}
 	}
-
 	result_id = run_info.pid; // g_spawn was successful, result is child process id
-	if (run_info.pid > 0)
-	{
-		g_child_watch_add(run_info.pid, (GChildWatchFunc) run_exit_cb, NULL);
-		build_menu_update(idx);
-	}
 
 	free_strings:
 	/* free all non-NULL strings */
@@ -782,8 +810,8 @@
 #else
 	str = g_strdup_printf(
 		"#!/bin/sh\n\n%s\n\necho \"\n\n------------------\n(program exited with code: $?)\" \
-		\n\necho \"Press return to continue\"\n%s\nunlink $0\n", cmd, (autoclose) ? "" :
-		"#to be more compatible with shells like dash\ndummy_var=\"\"\nread dummy_var");
+		\n\n%s\nunlink $0\n", cmd, (autoclose) ? "" :
+		"\necho \"Press return to continue\"\n#to be more compatible with shells like dash\ndummy_var=\"\"\nread dummy_var");
 #endif
 
 	fputs(str, fp);

Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c	2006-12-09 17:03:03 UTC (rev 1077)
+++ trunk/src/callbacks.c	2006-12-10 21:29:04 UTC (rev 1078)
@@ -719,7 +719,7 @@
 		utils_check_disk_status(idx);
 
 #ifdef HAVE_VTE
-	vte_cwd(doc_list[idx].file_name);
+	vte_cwd(doc_list[idx].file_name, FALSE);
 #endif
 	}
 }

Modified: trunk/src/document.c
===================================================================
--- trunk/src/document.c	2006-12-09 17:03:03 UTC (rev 1077)
+++ trunk/src/document.c	2006-12-10 21:29:04 UTC (rev 1078)
@@ -786,7 +786,7 @@
 {
 	struct stat st;
 	gchar *locale_filename;
-	
+
 	g_return_val_if_fail(DOC_IDX_VALID(idx), FALSE);
 
 	locale_filename = utils_get_locale_from_utf8(doc_list[idx].file_name);
@@ -937,7 +937,7 @@
 		ui_update_statusbar(idx, -1);
 		g_free(basename);
 #ifdef HAVE_VTE
-		vte_cwd(doc_list[idx].file_name);
+		vte_cwd(doc_list[idx].file_name, FALSE);
 #endif
 
 	}

Modified: trunk/src/keyfile.c
===================================================================
--- trunk/src/keyfile.c	2006-12-09 17:03:03 UTC (rev 1077)
+++ trunk/src/keyfile.c	2006-12-10 21:29:04 UTC (rev 1078)
@@ -128,6 +128,7 @@
 		g_key_file_set_boolean(config, "VTE", "scroll_on_out", vc->scroll_on_out);
 		g_key_file_set_boolean(config, "VTE", "ignore_menu_bar_accel", vc->ignore_menu_bar_accel);
 		g_key_file_set_boolean(config, "VTE", "follow_path", vc->follow_path);
+		g_key_file_set_boolean(config, "VTE", "run_in_vte", vc->run_in_vte);
 		g_key_file_set_integer(config, "VTE", "scrollback_lines", vc->scrollback_lines);
 		g_key_file_set_string(config, "VTE", "font", vc->font);
 		g_key_file_set_string(config, "VTE", "shell", vc->shell);
@@ -397,6 +398,7 @@
 		vc->scroll_on_out = utils_get_setting_boolean(config, "VTE", "scroll_on_out", TRUE);
 		vc->ignore_menu_bar_accel = utils_get_setting_boolean(config, "VTE", "ignore_menu_bar_accel", FALSE);
 		vc->follow_path = utils_get_setting_boolean(config, "VTE", "follow_path", FALSE);
+		vc->run_in_vte = utils_get_setting_boolean(config, "VTE", "run_in_vte", FALSE);
 		vc->scrollback_lines = utils_get_setting_integer(config, "VTE", "scrollback_lines", 500);
 		vc->colour_fore = g_new0(GdkColor, 1);
 		vc->colour_back = g_new0(GdkColor, 1);

Modified: trunk/src/prefs.c
===================================================================
--- trunk/src/prefs.c	2006-12-09 17:03:03 UTC (rev 1077)
+++ trunk/src/prefs.c	2006-12-10 21:29:04 UTC (rev 1078)
@@ -375,6 +375,9 @@
 
 		widget = lookup_widget(app->prefs_dialog, "check_follow_path");
 		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->follow_path);
+
+		widget = lookup_widget(app->prefs_dialog, "check_run_in_vte");
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), vc->run_in_vte);
 	}
 #endif
 }
@@ -628,6 +631,9 @@
 			widget = lookup_widget(app->prefs_dialog, "check_follow_path");
 			vc->follow_path = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
 
+			widget = lookup_widget(app->prefs_dialog, "check_run_in_vte");
+			vc->run_in_vte = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
+
 			vte_apply_user_settings();
 		}
 #endif

Modified: trunk/src/vte.c
===================================================================
--- trunk/src/vte.c	2006-12-09 17:03:03 UTC (rev 1077)
+++ trunk/src/vte.c	2006-12-10 21:29:04 UTC (rev 1078)
@@ -390,48 +390,47 @@
  * Determines the working directory using various OS-specific mechanisms. */
 const gchar* vte_get_working_directory()
 {
-  gchar  buffer[4096 + 1];
-  gchar *file;
-  gchar *cwd;
-  gint   length;
+	gchar  buffer[4096 + 1];
+	gchar *file;
+	gchar *cwd;
+	gint   length;
 
-  if (pid >= 0)
-    {
-      file = g_strdup_printf ("/proc/%d/cwd", pid);
-      length = readlink (file, buffer, sizeof (buffer));
+	if (pid >= 0)
+	{
+		file = g_strdup_printf("/proc/%d/cwd", pid);
+		length = readlink(file, buffer, sizeof (buffer));
 
-      if (length > 0 && *buffer == '/')
-        {
-          buffer[length] = '\0';
-          g_free(vte_info.dir);
-          vte_info.dir = g_strdup (buffer);
-        }
-      else if (length == 0)
-        {
-          cwd = g_get_current_dir ();
-          if (G_LIKELY (cwd != NULL))
-            {
-              if (chdir (file) == 0)
-                {
-				  g_free(vte_info.dir);
-				  vte_info.dir = g_get_current_dir ();
-                  chdir (cwd);
-                }
+		if (length > 0 && *buffer == '/')
+		{
+			buffer[length] = '\0';
+			g_free(vte_info.dir);
+			vte_info.dir = g_strdup(buffer);
+		}
+		else if (length == 0)
+		{
+			cwd = g_get_current_dir();
+			if (G_LIKELY(cwd != NULL))
+			{
+				if (chdir(file) == 0)
+				{
+					g_free(vte_info.dir);
+					vte_info.dir = g_get_current_dir();
+					chdir(cwd);
+				}
+				g_free(cwd);
+			}
+		}
+		g_free(file);
+	}
 
-              g_free (cwd);
-            }
-        }
-
-      g_free (file);
-    }
-
-  return vte_info.dir;
+	return vte_info.dir;
 }
 
 
-void vte_cwd(const gchar *filename)
+// if force is set to TRUE, it will always change the cwd
+void vte_cwd(const gchar *filename, gboolean force)
 {
-	if (vte_info.have_vte && vc->follow_path && filename != NULL)
+	if (vte_info.have_vte && (vc->follow_path || force) && filename != NULL)
 	{
 		gchar *path;
 		gchar *cmd;
@@ -488,7 +487,7 @@
 		GtkWidget *notebook, *vbox, *label, *alignment, *table, *frame, *box;
 		GtkWidget *font_term, *color_fore, *color_back, *spin_scrollback, *entry_emulation;
 		GtkWidget *check_scroll_key, *check_scroll_out, *check_follow_path, *check_ignore_menu_key;
-		GtkWidget *entry_shell, *button_shell, *image_shell;
+		GtkWidget *check_run_in_vte, *entry_shell, *button_shell, *image_shell;
 		GtkTooltips *tooltips;
 		GtkObject *spin_scrollback_adj;
 
@@ -622,6 +621,11 @@
 		gtk_button_set_focus_on_click(GTK_BUTTON(check_follow_path), FALSE);
 		gtk_container_add(GTK_CONTAINER(box), check_follow_path);
 
+		check_run_in_vte = gtk_check_button_new_with_mnemonic(_("Execute programs in VTE"));
+		gtk_tooltips_set_tip(tooltips, check_run_in_vte, _("Run programs in VTE instead of opening a terminal emulation window. Please note, programs executed in VTE cannot be stopped."), NULL);
+		gtk_button_set_focus_on_click(GTK_BUTTON(check_run_in_vte), FALSE);
+		gtk_container_add(GTK_CONTAINER(box), check_run_in_vte);
+
 		gtk_box_pack_start(GTK_BOX(vbox), box, FALSE, FALSE, 0);
 
 		g_object_set_data_full(G_OBJECT(app->prefs_dialog), "font_term",
@@ -644,6 +648,8 @@
 				gtk_widget_ref(check_ignore_menu_key),	(GDestroyNotify) gtk_widget_unref);
 		g_object_set_data_full(G_OBJECT(app->prefs_dialog), "check_follow_path",
 				gtk_widget_ref(check_follow_path),	(GDestroyNotify) gtk_widget_unref);
+		g_object_set_data_full(G_OBJECT(app->prefs_dialog), "check_run_in_vte",
+				gtk_widget_ref(check_run_in_vte),	(GDestroyNotify) gtk_widget_unref);
 
 		gtk_widget_show_all(frame);
 

Modified: trunk/src/vte.h
===================================================================
--- trunk/src/vte.h	2006-12-09 17:03:03 UTC (rev 1077)
+++ trunk/src/vte.h	2006-12-10 21:29:04 UTC (rev 1078)
@@ -52,6 +52,7 @@
 	gboolean scroll_on_out;
 	gboolean ignore_menu_bar_accel;
 	gboolean follow_path;
+	gboolean run_in_vte;
 	gint scrollback_lines;
 	gchar *emulation;
 	gchar *shell;
@@ -72,7 +73,7 @@
 
 const gchar* vte_get_working_directory(void);
 
-void vte_cwd(const gchar *filename);
+void vte_cwd(const gchar *filename, gboolean force);
 
 void vte_append_preferences_tab();
 


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