#include "lc_global.h" #include #include #include #include #include #include #include #include #include #include #include "opengl.h" #include "gtkmisc.h" #include "camera.h" #include "project.h" #include "system.h" #include "main.h" #include "toolbar.h" #include "dialogs.h" #include "globals.h" #include "lc_application.h" // ============================================================================= // Cursor functions int Sys_MessageBox (const char* text, const char* caption, int type) { return msgbox_execute (text, caption, type); } // ============================================================================= // Memory rendering typedef struct { int width, height; Display *xdisplay; GLXPixmap glxpixmap; GLXContext glxcontext; GdkPixmap *pixmap; GdkVisual *visual; } LC_RENDER; void* Sys_StartMemoryRender(int width, int height) { LC_RENDER* render = (LC_RENDER*) malloc (sizeof (LC_RENDER)); int attrlist[] = { GLX_RGBA, GLX_DEPTH_SIZE, 16, 0 }; XVisualInfo *vi; Pixmap xpixmap; render->width = width; render->height = height; render->xdisplay = GDK_DISPLAY(); vi = pfnglXChooseVisual (render->xdisplay, DefaultScreen (render->xdisplay), attrlist); render->visual = gdkx_visual_get (vi->visualid); render->glxcontext = pfnglXCreateContext (render->xdisplay, vi, NULL, True); render->pixmap = gdk_pixmap_new (NULL, width, height, render->visual->depth); xpixmap = (Pixmap)GDK_DRAWABLE_XID(render->pixmap); render->glxpixmap = pfnglXCreateGLXPixmap (render->xdisplay, vi, xpixmap); XFree(vi); pfnglXMakeCurrent (render->xdisplay, render->glxpixmap, render->glxcontext); return render; } void Sys_FinishMemoryRender(void* param) { LC_RENDER* render = (LC_RENDER*)param; // gtk_gl_area_make_current (GTK_GL_AREA (drawing_area)); if (render->glxcontext == pfnglXGetCurrentContext ()) pfnglXMakeCurrent (render->xdisplay, None, NULL); pfnglXDestroyContext (render->xdisplay, render->glxcontext); pfnglXDestroyGLXPixmap (render->xdisplay, render->glxpixmap); pfnglXWaitGL(); gdk_pixmap_unref (render->pixmap); pfnglXWaitX(); free(render); } // ============================================================================= // Misc stuff // FIXME: should have a table of LC_KEY_* defined bool Sys_KeyDown(int Key) { char keys[32]; int x; XQueryKeymap(GDK_DISPLAY(), keys); if (Key == KEY_CONTROL) { x = XKeysymToKeycode(GDK_DISPLAY(), XK_Control_L); if (keys[x/8] & (1 << (x % 8))) return true; x = XKeysymToKeycode(GDK_DISPLAY(), XK_Control_R); if (keys[x/8] & (1 << (x % 8))) return true; } else if (Key == KEY_ALT) { x = XKeysymToKeycode(GDK_DISPLAY(), XK_Alt_L); if (keys[x/8] & (1 << (x % 8))) return true; x = XKeysymToKeycode(GDK_DISPLAY(), XK_Alt_R); if (keys[x/8] & (1 << (x % 8))) return true; } return false; } void Sys_GetFileList(const char* Path, ObjArray& FileList) { struct dirent* Entry; char DirPath[LC_MAXPATH], FilePath[LC_MAXPATH]; strcpy(DirPath, Path); int Length = strlen(DirPath); if (DirPath[Length - 1] != '/') strcat(DirPath, "/"); FileList.RemoveAll(); DIR* Dir = opendir(DirPath); if (!Dir) { printf("Couldn't open directory.\n"); return; } while ((Entry = readdir(Dir))) { if (Entry->d_type != DT_REG) continue; sprintf(FilePath, "%s%s", DirPath, Entry->d_name); FileList.Add(FilePath); } closedir(Dir); } // String char* strupr(char* string) { char *cp; for (cp=string; *cp; ++cp) { if ('a' <= *cp && *cp <= 'z') *cp += 'A' - 'a'; } return string; } char* strlwr(char* string) { char *cp; for (cp = string; *cp; ++cp) { if ('A' <= *cp && *cp <= 'Z') *cp += 'a' - 'A'; } return string; } int stricmp(const char* str1, const char* str2) { return g_ascii_strcasecmp(str1, str2); } void SystemPumpMessages() { while (gtk_events_pending ()) gtk_main_iteration (); } long SystemGetTicks() { static int basetime = 0; struct timezone tzp; struct timeval tp; gettimeofday (&tp, &tzp); if (!basetime) basetime = tp.tv_sec; return (tp.tv_sec-basetime)*1000 + tp.tv_usec/1000; } // User Interface void SystemUpdateCategories(bool SearchOnly) { } static void create_bitmap_and_mask_from_xpm (GdkBitmap **bitmap, GdkBitmap **mask, const char **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" if (!drawing_area) return; GtkWidget* button; const char** xpm = NULL; int x, y; switch (new_action) { case LC_ACTION_SELECT: button = tool_toolbar.select; { x = 0; y = 2; // TODO: FIX ME !!! if (Sys_KeyDown (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; default: return; } GdkBitmap *bitmap; GdkBitmap *mask; GdkCursor *cursor; GdkColor white = {0, 0xffff, 0xffff, 0xffff}; GdkColor black = {0, 0x0000, 0x0000, 0x0000}; if (GDK_IS_WINDOW(drawing_area)) { 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 SystemUpdateColorList(int new_color) { colorlist_set(new_color); } void SystemUpdateRenderingMode(bool bFast) { if (!main_toolbar.fast) return; ignore_commands = true; gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(main_toolbar.fast), bFast); ignore_commands = false; } void SystemUpdateUndoRedo(char* undo, char* redo) { gpointer item; char text[50]; strcpy(text, "Undo "); if (undo) strcat(text, undo); item = gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_edit_undo"); if (!item) return; gtk_label_set_text (GTK_LABEL (GTK_BIN (item)->child), text); gtk_widget_set_sensitive (GTK_WIDGET (item), undo != NULL); strcpy(text, "Redo "); if (redo) strcat(text, redo); item = gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_edit_redo"); gtk_label_set_text (GTK_LABEL (GTK_BIN (item)->child), text); gtk_widget_set_sensitive (GTK_WIDGET (item), redo != NULL); gtk_widget_set_sensitive (main_toolbar.undo, undo != NULL); gtk_widget_set_sensitive (main_toolbar.redo, redo != NULL); } void SystemUpdateSnap(const unsigned long snap) { if (!main_toolbar.angle) return; ignore_commands = true; gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(main_toolbar.angle), (snap & LC_DRAW_SNAP_A) != 0); ignore_commands = false; void* item; ignore_commands = true; item = gtk_object_get_data(GTK_OBJECT(main_toolbar.snap_menu), "snap_x"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), (snap & LC_DRAW_SNAP_X) ? TRUE : FALSE); item = gtk_object_get_data(GTK_OBJECT(main_toolbar.snap_menu), "snap_y"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), (snap & LC_DRAW_SNAP_Y) ? TRUE : FALSE); item = gtk_object_get_data(GTK_OBJECT(main_toolbar.snap_menu), "snap_z"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), (snap & LC_DRAW_SNAP_Z) ? TRUE : FALSE); item = gtk_object_get_data(GTK_OBJECT(main_toolbar.lock_menu), "lock_x"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), (snap & LC_DRAW_LOCK_X) ? TRUE : FALSE); item = gtk_object_get_data(GTK_OBJECT(main_toolbar.lock_menu), "lock_y"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), (snap & LC_DRAW_LOCK_Y) ? TRUE : FALSE); item = gtk_object_get_data(GTK_OBJECT(main_toolbar.lock_menu), "lock_z"); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), (snap & LC_DRAW_LOCK_Z) ? TRUE : FALSE); ignore_commands = false; } void SystemUpdateCurrentCamera(Camera* pOld, Camera* pNew, const PtrArray& Cameras) { gpointer item = NULL; gpointer menu = gtk_object_get_data(GTK_OBJECT(((GtkWidget*)(*main_window))), "cameras_menu"); if (!menu) return; if (!pNew || pNew->IsSimple()) { GList *lst = gtk_container_children(GTK_CONTAINER(menu)); item = g_list_first(lst)->data; g_list_free(lst); } else { Project* project = lcGetActiveProject(); for (int CameraIdx = 0; CameraIdx < project->mCameras.GetSize(); CameraIdx++) { if (pNew != project->mCameras[CameraIdx]) continue; GList *lst = gtk_container_children(GTK_CONTAINER(menu)); item = g_list_nth_data(lst, CameraIdx + 1); g_list_free(lst); break; } } if (item) { ignore_commands = true; gtk_check_menu_item_set_state(GTK_CHECK_MENU_ITEM(item), TRUE); ignore_commands = false; } } void SystemUpdateCameraMenu(const PtrArray& Cameras) { GtkWidget *menu = GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(((GtkWidget*)(*main_window))), "cameras_menu")); GtkWidget *item = NULL; GList *lst; if (!menu) return; lst = gtk_container_children(GTK_CONTAINER(menu)); GtkWidget* reset = GTK_WIDGET(g_list_last(lst)->data); g_object_ref(reset); for (GList* i = g_list_first(lst); i; i = g_list_next(i)) gtk_container_remove(GTK_CONTAINER(menu), GTK_WIDGET(i->data)); g_list_free(lst); Project* project = lcGetActiveProject(); item = gtk_radio_menu_item_new_with_label(NULL, "No Camera"); gtk_menu_append(GTK_MENU(menu), item); gtk_widget_show(item); gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(OnCommand), GINT_TO_POINTER(ID_CAMERA_FIRST)); for (int CameraIdx = 0; CameraIdx < project->mCameras.GetSize(); CameraIdx++) { GSList* grp = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(item)); item = gtk_radio_menu_item_new_with_label(grp, project->mCameras[CameraIdx]->GetName()); gtk_menu_append(GTK_MENU(menu), item); gtk_widget_show(item); gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(OnCommand), GINT_TO_POINTER(CameraIdx + ID_CAMERA_FIRST + 1)); } menu_separator(menu); gtk_menu_append(GTK_MENU(menu), reset); g_object_unref(reset); } void SystemUpdateTime(bool bAnimation, int nTime, int nTotal) { GtkWidget *item; if (!anim_toolbar.first) return; 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); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_view_step_first")); gtk_widget_set_sensitive (item, nTime != 1); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_view_step_previous")); gtk_widget_set_sensitive (item, nTime > 1); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_view_step_next")); gtk_widget_set_sensitive (item, nTime < nTotal); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_view_step_last")); gtk_widget_set_sensitive (item, 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) { if (!anim_toolbar.play) return; ignore_commands = true; 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); gpointer item = gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_piece_copykeys"); gtk_label_set_text (GTK_LABEL (GTK_BIN (item)->child), bAnimation ? "Copy Keys from Instructions" : "Copy Keys from Animation"); ignore_commands = false; } void SystemUpdateSnap(unsigned short move_snap, unsigned short RotateSnap) { if (!label_snap) return; char Text[256], xy[32], z[32]; lcGetActiveProject()->GetSnapDistanceText(xy, z); sprintf(Text, " M: %s %s R: %d ", xy, z, RotateSnap); gtk_label_set (GTK_LABEL (label_snap), Text); } void SystemUpdateSelected(unsigned long flags, int SelectedCount, Object* Focus) { GtkWidget *item; // select all/none/invert/by name (menu) item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_edit_select_all")); if (!item) return; gtk_widget_set_sensitive (item, (flags & LC_SEL_UNSELECTED) != 0); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_edit_select_none")); gtk_widget_set_sensitive (item, (flags & (LC_SEL_PIECE|LC_SEL_CAMERA|LC_SEL_LIGHT)) != 0); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_edit_select_invert")); gtk_widget_set_sensitive (item, (flags & LC_SEL_NO_PIECES) == 0); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_edit_select_byname")); gtk_widget_set_sensitive (item, (flags & LC_SEL_NO_PIECES) == 0); // cut, copy (menu/toolbar) item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_edit_cut")); gtk_widget_set_sensitive (item, (flags & (LC_SEL_PIECE|LC_SEL_CAMERA|LC_SEL_LIGHT)) != 0); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_edit_copy")); gtk_widget_set_sensitive (item, (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) item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_piece_delete")); gtk_widget_set_sensitive (item, (flags & (LC_SEL_PIECE|LC_SEL_CAMERA|LC_SEL_LIGHT)) != 0); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_piece_array")); gtk_widget_set_sensitive (item, (flags & LC_SEL_PIECE) != 0); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_piece_hide_selected")); gtk_widget_set_sensitive (item, (flags & LC_SEL_PIECE) != 0); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_piece_hide_unselected")); gtk_widget_set_sensitive (item, (flags & LC_SEL_UNSELECTED) != 0); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_piece_unhide_all")); gtk_widget_set_sensitive (item, (flags & LC_SEL_HIDDEN) != 0); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_piece_copykeys")); gtk_widget_set_sensitive (item, (flags & (LC_SEL_PIECE|LC_SEL_CAMERA|LC_SEL_LIGHT)) != 0); // groups (menu) item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_piece_group")); gtk_widget_set_sensitive (item, (flags & LC_SEL_CANGROUP) != 0); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_piece_ungroup")); gtk_widget_set_sensitive (item, (flags & LC_SEL_GROUP) != 0); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_piece_group_add")); gtk_widget_set_sensitive (item, (flags & (LC_SEL_GROUP|LC_SEL_FOCUSGROUP)) == LC_SEL_GROUP); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_piece_group_remove")); gtk_widget_set_sensitive (item, (flags & LC_SEL_FOCUSGROUP) != 0); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_piece_group_edit")); gtk_widget_set_sensitive (item, (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 (String names[4]) { GtkWidget *item; char buf[32]; for (int i = 0; i < 4; i++) { sprintf (buf, "menu_file_recent%d", i+1); item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), buf)); if (!names[i].IsEmpty ()) { if (i == 0) { gtk_label_set_text (GTK_LABEL (GTK_BIN (item)->child), "Recent Files"); gtk_widget_set_sensitive (item, FALSE); } else gtk_widget_hide (item); } else { char text[LC_MAXPATH+4]; sprintf (text, "_%d- %s", i+1, (char*)names[i]); gtk_label_set_text_with_mnemonic(GTK_LABEL(GTK_BIN(item)->child), text); gtk_widget_show(item); gtk_widget_set_sensitive(item, TRUE); } } } void SystemUpdatePaste(bool enable) { gtk_widget_set_sensitive (main_toolbar.paste, enable); GtkWidget *item = GTK_WIDGET (gtk_object_get_data (GTK_OBJECT (((GtkWidget*)(*main_window))), "menu_edit_paste")); gtk_widget_set_sensitive (item, enable); } void SystemUpdatePlay(bool play, bool stop) { gtk_widget_set_sensitive (anim_toolbar.play, play); gtk_widget_set_sensitive (anim_toolbar.stop, stop); } void SystemInit() { } void SystemFinish() { } // FIXME: remove int SystemDoMessageBox(const char* prompt, int mode) { return msgbox_execute (prompt, "LeoCAD", mode); } bool SystemDoDialog(int mode, void* param) { switch (mode) { case LC_DLG_FILE_OPEN_PROJECT: return openprojectdlg_execute ((char*)param) == LC_OK; case LC_DLG_FILE_SAVE_PROJECT: return saveprojectdlg_execute ((char*)param) == LC_OK; case LC_DLG_FILE_MERGE_PROJECT: return openprojectdlg_execute ((char*)param) == LC_OK; case LC_DLG_FILE_OPEN: return openprojectdlg_execute ((char*)param) == LC_OK; case LC_DLG_ABOUT: return aboutdlg_execute(param) == LC_OK; case LC_DLG_ARRAY: return arraydlg_execute(param) == LC_OK; case LC_DLG_HTML: return htmldlg_execute(param) == LC_OK; case LC_DLG_POVRAY: return povraydlg_execute(param) == LC_OK; case LC_DLG_WAVEFRONT: return wavefrontdlg_execute(param) == LC_OK; case LC_DLG_PREFERENCES: return preferencesdlg_execute(param) == LC_OK; case LC_DLG_PICTURE_SAVE: return savepicturedlg_execute (param) == LC_OK; case LC_DLG_MINIFIG: return minifigdlg_execute(param) == LC_OK; case LC_DLG_PROPERTIES: return propertiesdlg_execute(param) == LC_OK; case LC_DLG_LIBRARY: return librarydlg_execute(param) == LC_OK; case LC_DLG_SELECTBYNAME: break; case LC_DLG_STEPCHOOSE: break; case LC_DLG_EDITGROUPS: return groupeditdlg_execute(param) == LC_OK; case LC_DLG_GROUP: return groupdlg_execute(param) == LC_OK; } return false; } void SystemDoPopupMenu(int nMenu, int x, int y) { } void SystemDoWaitCursor(int code) { GdkWindow* window = ((GtkWidget*)(*main_window))->window; if (!GDK_IS_WINDOW(window)) return; if (code == 1) { GdkCursor *cursor = gdk_cursor_new (GDK_WATCH); gdk_window_set_cursor(window, cursor); gdk_cursor_destroy (cursor); } else { GdkCursor *cursor = gdk_cursor_new (GDK_LEFT_PTR); gdk_window_set_cursor(window, cursor); gdk_cursor_destroy (cursor); } } void SystemExportClipboard(lcFile* clip) { } lcFile* SystemImportClipboard() { return NULL; } void SystemSetWindowCaption(char* caption) { gtk_window_set_title (GTK_WINDOW (((GtkWidget*)(*main_window))), caption); } void SystemPieceComboAdd(char* name) { piececombo_add(name); } void SystemCaptureMouse() { } void SystemReleaseMouse() { } void SystemStartProgressBar(int nLower, int nUpper, int nStep, const char* Text) { } void SytemEndProgressBar() { } void SytemStepProgressBar() { }