start.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <grass/gis.h>
  4. #include <grass/spawn.h>
  5. #include <grass/glocale.h>
  6. #include "proto.h"
  7. static void start(const char *, const char *);
  8. static void start_wx(const char *, const char *, const char *,
  9. const char *, int, int);
  10. /* start file-based monitor */
  11. void start(const char *name, const char *output)
  12. {
  13. char *env_name;
  14. if (!output)
  15. return;
  16. env_name = NULL;
  17. G_asprintf(&env_name, "MONITOR_%s_MAPFILE", name);
  18. G_setenv(env_name, output);
  19. }
  20. /* start wxGUI display monitor */
  21. void start_wx(const char *name, const char *tempfile,
  22. const char *env_value, const char *cmd_value,
  23. int width, int height)
  24. {
  25. char progname[GPATH_MAX];
  26. char *env_name, *map_value, str_width[1024], str_height[1024];
  27. env_name = NULL;
  28. G_asprintf(&env_name, "MONITOR_%s_MAPFILE", name);
  29. G_asprintf(&map_value, "%s.ppm", tempfile);
  30. G_setenv(env_name, map_value);
  31. /* close(creat(map_value, 0666)); */
  32. G_debug(3, " mapfile = %s", map_value);
  33. sprintf(progname, "%s/etc/gui/wxpython/mapdisp/main.py", G_gisbase());
  34. if (width > 0)
  35. sprintf(str_width, "%d", width);
  36. else
  37. str_width[0] = '\0';
  38. if (height > 0)
  39. sprintf(str_height, "%d", height);
  40. else
  41. str_height[0] = '\0';
  42. G_spawn_ex(getenv("GRASS_PYTHON"), progname, progname,
  43. name, map_value, cmd_value, env_value,
  44. str_width, str_height, SF_BACKGROUND, NULL);
  45. }
  46. int start_mon(const char *name, const char *output, int select,
  47. int width, int height, const char *bgcolor,
  48. int truecolor)
  49. {
  50. const char *curr_mon;
  51. char *env_name, *env_value, *cmd_value;
  52. char *tempfile, buf[1024];
  53. int env_fd;
  54. curr_mon = G__getenv("MONITOR");
  55. if (curr_mon && strcmp(curr_mon, name) == 0 && check_mon(curr_mon))
  56. G_fatal_error(_("Monitor <%s> already running"), name);
  57. tempfile = G_tempfile();
  58. env_name = env_value = NULL;
  59. G_asprintf(&env_name, "MONITOR_%s_ENVFILE", name);
  60. G_asprintf(&env_value, "%s.env", tempfile);
  61. G_setenv(env_name, env_value);
  62. env_fd = creat(env_value, 0666);
  63. if (env_fd < 0)
  64. G_fatal_error(_("Unable to create file '%s'"), env_value);
  65. sprintf(buf, "GRASS_PNG_READ=TRUE\n");
  66. write(env_fd, buf, strlen(buf));
  67. if (width) {
  68. sprintf(buf, "GRASS_WIDTH=%d\n", width);
  69. write(env_fd, buf, strlen(buf));
  70. }
  71. if (height) {
  72. sprintf(buf, "GRASS_HEIGHT=%d\n", height);
  73. write(env_fd, buf, strlen(buf));
  74. }
  75. if (bgcolor) {
  76. if (strcmp(bgcolor, "none") == 0)
  77. sprintf(buf, "GRASS_TRANSPARENT=TRUE\n");
  78. else
  79. sprintf(buf, "GRASS_BACKGROUNDCOLOR=%s\n", bgcolor);
  80. write(env_fd, buf, strlen(buf));
  81. }
  82. if (truecolor) {
  83. sprintf(buf, "GRASS_TRUECOLOR=TRUE\n");
  84. write(env_fd, buf, strlen(buf));
  85. }
  86. close(env_fd);
  87. cmd_value = NULL;
  88. G_asprintf(&env_name, "MONITOR_%s_CMDFILE", name);
  89. G_asprintf(&cmd_value, "%s.cmd", tempfile);
  90. G_setenv(env_name, cmd_value);
  91. close(creat(cmd_value, 0666));
  92. G_verbose_message(_("Staring monitor <%s> with env file '%s'"), name, env_value);
  93. if (G_verbose() > G_verbose_std()) {
  94. FILE *fd;
  95. fd = fopen(env_value, "r");
  96. while (G_getl2(buf, sizeof(buf) - 1, fd) != 0) {
  97. fprintf(stderr, " %s\n", buf);
  98. }
  99. fclose(fd);
  100. }
  101. G_debug(1, "start: name=%s ", name);
  102. G_debug(3, " envfile = %s", env_value);
  103. G_debug(3, " cmdfile = %s", cmd_value);
  104. if (select)
  105. G_setenv("MONITOR", name);
  106. if (strncmp(name, "wx", 2) == 0) /* use G_strncasecmp() instead */
  107. start_wx(name, tempfile, env_value, cmd_value,
  108. width, height);
  109. else
  110. start(name, output);
  111. return 0;
  112. }