start.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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 *, const char *, const char *);
  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. const char *width, const char *height)
  24. {
  25. char progname[GPATH_MAX];
  26. char *env_name, *map_value;
  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. G_spawn_ex(getenv("GRASS_PYTHON"), progname, progname,
  35. name, map_value, cmd_value, env_value, width ? width : "", height ? height : "", SF_BACKGROUND, NULL);
  36. }
  37. int start_mon(const char *name, const char *output, int select,
  38. const char *width, const char *height, const char *bgcolor,
  39. int truecolor)
  40. {
  41. const char *curr_mon;
  42. char *env_name, *env_value, *cmd_value;
  43. char *tempfile, buf[1024];
  44. int env_fd;
  45. curr_mon = G__getenv("MONITOR");
  46. if (curr_mon && strcmp(curr_mon, name) == 0 && check_mon(curr_mon))
  47. G_fatal_error(_("Monitor <%s> already running"), name);
  48. tempfile = G_tempfile();
  49. env_name = env_value = NULL;
  50. G_asprintf(&env_name, "MONITOR_%s_ENVFILE", name);
  51. G_asprintf(&env_value, "%s.env", tempfile);
  52. G_setenv(env_name, env_value);
  53. env_fd = creat(env_value, 0666);
  54. if (env_fd < 0)
  55. G_fatal_error(_("Unable to create file '%s'"), env_value);
  56. sprintf(buf, "GRASS_PNG_READ=TRUE\n");
  57. write(env_fd, buf, strlen(buf));
  58. if (width) {
  59. sprintf(buf, "GRASS_WIDTH=%s\n", width);
  60. write(env_fd, buf, strlen(buf));
  61. }
  62. if (height) {
  63. sprintf(buf, "GRASS_HEIGHT=%s\n", height);
  64. write(env_fd, buf, strlen(buf));
  65. }
  66. if (bgcolor) {
  67. if (strcmp(bgcolor, "none") == 0)
  68. sprintf(buf, "GRASS_TRANSPARENT=TRUE\n");
  69. else
  70. sprintf(buf, "GRASS_BACKGROUNDCOLOR=%s\n", bgcolor);
  71. write(env_fd, buf, strlen(buf));
  72. }
  73. if (truecolor) {
  74. sprintf(buf, "GRASS_TRUECOLOR=TRUE\n");
  75. write(env_fd, buf, strlen(buf));
  76. }
  77. close(env_fd);
  78. cmd_value = NULL;
  79. G_asprintf(&env_name, "MONITOR_%s_CMDFILE", name);
  80. G_asprintf(&cmd_value, "%s.cmd", tempfile);
  81. G_setenv(env_name, cmd_value);
  82. close(creat(cmd_value, 0666));
  83. G_verbose_message(_("Staring monitor <%s> with env file '%s'"), name, env_value);
  84. if (G_verbose() > G_verbose_std()) {
  85. FILE *fd;
  86. fd = fopen(env_value, "r");
  87. while (G_getl2(buf, sizeof(buf) - 1, fd) != 0) {
  88. fprintf(stderr, " %s\n", buf);
  89. }
  90. fclose(fd);
  91. }
  92. G_debug(1, "start: name=%s ", name);
  93. G_debug(3, " envfile = %s", env_value);
  94. G_debug(3, " cmdfile = %s", cmd_value);
  95. if (select)
  96. G_setenv("MONITOR", name);
  97. if (strncmp(name, "wx", 2) == 0) /* use G_strncasecmp() instead */
  98. start_wx(name, tempfile, env_value, cmd_value,
  99. width, height);
  100. else
  101. start(name, output);
  102. return 0;
  103. }