SF.net SVN: geany:[2841] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Wed Jul 30 18:20:59 UTC 2008


Revision: 2841
          http://geany.svn.sourceforge.net/geany/?rev=2841&view=rev
Author:   eht16
Date:     2008-07-30 18:20:58 +0000 (Wed, 30 Jul 2008)

Log Message:
-----------
Start the shell in the VTE first when the VTE is actually realized to avoid strange display bugs on some systems (closes #1844985).

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/vte.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2008-07-30 18:19:57 UTC (rev 2840)
+++ trunk/ChangeLog	2008-07-30 18:20:58 UTC (rev 2841)
@@ -1,9 +1,12 @@
-2008-07-29  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
+2008-07-30  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>
 
  * src/notebook.c:
    Fix signature of focus_sci().
    Double clicking on free space in the tab bar opens a new file
    (#2003291).
+ * src/vte.c:
+   Start the shell in the VTE first when the VTE is actually realized
+   to avoid strange display bugs on some systems (closes #1844985).
 
 
 2008-07-27  Enrico Tröger  <enrico(dot)troeger(at)uvena(dot)de>

Modified: trunk/src/vte.c
===================================================================
--- trunk/src/vte.c	2008-07-30 18:19:57 UTC (rev 2840)
+++ trunk/src/vte.c	2008-07-30 18:20:58 UTC (rev 2841)
@@ -258,8 +258,7 @@
 {
 	GtkWidget *vte, *scrollbar, *hbox, *frame;
 
-	vte = vf->vte_terminal_new();
-	vc->vte = vte;
+	vc->vte = vte = vf->vte_terminal_new();
 	scrollbar = gtk_vscrollbar_new(GTK_ADJUSTMENT(VTE_TERMINAL(vte)->adjustment));
 	GTK_WIDGET_UNSET_FLAGS(scrollbar, GTK_CAN_FOCUS);
 
@@ -289,13 +288,11 @@
 	g_signal_connect(vte, "motion-notify-event", G_CALLBACK(on_motion_event), NULL);
 	g_signal_connect(vte, "drag-data-received", G_CALLBACK(vte_drag_data_received), NULL);
 
-	vte_start(vte);
-
 	gtk_widget_show_all(frame);
 	gtk_notebook_insert_page(GTK_NOTEBOOK(msgwindow.notebook), frame, gtk_label_new(_("Terminal")), MSG_VTE);
 
 	/* the vte widget has to be realised before color changes take effect */
-	g_signal_connect(vte, "realize", G_CALLBACK(vte_apply_user_settings), NULL);
+	g_signal_connect_after(vte, "realize", G_CALLBACK(vte_apply_user_settings), NULL);
 }
 
 
@@ -362,7 +359,6 @@
 
 static void vte_start(GtkWidget *widget)
 {
-	VteTerminal *vte = VTE_TERMINAL(widget);
 	gchar **env;
 	gchar **argv;
 
@@ -372,7 +368,7 @@
 	if (argv != NULL)
 	{
 		env = vte_get_child_environment();
-		pid = vf->vte_terminal_fork_command(VTE_TERMINAL(vte), argv[0], argv, env,
+		pid = vf->vte_terminal_fork_command(VTE_TERMINAL(widget), argv[0], argv, env,
 												vte_info.dir, TRUE, TRUE, TRUE);
 		g_strfreev(env);
 		g_strfreev(argv);
@@ -441,8 +437,9 @@
 
 void vte_apply_user_settings(void)
 {
-	if (! ui_prefs.msgwindow_visible) return;
-	/*if (! GTK_WIDGET_REALIZED(vc->vte)) gtk_widget_realize(vc->vte);*/
+	if (! ui_prefs.msgwindow_visible)
+		return;
+
 	vf->vte_terminal_set_scrollback_lines(VTE_TERMINAL(vc->vte), vc->scrollback_lines);
 	vf->vte_terminal_set_scroll_on_keystroke(VTE_TERMINAL(vc->vte), vc->scroll_on_key);
 	vf->vte_terminal_set_scroll_on_output(VTE_TERMINAL(vc->vte), vc->scroll_on_out);
@@ -452,6 +449,8 @@
 	vf->vte_terminal_set_color_background(VTE_TERMINAL(vc->vte), vc->colour_back);
 
 	override_menu_key();
+
+	vte_start(vc->vte);
 }
 
 
@@ -554,12 +553,37 @@
 }
 
 
+static gboolean vte_send_cmd_cb(gpointer data)
+{
+	gchar *cmd = data;
+	if (! vte_send_cmd(cmd))
+	{
+		ui_set_statusbar(FALSE,
+	_("Could not execute the command \"%s\" in the VTE because it probably contains a command."),
+		cmd);
+	}
+	g_free(data);
+
+	return FALSE;
+}
+
 /* if the command could be executed, TRUE is returned, FALSE otherwise (i.e. there was some text
  * on the prompt). */
 gboolean vte_send_cmd(const gchar *cmd)
 {
 	if (clean)
 	{
+		/* the shell is started once the widget is realized but it might happen we send commands
+		 * before this happened, so start it manually */
+		if (! GTK_WIDGET_REALIZED(vc->vte))
+		{
+			gtk_notebook_set_current_page(GTK_NOTEBOOK(msgwindow.notebook), MSG_VTE);
+			/* wait until the notebook page has been switched which will realize the widget
+			 * implicitly, after this has been done the idle function willsend the command */
+			g_idle_add(vte_send_cmd_cb, g_strdup(cmd));
+			return TRUE;
+		}
+
 		vf->vte_terminal_feed_child(VTE_TERMINAL(vc->vte), cmd, strlen(cmd));
 		clean = TRUE; /* vte_terminal_feed_child() also marks the vte as not clean */
 		return TRUE;


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