setup.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include <newt.h>
  2. #include <signal.h>
  3. #include <stdbool.h>
  4. #include "../cache.h"
  5. #include "../debug.h"
  6. #include "browser.h"
  7. #include "helpline.h"
  8. #include "ui.h"
  9. #include "libslang.h"
  10. pthread_mutex_t ui__lock = PTHREAD_MUTEX_INITIALIZER;
  11. static void newt_suspend(void *d __used)
  12. {
  13. newtSuspend();
  14. raise(SIGTSTP);
  15. newtResume();
  16. }
  17. static int ui__init(void)
  18. {
  19. int err = SLkp_init();
  20. if (err < 0)
  21. goto out;
  22. SLkp_define_keysym((char *)"^(kB)", SL_KEY_UNTAB);
  23. out:
  24. return err;
  25. }
  26. static void ui__exit(void)
  27. {
  28. SLtt_set_cursor_visibility(1);
  29. SLsmg_refresh();
  30. SLsmg_reset_smg();
  31. SLang_reset_tty();
  32. }
  33. static void ui__signal(int sig)
  34. {
  35. ui__exit();
  36. psignal(sig, "perf");
  37. exit(0);
  38. }
  39. void setup_browser(bool fallback_to_pager)
  40. {
  41. if (!isatty(1) || !use_browser || dump_trace) {
  42. use_browser = 0;
  43. if (fallback_to_pager)
  44. setup_pager();
  45. return;
  46. }
  47. use_browser = 1;
  48. newtInit();
  49. ui__init();
  50. newtSetSuspendCallback(newt_suspend, NULL);
  51. ui_helpline__init();
  52. ui_browser__init();
  53. signal(SIGSEGV, ui__signal);
  54. signal(SIGFPE, ui__signal);
  55. signal(SIGINT, ui__signal);
  56. signal(SIGQUIT, ui__signal);
  57. signal(SIGTERM, ui__signal);
  58. }
  59. void exit_browser(bool wait_for_ok)
  60. {
  61. if (use_browser > 0) {
  62. if (wait_for_ok) {
  63. char title[] = "Fatal Error", ok[] = "Ok";
  64. newtWinMessage(title, ok, ui_helpline__last_msg);
  65. }
  66. ui__exit();
  67. }
  68. }