@@ -1487,6 +1487,49 @@ info_bar_response_cb (GtkWidget *info_bar,
1487
1487
}
1488
1488
}
1489
1489
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
+
1490
1533
static gboolean
1491
1534
terminal_screen_launch_child_cb (TerminalScreen * screen )
1492
1535
{
@@ -1499,7 +1542,6 @@ terminal_screen_launch_child_cb (TerminalScreen *screen)
1499
1542
const char * working_dir ;
1500
1543
VtePtyFlags pty_flags = VTE_PTY_DEFAULT ;
1501
1544
GSpawnFlags spawn_flags = 0 ;
1502
- GPid pid ;
1503
1545
1504
1546
priv -> launch_child_source_id = 0 ;
1505
1547
@@ -1521,36 +1563,9 @@ terminal_screen_launch_child_cb (TerminalScreen *screen)
1521
1563
if (!terminal_profile_get_property_boolean (profile , TERMINAL_PROFILE_UPDATE_RECORDS ))
1522
1564
pty_flags |= VTE_PTY_NO_UTMP | VTE_PTY_NO_WTMP ;
1523
1565
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 ))
1536
1567
{
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 );
1554
1569
1555
1570
g_error_free (err );
1556
1571
g_strfreev (env );
@@ -1559,7 +1574,19 @@ terminal_screen_launch_child_cb (TerminalScreen *screen)
1559
1574
return FALSE;
1560
1575
}
1561
1576
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 );
1563
1590
1564
1591
g_free (shell );
1565
1592
g_strfreev (argv );
0 commit comments