home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 2002 April / pcpro0402.iso / essentials / graphics / Gimp / gimp-src-20001226.exe / src / gimp / plug-ins / gimpressionist / gimpressionist.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-12-13  |  16.2 KB  |  563 lines

  1. #ifdef HAVE_CONFIG_H
  2. #include "config.h"
  3. #else
  4.  
  5. #define HAVE_DIRENT_H
  6. #define HAVE_UNISTD_H
  7. #endif
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <gtk/gtk.h>
  12. #include <glib.h>
  13. #include <sys/types.h>
  14. #ifdef HAVE_DIRENT_H
  15. #include <dirent.h>
  16. #endif
  17. #include <sys/stat.h>
  18. #ifdef HAVE_UNISTD_H
  19. #include <unistd.h>
  20. #endif
  21.  
  22. #include <libgimp/gimp.h>
  23. #include <libgimp/gimpui.h>
  24.  
  25. #include "gimpressionist.h"
  26. #include "ppmtool.h"
  27.  
  28. #include "libgimp/stdplugins-intl.h"
  29.  
  30.  
  31. #ifndef GIMP_CHECK_VERSION
  32. #define GIMP_CHECK_VERSION(a,b,c) 0
  33. #endif
  34.  
  35. #ifdef G_OS_WIN32
  36. # ifndef S_ISDIR
  37. #  define S_ISDIR(m) (((m) & _S_IFMT) == _S_IFDIR)
  38. #  define S_ISREG(m) (((m) & _S_IFMT) == _S_IFREG)
  39. # endif
  40. #endif
  41.  
  42. GtkWidget *window = NULL;
  43. GtkTooltips *tooltips = NULL;
  44.  
  45. struct ppm infile = {0,0,NULL};
  46. struct ppm inalpha = {0,0,NULL};
  47.  
  48. GList * parsepath (void)
  49. {
  50.   static GList *lastpath = NULL;
  51.   gchar *gimpdatasubdir, *defaultpath, *tmps;
  52.   struct stat st;
  53.  
  54.   if (lastpath)
  55.     return lastpath;
  56.  
  57. #if GIMP_CHECK_VERSION(1, 1, 0)
  58.   gimpdatasubdir = g_strconcat (gimp_data_directory (),
  59.                 G_DIR_SEPARATOR_S,
  60.                 "gimpressionist",
  61.                 NULL);
  62.  
  63.   defaultpath = g_strconcat (gimp_directory (),
  64.                  G_DIR_SEPARATOR_S,
  65.                  "gimpressionist",
  66.                  G_SEARCHPATH_SEPARATOR_S,
  67.                  gimpdatasubdir,
  68.                  NULL);
  69.  
  70. #else
  71.   defaultpath = DEFAULTPATH;
  72.   gimpdatasubdir = strchr (defaultpath, ':') + 1;
  73. #endif
  74.  
  75.   if (standalone)
  76.     tmps = g_strdup (defaultpath);
  77.   else
  78.     {
  79.       tmps = gimp_gimprc_query ("gimpressionist-path");
  80.  
  81.       if (!tmps)
  82.     {
  83.       if (stat (gimpdatasubdir, &st) != 0
  84.           || !S_ISDIR(st.st_mode))
  85.         {
  86.           /* No gimpressionist-path parameter,
  87.            * and the default doesn't exist */
  88. #if GIMP_CHECK_VERSION(1, 1, 0)
  89.           g_message( "*** Warning ***\n"
  90.              "It is highly recommended to add\n"
  91.              " (gimpressionist-path \"${gimp_dir}" G_DIR_SEPARATOR_S "gimpressionist"
  92.              G_SEARCHPATH_SEPARATOR_S
  93.              "${gimp_data_dir}" G_DIR_SEPARATOR_S "gimpressionist\")\n"
  94.              "(or similar) to your gimprc file.\n");
  95. #else
  96.           g_message( _("*** Warning ***\nIt is highly recommended to add\n  (gimpressionist-path \"%s\")\n(or similar) to your gimprc file.\n"), defaultpath);
  97. #endif
  98.         }
  99.       tmps = g_strdup (defaultpath);
  100.     }
  101.     }
  102.  
  103.   lastpath = gimp_path_parse (tmps, 16, FALSE, NULL);
  104.  
  105.   g_free (tmps);
  106.  
  107.   return lastpath;
  108. }
  109.  
  110. char *findfile(char *fn)
  111. {
  112.   static GList *rcpath = NULL;
  113.   GList *thispath;
  114.   static char file[200];
  115.   struct stat st;
  116.  
  117.   if(!rcpath) rcpath = parsepath();
  118.  
  119.   thispath = rcpath;
  120.   while(rcpath && thispath) {
  121.     sprintf(file, "%s" G_DIR_SEPARATOR_S "%s", (char *)thispath->data, fn);
  122.     if(!stat(file, &st)) return file;
  123.     thispath = thispath->next;
  124.   }
  125.   return NULL;
  126. }
  127.  
  128. void storevals(void)
  129. {
  130.   pcvals.orientnum = GTK_ADJUSTMENT(orientnumadjust)->value;
  131.   pcvals.orientfirst = GTK_ADJUSTMENT(orientfirstadjust)->value;
  132.   pcvals.orientlast = GTK_ADJUSTMENT(orientlastadjust)->value;
  133.   pcvals.sizenum = GTK_ADJUSTMENT(sizenumadjust)->value;
  134.   pcvals.sizefirst = GTK_ADJUSTMENT(sizefirstadjust)->value;
  135.   pcvals.sizelast = GTK_ADJUSTMENT(sizelastadjust)->value;
  136.   pcvals.brushrelief = GTK_ADJUSTMENT(brushreliefadjust)->value;
  137.   pcvals.brushaspect = GTK_ADJUSTMENT(brushaspectadjust)->value;
  138.   pcvals.brushdensity = GTK_ADJUSTMENT(brushdensityadjust)->value;
  139.   pcvals.brushgamma = GTK_ADJUSTMENT(brushgammaadjust)->value;
  140.   pcvals.generaldarkedge = GTK_ADJUSTMENT(generaldarkedgeadjust)->value;
  141.   pcvals.paperrelief = GTK_ADJUSTMENT(paperreliefadjust)->value;
  142.   pcvals.paperscale = GTK_ADJUSTMENT(paperscaleadjust)->value;
  143.   pcvals.paperinvert = GTK_TOGGLE_BUTTON(paperinvert)->active;
  144.   pcvals.generalpaintedges = GTK_TOGGLE_BUTTON(generalpaintedges)->active;
  145.   pcvals.generaltileable = GTK_TOGGLE_BUTTON(generaltileable)->active;
  146.   pcvals.generaldropshadow = GTK_TOGGLE_BUTTON(generaldropshadow)->active;
  147.   pcvals.generalshadowdarkness = GTK_ADJUSTMENT(generalshadowadjust)->value;
  148.   pcvals.generalshadowdepth = GTK_ADJUSTMENT(generalshadowdepth)->value;
  149.   pcvals.generalshadowblur = GTK_ADJUSTMENT(generalshadowblur)->value;
  150.   pcvals.devthresh = GTK_ADJUSTMENT(devthreshadjust)->value;
  151.   pcvals.placecenter = GTK_TOGGLE_BUTTON(placecenter)->active;
  152.   pcvals.paperoverlay = GTK_TOGGLE_BUTTON(paperoverlay)->active;
  153.   pcvals.colornoise = GTK_ADJUSTMENT(colornoiseadjust)->value;
  154. }
  155.  
  156. void restorevals(void)
  157. {
  158.   reselect(brushlist, pcvals.selectedbrush);
  159.   reselect(paperlist, pcvals.selectedpaper);
  160.  
  161.   gtk_adjustment_set_value(GTK_ADJUSTMENT(orientnumadjust), pcvals.orientnum);
  162.   gtk_adjustment_set_value(GTK_ADJUSTMENT(orientfirstadjust), pcvals.orientfirst);
  163.   gtk_adjustment_set_value(GTK_ADJUSTMENT(orientlastadjust), pcvals.orientlast);
  164.   orientchange(NULL, NULL, pcvals.orienttype);
  165.  
  166.   gtk_adjustment_set_value(GTK_ADJUSTMENT(sizenumadjust), pcvals.sizenum);
  167.   gtk_adjustment_set_value(GTK_ADJUSTMENT(sizefirstadjust), pcvals.sizefirst);
  168.   gtk_adjustment_set_value(GTK_ADJUSTMENT(sizelastadjust), pcvals.sizelast);
  169.   sizechange(NULL, NULL, pcvals.sizetype);
  170.  
  171.   placechange(NULL, NULL, pcvals.placetype);
  172.   generalbgchange(NULL, NULL, pcvals.generalbgtype);
  173.  
  174.   gtk_adjustment_set_value(GTK_ADJUSTMENT(brushgammaadjust), pcvals.brushgamma);
  175.   gtk_adjustment_set_value(GTK_ADJUSTMENT(brushreliefadjust), pcvals.brushrelief);
  176.   gtk_adjustment_set_value(GTK_ADJUSTMENT(brushaspectadjust), pcvals.brushaspect);
  177.   gtk_adjustment_set_value(GTK_ADJUSTMENT(brushdensityadjust), pcvals.brushdensity);
  178.  
  179.   gtk_adjustment_set_value(GTK_ADJUSTMENT(generaldarkedgeadjust), pcvals.generaldarkedge);
  180.   gtk_adjustment_set_value(GTK_ADJUSTMENT(generalshadowadjust), pcvals.generalshadowdarkness);
  181.   gtk_adjustment_set_value(GTK_ADJUSTMENT(devthreshadjust), pcvals.devthresh);
  182.  
  183.   gtk_adjustment_set_value(GTK_ADJUSTMENT(paperreliefadjust), pcvals.paperrelief);
  184.   gtk_adjustment_set_value(GTK_ADJUSTMENT(paperscaleadjust), pcvals.paperscale);
  185.   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paperinvert), pcvals.paperinvert);
  186.   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(generalpaintedges), pcvals.generalpaintedges);
  187.   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(generaltileable), pcvals.generaltileable);
  188.   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(generaldropshadow), pcvals.generaldropshadow);
  189.   gtk_adjustment_set_value(GTK_ADJUSTMENT(generalshadowdepth), pcvals.generalshadowdepth);
  190.   gtk_adjustment_set_value(GTK_ADJUSTMENT(generalshadowblur), pcvals.generalshadowblur);
  191.  
  192.   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(placecenter), pcvals.placecenter);
  193.   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(paperoverlay), pcvals.paperoverlay);
  194.  
  195.   drawcolor(NULL);
  196.  
  197.   gtk_adjustment_set_value(GTK_ADJUSTMENT(colornoiseadjust), pcvals.colornoise);
  198.   colorchange(NULL, NULL, pcvals.colortype);
  199.  
  200.   update_orientmap_dialog();
  201. }
  202.  
  203. static void
  204. dialog_close_callback(GtkWidget *widget, gpointer data)
  205. {
  206.   gtk_main_quit();
  207. }
  208.  
  209. static void dialog_ok_callback(GtkWidget *widget, gpointer data)
  210. {
  211.   storevals();
  212.   pcvals.run = 1;
  213.   gtk_widget_destroy(GTK_WIDGET(data));
  214.   if(omwindow)
  215.     gtk_widget_destroy(GTK_WIDGET(omwindow));
  216. }
  217.  
  218. static void dialog_cancel_callback(GtkWidget *widget, gpointer data)
  219. {
  220.   pcvals.run = 0;
  221.   gtk_widget_destroy(GTK_WIDGET(data));
  222. }
  223.  
  224. void unselectall(GtkWidget *list)
  225. {
  226.   GList *h;
  227.   GtkWidget *tmpw;
  228.   for(;;) {
  229.     h = GTK_LIST(list)->selection;
  230.     if(!h) break;
  231.     tmpw = h->data;
  232.     if(!tmpw) break;
  233.     gtk_list_unselect_child(GTK_LIST(list), tmpw);
  234.   }
  235. }
  236.  
  237. void reselect(GtkWidget *list, char *fname)
  238. {
  239.   GList *h;
  240.   GtkWidget *tmpw;
  241.   char *tmps, *tmpfile;
  242.  
  243.   tmpfile = strrchr(fname, '/');
  244.   if(tmpfile)
  245.     fname = ++tmpfile;  
  246.  
  247.   unselectall(list);
  248.   /*
  249.   for(;;) {
  250.     h = GTK_LIST(list)->selection;
  251.     if(!h) break;
  252.     tmpw = h->data;
  253.     if(!tmpw) break;
  254.     gtk_list_unselect_child(GTK_LIST(list), tmpw);
  255.   }
  256.   */  
  257.   h = GTK_LIST(list)->children;
  258.   while(h) {
  259.     tmpw = h->data;
  260.     gtk_label_get(GTK_LABEL(GTK_BIN(tmpw)->child), &tmps);
  261.     if(!strcmp(tmps, fname)) {
  262.       gtk_list_select_child(GTK_LIST(list), tmpw);
  263.       break;
  264.     }
  265.     h = g_list_next(h);
  266.   }
  267. }
  268.  
  269. void readdirintolist_real(char *subdir, GtkWidget *list, char *selected)
  270. {
  271.   char *fpath;
  272.   struct dirent *de;
  273.   struct stat st;
  274.   GtkWidget *selectedw = NULL, *tmpw;
  275.   DIR *dir;
  276.   GList *flist = NULL;
  277.  
  278.   if(selected) {
  279.     if(!selected[0])
  280.       selected = NULL;
  281.     else {
  282.       char *nsel;
  283.       nsel = strrchr(selected, '/');
  284.       if(nsel) selected = ++nsel;
  285.     }
  286.   }
  287.  
  288.   dir = opendir(subdir);
  289.  
  290.   if(!dir)
  291.     return;
  292.  
  293.   for(;;) {
  294.     if(!(de = readdir(dir))) break;
  295.     fpath = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", subdir, de->d_name);
  296.     stat(fpath, &st);
  297.     g_free(fpath);
  298.     if(!S_ISREG(st.st_mode)) continue;
  299.     flist = g_list_insert_sorted(flist, g_strdup(de->d_name), (GCompareFunc)g_strcasecmp);
  300.   }
  301.   closedir(dir);
  302.  
  303.   while(flist) {
  304.     tmpw = gtk_list_item_new_with_label(flist->data);
  305.     if(selected)
  306.       if(!strcmp(flist->data, selected))
  307.     selectedw = tmpw;
  308.     gtk_container_add(GTK_CONTAINER(list), tmpw);
  309.     gtk_widget_show(tmpw);
  310.     g_free(flist->data);
  311.     flist = g_list_remove(flist,flist->data);
  312.   }
  313.   if(selectedw)
  314.     gtk_list_select_child(GTK_LIST(list), selectedw);
  315.   else
  316.     gtk_list_select_item(GTK_LIST(list), 0);
  317. }
  318.  
  319. void readdirintolist(char *subdir, GtkWidget *list, char *selected)
  320. {
  321.   char *tmpdir;
  322.   GList *thispath = parsepath();
  323.  
  324.   while(thispath) {
  325.     tmpdir = g_strdup_printf("%s" G_DIR_SEPARATOR_S "%s", (char *)thispath->data, subdir);
  326.     readdirintolist_real(tmpdir, list, selected);
  327.     g_free(tmpdir);
  328.     thispath = thispath->next;
  329.   }
  330. }
  331.  
  332.  
  333. void showabout(void)
  334. {
  335.   static GtkWidget *window = NULL;
  336.   GtkWidget *tmpw, *tmpvbox, *tmphbox;
  337.   GtkWidget *logobox, *tmpframe;
  338.   int y;
  339.  
  340.   if(window) {
  341.     gtk_widget_show(window);
  342.     gdk_window_raise(window->window);
  343.     return;
  344.   }
  345.   window = gtk_dialog_new();
  346.   gtk_window_set_title(GTK_WINDOW(window), _("The GIMPressionist!"));
  347.   gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE);
  348.   gtk_signal_connect(GTK_OBJECT(window), "destroy",
  349.              GTK_SIGNAL_FUNC (gtk_widget_destroyed),
  350.              &window);
  351.   gtk_quit_add_destroy (1, GTK_OBJECT(window));
  352.   gtk_signal_connect(GTK_OBJECT(window), "delete_event",
  353.              GTK_SIGNAL_FUNC (gtk_widget_hide_on_delete),
  354.              &window);
  355.       
  356.   tmpw = gtk_button_new_with_label( _("OK"));
  357.   GTK_WIDGET_SET_FLAGS(tmpw, GTK_CAN_DEFAULT);
  358.   gtk_signal_connect_object (GTK_OBJECT(tmpw), "clicked",
  359.                  GTK_SIGNAL_FUNC (gtk_widget_hide),
  360.                  GTK_OBJECT(window));
  361.   gtk_box_pack_start(GTK_BOX(GTK_DIALOG(window)->action_area),
  362.              tmpw, TRUE, TRUE, 0);
  363.   gtk_widget_grab_default(tmpw);
  364.   gtk_widget_show(tmpw);
  365.  
  366.   tmpvbox = gtk_vbox_new(FALSE, 5);
  367.   gtk_container_set_border_width(GTK_CONTAINER(tmpvbox), 5);
  368.   gtk_container_add(GTK_CONTAINER(GTK_DIALOG(window)->vbox), tmpvbox);
  369.       
  370.   tmphbox = gtk_hbox_new(TRUE, 5);
  371.   gtk_box_pack_start(GTK_BOX(tmpvbox), tmphbox, TRUE, TRUE, 0);
  372.   gtk_widget_show(tmphbox);
  373.   
  374.   logobox = gtk_vbox_new (FALSE, 0);
  375.   gtk_box_pack_start (GTK_BOX (tmphbox), logobox, FALSE, FALSE, 0);
  376.   gtk_widget_show(logobox);
  377.   
  378.   tmpframe = gtk_frame_new (NULL);
  379.   gtk_frame_set_shadow_type (GTK_FRAME (tmpframe), GTK_SHADOW_IN);
  380.   gtk_box_pack_start (GTK_BOX (logobox), tmpframe, TRUE, TRUE, 0);
  381.   gtk_widget_show(tmpframe);
  382.   
  383.   tmpw = gtk_preview_new(GTK_PREVIEW_COLOR);
  384.   gtk_preview_size (GTK_PREVIEW(tmpw), 177, 70);
  385.  
  386.   for(y = 0; y < 70; y++) {
  387.     gtk_preview_draw_row (GTK_PREVIEW(tmpw), &logobuffer[y*177*3], 0, y, 177); 
  388.   }
  389.   gtk_widget_draw(tmpw, NULL);
  390.   gtk_container_add(GTK_CONTAINER(tmpframe), tmpw);
  391.   gtk_widget_show(tmpw);
  392.       
  393.   tmphbox = gtk_hbox_new(FALSE, 5);
  394.   gtk_box_pack_start(GTK_BOX(tmpvbox), tmphbox, TRUE, TRUE, 0);
  395.  
  396.   tmpw = gtk_label_new("\xa9 1999 Vidar Madsen\n"
  397.                "vidar@prosalg.no\n"
  398.                "http://www.prosalg.no/~vidar/gimpressionist/\n"
  399.                PLUG_IN_VERSION
  400.                );
  401.   gtk_box_pack_start(GTK_BOX(tmphbox), tmpw, TRUE, FALSE, 0);
  402.   gtk_widget_show(tmpw);
  403.   
  404.   gtk_widget_show(tmphbox);
  405.   gtk_widget_show(tmpvbox);
  406.   gtk_widget_show(window);
  407. }
  408.  
  409. int create_dialog(void)
  410. {
  411.   GtkWidget *notebook;
  412.   GtkWidget *tmpw, *box1, *box2, *box3, *preview_box;
  413.   gint        argc;
  414.   gchar     **argv;
  415.  
  416.   if (standalone)
  417.     {
  418.       argc = 1;
  419.       argv = g_new(char *, 1);
  420.       argv[0] = "gimpressionist";
  421.  
  422.       gtk_init(&argc, &argv);
  423.       gtk_rc_parse (gimp_gtkrc ());
  424.  
  425.       gtk_widget_set_default_visual (gdk_rgb_get_visual());
  426.       gtk_widget_set_default_colormap (gdk_rgb_get_cmap());
  427.     }
  428.   else
  429.     {
  430.       gimp_ui_init ("gimpressionist", TRUE);
  431.     }
  432.  
  433.   tooltips = gtk_tooltips_new ();
  434.   gtk_tooltips_enable (tooltips);
  435.  
  436.   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  437.  
  438.   gtk_signal_connect (GTK_OBJECT (window), "destroy",
  439.               (GtkSignalFunc)dialog_close_callback,
  440.               NULL);
  441.  
  442.   gtk_window_set_title (GTK_WINDOW (window), _("The GIMPressionist!"));
  443.   gtk_container_set_border_width (GTK_CONTAINER (window), 5);
  444.  
  445.   box1 = gtk_hbox_new (FALSE, 0);
  446.   gtk_container_add (GTK_CONTAINER (window), box1);
  447.   gtk_widget_show (box1);
  448.  
  449.   box2 = gtk_vbox_new (FALSE, 0);
  450.   gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, FALSE, 0);
  451.   gtk_widget_show (box2);
  452.  
  453.   notebook = gtk_notebook_new ();
  454.   gtk_notebook_set_tab_pos (GTK_NOTEBOOK (notebook), GTK_POS_TOP);
  455.   gtk_box_pack_start (GTK_BOX (box1), notebook, TRUE, TRUE, 5);
  456.   gtk_container_set_border_width (GTK_CONTAINER (notebook), 0);
  457.   gtk_widget_realize (notebook);
  458.   gtk_widget_show(notebook);
  459.  
  460.   create_presetpage(GTK_NOTEBOOK (notebook));
  461.   create_paperpage(GTK_NOTEBOOK (notebook));
  462.   create_brushpage(GTK_NOTEBOOK (notebook));
  463.   create_orientationpage(GTK_NOTEBOOK (notebook));
  464.   create_sizepage(GTK_NOTEBOOK (notebook));
  465.   create_placementpage(GTK_NOTEBOOK (notebook));
  466.   create_colorpage(GTK_NOTEBOOK (notebook));
  467.   create_generalpage(GTK_NOTEBOOK (notebook));
  468.  
  469.   preview_box = create_preview();
  470.   gtk_box_pack_start (GTK_BOX (box2), preview_box, FALSE, FALSE, 0);
  471.   gtk_widget_show (preview_box);
  472.  
  473.   box3 = gtk_hbox_new (TRUE, 0);
  474.   gtk_box_pack_end (GTK_BOX (box2), box3, FALSE, FALSE, 0);
  475.   gtk_widget_show (box3);
  476.   
  477.   tmpw = gtk_button_new_with_label( _("OK"));
  478.   gtk_signal_connect(GTK_OBJECT(tmpw), "clicked",
  479.              (GtkSignalFunc)dialog_ok_callback, window);
  480.   gtk_box_pack_start (GTK_BOX (box3), tmpw, TRUE, TRUE, 0);
  481.   GTK_WIDGET_SET_FLAGS (tmpw, GTK_CAN_DEFAULT);
  482.   gtk_widget_grab_default (tmpw);
  483.   gtk_widget_show(tmpw);
  484.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Run with the selected settings"), NULL);
  485.  
  486.   tmpw = gtk_button_new_with_label( _("Cancel"));
  487.   gtk_signal_connect(GTK_OBJECT(tmpw), "clicked",
  488.              (GtkSignalFunc)dialog_cancel_callback, window);
  489.   gtk_box_pack_start (GTK_BOX (box3), tmpw, TRUE, TRUE, 0);
  490.   gtk_widget_show(tmpw);
  491.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Quit the program"), NULL);
  492.  
  493.   tmpw = gtk_button_new_with_label( _("About..."));
  494.   gtk_signal_connect(GTK_OBJECT(tmpw), "clicked",
  495.              (GtkSignalFunc)showabout, window);
  496.   gtk_box_pack_start (GTK_BOX (box3), tmpw, TRUE, TRUE, 0);
  497.   gtk_widget_show(tmpw);
  498.   gtk_tooltips_set_tip(GTK_TOOLTIPS(tooltips), tmpw, _("Show some information about program"), NULL);
  499.  
  500.   gtk_widget_show(window);
  501.  
  502.   return 1;
  503. }
  504.  
  505. int create_gimpressionist(void)
  506. {
  507.   pcvals.run = 0;
  508.  
  509.   if(standalone) {
  510.     memcpy(&pcvals, &defaultpcvals, sizeof(pcvals));
  511.     create_dialog();
  512.     restorevals();
  513.   } else {
  514.     create_dialog();
  515.   }
  516.  
  517.   gtk_main();
  518.   gdk_flush();
  519.  
  520.   return pcvals.run;
  521. }
  522.  
  523. char *standalone = NULL;
  524.  
  525. extern GimpPlugInInfo PLUG_IN_INFO;
  526.  
  527. #ifdef G_OS_WIN32
  528. /* No standalone on win32. */
  529. MAIN()
  530.  
  531. #else
  532. int main(int argc, char **argv)
  533. {
  534.   if(argc != 2) {
  535.  
  536.     /* Is this needed anymore? */
  537. #ifdef __EMX__
  538.     set_gimp_PLUG_IN_INFO(&PLUG_IN_INFO);
  539. #endif
  540.  
  541.     return gimp_main(argc, argv);
  542.   }
  543.  
  544.   standalone = argv[1];
  545.  
  546.   grabarea();
  547.  
  548.   /* Testing! */
  549.   /*
  550.   copyppm(&infile, &inalpha);
  551.   img_has_alpha = 1;
  552.   */
  553.  
  554.   if(create_gimpressionist()) {
  555.     fprintf(stderr, "Painting"); fflush(stderr);
  556.     repaint(&infile, &inalpha);
  557.     saveppm(&infile, argv[1]);
  558.   }
  559.  
  560.   return 0;
  561. }
  562. #endif
  563.