From 233980622f09bd51d2b7bf90f8371cd307e18ea6 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Fri, 1 Jul 2011 15:45:11 +0200 Subject: Refactor wins_launch_external() * Do window preparation and restoring in separate functions wins_prepare_external() and wins_unprepare_external(). * Use fork_exec() and child_wait() instead of system(). Signed-off-by: Lukas Fleischer --- src/calcurse.h | 4 +++- src/wins.c | 43 ++++++++++++++++++++++++------------------- 2 files changed, 27 insertions(+), 20 deletions(-) (limited to 'src') diff --git a/src/calcurse.h b/src/calcurse.h index 14becbd..5c5c6d6 100644 --- a/src/calcurse.h +++ b/src/calcurse.h @@ -935,7 +935,9 @@ void wins_update_border (void); void wins_update_panels (void); void wins_update (void); void wins_reset (void); -void wins_launch_external (const char *, const char *); +void wins_prepare_external (void); +void wins_unprepare_external (void); +void wins_launch_external (char *, char *); void wins_status_bar (void); void wins_erase_status_bar (void); void wins_other_status_page (int); diff --git a/src/wins.c b/src/wins.c index 7b7384b..2d6a932 100644 --- a/src/wins.c +++ b/src/wins.c @@ -599,25 +599,10 @@ wins_reset (void) wins_update (); } -/* - * While inside interactive mode, launch the external command cmd on the given - * file. - */ +/* Prepare windows for the execution of an external command. */ void -wins_launch_external (const char *file, const char *cmd) +wins_prepare_external (void) { - char *p; - int len; - - /* Beware of space between cmd and file. */ - len = strlen (file) + strlen (cmd) + 2; - - p = (char *) mem_calloc (len, sizeof (char)); - if (snprintf (p, len, "%s %s", cmd, file) == -1) - { - mem_free (p); - return; - } if (notify_bar ()) notify_stop_main_thread (); def_prog_mode (); @@ -625,7 +610,12 @@ wins_launch_external (const char *file, const char *cmd) ui_mode = UI_CMDLINE; clear (); wins_refresh (); - (void)system (p); +} + +/* Restore windows when returning from an external command. */ +void +wins_unprepare_external (void) +{ reset_prog_mode (); clearok (curscr, TRUE); curs_set (0); @@ -633,7 +623,22 @@ wins_launch_external (const char *file, const char *cmd) wins_refresh (); if (notify_bar ()) notify_start_main_thread (); - mem_free (p); +} + +/* + * While inside interactive mode, launch the external command cmd on the given + * file. + */ +void +wins_launch_external (char *file, char *cmd) +{ + char *arg[] = { cmd, file, NULL }; + int pid; + + wins_prepare_external (); + if ((pid = fork_exec (NULL, NULL, cmd, arg))) + child_wait (NULL, NULL, pid); + wins_unprepare_external (); } #define NB_CAL_CMDS 27 /* number of commands while in cal view */ -- cgit v1.2.3-70-g09d2