@@ -1487,6 +1487,49 @@ info_bar_response_cb (GtkWidget *info_bar,
14871487 }
14881488}
14891489
1490+ static void handle_error_child (TerminalScreen * screen ,
1491+ GError * err )
1492+ {
1493+ GtkWidget * info_bar ;
1494+
1495+ info_bar = terminal_info_bar_new (GTK_MESSAGE_ERROR ,
1496+ _ ("_Profile Preferences" ), RESPONSE_EDIT_PROFILE ,
1497+ _ ("_Relaunch" ), RESPONSE_RELAUNCH ,
1498+ NULL );
1499+ terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar ),
1500+ _ ("There was an error creating the child process for this terminal" ));
1501+ terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar ),
1502+ "%s" , err -> message );
1503+ g_signal_connect (info_bar , "response" ,
1504+ G_CALLBACK (info_bar_response_cb ), screen );
1505+
1506+ gtk_box_pack_start (GTK_BOX (terminal_screen_container_get_from_screen (screen )),
1507+ info_bar , FALSE, FALSE, 0 );
1508+ gtk_info_bar_set_default_response (GTK_INFO_BAR (info_bar ), GTK_RESPONSE_CANCEL );
1509+ gtk_widget_show (info_bar );
1510+
1511+ g_error_free (err );
1512+ }
1513+
1514+ static void term_spawn_callback (GtkWidget * terminal ,
1515+ GPid pid ,
1516+ GError * error ,
1517+ gpointer user_data )
1518+ {
1519+ TerminalScreen * screen = TERMINAL_SCREEN (terminal );
1520+
1521+ if (error )
1522+ {
1523+ handle_error_child (screen , error );
1524+ g_error_free (error );
1525+ }
1526+ else
1527+ {
1528+ TerminalScreenPrivate * priv = screen -> priv ;
1529+ priv -> child_pid = pid ;
1530+ }
1531+ }
1532+
14901533static gboolean
14911534terminal_screen_launch_child_cb (TerminalScreen * screen )
14921535{
@@ -1499,7 +1542,6 @@ terminal_screen_launch_child_cb (TerminalScreen *screen)
14991542 const char * working_dir ;
15001543 VtePtyFlags pty_flags = VTE_PTY_DEFAULT ;
15011544 GSpawnFlags spawn_flags = 0 ;
1502- GPid pid ;
15031545
15041546 priv -> launch_child_source_id = 0 ;
15051547
@@ -1521,36 +1563,9 @@ terminal_screen_launch_child_cb (TerminalScreen *screen)
15211563 if (!terminal_profile_get_property_boolean (profile , TERMINAL_PROFILE_UPDATE_RECORDS ))
15221564 pty_flags |= VTE_PTY_NO_UTMP | VTE_PTY_NO_WTMP ;
15231565
1524- if (!get_child_command (screen , shell , & spawn_flags , & argv , & err ) ||
1525- !vte_terminal_spawn_sync (
1526- terminal ,
1527- pty_flags ,
1528- working_dir ,
1529- argv ,
1530- env ,
1531- spawn_flags ,
1532- NULL , NULL ,
1533- & pid ,
1534- NULL ,
1535- & err ))
1566+ if (!get_child_command (screen , shell , & spawn_flags , & argv , & err ))
15361567 {
1537- GtkWidget * info_bar ;
1538-
1539- info_bar = terminal_info_bar_new (GTK_MESSAGE_ERROR ,
1540- _ ("_Profile Preferences" ), RESPONSE_EDIT_PROFILE ,
1541- _ ("_Relaunch" ), RESPONSE_RELAUNCH ,
1542- NULL );
1543- terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar ),
1544- _ ("There was an error creating the child process for this terminal" ));
1545- terminal_info_bar_format_text (TERMINAL_INFO_BAR (info_bar ),
1546- "%s" , err -> message );
1547- g_signal_connect (info_bar , "response" ,
1548- G_CALLBACK (info_bar_response_cb ), screen );
1549-
1550- gtk_box_pack_start (GTK_BOX (terminal_screen_container_get_from_screen (screen )),
1551- info_bar , FALSE, FALSE, 0 );
1552- gtk_info_bar_set_default_response (GTK_INFO_BAR (info_bar ), GTK_RESPONSE_CANCEL );
1553- gtk_widget_show (info_bar );
1568+ handle_error_child (screen , err );
15541569
15551570 g_error_free (err );
15561571 g_strfreev (env );
@@ -1559,7 +1574,19 @@ terminal_screen_launch_child_cb (TerminalScreen *screen)
15591574 return FALSE;
15601575 }
15611576
1562- priv -> child_pid = pid ;
1577+ vte_terminal_spawn_async (terminal ,
1578+ pty_flags ,
1579+ working_dir ,
1580+ argv ,
1581+ env ,
1582+ spawn_flags ,
1583+ NULL ,
1584+ NULL ,
1585+ NULL ,
1586+ -1 ,
1587+ NULL ,
1588+ (VteTerminalSpawnAsyncCallback ) term_spawn_callback ,
1589+ NULL );
15631590
15641591 g_free (shell );
15651592 g_strfreev (argv );
0 commit comments