summaryrefslogtreecommitdiff
path: root/linux
diff options
context:
space:
mode:
Diffstat (limited to 'linux')
-rw-r--r--linux/Makefile1
-rw-r--r--linux/custom.cpp144
-rw-r--r--linux/custom.h21
-rw-r--r--linux/dialogs.cpp2183
-rw-r--r--linux/dialogs.h20
-rw-r--r--linux/gdkgl.c301
-rw-r--r--linux/gdkgl.h109
-rw-r--r--linux/gtkglarea.c178
-rw-r--r--linux/gtkglarea.h74
-rw-r--r--linux/gtktools.cpp79
-rw-r--r--linux/gtktools.h11
-rw-r--r--linux/lc17
-rw-r--r--linux/main.cpp346
-rw-r--r--linux/main.h46
-rw-r--r--linux/menu.cpp406
-rw-r--r--linux/menu.h54
-rw-r--r--linux/module.mk6
-rw-r--r--linux/pixmaps/ac-brick.xpm25
-rw-r--r--linux/pixmaps/ac-cam.xpm26
-rw-r--r--linux/pixmaps/ac-erase.xpm26
-rw-r--r--linux/pixmaps/ac-light.xpm25
-rw-r--r--linux/pixmaps/ac-move.xpm25
-rw-r--r--linux/pixmaps/ac-next.xpm27
-rw-r--r--linux/pixmaps/ac-paint.xpm25
-rw-r--r--linux/pixmaps/ac-pan.xpm25
-rw-r--r--linux/pixmaps/ac-prev.xpm27
-rw-r--r--linux/pixmaps/ac-roll.xpm26
-rw-r--r--linux/pixmaps/ac-rot.xpm25
-rw-r--r--linux/pixmaps/ac-rotv.xpm25
-rw-r--r--linux/pixmaps/ac-sel.xpm23
-rw-r--r--linux/pixmaps/ac-spot.xpm26
-rw-r--r--linux/pixmaps/ac-zoom.xpm27
-rw-r--r--linux/pixmaps/ac-zoome.xpm27
-rw-r--r--linux/pixmaps/ac-zoomr.xpm27
-rw-r--r--linux/pixmaps/an-anim.xpm25
-rw-r--r--linux/pixmaps/an-first.xpm25
-rw-r--r--linux/pixmaps/an-key.xpm27
-rw-r--r--linux/pixmaps/an-last.xpm25
-rw-r--r--linux/pixmaps/an-next.xpm25
-rw-r--r--linux/pixmaps/an-play.xpm26
-rw-r--r--linux/pixmaps/an-prev.xpm25
-rw-r--r--linux/pixmaps/an-stop.xpm26
-rw-r--r--linux/pixmaps/cr_brick.xpm41
-rw-r--r--linux/pixmaps/cr_cam.xpm41
-rw-r--r--linux/pixmaps/cr_erase.xpm41
-rw-r--r--linux/pixmaps/cr_light.xpm41
-rw-r--r--linux/pixmaps/cr_move.xpm41
-rw-r--r--linux/pixmaps/cr_paint.xpm41
-rw-r--r--linux/pixmaps/cr_pan.xpm41
-rw-r--r--linux/pixmaps/cr_roll.xpm41
-rw-r--r--linux/pixmaps/cr_rot.xpm41
-rw-r--r--linux/pixmaps/cr_rotv.xpm41
-rw-r--r--linux/pixmaps/cr_sel.xpm41
-rw-r--r--linux/pixmaps/cr_selm.xpm43
-rw-r--r--linux/pixmaps/cr_spot.xpm41
-rw-r--r--linux/pixmaps/cr_zoom.xpm42
-rw-r--r--linux/pixmaps/cr_zoomr.xpm41
-rw-r--r--linux/pixmaps/icon32.xpm41
-rw-r--r--linux/pixmaps/pi-acces.xpm24
-rw-r--r--linux/pixmaps/pi-brick.xpm24
-rw-r--r--linux/pixmaps/pi-extra.xpm25
-rw-r--r--linux/pixmaps/pi-misc.xpm23
-rw-r--r--linux/pixmaps/pi-plate.xpm24
-rw-r--r--linux/pixmaps/pi-slope.xpm24
-rw-r--r--linux/pixmaps/pi-space.xpm25
-rw-r--r--linux/pixmaps/pi-tech.xpm26
-rw-r--r--linux/pixmaps/pi-tile.xpm24
-rw-r--r--linux/pixmaps/pi-train.xpm23
-rw-r--r--linux/pixmaps/st-about.xpm24
-rw-r--r--linux/pixmaps/st-bg.xpm25
-rw-r--r--linux/pixmaps/st-copy.xpm25
-rw-r--r--linux/pixmaps/st-cut.xpm24
-rw-r--r--linux/pixmaps/st-fast.xpm24
-rw-r--r--linux/pixmaps/st-help.xpm25
-rw-r--r--linux/pixmaps/st-new.xpm24
-rw-r--r--linux/pixmaps/st-open.xpm26
-rw-r--r--linux/pixmaps/st-paste.xpm29
-rw-r--r--linux/pixmaps/st-prev.xpm26
-rw-r--r--linux/pixmaps/st-print.xpm26
-rw-r--r--linux/pixmaps/st-redo.xpm24
-rw-r--r--linux/pixmaps/st-save.xpm25
-rw-r--r--linux/pixmaps/st-snap.xpm27
-rw-r--r--linux/pixmaps/st-snapa.xpm25
-rw-r--r--linux/pixmaps/st-undo.xpm24
-rw-r--r--linux/system.cpp622
-rw-r--r--linux/system.h109
-rw-r--r--linux/toolbar.cpp754
-rw-r--r--linux/toolbar.h76
88 files changed, 7502 insertions, 0 deletions
diff --git a/linux/Makefile b/linux/Makefile
new file mode 100644
index 0000000..05788fd
--- /dev/null
+++ b/linux/Makefile
@@ -0,0 +1 @@
+include ../generic.mk
diff --git a/linux/custom.cpp b/linux/custom.cpp
new file mode 100644
index 0000000..0a7deec
--- /dev/null
+++ b/linux/custom.cpp
@@ -0,0 +1,144 @@
+// User preferences.
+//
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include "custom.h"
+
+// Variables
+
+userrc_t user_rc;
+
+
+// Functions
+
+static void create_rc (void);
+static void save_rc (void);
+static void read_rc (void);
+static char* preferences_path (char *buf);
+
+
+static char* preferences_path (char *buf)
+{
+ char *ptr;
+
+ if ((ptr = getenv ("HOME")) == NULL)
+ {
+ printf ("Can't get Environment Variable HOME... Aborting.\n");
+ exit (1);
+ }
+
+ sprintf (buf, "%s/.LeoCAD", ptr);
+ return buf;
+}
+
+// Set the default preferences.
+static void create_rc (void)
+{
+ memset (&user_rc, 0, sizeof (user_rc));
+
+ user_rc.view_main_toolbar = 1;
+ user_rc.view_tool_toolbar = 1;
+ user_rc.view_anim_toolbar = 1;
+ user_rc.toolbar_style = GTK_TOOLBAR_ICONS;
+}
+
+static void save_rc (void)
+{
+ FILE *preferences_file;
+ char this_path[1024];
+
+ preferences_path (this_path);
+ if ((preferences_file = fopen (this_path, "w")) == NULL)
+ {
+// alert_ok ("Error", "Can't save preferences ini file.", "Ok");
+ return;
+ }
+ fprintf (preferences_file, "# LeoCAD preferences file.\n\n");
+
+#define CUSTOM_SECTION(a) fprintf (preferences_file, "\n\n[%s]\n", a)
+#define CUSTOM_SAVE_INT(a,b) fprintf (preferences_file, "%s=%i\n", a, (int) b)
+#define CUSTOM_SAVE_BOOL(a,b) fprintf (preferences_file, "%s=%i\n", a, b ? 1 : 0)
+#define CUSTOM_SAVE_STRING(a,b) fprintf (preferences_file, "%s=%s\n", a, b)
+
+ // VERSION
+// CUSTOM_SECTION ("VERSION");
+// CUSTOM_SAVE_STRING ("PROGRAM_VERSION", user_rc.program_version);
+
+ // VIEW
+ CUSTOM_SECTION ("View");
+ CUSTOM_SAVE_BOOL ("Standard", user_rc.view_main_toolbar);
+ CUSTOM_SAVE_BOOL ("Tools", user_rc.view_tool_toolbar);
+ CUSTOM_SAVE_BOOL ("Animation", user_rc.view_anim_toolbar);
+ CUSTOM_SAVE_INT ("TOOLBAR_STYLE", user_rc.toolbar_style);
+
+ fprintf (preferences_file, "\n\n# END OF LeoCAD preferences file.");
+ fflush (preferences_file);
+ fclose (preferences_file);
+}
+
+static void read_rc (void)
+{
+ FILE *preferences_file;
+ char this_path[1024];
+ char this_line[256];
+ int this_line_number = 0;
+
+ preferences_path (this_path);
+
+ if (access (this_path, F_OK))
+ return;
+
+ if ((preferences_file = fopen (this_path, "r")) == NULL)
+ return;
+
+#define FIELD_INT (int) atoi(strchr(this_line,'=')+1)
+#define FIELD_BOOL (FIELD_INT!=0)
+#define FIELD_STRING strchr(this_line,'=')+1
+
+#define CUSTOM_LOAD_INT(a,b); if(strstr (this_line, a"=")){b = FIELD_INT;continue;}
+#define CUSTOM_LOAD_BOOL(a,b); if(strstr (this_line, a"=")){b = FIELD_BOOL;continue;}
+#define CUSTOM_LOAD_STRING(a,b); if(strstr (this_line, a"=")){strcpy(b, FIELD_STRING);continue;}
+
+ while (fgets (this_line, sizeof (this_line), preferences_file) != NULL)
+ {
+ this_line_number++;
+
+ if (this_line[strlen (this_line) - 1] == '\n')
+ this_line[strlen (this_line) - 1] = 0;
+
+ if (!strlen (this_line))
+ continue;
+ if (this_line[0] == '#')
+ continue;
+ if (this_line[0] == '[')
+ continue;
+
+ // VERSION
+// CUSTOM_LOAD_STRING ("PROGRAM_VERSION", user_rc.program_version);
+
+ // VIEW
+ CUSTOM_LOAD_BOOL ("Standard", user_rc.view_main_toolbar);
+ CUSTOM_LOAD_BOOL ("Tools", user_rc.view_tool_toolbar);
+ CUSTOM_LOAD_BOOL ("Animation", user_rc.view_anim_toolbar);
+ CUSTOM_LOAD_INT ("TOOLBAR_STYLE", (int) user_rc.toolbar_style);
+
+ printf ("LeoCAD : Syntax error in %s\n", this_path);
+ printf ("Line %i : %s\n", this_line_number, this_line);
+ }
+
+ fclose (preferences_file);
+}
+
+void init_rc (void)
+{
+ char this_path[1024];
+
+ preferences_path (this_path);
+
+ create_rc ();
+ access (this_path, F_OK) ? save_rc () : read_rc ();
+}
+
diff --git a/linux/custom.h b/linux/custom.h
new file mode 100644
index 0000000..4fd6ee2
--- /dev/null
+++ b/linux/custom.h
@@ -0,0 +1,21 @@
+#ifndef _CUSTOM_H_
+#define _CUSTOM_H_
+
+#include <gtk/gtk.h>
+
+// User preferences
+typedef struct
+{
+ char view_main_toolbar;
+ char view_tool_toolbar;
+ char view_anim_toolbar;
+
+ GtkToolbarStyle toolbar_style;
+} userrc_t;
+
+extern userrc_t user_rc;
+
+
+void init_rc (void);
+
+#endif
diff --git a/linux/dialogs.cpp b/linux/dialogs.cpp
new file mode 100644
index 0000000..7f119d9
--- /dev/null
+++ b/linux/dialogs.cpp
@@ -0,0 +1,2183 @@
+// Linux Dialogs
+//
+
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <unistd.h>
+#include <pwd.h>
+#include "gtktools.h"
+#include "system.h"
+#include "dialogs.h"
+#include "typedefs.h"
+#include "globals.h"
+
+static int def_ret = 0;
+static int* cur_ret = NULL;
+
+static int dlg_domodal(GtkWidget* dlg, int def)
+{
+ int ret = -1, old_def = def_ret, *old_ret = cur_ret;
+ def_ret = def;
+ cur_ret = &ret;
+
+ gtk_widget_show(dlg);
+ gtk_grab_add(dlg);
+ while (ret == -1)
+ gtk_main_iteration ();
+ gtk_grab_remove(dlg);
+ gtk_widget_destroy(dlg);
+
+ cur_ret = old_ret;
+ def_ret = old_def;
+ return ret;
+}
+
+static void default_callback(GtkWidget *widget, gpointer data)
+{
+ *cur_ret = (int)data;
+}
+
+static gint delete_callback(GtkWidget *widget, GdkEvent* event, gpointer data)
+{
+ *cur_ret = def_ret;
+ return TRUE;
+}
+
+static bool read_float(GtkWidget* widget, float* value, float min_value, float max_value)
+{
+ char buf[256];
+
+ strcpy (buf, gtk_entry_get_text (GTK_ENTRY (widget)));
+ if (sscanf(buf, "%f", value) == 1)
+ {
+ if (*value >= min_value && *value <= max_value)
+ return true;
+ }
+
+ sprintf (buf, "Please enter a value between %g and %g", min_value, max_value);
+ msgbox_execute (buf, LC_MB_OK | LC_MB_ICONERROR);
+ gtk_window_set_focus(GTK_WINDOW(gtk_widget_get_toplevel(widget)), widget);
+
+ return false;
+}
+
+static void write_float(GtkWidget* widget, float value)
+{
+ char buf[16];
+ sprintf (buf, "%g", value);
+ gtk_entry_set_text (GTK_ENTRY (widget), buf);
+}
+
+static bool read_int(GtkWidget* widget, int* value, int min_value, int max_value)
+{
+ char buf[256];
+
+ strcpy (buf, gtk_entry_get_text (GTK_ENTRY (widget)));
+ if (sscanf(buf, "%d", value) == 1)
+ {
+ if (*value >= min_value && *value <= max_value)
+ return true;
+ }
+
+ sprintf (buf, "Please enter a value between %d and %d", min_value, max_value);
+ msgbox_execute (buf, LC_MB_OK | LC_MB_ICONERROR);
+ gtk_window_set_focus(GTK_WINDOW(gtk_widget_get_toplevel(widget)), widget);
+
+ return false;
+}
+
+static void write_int(GtkWidget* widget, int value)
+{
+ char buf[16];
+ sprintf (buf, "%d", value);
+ gtk_entry_set_text (GTK_ENTRY (widget), buf);
+}
+
+// Message box
+
+int msgbox_execute(char* text, int flags)
+{
+ GtkWidget *window, *w, *vbox, *hbox;
+ int mode = flags & LC_MB_TYPEMASK, ret;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_signal_connect (GTK_OBJECT (window), "delete_event",
+ GTK_SIGNAL_FUNC (delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (window), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ gtk_window_set_title (GTK_WINDOW (window), "LeoCAD");
+ gtk_container_border_width (GTK_CONTAINER (window), 10);
+ gtk_widget_realize (window);
+
+ vbox = gtk_vbox_new (FALSE, 10);
+ gtk_container_add (GTK_CONTAINER (window), vbox);
+ gtk_widget_show (vbox);
+
+ w = gtk_label_new (text);
+ gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
+ gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
+ gtk_widget_show (w);
+
+ w = gtk_hseparator_new ();
+ gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 2);
+ gtk_widget_show (w);
+
+ hbox = gtk_hbox_new (FALSE, 10);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 2);
+ gtk_widget_show (hbox);
+
+ if (mode == LC_MB_OK)
+ {
+ w = gtk_button_new_with_label ("Ok");
+ gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
+ gtk_signal_connect (GTK_OBJECT (w), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_OK));
+ GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (w);
+ gtk_widget_show (w);
+ ret = LC_OK;
+ }
+ else if (mode == LC_MB_OKCANCEL)
+ {
+ w = gtk_button_new_with_label ("Ok");
+ gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
+ gtk_signal_connect (GTK_OBJECT (w), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_OK));
+ GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (w);
+ gtk_widget_show (w);
+
+ w = gtk_button_new_with_label ("Cancel");
+ gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
+ gtk_signal_connect (GTK_OBJECT (w), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_CANCEL));
+ gtk_widget_show (w);
+ ret = LC_CANCEL;
+ }
+ else if (mode == LC_MB_YESNOCANCEL)
+ {
+ w = gtk_button_new_with_label ("Yes");
+ gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
+ gtk_signal_connect (GTK_OBJECT (w), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_YES));
+ GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (w);
+ gtk_widget_show (w);
+
+ w = gtk_button_new_with_label ("No");
+ gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
+ gtk_signal_connect (GTK_OBJECT (w), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_NO));
+ gtk_widget_show (w);
+
+ w = gtk_button_new_with_label ("Cancel");
+ gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
+ gtk_signal_connect (GTK_OBJECT (w), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_CANCEL));
+ gtk_widget_show (w);
+ ret = LC_CANCEL;
+ }
+ else if (mode == LC_MB_YESNO)
+ {
+ w = gtk_button_new_with_label ("Yes");
+ gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
+ gtk_signal_connect (GTK_OBJECT (w), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_YES));
+ GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
+ gtk_widget_grab_default (w);
+ gtk_widget_show (w);
+
+ w = gtk_button_new_with_label ("No");
+ gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
+ gtk_signal_connect (GTK_OBJECT (w), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_NO));
+ gtk_widget_show (w);
+ ret = LC_NO;
+ }
+
+ return dlg_domodal(window, ret);
+}
+
+// File Open/Save/Merge dialog
+
+static char* filedlg_str;
+
+static void filedlg_callback(GtkWidget *widget, gpointer data)
+{
+ if (data != NULL)
+ {
+ *cur_ret = LC_OK;
+ strcpy(filedlg_str, gtk_file_selection_get_filename(GTK_FILE_SELECTION(data)));
+ }
+ else
+ *cur_ret = LC_CANCEL;
+}
+
+int filedlg_execute(char* caption, char* filename)
+{
+ GtkWidget* dlg;
+ dlg = gtk_file_selection_new (caption);
+ filedlg_str = filename;
+
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(dlg)->ok_button),
+ "clicked", (GtkSignalFunc)filedlg_callback, dlg);
+ gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(dlg)->cancel_button),
+ "clicked", (GtkSignalFunc)filedlg_callback, NULL);
+
+// gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew),"penguin.png");
+
+ return dlg_domodal(dlg, LC_CANCEL);
+}
+
+// Color Selection Dialog
+
+static void colorseldlg_callback(GtkWidget *widget, gpointer data)
+{
+ if (data != NULL)
+ {
+ GtkWidget* dlg = gtk_widget_get_toplevel (widget);
+ double dbl[3];
+ float* color = (float*)data;
+
+ gtk_color_selection_get_color (GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), dbl);
+ color[0] = dbl[0];
+ color[1] = dbl[1];
+ color[2] = dbl[2];
+ *cur_ret = LC_OK;
+ }
+ else
+ *cur_ret = LC_CANCEL;
+}
+
+int colorseldlg_execute(void* param)
+{
+ float* color = (float*)param;
+ double dbl[3] = { color[0], color[1], color[2] };
+ GtkWidget* dlg;
+
+ dlg = gtk_color_selection_dialog_new ("Choose Color");
+ gtk_color_selection_set_color (GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG (dlg)->colorsel), dbl);
+
+ gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->ok_button),
+ "clicked", (GtkSignalFunc)colorseldlg_callback, param);
+ gtk_signal_connect (GTK_OBJECT (GTK_COLOR_SELECTION_DIALOG (dlg)->cancel_button),
+ "clicked", (GtkSignalFunc)colorseldlg_callback, NULL);
+
+ return dlg_domodal(dlg, LC_CANCEL);
+}
+
+// Array Dialog
+
+typedef struct
+{
+ void* data;
+ GtkWidget *move_x, *move_y, *move_z;
+ GtkWidget *rotate_x, *rotate_y, *rotate_z;
+ GtkWidget *total;
+ GtkWidget *radio1, *radio2, *radio3;
+ GtkWidget *count1, *count2, *count3;
+ GtkWidget *offset_x2, *offset_y2, *offset_z2;
+ GtkWidget *offset_x3, *offset_y3, *offset_z3;
+} LC_ARRAYDLG_STRUCT;
+
+static void arraydlg_callback(GtkWidget *widget, gpointer data)
+{
+ LC_ARRAYDLG_STRUCT* s = (LC_ARRAYDLG_STRUCT*)data;
+ LC_ARRAYDLG_OPTS* opts = (LC_ARRAYDLG_OPTS*)s->data;
+
+ if (!read_float(s->move_x, &opts->fMove[0], -1000, 1000)) return;
+ if (!read_float(s->move_y, &opts->fMove[1], -1000, 1000)) return;
+ if (!read_float(s->move_z, &opts->fMove[2], -1000, 1000)) return;
+ if (!read_float(s->rotate_x, &opts->fRotate[0], -360, 360)) return;
+ if (!read_float(s->rotate_y, &opts->fRotate[1], -360, 360)) return;
+ if (!read_float(s->rotate_z, &opts->fRotate[2], -360, 360)) return;
+ if (!read_float(s->offset_x2, &opts->f2D[0], -1000, 1000)) return;
+ if (!read_float(s->offset_y2, &opts->f2D[1], -1000, 1000)) return;
+ if (!read_float(s->offset_z2, &opts->f2D[2], -1000, 1000)) return;
+ if (!read_float(s->offset_x3, &opts->f3D[0], -1000, 1000)) return;
+ if (!read_float(s->offset_y3, &opts->f3D[1], -1000, 1000)) return;
+ if (!read_float(s->offset_z3, &opts->f3D[2], -1000, 1000)) return;
+
+ int i;
+ if (!read_int(s->count1, &i, 1, 1000)) return;
+ opts->n1DCount = i;
+ if (!read_int(s->count2, &i, 1, 1000)) return;
+ opts->n2DCount = i;
+ if (!read_int(s->count3, &i, 1, 1000)) return;
+ opts->n3DCount = i;
+
+ if (GTK_TOGGLE_BUTTON (s->radio1)->active)
+ opts->nArrayDimension = 0;
+ if (GTK_TOGGLE_BUTTON (s->radio2)->active)
+ opts->nArrayDimension = 1;
+ if (GTK_TOGGLE_BUTTON (s->radio3)->active)
+ opts->nArrayDimension = 2;
+
+ *cur_ret = LC_OK;
+}
+
+int arraydlg_execute(void* param)
+{
+ GtkWidget *dlg;
+ GtkWidget *vbox1, *vbox2;
+ GtkWidget *hbox1, *hbox2;
+ GtkWidget *frame, *table, *label, *button;
+ GSList *radio_group = (GSList*)NULL;
+ LC_ARRAYDLG_STRUCT s;
+ s.data = param;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ gtk_widget_set_usize (dlg, 450, 320);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Array Options");
+ gtk_window_set_policy (GTK_WINDOW (dlg), FALSE, FALSE, FALSE);
+ gtk_widget_realize (dlg);
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (dlg), vbox1);
+
+ hbox1 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox1);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbox1, TRUE, TRUE, 0);
+
+ frame = gtk_frame_new ("Transformation (Incremental)");
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (hbox1), frame, TRUE, TRUE, 0);
+ gtk_container_border_width (GTK_CONTAINER (frame), 10);
+
+ table = gtk_table_new (3, 4, FALSE);
+ gtk_widget_show (table);
+ gtk_container_add (GTK_CONTAINER (frame), table);
+ gtk_container_border_width (GTK_CONTAINER (table), 10);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 20);
+
+ label = gtk_label_new ("X");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1,
+ (GtkAttachOptions) 0, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ label = gtk_label_new ("Y");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 2, 3, 0, 1,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+
+ label = gtk_label_new ("Z");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 3, 4, 0, 1,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+
+ label = gtk_label_new ("Move");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+
+ s.move_x = gtk_entry_new ();
+ gtk_widget_show (s.move_x);
+ gtk_table_attach (GTK_TABLE (table), s.move_x, 1, 2, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+ gtk_widget_set_usize (s.move_x, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.move_x), "0");
+
+ s.move_y = gtk_entry_new ();
+ gtk_widget_show (s.move_y);
+ gtk_table_attach (GTK_TABLE (table), s.move_y, 2, 3, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.move_y, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.move_y), "0");
+
+ s.move_z = gtk_entry_new ();
+ gtk_widget_show (s.move_z);
+ gtk_table_attach (GTK_TABLE (table), s.move_z, 3, 4, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.move_z, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.move_z), "0");
+
+ label = gtk_label_new ("Rotate");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+
+ s.rotate_x = gtk_entry_new ();
+ gtk_widget_show (s.rotate_x);
+ gtk_table_attach (GTK_TABLE (table), s.rotate_x, 1, 2, 2, 3,
+ (GtkAttachOptions) 0, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+ gtk_widget_set_usize (s.rotate_x, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.rotate_x), "0");
+
+ s.rotate_y = gtk_entry_new ();
+ gtk_widget_show (s.rotate_y);
+ gtk_table_attach (GTK_TABLE (table), s.rotate_y, 2, 3, 2, 3,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.rotate_y, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.rotate_y), "0");
+
+ s.rotate_z = gtk_entry_new ();
+ gtk_widget_show (s.rotate_z);
+ gtk_table_attach (GTK_TABLE (table), s.rotate_z, 3, 4, 2, 3,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.rotate_z, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.rotate_z), "0");
+
+ vbox2 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox2);
+ gtk_box_pack_start (GTK_BOX (hbox1), vbox2, FALSE, FALSE, 0);
+ gtk_widget_set_usize (vbox2, 115, 142);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_widget_show (button);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (arraydlg_callback), &s);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ gtk_container_border_width (GTK_CONTAINER (button), 12);
+ GtkAccelGroup *accel_group = gtk_accel_group_new ();
+ gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Return, 0, GTK_ACCEL_VISIBLE);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_CANCEL));
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
+ gtk_container_border_width (GTK_CONTAINER (button), 12);
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Escape, 0, GTK_ACCEL_VISIBLE);
+
+ hbox2 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox2);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox2, TRUE, TRUE, 0);
+
+ label = gtk_label_new ("Total:");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox2), label, TRUE, TRUE, 0);
+
+ s.total = gtk_entry_new ();
+ gtk_widget_show (s.total);
+ gtk_box_pack_start (GTK_BOX (hbox2), s.total, TRUE, TRUE, 15);
+ gtk_widget_set_usize (s.total, 50, -2);
+ gtk_entry_set_editable (GTK_ENTRY (s.total), FALSE);
+
+ frame = gtk_frame_new ("Dimensions");
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (vbox1), frame, TRUE, TRUE, 5);
+ gtk_container_border_width (GTK_CONTAINER (frame), 10);
+
+ table = gtk_table_new (4, 5, FALSE);
+ gtk_widget_show (table);
+ gtk_container_add (GTK_CONTAINER (frame), table);
+ gtk_container_border_width (GTK_CONTAINER (table), 10);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 20);
+
+ label = gtk_label_new ("Count");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ label = gtk_label_new ("Offsets");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 3, 4, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+ (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+ s.radio1 = gtk_radio_button_new_with_label (radio_group, "1D");
+ radio_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.radio1));
+ gtk_widget_show (s.radio1);
+ gtk_table_attach (GTK_TABLE (table), s.radio1, 0, 1, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+
+ s.radio2 = gtk_radio_button_new_with_label (radio_group, "2D");
+ radio_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.radio2));
+ gtk_widget_show (s.radio2);
+ gtk_table_attach (GTK_TABLE (table), s.radio2, 0, 1, 2, 3,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+
+ s.radio3 = gtk_radio_button_new_with_label (radio_group, "3D");
+ radio_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.radio3));
+ gtk_widget_show (s.radio3);
+ gtk_table_attach (GTK_TABLE (table), s.radio3, 0, 1, 3, 4,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+
+ s.count1 = gtk_entry_new ();
+ gtk_widget_show (s.count1);
+ gtk_table_attach (GTK_TABLE (table), s.count1, 1, 2, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.count1, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.count1), "10");
+
+ s.count2 = gtk_entry_new ();
+ gtk_widget_show (s.count2);
+ gtk_table_attach (GTK_TABLE (table), s.count2, 1, 2, 2, 3,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.count2, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.count2), "1");
+
+ s.count3 = gtk_entry_new ();
+ gtk_widget_show (s.count3);
+ gtk_table_attach (GTK_TABLE (table), s.count3, 1, 2, 3, 4,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.count3, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.count3), "1");
+
+ label = gtk_label_new ("X");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 2, 3, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+
+ label = gtk_label_new ("Y");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 3, 4, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+
+ label = gtk_label_new ("Z");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 4, 5, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+
+ s.offset_x2 = gtk_entry_new ();
+ gtk_widget_show (s.offset_x2);
+ gtk_table_attach (GTK_TABLE (table), s.offset_x2, 2, 3, 2, 3,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.offset_x2, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.offset_x2), "0");
+
+ s.offset_y2 = gtk_entry_new ();
+ gtk_widget_show (s.offset_y2);
+ gtk_table_attach (GTK_TABLE (table), s.offset_y2, 3, 4, 2, 3,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.offset_y2, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.offset_y2), "0");
+
+ s.offset_z2 = gtk_entry_new ();
+ gtk_widget_show (s.offset_z2);
+ gtk_table_attach (GTK_TABLE (table), s.offset_z2, 4, 5, 2, 3,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.offset_z2, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.offset_z2), "0");
+
+ s.offset_x3 = gtk_entry_new ();
+ gtk_widget_show (s.offset_x3);
+ gtk_table_attach (GTK_TABLE (table), s.offset_x3, 2, 3, 3, 4,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.offset_x3, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.offset_x3), "0");
+
+ s.offset_y3 = gtk_entry_new ();
+ gtk_widget_show (s.offset_y3);
+ gtk_table_attach (GTK_TABLE (table), s.offset_y3, 3, 4, 3, 4,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.offset_y3, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.offset_y3), "0");
+
+ s.offset_z3 = gtk_entry_new ();
+ gtk_widget_show (s.offset_z3);
+ gtk_table_attach (GTK_TABLE (table), s.offset_z3, 4, 5, 3, 4,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.offset_z3, 50, -2);
+ gtk_entry_set_text (GTK_ENTRY (s.offset_z3), "0");
+
+ return dlg_domodal(dlg, LC_CANCEL);
+}
+
+// About Dialog
+
+int aboutdlg_execute(void* param)
+{
+#include "pixmaps/icon32.xpm"
+ GtkWidget *dlg;
+ GtkWidget *vbox1, *vbox2, *hbox;
+ GtkWidget *frame, *w;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ gtk_widget_set_usize (dlg, 430, 230);
+ gtk_window_set_title (GTK_WINDOW (dlg), "About LeoCAD");
+ gtk_window_set_policy (GTK_WINDOW (dlg), FALSE, FALSE, FALSE);
+ gtk_widget_realize (dlg);
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (dlg), vbox1);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbox, TRUE, TRUE, 0);
+ gtk_widget_set_usize (hbox, -2, 85);
+
+ w = new_pixmap (dlg, icon32);
+ gtk_widget_show (w);
+ gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
+ gtk_widget_set_usize (w, 32, 32);
+
+ vbox2 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox2);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox2, TRUE, TRUE, 0);
+
+ w = gtk_label_new ("LeoCAD for Linux Version 0.71");
+ gtk_widget_show (w);
+ gtk_box_pack_start (GTK_BOX (vbox2), w, FALSE, FALSE, 5);
+
+ w = gtk_label_new ("Copyright (c) 1996-99, BT Software");
+ gtk_widget_show (w);
+ gtk_box_pack_start (GTK_BOX (vbox2), w, FALSE, FALSE, 5);
+
+ vbox2 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox2);
+ gtk_box_pack_end (GTK_BOX (hbox), vbox2, FALSE, FALSE, 15);
+
+ w = gtk_button_new_with_label ("OK");
+ gtk_widget_show (w);
+ gtk_signal_connect (GTK_OBJECT (w), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_OK));
+ gtk_box_pack_start (GTK_BOX (vbox2), w, FALSE, FALSE, 0);
+ gtk_widget_set_usize (w, 60, 40);
+ gtk_widget_grab_focus (w);
+ GtkAccelGroup *accel_group = gtk_accel_group_new ();
+ gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
+ gtk_widget_add_accelerator (w, "clicked", accel_group,
+ GDK_Return, 0, GTK_ACCEL_VISIBLE);
+
+ frame = gtk_frame_new ("System Information");
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (vbox1), frame, TRUE, TRUE, 0);
+ gtk_widget_set_usize (frame, -2, 90);
+ gtk_container_border_width (GTK_CONTAINER (frame), 10);
+
+ w = gtk_text_new (NULL, NULL);
+ gtk_widget_show (w);
+ gtk_container_add (GTK_CONTAINER (frame), w);
+
+ return dlg_domodal(dlg, LC_OK);
+}
+
+// HTML Dialog
+
+typedef struct
+{
+ void* data;
+ GtkWidget *single, *multiple, *index;
+ GtkWidget *list_end, *list_step, *images;
+ GtkWidget *highlight, *directory;
+} LC_HTMLDLG_STRUCT;
+
+static void htmldlg_ok(GtkWidget *widget, gpointer data)
+{
+ LC_HTMLDLG_STRUCT* s = (LC_HTMLDLG_STRUCT*)data;
+ LC_HTMLDLG_OPTS* opts = (LC_HTMLDLG_OPTS*)s->data;
+
+ opts->singlepage = (GTK_TOGGLE_BUTTON (s->single)->active) ? true : false;
+ opts->index = (GTK_TOGGLE_BUTTON (s->index)->active) ? true : false;
+ opts->images = (GTK_TOGGLE_BUTTON (s->images)->active) ? true : false;
+ opts->listend = (GTK_TOGGLE_BUTTON (s->list_end)->active) ? true : false;
+ opts->liststep = (GTK_TOGGLE_BUTTON (s->list_step)->active) ? true : false;
+ opts->hilite = (GTK_TOGGLE_BUTTON (s->highlight)->active) ? true : false;
+ strcpy(opts->path, gtk_entry_get_text (GTK_ENTRY (s->directory)));
+
+ *cur_ret = LC_OK;
+}
+
+static void htmldlg_images(GtkWidget *widget, gpointer data)
+{
+ LC_HTMLDLG_STRUCT* s = (LC_HTMLDLG_STRUCT*)data;
+ LC_HTMLDLG_OPTS* opts = (LC_HTMLDLG_OPTS*)s->data;
+
+ imageoptsdlg_execute(&opts->imdlg ,true);
+}
+
+int htmldlg_execute(void* param)
+{
+ GtkWidget *dlg;
+ GtkWidget *vbox1, *vbox2;
+ GtkWidget *hbox;
+ GtkWidget *frame, *label, *button;
+ GSList *radio_group = (GSList*)NULL;
+ LC_HTMLDLG_STRUCT s;
+ s.data = param;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ gtk_widget_set_usize (dlg, 350, 320);
+ gtk_window_set_title (GTK_WINDOW (dlg), "HTML Options");
+ gtk_window_set_policy (GTK_WINDOW (dlg), FALSE, FALSE, FALSE);
+ gtk_widget_realize (dlg);
+
+ vbox1 = gtk_vbox_new (FALSE, 10);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (dlg), vbox1);
+ gtk_container_border_width (GTK_CONTAINER (vbox1), 20);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, TRUE, 0);
+
+ frame = gtk_frame_new ("Layout");
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
+ gtk_widget_set_usize (frame, 220, 100);
+
+ vbox2 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox2);
+ gtk_container_add (GTK_CONTAINER (frame), vbox2);
+ gtk_container_border_width (GTK_CONTAINER (vbox2), 5);
+
+ s.single = gtk_radio_button_new_with_label (radio_group, "Single page");
+ radio_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.single));
+ gtk_widget_show (s.single);
+ gtk_box_pack_start (GTK_BOX (vbox2), s.single, TRUE, TRUE, 0);
+
+ s.multiple = gtk_radio_button_new_with_label (radio_group, "One step per page");
+ radio_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.multiple));
+ gtk_widget_show (s.multiple);
+ gtk_box_pack_start (GTK_BOX (vbox2), s.multiple, TRUE, TRUE, 0);
+
+ s.index = gtk_check_button_new_with_label ("Index page");
+ gtk_widget_show (s.index);
+ gtk_box_pack_start (GTK_BOX (vbox2), s.index, TRUE, TRUE, 0);
+
+ vbox2 = gtk_vbox_new (FALSE, 5);
+ gtk_widget_show (vbox2);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, TRUE, 10);
+ gtk_widget_set_usize (vbox2, 85, -2);
+ gtk_container_border_width (GTK_CONTAINER (vbox2), 5);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (htmldlg_ok), &s);
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0);
+ gtk_widget_set_usize (button, -2, 25);
+ GtkAccelGroup *accel_group = gtk_accel_group_new ();
+ gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Return, 0, GTK_ACCEL_VISIBLE);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_CANCEL));
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0);
+ gtk_widget_set_usize (button, -2, 25);
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Escape, 0, GTK_ACCEL_VISIBLE);
+
+ button = gtk_button_new_with_label ("Images...");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (htmldlg_images), &s);
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, TRUE, 0);
+ gtk_widget_set_usize (button, -2, 25);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, TRUE, 0);
+
+ frame = gtk_frame_new ("Pieces List");
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
+ gtk_widget_set_usize (frame, 220, 100);
+
+ vbox2 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox2);
+ gtk_container_add (GTK_CONTAINER (frame), vbox2);
+ gtk_container_border_width (GTK_CONTAINER (vbox2), 5);
+
+ s.list_step = gtk_check_button_new_with_label ("After each step");
+ gtk_widget_show (s.list_step);
+ gtk_box_pack_start (GTK_BOX (vbox2), s.list_step, TRUE, TRUE, 0);
+
+ s.list_end = gtk_check_button_new_with_label ("At the end");
+ gtk_widget_show (s.list_end);
+ gtk_box_pack_start (GTK_BOX (vbox2), s.list_end, TRUE, TRUE, 0);
+
+ s.images = gtk_check_button_new_with_label ("Create Images");
+ gtk_widget_show (s.images);
+ gtk_box_pack_start (GTK_BOX (vbox2), s.images, TRUE, TRUE, 0);
+
+ s.highlight = gtk_check_button_new_with_label ("Highlight new pieces");
+ gtk_widget_show (s.highlight);
+ gtk_box_pack_start (GTK_BOX (vbox1), s.highlight, FALSE, TRUE, 0);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, TRUE, 0);
+ gtk_widget_set_usize (hbox, -2, 30);
+
+ label = gtk_label_new ("Output directory");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ s.directory = gtk_entry_new ();
+ gtk_widget_show (s.directory);
+ gtk_box_pack_end (GTK_BOX (hbox), s.directory, FALSE, TRUE, 0);
+ gtk_widget_set_usize (s.directory, 210, -2);
+
+ return dlg_domodal(dlg, LC_CANCEL);
+}
+
+// Image Options Dialog
+
+typedef struct
+{
+ void* data;
+ bool from_htmldlg;
+ GtkWidget *single, *multiple, *from, *to;
+ GtkWidget *width, *height;
+ GtkWidget *bitmap, *gif, *jpg;
+ GtkWidget *highcolor, *transparent, *progressive, *quality;
+} LC_IMAGEOPTSDLG_STRUCT;
+
+static void imageoptsdlg_ok(GtkWidget *widget, gpointer data)
+{
+ LC_IMAGEOPTSDLG_STRUCT* s = (LC_IMAGEOPTSDLG_STRUCT*)data;
+ LC_IMAGEDLG_OPTS* opts = (LC_IMAGEDLG_OPTS*)s->data;
+ int i;
+
+ if ((GTK_TOGGLE_BUTTON (s->bitmap)->active))
+ opts->imopts.format = LC_IMAGE_BMP;
+ if ((GTK_TOGGLE_BUTTON (s->gif)->active))
+ opts->imopts.format = LC_IMAGE_GIF;
+ if ((GTK_TOGGLE_BUTTON (s->jpg)->active))
+ opts->imopts.format = LC_IMAGE_JPG;
+ opts->imopts.transparent = (GTK_TOGGLE_BUTTON (s->transparent)->active) ? true : false;
+ opts->imopts.interlaced = (GTK_TOGGLE_BUTTON (s->progressive)->active) ? true : false;
+ opts->imopts.truecolor = (GTK_TOGGLE_BUTTON (s->highcolor)->active) ? true : false;
+ if (!read_int(s->quality, &i, 1, 100)) return;
+ opts->imopts.quality = i;
+ if (!read_int(s->height, &i, 1, 5000)) return;
+ opts->height = i;
+ if (!read_int(s->width, &i, 1, 5000)) return;
+ opts->width = i;
+ if (!read_int(s->from, &i, 1, 65535)) return;
+ opts->from = i;
+ if (!read_int(s->to, &i, 1, 65535)) return;
+ opts->to = i;
+ opts->multiple = (GTK_TOGGLE_BUTTON (s->multiple)->active) ? true : false;
+
+ unsigned long image = opts->imopts.format;
+ if (opts->imopts.interlaced)
+ image |= LC_IMAGE_PROGRESSIVE;
+ if (opts->imopts.transparent)
+ image |= LC_IMAGE_TRANSPARENT;
+ if (opts->imopts.truecolor)
+ image |= LC_IMAGE_HIGHCOLOR;
+
+ if (s->from_htmldlg)
+ {
+ SystemSetProfileInt("Default", "HTML Options", image);
+ SystemSetProfileInt("Default", "HTML Width", opts->width);
+ SystemSetProfileInt("Default", "HTML Height", opts->height);
+ }
+ else
+ {
+ SystemSetProfileInt("Default", "Image Options", image);
+ SystemSetProfileInt("Default", "Image Width", opts->width);
+ SystemSetProfileInt("Default", "Image Height", opts->height);
+ }
+
+ *cur_ret = LC_OK;
+}
+
+int imageoptsdlg_execute(void* param, bool from_htmldlg)
+{
+ GtkWidget *dlg;
+ GtkWidget *vbox1, *vbox2;
+ GtkWidget *hbox1, *hbox2;
+ GtkWidget *frame, *label, *button, *table;
+ GSList *radio_group1 = (GSList*)NULL, *radio_group2 = (GSList*)NULL;
+ LC_IMAGEOPTSDLG_STRUCT s;
+ LC_IMAGEDLG_OPTS* opts = (LC_IMAGEDLG_OPTS*)param;
+ s.data = param;
+ s.from_htmldlg = from_htmldlg;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ gtk_widget_set_usize (dlg, 400, 280);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Image Options");
+ gtk_window_set_policy (GTK_WINDOW (dlg), FALSE, FALSE, FALSE);
+ gtk_widget_realize (dlg);
+
+ hbox1 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox1);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox1);
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox1);
+ gtk_box_pack_start (GTK_BOX (hbox1), vbox1, TRUE, TRUE, 0);
+
+ frame = gtk_frame_new ("Pictures");
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (vbox1), frame, FALSE, TRUE, 0);
+ gtk_widget_set_usize (frame, 170, 130);
+ gtk_container_border_width (GTK_CONTAINER (frame), 10);
+
+ vbox2 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox2);
+ gtk_container_add (GTK_CONTAINER (frame), vbox2);
+ gtk_container_border_width (GTK_CONTAINER (vbox2), 5);
+
+ s.single = gtk_radio_button_new_with_label (radio_group1, "Single");
+ radio_group1 = gtk_radio_button_group (GTK_RADIO_BUTTON (s.single));
+ gtk_widget_show (s.single);
+ gtk_box_pack_start (GTK_BOX (vbox2), s.single, TRUE, TRUE, 0);
+
+ s.multiple = gtk_radio_button_new_with_label (radio_group1, "Multiple");
+ radio_group1 = gtk_radio_button_group (GTK_RADIO_BUTTON (s.multiple));
+ gtk_widget_show (s.multiple);
+ gtk_box_pack_start (GTK_BOX (vbox2), s.multiple, TRUE, TRUE, 0);
+
+ hbox2 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox2);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox2, TRUE, TRUE, 0);
+
+ label = gtk_label_new ("From");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox2), label, TRUE, TRUE, 0);
+
+ s.from = gtk_entry_new ();
+ gtk_widget_show (s.from);
+ gtk_box_pack_start (GTK_BOX (hbox2), s.from, FALSE, FALSE, 0);
+ gtk_widget_set_usize (s.from, 50, -2);
+
+ label = gtk_label_new ("to");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox2), label, TRUE, TRUE, 0);
+
+ s.to = gtk_entry_new ();
+ gtk_widget_show (s.to);
+ gtk_box_pack_start (GTK_BOX (hbox2), s.to, FALSE, FALSE, 0);
+ gtk_widget_set_usize (s.to, 50, -2);
+
+ frame = gtk_frame_new ("Dimensions");
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (vbox1), frame, FALSE, TRUE, 0);
+ gtk_widget_set_usize (frame, -2, 100);
+ gtk_container_border_width (GTK_CONTAINER (frame), 10);
+
+ table = gtk_table_new (2, 2, FALSE);
+ gtk_widget_show (table);
+ gtk_container_add (GTK_CONTAINER (frame), table);
+ gtk_container_border_width (GTK_CONTAINER (table), 5);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 10);
+
+ s.width = gtk_entry_new ();
+ gtk_widget_show (s.width);
+ gtk_table_attach (GTK_TABLE (table), s.width, 1, 2, 0, 1,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.width, 50, -2);
+
+ s.height = gtk_entry_new ();
+ gtk_widget_show (s.height);
+ gtk_table_attach (GTK_TABLE (table), s.height, 1, 2, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.height, 50, -2);
+
+ label = gtk_label_new ("Height");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (label, 50, -2);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ label = gtk_label_new ("Width");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (label, 50, -2);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ hbox2 = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox2);
+ gtk_box_pack_end (GTK_BOX (vbox1), hbox2, FALSE, TRUE, 10);
+ gtk_container_border_width (GTK_CONTAINER (hbox2), 5);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (imageoptsdlg_ok), &s);
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, TRUE, 25);
+ gtk_widget_set_usize (button, 70, 25);
+ GtkAccelGroup *accel_group = gtk_accel_group_new ();
+ gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Return, 0, GTK_ACCEL_VISIBLE);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_CANCEL));
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (hbox2), button, FALSE, TRUE, 0);
+ gtk_widget_set_usize (button, 70, -2);
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Escape, 0, GTK_ACCEL_VISIBLE);
+
+ frame = gtk_frame_new ("Format");
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (hbox1), frame, TRUE, TRUE, 0);
+ gtk_container_border_width (GTK_CONTAINER (frame), 10);
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (frame), vbox1);
+ gtk_container_border_width (GTK_CONTAINER (vbox1), 5);
+
+ s.bitmap = gtk_radio_button_new_with_label (radio_group2, "Bitmap");
+ radio_group2 = gtk_radio_button_group (GTK_RADIO_BUTTON (s.bitmap));
+ gtk_widget_show (s.bitmap);
+ gtk_box_pack_start (GTK_BOX (vbox1), s.bitmap, TRUE, TRUE, 0);
+
+ s.highcolor = gtk_check_button_new_with_label ("High color");
+ gtk_widget_show (s.highcolor);
+ gtk_box_pack_start (GTK_BOX (vbox1), s.highcolor, TRUE, TRUE, 0);
+
+ s.gif = gtk_radio_button_new_with_label (radio_group2, "GIF");
+ radio_group2 = gtk_radio_button_group (GTK_RADIO_BUTTON (s.gif));
+ gtk_widget_show (s.gif);
+ gtk_box_pack_start (GTK_BOX (vbox1), s.gif, TRUE, TRUE, 0);
+
+ s.transparent = gtk_check_button_new_with_label ("Transparent");
+ gtk_widget_show (s.transparent);
+ gtk_box_pack_start (GTK_BOX (vbox1), s.transparent, TRUE, TRUE, 0);
+
+ s.jpg = gtk_radio_button_new_with_label (radio_group2, "JPEG");
+ radio_group2 = gtk_radio_button_group (GTK_RADIO_BUTTON (s.jpg));
+ gtk_widget_show (s.jpg);
+ gtk_box_pack_start (GTK_BOX (vbox1), s.jpg, TRUE, TRUE, 0);
+
+ s.progressive = gtk_check_button_new_with_label ("Progressive");
+ gtk_widget_show (s.progressive);
+ gtk_box_pack_start (GTK_BOX (vbox1), s.progressive, TRUE, TRUE, 0);
+
+ hbox2 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox2);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbox2, TRUE, TRUE, 0);
+
+ label = gtk_label_new ("Quality");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox2), label, TRUE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ s.quality = gtk_entry_new ();
+ gtk_widget_show (s.quality);
+ gtk_box_pack_start (GTK_BOX (hbox2), s.quality, FALSE, FALSE, 0);
+ gtk_widget_set_usize (s.quality, 50, -2);
+
+ switch (opts->imopts.format)
+ {
+ case LC_IMAGE_BMP:
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.bitmap), TRUE);
+ break;
+
+ case LC_IMAGE_GIF:
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.gif), TRUE);
+ break;
+
+ case LC_IMAGE_JPG:
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.jpg), TRUE);
+ break;
+ }
+
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.transparent), opts->imopts.transparent);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.progressive), opts->imopts.interlaced);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.highcolor), opts->imopts.truecolor);
+
+ write_int(s.quality, opts->imopts.quality);
+ write_int(s.height, opts->height);
+ write_int(s.width, opts->width);
+ write_int(s.from, opts->from);
+ write_int(s.to, opts->to);
+
+ if (opts->multiple)
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.multiple), TRUE);
+ else
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.single), TRUE);
+
+ return dlg_domodal(dlg, LC_CANCEL);
+}
+
+// POV-Ray Export Dialog
+
+typedef struct
+{
+ void* data;
+ GtkWidget *lgeo, *pov, *output, *render;
+} LC_POVRAYDLG_STRUCT;
+
+static void povraydlg_ok(GtkWidget *widget, gpointer data)
+{
+ LC_POVRAYDLG_STRUCT* s = (LC_POVRAYDLG_STRUCT*)data;
+ LC_POVRAYDLG_OPTS* opts = (LC_POVRAYDLG_OPTS*)s->data;
+
+ opts->render = (GTK_TOGGLE_BUTTON (s->render)->active) ? true : false;
+ strcpy(opts->povpath, gtk_entry_get_text (GTK_ENTRY (s->pov)));
+ strcpy(opts->outpath, gtk_entry_get_text (GTK_ENTRY (s->output)));
+ strcpy(opts->libpath, gtk_entry_get_text (GTK_ENTRY (s->lgeo)));
+
+ *cur_ret = LC_OK;
+}
+
+int povraydlg_execute(void* param)
+{
+ GtkWidget *dlg;
+ GtkWidget *vbox, *hbox1, *hbox2;
+ GtkWidget *label, *button;
+ LC_POVRAYDLG_STRUCT s;
+ s.data = param;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ gtk_widget_set_usize (dlg, 375, 190);
+ gtk_window_set_title (GTK_WINDOW (dlg), "POV-Ray Export");
+ gtk_window_set_policy (GTK_WINDOW (dlg), FALSE, FALSE, FALSE);
+ gtk_widget_realize (dlg);
+
+ hbox1 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox1);
+ gtk_container_add (GTK_CONTAINER (dlg), hbox1);
+
+ vbox = gtk_vbox_new (FALSE, 10);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox1), vbox, FALSE, TRUE, 0);
+ gtk_widget_set_usize (vbox, 250, -2);
+ gtk_container_border_width (GTK_CONTAINER (vbox), 10);
+
+ hbox2 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox2);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
+
+ label = gtk_label_new ("LGEO Path (optional)");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ s.lgeo = gtk_entry_new ();
+ gtk_widget_show (s.lgeo);
+ gtk_box_pack_start (GTK_BOX (vbox), s.lgeo, FALSE, TRUE, 0);
+
+ hbox2 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox2);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
+
+ label = gtk_label_new ("POV-Ray Executable");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ s.pov = gtk_entry_new ();
+ gtk_widget_show (s.pov);
+ gtk_box_pack_start (GTK_BOX (vbox), s.pov, FALSE, TRUE, 0);
+
+ hbox2 = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox2);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, TRUE, 0);
+
+ label = gtk_label_new ("Output File");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox2), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ s.output = gtk_entry_new ();
+ gtk_widget_show (s.output);
+ gtk_box_pack_start (GTK_BOX (vbox), s.output, FALSE, TRUE, 0);
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox);
+ gtk_box_pack_start (GTK_BOX (hbox1), vbox, FALSE, TRUE, 0);
+ gtk_container_border_width (GTK_CONTAINER (vbox), 10);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (povraydlg_ok), &s);
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 5);
+ gtk_widget_set_usize (button, -2, 25);
+ GtkAccelGroup *accel_group = gtk_accel_group_new ();
+ gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Return, 0, GTK_ACCEL_VISIBLE);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_CANCEL));
+ gtk_widget_show (button);
+ gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, TRUE, 5);
+ gtk_widget_set_usize (button, -2, 25);
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Escape, 0, GTK_ACCEL_VISIBLE);
+
+ s.render = gtk_check_button_new_with_label ("Render Scene");
+ gtk_widget_show (s.render);
+ gtk_box_pack_start (GTK_BOX (vbox), s.render, FALSE, TRUE, 5);
+ gtk_widget_set_sensitive (s.render, FALSE);
+
+ return dlg_domodal(dlg, LC_CANCEL);
+}
+
+// Preferences Dialog
+
+typedef struct
+{
+ void* data;
+ GtkWidget *det_edges, *det_dither, *det_lighting, *det_smooth;
+ GtkWidget *det_antialias, *det_linear, *det_screen, *det_fast;
+ GtkWidget *det_solid, *det_hidden, *det_background, *det_width;
+ GtkWidget *draw_grid, *draw_gridunits, *draw_axis, *draw_preview;
+ GtkWidget *draw_snapx, *draw_snapy, *draw_snapz, *draw_angle;
+ GtkWidget *draw_anglesnap, *draw_centimeter, *draw_collision;
+ GtkWidget *draw_move, *draw_fixed;
+ GtkWidget *draw_lockx, *draw_locky, *draw_lockz;
+ GtkWidget *scn_solid, *scn_gradient, *scn_image, *scn_imagename;
+ GtkWidget *scn_tile, *scn_fog, *scn_floor, *scn_density;
+ GtkWidget *scn_clrbackground, *scn_clrgrad1, *scn_clrgrad2, *scn_clrfog, *scn_clrambient;
+} LC_PREFERENCESDLG_STRUCT;
+
+static void preferencesdlg_ok(GtkWidget *widget, gpointer data)
+{
+ LC_PREFERENCESDLG_STRUCT* s = (LC_PREFERENCESDLG_STRUCT*)data;
+ LC_PREFERENCESDLG_OPTS* opts = (LC_PREFERENCESDLG_OPTS*)s->data;
+
+ unsigned long detail = 0;
+ float line_width;
+ if (GTK_TOGGLE_BUTTON (s->det_edges)->active) detail |= LC_DET_BRICKEDGES;
+ if (GTK_TOGGLE_BUTTON (s->det_dither)->active) detail |= LC_DET_DITHER;
+ if (GTK_TOGGLE_BUTTON (s->det_lighting)->active) detail |= LC_DET_LIGHTING;
+ if (GTK_TOGGLE_BUTTON (s->det_smooth)->active) detail |= LC_DET_SMOOTH;
+ if (GTK_TOGGLE_BUTTON (s->det_antialias)->active) detail |= LC_DET_ANTIALIAS;
+ if (GTK_TOGGLE_BUTTON (s->det_linear)->active) detail |= LC_DET_LINEAR;
+ if (GTK_TOGGLE_BUTTON (s->det_screen)->active) detail |= LC_DET_SCREENDOOR;
+ if (GTK_TOGGLE_BUTTON (s->det_fast)->active) detail |= LC_DET_FAST;
+ if (GTK_TOGGLE_BUTTON (s->det_solid)->active) detail |= LC_DET_BOX_FILL;
+ if (GTK_TOGGLE_BUTTON (s->det_hidden)->active) detail |= LC_DET_HIDDEN_LINE;
+ if (GTK_TOGGLE_BUTTON (s->det_background)->active) detail |= LC_DET_BACKGROUND;
+ if (!read_float(s->det_width, &line_width, 0.5f, 5.0f)) return;
+
+ unsigned long snap = 0;
+ int grid_size, angle_snap;
+ if (GTK_TOGGLE_BUTTON (s->draw_grid)->active) snap |= LC_DRAW_GRID;
+ if (GTK_TOGGLE_BUTTON (s->draw_axis)->active) snap |= LC_DRAW_AXIS;
+ if (GTK_TOGGLE_BUTTON (s->draw_preview)->active) snap |= LC_DRAW_PREVIEW;
+ if (GTK_TOGGLE_BUTTON (s->draw_snapx)->active) snap |= LC_DRAW_SNAP_X;
+ if (GTK_TOGGLE_BUTTON (s->draw_snapy)->active) snap |= LC_DRAW_SNAP_Y;
+ if (GTK_TOGGLE_BUTTON (s->draw_snapz)->active) snap |= LC_DRAW_SNAP_Z;
+ if (GTK_TOGGLE_BUTTON (s->draw_angle)->active) snap |= LC_DRAW_SNAP_A;
+ if (GTK_TOGGLE_BUTTON (s->draw_centimeter)->active) snap |= LC_DRAW_CM_UNITS;
+ // if (GTK_TOGGLE_BUTTON (s->draw_collision)->active) snap |= LC_DRAW_COLLISION;
+ if (GTK_TOGGLE_BUTTON (s->draw_move)->active) snap |= LC_DRAW_MOVE;
+ if (GTK_TOGGLE_BUTTON (s->draw_fixed)->active) snap |= LC_DRAW_MOVEAXIS;
+ if (GTK_TOGGLE_BUTTON (s->draw_lockx)->active) snap |= LC_DRAW_LOCK_X;
+ if (GTK_TOGGLE_BUTTON (s->draw_locky)->active) snap |= LC_DRAW_LOCK_Y;
+ if (GTK_TOGGLE_BUTTON (s->draw_lockz)->active) snap |= LC_DRAW_LOCK_Z;
+ if (!read_int(s->draw_gridunits, &grid_size, 2, 1000)) return;
+ if (!read_int(s->draw_anglesnap, &angle_snap, 1, 180)) return;
+
+ int fog;
+ unsigned long scene = 0;
+ if (GTK_TOGGLE_BUTTON (s->scn_gradient)->active) scene |= LC_SCENE_GRADIENT;
+ if (GTK_TOGGLE_BUTTON (s->scn_image)->active) scene |= LC_SCENE_BG;
+ if (GTK_TOGGLE_BUTTON (s->scn_tile)->active) scene |= LC_SCENE_BG_TILE;
+ if (GTK_TOGGLE_BUTTON (s->scn_fog)->active) scene |= LC_SCENE_FOG;
+ if (GTK_TOGGLE_BUTTON (s->scn_floor)->active) scene |= LC_SCENE_FLOOR;
+ read_int(s->scn_density, &fog, 1, 100);
+
+ strcpy(opts->strBackground, gtk_entry_get_text (GTK_ENTRY (s->scn_imagename)));
+ opts->nDetail = detail;
+ opts->fLineWidth = line_width;
+ opts->nSnap = snap;
+ opts->nAngleSnap = angle_snap;
+ opts->nGridSize = grid_size;
+ opts->nScene = scene;
+ opts->fDensity = (float)fog/100;
+
+ // int nMouse;
+ // int nSaveInterval;
+ // char strPath[LC_MAXPATH];
+
+ *cur_ret = LC_OK;
+}
+
+static void preferencesdlg_color(GtkWidget *widget, gpointer data)
+{
+ if (colorseldlg_execute(data) == LC_OK)
+ set_button_pixmap (widget, (float*)data);
+}
+
+static void preferencesdlg_realize(GtkWidget *widget)
+{
+ void* data = gtk_object_get_data (GTK_OBJECT (widget), "color_flt");
+ set_button_pixmap (widget, (float*)data);
+}
+
+int preferencesdlg_execute(void* param)
+{
+ GtkWidget *dlg;
+ GtkWidget *vbox1, *vbox2, *hbox;
+ GtkWidget *frame, *label, *button, *table, *notebook;
+ GSList *table_group = NULL;
+ LC_PREFERENCESDLG_STRUCT s;
+ LC_PREFERENCESDLG_OPTS* opts = (LC_PREFERENCESDLG_OPTS*)param;
+ s.data = param;
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ gtk_widget_set_usize (dlg, 450, 300);
+ gtk_window_set_title (GTK_WINDOW (dlg), "Preferences");
+ gtk_window_set_policy (GTK_WINDOW (dlg), FALSE, FALSE, FALSE);
+ gtk_widget_realize (dlg);
+
+ vbox1 = gtk_vbox_new (FALSE, 7);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (dlg), vbox1);
+ gtk_container_border_width (GTK_CONTAINER (vbox1), 7);
+
+ notebook = gtk_notebook_new ();
+ gtk_widget_show (notebook);
+ gtk_box_pack_start (GTK_BOX (vbox1), notebook, TRUE, TRUE, 0);
+
+ vbox2 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox2);
+ gtk_container_add (GTK_CONTAINER (notebook), vbox2);
+
+ table = gtk_table_new (7, 2, TRUE);
+ gtk_widget_show (table);
+ gtk_container_add (GTK_CONTAINER (notebook), table);
+ gtk_container_border_width (GTK_CONTAINER (table), 5);
+
+ s.det_edges = gtk_check_button_new_with_label ("Draw edges");
+ gtk_widget_show (s.det_edges);
+ gtk_table_attach (GTK_TABLE (table), s.det_edges, 0, 1, 0, 1,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.det_dither = gtk_check_button_new_with_label ("Dithering");
+ gtk_widget_show (s.det_dither);
+ gtk_table_attach (GTK_TABLE (table), s.det_dither, 0, 1, 1, 2,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.det_lighting = gtk_check_button_new_with_label ("Lighting");
+ gtk_widget_show (s.det_lighting);
+ gtk_table_attach (GTK_TABLE (table), s.det_lighting, 0, 1, 2, 3,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.det_smooth = gtk_check_button_new_with_label ("Smooth shading");
+ gtk_widget_show (s.det_smooth);
+ gtk_table_attach (GTK_TABLE (table), s.det_smooth, 0, 1, 3, 4,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.det_antialias = gtk_check_button_new_with_label ("Anti-aliasing");
+ gtk_widget_show (s.det_antialias);
+ gtk_table_attach (GTK_TABLE (table), s.det_antialias, 0, 1, 4, 5,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.det_linear = gtk_check_button_new_with_label ("Linear filtering");
+ gtk_widget_show (s.det_linear);
+ gtk_table_attach (GTK_TABLE (table), s.det_linear, 0, 1, 5, 6,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.det_screen = gtk_check_button_new_with_label ("Screen door transparency");
+ gtk_widget_show (s.det_screen);
+ gtk_table_attach (GTK_TABLE (table), s.det_screen, 0, 1, 6, 7,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.det_fast = gtk_check_button_new_with_label ("Fast rendering");
+ gtk_widget_show (s.det_fast);
+ gtk_table_attach (GTK_TABLE (table), s.det_fast, 1, 2, 0, 1,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.det_solid = gtk_check_button_new_with_label ("Draw solid boxes");
+ gtk_widget_show (s.det_solid);
+ gtk_table_attach (GTK_TABLE (table), s.det_solid, 1, 2, 1, 2,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.det_hidden = gtk_check_button_new_with_label ("Remove hidden lines");
+ gtk_widget_show (s.det_hidden);
+ gtk_table_attach (GTK_TABLE (table), s.det_hidden, 1, 2, 2, 3,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.det_background = gtk_check_button_new_with_label ("Background rendering");
+ gtk_widget_show (s.det_background);
+ gtk_table_attach (GTK_TABLE (table), s.det_background, 1, 2, 3, 4,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 4, 5,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ label = gtk_label_new ("Line width");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ s.det_width = gtk_entry_new ();
+ gtk_widget_show (s.det_width);
+ gtk_box_pack_start (GTK_BOX (hbox), s.det_width, FALSE, FALSE, 0);
+ gtk_widget_set_usize (s.det_width, 50, -2);
+
+ table = gtk_table_new (8, 2, TRUE);
+ gtk_widget_show (table);
+ gtk_container_add (GTK_CONTAINER (notebook), table);
+ gtk_container_border_width (GTK_CONTAINER (table), 5);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 0, 1, 0, 1,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.draw_grid = gtk_check_button_new_with_label ("Base grid");
+ gtk_widget_show (s.draw_grid);
+ gtk_box_pack_start (GTK_BOX (hbox), s.draw_grid, FALSE, FALSE, 0);
+
+ s.draw_gridunits = gtk_entry_new ();
+ gtk_widget_show (s.draw_gridunits);
+ gtk_box_pack_start (GTK_BOX (hbox), s.draw_gridunits, FALSE, FALSE, 0);
+ gtk_widget_set_usize (s.draw_gridunits, 50, -2);
+
+ label = gtk_label_new ("units");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ s.draw_axis = gtk_check_button_new_with_label ("Axis icon");
+ gtk_widget_show (s.draw_axis);
+ gtk_table_attach (GTK_TABLE (table), s.draw_axis, 0, 1, 1, 2,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.draw_preview = gtk_check_button_new_with_label ("Preview position");
+ gtk_widget_show (s.draw_preview);
+ gtk_table_attach (GTK_TABLE (table), s.draw_preview, 0, 1, 2, 3,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.draw_snapx = gtk_check_button_new_with_label ("Snap X");
+ gtk_widget_show (s.draw_snapx);
+ gtk_table_attach (GTK_TABLE (table), s.draw_snapx, 0, 1, 3, 4,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.draw_snapy = gtk_check_button_new_with_label ("Snap Y");
+ gtk_widget_show (s.draw_snapy);
+ gtk_table_attach (GTK_TABLE (table), s.draw_snapy, 0, 1, 4, 5,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.draw_snapz = gtk_check_button_new_with_label ("Snap Z");
+ gtk_widget_show (s.draw_snapz);
+ gtk_table_attach (GTK_TABLE (table), s.draw_snapz, 0, 1, 5, 6,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 0, 1, 6, 7,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.draw_angle = gtk_check_button_new_with_label ("Angle snap");
+ gtk_widget_show (s.draw_angle);
+ gtk_box_pack_start (GTK_BOX (hbox), s.draw_angle, FALSE, FALSE, 0);
+
+ s.draw_anglesnap = gtk_entry_new ();
+ gtk_widget_show (s.draw_anglesnap);
+ gtk_box_pack_start (GTK_BOX (hbox), s.draw_anglesnap, FALSE, FALSE, 0);
+ gtk_widget_set_usize (s.draw_anglesnap, 50, -2);
+
+ label = gtk_label_new ("degrees");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ s.draw_centimeter = gtk_check_button_new_with_label ("Centimeter units");
+ gtk_widget_show (s.draw_centimeter);
+ gtk_table_attach (GTK_TABLE (table), s.draw_centimeter, 0, 1, 7, 8,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.draw_collision = gtk_check_button_new_with_label ("Collision detection");
+ gtk_widget_show (s.draw_collision);
+ gtk_table_attach (GTK_TABLE (table), s.draw_collision, 1, 2, 0, 1,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+ gtk_widget_set_sensitive (s.draw_collision, FALSE);
+
+ s.draw_move = gtk_check_button_new_with_label ("Switch to move after insert");
+ gtk_widget_show (s.draw_move);
+ gtk_table_attach (GTK_TABLE (table), s.draw_move, 1, 2, 1, 2,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.draw_fixed = gtk_check_button_new_with_label ("Fixed direction keys");
+ gtk_widget_show (s.draw_fixed);
+ gtk_table_attach (GTK_TABLE (table), s.draw_fixed, 1, 2, 2, 3,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.draw_lockx = gtk_check_button_new_with_label ("Lock X");
+ gtk_widget_show (s.draw_lockx);
+ gtk_table_attach (GTK_TABLE (table), s.draw_lockx, 1, 2, 3, 4,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.draw_locky = gtk_check_button_new_with_label ("Lock Y");
+ gtk_widget_show (s.draw_locky);
+ gtk_table_attach (GTK_TABLE (table), s.draw_locky, 1, 2, 4, 5,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.draw_lockz = gtk_check_button_new_with_label ("Lock Z");
+ gtk_widget_show (s.draw_lockz);
+ gtk_table_attach (GTK_TABLE (table), s.draw_lockz, 1, 2, 5, 6,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ hbox = gtk_hbox_new (FALSE, 8);
+ gtk_widget_show (hbox);
+ gtk_container_add (GTK_CONTAINER (notebook), hbox);
+ gtk_container_border_width (GTK_CONTAINER (hbox), 5);
+
+ frame = gtk_frame_new ("Background");
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, FALSE, 0);
+
+ table = gtk_table_new (4, 3, FALSE);
+ gtk_widget_show (table);
+ gtk_container_add (GTK_CONTAINER (frame), table);
+ gtk_widget_set_usize (table, 220, -2);
+ gtk_container_border_width (GTK_CONTAINER (table), 5);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 5);
+
+ s.scn_solid = gtk_radio_button_new_with_label (table_group, "Solid color");
+ table_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.scn_solid));
+ gtk_widget_show (s.scn_solid);
+ gtk_table_attach (GTK_TABLE (table), s.scn_solid, 0, 1, 0, 1,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)GTK_EXPAND, 0, 0);
+
+ s.scn_gradient = gtk_radio_button_new_with_label (table_group, "Gradient");
+ table_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.scn_gradient));
+ gtk_widget_show (s.scn_gradient);
+ gtk_table_attach (GTK_TABLE (table), s.scn_gradient, 0, 1, 1, 2,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)GTK_EXPAND, 0, 0);
+
+ s.scn_image = gtk_radio_button_new_with_label (table_group, "Image");
+ table_group = gtk_radio_button_group (GTK_RADIO_BUTTON (s.scn_image));
+ gtk_widget_show (s.scn_image);
+ gtk_table_attach (GTK_TABLE (table), s.scn_image, 0, 1, 2, 3,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)GTK_EXPAND, 0, 0);
+
+ s.scn_imagename = gtk_entry_new ();
+ gtk_widget_show (s.scn_imagename);
+ gtk_table_attach (GTK_TABLE (table), s.scn_imagename, 0, 3, 3, 4,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.scn_clrbackground = button = gtk_button_new_with_label ("");
+ gtk_widget_show (button);
+ gtk_table_attach (GTK_TABLE (table), button, 1, 2, 0, 1,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (button, 50, 30);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (preferencesdlg_color), opts->fBackground);
+ gtk_signal_connect (GTK_OBJECT (button), "realize",
+ GTK_SIGNAL_FUNC(preferencesdlg_realize), NULL);
+ gtk_object_set_data (GTK_OBJECT (button), "color_flt", opts->fBackground);
+
+ s.scn_clrgrad1 = button = gtk_button_new_with_label ("");
+ gtk_widget_show (button);
+ gtk_table_attach (GTK_TABLE (table), button, 1, 2, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (button, 50, 30);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (preferencesdlg_color), opts->fGrad1);
+ gtk_signal_connect (GTK_OBJECT (button), "realize",
+ GTK_SIGNAL_FUNC(preferencesdlg_realize), NULL);
+ gtk_object_set_data (GTK_OBJECT (button), "color_flt", opts->fGrad1);
+
+ s.scn_clrgrad2 = button = gtk_button_new_with_label ("");
+ gtk_widget_show (button);
+ gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (button, 50, 30);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (preferencesdlg_color), opts->fGrad2);
+ gtk_signal_connect (GTK_OBJECT (button), "realize",
+ GTK_SIGNAL_FUNC(preferencesdlg_realize), NULL);
+ gtk_object_set_data (GTK_OBJECT (button), "color_flt", opts->fGrad2);
+
+ s.scn_tile = gtk_check_button_new_with_label ("Tile");
+ gtk_widget_show (s.scn_tile);
+ gtk_table_attach (GTK_TABLE (table), s.scn_tile, 1, 2, 2, 3,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions) 0, 0, 0);
+
+ frame = gtk_frame_new ("Environment");
+ gtk_widget_show (frame);
+ gtk_box_pack_end (GTK_BOX (hbox), frame, FALSE, FALSE, 0);
+ gtk_widget_set_usize (frame, 175, -2);
+
+ table = gtk_table_new (5, 3, TRUE);
+ gtk_widget_show (table);
+ gtk_container_add (GTK_CONTAINER (frame), table);
+ gtk_container_border_width (GTK_CONTAINER (table), 5);
+
+ s.scn_fog = gtk_check_button_new_with_label ("Fog");
+ gtk_widget_show (s.scn_fog);
+ gtk_table_attach (GTK_TABLE (table), s.scn_fog, 0, 3, 0, 1,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ label = gtk_label_new ("Color");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 1, 2, 1, 2,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ label = gtk_label_new ("Density");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 1, 2, 2, 3,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label), 1.93715e-07, 0.5);
+
+ label = gtk_label_new ("Ambient light");
+ gtk_widget_show (label);
+ gtk_table_attach (GTK_TABLE (table), label, 0, 2, 3, 4,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5);
+
+ s.scn_floor = gtk_check_button_new_with_label ("Draw floor");
+ gtk_widget_show (s.scn_floor);
+ gtk_table_attach (GTK_TABLE (table), s.scn_floor, 0, 3, 4, 5,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ s.scn_clrfog = button = gtk_button_new_with_label ("");
+ gtk_widget_show (button);
+ gtk_table_attach (GTK_TABLE (table), button, 2, 3, 1, 2,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (button, 50, 30);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (preferencesdlg_color), opts->fFog);
+ gtk_signal_connect (GTK_OBJECT (button), "realize",
+ GTK_SIGNAL_FUNC(preferencesdlg_realize), NULL);
+ gtk_object_set_data (GTK_OBJECT (button), "color_flt", opts->fFog);
+
+ s.scn_clrambient = button = gtk_button_new_with_label ("");
+ gtk_widget_show (button);
+ gtk_table_attach (GTK_TABLE (table), button, 2, 3, 3, 4,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (button, 50, 30);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (preferencesdlg_color), opts->fAmbient);
+ gtk_signal_connect (GTK_OBJECT (button), "realize",
+ GTK_SIGNAL_FUNC(preferencesdlg_realize), NULL);
+ gtk_object_set_data (GTK_OBJECT (button), "color_flt", opts->fAmbient);
+
+ s.scn_density = gtk_entry_new ();
+ gtk_widget_show (s.scn_density);
+ gtk_table_attach (GTK_TABLE (table), s.scn_density, 2, 3, 2, 3,
+ (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0);
+ gtk_widget_set_usize (s.scn_density, 50, -2);
+
+ label = gtk_label_new ("General");
+ gtk_widget_show (label);
+ set_notebook_tab (notebook, 0, label);
+
+ label = gtk_label_new ("Details");
+ gtk_widget_show (label);
+ set_notebook_tab (notebook, 1, label);
+
+ label = gtk_label_new ("Drawing Aids");
+ gtk_widget_show (label);
+ set_notebook_tab (notebook, 2, label);
+
+ label = gtk_label_new ("Scene");
+ gtk_widget_show (label);
+ set_notebook_tab (notebook, 3, label);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, TRUE, 0);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (preferencesdlg_ok), &s);
+ gtk_widget_show (button);
+ gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_widget_set_usize (button, 80, 25);
+ GtkAccelGroup *accel_group = gtk_accel_group_new ();
+ gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Return, 0, GTK_ACCEL_VISIBLE);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_CANCEL));
+ gtk_widget_show (button);
+ gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_widget_set_usize (button, 80, 25);
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Escape, 0, GTK_ACCEL_VISIBLE);
+
+ button = gtk_button_new_with_label ("Make Default");
+ gtk_widget_show (button);
+ gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_widget_set_usize (button, -2, 25);
+ gtk_widget_set_sensitive (button, FALSE);
+
+ // Set initial values
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.det_edges),
+ (opts->nDetail & LC_DET_BRICKEDGES) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.det_dither),
+ (opts->nDetail & LC_DET_DITHER) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.det_lighting),
+ (opts->nDetail & LC_DET_LIGHTING) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.det_smooth),
+ (opts->nDetail & LC_DET_SMOOTH) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.det_antialias),
+ (opts->nDetail & LC_DET_ANTIALIAS) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.det_linear),
+ (opts->nDetail & LC_DET_LINEAR) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.det_screen),
+ (opts->nDetail & LC_DET_SCREENDOOR) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.det_fast),
+ (opts->nDetail & LC_DET_FAST) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.det_solid),
+ (opts->nDetail & LC_DET_BOX_FILL) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.det_hidden),
+ (opts->nDetail & LC_DET_HIDDEN_LINE) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.det_background),
+ (opts->nDetail & LC_DET_BACKGROUND) ? TRUE : FALSE);
+ write_float(s.det_width, opts->fLineWidth);
+
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_grid),
+ (opts->nSnap & LC_DRAW_GRID) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_axis),
+ (opts->nSnap & LC_DRAW_AXIS) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_preview),
+ (opts->nSnap & LC_DRAW_PREVIEW) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_snapx),
+ (opts->nSnap & LC_DRAW_SNAP_X) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_snapy),
+ (opts->nSnap & LC_DRAW_SNAP_Y) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_snapz),
+ (opts->nSnap & LC_DRAW_SNAP_Z) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_angle),
+ (opts->nSnap & LC_DRAW_SNAP_A) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_centimeter),
+ (opts->nSnap & LC_DRAW_CM_UNITS) ? TRUE : FALSE);
+ // gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_collision),
+ // (opts->nSnap & LC_DRAW_COLLISION) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_move),
+ (opts->nSnap & LC_DRAW_MOVE) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_fixed),
+ (opts->nSnap & LC_DRAW_MOVEAXIS) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_lockx),
+ (opts->nSnap & LC_DRAW_LOCK_X) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_locky),
+ (opts->nSnap & LC_DRAW_LOCK_Y) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.draw_lockz),
+ (opts->nSnap & LC_DRAW_LOCK_Z) ? TRUE : FALSE);
+ write_int(s.draw_gridunits, opts->nGridSize);
+ write_int(s.draw_anglesnap, opts->nAngleSnap);
+
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.scn_gradient),
+ (opts->nScene & LC_SCENE_GRADIENT) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.scn_image),
+ (opts->nScene & LC_SCENE_BG) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.scn_tile),
+ (opts->nScene & LC_SCENE_BG_TILE) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.scn_fog),
+ (opts->nScene & LC_SCENE_FOG) ? TRUE : FALSE);
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (s.scn_floor),
+ (opts->nScene & LC_SCENE_FLOOR) ? TRUE : FALSE);
+ gtk_entry_set_text (GTK_ENTRY (s.scn_imagename), opts->strBackground);
+ write_int(s.scn_density, (int)(opts->fDensity*100));
+
+ return dlg_domodal(dlg, LC_CANCEL);
+}
+
+// Properties Dialog
+
+typedef struct
+{
+ void* data;
+ GtkWidget *sum_author, *sum_description, *sum_comments;
+} LC_PROPERTIESDLG_STRUCT;
+
+static void propertiesdlg_ok(GtkWidget *widget, gpointer data)
+{
+ LC_PROPERTIESDLG_STRUCT* s = (LC_PROPERTIESDLG_STRUCT*)data;
+ LC_PROPERTIESDLG_OPTS* opts = (LC_PROPERTIESDLG_OPTS*)s->data;
+
+ strcpy(opts->strAuthor, gtk_entry_get_text (GTK_ENTRY (s->sum_author)));
+ strcpy(opts->strDescription, gtk_entry_get_text (GTK_ENTRY (s->sum_description)));
+ char* comments = gtk_editable_get_chars(GTK_EDITABLE(s->sum_comments), 0, -1);
+ strcpy(opts->strComments, comments);
+ g_free(comments);
+
+ *cur_ret = LC_OK;
+}
+
+int propertiesdlg_execute(void* param)
+{
+ GtkWidget *dlg;
+ GtkWidget *vbox1, *vbox2, *hbox;
+ GtkWidget *label, *button, *table, *notebook, *list, *scroll_win;
+ LC_PROPERTIESDLG_STRUCT s;
+ LC_PROPERTIESDLG_OPTS* opts = (LC_PROPERTIESDLG_OPTS*)param;
+ s.data = param;
+
+ struct stat buf;
+ bool exist = (stat(opts->strFilename, &buf) != -1);
+ char* ptr = strrchr(opts->strFilename, '/');
+ char text[512];
+ strcpy(text, opts->strTitle);
+ strcat(text, " Properties");
+
+ dlg = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "delete_event",
+ GTK_SIGNAL_FUNC (delete_callback), NULL);
+ gtk_signal_connect (GTK_OBJECT (dlg), "destroy",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), NULL);
+ gtk_widget_set_usize (dlg, 450, 280);
+ gtk_window_set_title (GTK_WINDOW (dlg), text);
+ gtk_window_set_policy (GTK_WINDOW (dlg), FALSE, FALSE, FALSE);
+ gtk_widget_realize (dlg);
+
+ vbox1 = gtk_vbox_new (FALSE, 7);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (dlg), vbox1);
+ gtk_container_border_width (GTK_CONTAINER (vbox1), 7);
+
+ notebook = gtk_notebook_new ();
+ gtk_widget_show (notebook);
+ gtk_box_pack_start (GTK_BOX (vbox1), notebook, TRUE, TRUE, 0);
+
+ table = gtk_table_new (6, 2, FALSE);
+ gtk_widget_show (table);
+ gtk_container_add (GTK_CONTAINER (notebook), table);
+ gtk_container_border_width (GTK_CONTAINER (table), 15);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 40);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 0, 1,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ label = gtk_label_new (ptr ? ptr+1 : "(not saved)");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ if (ptr)
+ {
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 1, 2,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+ *ptr = 0;
+ label = gtk_label_new (opts->strFilename);
+ *ptr = '/';
+
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+ }
+
+ if (exist)
+ {
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 2, 3,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ sprintf(text, "%.1fKB (%d bytes)", (float)buf.st_size/1024, buf.st_size);
+ label = gtk_label_new (text);
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 3, 4,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ struct passwd *pwd = getpwuid(buf.st_uid);
+ sprintf(text, "%s (%s)", pwd->pw_name, pwd->pw_gecos);
+
+ label = gtk_label_new (text);
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 4, 5,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ strcpy(text, ctime(&buf.st_mtime));
+ while (text[strlen(text)-1] < '0')
+ text[strlen(text)-1] = 0;
+ label = gtk_label_new (text);
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 1, 2, 5, 6,
+ (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ strcpy(text, ctime(&buf.st_atime));
+ while (text[strlen(text)-1] < '0')
+ text[strlen(text)-1] = 0;
+ label = gtk_label_new (text);
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+ }
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 0, 1, 0, 1,
+ (GtkAttachOptions)GTK_FILL, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ label = gtk_label_new ("File name:");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 0, 1, 1, 2,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ label = gtk_label_new ("Location:");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 0, 1, 2, 3,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ label = gtk_label_new ("Size:");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 0, 1, 3, 4,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ label = gtk_label_new ("Owner:");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 0, 1, 4, 5,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ label = gtk_label_new ("Modified:");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_table_attach (GTK_TABLE (table), hbox, 0, 1, 5, 6,
+ (GtkAttachOptions) GTK_FILL, (GtkAttachOptions)(GTK_EXPAND|GTK_FILL), 0, 0);
+
+ label = gtk_label_new ("Accessed:");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ vbox2 = gtk_vbox_new (FALSE, 3);
+ gtk_widget_show (vbox2);
+ gtk_container_add (GTK_CONTAINER (notebook), vbox2);
+ gtk_container_border_width (GTK_CONTAINER (vbox2), 5);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, TRUE, 0);
+
+ label = gtk_label_new ("Author");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ s.sum_author = gtk_entry_new ();
+ gtk_widget_show (s.sum_author);
+ gtk_box_pack_start (GTK_BOX (vbox2), s.sum_author, FALSE, FALSE, 0);
+ gtk_entry_set_text (GTK_ENTRY (s.sum_author), opts->strAuthor);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
+
+ label = gtk_label_new ("Description");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ s.sum_description = gtk_entry_new ();
+ gtk_widget_show (s.sum_description);
+ gtk_box_pack_start (GTK_BOX (vbox2), s.sum_description, FALSE, FALSE, 0);
+ gtk_entry_set_text (GTK_ENTRY (s.sum_description), opts->strDescription);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox2), hbox, FALSE, FALSE, 0);
+
+ label = gtk_label_new ("Comments");
+ gtk_widget_show (label);
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ gtk_label_set_justify (GTK_LABEL (label), GTK_JUSTIFY_LEFT);
+
+ s.sum_comments = gtk_text_new (NULL, NULL);
+ gtk_widget_show (s.sum_comments);
+ gtk_box_pack_start (GTK_BOX (vbox2), s.sum_comments, TRUE, TRUE, 0);
+ gtk_text_set_editable (GTK_TEXT (s.sum_comments), TRUE);
+ gtk_widget_realize (s.sum_comments);
+ gtk_text_insert (GTK_TEXT (s.sum_comments), NULL, NULL, NULL,
+ opts->strComments, strlen(opts->strComments));
+
+ int i, j, col[LC_MAXCOLORS], totalcount[LC_MAXCOLORS];
+ memset (&totalcount, 0, sizeof (totalcount));
+ for (i = 0; i < opts->lines; i++)
+ for (j = 0; j < LC_MAXCOLORS; j++)
+ totalcount[j] += opts->count[i*LC_MAXCOLORS+j];
+
+ int ID = 2;
+ for (i = 0; i < LC_MAXCOLORS; i++)
+ if (totalcount[i])
+ ID++;
+
+ scroll_win = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scroll_win),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_widget_show (scroll_win);
+ gtk_container_add (GTK_CONTAINER (notebook), scroll_win);
+
+ list = gtk_clist_new (ID);
+ gtk_widget_show (list);
+ gtk_container_add (GTK_CONTAINER (scroll_win), list);
+ gtk_container_border_width (GTK_CONTAINER (list), 5);
+ gtk_clist_set_column_width (GTK_CLIST (list), 0, 80);
+ gtk_clist_column_titles_show (GTK_CLIST (list));
+
+ label = gtk_label_new ("Piece");
+ gtk_widget_show (label);
+ gtk_clist_set_column_widget (GTK_CLIST (list), 0, label);
+
+ for (ID = 0, i = 0; i < LC_MAXCOLORS; i++)
+ if (totalcount[i])
+ {
+ ID++;
+ col[i] = ID;
+
+ label = gtk_label_new (colornames[i]);
+ gtk_widget_show (label);
+ gtk_clist_set_column_widget (GTK_CLIST (list), ID, label);
+ }
+ ID++;
+ label = gtk_label_new ("Total");
+ gtk_widget_show (label);
+ gtk_clist_set_column_widget (GTK_CLIST (list), ID, label);
+
+ char* row[LC_MAXCOLORS+2];
+ for (i = 1; i <= ID; i++)
+ row[i] = (char*)malloc(65);
+
+ for (i = 0; i < opts->lines; i++)
+ {
+ int total = 0;
+
+ for (j = 0; j < LC_MAXCOLORS; j++)
+ total += opts->count[i*LC_MAXCOLORS+j];
+
+ if (total == 0)
+ continue;
+
+ row[0] = opts->names[i];
+ for (j = 1; j < ID; j++)
+ row[j][0] = 0;
+
+ for (j = 0; j < LC_MAXCOLORS; j++)
+ if (opts->count[i*LC_MAXCOLORS+j])
+ sprintf (row[col[j]], "%d", opts->count[i*LC_MAXCOLORS+j]);
+
+ sprintf (row[ID], "%d", total);
+ gtk_clist_append (GTK_CLIST(list), row);
+ }
+ gtk_clist_sort (GTK_CLIST(list));
+
+ row[0] = "Total";
+ int total = 0;
+
+ for (i = 0; i < LC_MAXCOLORS; i++)
+ if (totalcount[i])
+ {
+ sprintf (row[col[i]], "%d", totalcount[i]);
+ total += totalcount[i];
+ }
+
+ sprintf (row[ID], "%d", total);
+ gtk_clist_append (GTK_CLIST(list), row);
+
+ for (i = 1; i <= ID; i++)
+ free(row[i]);
+
+ label = gtk_label_new ("General");
+ gtk_widget_show (label);
+ set_notebook_tab (notebook, 0, label);
+
+ label = gtk_label_new ("Summary");
+ gtk_widget_show (label);
+ set_notebook_tab (notebook, 1, label);
+
+ label = gtk_label_new ("Pieces Used");
+ gtk_widget_show (label);
+ set_notebook_tab (notebook, 2, label);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+ gtk_widget_show (hbox);
+ gtk_box_pack_start (GTK_BOX (vbox1), hbox, FALSE, FALSE, 5);
+
+ button = gtk_button_new_with_label ("Cancel");
+ gtk_widget_show (button);
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (default_callback), GINT_TO_POINTER (LC_CANCEL));
+ gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 5);
+ gtk_widget_set_usize (button, 70, 25);
+ GtkAccelGroup *accel_group = gtk_accel_group_new ();
+ gtk_window_add_accel_group (GTK_WINDOW (dlg), accel_group);
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Escape, 0, GTK_ACCEL_VISIBLE);
+
+ button = gtk_button_new_with_label ("OK");
+ gtk_signal_connect (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (propertiesdlg_ok), &s);
+ gtk_widget_show (button);
+ gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_widget_set_usize (button, 70, 25);
+ gtk_widget_add_accelerator (button, "clicked", accel_group,
+ GDK_Return, 0, GTK_ACCEL_VISIBLE);
+
+ return dlg_domodal(dlg, LC_CANCEL);
+}
+
+
+
diff --git a/linux/dialogs.h b/linux/dialogs.h
new file mode 100644
index 0000000..7151fcc
--- /dev/null
+++ b/linux/dialogs.h
@@ -0,0 +1,20 @@
+#ifndef _DIALOGS_H_
+#define _DIALOGS_H_
+
+int msgbox_execute(char* text, int mode);
+int filedlg_execute(char* caption, char* filename);
+int arraydlg_execute(void* param);
+int aboutdlg_execute(void* param);
+int htmldlg_execute(void* param);
+int imageoptsdlg_execute(void* param, bool from_htmldlg);
+int povraydlg_execute(void* param);
+int preferencesdlg_execute(void* param);
+int propertiesdlg_execute(void* param);
+
+#endif // _DIALOGS_H_
+
+
+
+
+
+
diff --git a/linux/gdkgl.c b/linux/gdkgl.c
new file mode 100644
index 0000000..3d326a5
--- /dev/null
+++ b/linux/gdkgl.c
@@ -0,0 +1,301 @@
+/*
+ * Copyright (C) 1998 Janne Lof <jlof@mail.student.oulu.fi>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#include "gdkgl.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#include <gdk/gdkx.h>
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#include <GL/gl.h>
+#include <GL/glx.h>
+#include <string.h>
+
+
+static XVisualInfo *get_xvisualinfo(GdkVisual *visual)
+{
+ Display *dpy;
+ XVisualInfo vinfo_template;
+ XVisualInfo *vi;
+ int nitems_return;
+
+ dpy = GDK_DISPLAY();
+
+ /* TODO: is this right way to get VisualInfo from Visual ?? */
+ /* AFAIK VisualID and depth should be enough to uniquely identify visual */
+ vinfo_template.visual = GDK_VISUAL_XVISUAL(visual);
+ vinfo_template.visualid = XVisualIDFromVisual(vinfo_template.visual);
+ vinfo_template.depth = visual->depth;
+ vi = XGetVisualInfo(dpy, VisualIDMask|VisualDepthMask, &vinfo_template, &nitems_return);
+
+ g_assert( vi!=0 && nitems_return==1 ); /* visualinfo needs to be unique */
+
+ /* remember to XFree returned XVisualInfo !!! */
+ return vi;
+}
+
+
+struct _GdkGLContextPrivate {
+ Display *xdisplay;
+ GLXContext glxcontext;
+ guint ref_count;
+};
+
+typedef struct _GdkGLContextPrivate GdkGLContextPrivate;
+
+
+gint gdk_gl_query(void)
+{
+ return (glXQueryExtension(GDK_DISPLAY(),NULL,NULL) == True) ? TRUE : FALSE;
+}
+
+GdkVisual *gdk_gl_choose_visual(int *attrList)
+{
+ Display *dpy;
+ XVisualInfo *vi;
+ GdkVisual *visual;
+
+ g_return_val_if_fail(attrList != NULL, NULL);
+
+ dpy = GDK_DISPLAY();
+ /* TODO: translate GDK_GL_ to GLX_ */
+ if ((vi = glXChooseVisual(dpy,DefaultScreen(dpy), attrList)) == NULL) {
+ return NULL;
+ }
+ visual = gdkx_visual_get(vi->visualid);
+ XFree(vi);
+ return visual;
+}
+
+
+int gdk_gl_get_config(GdkVisual *visual, int attrib)
+{
+ Display *dpy;
+ XVisualInfo *vi;
+ int value;
+
+ g_return_val_if_fail(visual != NULL, -1);
+
+ dpy = GDK_DISPLAY();
+
+ vi = get_xvisualinfo(visual);
+
+ /* TODO: translate GDK_GL_ to GLX_ */
+ if (glXGetConfig(dpy, vi, attrib, &value) == 0) {
+ XFree(vi);
+ return value;
+ }
+ XFree(vi);
+ return -1;
+}
+
+
+GdkGLContext *gdk_gl_context_new(GdkVisual *visual)
+{
+ return gdk_gl_context_share_new(visual, NULL, FALSE);
+}
+
+GdkGLContext *gdk_gl_context_share_new(GdkVisual *visual, GdkGLContext *sharelist, gint direct)
+{
+ Display *dpy;
+ XVisualInfo *vi;
+ GLXContext glxcontext;
+ GdkGLContextPrivate *contextprivate;
+
+ g_return_val_if_fail(visual != NULL, NULL);
+
+ dpy = GDK_DISPLAY();
+
+ vi = get_xvisualinfo(visual);
+
+ if (sharelist) {
+ glxcontext = glXCreateContext(dpy, vi, ((GdkGLContextPrivate*)sharelist)->glxcontext, direct ? True : False);
+ } else {
+ glxcontext = glXCreateContext(dpy, vi, 0, direct ? True : False);
+ }
+ XFree(vi);
+ if (glxcontext == NULL) {
+ return NULL;
+ }
+
+ contextprivate = g_new(GdkGLContextPrivate, 1);
+ contextprivate->xdisplay = dpy;
+ contextprivate->glxcontext = glxcontext;
+ contextprivate->ref_count = 1;
+
+ return (GdkGLContext*)contextprivate;
+}
+
+GdkGLContext *gdk_gl_context_ref(GdkGLContext *context)
+{
+ GdkGLContextPrivate *contextprivate = (GdkGLContextPrivate*)context;
+
+ g_return_val_if_fail(context != NULL, NULL);
+ contextprivate->ref_count += 1;
+
+ return context;
+}
+
+void gdk_gl_context_unref(GdkGLContext *context)
+{
+ GdkGLContextPrivate *contextprivate = (GdkGLContextPrivate*)context;
+
+ g_return_if_fail(context != NULL);
+
+ if (contextprivate->ref_count > 1) {
+ contextprivate->ref_count -= 1;
+ } else {
+ if (contextprivate->glxcontext == glXGetCurrentContext())
+ glXMakeCurrent(contextprivate->xdisplay, None, NULL);
+ glXDestroyContext(contextprivate->xdisplay, contextprivate->glxcontext);
+ memset(context, 0, sizeof(GdkGLContextPrivate));
+ g_free(context);
+ }
+}
+
+gint gdk_gl_make_current(GdkDrawable *drawable, GdkGLContext *context)
+{
+ GdkGLContextPrivate *contextprivate = (GdkGLContextPrivate*)context;
+
+ g_return_val_if_fail(drawable != NULL, FALSE);
+ g_return_val_if_fail(context != NULL, FALSE);
+
+ return (glXMakeCurrent(contextprivate->xdisplay, GDK_WINDOW_XWINDOW(drawable), contextprivate->glxcontext) == True) ? TRUE : FALSE;
+}
+
+void gdk_gl_swap_buffers(GdkDrawable *drawable)
+{
+ g_return_if_fail(drawable != NULL);
+
+ glXSwapBuffers(GDK_WINDOW_XDISPLAY(drawable), GDK_WINDOW_XWINDOW(drawable));
+}
+
+void gdk_gl_wait_gdk(void)
+{
+ glXWaitX();
+}
+
+void gdk_gl_wait_gl (void)
+{
+ glXWaitGL();
+}
+
+
+/* glpixmap stuff */
+
+struct _GdkGLPixmapPrivate {
+ Display *xdisplay;
+ GLXPixmap glxpixmap;
+ GdkPixmap *front_left;
+ guint ref_count;
+};
+
+typedef struct _GdkGLPixmapPrivate GdkGLPixmapPrivate;
+
+
+GdkGLPixmap *gdk_gl_pixmap_new(GdkVisual *visual, GdkPixmap *pixmap)
+{
+ Display *dpy;
+ XVisualInfo *vi;
+ Pixmap xpixmap;
+ GdkGLPixmapPrivate *contextprivate;
+ GLXPixmap glxpixmap;
+ gint depth;
+
+ g_return_val_if_fail(pixmap != NULL, NULL);
+ g_return_val_if_fail(visual != NULL, NULL);
+ g_return_val_if_fail(gdk_window_get_type(pixmap) == GDK_WINDOW_PIXMAP, NULL);
+
+ gdk_window_get_geometry(pixmap, 0,0,0,0, &depth);
+ g_return_val_if_fail(gdk_gl_get_config(visual, GDK_GL_BUFFER_SIZE) == depth, NULL);
+
+ dpy = GDK_DISPLAY();
+
+ vi = get_xvisualinfo(visual);
+ xpixmap = ((GdkPixmapPrivate*)pixmap)->xwindow;
+ glxpixmap = glXCreateGLXPixmap(dpy, vi, xpixmap);
+ XFree(vi);
+
+ g_return_val_if_fail(glxpixmap != None, NULL);
+
+ contextprivate = g_new(GdkGLPixmapPrivate, 1);
+ contextprivate->xdisplay = dpy;
+ contextprivate->glxpixmap = glxpixmap;
+ contextprivate->front_left = gdk_pixmap_ref(pixmap);
+ contextprivate->ref_count = 1;
+
+ return (GdkGLPixmap*)contextprivate;
+}
+
+
+GdkGLPixmap *gdk_gl_pixmap_ref(GdkGLPixmap *glpixmap)
+{
+ GdkGLPixmapPrivate *contextprivate = (GdkGLPixmapPrivate*)glpixmap;
+
+ g_return_val_if_fail(glpixmap != NULL, NULL);
+ contextprivate->ref_count += 1;
+
+ return glpixmap;
+}
+
+void gdk_gl_pixmap_unref(GdkGLPixmap *glpixmap)
+{
+ GdkGLPixmapPrivate *contextprivate = (GdkGLPixmapPrivate*)glpixmap;
+
+ g_return_if_fail(glpixmap != NULL);
+
+ if (contextprivate->ref_count > 1) {
+ contextprivate->ref_count -= 1;
+ } else {
+ glXDestroyGLXPixmap(contextprivate->xdisplay, contextprivate->glxpixmap);
+ glXWaitGL();
+ gdk_pixmap_unref(contextprivate->front_left);
+ glXWaitX();
+ memset(glpixmap, 0, sizeof(GdkGLPixmapPrivate));
+ g_free(glpixmap);
+ }
+}
+
+gint gdk_gl_pixmap_make_current(GdkGLPixmap *glpixmap, GdkGLContext *context)
+{
+ Display *dpy;
+ GLXPixmap glxpixmap;
+ GLXContext glxcontext;
+
+ g_return_val_if_fail(glpixmap != NULL, FALSE);
+ g_return_val_if_fail(context != NULL, FALSE);
+
+ dpy = ((GdkGLContextPrivate*)context)->xdisplay;
+ glxpixmap = ((GdkGLPixmapPrivate*)glpixmap)->glxpixmap;
+ glxcontext = ((GdkGLContextPrivate*)context)->glxcontext;
+
+ return (glXMakeCurrent(dpy, glxpixmap, glxcontext) == True) ? TRUE : FALSE;
+}
+
+/* fonts */
+void gdk_gl_use_gdk_font(GdkFont *font, int first, int count, int list_base)
+{
+ g_return_if_fail(font != NULL);
+ glXUseXFont(gdk_font_id(font), first, count, list_base);
+}
+
diff --git a/linux/gdkgl.h b/linux/gdkgl.h
new file mode 100644
index 0000000..f3876e1
--- /dev/null
+++ b/linux/gdkgl.h
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 1998 Janne Löf <jlof@mail.student.oulu.fi>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __GDK_GL_H__
+#define __GDK_GL_H__
+
+#include <gdk/gdk.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * These definitions are duplicated from GL/glx.h that comes with Mesa.
+ * I don't want every program to include GL/glx.h, that might become
+ * problem if GtkGLArea is ever ported to non X environments like
+ * (horror!) Windows.
+ */
+enum _GDK_GL_CONFIGS {
+ GDK_GL_NONE = 0,
+ GDK_GL_USE_GL = 1,
+ GDK_GL_BUFFER_SIZE = 2,
+ GDK_GL_LEVEL = 3,
+ GDK_GL_RGBA = 4,
+ GDK_GL_DOUBLEBUFFER = 5,
+ GDK_GL_STEREO = 6,
+ GDK_GL_AUX_BUFFERS = 7,
+ GDK_GL_RED_SIZE = 8,
+ GDK_GL_GREEN_SIZE = 9,
+ GDK_GL_BLUE_SIZE = 10,
+ GDK_GL_ALPHA_SIZE = 11,
+ GDK_GL_DEPTH_SIZE = 12,
+ GDK_GL_STENCIL_SIZE = 13,
+ GDK_GL_ACCUM_RED_SIZE = 14,
+ GDK_GL_ACCUM_GREEN_SIZE = 15,
+ GDK_GL_ACCUM_BLUE_SIZE = 16,
+ GDK_GL_ACCUM_ALPHA_SIZE = 17,
+
+ /* GLX_EXT_visual_info extension */
+ GDK_GL_X_VISUAL_TYPE_EXT = 0x22,
+ GDK_GL_TRANSPARENT_TYPE_EXT = 0x23,
+ GDK_GL_TRANSPARENT_INDEX_VALUE_EXT = 0x24,
+ GDK_GL_TRANSPARENT_RED_VALUE_EXT = 0x25,
+ GDK_GL_TRANSPARENT_GREEN_VALUE_EXT = 0x26,
+ GDK_GL_TRANSPARENT_BLUE_VALUE_EXT = 0x27,
+ GDK_GL_TRANSPARENT_ALPHA_VALUE_EXT = 0x28
+};
+
+
+typedef struct _GdkGLContext GdkGLContext;
+
+
+gint gdk_gl_query(void);
+
+GdkVisual *gdk_gl_choose_visual(int *attrList);
+int gdk_gl_get_config(GdkVisual *visual, int attrib);
+
+GdkGLContext *gdk_gl_context_new(GdkVisual *visual);
+GdkGLContext *gdk_gl_context_share_new(GdkVisual *visual, GdkGLContext *sharelist, gint direct);
+
+GdkGLContext *gdk_gl_context_ref(GdkGLContext *context);
+void gdk_gl_context_unref(GdkGLContext *context);
+
+gint gdk_gl_make_current(GdkDrawable *drawable, GdkGLContext *context);
+void gdk_gl_swap_buffers(GdkDrawable *drawable);
+
+
+void gdk_gl_wait_gdk(void);
+void gdk_gl_wait_gl(void);
+
+
+/* glpixmap stuff */
+
+typedef struct _GdkGLPixmap GdkGLPixmap;
+
+GdkGLPixmap *gdk_gl_pixmap_new(GdkVisual *visual, GdkPixmap *pixmap);
+GdkGLPixmap *gdk_gl_pixmap_ref(GdkGLPixmap *glpixmap);
+void gdk_gl_pixmap_unref(GdkGLPixmap *glpixmap);
+
+gint gdk_gl_pixmap_make_current(GdkGLPixmap *glpixmap, GdkGLContext *context);
+
+
+/* fonts */
+void gdk_gl_use_gdk_font(GdkFont *font, int first, int count, int list_base);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __GDK_GL_H__ */
+
diff --git a/linux/gtkglarea.c b/linux/gtkglarea.c
new file mode 100644
index 0000000..2a885af
--- /dev/null
+++ b/linux/gtkglarea.c
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 1997-1998 Janne Lof <jlof@mail.student.oulu.fi>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "gdkgl.h"
+#include "gtkglarea.h"
+#include <GL/gl.h>
+#include <stdarg.h>
+
+static void gtk_gl_area_class_init (GtkGLAreaClass *klass);
+static void gtk_gl_area_init (GtkGLArea *glarea);
+static void gtk_gl_area_destroy (GtkObject *object); /* change to finalize? */
+
+static GtkDrawingAreaClass *parent_class = (GtkDrawingAreaClass*)NULL;
+
+
+GtkType gtk_gl_area_get_type ()
+{
+ static GtkType gl_area_type = 0;
+
+ if (!gl_area_type)
+ {
+ GtkTypeInfo gl_area_info =
+ {
+ (gchar*)"GtkGLArea",
+ sizeof (GtkGLArea),
+ sizeof (GtkGLAreaClass),
+ (GtkClassInitFunc) gtk_gl_area_class_init,
+ (GtkObjectInitFunc) gtk_gl_area_init,
+ /* reserved_1 */ NULL,
+ /* reserved_2 */ NULL,
+ (GtkClassInitFunc) NULL
+ };
+ gl_area_type = gtk_type_unique (gtk_drawing_area_get_type (), &gl_area_info);
+ }
+ return gl_area_type;
+}
+
+static void gtk_gl_area_class_init (GtkGLAreaClass *klass)
+{
+ GtkObjectClass *object_class;
+
+ parent_class = (GtkDrawingAreaClass*)gtk_type_class(gtk_drawing_area_get_type());
+ object_class = (GtkObjectClass*) klass;
+
+ object_class->destroy = gtk_gl_area_destroy;
+}
+
+
+static void gtk_gl_area_init (GtkGLArea *gl_area)
+{
+ gl_area->glcontext = (GdkGLContext*)NULL;
+}
+
+
+
+GtkWidget* gtk_gl_area_new_vargs(GtkGLArea *share, ...)
+{
+ GtkWidget *glarea;
+ va_list ap;
+ int i;
+ gint *attrList;
+
+ va_start(ap, share);
+ i=1;
+ while (va_arg(ap, int) != GDK_GL_NONE) /* get number of arguments */
+ i++;
+ va_end(ap);
+
+ attrList = g_new(int,i);
+
+ va_start(ap,share);
+ i=0;
+ while ( (attrList[i] = va_arg(ap, int)) != GDK_GL_NONE) /* copy args to list */
+ i++;
+ va_end(ap);
+
+ glarea = gtk_gl_area_share_new(attrList, share);
+
+ g_free(attrList);
+
+ return glarea;
+}
+
+GtkWidget* gtk_gl_area_new (int *attrList)
+{
+ return gtk_gl_area_share_new(attrList, (GtkGLArea*)NULL);
+}
+
+GtkWidget* gtk_gl_area_share_new (int *attrList, GtkGLArea *share)
+{
+ GdkVisual *visual;
+ GdkGLContext *glcontext;
+ GtkGLArea *gl_area;
+
+ g_return_val_if_fail(share == NULL || GTK_IS_GL_AREA(share), (GtkWidget*)NULL);
+
+ visual = gdk_gl_choose_visual(attrList);
+ if (visual == NULL)
+ return (GtkWidget*)NULL;
+
+ glcontext = gdk_gl_context_share_new(visual, share ? share->glcontext : (GdkGLContext*)NULL , TRUE);
+ if (glcontext == NULL)
+ return (GtkWidget*)NULL;
+
+ /* use colormap and visual suitable for OpenGL rendering */
+ gtk_widget_push_colormap(gdk_colormap_new(visual,TRUE));
+ gtk_widget_push_visual(visual);
+
+ gl_area = (GtkGLArea*)gtk_type_new (gtk_gl_area_get_type());
+ gl_area->glcontext = glcontext;
+
+ /* pop back defaults */
+ gtk_widget_pop_visual();
+ gtk_widget_pop_colormap();
+
+ return GTK_WIDGET(gl_area);
+}
+
+static void
+gtk_gl_area_destroy(GtkObject *object)
+{
+ GtkGLArea *gl_area;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GTK_IS_GL_AREA(object));
+
+ gl_area = GTK_GL_AREA(object);
+ gdk_gl_context_unref(gl_area->glcontext);
+
+ if (GTK_OBJECT_CLASS (parent_class)->destroy)
+ (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+
+
+
+
+
+gint gtk_gl_area_make_current(GtkGLArea *gl_area)
+{
+ g_return_val_if_fail(gl_area != NULL, FALSE);
+ g_return_val_if_fail(GTK_IS_GL_AREA (gl_area), FALSE);
+ g_return_val_if_fail(GTK_WIDGET_REALIZED(gl_area), FALSE);
+
+ return gdk_gl_make_current(GTK_WIDGET(gl_area)->window, gl_area->glcontext);
+}
+
+void gtk_gl_area_swapbuffers(GtkGLArea *gl_area)
+{
+ g_return_if_fail(gl_area != NULL);
+ g_return_if_fail(GTK_IS_GL_AREA(gl_area));
+ g_return_if_fail(GTK_WIDGET_REALIZED(gl_area));
+
+ gdk_gl_swap_buffers(GTK_WIDGET(gl_area)->window);
+}
+
+void gtk_gl_area_size (GtkGLArea *glarea, gint width, gint height)
+{
+ g_return_if_fail (glarea != NULL);
+ g_return_if_fail (GTK_IS_GL_AREA (glarea));
+
+ gtk_drawing_area_size(GTK_DRAWING_AREA(glarea), width, height);
+}
diff --git a/linux/gtkglarea.h b/linux/gtkglarea.h
new file mode 100644
index 0000000..47eee22
--- /dev/null
+++ b/linux/gtkglarea.h
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 1997-1998 Janne Lof <jlof@mail.student.oulu.fi>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+#ifndef __GTK_GL_AREA_H__
+#define __GTK_GL_AREA_H__
+
+#include <gdk/gdk.h>
+#include <gdkgl.h>
+#include <gtk/gtkdrawingarea.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+#define GTK_TYPE_GL_AREA (gtk_gl_area_get_type())
+#define GTK_GL_AREA(obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_GL_AREA, GtkGLArea))
+#define GTK_GL_AREA_CLASS(klass) (GTK_CHECK_CLASS_CAST (klass, GTK_TYPE_GL_AREA, GtkGLAreaClass))
+#define GTK_IS_GL_AREA(obj) (GTK_CHECK_TYPE ((obj), GTK_TYPE_GL_AREA))
+#define GTK_IS_GL_AREA_CLASS (GTK_CHECK_CLASS_TYPE ((klass), GTK_TYPE_GL_AREA))
+
+typedef struct _GtkGLArea GtkGLArea;
+typedef struct _GtkGLAreaClass GtkGLAreaClass;
+
+
+struct _GtkGLArea
+{
+ GtkDrawingArea darea;
+ GdkGLContext *glcontext;
+};
+
+struct _GtkGLAreaClass
+{
+ GtkDrawingAreaClass parent_class;
+};
+
+GtkType gtk_gl_area_get_type (void);
+GtkWidget* gtk_gl_area_new (int *attrList);
+GtkWidget* gtk_gl_area_share_new (int *attrList,
+ GtkGLArea *share);
+GtkWidget* gtk_gl_area_new_vargs (GtkGLArea *share,
+ ...);
+
+
+gint gtk_gl_area_make_current(GtkGLArea *glarea);
+
+void gtk_gl_area_swapbuffers(GtkGLArea *glarea);
+
+void gtk_gl_area_size (GtkGLArea *glarea, /* deprecated, use gtk_drawing_area_size() */
+ gint width,
+ gint height);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+
+#endif /* __GTK_GL_AREA_H__ */
diff --git a/linux/gtktools.cpp b/linux/gtktools.cpp
new file mode 100644
index 0000000..d7f27f3
--- /dev/null
+++ b/linux/gtktools.cpp
@@ -0,0 +1,79 @@
+// Helper functions for GTK
+//
+
+#include <gtk/gtk.h>
+#include "gtktools.h"
+
+GtkWidget* new_pixmap (GtkWidget *widget, char **data)
+{
+ GdkPixmap *gdkpixmap;
+ GdkBitmap *mask;
+ GtkWidget *pixmap;
+
+ gdkpixmap = gdk_pixmap_create_from_xpm_d (widget->window, &mask,
+ &widget->style->bg[GTK_STATE_NORMAL], data);
+ pixmap = gtk_pixmap_new (gdkpixmap, mask);
+
+ gdk_pixmap_unref (gdkpixmap);
+ gdk_pixmap_unref (mask);
+
+ return pixmap;
+}
+
+GtkWidget* clist_title_with_arrow (GtkWidget* clist, char col, char* label_text)
+{
+ GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
+ GtkWidget *arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_IN);
+ GtkWidget *label = gtk_label_new (label_text);
+
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
+ gtk_box_pack_end (GTK_BOX (hbox), arrow, FALSE, TRUE, 0);
+ gtk_widget_show (label);
+
+ gtk_widget_show (hbox);
+ gtk_clist_set_column_widget (GTK_CLIST (clist), col, hbox);
+ return arrow;
+}
+
+void set_notebook_tab (GtkWidget *notebook, gint page_num, GtkWidget *widget)
+{
+ GtkNotebookPage *page;
+ GtkWidget *notebook_page;
+
+ page = (GtkNotebookPage*) g_list_nth (GTK_NOTEBOOK (notebook)->children, page_num)->data;
+ notebook_page = page->child;
+ gtk_widget_ref (notebook_page);
+ gtk_notebook_remove_page (GTK_NOTEBOOK (notebook), page_num);
+ gtk_notebook_insert_page (GTK_NOTEBOOK (notebook), notebook_page,
+ widget, page_num);
+ gtk_widget_unref (notebook_page);
+}
+
+void set_button_pixmap (GtkWidget* widget, float* color)
+{
+ if (widget->window == NULL)
+ return;
+
+ GdkColor c;
+ GdkGC* gc = gdk_gc_new(widget->window);
+ GdkPixmap* pixmap = gdk_pixmap_new(widget->window, widget->allocation.width - 20,
+ widget->allocation.height - 20, -1);
+
+ c.red = (gushort)(color[0]*0xFFFF);
+ c.green = (gushort)(color[1]*0xFFFF);
+ c.blue = (gushort)(color[2]*0xFFFF);
+ gdk_color_alloc (gtk_widget_get_colormap(widget), &c);
+ gdk_gc_set_foreground(gc, &c);
+
+ gdk_draw_rectangle (pixmap, gc, TRUE, 0, 0,
+ widget->allocation.width - 20, widget->allocation.height - 20);
+
+ GtkWidget* pixmapwid = gtk_pixmap_new (pixmap, (GdkBitmap*)NULL);
+ gtk_widget_show (pixmapwid);
+
+ gtk_container_remove (GTK_CONTAINER(widget), GTK_BIN(widget)->child);
+ gtk_container_add (GTK_CONTAINER(widget), pixmapwid);
+ gdk_gc_destroy(gc);
+}
+
+
diff --git a/linux/gtktools.h b/linux/gtktools.h
new file mode 100644
index 0000000..dd09b91
--- /dev/null
+++ b/linux/gtktools.h
@@ -0,0 +1,11 @@
+
+#ifndef _GTKTOOLS_H_
+#define _GTKTOOLS_H_
+
+GtkWidget* new_pixmap (GtkWidget *widget, char **data);
+GtkWidget* clist_title_with_arrow (GtkWidget* clist, char col, char* label_text);
+void set_notebook_tab (GtkWidget *notebook, gint page_num, GtkWidget *widget);
+void set_button_pixmap (GtkWidget* widget, float* color);
+
+#endif // _GTKTOOLS_H_
+
diff --git a/linux/lc b/linux/lc
new file mode 100644
index 0000000..4caa15c
--- /dev/null
+++ b/linux/lc
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# set the LeoCAD library path
+LEOCAD_LIB=/mnt/f/projects/leocad/windows/debug/
+export LEOCAD_LIB
+
+# run the program
+./leocad
+
+
+
+
+
+
+
+
+
diff --git a/linux/main.cpp b/linux/main.cpp
new file mode 100644
index 0000000..9c97e5e
--- /dev/null
+++ b/linux/main.cpp
@@ -0,0 +1,346 @@
+// LeoCAD
+//
+// Linux specific initialization
+//
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include <GL/glx.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "gtkglarea.h"
+#include "menu.h"
+#include "custom.h"
+#include "project.h"
+#include "toolbar.h"
+#include "globals.h"
+#include "main.h"
+
+// Variables
+
+GtkWidget *main_window;
+GtkWidget *drawing_area;
+
+static char default_path[] = "/usr/share/LeoCAD/";
+bool ignore_commands = false;
+
+// Functions
+
+void OnCommandDirect(GtkWidget *w, gpointer data)
+{
+ project->HandleCommand((LC_COMMANDS)(int)data, 0);
+}
+
+void OnCommand(GtkWidget* widget, gpointer data)
+{
+ int id = (int)data;
+
+ if (ignore_commands)
+ return;
+
+ if (id >= ID_FILE_RECENT1 && id <= ID_FILE_RECENT4)
+ {
+ project->HandleCommand(LC_FILE_RECENT, id - ID_FILE_RECENT1);
+ return;
+ }
+
+ if (id >= ID_ACTION_SELECT && id <= ID_ACTION_ROLL)
+ {
+ project->SetAction(id - ID_ACTION_SELECT);
+ return;
+ }
+
+ if (id >= ID_VIEW_VIEWPORTS_01 && id <= ID_VIEW_VIEWPORTS_14)
+ {
+ project->HandleCommand(LC_VIEW_VIEWPORTS, id - ID_VIEW_VIEWPORTS_01);
+ return;
+ }
+
+ if (id >= ID_CAMERA_FIRST && id <= ID_CAMERA_LAST)
+ {
+ project->HandleCommand(LC_VIEW_CAMERA_MENU, id - ID_CAMERA_FIRST);
+ return;
+ }
+
+ switch (id)
+ {
+ case ID_FILE_EXIT: {
+ gtk_main_quit();
+ } break;
+
+ case ID_SNAP_A: {
+ project->HandleCommand(LC_TOOLBAR_SNAPMENU, 5);
+ } break;
+ }
+}
+
+static gint button_press_event (GtkWidget *widget, GdkEventButton *event)
+{
+ int x, y;
+ x = (int)event->x;
+ y = widget->allocation.height - (int)event->y - 1;
+
+ if (event->button == 1)
+ project->OnLeftButtonDown(x, y);
+ if (event->button == 3)
+ project->OnRightButtonDown(x, y);
+
+ gtk_window_set_focus(GTK_WINDOW(main_window), drawing_area);
+
+ return TRUE;
+}
+
+static gint button_release_event (GtkWidget *widget, GdkEventButton *event)
+{
+ int x, y;
+ x = (int)event->x;
+ y = widget->allocation.height - (int)event->y - 1;
+
+ if (event->button == 1)
+ project->OnLeftButtonUp(x, y);
+ if (event->button == 3)
+ project->OnRightButtonUp(x, y);
+
+ return TRUE;
+}
+
+static gint motion_notify_event (GtkWidget *widget, GdkEventMotion *event)
+{
+ int x, y;
+ GdkModifierType state;
+
+ if (event->is_hint)
+ gdk_window_get_pointer (event->window, &x, &y, &state);
+ else
+ {
+ x = (int)event->x;
+ y = (int)event->y;
+ state = (GdkModifierType)event->state;
+ }
+
+ y = widget->allocation.height - (int)event->y - 1;
+
+ // if (state)
+ project->OnMouseMove(x, y);
+
+ return TRUE;
+}
+
+static gint key_press_event(GtkWidget* widget, GdkEventKey* event, gpointer data)
+{
+ char code = 0;
+
+ if (event->keyval < 0x100)
+ code = gdk_keyval_to_upper(event->keyval);
+ else
+ {
+ switch (event->keyval)
+ {
+ case GDK_Shift_L: case GDK_Shift_R: code = KEY_SHIFT; break;
+ case GDK_Control_L: case GDK_Control_R: code = KEY_CONTROL; break;
+ case GDK_Escape: code = KEY_ESCAPE; break;
+ case GDK_Tab: code = KEY_TAB; break;
+ case GDK_Insert: code = KEY_INSERT; break;
+ case GDK_Delete: code = KEY_DELETE; break;
+ case GDK_Up: code = KEY_UP; break;
+ case GDK_Down: code = KEY_DOWN; break;
+ case GDK_Left: code = KEY_LEFT; break;
+ case GDK_Right: code = KEY_RIGHT; break;
+ case GDK_Prior: code = KEY_PRIOR; break;
+ case GDK_Next: code = KEY_NEXT; break;
+ }
+ }
+
+ if (code != 0)
+ {
+ if (project->OnKeyDown(code, (event->state & GDK_CONTROL_MASK) != 0,
+ (event->state & GDK_SHIFT_MASK) != 0))
+ gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event");
+ }
+
+ return TRUE;
+}
+
+static gint init(GtkWidget *widget)
+{
+ // OpenGL functions can be called only if make_current returns true
+ if (gtk_gl_area_make_current(GTK_GL_AREA(widget)))
+ {
+ glViewport(0,0, widget->allocation.width, widget->allocation.height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(0,100, 100,0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ }
+
+ return TRUE;
+}
+
+// When widget is exposed it's contents are redrawn.
+static gint draw_view(GtkWidget *widget, GdkEventExpose *event)
+{
+ // Draw only last expose.
+ if (event->count > 0)
+ return TRUE;
+
+ project->Render(false);
+ // TODO: call SystemSwap from Render()
+ gtk_gl_area_swapbuffers(GTK_GL_AREA(widget));
+
+ return TRUE;
+}
+
+// Save the new size of the window.
+static gint reshape_view(GtkWidget *widget, GdkEventConfigure *event)
+{
+ project->SetViewSize(widget->allocation.width, widget->allocation.height);
+
+ return TRUE;
+}
+
+static gint main_quit (GtkWidget *widget, GdkEvent* event, gpointer data)
+{
+ if (!project->SaveModified())
+ return TRUE;
+
+ gtk_main_quit ();
+ return FALSE;
+}
+
+int main(int argc, char* argv[])
+{
+ GtkWidget *vbox, *hbox;
+
+ int attrlist[] =
+ {
+ GLX_RGBA,
+ GLX_DOUBLEBUFFER,
+ GLX_DEPTH_SIZE, 16,
+ 0
+ };
+
+ gtk_set_locale ();
+ gtk_init (&argc, &argv);
+
+ // Check if OpenGL is supported.
+ if (gdk_gl_query() == FALSE)
+ {
+ g_print("ERROR: OpenGL not supported\n");
+ return 1;
+ }
+
+// startup_message ("Loading user preferences ...");
+ init_rc ();
+ project = new Project();
+
+ main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (main_window), "LeoCAD");
+ gtk_container_border_width (GTK_CONTAINER (main_window), 0);
+// gtk_window_set_policy (GTK_WINDOW (window), TRUE, TRUE, FALSE);
+ gtk_widget_realize (main_window);
+// read preferences
+ gtk_widget_set_usize (GTK_WIDGET(main_window), 400, 300);
+ gdk_window_resize (main_window->window, 600, 400);
+ gtk_window_set_default_size (GTK_WINDOW (main_window), 600, 400);
+
+ gtk_signal_connect (GTK_OBJECT (main_window), "delete_event", (GtkSignalFunc) main_quit, NULL);
+ gtk_signal_connect (GTK_OBJECT (main_window), "destroy", (GtkSignalFunc) gtk_main_quit, NULL);
+
+ vbox = gtk_vbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (main_window), vbox);
+ gtk_widget_show (vbox);
+
+// startup_message ("Creating Main Menu ...");
+ create_main_menu(main_window, vbox);
+
+// startup_message ("Creating Toolbars ...");
+ create_toolbars (main_window, vbox);
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (vbox), hbox);
+ gtk_widget_show (hbox);
+
+ /* You should always delete gtk_gl_widget widgets before exit or else
+ GLX contexts are left undeleted, this may cause problems (=core dump)
+ in some systems.
+ Destroy method of objects is not automatically called on exit.
+ You need to manually enable this feature. Do gtk_quit_add_destroy()
+ for all your top level windows unless you are certain that they get
+ destroy signal by other means.
+ */
+ gtk_quit_add_destroy(1, GTK_OBJECT(main_window));
+
+ // Create new OpenGL widget.
+ drawing_area = GTK_WIDGET(gtk_gl_area_new(attrlist));
+
+ GTK_WIDGET_SET_FLAGS(drawing_area, GTK_CAN_FOCUS);
+
+ gtk_widget_set_events(GTK_WIDGET(drawing_area),
+ GDK_EXPOSURE_MASK |
+ GDK_KEY_PRESS_MASK |
+ GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK |
+ GDK_POINTER_MOTION_MASK |
+ GDK_POINTER_MOTION_HINT_MASK);
+
+ // Connect signal handlers
+ gtk_signal_connect(GTK_OBJECT(drawing_area), "expose_event",
+ GTK_SIGNAL_FUNC(draw_view), NULL);
+ gtk_signal_connect(GTK_OBJECT(drawing_area), "configure_event",
+ GTK_SIGNAL_FUNC(reshape_view), NULL);
+ gtk_signal_connect(GTK_OBJECT(drawing_area), "realize",
+ GTK_SIGNAL_FUNC(init), NULL);
+ gtk_signal_connect (GTK_OBJECT (drawing_area), "motion_notify_event",
+ GTK_SIGNAL_FUNC(motion_notify_event), NULL);
+ gtk_signal_connect (GTK_OBJECT (drawing_area), "button_press_event",
+ GTK_SIGNAL_FUNC(button_press_event), NULL);
+ gtk_signal_connect (GTK_OBJECT (drawing_area), "button_release_event",
+ GTK_SIGNAL_FUNC(button_release_event), NULL);
+ gtk_signal_connect (GTK_OBJECT (drawing_area), "key_press_event",
+ GTK_SIGNAL_FUNC(key_press_event), NULL);
+
+ /* set minimum size */
+ gtk_widget_set_usize(GTK_WIDGET(drawing_area), 100,100);
+
+ gtk_container_add(GTK_CONTAINER(hbox),GTK_WIDGET(drawing_area));
+ gtk_widget_show(GTK_WIDGET(drawing_area));
+
+ create_piecebar(main_window, hbox);
+ create_statusbar(main_window, vbox);
+// gtk_box_pack_start (GTK_BOX (vbox), create_status_bar (), FALSE, TRUE, 2);
+ // GtkWidget* statusbar = gtk_statusbar_new ();
+ //gtk_widget_show (statusbar);
+ //gtk_box_pack_start (GTK_BOX (vbox), statusbar, FALSE, TRUE, 0);
+
+ gtk_widget_show(GTK_WIDGET(main_window));
+
+ char* path;
+ path = getenv("LEOCAD_LIB");
+ if (path == NULL)
+ path = default_path;
+
+ if (project->Initialize(argc, argv, path) == false)
+ {
+ delete project;
+ return 1;
+ }
+
+ gtk_main();
+
+ delete project;
+ return 0;
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/linux/main.h b/linux/main.h
new file mode 100644
index 0000000..4264f16
--- /dev/null
+++ b/linux/main.h
@@ -0,0 +1,46 @@
+#ifndef _MAIN_H_
+#define _MAIN_H_
+
+extern GtkWidget* main_window;
+extern GtkWidget* drawing_area;
+
+extern bool ignore_commands;
+void OnCommand(GtkWidget *w, gpointer data);
+void OnCommandDirect(GtkWidget *w, gpointer data);
+
+#define ID_FILE_RECENT1 1
+#define ID_FILE_RECENT2 2
+#define ID_FILE_RECENT3 3
+#define ID_FILE_RECENT4 4
+#define ID_FILE_EXIT 5
+#define ID_VIEW_VIEWPORTS_01 6
+#define ID_VIEW_VIEWPORTS_14 19
+
+#define ID_CAMERA_FIRST 1001
+#define ID_CAMERA_LAST 1255
+
+
+#define ID_ACTION_SELECT 100
+#define ID_ACTION_INSERT 101
+#define ID_ACTION_LIGHT 102
+#define ID_ACTION_SPOTLIGHT 103
+#define ID_ACTION_CAMERA 104
+#define ID_ACTION_MOVE 105
+#define ID_ACTION_ROTATE 106
+#define ID_ACTION_ERASER 107
+#define ID_ACTION_PAINT 108
+#define ID_ACTION_ZOOM 109
+#define ID_ACTION_ZOOM_REGION 110
+#define ID_ACTION_PAN 111
+#define ID_ACTION_ROTATE_VIEW 112
+#define ID_ACTION_ROLL 113
+
+#define ID_SNAP_A 130
+#define ID_SNAP_X 131
+#define ID_SNAP_Y 132
+#define ID_SNAP_Z 133
+
+#endif
+
+
+
diff --git a/linux/menu.cpp b/linux/menu.cpp
new file mode 100644
index 0000000..8622fee
--- /dev/null
+++ b/linux/menu.cpp
@@ -0,0 +1,406 @@
+// Menu routines.
+//
+
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include "typedefs.h"
+#include "menu.h"
+#include "main.h"
+#include "toolbar.h"
+#include "custom.h"
+
+typedef enum { TB_BOTH, TB_ICONS, TB_TEXT, TB_TOOLBAR, TB_DRAWING, TB_ANIMATION, TB_STATUS };
+
+void toolbar_set_style (GtkWidget* widget, gpointer data)
+{
+ if (main_toolbar.toolbar == NULL)
+ return;
+
+ int id = (int)data;
+
+ switch (id)
+ {
+ case TB_BOTH: {
+ user_rc.toolbar_style = GTK_TOOLBAR_BOTH;
+ } break;
+
+ case TB_ICONS: {
+ user_rc.toolbar_style = GTK_TOOLBAR_ICONS;
+ } break;
+
+ case TB_TEXT: {
+ user_rc.toolbar_style = GTK_TOOLBAR_TEXT;
+ } break;
+
+ case TB_TOOLBAR:
+ {
+ if (user_rc.view_main_toolbar)
+ {
+ user_rc.view_main_toolbar = 0;
+ gtk_widget_hide (main_toolbar.handle_box);
+ }
+ else
+ {
+ user_rc.view_main_toolbar = 1;
+ gtk_widget_show (main_toolbar.handle_box);
+ }
+ } break;
+
+ case TB_DRAWING:
+ {
+ if (user_rc.view_tool_toolbar)
+ {
+ user_rc.view_tool_toolbar = 0;
+ gtk_widget_hide (tool_toolbar.handle_box);
+ }
+ else
+ {
+ user_rc.view_tool_toolbar = 1;
+ gtk_widget_show (tool_toolbar.handle_box);
+ }
+ } break;
+
+ case TB_ANIMATION:
+ {
+ if (user_rc.view_anim_toolbar)
+ {
+ user_rc.view_anim_toolbar = 0;
+ gtk_widget_hide (anim_toolbar.handle_box);
+ }
+ else
+ {
+ user_rc.view_anim_toolbar = 1;
+ gtk_widget_show (anim_toolbar.handle_box);
+ }
+ } break;
+
+ case TB_STATUS:
+ {
+ } break;
+ }
+
+ if (id == TB_BOTH || id == TB_ICONS || id ==TB_TEXT)
+ {
+ gtk_toolbar_set_style (GTK_TOOLBAR (main_toolbar.toolbar), user_rc.toolbar_style);
+ gtk_toolbar_set_style (GTK_TOOLBAR (tool_toolbar.toolbar), user_rc.toolbar_style);
+ gtk_toolbar_set_style (GTK_TOOLBAR (anim_toolbar.toolbar), user_rc.toolbar_style);
+ gtk_widget_set_usize (main_toolbar.handle_box, -1, -1);
+ gtk_widget_set_usize (tool_toolbar.handle_box, -1, -1);
+ gtk_widget_set_usize (anim_toolbar.handle_box, -1, -1);
+ }
+}
+
+
+static void menu_separator (GtkWidget * menu)
+{
+ GtkWidget *menu_item = gtk_menu_item_new ();
+ gtk_menu_append (GTK_MENU (menu), menu_item);
+ gtk_widget_set_sensitive (menu_item, FALSE);
+ gtk_widget_show (menu_item);
+}
+
+static void menu_tearoff (GtkWidget * menu)
+{
+ GtkWidget *menu_item = gtk_tearoff_menu_item_new ();
+ gtk_menu_append (GTK_MENU (menu), menu_item);
+ gtk_widget_set_sensitive (menu_item, FALSE);
+ gtk_widget_show (menu_item);
+}
+
+static GtkWidget* create_sub_menu (GtkWidget * menu_bar, char *label, char RIGTH_JUSTIFY)
+{
+ GtkWidget *sub_menu = gtk_menu_item_new_with_label (label);
+ GtkWidget *menu = gtk_menu_new ();
+ gtk_menu_bar_append (GTK_MENU_BAR (menu_bar), sub_menu);
+ gtk_widget_show (sub_menu);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (sub_menu), menu);
+ if (RIGTH_JUSTIFY)
+ gtk_menu_item_right_justify (GTK_MENU_ITEM (sub_menu));
+ return menu;
+}
+
+static GtkWidget* create_menu_item (GtkWidget * menu, gchar * label, gint sensitive_flag,
+ GtkSignalFunc this_func, gpointer this_func_data)
+{
+ GtkWidget *menu_item = gtk_menu_item_new_with_label (label);
+ gtk_menu_append (GTK_MENU (menu), menu_item);
+ gtk_widget_set_sensitive (menu_item, sensitive_flag);
+ gtk_widget_show (menu_item);
+ gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (this_func), this_func_data);
+ return menu_item;
+}
+
+static GtkWidget* create_check_menu_item (GtkWidget * menu, gchar * label, gint state_flag,
+ GtkSignalFunc this_func, gpointer this_func_data)
+{
+ GtkWidget *menu_item = gtk_check_menu_item_new_with_label (label);
+ gtk_menu_append (GTK_MENU (menu), menu_item);
+ gtk_check_menu_item_set_state (GTK_CHECK_MENU_ITEM (menu_item), state_flag);
+ gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
+ gtk_widget_show (menu_item);
+ gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (this_func), this_func_data);
+ return menu_item;
+}
+
+static GtkWidget* create_menu_radio_item (GtkWidget * menu, GtkWidget * last_radio, gchar * label,
+ GtkSignalFunc this_func, gpointer this_func_data, gint state_flag)
+{
+ GtkWidget *menu_item;
+ if (last_radio == NULL)
+ menu_item = gtk_radio_menu_item_new_with_label ((GSList*)NULL, label);
+ else
+ menu_item = gtk_radio_menu_item_new_with_label (gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (last_radio)), label);
+ gtk_menu_append (GTK_MENU (menu), menu_item);
+ //gtk_check_menu_item_set_show_toggle (GTK_CHECK_MENU_ITEM (menu_item), TRUE);
+ gtk_widget_show (menu_item);
+ gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (this_func), this_func_data);
+ if (state_flag)
+ gtk_check_menu_item_set_state (GTK_CHECK_MENU_ITEM (menu_item), state_flag);
+
+ return menu_item;
+}
+
+static GtkWidget* create_menu_in_menu (GtkWidget * menu, gchar * label)
+{
+ GtkWidget *menu_item = gtk_menu_item_new_with_label (label);
+ GtkWidget *menu_in_menu = gtk_menu_new ();
+ gtk_menu_append (GTK_MENU (menu), menu_item);
+ gtk_widget_show (menu_item);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (menu_item), menu_in_menu);
+ return menu_in_menu;
+}
+
+MAINMENU main_menu;
+
+void create_main_menu(GtkWidget *window, GtkWidget *vbox)
+{
+ GtkWidget *handle_box, *menu, *menu_in_menu, *item;
+ GtkAccelGroup *accel = gtk_accel_group_get_default ();
+
+ handle_box = gtk_handle_box_new ();
+ gtk_box_pack_start (GTK_BOX (vbox), handle_box, FALSE, FALSE, 0);
+ gtk_widget_show (handle_box);
+
+ main_menu.menu_bar = gtk_menu_bar_new ();
+ gtk_container_add (GTK_CONTAINER (handle_box), main_menu.menu_bar);
+ gtk_widget_show (main_menu.menu_bar);
+
+ // File menu
+ main_menu.file_menu = menu = create_sub_menu (main_menu.menu_bar, "File", FALSE);
+ menu_tearoff (menu);
+
+ item = create_menu_item (menu, "New", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_NEW);
+ gtk_widget_add_accelerator (item, "activate", accel, 'N',
+ GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+ item = create_menu_item (menu, "Open...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_OPEN);
+ gtk_widget_add_accelerator (item, "activate", accel, 'O',
+ GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+ create_menu_item (menu, "Merge...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_MERGE);
+ menu_separator (menu);
+
+ item = create_menu_item (menu, "Save", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_SAVE);
+ gtk_widget_add_accelerator (item, "activate", accel, 'S',
+ GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+ item = create_menu_item (menu, "Save As...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_SAVEAS);
+ item = create_menu_item (menu, "Save Picture...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_PICTURE);
+
+ menu_in_menu = create_menu_in_menu (menu, "Export");
+ create_menu_item (menu_in_menu, "HTML...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_HTML);
+ create_menu_item (menu_in_menu, "POV-Ray...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_POVRAY);
+ create_menu_item (menu_in_menu, "Wavefront...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_WAVEFRONT);
+ menu_separator (menu);
+
+ create_menu_item (menu, "Properties...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_PROPERTIES);
+ create_menu_item (menu, "Piece Library Manager...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_LIBRARY);
+ create_menu_item (menu, "Terrain Editor...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_TERRAIN);
+ menu_separator (menu);
+
+ main_menu.file_recent[0] = create_menu_item (menu, "Recent Files", FALSE,
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_FILE_RECENT1);
+ main_menu.file_recent[1] = create_menu_item (menu, "", TRUE,
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_FILE_RECENT2);
+ main_menu.file_recent[2] = create_menu_item (menu, "", TRUE,
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_FILE_RECENT3);
+ main_menu.file_recent[3] = create_menu_item (menu, "", TRUE,
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_FILE_RECENT4);
+ gtk_widget_hide (main_menu.file_recent[1]);
+ gtk_widget_hide (main_menu.file_recent[2]);
+ gtk_widget_hide (main_menu.file_recent[3]);
+
+ menu_separator (menu);
+ item = create_menu_item (menu, "Exit...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_FILE_EXIT);
+ gtk_widget_add_accelerator (item, "activate", accel, 'Q',
+ GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+
+ // Edit menu
+ menu = create_sub_menu (main_menu.menu_bar, "Edit", FALSE);
+ menu_tearoff (menu);
+
+ main_menu.edit_undo = create_menu_item (menu, "Undo", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_UNDO);
+ gtk_widget_add_accelerator (main_menu.edit_undo, "activate", accel, 'Z',
+ GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+ main_menu.edit_redo = create_menu_item (menu, "Redo", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_REDO);
+ gtk_widget_add_accelerator (main_menu.edit_redo, "activate", accel, 'Y',
+ GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+ menu_separator (menu);
+
+ main_menu.edit_cut = create_menu_item (menu, "Cut", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_CUT);
+ gtk_widget_add_accelerator (main_menu.edit_cut, "activate", accel, 'X',
+ GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+ main_menu.edit_copy = create_menu_item (menu, "Copy", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_COPY);
+ gtk_widget_add_accelerator (main_menu.edit_copy, "activate", accel, 'C',
+ GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+ main_menu.edit_paste = create_menu_item (menu, "Paste", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_PASTE);
+ gtk_widget_add_accelerator (main_menu.edit_paste, "activate", accel, 'V',
+ GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+ menu_separator (menu);
+
+ main_menu.edit_select_all = create_menu_item (menu, "Select All", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_SELECT_ALL);
+ main_menu.edit_select_none = create_menu_item (menu, "Select None", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_SELECT_NONE);
+ main_menu.edit_select_invert = create_menu_item (menu, "Select Invert", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_SELECT_INVERT);
+ main_menu.edit_select_byname = create_menu_item (menu, "Select by Name...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_SELECT_BYNAME);
+
+ // Piece menu
+ menu = create_sub_menu (main_menu.menu_bar, "Piece", FALSE);
+ menu_tearoff (menu);
+
+ create_menu_item (menu, "Insert", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_INSERT);
+ main_menu.piece_delete = create_menu_item (menu, "Delete", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_DELETE);
+ create_menu_item (menu, "Minifig Wizard...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_MINIFIG);
+ main_menu.piece_array = create_menu_item (menu, "Array...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_ARRAY);
+ main_menu.piece_copy_keys = create_menu_item (menu, "Copy Keys", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_COPYKEYS);
+ menu_separator (menu);
+
+ main_menu.piece_group = create_menu_item (menu, "Group", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_GROUP);
+ gtk_widget_add_accelerator (main_menu.piece_group, "activate", accel, 'G',
+ GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+ main_menu.piece_ungroup = create_menu_item (menu, "Ungroup", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_UNGROUP);
+ gtk_widget_add_accelerator (main_menu.piece_ungroup, "activate", accel, 'U',
+ GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+ main_menu.piece_group_remove = create_menu_item (menu, "Remove from Group", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_GROUP_REMOVE);
+ main_menu.piece_group_add = create_menu_item (menu, "Add to Group", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_GROUP_ADD);
+ main_menu.piece_edit_groups = create_menu_item (menu, "Edit Groups...", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_GROUP_EDIT);
+ menu_separator (menu);
+
+ main_menu.piece_hide_sel = create_menu_item (menu, "Hide Selected", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_HIDE_SELECTED);
+ main_menu.piece_hide_unsel = create_menu_item (menu, "Hide Unselected", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_HIDE_UNSELECTED);
+ main_menu.piece_unhide = create_menu_item (menu, "Unhide All", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_UNHIDE_ALL);
+
+ // View menu
+ menu = create_sub_menu (main_menu.menu_bar, "View", FALSE);
+ menu_tearoff (menu);
+
+ create_menu_item (menu, "Preferences...", TRUE,
+ GTK_SIGNAL_FUNC(OnCommandDirect), (void*)LC_VIEW_PREFERENCES);
+ menu_separator (menu);
+
+ menu_in_menu = create_menu_in_menu (menu, "Toolbars");
+ create_check_menu_item (menu_in_menu, "Standard", user_rc.view_main_toolbar,
+ GTK_SIGNAL_FUNC(toolbar_set_style), (void*)TB_TOOLBAR);
+ create_check_menu_item (menu_in_menu, "Drawing", user_rc.view_tool_toolbar,
+ GTK_SIGNAL_FUNC(toolbar_set_style), (void*)TB_DRAWING);
+ create_check_menu_item (menu_in_menu, "Animation", user_rc.view_anim_toolbar,
+ GTK_SIGNAL_FUNC(toolbar_set_style), (void*)TB_ANIMATION);
+// create_check_menu_item (menu_in_menu, "Modify", FALSE, GTK_SIGNAL_FUNC(OnCommand), NULL);
+// create_check_menu_item (menu_in_menu, "Status Bar", FALSE, GTK_SIGNAL_FUNC(OnCommand), NULL);
+ menu_separator (menu_in_menu);
+
+ item = create_menu_radio_item (menu_in_menu, (GtkWidget*)NULL, "Icons and Text",
+ GTK_SIGNAL_FUNC (toolbar_set_style), (void*)TB_BOTH, user_rc.toolbar_style == GTK_TOOLBAR_BOTH);
+ item = create_menu_radio_item (menu_in_menu, item, "Icons only",
+ GTK_SIGNAL_FUNC (toolbar_set_style), (void*)TB_ICONS, user_rc.toolbar_style == GTK_TOOLBAR_ICONS);
+ create_menu_radio_item (menu_in_menu, item, "Text only",
+ GTK_SIGNAL_FUNC (toolbar_set_style), (void*)TB_TEXT, user_rc.toolbar_style == GTK_TOOLBAR_TEXT);
+
+ create_menu_item (menu, "Zoom In", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_VIEW_ZOOMIN);
+ create_menu_item (menu, "Zoom Out", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_VIEW_ZOOMOUT);
+ create_menu_item (menu, "Zoom Extents", TRUE,
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_VIEW_ZOOMEXTENTS);
+ menu_separator (menu);
+
+ menu_in_menu = create_menu_in_menu (menu, "Viewports");
+
+ for (int i = 0; i < 14; i++)
+ {
+ char str[20];
+ sprintf(str, "Viewports %d", i + 1);
+ main_menu.view_viewports[i] = create_menu_radio_item (menu_in_menu,
+ i == 0 ? (GtkWidget*)NULL : main_menu.view_viewports[i-1], str,
+ GTK_SIGNAL_FUNC(OnCommand), (void*)(i + ID_VIEW_VIEWPORTS_01), i == 0);
+ }
+
+ main_menu.view_cameras_popup = gtk_menu_item_new_with_label ("Cameras");
+ menu_in_menu = gtk_menu_new ();
+ gtk_menu_append (GTK_MENU (menu), main_menu.view_cameras_popup);
+ gtk_widget_show (main_menu.view_cameras_popup);
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (main_menu.view_cameras_popup), menu_in_menu);
+ create_menu_item (menu_in_menu, "Dummy", TRUE, GTK_SIGNAL_FUNC(OnCommand), (void*)NULL);
+
+ menu_in_menu = main_menu.view_step_popup = create_menu_in_menu (menu, "Step");
+ main_menu.view_step_first = create_menu_item (menu_in_menu, "First", TRUE,
+ GTK_SIGNAL_FUNC(OnCommandDirect), (void*)LC_VIEW_STEP_FIRST);
+ main_menu.view_step_prev = create_menu_item (menu_in_menu, "Previous", TRUE,
+ GTK_SIGNAL_FUNC(OnCommandDirect), (void*)LC_VIEW_STEP_PREVIOUS);
+ main_menu.view_step_next = create_menu_item (menu_in_menu, "Next", TRUE,
+ GTK_SIGNAL_FUNC(OnCommandDirect), (void*)LC_VIEW_STEP_NEXT);
+ main_menu.view_step_last = create_menu_item (menu_in_menu, "Last", TRUE,
+ GTK_SIGNAL_FUNC(OnCommandDirect), (void*)LC_VIEW_STEP_LAST);
+
+ menu = create_sub_menu (main_menu.menu_bar, "Help", FALSE);
+ menu_tearoff (menu);
+ create_menu_item (menu, "About", TRUE, GTK_SIGNAL_FUNC(OnCommandDirect), (void*)LC_HELP_ABOUT);
+
+ /*
+ item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>", accel_group);
+
+ gtk_item_factory_create_items(item_factory, nmenu_items, main_menu_items, NULL);
+
+ gtk_accel_group_attach (accel_group, GTK_OBJECT (window));
+
+ if (menubar)
+ *menubar = gtk_item_factory_get_widget(item_factory, "<main>");
+
+ gtk_container_add (GTK_CONTAINER (handle_box), *menubar);
+ gtk_widget_show(*menubar);
+ */
+}
+
+
+
diff --git a/linux/menu.h b/linux/menu.h
new file mode 100644
index 0000000..52a37b0
--- /dev/null
+++ b/linux/menu.h
@@ -0,0 +1,54 @@
+#ifndef _MENU_H_
+#define _MENU_H_
+
+void create_main_menu(GtkWidget *window, GtkWidget *vbox);
+
+typedef struct
+{
+ GtkWidget* menu_bar;
+
+ GtkWidget* file_menu;
+// GtkWidget* file_send;
+// GtkWidget* file_print;
+// GtkWidget* file_print_pieces;
+// GtkWidget* file_print_preview;
+// GtkWidget* file_print_setup;
+ GtkWidget* file_recent[4];
+
+ GtkWidget* edit_undo;
+ GtkWidget* edit_redo;
+ GtkWidget* edit_cut;
+ GtkWidget* edit_copy;
+ GtkWidget* edit_paste;
+ GtkWidget* edit_select_all;
+ GtkWidget* edit_select_none;
+ GtkWidget* edit_select_invert;
+ GtkWidget* edit_select_byname;
+
+ GtkWidget* piece_delete;
+ GtkWidget* piece_array;
+ GtkWidget* piece_copy_keys;
+ GtkWidget* piece_group;
+ GtkWidget* piece_ungroup;
+ GtkWidget* piece_group_remove;
+ GtkWidget* piece_group_add;
+ GtkWidget* piece_edit_groups;
+ GtkWidget* piece_hide_sel;
+ GtkWidget* piece_hide_unsel;
+ GtkWidget* piece_unhide;
+
+ // GtkWidget* view_modify;
+ GtkWidget* view_viewports[14];
+ GtkWidget* view_cameras_popup;
+ GtkWidget* view_cameras[25];
+ GtkWidget* view_step_popup;
+ GtkWidget* view_step_first;
+ GtkWidget* view_step_prev;
+ GtkWidget* view_step_next;
+ GtkWidget* view_step_last;
+
+} MAINMENU;
+
+extern MAINMENU main_menu;
+
+#endif
diff --git a/linux/module.mk b/linux/module.mk
new file mode 100644
index 0000000..40af84a
--- /dev/null
+++ b/linux/module.mk
@@ -0,0 +1,6 @@
+SRC += linux/custom.cpp linux/gdkgl.c linux/gtkglarea.c linux/dialogs.cpp linux/gtktools.cpp linux/main.cpp linux/menu.cpp linux/system.cpp linux/toolbar.cpp
+
+CFLAGS += `gtk-config --cflags`
+CXXFLAGS += `gtk-config --cflags`
+LIBS += `gtk-config --libs`
+
diff --git a/linux/pixmaps/ac-brick.xpm b/linux/pixmaps/ac-brick.xpm
new file mode 100644
index 0000000..f56ac14
--- /dev/null
+++ b/linux/pixmaps/ac-brick.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *ac_brick[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c #00007f",
+". c Gray50",
+"o c Gray75",
+"X c None",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXX XXXXXX",
+"XXXXX oo XXX",
+"XXXX o o XXX",
+"XXX oooooo . XXX",
+"XX .. XXX",
+"XX oooooo .. XXX",
+"XX oooooo .. XXX",
+"XX oooooo .. XXX",
+"XX oooooo .. XXX",
+"XX oooooo . XXXX",
+"XX oooooo XXXXX",
+"XX XXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/ac-cam.xpm b/linux/pixmaps/ac-cam.xpm
new file mode 100644
index 0000000..9990d02
--- /dev/null
+++ b/linux/pixmaps/ac-cam.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *ac_cam[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 5 1",
+" c Gray0",
+". c Gray50",
+"X c Red",
+"o c Gray75",
+"O c Gray100",
+/* pixels */
+"oo. .ooo. .ooooo",
+"o OOo o OOo oooo",
+".OO Oo OO Oo ooo",
+" O O O O ooo",
+".oO Oo oO Oo ooo",
+"o oOo o oOo oo ",
+"oo ooo o. ",
+"oo oo.o.o.o..oO ",
+"oo .XX...... .o ",
+"oo ",
+"ooo oo ",
+"oooooo . oooooo ",
+"oooooo . ooooooo",
+"oooooo ooooooo",
+"oooooooooooooooo"
+};
diff --git a/linux/pixmaps/ac-erase.xpm b/linux/pixmaps/ac-erase.xpm
new file mode 100644
index 0000000..afce83f
--- /dev/null
+++ b/linux/pixmaps/ac-erase.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *ac_erase[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 5 1",
+" c Gray0",
+". c Gray50",
+"X c None",
+"O c Gray75",
+"o c Gray100",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXX. ..X",
+"XXXXXXX oooooO X",
+"XXXXXX oooooo X",
+"XXXXX oooooo . X",
+"XXXX oooooo .. X",
+"XXX oooooo .. XX",
+"XX oooooo .. XXX",
+"X OOOOOO .. XXXX",
+"X OOOOOO . XXXXX",
+"X OOOOOO XXXXXX",
+"XX .XXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/ac-light.xpm b/linux/pixmaps/ac-light.xpm
new file mode 100644
index 0000000..1142a34
--- /dev/null
+++ b/linux/pixmaps/ac-light.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *ac_light[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c Gray50",
+"X c Gray75",
+"o c Gray100",
+/* pixels */
+"XXXXX XXXXX",
+"XXX. oooooX .XXX",
+"XXX oooooooX XXX",
+"XX oooooooooX XX",
+"XX ooooooooXo XX",
+"XX oooooooXoX XX",
+"XX oXooooXoXo XX",
+"XX. oXXoXoXo .XX",
+"XXX. ooXoXo .XXX",
+"XXXX .ooXo. XXXX",
+"XXXXX XXXXX",
+"XXXXX Xo.. XXXXX",
+"XXXXX. .XXXXX",
+"XXXXX Xo.. XXXXX",
+"XXXXXX XXXXXX"
+};
diff --git a/linux/pixmaps/ac-move.xpm b/linux/pixmaps/ac-move.xpm
new file mode 100644
index 0000000..df6f9a1
--- /dev/null
+++ b/linux/pixmaps/ac-move.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *ac_move[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c #00007f",
+"X c Gray50",
+"o c None",
+/* pixels */
+"ooooooo.oooooooo",
+"oooooo...ooooooo",
+"ooooo oooooo",
+"oooooXo.oXoooooo",
+"ooooooo.oooooooo",
+"oo Xooo.oooX ooo",
+"o. ooooooooo .oo",
+".. ...o.o... ..o",
+"o. ooooooooo .oo",
+"oo Xooo.oooX ooo",
+"ooooooo.oooooooo",
+"oooooXo.oXoooooo",
+"ooooo oooooo",
+"oooooo...ooooooo",
+"ooooooo.oooooooo"
+};
diff --git a/linux/pixmaps/ac-next.xpm b/linux/pixmaps/ac-next.xpm
new file mode 100644
index 0000000..e1bb7a0
--- /dev/null
+++ b/linux/pixmaps/ac-next.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *ac_next[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 6 1",
+" c Gray0",
+". c #00007f",
+"X c Gray50",
+"o c Yellow",
+"1 c Gray75",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOO",
+"OOOOO....OOOOOOO",
+"OOOO..11....OOOO",
+"OOO.1....1..OOOO",
+"OO.111111.X.OOOO",
+"O........XX.OOOO",
+"O.111111.X OOOO",
+"O.111111.X o OOO",
+"O.1111 oo OO",
+"O.1111 ooooooo O",
+"O.1111 oooooooo ",
+"O.1111 ooooooo O",
+"O..... oo OO",
+"OOOOOOOOOO o OOO",
+"OOOOOOOOOO OOOO"
+};
diff --git a/linux/pixmaps/ac-paint.xpm b/linux/pixmaps/ac-paint.xpm
new file mode 100644
index 0000000..416542d
--- /dev/null
+++ b/linux/pixmaps/ac-paint.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *ac_paint[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c Gray50",
+"X c None",
+"o c Gray100",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXX XXXXXXXXX",
+"XXXX oo XXXXXXXX",
+"XXXX o XXXXXXX",
+"XXXX o . XXXXXX",
+"XXXX oo o. XXX",
+"XXX oo o XX",
+"XX oooo oo. XX",
+"X ooooooo.. XX",
+"XX ooooo.. X XX",
+"XXX ooo.. XX XX",
+"XXXX ... XXX XX",
+"XXXXX . XXXX XXX",
+"XXXXXX XXXXXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/ac-pan.xpm b/linux/pixmaps/ac-pan.xpm
new file mode 100644
index 0000000..72c2b8b
--- /dev/null
+++ b/linux/pixmaps/ac-pan.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *ac_pan[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c Gray50",
+"X c Gray75",
+"o c Gray100",
+/* pixels */
+"XXXXXXX XXXXXXX",
+"XXX .X oX. XXXX",
+"XX XX. Xo oX XXX",
+"XX oX oX Xo X X",
+"XXX oX Xo oX .o ",
+"XXX Xo oX Xo oX ",
+"X X XoXoXoX Xo ",
+" oX oXoXoXoXoX.",
+" XoX XoXoXoXoX.X",
+"X XoXoXoXoXoXo X",
+"XX XoXoXoXoXoX X",
+"XX.XXoXoXoXoX XX",
+"XXX oXoXoXoXo XX",
+"XXXX oXoXoXo XXX",
+"XXXXX oXoXoX XXX"
+};
diff --git a/linux/pixmaps/ac-prev.xpm b/linux/pixmaps/ac-prev.xpm
new file mode 100644
index 0000000..0e8b3aa
--- /dev/null
+++ b/linux/pixmaps/ac-prev.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *ac_prev[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 6 1",
+" c Gray0",
+". c #00007f",
+"X c Gray50",
+"o c Yellow",
+"1 c Gray75",
+"O c None",
+/* pixels */
+"OOOOOOOOOOOOOOOO",
+"OOOOOOOO....OOOO",
+"OOOOOOO..11....O",
+"OOOOOO.1....1..O",
+"OOOOO.111111.X.O",
+"OOOO........XX.O",
+"OOOO 11111.XX.O",
+"OOO o 11111.XX.O",
+"OO oo 1.XX.O",
+"O ooooooo 1.XX.O",
+" oooooooo 1.X.OO",
+"O ooooooo 1..OOO",
+"OO oo ..OOOO",
+"OOO o OOOOOOOOOO",
+"OOOO OOOOOOOOOO"
+};
diff --git a/linux/pixmaps/ac-roll.xpm b/linux/pixmaps/ac-roll.xpm
new file mode 100644
index 0000000..ab2dc78
--- /dev/null
+++ b/linux/pixmaps/ac-roll.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *ac_roll[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 5 1",
+" c Gray0",
+". c #7f0000",
+"X c Gray50",
+"o c Red",
+"O c None",
+/* pixels */
+"OOOOOOO.OOOOOOOO",
+"OOOOOOOoOOOOOOOO",
+"OOOOO XoX OOOOOO",
+"OOO OOoOO OOOO",
+"OO XOOO.OOOX OOO",
+"OO OOOOOOOOO OOO",
+"O XOOOOOOOOOX OO",
+"O OOOOOOOOOOO OO",
+"O OOOOOOOOOOO OO",
+"O OOOOOOOOOOO OO",
+"O XOOOOOOOOOX OO",
+"OO OO OOO OO OOO",
+"OO X XOOOX X OOO",
+"OOO OOO OOOO",
+"OO OOO OOO"
+};
diff --git a/linux/pixmaps/ac-rot.xpm b/linux/pixmaps/ac-rot.xpm
new file mode 100644
index 0000000..e02a276
--- /dev/null
+++ b/linux/pixmaps/ac-rot.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *ac_rot[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c #00007f",
+"X c Gray50",
+"o c None",
+/* pixels */
+"oo. ....oooooooo",
+"oooX ...oo ooooo",
+"oooo. ..ooX..ooo",
+"ooX..X .oooo..oo",
+"oo..ooX ooooo.oo",
+"o.Xoooo.oooooX.o",
+"o.oooooooooooo.o",
+"o oooooooooooo o",
+"o oooooooooooo o",
+"o.oooooooooooo.o",
+"o.XooooooooooX.o",
+"oo.oooooooooo.oo",
+"oo..oooooooo..oo",
+"ooo..XooooX..ooo",
+"ooooo.. ..ooooo"
+};
diff --git a/linux/pixmaps/ac-rotv.xpm b/linux/pixmaps/ac-rotv.xpm
new file mode 100644
index 0000000..16ef97f
--- /dev/null
+++ b/linux/pixmaps/ac-rotv.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *ac_rotv[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c #00007f",
+"X c Gray50",
+"o c None",
+/* pixels */
+"oooooo ooooooooo",
+"ooooo oooooooo",
+"oooooo.ooooooooo",
+"ooooo . ooooooo",
+"oooX o.oo Xooooo",
+"ooo oo.ooo ooooo",
+"oo ooo.oooo oooo",
+"oo ooo.oooo oo o",
+"oo ooo........ ",
+"oo oo.ooooo oo o",
+"ooo .ooooo ooooo",
+"ooo. oooo Xooooo",
+" o.oo ooooooo",
+" .oooooooooooooo",
+" ooooooooooooo"
+};
diff --git a/linux/pixmaps/ac-sel.xpm b/linux/pixmaps/ac-sel.xpm
new file mode 100644
index 0000000..5a0d157
--- /dev/null
+++ b/linux/pixmaps/ac-sel.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *ac_sel[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+".... ...........",
+".... ..........",
+".... .........",
+".... ........",
+".... .......",
+".... ......",
+".... .....",
+".... ....",
+".... .......",
+".... . .......",
+".... ... ......",
+"........ ......",
+"......... .....",
+"......... .....",
+"................"
+};
diff --git a/linux/pixmaps/ac-spot.xpm b/linux/pixmaps/ac-spot.xpm
new file mode 100644
index 0000000..18f11d2
--- /dev/null
+++ b/linux/pixmaps/ac-spot.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *ac_spot[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 5 1",
+" c Gray0",
+". c Gray50",
+"X c Yellow",
+"o c Gray75",
+"O c Gray100",
+/* pixels */
+"oo ooooooooooo",
+"o oOO oooooooooo",
+" .oooO ooooooooo",
+" .oooO oooooooo",
+" .o.oo ooo",
+"o .o. o.o oooo",
+"oo . XOo ooooo",
+"ooo OXO oXoXoX",
+"oooo oXO oOoOoOo",
+"ooo o.o oXoXoXoo",
+"oo oOoOoOooo",
+"oooooooooXoXoooo",
+"ooooooooOoOooooo",
+"oooooooooXoooooo",
+"ooooooooOooooooo"
+};
diff --git a/linux/pixmaps/ac-zoom.xpm b/linux/pixmaps/ac-zoom.xpm
new file mode 100644
index 0000000..9c91ae4
--- /dev/null
+++ b/linux/pixmaps/ac-zoom.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *ac_zoom[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 6 1",
+" c Gray0",
+". c #00007f",
+"X c Gray50",
+"o c Blue",
+"O c Gray75",
+"+ c Gray100",
+/* pixels */
+"OOOO....OOOOOOOO",
+"OOX.OOOO.XOOOOOO",
+"OO.O+++OO OOOOOO",
+"O.O++OOOOO OOOOO",
+"O.O+OOOOOO OOOOO",
+"O.OOOOOO+O OOOOO",
+"O.OOOOO++X OOOOO",
+"OO.OO+++O OOOOOO",
+"OOX OOOX X OOOOO",
+"OOOO .X+ OOOO",
+"OOOOOOOOO .oXOOO",
+"OOOOOOOOOO .oXOO",
+"OOOOOOOOOOO .oXO",
+"OOOOOOOOOOOO .oO",
+"OOOOOOOOOOOOO OO"
+};
diff --git a/linux/pixmaps/ac-zoome.xpm b/linux/pixmaps/ac-zoome.xpm
new file mode 100644
index 0000000..e7a0b4c
--- /dev/null
+++ b/linux/pixmaps/ac-zoome.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *ac_zoome[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 6 1",
+" c #00007f",
+". c #7f0000",
+"X c Gray50",
+"o c None",
+"1 c Gray75",
+"O c Gray100",
+/* pixels */
+"...oooooooooo...",
+".oooooooooooooo.",
+".oooo oo.",
+"oooo 1O1O1O ooo",
+"ooo 1O1O1O X ooo",
+"oo XX ooo",
+"oo 111111 XX ooo",
+"oo 111111 XX ooo",
+"oo 111111 XX ooo",
+"oo 111111 XX ooo",
+"oo 111111 X oooo",
+"oo 111111 ooooo",
+".o ooooo.",
+".oooooooooooooo.",
+"...oooooooooo..."
+};
diff --git a/linux/pixmaps/ac-zoomr.xpm b/linux/pixmaps/ac-zoomr.xpm
new file mode 100644
index 0000000..bbbb268
--- /dev/null
+++ b/linux/pixmaps/ac-zoomr.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *ac_zoomr[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 6 1",
+" c Gray0",
+". c #00007f",
+"X c Gray50",
+"o c Blue",
+"O c Gray75",
+"+ c Gray100",
+/* pixels */
+" O O O O ",
+" +O+O+O+O+O+O+O ",
+"OO+O....+O+O+O+ ",
+" +O.OOOO +O+O+OO",
+" O.OO++OO +O+O+ ",
+"O+.O++OO+ O+O+O ",
+" O.O+OOO+ +O+O+O",
+" +.OOOO+O O+O+O ",
+"OO+ O++O +XO+O+ ",
+" +O+ XXXXO+OO",
+" O+O+O+O+ o.XO+ ",
+"O+O+O+O+O+ o.+O ",
+" O+O+O+O+O+ .O+O",
+" +O+O+O+O+O+O+O ",
+" O O O O "
+};
diff --git a/linux/pixmaps/an-anim.xpm b/linux/pixmaps/an-anim.xpm
new file mode 100644
index 0000000..70419b6
--- /dev/null
+++ b/linux/pixmaps/an-anim.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *an_anim[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c Gray50",
+"X c Gray75",
+"o c Gray100",
+/* pixels */
+" .XoXX. .XXXXX",
+" o oXX o XXXXX",
+". . XX. .XXXX",
+"X o XXooX o XXXX",
+"X. .oXXX. .XXX",
+"XX o XoXXX o XXX",
+"XX. .XoXX. .XX",
+"XXX o oXX o XX",
+"XXX. . XX. .X",
+"XXXX o XXooX o X",
+"XXXX. .oXXX. .",
+"XXXXX o XoXXX o ",
+"XXXXX. .XoXX. ",
+"XXXXXX o oXX o",
+"XXXXXX. . XX. "
+};
diff --git a/linux/pixmaps/an-first.xpm b/linux/pixmaps/an-first.xpm
new file mode 100644
index 0000000..50be91d
--- /dev/null
+++ b/linux/pixmaps/an-first.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *an_first[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c #00007f",
+". c Gray50",
+"X c None",
+"o c Gray100",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"ooo.XXXXo.XXXXo.",
+"o .XXXo .XXXo .",
+"o .XXo .XXo .",
+"o .Xo .Xo .",
+"o .o .o .",
+"o o o .",
+"o .. .. .",
+"o .X. .X. .",
+"o .XX. .XX. .",
+"o .XXX. .XXX. .",
+"o...XXXX..XXXX..",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/an-key.xpm b/linux/pixmaps/an-key.xpm
new file mode 100644
index 0000000..67ea35c
--- /dev/null
+++ b/linux/pixmaps/an-key.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *an_key[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 6 1",
+" c Gray0",
+". c #00007f",
+"X c Gray50",
+"o c Blue",
+"O c None",
+"+ c Gray100",
+/* pixels */
+"OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOO",
+"OO+++OOOOOOOOOOO",
+"OO...+OOOOOOOOOO",
+"+X. ..OOOOOOOOOO",
+"+. X..+++++++++O",
+"O o+O...........",
+"O o+O .. ",
+"+ .O. XXXXX.. XX",
+"+X... XOOO+ XO",
+"OX XOOOO+ X XO",
+"OOXXXOOOOOOXOXXO",
+"OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOO",
+"OOOOOOOOOOOOOOOO"
+};
diff --git a/linux/pixmaps/an-last.xpm b/linux/pixmaps/an-last.xpm
new file mode 100644
index 0000000..d603cca
--- /dev/null
+++ b/linux/pixmaps/an-last.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *an_last[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c #00007f",
+". c Gray50",
+"X c None",
+"o c Gray100",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"ooXXXXooXXXXooo.",
+"o oXXXo oXXXo .",
+"o oXXo oXXo .",
+"o oXo oXo .",
+"o oo oo .",
+"o o o .",
+"o .o .o .",
+"o .Xo .Xo .",
+"o .XXo .XXo .",
+"o .XXXo .XXXo .",
+"o.XXXXo.XXXXo...",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/an-next.xpm b/linux/pixmaps/an-next.xpm
new file mode 100644
index 0000000..93bbbf8
--- /dev/null
+++ b/linux/pixmaps/an-next.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *an_next[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c #00007f",
+". c Gray50",
+"X c None",
+"o c Gray100",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"Xoooo.XooXXXXXXX",
+"Xo .Xo oXXXXXX",
+"Xo .Xo oXXXXX",
+"Xo .Xo oXXXX",
+"Xo .Xo oXXX",
+"Xo .Xo oXX",
+"Xo .Xo .XXX",
+"Xo .Xo .XXXX",
+"Xo .Xo .XXXXX",
+"Xo .Xo .XXXXXX",
+"Xo....Xo.XXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/an-play.xpm b/linux/pixmaps/an-play.xpm
new file mode 100644
index 0000000..e07663c
--- /dev/null
+++ b/linux/pixmaps/an-play.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *an_play[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 5 1",
+" c #00007f",
+". c Gray50",
+"X c Blue",
+"o c None",
+"O c Gray100",
+/* pixels */
+"oooooooooooooooo",
+"oooooooooooooooo",
+"ooOOOooooooooooo",
+"ooOX OOooooooooo",
+"ooO X XOOooooooo",
+"ooOX X X OOooooo",
+"ooO X X X XOOooo",
+"ooOX X X X X OOo",
+"ooO X X X X..ooo",
+"ooOX X X ..ooooo",
+"ooO X X..ooooooo",
+"ooOX ..ooooooooo",
+"oo...ooooooooooo",
+"oooooooooooooooo",
+"oooooooooooooooo"
+};
diff --git a/linux/pixmaps/an-prev.xpm b/linux/pixmaps/an-prev.xpm
new file mode 100644
index 0000000..01e536d
--- /dev/null
+++ b/linux/pixmaps/an-prev.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *an_prev[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c #00007f",
+". c Gray50",
+"X c None",
+"o c Gray100",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXo.Xoooo.XX",
+"XXXXXo .Xo .XX",
+"XXXXo .Xo .XX",
+"XXXo .Xo .XX",
+"XXo .Xo .XX",
+"Xo .Xo .XX",
+"XX. .Xo .XX",
+"XXX. .Xo .XX",
+"XXXX. .Xo .XX",
+"XXXXX. .Xo .XX",
+"XXXXXX..Xo....XX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/an-stop.xpm b/linux/pixmaps/an-stop.xpm
new file mode 100644
index 0000000..a15274b
--- /dev/null
+++ b/linux/pixmaps/an-stop.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *an_stop[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 5 1",
+" c #00007f",
+". c Gray50",
+"X c Blue",
+"o c None",
+"O c Gray100",
+/* pixels */
+"oooooooooooooooo",
+"oooooooooooooooo",
+"oooOOOOOOOOO.ooo",
+"oooOX X X X .ooo",
+"oooO X X X X.ooo",
+"oooOX X X X .ooo",
+"oooO X X X X.ooo",
+"oooOX X X X .ooo",
+"oooO X X X X.ooo",
+"oooOX X X X .ooo",
+"oooO X X X X.ooo",
+"oooOX X X X .ooo",
+"oooO.........ooo",
+"oooooooooooooooo",
+"oooooooooooooooo"
+};
diff --git a/linux/pixmaps/cr_brick.xpm b/linux/pixmaps/cr_brick.xpm
new file mode 100644
index 0000000..78b9a0c
--- /dev/null
+++ b/linux/pixmaps/cr_brick.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_brick[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ",
+" ",
+" ",
+" ..... ",
+" ...+++.... ",
+" .++.....++.. ",
+" .+++++++++.+. ",
+" ...........++. ",
+" .+++++++++.++. ",
+" .+++++++++.++. ",
+" .+++++++++.++. ",
+" .+++++++++.++. ",
+" .+++++++++.++. ",
+" .+++++++++.++. ",
+" .+++++++++.+. ",
+" .+++++++++.. ",
+" ........... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/linux/pixmaps/cr_cam.xpm b/linux/pixmaps/cr_cam.xpm
new file mode 100644
index 0000000..87c27bf
--- /dev/null
+++ b/linux/pixmaps/cr_cam.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_cam[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ",
+" ... ... ",
+" .+++. .+++. ",
+" .++.++.++.++. ",
+" .+...+.+...+. ",
+" .++.++.++.++. ",
+" .+++...+++.. . ",
+" ...+++...++... ",
+" .++++++++++++. ",
+" .+..++++++.++. ",
+" .............. ",
+" ......... .. ",
+" .+. . ",
+" .+. ",
+" ... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/linux/pixmaps/cr_erase.xpm b/linux/pixmaps/cr_erase.xpm
new file mode 100644
index 0000000..b801260
--- /dev/null
+++ b/linux/pixmaps/cr_erase.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_erase[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ....... ",
+" .++++++.. ",
+" .++++++.+. ",
+" .++++++.++. ",
+" .++++++.++. ",
+" .++++++.++. ",
+" .++++++.++. ",
+"........++. ",
+".++++++.+. ",
+".++++++.. ",
+"........ ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/linux/pixmaps/cr_light.xpm b/linux/pixmaps/cr_light.xpm
new file mode 100644
index 0000000..563cfb5
--- /dev/null
+++ b/linux/pixmaps/cr_light.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_light[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ...... ",
+" .++++++. ",
+" .++++++++. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++. ",
+" .++++++. ",
+" .++++++. ",
+" ...... ",
+" .++++. ",
+" .... ",
+" .++++. ",
+" .... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/linux/pixmaps/cr_move.xpm b/linux/pixmaps/cr_move.xpm
new file mode 100644
index 0000000..a5d5b3f
--- /dev/null
+++ b/linux/pixmaps/cr_move.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_move[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" + ",
+" +.+ ",
+" +...+ ",
+" +.....+ ",
+" +.+ ",
+" + +.+ + ",
+" +. +.+ .+ ",
+" +..++++.++++..+ ",
+" +...............+ ",
+" +..++++.++++..+ ",
+" +. +.+ .+ ",
+" + +.+ + ",
+" +.+ ",
+" +.....+ ",
+" +...+ ",
+" +.+ ",
+" + ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/linux/pixmaps/cr_paint.xpm b/linux/pixmaps/cr_paint.xpm
new file mode 100644
index 0000000..51177ff
--- /dev/null
+++ b/linux/pixmaps/cr_paint.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_paint[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ... ",
+" . . ",
+" . .. ",
+" . .+.. ",
+" ..++.+.. ",
+" .+++.++... ",
+" .++++.+++... ",
+" .++++.+.+++... ",
+" .++++++.++++... ",
+".+++++++++++.... ",
+".++++++++++. ... ",
+" .++++++++. ... ",
+" .++++++. ... ",
+" .++++. .. ",
+" .++. . ",
+" .. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/linux/pixmaps/cr_pan.xpm b/linux/pixmaps/cr_pan.xpm
new file mode 100644
index 0000000..a640dad
--- /dev/null
+++ b/linux/pixmaps/cr_pan.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_pan[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" .. ",
+" .. .++... ",
+" .++..++.++. ",
+" .++..++.++. . ",
+" .++.++.++..+. ",
+" .++.++.++.++. ",
+" .. .+++++++.++. ",
+" .++..++++++++++. ",
+" .+++.+++++++++. ",
+" .++++++++++++. ",
+" .+++++++++++. ",
+" .++++++++++. ",
+" .+++++++++. ",
+" .+++++++. ",
+" .++++++. ",
+" .++++++. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/linux/pixmaps/cr_roll.xpm b/linux/pixmaps/cr_roll.xpm
new file mode 100644
index 0000000..279bd53
--- /dev/null
+++ b/linux/pixmaps/cr_roll.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_roll[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ",
+" ",
+" ",
+" +. ",
+" +. ",
+" +. ",
+" +. ",
+" ++.++ ",
+" ++.....++ ",
+" ++.. +. ..++ ",
+" +.. +. ..+ ",
+" +. +. .+ ",
+" +. +. .+ ",
+" +. .+ ",
+" +. .+ ",
+" +. .+ ",
+" +. .+ ",
+" +. .+ ",
+" +. .+ ",
+" +. + + .+ ",
+" +. .+ +. .+ ",
+" +. .+ +. .+ ",
+" +...+ +...+ ",
+" ...+ +... ",
+" .....+ +..... ",
+" +++++++ +++++++ ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/linux/pixmaps/cr_rot.xpm b/linux/pixmaps/cr_rot.xpm
new file mode 100644
index 0000000..8dbbcc6
--- /dev/null
+++ b/linux/pixmaps/cr_rot.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_rot[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ",
+" ",
+" +++ ",
+" +...+ ",
+" +. .+ ",
+" +. .+ ",
+" +. .+ ",
+" +.++ .+ ",
+" +.+.+ .+ ",
+" +.+..+ .+ ",
+" +++...+ +.+ ",
+" ++++.......+.+.++++ ",
+" ++....+ +...+ +.+...++ ",
+" +.. +. +..+++++.++++..+ ",
+" +. +. +.+ +.......+ .+ ",
+" +. +. ++ +.....+ .+ ",
+" +. +. +...+ .+ ",
+" +. +. +.+ .+ ",
+" +. +. + .+ ",
+" +.. +. .+ ..+ ",
+" ++...+. +....++ ",
+" ++++.+.........++++ ",
+" +.+++++++++ ",
+" +. .+ ",
+" +. .+ ",
+" +. .+ ",
+" +. .+ ",
+" +. .+ ",
+" +. .+ ",
+" +...+ ",
+" +++ ",
+" "
+};
diff --git a/linux/pixmaps/cr_rotv.xpm b/linux/pixmaps/cr_rotv.xpm
new file mode 100644
index 0000000..9ebea8a
--- /dev/null
+++ b/linux/pixmaps/cr_rotv.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_rotv[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ",
+" ",
+" +++ ",
+" +...+ ",
+" +. .+ ",
+" +. +.++ ",
+" +. +....+ ",
+" + +. +..+ + ",
+" +.+ +. ++ +.+ ",
+" +..+ +. +..+ ",
+" +...+ +. +...+ ",
+" +.+.+ +. +.+.+ ",
+" +. + +. + .+ ",
+" +. +. .+ ",
+" +. +. .+ ",
+" +. +. .+ ",
+" +.. +. ..+ ",
+" ++...+. ....++ ",
+" ++++..........++++ ",
+" +.+++++++++ ",
+" +. ",
+" +. ",
+" +. ",
+" +. ++ ",
+" +. +..+ ",
+" +. +....+ ",
+" +. +.++ ",
+" +. .+ ",
+" +...+ ",
+" +++ ",
+" ",
+" "
+};
diff --git a/linux/pixmaps/cr_sel.xpm b/linux/pixmaps/cr_sel.xpm
new file mode 100644
index 0000000..5bb7885
--- /dev/null
+++ b/linux/pixmaps/cr_sel.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_sel[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ",
+"++ ",
+"+.+ ",
+"+..+ ",
+"+...+ ",
+"+....+ ",
+"+.....+ ",
+"+......+ ",
+"+.......+ ",
+"+........+ ",
+"+.....+++++ ",
+"+..+..+ ",
+"+.+ +..+ ",
+"++ +..+ ",
+"+ +..+ ",
+" +..+ ",
+" ++ ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/linux/pixmaps/cr_selm.xpm b/linux/pixmaps/cr_selm.xpm
new file mode 100644
index 0000000..331db8b
--- /dev/null
+++ b/linux/pixmaps/cr_selm.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char *cr_selm[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" + ",
+"++ +.+ ",
+"+.+ ++.++ ",
+"+..+ +.....+ ",
+"+...+ ++.++ ",
+"+....+ +.+ ",
+"+.....+ + ",
+"+......+ ",
+"+.......+ ",
+"+........+ ",
+"+.....+++++ ",
+"+..+..+ ",
+"+.+ +..+ ",
+"++ +..+ ",
+"+ +..+ ",
+" +..+ ",
+" ++ ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
+
+
diff --git a/linux/pixmaps/cr_spot.xpm b/linux/pixmaps/cr_spot.xpm
new file mode 100644
index 0000000..72b445d
--- /dev/null
+++ b/linux/pixmaps/cr_spot.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_spot[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ... ",
+" .+++. ",
+".+++++. ",
+"..+++++. ",
+"...+++++..... ",
+" ...+++.+++. ",
+" ...+.+++. ",
+" ...+++. ",
+" .+++. ",
+" .+++. ",
+" ..... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
diff --git a/linux/pixmaps/cr_zoom.xpm b/linux/pixmaps/cr_zoom.xpm
new file mode 100644
index 0000000..07b4038
--- /dev/null
+++ b/linux/pixmaps/cr_zoom.xpm
@@ -0,0 +1,42 @@
+/* XPM */
+static char *cr_zoom[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ..... ",
+" ..+++++. ",
+" .++++++++. ",
+" .++++++++. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++++. ",
+" .++++++++. ",
+" .+++++++... ",
+" ..++++..... ",
+" .....+.... ",
+" .+.... ",
+" .+.... ",
+" .+... ",
+" .+. ",
+" . ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "
+};
+
diff --git a/linux/pixmaps/cr_zoomr.xpm b/linux/pixmaps/cr_zoomr.xpm
new file mode 100644
index 0000000..6da8c8c
--- /dev/null
+++ b/linux/pixmaps/cr_zoomr.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *cr_zoomr[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c None",
+". c #000000",
+"+ c #FFFFFF",
+/* pixels */
+" + ",
+" +.+ ",
+" +.+ ",
+" +.+ ",
+" +.+ ",
+" +.+ ",
+" +.+ ",
+" . ",
+" ++++++ ++++++ ",
+"+....... .......+ ",
+" ++++++ ++++++ ",
+" . ",
+" +.+ ",
+" +.+ ",
+" +.+ ",
+" +.+ ",
+" +.+ ",
+" +.+ ..+...+..+...+..",
+" + .++++++++++++++.",
+" ++++....+++++++.",
+" .++.++++.+++++++",
+" .+.++++++.+++++.",
+" ++.++++++.+++++.",
+" .+.++++++.++++++",
+" .+.++++++.+++++.",
+" +++.++++..+++++.",
+" .+++.......+++++",
+" .++++++++...+++.",
+" ++++++++++...++.",
+" .++++++++++..+++",
+" .++++++++++++++.",
+" ...+..+..+..+..."
+};
diff --git a/linux/pixmaps/icon32.xpm b/linux/pixmaps/icon32.xpm
new file mode 100644
index 0000000..230ca60
--- /dev/null
+++ b/linux/pixmaps/icon32.xpm
@@ -0,0 +1,41 @@
+/* XPM */
+static char *icon32[] = {
+/* columns rows colors chars-per-pixel */
+"32 32 3 1",
+" c Gray0",
+". c Red",
+"X c None",
+/* pixels */
+"XXXXXXXXXXXX XXXXXXXXXXXX",
+"XXXXXXXXXX ........ XXXXXXXXXX",
+"XXXXXXXXX ............ XXXXXXXXX",
+"XXXXXXXX ........ XXXXXXX",
+"XXXXXX . .. .. .. XXXX",
+"XXXX ... ............ ..... XX",
+"XX ..... ........... .... XX",
+"XX . .... ..... .... .. XX",
+"XX ... ..... ..... .... XX",
+"XX ..... .......... ...... XX",
+"XX ........ ...... ........ XX",
+"XX .......... .. .......... XX",
+"XX ............ ............ XX",
+"XX ............. ............ XX",
+"XX ............. ............ XX",
+"XX ............. ............ XX",
+"XX ............. ............ XX",
+"XX ............. ............ XX",
+"XX ............. ............ XX",
+"XX ............. ............ XX",
+"XX ............. ............ XX",
+"XX ............. ............ XX",
+"XX ............. ............ XX",
+"XX ............. ............ XX",
+"XX ............. ............ XX",
+"XX ............. ............ XX",
+"XX ............ ........... XX",
+"XXXX ......... ......... XXXX",
+"XXXXXXX ...... ....... XXXXXX",
+"XXXXXXXXXX .... ..... XXXXXXXX",
+"XXXXXXXXXXXX . .. XXXXXXXXXX",
+"XXXXXXXXXXXXXXX XXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/pi-acces.xpm b/linux/pixmaps/pi-acces.xpm
new file mode 100644
index 0000000..bf4792a
--- /dev/null
+++ b/linux/pixmaps/pi-acces.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *pi_acces[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 3 1",
+" c Gray0",
+". c None",
+"X c #808080",
+/* pixels */
+"..... ........",
+".. X . ...",
+". XXXX XX ...",
+". XX XXXX ..",
+". X .. XXXX .",
+". X ...... XX .",
+". X ........ X .",
+" X ...... X .",
+" XXXXX ... X .",
+" XX XXX X .",
+" .. XXX X .",
+"......... XXX .",
+"........... XXX ",
+"........... XXX ",
+"........... "
+};
diff --git a/linux/pixmaps/pi-brick.xpm b/linux/pixmaps/pi-brick.xpm
new file mode 100644
index 0000000..1690760
--- /dev/null
+++ b/linux/pixmaps/pi-brick.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *pi_brick[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 3 1",
+" c Gray0",
+". c Red",
+"X c None",
+/* pixels */
+"XXXXXX XXXXXX",
+"XXXXX .... XXXXX",
+"XXX .... XXX",
+"X .. .. X",
+"X . ...... . X",
+"X ... .. ... X",
+"X ..... ..... X",
+"X ..... ...... X",
+"X ..... ...... X",
+"X ..... ...... X",
+"X ..... ...... X",
+"X .... .... XX",
+"XXX .. .. XXXX",
+"XXXXX XXXXXX",
+"XXXXXXX XXXXXXXX"
+};
diff --git a/linux/pixmaps/pi-extra.xpm b/linux/pixmaps/pi-extra.xpm
new file mode 100644
index 0000000..5702389
--- /dev/null
+++ b/linux/pixmaps/pi-extra.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *pi_extra[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c None",
+"X c #808080",
+"o c #c0c0c0",
+/* pixels */
+"................",
+"................",
+"...... ......",
+"..... oo ...",
+".... o o ...",
+"... oooooo X ...",
+".. XX ...",
+".. oooooo XX ...",
+".. oooooo XX ...",
+".. oooooo XX ...",
+".. oooooo XX ...",
+".. oooooo X ....",
+".. oooooo .....",
+".. ......",
+"................"
+};
diff --git a/linux/pixmaps/pi-misc.xpm b/linux/pixmaps/pi-misc.xpm
new file mode 100644
index 0000000..2e5d5e0
--- /dev/null
+++ b/linux/pixmaps/pi-misc.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *pi_misc[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"................",
+"................",
+"................",
+"................",
+"................",
+"... .. ...",
+"... .. .. .. ...",
+".. ..",
+".. .......... ..",
+".. .......... ..",
+".. ... ... ..",
+".. .. .... .. ..",
+".. ...... ..",
+"................",
+"................"
+};
diff --git a/linux/pixmaps/pi-plate.xpm b/linux/pixmaps/pi-plate.xpm
new file mode 100644
index 0000000..c253307
--- /dev/null
+++ b/linux/pixmaps/pi-plate.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *pi_plate[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 3 1",
+" c Gray0",
+". c Red",
+"X c None",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXX XXXXXX",
+"XXXXX .... XXXXX",
+"XXX .... XXX",
+"X .. .. X",
+"X . ...... . X",
+"X ... .. ... X",
+"X ..... ..... X",
+"X .... .... XX",
+"XXX .. .. XXXX",
+"XXXXX XXXXXX",
+"XXXXXXX XXXXXXXX"
+};
diff --git a/linux/pixmaps/pi-slope.xpm b/linux/pixmaps/pi-slope.xpm
new file mode 100644
index 0000000..a2d9cdf
--- /dev/null
+++ b/linux/pixmaps/pi-slope.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *pi_slope[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 3 1",
+" c Gray0",
+". c Red",
+"X c None",
+/* pixels */
+"XXXXX XXXXXXX",
+"XXXX .... XXXXXX",
+"XX .... XXXXX",
+" .. . XXX",
+" . ...... . XXX",
+" ... .. ... XX",
+" ..... ..... XX",
+" ...... ...... X",
+" ....... ..... X",
+" ....... ...... ",
+" ........ ..... ",
+"X ....... ... X",
+"XXX ..... .. XX",
+"XXXXX .... XXX",
+"XXXXXXX XXXX"
+};
diff --git a/linux/pixmaps/pi-space.xpm b/linux/pixmaps/pi-space.xpm
new file mode 100644
index 0000000..d5c69b9
--- /dev/null
+++ b/linux/pixmaps/pi-space.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *pi_space[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c Red",
+"X c None",
+"o c Yellow",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXX XX..XX",
+"XXXXX oooo X...X",
+"XXXX oooooo....X",
+"XXX ooooo....XXX",
+"XX. ooo...oo XXX",
+"XX. o...oooo XXX",
+"XX....oooooo XXX",
+"XXXX oooooo XXXX",
+"XXXXX oooo XXXXX",
+"XXXXXX XXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/pi-tech.xpm b/linux/pixmaps/pi-tech.xpm
new file mode 100644
index 0000000..0c1c80a
--- /dev/null
+++ b/linux/pixmaps/pi-tech.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *pi_tech[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 5 1",
+" c Gray0",
+". c None",
+"X c #808080",
+"o c #c0c0c0",
+"O c Gray100",
+/* pixels */
+"...... ......",
+"... . XX . ...",
+".. oo oo . o ..",
+"..X oo oo oo ..",
+". XoooOooo .",
+". ooooX Xoooo .",
+". oooo XX oooo .",
+". ooo ooo .",
+". X o ooOo o o .",
+". X X OO o o .",
+".. X X o o ..",
+".. X oo o ..",
+".. . oo . ..",
+"...... ......",
+"................"
+};
diff --git a/linux/pixmaps/pi-tile.xpm b/linux/pixmaps/pi-tile.xpm
new file mode 100644
index 0000000..f3421f4
--- /dev/null
+++ b/linux/pixmaps/pi-tile.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *pi_tile[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 3 1",
+" c Gray0",
+". c Red",
+"X c None",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXX XXXXXXX",
+"XXXXX .. XXXXX",
+"XXX ...... XXX",
+"X .......... X",
+"X . ...... . X",
+"X ... .. ... X",
+"X ..... ..... X",
+"X .... .... XX",
+"XXX .. .. XXXX",
+"XXXXX XXXXXX",
+"XXXXXXX XXXXXXXX"
+};
diff --git a/linux/pixmaps/pi-train.xpm b/linux/pixmaps/pi-train.xpm
new file mode 100644
index 0000000..149be8f
--- /dev/null
+++ b/linux/pixmaps/pi-train.xpm
@@ -0,0 +1,23 @@
+/* XPM */
+static char *pi_train[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 2 1",
+" c Gray0",
+". c None",
+/* pixels */
+"................",
+"................",
+"...... .... ....",
+".... ..",
+"...... .... ....",
+"...... .... ....",
+".... ..",
+"...... .... ....",
+"...... .... ....",
+".... ..",
+"...... .... ....",
+"...... .... ....",
+".... ..",
+"...... .... ....",
+"................"
+};
diff --git a/linux/pixmaps/st-about.xpm b/linux/pixmaps/st-about.xpm
new file mode 100644
index 0000000..e0dd59e
--- /dev/null
+++ b/linux/pixmaps/st-about.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *st_about[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 3 1",
+" c Gray0",
+". c Yellow",
+"X c None",
+/* pixels */
+"XXXXX XXXXX",
+"XXXX ..... XXXX",
+"XXX .. .. XXX",
+"XXX . XX . XXX",
+"XXX . X .. XXX",
+"XXXX X .. XXXX",
+"XXXXXX .. XXXXX",
+"XXXXXX . XXXXXX",
+"XXXXXX . XXXXXX",
+"XXXXXX . XXXXXX",
+"XXXXXXX XXXXXXX",
+"XXXXXX .. XXXXX",
+"XXXXXX .. XXXXX",
+"XXXXXXX XXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/st-bg.xpm b/linux/pixmaps/st-bg.xpm
new file mode 100644
index 0000000..c7aef77
--- /dev/null
+++ b/linux/pixmaps/st-bg.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *st_bg[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c Gray50",
+"X c Gray75",
+"o c Gray100",
+/* pixels */
+"XXXXXXX XXXXXXX",
+"XXXX. .oo. XXXXX",
+"XX .ooooooo. .XX",
+" .ooooooooooo. X",
+" X .oooooooX X",
+" oX. .ooX . X",
+" XoXoX . . . X",
+" oXoXoX . . . X",
+" XoXoXo . . . X",
+" oXoXoX . . . X",
+" XoXoXo . . . X",
+" .XoXoX . . . X",
+"X. .oXo . . .X",
+"XXX. .X . XXXX",
+"XXXXX. .XXXXXX"
+};
diff --git a/linux/pixmaps/st-copy.xpm b/linux/pixmaps/st-copy.xpm
new file mode 100644
index 0000000..4a1bd19
--- /dev/null
+++ b/linux/pixmaps/st-copy.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *st_copy[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c #00007f",
+"X c None",
+"o c Gray100",
+/* pixels */
+"X XXXXXXXXX",
+"X oooo XXXXXXXX",
+"X oooo o XXXXXXX",
+"X o o ......XXX",
+"X ooooo.oooo..XX",
+"X o .oooo.o.X",
+"X ooooo.o o....",
+"X o .ooooooo.",
+"X ooooo.o o.",
+"X .ooooooo.",
+"XXXXXXX.o o.",
+"XXXXXXX.ooooooo.",
+"XXXXXXX.........",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/st-cut.xpm b/linux/pixmaps/st-cut.xpm
new file mode 100644
index 0000000..eace7c9
--- /dev/null
+++ b/linux/pixmaps/st-cut.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *st_cut[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 3 1",
+" c Gray0",
+". c #00007f",
+"X c None",
+/* pixels */
+"XXXXXX XXX XXXXX",
+"XXXXXX XXX XXXXX",
+"XXXXXX XXX XXXXX",
+"XXXXXX X XXXXX",
+"XXXXXXX X XXXXXX",
+"XXXXXXX XXXXXX",
+"XXXXXXXX XXXXXXX",
+"XXXXXXX. .XXXXXX",
+"XXXXXXX.X...XXXX",
+"XXXXX...X.XX.XXX",
+"XXXX.XX.X.XX.XXX",
+"XXXX.XX.X.XX.XXX",
+"XXXX.XX.XX..XXXX",
+"XXXXX..XXXXXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/st-fast.xpm b/linux/pixmaps/st-fast.xpm
new file mode 100644
index 0000000..beeffdc
--- /dev/null
+++ b/linux/pixmaps/st-fast.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *st_fast[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 3 1",
+" c Gray0",
+". c Gray50",
+"X c Gray75",
+/* pixels */
+"XXXXXX. .XXXXXX",
+"XXXX. XX.X .XXXX",
+"XX .XXXX.XXX .XX",
+" XXXXXX.XXXX. X",
+" X .XXXX.XXX X X",
+" XX. .XXX. .XX X",
+" XXXXX. XXXXX X",
+" XXXXXX .XXXXX X",
+" XXXXXX .XXXXX X",
+" XXXX.. X..XXX X",
+" X...XX XXX..X X",
+" .XXXXX XXXXXX X",
+"X. .XXX XXXX. .X",
+"XXX. .X X. .XXXX",
+"XXXXXX. XXXXXXX"
+};
diff --git a/linux/pixmaps/st-help.xpm b/linux/pixmaps/st-help.xpm
new file mode 100644
index 0000000..b96e526
--- /dev/null
+++ b/linux/pixmaps/st-help.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *st_help[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c #00007f",
+"X c Gray50",
+"o c Gray75",
+/* pixels */
+"o ooooooo.....Xo",
+"o ooooo..ooX..X",
+"o ooo..Xooo...",
+"o oo..Xooo...",
+"o oX..ooX..X",
+"o ooooo..Xo",
+"o ooo..ooo",
+"o o..Xooo",
+"o oooo..Xooo",
+"o o oooooooooo",
+"o ooo ooo...ooo",
+"ooooo ooo...ooo",
+"oooooo oooooooo",
+"oooooo oooooooo",
+"oooooooooooooooo"
+};
diff --git a/linux/pixmaps/st-new.xpm b/linux/pixmaps/st-new.xpm
new file mode 100644
index 0000000..a34f0d2
--- /dev/null
+++ b/linux/pixmaps/st-new.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *st_new[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 3 1",
+" c Gray0",
+". c None",
+"X c Gray100",
+/* pixels */
+"... .....",
+"... XXXXXX ....",
+"... XXXXXX X ...",
+"... XXXXXX ..",
+"... XXXXXXXXX ..",
+"... XXXXXXXXX ..",
+"... XXXXXXXXX ..",
+"... XXXXXXXXX ..",
+"... XXXXXXXXX ..",
+"... XXXXXXXXX ..",
+"... XXXXXXXXX ..",
+"... XXXXXXXXX ..",
+"... ..",
+"................",
+"................"
+};
diff --git a/linux/pixmaps/st-open.xpm b/linux/pixmaps/st-open.xpm
new file mode 100644
index 0000000..62424f3
--- /dev/null
+++ b/linux/pixmaps/st-open.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *st_open[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 5 1",
+" c Gray0",
+". c #7f7f00",
+"X c Yellow",
+"o c None",
+"O c Gray100",
+/* pixels */
+"oooooooooo ooo",
+"ooooooooo ooo o ",
+"oooooooooooooo ",
+"oo oooooooo ",
+"o OXO oooo",
+"o XOXOXOXOX oooo",
+"o OXOXOXOXO oooo",
+"o XOXO ",
+"o OXO ......... ",
+"o XO ......... o",
+"o O ......... oo",
+"o ......... ooo",
+"o oooo",
+"oooooooooooooooo",
+"oooooooooooooooo"
+};
diff --git a/linux/pixmaps/st-paste.xpm b/linux/pixmaps/st-paste.xpm
new file mode 100644
index 0000000..526f54a
--- /dev/null
+++ b/linux/pixmaps/st-paste.xpm
@@ -0,0 +1,29 @@
+/* XPM */
+static char *st_paste[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 8 1",
+" c Gray0",
+". c #00007f",
+"X c #7f7f00",
+"o c Gray50",
+"O c Yellow",
+"+ c None",
+"a c Gray75",
+"@ c Gray100",
+/* pixels */
+"++++++ ++++++",
+"++ OO ++",
+"+ oXo O O XoX +",
+"+ Xo aaaaaa Xo +",
+"+ oX oX +",
+"+ XoXoXoXoXoXo +",
+"+ oXoXo....... +",
+"+ XoXoX.@@@@@..+",
+"+ oXoXo.@@@@@.@.",
+"+ XoXoX.@...@...",
+"+ oXoXo.@@@@@@@.",
+"+ XoXoX.@.....@.",
+"++ .@@@@@@@.",
+"+++++++.........",
+"++++++++++++++++"
+};
diff --git a/linux/pixmaps/st-prev.xpm b/linux/pixmaps/st-prev.xpm
new file mode 100644
index 0000000..5b70b70
--- /dev/null
+++ b/linux/pixmaps/st-prev.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *st_prev[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 5 1",
+" c Gray0",
+". c Gray50",
+"X c Cyan",
+"o c Gray75",
+"O c Gray100",
+/* pixels */
+" ooooooo",
+" OOOOOOO oooooo",
+" OOOOOOO o ooooo",
+" OOOOOOO oooo",
+" OOOOOOOOOO oooo",
+" OOOOOOO oooo",
+" OOOOOO .oo. ooo",
+" OOOOO .XXo.. oo",
+" OOOOO oXoo.o oo",
+" OOOOO oooo.o oo",
+" OOOOO .ooX.. oo",
+" OOOOOO .oo. .oo",
+" OOOOOOO . o",
+" OOOOOOOOOO o ",
+" oo "
+};
diff --git a/linux/pixmaps/st-print.xpm b/linux/pixmaps/st-print.xpm
new file mode 100644
index 0000000..a76d3ec
--- /dev/null
+++ b/linux/pixmaps/st-print.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *st_print[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 5 1",
+" c Gray0",
+". c Gray50",
+"X c Yellow",
+"o c Gray75",
+"O c Gray100",
+/* pixels */
+"ooooo oo",
+"oooo OOOOOOOO oo",
+"oooo O O ooo",
+"ooo OOOOOOOO ooo",
+"ooo O O o",
+"oo OOOOOOOO o o ",
+"o o o ",
+" oooooooooo o o ",
+" oo ",
+" oooooo...oo o o",
+" ooooooXXXoo o",
+" o o",
+"o ooooooooo o oo",
+"oo ooo",
+"oooooooooooooooo"
+};
diff --git a/linux/pixmaps/st-redo.xpm b/linux/pixmaps/st-redo.xpm
new file mode 100644
index 0000000..0487db7
--- /dev/null
+++ b/linux/pixmaps/st-redo.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *st_redo[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 3 1",
+" c #00007f",
+". c Gray50",
+"X c None",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXX. XXXXXXXX",
+"XX. XXXX XXX XX",
+"XX XXXXXXX X XX",
+"XX XXXXXXXX XX",
+"XX XXXXXXX XX",
+"XX. XXXXX XX",
+"XXX .XXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/pixmaps/st-save.xpm b/linux/pixmaps/st-save.xpm
new file mode 100644
index 0000000..7f7b00d
--- /dev/null
+++ b/linux/pixmaps/st-save.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *st_save[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c #7f7f00",
+"X c Gray75",
+"o c None",
+/* pixels */
+"o o",
+"o . XXXXXXXX X o",
+"o . XXXXXXXX o",
+"o . XXXXXXXX . o",
+"o . XXXXXXXX . o",
+"o . XXXXXXXX . o",
+"o . XXXXXXXX . o",
+"o .. .. o",
+"o ............ o",
+"o .. . o",
+"o .. XX . o",
+"o .. XX . o",
+"o .. XX . o",
+"oo o",
+"oooooooooooooooo"
+};
diff --git a/linux/pixmaps/st-snap.xpm b/linux/pixmaps/st-snap.xpm
new file mode 100644
index 0000000..42a7495
--- /dev/null
+++ b/linux/pixmaps/st-snap.xpm
@@ -0,0 +1,27 @@
+/* XPM */
+static char *st_snap[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 6 1",
+" c Gray0",
+". c #7f0000",
+"X c Gray50",
+"o c Red",
+"O c Yellow",
+"+ c None",
+/* pixels */
+"++++X+++++++X+++",
+"++++X+++++++X+++",
+"+++o. ++++++X+++",
+"++oOo. +++++X+++",
+"XX.oo. XXXXXXXXX",
+"++ .. +++++X+++",
+"+++ ++++++X+++",
+"++++X+++++++X+++",
+"++++X+++++++X+++",
+"++++X+++++++X+++",
+"++++X+++++++X+++",
+"++++X+++++++X+++",
+"XXXXXXXXXXXXXXXX",
+"++++X+++++++X+++",
+"++++X+++++++X+++"
+};
diff --git a/linux/pixmaps/st-snapa.xpm b/linux/pixmaps/st-snapa.xpm
new file mode 100644
index 0000000..e9694f2
--- /dev/null
+++ b/linux/pixmaps/st-snapa.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *st_snapa[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 4 1",
+" c Gray0",
+". c #7f0000",
+"X c Gray50",
+"o c Gray75",
+/* pixels */
+"ooooooooooo oooo",
+"oooooooooo ooooo",
+"ooooooooo oooooo",
+"oooooooo ooo",
+"ooooooo o oooo",
+"ooXooo oo oooo",
+"X....oooo oo ooo",
+"......oooooo ooo",
+"..Xo...oooooo oo",
+"..ooo..oooooo oo",
+"...ooo oooo ",
+"o...ooo ooo o",
+"oo..ooooooooo oo",
+" o ooo ",
+"oooo oooooooooo"
+};
diff --git a/linux/pixmaps/st-undo.xpm b/linux/pixmaps/st-undo.xpm
new file mode 100644
index 0000000..de76087
--- /dev/null
+++ b/linux/pixmaps/st-undo.xpm
@@ -0,0 +1,24 @@
+/* XPM */
+static char *st_undo[] = {
+/* columns rows colors chars-per-pixel */
+"16 15 3 1",
+" c #00007f",
+". c Gray50",
+"X c None",
+/* pixels */
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXX .XXX",
+"XX XXX XXXX .XX",
+"XX X XXXXXXX XX",
+"XX XXXXXXXX XX",
+"XX XXXXXXX XX",
+"XX XXXXX .XX",
+"XXXXXXXXXXX. XXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX",
+"XXXXXXXXXXXXXXXX"
+};
diff --git a/linux/system.cpp b/linux/system.cpp
new file mode 100644
index 0000000..be6343c
--- /dev/null
+++ b/linux/system.cpp
@@ -0,0 +1,622 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <GL/glx.h>
+#include <gtk/gtk.h>
+#include "gdkgl.h"
+#include "gtkglarea.h"
+#include "camera.h"
+#include "project.h"
+#include "system.h"
+#include "main.h"
+#include "menu.h"
+#include "toolbar.h"
+#include "dialogs.h"
+#include "globals.h"
+
+// String
+char* strupr(char* string)
+{
+ char *cp;
+ for (cp=string; *cp; ++cp)
+ {
+ if ('a' <= *cp && *cp <= 'z')
+ *cp += 'A' - 'a';
+ }
+}
+
+char* strlwr(char* string)
+{
+ char *cp;
+ for (cp = string; *cp; ++cp)
+ {
+ if ('A' <= *cp && *cp <= 'Z')
+ *cp += 'a' - 'A';
+ }
+}
+
+
+
+// Profile
+int SystemGetProfileInt(const char* section, const char* entry, const int defaultvalue)
+{
+ return defaultvalue;
+}
+
+bool SystemSetProfileInt(const char* section, const char* entry, const int value)
+{
+ return true;
+}
+
+bool SystemSetProfileString(const char* section, const char* entry, const char* value)
+{
+ return true;
+}
+
+const char* SystemGetProfileString(const char* section, const char* entry, const char* defaultvalue)
+{
+ return defaultvalue;
+}
+
+// User Interface
+void SystemUpdateViewport(int new_vp, int old_vp)
+{
+ ignore_commands = true;
+ gtk_check_menu_item_set_state (GTK_CHECK_MENU_ITEM (main_menu.view_viewports[new_vp]), TRUE);
+ ignore_commands = false;
+}
+
+static void create_bitmap_and_mask_from_xpm (GdkBitmap **bitmap, GdkBitmap **mask, gchar **xpm)
+{
+ int height, width, colors;
+ char pixmap_buffer [(32 * 32)/8];
+ char mask_buffer [(32 * 32)/8];
+ int x, y, pix;
+ int transparent_color, black_color;
+
+ sscanf (xpm [0], "%d %d %d %d", &height, &width, &colors, &pix);
+
+ g_assert (height == 32);
+ g_assert (width == 32);
+ g_assert (colors == 3);
+
+ transparent_color = ' ';
+ black_color = '.';
+
+ for (y = 0; y < 32; y++)
+ for (x = 0; x < 32;)
+ {
+ char value = 0, maskv = 0;
+
+ for (pix = 0; pix < 8; pix++, x++)
+ if (xpm [4+y][x] != transparent_color)
+ {
+ maskv |= 1 << pix;
+
+ if (xpm [4+y][x] != black_color)
+ value |= 1 << pix;
+ }
+
+ pixmap_buffer [(y * 4 + x/8)-1] = value;
+ mask_buffer [(y * 4 + x/8)-1] = maskv;
+ }
+
+ *bitmap = gdk_bitmap_create_from_data (NULL, pixmap_buffer, 32, 32);
+ *mask = gdk_bitmap_create_from_data (NULL, mask_buffer, 32, 32);
+}
+
+void SystemUpdateAction(int new_action, int old_action)
+{
+#include "pixmaps/cr_brick.xpm"
+#include "pixmaps/cr_light.xpm"
+#include "pixmaps/cr_spot.xpm"
+#include "pixmaps/cr_cam.xpm"
+#include "pixmaps/cr_sel.xpm"
+#include "pixmaps/cr_selm.xpm"
+#include "pixmaps/cr_move.xpm"
+#include "pixmaps/cr_rot.xpm"
+#include "pixmaps/cr_paint.xpm"
+#include "pixmaps/cr_erase.xpm"
+#include "pixmaps/cr_pan.xpm"
+#include "pixmaps/cr_rotv.xpm"
+#include "pixmaps/cr_roll.xpm"
+#include "pixmaps/cr_zoom.xpm"
+#include "pixmaps/cr_zoomr.xpm"
+
+ GtkWidget* button;
+ char** xpm = NULL;
+ int x, y;
+
+ switch (new_action)
+ {
+ case LC_ACTION_SELECT: button = tool_toolbar.select;
+ {
+ x = 0; y = 2;
+ if (IsKeyDown(KEY_CONTROL))
+ xpm = cr_selm;
+ else
+ xpm = cr_sel;
+ } break;
+ case LC_ACTION_INSERT:
+ button = tool_toolbar.brick; xpm = cr_brick; x = 8; y = 3; break;
+ case LC_ACTION_LIGHT:
+ button = tool_toolbar.light; xpm = cr_light; x = 15; y = 15; break;
+ case LC_ACTION_SPOTLIGHT:
+ button = tool_toolbar.spot; xpm = cr_spot; x = 7; y = 10; break;
+ case LC_ACTION_CAMERA:
+ button = tool_toolbar.camera; xpm = cr_cam; x = 15; y = 9; break;
+ case LC_ACTION_MOVE:
+ button = tool_toolbar.move; xpm = cr_move; x = 15; y = 15; break;
+ case LC_ACTION_ROTATE:
+ button = tool_toolbar.rotate; xpm = cr_rot; x = 15; y = 15; break;
+ case LC_ACTION_ERASER:
+ button = tool_toolbar.erase; xpm = cr_erase; x = 0; y = 10; break;
+ case LC_ACTION_PAINT:
+ button = tool_toolbar.paint; xpm = cr_paint; x = 14; y = 14; break;
+ case LC_ACTION_ZOOM:
+ button = tool_toolbar.zoom; xpm = cr_zoom; x = 15; y = 15; break;
+ case LC_ACTION_ZOOM_REGION:
+ button = tool_toolbar.zoomreg; xpm = cr_zoomr; x = 9; y = 9; break;
+ case LC_ACTION_PAN:
+ button = tool_toolbar.pan; xpm = cr_pan; x = 15; y = 15; break;
+ case LC_ACTION_ROTATE_VIEW:
+ button = tool_toolbar.rotview; xpm = cr_rotv; x = 15; y = 15; break;
+ case LC_ACTION_ROLL:
+ button = tool_toolbar.roll; xpm = cr_roll; x = 15; y = 15; break;
+ }
+
+ GdkBitmap *bitmap;
+ GdkBitmap *mask;
+ GdkCursor *cursor;
+ GdkColor white = {0, 0xffff, 0xffff, 0xffff};
+ GdkColor black = {0, 0x0000, 0x0000, 0x0000};
+
+ if (xpm != NULL)
+ {
+ create_bitmap_and_mask_from_xpm (&bitmap, &mask, xpm);
+ cursor = gdk_cursor_new_from_pixmap (bitmap, mask, &white, &black, x, y);
+ gdk_window_set_cursor (drawing_area->window, cursor);
+ }
+ else
+ {
+ cursor = gdk_cursor_new (GDK_LEFT_PTR);
+ gdk_window_set_cursor (drawing_area->window, cursor);
+ gdk_cursor_destroy (cursor);
+ }
+
+ ignore_commands = true;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE);
+ ignore_commands = false;
+}
+
+void SystemSetGroup(int new_group)
+{
+ groupsbar_set(new_group);
+}
+
+void SystemUpdateColorList(int new_color)
+{
+ colorlist_set(new_color);
+}
+
+void SystemUpdateRenderingMode(bool bBackground, bool bFast)
+{
+ if (bFast)
+ {
+ gtk_widget_set_sensitive (main_toolbar.bg, TRUE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(main_toolbar.bg), bBackground);
+ }
+ else
+ {
+ gtk_widget_set_sensitive (main_toolbar.bg, FALSE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(main_toolbar.bg), FALSE);
+ }
+
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(main_toolbar.fast), bFast);
+}
+
+void SystemUpdateUndoRedo(char* undo, char* redo)
+{
+ char text[50];
+
+ strcpy(text, "Undo ");
+ if (undo)
+ strcat(text, undo);
+ gtk_label_set_text (GTK_LABEL(GTK_BIN(main_menu.edit_undo)->child), text);
+ strcpy(text, "Redo ");
+ if (redo)
+ strcat(text, redo);
+ gtk_label_set_text (GTK_LABEL(GTK_BIN(main_menu.edit_redo)->child), text);
+
+ gtk_widget_set_sensitive (main_toolbar.undo, undo != NULL);
+ gtk_widget_set_sensitive (main_toolbar.redo, redo != NULL);
+ gtk_widget_set_sensitive (main_menu.edit_undo, undo != NULL);
+ gtk_widget_set_sensitive (main_menu.edit_redo, redo != NULL);
+}
+
+void SystemUpdateSnap(const unsigned long snap)
+{
+ ignore_commands = true;
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(main_toolbar.angle), (snap & LC_DRAW_SNAP_A) != 0);
+ ignore_commands = false;
+
+ // TODO: popup menu
+}
+
+void SystemUpdateCurrentCamera(Camera* pOld, Camera* pNew, Camera* pCamera)
+{
+ int i;
+
+ for (i = 0; pCamera; i++, pCamera = pCamera->m_pNext)
+ if (pNew == pCamera)
+ break;
+
+ ignore_commands = true;
+ gtk_check_menu_item_set_state (GTK_CHECK_MENU_ITEM (main_menu.view_cameras[i]), TRUE);
+ ignore_commands = false;
+}
+
+void SystemUpdateCameraMenu(Camera* pCamera)
+{
+ Camera* pFirst = pCamera;
+ gtk_menu_item_remove_submenu (GTK_MENU_ITEM (main_menu.view_cameras_popup));
+ GtkWidget *menu_item = NULL, *menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu (GTK_MENU_ITEM (main_menu.view_cameras_popup), menu);
+
+ int i;
+ for (i = 0; pCamera; i++, pCamera = pCamera->m_pNext)
+ if (i > 6)
+ {
+ GSList* grp = menu_item ? gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menu_item)) : NULL;
+ menu_item = gtk_radio_menu_item_new_with_label (grp, pCamera->GetName());
+ gtk_menu_append (GTK_MENU (menu), menu_item);
+ gtk_widget_show (menu_item);
+ main_menu.view_cameras[i] = menu_item;
+ gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (OnCommand), (void*)(i + ID_CAMERA_FIRST));
+ }
+
+ if (i > 7)
+ {
+ GtkWidget* sep = gtk_menu_item_new ();
+ gtk_menu_append (GTK_MENU (menu), sep);
+ gtk_widget_set_sensitive (sep, FALSE);
+ gtk_widget_show (sep);
+ }
+
+ for (pCamera = pFirst, i = 0; pCamera && (i < 7); i++, pCamera = pCamera->m_pNext)
+ {
+ GSList* grp = menu_item ? gtk_radio_menu_item_group (GTK_RADIO_MENU_ITEM (menu_item)) : NULL;
+ menu_item = gtk_radio_menu_item_new_with_label (grp, pCamera->GetName());
+ gtk_menu_append (GTK_MENU (menu), menu_item);
+ gtk_widget_show (menu_item);
+ main_menu.view_cameras[i] = menu_item;
+ gtk_signal_connect (GTK_OBJECT (menu_item), "activate", GTK_SIGNAL_FUNC (OnCommand), (void*)(i + ID_CAMERA_FIRST));
+ }
+}
+
+void SystemUpdateTime(bool bAnimation, int nTime, int nTotal)
+{
+ gtk_widget_set_sensitive (anim_toolbar.first, nTime != 1);
+ gtk_widget_set_sensitive (anim_toolbar.prev, nTime > 1);
+ gtk_widget_set_sensitive (anim_toolbar.next, nTime < nTotal);
+ gtk_widget_set_sensitive (anim_toolbar.last, nTime != nTotal);
+ gtk_widget_set_sensitive (main_menu.view_step_first, nTime != 1);
+ gtk_widget_set_sensitive (main_menu.view_step_prev, nTime > 1);
+ gtk_widget_set_sensitive (main_menu.view_step_next, nTime < nTotal);
+ gtk_widget_set_sensitive (main_menu.view_step_last, nTime != nTotal);
+
+ char text[11];
+ if (bAnimation)
+ sprintf(text, "%i/%i", nTime, nTotal);
+ else
+ sprintf(text, " Step %i ", nTime);
+ gtk_label_set (GTK_LABEL (label_step), text);
+
+ // step dlg
+}
+
+void SystemUpdateAnimation(bool bAnimation, bool bAddKeys)
+{
+ gtk_widget_set_sensitive (anim_toolbar.play, bAnimation);
+ gtk_widget_set_sensitive (anim_toolbar.stop, FALSE);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(anim_toolbar.anim), bAnimation);
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(anim_toolbar.keys), bAddKeys);
+ gtk_label_set_text (GTK_LABEL(GTK_BIN(main_menu.piece_copy_keys)->child),
+ bAnimation ? "Copy Keys from Instructions" : "Copy Keys from Animation");
+}
+
+void SystemUpdateMoveSnap(unsigned short move_snap)
+{
+ char text[11];
+ if (move_snap)
+ sprintf (text, "Move x%i", move_snap);
+ else
+ strcpy (text, "Move /2");
+
+ gtk_label_set (GTK_LABEL (label_snap), text);
+}
+
+void SystemUpdateSelected(unsigned long flags)
+{
+ // select all/none/invert/by name (menu)
+ gtk_widget_set_sensitive (main_menu.edit_select_all, (flags & LC_SEL_UNSELECTED) != 0);
+ gtk_widget_set_sensitive (main_menu.edit_select_none, flags &
+ (LC_SEL_PIECE|LC_SEL_CAMERA|LC_SEL_LIGHT) != 0);
+ gtk_widget_set_sensitive (main_menu.edit_select_invert, (flags & LC_SEL_NO_PIECES) == 0);
+ gtk_widget_set_sensitive (main_menu.edit_select_byname, (flags & LC_SEL_NO_PIECES) == 0);
+
+ // cut, copy (menu/toolbar)
+ gtk_widget_set_sensitive (main_menu.edit_cut, (flags & (LC_SEL_PIECE|LC_SEL_CAMERA|LC_SEL_LIGHT)) != 0);
+ gtk_widget_set_sensitive (main_menu.edit_copy, (flags & (LC_SEL_PIECE|LC_SEL_CAMERA|LC_SEL_LIGHT)) != 0);
+ gtk_widget_set_sensitive (main_toolbar.cut, (flags & (LC_SEL_PIECE|LC_SEL_CAMERA|LC_SEL_LIGHT)) != 0);
+ gtk_widget_set_sensitive (main_toolbar.copy, (flags & (LC_SEL_PIECE|LC_SEL_CAMERA|LC_SEL_LIGHT)) != 0);
+
+ // delete, array, hide sel/unsel, unhideall, copykeys (menu)
+ gtk_widget_set_sensitive (main_menu.piece_delete, (flags &
+ (LC_SEL_PIECE|LC_SEL_CAMERA|LC_SEL_LIGHT)) != 0);
+ gtk_widget_set_sensitive (main_menu.piece_array, (flags & LC_SEL_PIECE) != 0);
+ gtk_widget_set_sensitive (main_menu.piece_hide_sel, (flags & LC_SEL_PIECE) != 0);
+ gtk_widget_set_sensitive (main_menu.piece_hide_unsel, (flags & LC_SEL_UNSELECTED) != 0);
+ gtk_widget_set_sensitive (main_menu.piece_unhide, (flags & LC_SEL_HIDDEN) != 0);
+ gtk_widget_set_sensitive (main_menu.piece_copy_keys, (flags &
+ (LC_SEL_PIECE|LC_SEL_CAMERA|LC_SEL_LIGHT)) != 0);
+
+ // groups (menu)
+ gtk_widget_set_sensitive (main_menu.piece_group, (flags & LC_SEL_CANGROUP) != 0);
+ gtk_widget_set_sensitive (main_menu.piece_ungroup, (flags & LC_SEL_GROUP) != 0);
+ gtk_widget_set_sensitive (main_menu.piece_group_add, (flags &
+ (LC_SEL_GROUP|LC_SEL_FOCUSGROUP)) == LC_SEL_GROUP);
+ gtk_widget_set_sensitive (main_menu.piece_group_remove, (flags & LC_SEL_FOCUSGROUP) != 0);
+ gtk_widget_set_sensitive (main_menu.piece_edit_groups, (flags & LC_SEL_NO_PIECES) == 0);
+
+ gtk_widget_set_sensitive (tool_toolbar.prev, (flags & LC_SEL_PIECE) != 0);
+ gtk_widget_set_sensitive (tool_toolbar.next, (flags & LC_SEL_PIECE) != 0);
+}
+
+void SystemUpdateRecentMenu(char names[4][LC_MAXPATH])
+{
+ if (strlen(names[0]) == 0)
+ {
+ gtk_label_set_text (GTK_LABEL(GTK_BIN(main_menu.file_recent[0])->child), "Recent Files");
+ gtk_widget_set_sensitive (main_menu.file_recent[0], FALSE);
+ }
+ else
+ {
+ gtk_label_set_text (GTK_LABEL(GTK_BIN(main_menu.file_recent[0])->child), names[0]);
+ gtk_widget_set_sensitive (main_menu.file_recent[0], TRUE);
+ }
+
+ for (int i = 1; i < 4; i++)
+ {
+ GtkWidget* menu_item = main_menu.file_recent[i];
+ if (strlen(names[i]) == 0)
+ gtk_widget_hide (menu_item);
+ else
+ {
+ gtk_widget_show (menu_item);
+ gtk_label_set_text (GTK_LABEL(GTK_BIN(menu_item)->child), names[i]);
+ }
+ }
+}
+
+void SystemUpdatePaste(bool enable)
+{
+ gtk_widget_set_sensitive (main_toolbar.paste, enable);
+ gtk_widget_set_sensitive (main_menu.edit_paste, enable);
+}
+
+void SystemUpdatePlay(bool play, bool stop)
+{
+ gtk_widget_set_sensitive (anim_toolbar.play, play);
+ gtk_widget_set_sensitive (anim_toolbar.stop, stop);
+}
+
+void SystemUpdateFocus(void* object, unsigned char type)
+{
+ // TODO: modify dialog
+ char text[32];
+ float pos[3];
+ project->GetFocusPosition(pos);
+ sprintf (text, "X: %.2f Y: %.2f Z: %.2f", pos[0], pos[1], pos[2]);
+
+ gtk_label_set (GTK_LABEL (label_position), text);
+}
+
+// Memory render
+typedef struct
+{
+ int width, height;
+ GdkGLPixmap *glpixmap;
+ GdkGLContext *context;
+ GdkPixmap *pixmap;
+} LC_RENDER;
+
+void* SystemStartRender(int width, int height)
+{
+ GdkVisual *visual;
+ LC_RENDER* render = (LC_RENDER*)malloc(sizeof(LC_RENDER));
+ int attrlist[] = { GLX_RGBA, GLX_DEPTH_SIZE, 16, 0 };
+ visual = gdk_gl_choose_visual(attrlist);
+
+ render->width = width;
+ render->height = height;
+ render->context = gdk_gl_context_new(visual);
+ render->pixmap = gdk_pixmap_new(NULL, width, height, visual->depth);
+ render->glpixmap = gdk_gl_pixmap_new(visual, render->pixmap);
+ gdk_gl_pixmap_make_current(render->glpixmap, render->context);
+
+ return render;
+}
+
+void SystemFinishRender(void* param)
+{
+ LC_RENDER* render = (LC_RENDER*)param;
+
+ gtk_gl_area_make_current(GTK_GL_AREA(drawing_area));
+ gdk_gl_context_unref(render->context);
+ gdk_gl_pixmap_unref(render->glpixmap);
+ gdk_pixmap_unref(render->pixmap);
+ free(render);
+}
+
+LC_IMAGE* SystemGetRenderImage(void* param)
+{
+ LC_RENDER* render = (LC_RENDER*)param;
+ LC_IMAGE* image = (LC_IMAGE*)malloc(sizeof(LC_IMAGE)+
+ (render->width*render->height*3));
+
+ image->width = render->width;
+ image->height = render->height;
+ image->bits = (char*)image + sizeof(LC_IMAGE);
+
+ glFinish();
+
+ int x, y;
+ unsigned char* p = (unsigned char*)image->bits;
+
+ GdkImage* gi = gdk_image_get(render->pixmap, 0, 0,
+ render->width, render->height);
+ for (y = 0; y < render->height; y++)
+ for (x = 0; x < render->width; x++)
+ {
+ guint32 ui = gdk_image_get_pixel (gi, x, y);
+ *p = (ui & 0xFF0000) >> 16; p++;
+ *p = (ui & 0x00FF00) >> 8; p++;
+ *p = (ui & 0x0000FF); p++;
+ }
+
+ gdk_image_destroy(gi);
+
+ return image;
+}
+
+
+void SystemInit()
+{
+}
+
+void SystemFinish()
+{
+}
+
+int SystemDoMessageBox(char* prompt, int mode)
+{
+ return msgbox_execute(prompt, mode);
+}
+
+bool SystemDoDialog(int mode, void* param)
+{
+ switch (mode)
+ {
+ case LC_DLG_FILE_OPEN: {
+ return filedlg_execute("Open File", (char*)param) == LC_OK;
+ } break;
+
+ case LC_DLG_FILE_SAVE: {
+ return filedlg_execute("Save File", (char*)param) == LC_OK;
+ } break;
+
+ case LC_DLG_FILE_MERGE: {
+ return filedlg_execute("Merge File", (char*)param) == LC_OK;
+ } break;
+
+ case LC_DLG_ABOUT: {
+ return aboutdlg_execute(param) == LC_OK;
+ } break;
+
+ case LC_DLG_ARRAY: {
+ return arraydlg_execute(param) == LC_OK;
+ } break;
+
+ case LC_DLG_HTML: {
+ return htmldlg_execute(param) == LC_OK;
+ } break;
+
+ case LC_DLG_POVRAY: {
+ return povraydlg_execute(param) == LC_OK;
+ } break;
+
+ case LC_DLG_WAVEFRONT: {
+ return filedlg_execute("Save File", (char*)param) == LC_OK;
+ } break;
+
+ case LC_DLG_PREFERENCES: {
+ return preferencesdlg_execute(param) == LC_OK;
+ } break;
+
+ case LC_DLG_PICTURE_SAVE: {
+ } break;
+
+ case LC_DLG_MINIFIG: {
+ } break;
+
+ case LC_DLG_PROPERTIES: {
+ return propertiesdlg_execute(param) == LC_OK;
+ } break;
+
+ case LC_DLG_SELECTBYNAME: {
+ } break;
+
+ case LC_DLG_STEPCHOOSE: {
+ } break;
+
+ case LC_DLG_GROUP: {
+ } break;
+ }
+
+ return false;
+}
+
+void SystemDoPopupMenu(int nMenu, int x, int y)
+{
+}
+
+void SystemDoWaitCursor(int code)
+{
+ if (code == 1)
+ {
+ GdkCursor *cursor = gdk_cursor_new (GDK_WATCH);
+ gdk_window_set_cursor (main_window->window, cursor);
+ gdk_cursor_destroy (cursor);
+ }
+ else
+ {
+ GdkCursor *cursor = gdk_cursor_new (GDK_LEFT_PTR);
+ gdk_window_set_cursor (main_window->window, cursor);
+ gdk_cursor_destroy (cursor);
+ }
+}
+
+void SystemExportClipboard(File* clip)
+{
+}
+
+File* SystemImportClipboard()
+{
+ return NULL;
+}
+
+void SystemSetWindowCaption(char* caption)
+{
+ gtk_window_set_title (GTK_WINDOW (main_window), caption);
+}
+
+void SystemRedrawView()
+{
+ gtk_widget_draw(drawing_area, NULL);
+}
+
+void SystemPieceComboAdd(char* name)
+{
+}
+
+
+void SystemCaptureMouse()
+{
+}
+
+void SystemReleaseMouse()
+{
+}
+
+
diff --git a/linux/system.h b/linux/system.h
new file mode 100644
index 0000000..2f53e3e
--- /dev/null
+++ b/linux/system.h
@@ -0,0 +1,109 @@
+//
+// system.h
+////////////////////////////////////////////////////
+
+#ifndef _SYSTEM_H_
+#define _SYSTEM_H_
+
+class File;
+class Camera;
+class PieceInfo;
+#include "defines.h"
+#include "typedefs.h"
+
+// Profile
+int SystemGetProfileInt(const char* section, const char* entry, const int defaultvalue);
+bool SystemSetProfileInt(const char* section, const char* entry, const int value);
+bool SystemSetProfileString(const char* section, const char* entry, const char* value);
+const char* SystemGetProfileString(const char* section, const char* entry, const char* defaultvalue);
+
+// User Interface
+void SystemUpdateViewport(int nNew, int nOld);
+void SystemUpdateAction(int nNew, int nOld);
+void SystemUpdateColorList(int nNew);
+void SystemUpdateRenderingMode(bool bBackground, bool bFast);
+void SystemUpdateUndoRedo(char* undo, char* redo);
+void SystemUpdateSnap(const unsigned long nSnap);
+void SystemUpdateCurrentCamera(Camera* pOld, Camera* pNew, Camera* pCamera);
+void SystemUpdateCameraMenu(Camera* pCamera);
+void SystemUpdateTime(bool bAnimation, int nTime, int nTotal);
+void SystemUpdateAnimation(bool bAnimation, bool bAddKeys);
+void SystemUpdateMoveSnap(unsigned short nMoveSnap);
+void SystemUpdateSelected(unsigned long flags);
+void SystemUpdateRecentMenu(char names[4][LC_MAXPATH]);
+void SystemUpdatePaste(bool enable);
+void SystemUpdatePlay(bool play, bool stop);
+void SystemUpdateFocus(void* object, unsigned char type);
+
+// Memory render
+void* SystemStartRender(int width, int height);
+void SystemFinishRender(void* param);
+LC_IMAGE* SystemGetRenderImage(void* param);
+
+#define LC_OK 1
+#define LC_CANCEL 2
+#define LC_ABORT 3
+#define LC_RETRY 4
+#define LC_IGNORE 5
+#define LC_YES 6
+#define LC_NO 7
+
+#define LC_MB_OK 0x001
+#define LC_MB_OKCANCEL 0x002
+//#define LC_MB_ABORTRETRYIGNORE 0x004
+#define LC_MB_YESNOCANCEL 0x008
+#define LC_MB_YESNO 0x010
+//#define LC_MB_RETRYCANCEL 0x020
+#define LC_MB_ICONERROR 0x100
+#define LC_MB_ICONQUESTION 0x200
+#define LC_MB_ICONWARNING 0x400
+#define LC_MB_ICONINFORMATION 0x800
+
+#define LC_MB_TYPEMASK 0x0FF
+#define LC_MB_ICONMASK 0xF00
+
+void SystemInit();
+void SystemFinish();
+int SystemDoMessageBox(char* prompt, int nMode);
+bool SystemDoDialog(int nMode, void* param);
+void SystemDoPopupMenu(int nMenu, int x, int y);
+void SystemDoWaitCursor(int nCode);
+
+void SystemSetGroup(int nNew);
+void SystemSetWindowCaption(char* caption);
+void SystemRedrawView();
+void SystemPieceComboAdd(char* name);
+
+void SystemCaptureMouse();
+void SystemReleaseMouse();
+
+void SystemExportClipboard(File* clip);
+File* SystemImportClipboard();
+
+inline void SystemPumpMessages()
+{
+}
+
+inline long SystemGetTicks()
+{
+ return 0;//GetTickCount();
+}
+
+inline void SystemSwapBuffers()
+{
+ // SwapBuffers(wglGetCurrentDC());
+}
+
+inline bool IsKeyDown(int key)
+{
+ return false;//(GetKeyState(key) < 0);
+}
+
+#endif // _SYSTEM_H_
+
+
+
+
+
+
+
diff --git a/linux/toolbar.cpp b/linux/toolbar.cpp
new file mode 100644
index 0000000..955d097
--- /dev/null
+++ b/linux/toolbar.cpp
@@ -0,0 +1,754 @@
+// Toolbar creation.
+//
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include <GL/glx.h>
+#include <stdio.h>
+#include "gtktools.h"
+#include "gtkglarea.h"
+#include "main.h"
+#include "globals.h"
+#include "project.h"
+#include "pieceinf.h"
+#include "toolbar.h"
+#include "custom.h"
+
+// Variables
+GtkWidget *piecepreview;
+GtkWidget *piecelist;
+GtkWidget *piececombo;
+GtkWidget *colorlist;
+GtkWidget *grouptoolbar;
+
+TOOL_TOOLBAR tool_toolbar;
+MAIN_TOOLBAR main_toolbar;
+ANIM_TOOLBAR anim_toolbar;
+
+// Functions
+
+void create_toolbars(GtkWidget *window, GtkWidget *vbox)
+{
+#include "pixmaps/ac-brick.xpm"
+#include "pixmaps/ac-light.xpm"
+#include "pixmaps/ac-spot.xpm"
+#include "pixmaps/ac-cam.xpm"
+#include "pixmaps/ac-sel.xpm"
+#include "pixmaps/ac-move.xpm"
+#include "pixmaps/ac-rot.xpm"
+#include "pixmaps/ac-erase.xpm"
+#include "pixmaps/ac-paint.xpm"
+#include "pixmaps/ac-zoom.xpm"
+#include "pixmaps/ac-pan.xpm"
+#include "pixmaps/ac-rotv.xpm"
+#include "pixmaps/ac-roll.xpm"
+#include "pixmaps/ac-zoomr.xpm"
+#include "pixmaps/ac-zoome.xpm"
+#include "pixmaps/ac-prev.xpm"
+#include "pixmaps/ac-next.xpm"
+#include "pixmaps/an-anim.xpm"
+#include "pixmaps/an-key.xpm"
+#include "pixmaps/an-next.xpm"
+#include "pixmaps/an-prev.xpm"
+#include "pixmaps/an-first.xpm"
+#include "pixmaps/an-last.xpm"
+#include "pixmaps/an-play.xpm"
+#include "pixmaps/an-stop.xpm"
+#include "pixmaps/st-about.xpm"
+#include "pixmaps/st-fast.xpm"
+#include "pixmaps/st-paste.xpm"
+#include "pixmaps/st-save.xpm"
+#include "pixmaps/st-bg.xpm"
+#include "pixmaps/st-help.xpm"
+#include "pixmaps/st-prev.xpm"
+#include "pixmaps/st-snap.xpm"
+#include "pixmaps/st-copy.xpm"
+#include "pixmaps/st-new.xpm"
+#include "pixmaps/st-print.xpm"
+#include "pixmaps/st-snapa.xpm"
+#include "pixmaps/st-cut.xpm"
+#include "pixmaps/st-open.xpm"
+#include "pixmaps/st-redo.xpm"
+#include "pixmaps/st-undo.xpm"
+
+ GtkWidget *button;
+
+ // Main Toolbar
+ main_toolbar.handle_box = gtk_handle_box_new ();
+ gtk_box_pack_start (GTK_BOX (vbox),main_toolbar. handle_box, FALSE, FALSE, 0);
+ if (user_rc.view_main_toolbar)
+ gtk_widget_show (main_toolbar.handle_box);
+ main_toolbar.toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
+ gtk_toolbar_set_style (GTK_TOOLBAR (main_toolbar.toolbar), user_rc.toolbar_style);
+ gtk_container_add (GTK_CONTAINER (main_toolbar.handle_box), main_toolbar.toolbar);
+ gtk_widget_show (main_toolbar.toolbar);
+
+ gtk_container_border_width (GTK_CONTAINER (main_toolbar.toolbar), 2);
+ gtk_toolbar_set_button_relief (GTK_TOOLBAR (main_toolbar.toolbar), GTK_RELIEF_NONE);
+ // gtk_toolbar_set_space_style (GTK_TOOLBAR (main_toolbar.toolbar), GTK_TOOLBAR_SPACE_LINE);
+ // gtk_toolbar_set_space_size (GTK_TOOLBAR (main_toolbar.toolbar), 10);
+
+ gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "New",
+ "Create a new project", "", new_pixmap (window, st_new),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_NEW);
+ gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "Open",
+ "Open an existing project", "", new_pixmap (window, st_open),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_OPEN);
+ gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "Save",
+ "Save the active project", "", new_pixmap (window, st_save),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_FILE_SAVE);
+ button = gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "Print",
+ " ", "", new_pixmap (window, st_print), GTK_SIGNAL_FUNC (OnCommand), NULL);
+ gtk_widget_set_sensitive (button, FALSE);
+ button = gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "Preview",
+ " ", "", new_pixmap (window, st_prev), GTK_SIGNAL_FUNC (OnCommand), NULL);
+ gtk_widget_set_sensitive (button, FALSE);
+ main_toolbar.cut = gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "Cut",
+ "Cut the selection", "", new_pixmap (window, st_cut),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_CUT);
+ main_toolbar.copy = gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "Copy",
+ "Copy the selection", "", new_pixmap (window, st_copy),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_COPY);
+ main_toolbar.paste = gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "Paste",
+ "Insert Clipboard contents", "", new_pixmap (window, st_paste),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_PASTE);
+ main_toolbar.undo = gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "Undo",
+ "Undo last action", "", new_pixmap (window, st_undo),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_UNDO);
+ main_toolbar.redo = gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "Redo",
+ "Redo the last undone action", "", new_pixmap (window, st_redo),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_EDIT_REDO);
+ main_toolbar.snap = gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "Snap",
+ "Toggle 3D snap", "", new_pixmap (window, st_snap), GTK_SIGNAL_FUNC (OnCommand), NULL);
+ main_toolbar.angle = gtk_toolbar_append_element (GTK_TOOLBAR (main_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL, "Angle", "Toggle angle snap", "",
+ new_pixmap (window, st_snapa), GTK_SIGNAL_FUNC (OnCommand), (void*)ID_SNAP_A);
+ main_toolbar.fast = gtk_toolbar_append_element (GTK_TOOLBAR (main_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL, "Fast", "Fast rendering", "",
+ new_pixmap (window, st_fast), GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_TOOLBAR_FASTRENDER);
+ main_toolbar.bg = gtk_toolbar_append_element (GTK_TOOLBAR (main_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL, "Backgnd", "Backgroung rendering", "",
+ new_pixmap (window, st_bg), GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_TOOLBAR_BACKGROUND);
+ gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "About", "About LeoCAD", "",
+ new_pixmap (window, st_about), GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_HELP_ABOUT);
+ gtk_toolbar_append_item (GTK_TOOLBAR (main_toolbar.toolbar), "Help", "Help", "",
+ new_pixmap (window, st_help), GTK_SIGNAL_FUNC (OnCommand), NULL);
+ gtk_widget_set_sensitive (button, FALSE);
+
+ // Tools Toolbar
+ tool_toolbar.handle_box = gtk_handle_box_new ();
+ gtk_box_pack_start (GTK_BOX (vbox),tool_toolbar. handle_box, FALSE, FALSE, 0);
+ if (user_rc.view_tool_toolbar)
+ gtk_widget_show (tool_toolbar.handle_box);
+
+ tool_toolbar.toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
+ gtk_toolbar_set_style (GTK_TOOLBAR (tool_toolbar.toolbar), user_rc.toolbar_style);
+ gtk_container_add (GTK_CONTAINER (tool_toolbar.handle_box), tool_toolbar.toolbar);
+ gtk_widget_show (tool_toolbar.toolbar);
+
+ gtk_container_border_width (GTK_CONTAINER (tool_toolbar.toolbar), 2);
+ gtk_toolbar_set_button_relief (GTK_TOOLBAR (tool_toolbar.toolbar), GTK_RELIEF_NONE);
+
+ tool_toolbar.brick = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, NULL, "Piece", "Insert Piece", "", new_pixmap (window, ac_brick),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_INSERT);
+ tool_toolbar.light = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Light", "Insert Light", "", new_pixmap (window, ac_light),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_LIGHT);
+ tool_toolbar.spot = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Spot", "Insert Spotlight", "", new_pixmap (window, ac_spot),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_SPOTLIGHT);
+ tool_toolbar.camera = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Camera", "Insert Camera", "", new_pixmap (window, ac_cam),
+ GTK_SIGNAL_FUNC (OnCommand),(void*) ID_ACTION_CAMERA);
+ tool_toolbar.select = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Select", "Select Objects", "", new_pixmap (window, ac_sel),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_SELECT);
+ tool_toolbar.move = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Move", "Move Objects", "", new_pixmap (window, ac_move),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_MOVE);
+ tool_toolbar.rotate = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Rotate", "Rotate Pieces", "", new_pixmap (window, ac_rot),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_ROTATE);
+ tool_toolbar.erase = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Delete", "Remove Objects", "", new_pixmap (window, ac_erase),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_ERASER);
+ tool_toolbar.paint = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Paint", "Paint Bricks", "", new_pixmap (window, ac_paint),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_PAINT);
+ tool_toolbar.zoom = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Zoom", "Zoom", "", new_pixmap (window, ac_zoom),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_ZOOM);
+ tool_toolbar.pan = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Pan", "Pan", "", new_pixmap (window, ac_pan),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_PAN);
+ tool_toolbar.rotview = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Rot. View", "Rotate View", "", new_pixmap (window, ac_rotv),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_ROTATE_VIEW);
+ tool_toolbar.roll = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Roll", "Roll", "", new_pixmap (window, ac_roll),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_ROLL);
+ tool_toolbar.zoomreg = button = gtk_toolbar_append_element (GTK_TOOLBAR (tool_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_RADIOBUTTON, button, "Zoom Box", "Zoom Region", "", new_pixmap (window, ac_zoomr),
+ GTK_SIGNAL_FUNC (OnCommand), (void*)ID_ACTION_ZOOM_REGION);
+ gtk_toolbar_append_item (GTK_TOOLBAR (tool_toolbar.toolbar), "Zoom Ext.", "Zoom Extents",
+ "", new_pixmap (window, ac_zoome), GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_VIEW_ZOOMEXTENTS);
+ tool_toolbar.prev = gtk_toolbar_append_item (GTK_TOOLBAR (tool_toolbar.toolbar), "", "",
+ "", new_pixmap (window, ac_prev), GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_PREVIOUS);
+ tool_toolbar.next = gtk_toolbar_append_item (GTK_TOOLBAR (tool_toolbar.toolbar), "", "",
+ "", new_pixmap (window, ac_next), GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_PIECE_NEXT);
+
+ // Animation Toolbar
+ anim_toolbar.handle_box = gtk_handle_box_new ();
+ gtk_box_pack_start (GTK_BOX (vbox), anim_toolbar.handle_box, FALSE, FALSE, 0);
+ if (user_rc.view_anim_toolbar)
+ gtk_widget_show (anim_toolbar.handle_box);
+
+ anim_toolbar.toolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
+// gtk_toolbar_set_style (GTK_TOOLBAR (toolbar), user_rc.toolbar_style);
+ gtk_container_add (GTK_CONTAINER (anim_toolbar.handle_box), anim_toolbar.toolbar);
+ gtk_widget_show (anim_toolbar.toolbar);
+
+ gtk_container_border_width (GTK_CONTAINER (anim_toolbar.toolbar), 2);
+ gtk_toolbar_set_button_relief (GTK_TOOLBAR (anim_toolbar.toolbar), GTK_RELIEF_NONE);
+
+ anim_toolbar.first = gtk_toolbar_append_item (GTK_TOOLBAR (anim_toolbar.toolbar),
+ "First", "Go to the Start", "", new_pixmap (window, an_first),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_VIEW_STEP_FIRST);
+ anim_toolbar.prev = gtk_toolbar_append_item (GTK_TOOLBAR (anim_toolbar.toolbar),
+ "Previous", "Go Back", "", new_pixmap (window, an_prev),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_VIEW_STEP_PREVIOUS);
+ anim_toolbar.play = gtk_toolbar_append_item (GTK_TOOLBAR (anim_toolbar.toolbar),
+ "Play", "Play Animation", "", new_pixmap (window, an_play),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_VIEW_PLAY);
+ anim_toolbar.stop = gtk_toolbar_append_item (GTK_TOOLBAR (anim_toolbar.toolbar),
+ "Stop", "Stop Animation", "", new_pixmap (window, an_stop),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_VIEW_STOP);
+ anim_toolbar.next = gtk_toolbar_append_item (GTK_TOOLBAR (anim_toolbar.toolbar),
+ "Next", "Go Forward", "", new_pixmap (window, an_next),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_VIEW_STEP_NEXT);
+ anim_toolbar.last = gtk_toolbar_append_item (GTK_TOOLBAR (anim_toolbar.toolbar),
+ "Last", "Go to the End", "", new_pixmap (window, an_last),
+ GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_VIEW_STEP_LAST);
+ anim_toolbar.anim = gtk_toolbar_append_element (GTK_TOOLBAR (anim_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL, "Mode", "Toggle Animation or Instructions", "",
+ new_pixmap (window, an_anim), GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_TOOLBAR_ADDKEYS);
+ anim_toolbar.keys = gtk_toolbar_append_element (GTK_TOOLBAR (anim_toolbar.toolbar),
+ GTK_TOOLBAR_CHILD_TOGGLEBUTTON, NULL, "Keys", "Add Keys", "",
+ new_pixmap (window, an_key), GTK_SIGNAL_FUNC (OnCommandDirect), (void*)LC_TOOLBAR_ANIMATION);
+}
+
+
+//////////////////////////////////////////////////////////////////
+// Pieces toolbar
+
+static bool list_subparts = false;
+static bool list_groups = true;
+static int list_curgroup;
+static int piecelist_col_sort = 0;
+static bool piecelist_ascending = true;
+static PieceInfo* piece_info = NULL;
+static int cur_color = 0;
+static GdkPixmap* colorlist_pixmap = NULL;
+static GtkWidget* list_arrows[2];
+static GtkWidget* groups[9];
+
+// piece_preview drawing
+static gint draw_preview(GtkWidget *widget, GdkEventExpose *event)
+{
+ // Draw only last expose.
+ if (event->count > 0)
+ return TRUE;
+
+ if (piece_info == NULL)
+ return TRUE;
+
+ if (!gtk_gl_area_make_current(GTK_GL_AREA(widget)))
+ return TRUE;
+
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ glPolygonOffset(0.5f, 0.1f);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
+ glDisable (GL_DITHER);
+ glShadeModel (GL_FLAT);
+
+ double aspect = (float)widget->allocation.width/(float)widget->allocation.height;
+ glViewport(0,0, widget->allocation.width, widget->allocation.height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(30.0f, aspect, 1.0f, 100.0f);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ piece_info->ZoomExtents();
+
+ float pos[4] = { 0, 0, 10, 0 }, *bg = project->GetBackgroundColor();
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glClearColor(bg[0], bg[1], bg[2], bg[3]);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ piece_info->RenderPiece(project->GetCurrentColor());
+
+ glFinish();
+ gtk_gl_area_swapbuffers(GTK_GL_AREA(widget));
+ gtk_gl_area_make_current(GTK_GL_AREA(drawing_area));
+
+ return TRUE;
+}
+
+static void piecelist_setsort (GtkCList* clist, gint column)
+{
+ if (piecelist_col_sort == column)
+ piecelist_ascending = !piecelist_ascending;
+ else
+ {
+ gtk_widget_hide (list_arrows[piecelist_col_sort]);
+ gtk_widget_show (list_arrows[column]);
+ piecelist_ascending = true;
+ }
+ piecelist_col_sort = column;
+
+ gtk_arrow_set (GTK_ARROW (list_arrows[column]), piecelist_ascending
+ ? GTK_ARROW_DOWN : GTK_ARROW_UP, GTK_SHADOW_IN);
+
+ gtk_clist_set_sort_column (GTK_CLIST(piecelist), column);
+ gtk_clist_set_sort_type (GTK_CLIST(piecelist), piecelist_ascending
+ ? GTK_SORT_ASCENDING : GTK_SORT_DESCENDING);
+ gtk_clist_sort (GTK_CLIST(piecelist));
+}
+
+static void fill_piecelist(int group)
+{
+ gtk_clist_freeze(GTK_CLIST(piecelist));
+ gtk_clist_clear(GTK_CLIST(piecelist));
+
+ for (int i = 0; i < project->GetPieceLibraryCount(); i++)
+ {
+ PieceInfo* pInfo = project->GetPieceInfo(i);
+
+ if ((pInfo->m_strDescription[0] == '~') && !list_subparts)
+ continue;
+
+ if ((!list_groups) || ((pInfo->m_nGroups & (long)(1 << group)) != 0))
+ {
+ char* dummy[] = { pInfo->m_strDescription, pInfo->m_strName };
+
+ int idx = gtk_clist_append(GTK_CLIST(piecelist), dummy);
+ gtk_clist_set_row_data(GTK_CLIST(piecelist), idx, pInfo);
+ }
+ }
+ gtk_clist_thaw(GTK_CLIST(piecelist));
+}
+
+// Callback for the groups toolbar.
+static void group_event(GtkWidget *widget, gpointer data)
+{
+ fill_piecelist((int)data);
+ if (!ignore_commands)
+ project->HandleNotify(LC_GROUP_CHANGED, (int)data);
+}
+
+void groupsbar_set(int new_group)
+{
+ ignore_commands = true;
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(groups[new_group]), TRUE);
+ ignore_commands = false;
+ gtk_clist_select_row (GTK_CLIST(piecelist), 0, 0);
+}
+
+// Callback for the pieces list.
+static void selection_made(GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data)
+{
+ if (piece_info != NULL)
+ piece_info->DeRef();
+ piece_info = (PieceInfo*)gtk_clist_get_row_data(GTK_CLIST(piecelist), row);
+ piece_info->AddRef();
+ project->SetCurrentPiece(piece_info);
+ gtk_widget_draw(piecepreview, NULL);
+}
+
+static void colorlist_draw_pixmap(GtkWidget *widget)
+{
+ GdkGC* gc = gdk_gc_new(widget->window);
+ int i;
+ GdkRectangle rect;
+ GdkColor c;
+
+ gdk_gc_set_fill(gc, GDK_SOLID);
+ rect.y = 0;
+ rect.width = widget->allocation.width/14+1;
+ rect.height = widget->allocation.height/2;
+
+ for (i = 0; i < 28; i++)
+ {
+ if (i == 14)
+ rect.y = rect.height;
+
+ if (i < 14)
+ rect.x = widget->allocation.width * i / 14;
+ else
+ rect.x = widget->allocation.width * (i-14) / 14;
+
+ c.red = (gushort)(FlatColorArray[i][0]*0xFFFF);
+ c.green = (gushort)(FlatColorArray[i][1]*0xFFFF);
+ c.blue = (gushort)(FlatColorArray[i][2]*0xFFFF);
+ gdk_color_alloc(gtk_widget_get_colormap(widget), &c);
+ gdk_gc_set_foreground(gc, &c);
+
+ gdk_draw_rectangle (colorlist_pixmap, gc, TRUE,
+ rect.x, rect.y,
+ rect.width, rect.height);
+
+ if (i > 13 && i < 21)
+ {
+ int x, y;
+ gdk_color_white(gtk_widget_get_colormap(widget), &c);
+ gdk_gc_set_foreground(gc, &c);
+
+ for (x = rect.x; x < rect.x + rect.width; x++)
+ {
+ for (y = rect.y + x%4; y < rect.y + rect.height; y += 4)
+ gdk_draw_point(colorlist_pixmap, gc, x, y);
+
+ for (y = rect.y + rect.height - x%4; y > rect.y; y -= 4)
+ gdk_draw_point(colorlist_pixmap, gc, x, y);
+ }
+ }
+ }
+
+ gdk_color_black(gtk_widget_get_colormap(widget), &c);
+ gdk_gc_set_foreground(gc, &c);
+ gdk_gc_set_line_attributes(gc, 1,
+ GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+
+ for (i = 0; i < 14; i++)
+ gdk_draw_line (colorlist_pixmap, gc,
+ widget->allocation.width * i / 14, 0,
+ widget->allocation.width * i / 14, widget->allocation.height);
+
+ gdk_draw_line (colorlist_pixmap, gc, 0, widget->allocation.height-1,
+ widget->allocation.width, widget->allocation.height-1);
+ gdk_draw_line (colorlist_pixmap, gc, 0, widget->allocation.height/2,
+ widget->allocation.width, widget->allocation.height/2);
+ gdk_draw_line (colorlist_pixmap, gc, widget->allocation.width-1, 0,
+ widget->allocation.width-1, widget->allocation.height);
+ gdk_draw_line (colorlist_pixmap, gc, 0, 0, widget->allocation.width, 0);
+
+ c.red = (gushort)(0.4f*0xFFFF);
+ c.green = (gushort)(0.8f*0xFFFF);
+ c.blue = (gushort)(0.4f*0xFFFF);
+ gdk_color_alloc(gtk_widget_get_colormap(widget), &c);
+ gdk_gc_set_foreground(gc, &c);
+
+ int l, r, t, b;
+ i = cur_color;
+ if (i > 13) i -= 14;
+ l = widget->allocation.width * i / 14;
+ r = widget->allocation.width * (i+1) / 14;
+ t = (cur_color < 14) ? 0 : widget->allocation.height/2;
+ b = (cur_color < 14) ? widget->allocation.height/2 : widget->allocation.height-1;
+
+ gdk_draw_rectangle (colorlist_pixmap, gc, FALSE, l, t, r-l, b-t);
+
+ gdk_gc_destroy(gc);
+}
+
+static gint colorlist_configure(GtkWidget *widget, GdkEventConfigure *event)
+{
+ if (colorlist_pixmap)
+ gdk_pixmap_unref(colorlist_pixmap);
+
+ colorlist_pixmap = gdk_pixmap_new(widget->window, widget->allocation.width,
+ widget->allocation.height, -1);
+ colorlist_draw_pixmap(widget);
+
+ return TRUE;
+}
+
+// Redraw from the backing pixmap
+static gint colorlist_expose(GtkWidget *widget, GdkEventExpose *event)
+{
+ gdk_draw_pixmap(widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)],
+ colorlist_pixmap, event->area.x, event->area.y,
+ event->area.x, event->area.y,
+ event->area.width, event->area.height);
+
+ return FALSE;
+}
+
+static gint colorlist_key_press(GtkWidget* widget, GdkEventKey* event, gpointer data)
+{
+ int x = -100;
+
+ switch (event->keyval)
+ {
+ case GDK_Up: x = cur_color - 14; break;
+ case GDK_Down: x = cur_color + 14; break;
+ case GDK_Left: x = cur_color - 1; break;
+ case GDK_Right: x = cur_color + 1; break;
+ }
+
+ if (x != -100)
+ {
+ if ((x > -1) && (x < 28))
+ {
+ cur_color = x;
+ colorlist_draw_pixmap(widget);
+ project->HandleNotify(LC_COLOR_CHANGED, x);
+ gtk_widget_draw(widget, NULL);
+ gtk_widget_draw(piecepreview, NULL);
+ }
+ gtk_signal_emit_stop_by_name (GTK_OBJECT(widget), "key_press_event");
+ }
+
+ return TRUE;
+}
+
+static gint colorlist_button_press(GtkWidget *widget, GdkEventButton *event)
+{
+ if (event->button == 1 && colorlist_pixmap != NULL)
+ {
+ int x = (int)(event->x * 14 / widget->allocation.width);
+ if (event->y > (widget->allocation.height/2))
+ x += 14;
+
+ if (x != cur_color)
+ {
+ cur_color = x;
+ colorlist_draw_pixmap(widget);
+ project->HandleNotify(LC_COLOR_CHANGED, x);
+ gtk_widget_draw(widget, NULL);
+ gtk_widget_draw(piecepreview, NULL);
+ }
+ }
+ gtk_window_set_focus(GTK_WINDOW(main_window), widget);
+
+ return TRUE;
+}
+
+void colorlist_set(int new_color)
+{
+ if (new_color != cur_color)
+ {
+ cur_color = new_color;
+ colorlist_draw_pixmap(colorlist);
+ gtk_widget_draw(colorlist, NULL);
+ gtk_widget_draw(piecepreview, NULL);
+ }
+}
+
+// Create what is the pieces toolbar in the Windows version as fixed items.
+void create_piecebar(GtkWidget *window, GtkWidget *hbox)
+{
+ GtkWidget *vbox;
+ gchar *titles[2] = { "Description", "Number" };
+ int attrlist[] =
+ {
+ GLX_RGBA,
+ GLX_DOUBLEBUFFER,
+ GLX_DEPTH_SIZE, 16,
+ 0
+ };
+
+ GtkWidget *vbox1, *vpan, *scroll_win;
+
+ GtkWidget* frame = gtk_frame_new (NULL);
+ gtk_widget_show (frame);
+ gtk_box_pack_end (GTK_BOX (hbox), frame, FALSE, FALSE, 0);
+
+ vbox1 = gtk_vbox_new (FALSE, 0);
+ gtk_widget_show (vbox1);
+ gtk_container_add (GTK_CONTAINER (frame), vbox1);
+ gtk_container_border_width(GTK_CONTAINER (vbox1), 2);
+
+ vpan = gtk_vpaned_new ();
+ gtk_widget_show (vpan);
+ gtk_box_pack_start (GTK_BOX (vbox1), vpan, TRUE, TRUE, 0);
+
+ piecepreview = GTK_WIDGET(gtk_gl_area_share_new(attrlist, GTK_GL_AREA(drawing_area)));
+ gtk_widget_set_events(GTK_WIDGET(piecepreview), GDK_EXPOSURE_MASK);
+ gtk_signal_connect(GTK_OBJECT(piecepreview), "expose_event", GTK_SIGNAL_FUNC(draw_preview), NULL);
+
+ gtk_widget_set_usize(GTK_WIDGET(piecepreview), 100, 100);
+ gtk_widget_show (piecepreview);
+ gtk_container_add (GTK_CONTAINER (vpan), piecepreview);
+
+ scroll_win = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scroll_win),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+ gtk_widget_show (scroll_win);
+ gtk_container_add (GTK_CONTAINER (vpan), scroll_win);
+
+ piecelist = gtk_clist_new_with_titles(2, titles);
+ gtk_signal_connect(GTK_OBJECT(piecelist), "select_row",
+ GTK_SIGNAL_FUNC(selection_made), NULL);
+ gtk_signal_connect (GTK_OBJECT (piecelist), "click_column",
+ GTK_SIGNAL_FUNC (piecelist_setsort), NULL);
+ gtk_container_add (GTK_CONTAINER (scroll_win), piecelist);
+ gtk_clist_set_column_width (GTK_CLIST(piecelist), 0, 90);
+ gtk_clist_set_column_width (GTK_CLIST(piecelist), 1, 10);
+ gtk_clist_set_column_auto_resize (GTK_CLIST(piecelist), 1, TRUE);
+ list_arrows[0] = clist_title_with_arrow (piecelist, 0, titles[0]);
+ list_arrows[1] = clist_title_with_arrow (piecelist, 1, titles[1]);
+ //gtk_clist_set_shadow_type (GTK_CLIST(piecelist), GTK_SHADOW_IN);
+ // gtk_clist_column_titles_show (GTK_CLIST (piecelist));
+ gtk_clist_set_auto_sort (GTK_CLIST(piecelist), TRUE);
+ gtk_widget_show (list_arrows[0]);
+ gtk_widget_show (piecelist);
+
+ /*
+ gtk_clist_set_hadjustment (GTK_CLIST (piecelist), NULL);
+ gtk_clist_set_vadjustment (GTK_CLIST (piecelist), NULL);
+ */
+
+ // Piece toolbar
+ GtkWidget* icon;
+ int i;
+
+#include "pixmaps/pi-acces.xpm"
+#include "pixmaps/pi-plate.xpm"
+#include "pixmaps/pi-tile.xpm"
+#include "pixmaps/pi-brick.xpm"
+#include "pixmaps/pi-slope.xpm"
+#include "pixmaps/pi-train.xpm"
+#include "pixmaps/pi-space.xpm"
+#include "pixmaps/pi-misc.xpm"
+#include "pixmaps/pi-tech.xpm"
+
+ grouptoolbar = gtk_toolbar_new (GTK_ORIENTATION_HORIZONTAL, GTK_TOOLBAR_ICONS);
+ gtk_container_set_border_width (GTK_CONTAINER(grouptoolbar), 2);
+ //gtk_toolbar_set_space_size (GTK_TOOLBAR(toolbar), 5);
+
+ groups[0] = gtk_toolbar_append_element(GTK_TOOLBAR(grouptoolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON,
+ NULL, "", "Plates", "", new_pixmap(window, pi_plate), GTK_SIGNAL_FUNC(group_event), (void*)0);
+ groups[1] = gtk_toolbar_append_element(GTK_TOOLBAR(grouptoolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON,
+ groups[0], "", "Bricks", "", new_pixmap(window, pi_brick), GTK_SIGNAL_FUNC(group_event), (void*)1);
+ groups[2] = gtk_toolbar_append_element(GTK_TOOLBAR(grouptoolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON,
+ groups[1], "", "Tiles", "", new_pixmap(window, pi_tile), GTK_SIGNAL_FUNC(group_event), (void*)2);
+ groups[3] = gtk_toolbar_append_element(GTK_TOOLBAR(grouptoolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON,
+ groups[2], "", "Slopes", "", new_pixmap(window, pi_slope), GTK_SIGNAL_FUNC(group_event), (void*)3);
+ groups[4] = gtk_toolbar_append_element(GTK_TOOLBAR(grouptoolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON,
+ groups[3], "", "Technic", "", new_pixmap(window, pi_tech), GTK_SIGNAL_FUNC(group_event), (void*)4);
+ groups[5] = gtk_toolbar_append_element(GTK_TOOLBAR(grouptoolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON,
+ groups[4], "", "Space", "", new_pixmap(window, pi_space), GTK_SIGNAL_FUNC(group_event), (void*)5);
+ groups[6] = gtk_toolbar_append_element(GTK_TOOLBAR(grouptoolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON,
+ groups[5], "", "Train", "", new_pixmap(window, pi_train), GTK_SIGNAL_FUNC(group_event), (void*)6);
+ groups[7] = gtk_toolbar_append_element(GTK_TOOLBAR(grouptoolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON,
+ groups[6], "", "Other", "", new_pixmap(window, pi_misc), GTK_SIGNAL_FUNC(group_event), (void*)7);
+ groups[8] = gtk_toolbar_append_element(GTK_TOOLBAR(grouptoolbar), GTK_TOOLBAR_CHILD_RADIOBUTTON,
+ groups[7], "", "Accessories", "", new_pixmap(window, pi_acces), GTK_SIGNAL_FUNC(group_event), (void*)8);
+
+ // gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(both_button),TRUE);
+ gtk_box_pack_start(GTK_BOX(vbox1), grouptoolbar, FALSE, TRUE, 0);
+ gtk_widget_show(grouptoolbar);
+
+ // Piece combo
+ piececombo = gtk_combo_new();
+ gtk_box_pack_start(GTK_BOX(vbox1), piececombo, FALSE, TRUE, 0);
+ gtk_widget_show(piececombo);
+
+ // Color list
+ colorlist = gtk_drawing_area_new ();
+ gtk_widget_set_events (colorlist, GDK_EXPOSURE_MASK
+ | GDK_KEY_PRESS_MASK | GDK_BUTTON_PRESS_MASK);
+ GTK_WIDGET_SET_FLAGS(colorlist, GTK_CAN_FOCUS);
+ gtk_drawing_area_size(GTK_DRAWING_AREA(colorlist), 200, 30);
+ gtk_box_pack_start(GTK_BOX(vbox1), colorlist, FALSE, TRUE, 0);
+
+ gtk_signal_connect (GTK_OBJECT(colorlist), "expose_event",
+ (GtkSignalFunc) colorlist_expose, NULL);
+ gtk_signal_connect (GTK_OBJECT(colorlist),"configure_event",
+ (GtkSignalFunc) colorlist_configure, NULL);
+ gtk_signal_connect (GTK_OBJECT(colorlist), "button_press_event",
+ (GtkSignalFunc) colorlist_button_press, NULL);
+ gtk_signal_connect (GTK_OBJECT(colorlist), "key_press_event",
+ GTK_SIGNAL_FUNC(colorlist_key_press), NULL);
+
+ gtk_widget_show(colorlist);
+}
+
+GtkWidget *label_message, *label_position, *label_snap, *label_step;
+
+void create_statusbar(GtkWidget *window, GtkWidget *vbox)
+{
+ GtkWidget *hbox, *hbox1;
+ GtkWidget *frame;
+ //GtkStyle *style;
+
+ hbox = gtk_hbox_new (FALSE, 0);
+ gtk_widget_show (hbox);
+ gtk_widget_set_usize (hbox, -1, 24);
+ gtk_container_border_width (GTK_CONTAINER (hbox), 1);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 2);
+
+ frame = gtk_frame_new (NULL);
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+
+ hbox1 = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (frame), hbox1);
+ gtk_container_border_width (GTK_CONTAINER (hbox1), 0);
+ gtk_widget_show (hbox1);
+
+ label_message = gtk_label_new (" ");
+ gtk_widget_show (label_message);
+ gtk_box_pack_start (GTK_BOX (hbox1), label_message, FALSE, TRUE, 0);
+ gtk_label_set_justify (GTK_LABEL (label_message), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_padding (GTK_MISC (label_message), 3, 0);
+
+ frame = gtk_frame_new (NULL);
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+ gtk_widget_set_usize (frame, 150, -1);
+
+ hbox1 = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (frame), hbox1);
+ gtk_container_border_width (GTK_CONTAINER (hbox1), 0);
+ gtk_widget_show (hbox1);
+
+ label_position = gtk_label_new (" ");
+ gtk_widget_show (label_position);
+ gtk_box_pack_start (GTK_BOX (hbox1), label_position, TRUE, TRUE, 0);
+
+ frame = gtk_frame_new (NULL);
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+ gtk_widget_set_usize (frame, 70, -1);
+
+ hbox1 = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (frame), hbox1);
+ gtk_container_border_width (GTK_CONTAINER (hbox1), 0);
+ gtk_widget_show (hbox1);
+
+ label_snap = gtk_label_new (" ");
+ gtk_widget_show (label_snap);
+ gtk_box_pack_start (GTK_BOX (hbox1), label_snap, TRUE, TRUE, 0);
+
+ frame = gtk_frame_new (NULL);
+ gtk_widget_show (frame);
+ gtk_box_pack_start (GTK_BOX (hbox), frame, FALSE, TRUE, 0);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+ gtk_widget_set_usize (frame, 70, -1);
+
+ hbox1 = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (frame), hbox1);
+ gtk_container_border_width (GTK_CONTAINER (hbox1), 0);
+ gtk_widget_show (hbox1);
+
+ label_step = gtk_label_new (" ");
+ gtk_widget_show (label_step);
+ gtk_box_pack_start (GTK_BOX (hbox1), label_step, TRUE, TRUE, 0);
+}
+
+
+
+
diff --git a/linux/toolbar.h b/linux/toolbar.h
new file mode 100644
index 0000000..012e495
--- /dev/null
+++ b/linux/toolbar.h
@@ -0,0 +1,76 @@
+#ifndef _TOOLBAR_H_
+#define _TOOLBAR_H_
+
+void create_toolbars(GtkWidget *window, GtkWidget *vbox);
+void create_piecebar(GtkWidget *window, GtkWidget *hbox);
+void create_statusbar(GtkWidget *window, GtkWidget *vbox);
+void colorlist_set(int new_color);
+void groupsbar_set(int new_group);
+
+extern GtkWidget *label_message, *label_position, *label_snap, *label_step;
+
+typedef struct
+{
+ GtkWidget* toolbar;
+ GtkWidget* handle_box;
+
+ GtkWidget* cut;
+ GtkWidget* copy;
+ GtkWidget* paste;
+ GtkWidget* undo;
+ GtkWidget* redo;
+ GtkWidget* snap;
+ GtkWidget* angle;
+ GtkWidget* fast;
+ GtkWidget* bg;
+
+} MAIN_TOOLBAR;
+
+
+typedef struct
+{
+ GtkWidget* toolbar;
+ GtkWidget* handle_box;
+
+ GtkWidget* brick;
+ GtkWidget* light;
+ GtkWidget* spot;
+ GtkWidget* camera;
+ GtkWidget* select;
+ GtkWidget* move;
+ GtkWidget* rotate;
+ GtkWidget* erase;
+ GtkWidget* paint;
+ GtkWidget* zoom;
+ GtkWidget* pan;
+ GtkWidget* rotview;
+ GtkWidget* roll;
+ GtkWidget* zoomreg;
+ GtkWidget* prev;
+ GtkWidget* next;
+
+} TOOL_TOOLBAR;
+
+typedef struct
+{
+ GtkWidget* toolbar;
+ GtkWidget* handle_box;
+
+ GtkWidget* first;
+ GtkWidget* prev;
+ GtkWidget* play;
+ GtkWidget* stop;
+ GtkWidget* next;
+ GtkWidget* last;
+ GtkWidget* anim;
+ GtkWidget* keys;
+
+} ANIM_TOOLBAR;
+
+extern ANIM_TOOLBAR anim_toolbar;
+extern TOOL_TOOLBAR tool_toolbar;
+extern MAIN_TOOLBAR main_toolbar;
+
+#endif
+
+