diff options
author | Lukas Fleischer <calcurse@cryptocrack.de> | 2011-07-01 15:45:11 +0200 |
---|---|---|
committer | Lukas Fleischer <calcurse@cryptocrack.de> | 2011-07-02 10:15:36 +0200 |
commit | 233980622f09bd51d2b7bf90f8371cd307e18ea6 (patch) | |
tree | 76a031e072093111991e17350d10e100b2999a6b | |
parent | 7982c98be4180c17c90e656bbf1f61e94ceaad69 (diff) | |
download | calcurse-233980622f09bd51d2b7bf90f8371cd307e18ea6.tar.gz calcurse-233980622f09bd51d2b7bf90f8371cd307e18ea6.zip |
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 <calcurse@cryptocrack.de>
-rw-r--r-- | src/calcurse.h | 4 | ||||
-rw-r--r-- | src/wins.c | 43 |
2 files changed, 27 insertions, 20 deletions
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); @@ -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 */ |