summaryrefslogtreecommitdiff
path: root/ldmicro/ldmicro.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ldmicro/ldmicro.cpp')
-rw-r--r--ldmicro/ldmicro.cpp1365
1 files changed, 1365 insertions, 0 deletions
diff --git a/ldmicro/ldmicro.cpp b/ldmicro/ldmicro.cpp
new file mode 100644
index 0000000..3e315ce
--- /dev/null
+++ b/ldmicro/ldmicro.cpp
@@ -0,0 +1,1365 @@
+//-----------------------------------------------------------------------------
+// Copyright 2007 Jonathan Westhues
+//
+// This file is part of LDmicro.
+//
+// LDmicro is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// LDmicro 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 General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with LDmicro. If not, see <http://www.gnu.org/licenses/>.
+//------
+//
+// A ladder logic compiler for 8 bit micros: user draws a ladder diagram,
+// with an appropriately constrained `schematic editor,' and then we can
+// simulated it under Windows or generate PIC/AVR code that performs the
+// requested operations. This files contains the program entry point, plus
+// most of the UI logic relating to the main window.
+// Jonathan Westhues, Oct 2004
+//-----------------------------------------------------------------------------
+#include "linuxUI.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "ldmicro.h"
+#include "freezeLD.h"
+#include "mcutable.h"
+#include <iomanip>
+#include <iostream>
+#include <QPushButton>
+// #include <qapplication>
+
+using namespace std;
+
+
+HINSTANCE Instance;
+QApplication* LDmicroApp;
+HWID MainWindow;
+QIcon* MWIcon;
+QMenuBar* MainMenu;
+HWID DrawWindow;
+// parameters used to capture the mouse when implementing our totally non-
+// general splitter control
+//static HHOOK MouseHookHandle;
+static int MouseY;
+
+// For the open/save dialog boxes
+#define LDMICRO_PATTERN "LDmicro Ladder Logic Programs (*.ld)\0*.ld\0" \
+ "All files\0*\0\0"
+char CurrentSaveFile[MAX_PATH];
+static BOOL ProgramChangedNotSaved = FALSE;
+
+#define HEX_PATTERN "Intel Hex Files (*.hex)\0*.hex\0All files\0*\0\0"
+#define C_PATTERN "C Source Files (*.c)\0*.c\0All Files\0*\0\0"
+#define INTERPRETED_PATTERN \
+ "Interpretable Byte Code Files (*.int)\0*.int\0All Files\0*\0\0"
+char CurrentCompileFile[MAX_PATH];
+
+#define TXT_PATTERN "Text Files (*.txt)\0*.txt\0All files\0*\0\0"
+
+// Everything relating to the PLC's program, I/O configuration, processor
+// choice, and so on--basically everything that would be saved in the
+// project file.
+PlcProgram Prog;
+
+/// Function to safely quit program gtk main loop
+gboolean LD_WM_Close_call(GtkWidget *widget, GdkEvent *event, gpointer user_data);
+
+//-----------------------------------------------------------------------------
+// Get a filename with a common dialog box and then save the program to that
+// file and then set our default filename to that.
+//-----------------------------------------------------------------------------
+/*static BOOL SaveAsDialog(void)
+{
+ OPENFILENAME ofn;
+
+ memset(&ofn, 0, sizeof(ofn));
+ ofn.lStructSize = sizeof(ofn);
+ ofn.parentWindow = MainWindow;
+ ofn.lpstrFilter = LDMICRO_PATTERN;
+ ofn.lpstrDefExt = "ld";
+ ofn.lpstrFile = CurrentSaveFile;
+ ofn.nMaxFile = sizeof(CurrentSaveFile);
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
+
+ if(!GetSaveFileName(&ofn))
+ return FALSE;
+
+ if(!SaveProjectToFile(CurrentSaveFile)) {
+ Error(_("Couldn't write to '%s'."), CurrentSaveFile);
+ return FALSE;
+ } else {
+ ProgramChangedNotSaved = FALSE;
+ return TRUE;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Get a filename with a common dialog box and then export the program as
+// an ASCII art drawing.
+//-----------------------------------------------------------------------------
+static void ExportDialog(void)
+{
+ char exportFile[MAX_PATH];
+ OPENFILENAME ofn;
+
+ exportFile[0] = '\0';
+
+ memset(&ofn, 0, sizeof(ofn));
+ ofn.lStructSize = sizeof(ofn);
+ ofn.parentWindow = MainWindow;
+ ofn.lpstrFilter = TXT_PATTERN;
+ ofn.lpstrFile = exportFile;
+ ofn.lpstrDefExt = "txt";
+ ofn.lpstrTitle = _("Export As Text");
+ ofn.nMaxFile = sizeof(exportFile);
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
+
+ if(!GetSaveFileName(&ofn))
+ return;
+
+ ExportDrawingAsText(exportFile);
+}
+
+//-----------------------------------------------------------------------------
+// If we already have a filename, save the program to that. Otherwise same
+// as Save As. Returns TRUE if it worked, else returns FALSE.
+//-----------------------------------------------------------------------------
+static BOOL SaveProgram(void)
+{
+ if(strlen(CurrentSaveFile)) {
+ if(!SaveProjectToFile(CurrentSaveFile)) {
+ Error(_("Couldn't write to '%s'."), CurrentSaveFile);
+ return FALSE;
+ } else {
+ ProgramChangedNotSaved = FALSE;
+ return TRUE;
+ }
+ } else {
+ return SaveAsDialog();
+ }
+}*/
+
+//-----------------------------------------------------------------------------
+// Compile the program to a hex file for the target micro. Get the output
+// file name if necessary, then call the micro-specific compile routines.
+//-----------------------------------------------------------------------------
+static void CompileProgram(BOOL compileAs)
+{
+ if(compileAs || strlen(CurrentCompileFile)==0) {
+ OPENFILENAME ofn;
+
+ memset(&ofn, 0, sizeof(ofn));
+ ofn.lStructSize = sizeof(ofn);
+ ofn.parentWindow = &MainWindow;
+ ofn.lpstrTitle = _("Compile To");
+ if(Prog.mcu && Prog.mcu->whichIsa == ISA_ANSIC) {
+ ofn.lpstrFilter = C_PATTERN;
+ ofn.lpstrDefExt = "c";
+ } else if(Prog.mcu && Prog.mcu->whichIsa == ISA_INTERPRETED) {
+ ofn.lpstrFilter = INTERPRETED_PATTERN;
+ ofn.lpstrDefExt = "int";
+ } else {
+ ofn.lpstrFilter = HEX_PATTERN;
+ ofn.lpstrDefExt = "hex";
+ }
+ ofn.lpstrFile = CurrentCompileFile;
+ ofn.nMaxFile = sizeof(CurrentCompileFile);
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;
+
+ if(!GetSaveFileName(&ofn))
+ return;
+
+ // hex output filename is stored in the .ld file
+ ProgramChangedNotSaved = TRUE;
+ }
+
+ if(!GenerateIntermediateCode()) return;
+
+ if(Prog.mcu == NULL) {
+ Error(_("Must choose a target microcontroller before compiling."));
+ return;
+ }
+
+ if(UartFunctionUsed() && Prog.mcu->uartNeeds.rxPin == 0) {
+ Error(_("UART function used but not supported for this micro."));
+ return;
+ }
+
+ if(PwmFunctionUsed() && Prog.mcu->pwmNeedsPin == 0) {
+ Error(_("PWM function used but not supported for this micro."));
+ return;
+ }
+
+ switch(Prog.mcu->whichIsa) {
+ case ISA_AVR: CompileAvr(CurrentCompileFile); break;
+ case ISA_PIC16: CompilePic16(CurrentCompileFile); break;
+ case ISA_ANSIC: CompileAnsiC(CurrentCompileFile); break;
+ case ISA_INTERPRETED: CompileInterpreted(CurrentCompileFile); break;
+ case ISA_ARDUINO: CompileArduino(CurrentCompileFile); break;
+
+ default: oops();
+ }
+
+ IntDumpListing("t.pl");
+}
+
+//-----------------------------------------------------------------------------
+// If the program has been modified then give the user the option to save it
+// or to cancel the operation they are performing. Return TRUE if they want
+// to cancel.
+//-----------------------------------------------------------------------------
+/*BOOL CheckSaveUserCancels(void)
+{
+ if(!ProgramChangedNotSaved) {
+ // no problem
+ return FALSE;
+ }
+
+ int r = MessageBox(MainWindow,
+ _("The program has changed since it was last saved.\r\n\r\n"
+ "Do you want to save the changes?"), "LDmicro",
+ MB_YESNOCANCEL | MB_ICONWARNING);
+ switch(r) {
+ case IDYES:
+ if(SaveProgram())
+ return FALSE;
+ else
+ return TRUE;
+
+ case IDNO:
+ return FALSE;
+
+ case IDCANCEL:
+ return TRUE;
+
+ default:
+ return TRUE;
+ oops();
+ }
+
+}
+
+//-----------------------------------------------------------------------------
+// Load a new program from a file. If it succeeds then set our default filename
+// to that, else we end up with an empty file then.
+//-----------------------------------------------------------------------------
+static void OpenDialog(void)
+{
+ OPENFILENAME ofn;
+
+ char tempSaveFile[MAX_PATH] = "";
+
+ memset(&ofn, 0, sizeof(ofn));
+ ofn.lStructSize = sizeof(ofn);
+ ofn.parentWindow = MainWindow;
+ ofn.lpstrFilter = LDMICRO_PATTERN;
+ ofn.lpstrDefExt = "ld";
+ ofn.lpstrFile = tempSaveFile;
+ ofn.nMaxFile = sizeof(tempSaveFile);
+ ofn.Flags = OFN_PATHMUSTEXIST | OFN_HIDEREADONLY;
+
+ if(!GetOpenFileName(&ofn))
+ return;
+
+ if(!LoadProjectFromFile(tempSaveFile)) {
+ Error(_("Couldn't open '%s'."), tempSaveFile);
+ CurrentSaveFile[0] = '\0';
+ } else {
+ ProgramChangedNotSaved = FALSE;
+ strcpy(CurrentSaveFile, tempSaveFile);
+ UndoFlush();
+ }
+
+ GenerateIoListDontLoseSelection();
+ RefreshScrollbars();
+ UpdateMainWindowTitleBar();
+}
+
+//-----------------------------------------------------------------------------
+// Housekeeping required when the program changes: mark the program as
+// changed so that we ask if user wants to save before exiting, and update
+// the I/O list.
+//-----------------------------------------------------------------------------
+void ProgramChanged(void)
+{
+ ProgramChangedNotSaved = TRUE;
+ GenerateIoListDontLoseSelection();
+ RefreshScrollbars();
+}
+#define CHANGING_PROGRAM(x) { \
+ UndoRemember(); \
+ x; \
+ ProgramChanged();\
+ }*/
+
+//-----------------------------------------------------------------------------
+// Hook that we install when the user starts dragging the `splitter,' in case
+// they drag it out of the narrow area of the drawn splitter bar. Resize
+// the listview in response to mouse move, and unhook ourselves when they
+// release the mouse button.
+//-----------------------------------------------------------------------------
+// static LRESULT CALLBACK MouseHook(int code, WPARAM wParam, LPARAM lParam)
+// {
+// switch(code) {
+// case HC_ACTION: {
+// MSLLHOOKSTRUCT *mhs = (MSLLHOOKSTRUCT *)lParam;
+
+// switch(wParam) {
+// case WM_MOUSEMOVE: {
+// int dy = MouseY - mhs->pt.y;
+
+// IoListHeight += dy;
+// if(IoListHeight < 50) IoListHeight = 50;
+// MouseY = mhs->pt.y;
+// MainWindowResized();
+
+// break;
+// }
+
+// case WM_LBUTTONUP:
+// UnhookWindowsHookEx(MouseHookHandle);
+// break;
+// }
+// break;
+// }
+// }
+// return CallNextHookEx(MouseHookHandle, code, wParam, lParam);
+// }
+
+//-----------------------------------------------------------------------------
+// Handle a selection from the menu bar of the main window.
+//-----------------------------------------------------------------------------
+// static void ProcessMenu(int code)
+// {
+// if(code >= MNU_PROCESSOR_0 && code < MNU_PROCESSOR_0+NUM_SUPPORTED_MCUS) {
+// strcpy(CurrentCompileFile, "");
+// Prog.mcu = &SupportedMcus[code - MNU_PROCESSOR_0];
+// RefreshControlsToSettings();
+// return;
+// }
+// if(code == MNU_PROCESSOR_0+NUM_SUPPORTED_MCUS) {
+// Prog.mcu = NULL;
+// strcpy(CurrentCompileFile, "");
+// RefreshControlsToSettings();
+// return;
+// }
+
+// switch(code) {
+// case MNU_NEW:
+// if(CheckSaveUserCancels()) break;
+// NewProgram();
+// strcpy(CurrentSaveFile, "");
+// strcpy(CurrentCompileFile, "");
+// GenerateIoListDontLoseSelection();
+// RefreshScrollbars();
+// UpdateMainWindowTitleBar();
+// break;
+
+// case MNU_OPEN:
+// if(CheckSaveUserCancels()) break;
+// OpenDialog();
+// break;
+
+// case MNU_SAVE:
+// SaveProgram();
+// UpdateMainWindowTitleBar();
+// break;
+
+// case MNU_SAVE_AS:
+// SaveAsDialog();
+// UpdateMainWindowTitleBar();
+// break;
+
+// case MNU_EXPORT:
+// ExportDialog();
+// break;
+
+// case MNU_EXIT:
+// if(CheckSaveUserCancels()) break;
+// LD_WM_Close_call(NULL, NULL, NULL);
+// // PostQuitMessage(0);
+// break;
+
+// case MNU_INSERT_COMMENT:
+// CHANGING_PROGRAM(AddComment(_("--add comment here--")));
+// break;
+
+// case MNU_INSERT_CONTACTS:
+// CHANGING_PROGRAM(AddContact());
+// break;
+
+// case MNU_INSERT_COIL:
+// CHANGING_PROGRAM(AddCoil());
+// break;
+
+// case MNU_INSERT_TON:
+// CHANGING_PROGRAM(AddTimer(ELEM_TON));
+// break;
+
+// case MNU_INSERT_TOF:
+// CHANGING_PROGRAM(AddTimer(ELEM_TOF));
+// break;
+
+// case MNU_INSERT_RTO:
+// CHANGING_PROGRAM(AddTimer(ELEM_RTO));
+// break;
+
+// case MNU_INSERT_CTU:
+// CHANGING_PROGRAM(AddCounter(ELEM_CTU));
+// break;
+
+// case MNU_INSERT_CTD:
+// CHANGING_PROGRAM(AddCounter(ELEM_CTD));
+// break;
+
+// case MNU_INSERT_CTC:
+// CHANGING_PROGRAM(AddCounter(ELEM_CTC));
+// break;
+
+// case MNU_INSERT_RES:
+// CHANGING_PROGRAM(AddReset());
+// break;
+
+// case MNU_INSERT_OPEN:
+// CHANGING_PROGRAM(AddEmpty(ELEM_OPEN));
+// break;
+
+// case MNU_INSERT_SHORT:
+// CHANGING_PROGRAM(AddEmpty(ELEM_SHORT));
+// break;
+
+// case MNU_INSERT_MASTER_RLY:
+// CHANGING_PROGRAM(AddMasterRelay());
+// break;
+
+// case MNU_INSERT_SHIFT_REG:
+// CHANGING_PROGRAM(AddShiftRegister());
+// break;
+
+// case MNU_INSERT_LUT:
+// CHANGING_PROGRAM(AddLookUpTable());
+// break;
+
+// case MNU_INSERT_PWL:
+// CHANGING_PROGRAM(AddPiecewiseLinear());
+// break;
+
+// case MNU_INSERT_FMTD_STR:
+// CHANGING_PROGRAM(AddFormattedString());
+// break;
+
+// case MNU_INSERT_OSR:
+// CHANGING_PROGRAM(AddEmpty(ELEM_ONE_SHOT_RISING));
+// break;
+
+// case MNU_INSERT_OSF:
+// CHANGING_PROGRAM(AddEmpty(ELEM_ONE_SHOT_FALLING));
+// break;
+
+// case MNU_INSERT_MOV:
+// CHANGING_PROGRAM(AddMove());
+// break;
+
+// case MNU_INSERT_SET_PWM:
+// CHANGING_PROGRAM(AddSetPwm());
+// break;
+
+// case MNU_INSERT_READ_ADC:
+// CHANGING_PROGRAM(AddReadAdc());
+// break;
+
+// case MNU_INSERT_UART_SEND:
+// CHANGING_PROGRAM(AddUart(ELEM_UART_SEND));
+// break;
+
+// case MNU_INSERT_UART_RECV:
+// CHANGING_PROGRAM(AddUart(ELEM_UART_RECV));
+// break;
+
+// case MNU_INSERT_PERSIST:
+// CHANGING_PROGRAM(AddPersist());
+// break;
+
+// {
+// int elem;
+// case MNU_INSERT_ADD: elem = ELEM_ADD; goto math;
+// case MNU_INSERT_SUB: elem = ELEM_SUB; goto math;
+// case MNU_INSERT_MUL: elem = ELEM_MUL; goto math;
+// case MNU_INSERT_DIV: elem = ELEM_DIV; goto math;
+// math:
+// CHANGING_PROGRAM(AddMath(elem));
+// break;
+// }
+
+// {
+// int elem;
+// case MNU_INSERT_EQU: elem = ELEM_EQU; goto cmp;
+// case MNU_INSERT_NEQ: elem = ELEM_NEQ; goto cmp;
+// case MNU_INSERT_GRT: elem = ELEM_GRT; goto cmp;
+// case MNU_INSERT_GEQ: elem = ELEM_GEQ; goto cmp;
+// case MNU_INSERT_LES: elem = ELEM_LES; goto cmp;
+// case MNU_INSERT_LEQ: elem = ELEM_LEQ; goto cmp;
+// cmp:
+// CHANGING_PROGRAM(AddCmp(elem));
+// break;
+// }
+
+// case MNU_MAKE_NORMAL:
+// CHANGING_PROGRAM(MakeNormalSelected());
+// break;
+
+// case MNU_NEGATE:
+// CHANGING_PROGRAM(NegateSelected());
+// break;
+
+// case MNU_MAKE_SET_ONLY:
+// CHANGING_PROGRAM(MakeSetOnlySelected());
+// break;
+
+// case MNU_MAKE_RESET_ONLY:
+// CHANGING_PROGRAM(MakeResetOnlySelected());
+// break;
+
+// case MNU_UNDO:
+// UndoUndo();
+// break;
+
+// case MNU_REDO:
+// UndoRedo();
+// break;
+
+// case MNU_INSERT_RUNG_BEFORE:
+// CHANGING_PROGRAM(InsertRung(FALSE));
+// break;
+
+// case MNU_INSERT_RUNG_AFTER:
+// CHANGING_PROGRAM(InsertRung(TRUE));
+// break;
+
+// case MNU_DELETE_RUNG:
+// CHANGING_PROGRAM(DeleteSelectedRung());
+// break;
+
+// case MNU_PUSH_RUNG_UP:
+// CHANGING_PROGRAM(PushRungUp());
+// break;
+
+// case MNU_PUSH_RUNG_DOWN:
+// CHANGING_PROGRAM(PushRungDown());
+// break;
+
+// case MNU_DELETE_ELEMENT:
+// CHANGING_PROGRAM(DeleteSelectedFromProgram());
+// break;
+
+// case MNU_MCU_SETTINGS:
+// CHANGING_PROGRAM(ShowConfDialog());
+// break;
+
+// case MNU_SIMULATION_MODE:
+// ToggleSimulationMode();
+// break;
+
+// case MNU_START_SIMULATION:
+// StartSimulation();
+// break;
+
+// case MNU_STOP_SIMULATION:
+// StopSimulation();
+// break;
+
+// case MNU_SINGLE_CYCLE:
+// SimulateOneCycle(TRUE);
+// break;
+
+// case MNU_COMPILE:
+// CompileProgram(FALSE);
+// break;
+
+// case MNU_COMPILE_AS:
+// CompileProgram(TRUE);
+// break;
+
+// case MNU_MANUAL:
+// ShowHelpDialog(FALSE);
+// break;
+
+// case MNU_ABOUT:
+// ShowHelpDialog(TRUE);
+// break;
+// }
+// gtk_widget_queue_draw(DrawWindow);
+// }
+
+// //-----------------------------------------------------------------------------
+// // WndProc functions for MainWindow.
+// //-----------------------------------------------------------------------------
+// gboolean LD_WM_KeyDown_call(GtkWidget *widget, GdkEventKey *event, gpointer user_data)
+// {
+// /* Handles:
+// * WM_KEYDOWN
+// */
+
+// UINT wParam = event->keyval;
+
+// if(wParam == VK_TAB) {
+// // SetFocus(IoList);
+// gtk_window_set_focus (GTK_WINDOW(MainWindow), view);
+// // BlinkCursor(0, 0, 0, 0);
+
+// }
+
+// if(InSimulationMode)
+// {
+// switch(wParam)
+// {
+// case VK_DOWN:
+// if(ScrollYOffset < ScrollYOffsetMax)
+// ScrollYOffset++;
+// RefreshScrollbars();
+// gtk_widget_queue_draw(DrawWindow);
+// break;
+
+// case VK_UP:
+// if(ScrollYOffset > 0)
+// ScrollYOffset--;
+// RefreshScrollbars();
+// gtk_widget_queue_draw(DrawWindow);
+// break;
+
+// case VK_LEFT:
+// ScrollXOffset -= FONT_WIDTH;
+// if(ScrollXOffset < 0)
+// ScrollXOffset = 0;
+// RefreshScrollbars();
+// gtk_widget_queue_draw(DrawWindow);
+// break;
+
+// case VK_RIGHT:
+// ScrollXOffset += FONT_WIDTH;
+// if(ScrollXOffset >= ScrollXOffsetMax)
+// ScrollXOffset = ScrollXOffsetMax;
+// RefreshScrollbars();
+// gtk_widget_queue_draw(DrawWindow);
+// break;
+
+// case VK_RETURN:
+// case VK_ESCAPE:
+// ToggleSimulationMode();
+// break;
+// }
+// }
+
+// switch(wParam)
+// {
+// case VK_UP:
+// if(event->state & GDK_SHIFT_MASK)
+// {
+// CHANGING_PROGRAM(PushRungUp());
+// }
+// else
+// {
+// MoveCursorKeyboard(wParam);
+// }
+
+// gtk_widget_queue_draw(DrawWindow);
+// break;
+
+// case VK_DOWN:
+// if(event->state & GDK_SHIFT_MASK)
+// {
+// CHANGING_PROGRAM(PushRungDown());
+// }
+// else
+// {
+// MoveCursorKeyboard(wParam);
+// }
+
+// gtk_widget_queue_draw(DrawWindow);
+// break;
+
+// case VK_RIGHT:
+// case VK_LEFT:
+// MoveCursorKeyboard(wParam);
+// gtk_widget_queue_draw(DrawWindow);
+// break;
+
+// case VK_RETURN:
+// CHANGING_PROGRAM(EditSelectedElement());
+// gtk_widget_queue_draw(DrawWindow);
+// break;
+
+// default:
+// break;
+// }
+
+// return FALSE;
+// }
+
+// gboolean LD_WM_Close_call(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+// {
+// /* Handles:
+// * WM_CLOSE
+// */
+
+// if(CheckSaveUserCancels())
+// return TRUE;
+// GdkRectangle allocation;
+// gtk_widget_get_allocation(GTK_WIDGET(view), &allocation);
+// IoListHeight = allocation.height;
+// FreezeWindowPos(MainWindow);
+// FreezeDWORD(IoListHeight);
+// g_print("List Height close: %d\n",IoListHeight);
+
+// gtk_main_quit();
+// gdk_threads_leave();
+// }
+
+// gboolean LD_GTK_mouse_click_hook(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+// {
+// /* Handles:
+// * WM_LBUTTONDBLCLK, WM_LBUTTONDOWN
+// */
+
+// RECT Rect;
+// GetWindowRect(ScrollWindow, &Rect);
+// int wy;
+// gtk_window_get_position(GTK_WINDOW(MainWindow), NULL, &wy);
+
+// // g_print("net: %i\n", wy + 30 + Rect.bottom);
+
+// /// Identify if mouse is clicked outside drawing area
+// if (wy + 30 + Rect.bottom < event->button.y_root)
+// return FALSE;
+
+// GtkAdjustment *adjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(ScrollWindow));
+
+// switch(event->button.type)
+// {
+// case GDK_BUTTON_PRESS:
+// if (event->button.button == 1) /// left click
+// {
+// GLOBAL_mouse_last_clicked_x = event->button.x_root;
+// GLOBAL_mouse_last_clicked_y = event->button.y_root;
+
+// int x = event->button.x;
+// int y = event->button.y - 30 + gtk_adjustment_get_value(adjustment);
+
+// if(!InSimulationMode) MoveCursorMouseClick(x, y);
+
+// gtk_widget_queue_draw(DrawWindow);
+// }
+// break;
+// case GDK_2BUTTON_PRESS:
+// if (event->button.button == 1) /// left click
+// {
+// GLOBAL_mouse_last_clicked_x = event->button.x_root;
+// GLOBAL_mouse_last_clicked_y = event->button.y_root;
+
+// int x = event->button.x;
+// int y = event->button.y - 30 + gtk_adjustment_get_value(adjustment);
+
+// if(InSimulationMode) {
+// EditElementMouseDoubleclick(x, y);
+// } else {
+// CHANGING_PROGRAM(EditElementMouseDoubleclick(x, y));
+// }
+// gtk_widget_queue_draw(DrawWindow);
+// }
+// break;
+
+// }
+// return FALSE;
+// }
+
+// gboolean LD_GTK_mouse_scroll_hook(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+// {
+// /* Handles:
+// * WM_VSCROLL, WM_HSCROLL, WM_MOUSEWHEEL
+// */
+
+// GtkAdjustment *adjustment = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(ScrollWindow));
+
+// switch(event->scroll.direction)
+// {
+// case GDK_SCROLL_UP:
+// if (gtk_adjustment_get_value(adjustment) == gtk_adjustment_get_lower(adjustment))
+// VscrollProc(SB_TOP);
+// else
+// VscrollProc(SB_LINEUP);
+// break;
+// case GDK_SCROLL_DOWN:
+// if (gtk_adjustment_get_value(adjustment) == gtk_adjustment_get_upper(adjustment) - gtk_widget_get_allocated_height (ScrollWindow))
+// VscrollProc(SB_BOTTOM);
+// else
+// VscrollProc(SB_LINEDOWN);
+// break;
+// case GDK_SCROLL_LEFT:
+// HscrollProc(SB_LINEUP);
+// break;
+// case GDK_SCROLL_RIGHT:
+// HscrollProc(SB_LINEDOWN);
+// break;
+// case GDK_SCROLL_SMOOTH:
+// double d_x, d_y;
+// gdk_event_get_scroll_deltas (event, &d_x, &d_y);
+// if(d_y > 0) {
+// VscrollProc(SB_LINEUP);
+// } else {
+// VscrollProc(SB_LINEDOWN);
+// }
+// break;
+
+// }
+
+// gtk_widget_queue_draw(DrawWindow);
+// return FALSE;
+// }
+
+// gboolean LD_WM_MouseMove_call(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+// {
+// /* Handles:
+// * WM_MOUSEMOVE
+// */
+
+// // int x = LOWORD(lParam);
+// // int y = HIWORD(lParam);
+
+// // if((y > (IoListTop - 9)) && (y < (IoListTop + 3))) {
+// // SetCursor(LoadCursor(NULL, IDC_SIZENS));
+// // } else {
+// // SetCursor(LoadCursor(NULL, IDC_ARROW));
+// // }
+
+// // int dy = MouseY - mhs->pt.y;
+
+// // int dy = MouseY - mhs->pt.y;
+
+// // IoListHeight += dy;
+// // if(IoListHeight < 50) IoListHeight = 50;
+// // MouseY = mhs->pt.y;
+// // MainWindowResized();
+
+// return FALSE;
+// }
+
+// gboolean LD_WM_Paint_call(HWID widget, HCRDC cr, gpointer data)
+// {
+// /* Handles:
+// * WM_PAINT
+// */
+
+// static BOOL Paint_call_first = TRUE;
+
+// if (Paint_call_first)
+// {
+// gtk_widget_override_background_color(GTK_WIDGET(widget),
+// GTK_STATE_FLAG_NORMAL, (HBRUSH)GetStockObject(BLACK_BRUSH));
+
+// gint width = gtk_widget_get_allocated_width (widget);
+// gint height = gtk_widget_get_allocated_height (widget);
+
+// gtk_widget_set_size_request(widget, width, height + 1);
+
+// gdk_cairo_set_source_rgba (cr, (HBRUSH)GetStockObject(BLACK_BRUSH));
+
+// cairo_rectangle(cr, 0, 0, width, height);
+// cairo_stroke_preserve(cr);
+
+// cairo_fill (cr);
+
+// Paint_call_first = FALSE;
+// }
+
+// /// This draws the schematic.
+// MainWindowResized();
+// PaintWindow(cr);
+
+// return FALSE;
+// }
+
+// gboolean LD_WM_Destroy_call(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+// {
+// /* Handles:
+// * WM_DESTROY
+// */
+
+// if(CheckSaveUserCancels())
+// return TRUE;
+
+// FreezeWindowPos(MainWindow);
+// FreezeDWORD(IoListHeight);
+
+// gtk_main_quit();
+// gdk_threads_leave();
+// }
+
+// gboolean LD_WM_Size_call(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+// {
+// /* Handles:
+// * WM_SIZE
+// */
+// MainWindowResized();
+// return FALSE;
+// }
+
+// gboolean LD_WM_Command_call(GtkMenuItem* men, gpointer gpcode)
+// {
+// int tempcode = GPOINTER_TO_INT(gpcode);
+// ProcessMenu (tempcode);
+
+// return FALSE;
+// }
+
+// void ProcessorCall(GtkCheckMenuItem* men, gpointer gpcode)
+// {
+// int tempcode = GPOINTER_TO_INT(gpcode);
+// if(gtk_check_menu_item_get_active(men))
+// {
+// ProcessMenu (tempcode);
+// }
+// }
+
+// gboolean LD_WM_SetFocus_call(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+// {
+// /* Handles:
+// * WM_SETFOCUS
+// */
+
+// InvalidateRect(DrawWindow, NULL, FALSE);
+
+// return FALSE;
+// }
+
+// void LD_WM_Notify_Row_Activate_call(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
+// {
+// /* Handles:
+// * WM_NOTIFY
+// */
+
+// // g_print("Row activated!\n");
+
+// int *ip = gtk_tree_path_get_indices ( path );
+
+// NMHDR h;
+// h.code = LVN_ITEMACTIVATE;
+// h.item.iItem = ip[0];
+// h.hlistFrom = IoList;
+
+// IoListProc(&h);
+// }
+
+// void LD_WM_Notify_Cursor_Change_call(GtkTreeView *tree_view, gpointer user_data)
+// {
+// /* Handles:
+// * WM_NOTIFY
+// */
+
+// ITLIST iter;
+
+// // BOOL empty = !gtk_tree_model_get_iter_first (IoList, &iter);
+// // g_print("empty = %i\n", (empty == TRUE) );
+
+// HLIST pTreeModel;
+// int *ip;
+// GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
+// gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+// if(gtk_tree_selection_get_selected (selection, &pTreeModel, &iter))
+// {
+// GtkTreePath *path = gtk_tree_model_get_path ( pTreeModel , &iter ) ;
+// ip = gtk_tree_path_get_indices ( path );
+// }
+// else
+// if(!gtk_tree_model_get_iter_first (IoList, &iter))
+// return;
+
+// NMHDR h;
+// h.code = LVN_GETDISPINFO;
+// h.item.iItem = (ip == NULL) ? 0 : ip[0];
+// h.hlistFrom = IoList;
+// h.hlistIter = &iter;
+// IoListProc(&h);
+// }
+
+inline void MenuHandler ()
+{
+ QObject::connect(ExitMenu, SIGNAL(triggered()), LDmicroApp, SLOT(quit()));
+ // QObject::connect(ExitMenu, SIGNAL(changed()), LDmicroApp, SLOT(aboutQt()));
+// g_signal_connect(G_OBJECT(NewMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_NEW));
+
+// g_signal_connect(G_OBJECT(OpenMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_OPEN));
+
+// g_signal_connect(G_OBJECT(SaveMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_SAVE));
+
+// g_signal_connect(G_OBJECT(SaveAsMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_SAVE_AS));
+
+// g_signal_connect(G_OBJECT(ExportMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_EXPORT));
+
+// g_signal_connect(G_OBJECT(ExitMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_EXIT));
+
+// g_signal_connect(G_OBJECT(InsertCommentMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_COMMENT));
+
+// g_signal_connect(G_OBJECT(InsertContactsMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_CONTACTS));
+
+// g_signal_connect(G_OBJECT(InsertCoilMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_COIL));
+
+// g_signal_connect(G_OBJECT(InsertTonMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_TON));
+
+// g_signal_connect(G_OBJECT(InsertTofMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_TOF));
+
+// g_signal_connect(G_OBJECT(InsertRtoMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_RTO));
+
+// g_signal_connect(G_OBJECT(InsertCtuMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_CTU));
+
+// g_signal_connect(G_OBJECT(InsertCtdMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_CTD));
+
+// g_signal_connect(G_OBJECT(InsertCtcMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_CTC));
+
+// g_signal_connect(G_OBJECT(InsertResMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_RES));
+
+// g_signal_connect(G_OBJECT(InsertOpenMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_OPEN));
+
+// g_signal_connect(G_OBJECT(InsertShortMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_SHORT));
+
+// g_signal_connect(G_OBJECT(InsertMasterRlyMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_MASTER_RLY));
+
+// g_signal_connect(G_OBJECT(InsertShiftRegMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_SHIFT_REG));
+
+// g_signal_connect(G_OBJECT(InsertLutMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_LUT));
+
+// g_signal_connect(G_OBJECT(InsertPwlMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_PWL));
+
+// g_signal_connect(G_OBJECT(InsertFmtdStrMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_FMTD_STR));
+
+// g_signal_connect(G_OBJECT(InsertOsrMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_OSR));
+
+// g_signal_connect(G_OBJECT(InsertOsfMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_OSF));
+
+// g_signal_connect(G_OBJECT(InsertMovMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_MOV));
+
+// g_signal_connect(G_OBJECT(InsertSetPwmMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_SET_PWM));
+
+// g_signal_connect(G_OBJECT(InsertReadAdcMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_READ_ADC));
+
+// g_signal_connect(G_OBJECT(InsertUartSendMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_UART_SEND));
+
+// g_signal_connect(G_OBJECT(InsertUartRecvMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_UART_RECV));
+
+// g_signal_connect(G_OBJECT(InsertPersistMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_PERSIST));
+
+// g_signal_connect(G_OBJECT(InsertAddMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_ADD));
+
+// g_signal_connect(G_OBJECT(InsertSubMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_SUB));
+
+// g_signal_connect(G_OBJECT(InsertMulMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_MUL));
+
+// g_signal_connect(G_OBJECT(InsertDivMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_DIV));
+
+// g_signal_connect(G_OBJECT(InsertEquMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_EQU));
+
+// g_signal_connect(G_OBJECT(InsertNeqMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_NEQ));
+
+// g_signal_connect(G_OBJECT(InsertGrtMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_GRT));
+
+// g_signal_connect(G_OBJECT(InsertGeqMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_GEQ));
+
+// g_signal_connect(G_OBJECT(InsertLesMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_LES));
+
+// g_signal_connect(G_OBJECT(InsertLeqMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_LEQ));
+
+// g_signal_connect(G_OBJECT(MakeNormalMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_MAKE_NORMAL));
+
+// g_signal_connect(G_OBJECT(NegateMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_NEGATE));
+
+// g_signal_connect(G_OBJECT(MakeSetOnlyMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_MAKE_SET_ONLY));
+
+// g_signal_connect(G_OBJECT(MakeResetOnlyMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_MAKE_RESET_ONLY));
+
+// g_signal_connect(G_OBJECT(UndoMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_UNDO));
+
+// g_signal_connect(G_OBJECT(RedoMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_REDO));
+
+// g_signal_connect(G_OBJECT(InsertRungBeforeMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_RUNG_BEFORE));
+
+// g_signal_connect(G_OBJECT(InsertRungAfterMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_INSERT_RUNG_AFTER));
+
+// g_signal_connect(G_OBJECT(DeleteRungMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_DELETE_RUNG));
+
+// g_signal_connect(G_OBJECT(PushRungUpMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_PUSH_RUNG_UP));
+
+// g_signal_connect(G_OBJECT(PushRungDownMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_PUSH_RUNG_DOWN));
+
+// g_signal_connect(G_OBJECT(DeleteElementMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_DELETE_ELEMENT));
+
+// g_signal_connect(G_OBJECT(McuSettingsMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_MCU_SETTINGS));
+
+// g_signal_connect(G_OBJECT(SimulationModeMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_SIMULATION_MODE));
+
+// g_signal_connect(G_OBJECT(StartSimulationMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_START_SIMULATION));
+
+// g_signal_connect(G_OBJECT(StopSimulationMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_STOP_SIMULATION));
+
+// g_signal_connect(G_OBJECT(SingleCycleMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_SINGLE_CYCLE));
+
+// g_signal_connect(G_OBJECT(CompileMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_COMPILE));
+
+// g_signal_connect(G_OBJECT(CompileAsMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_COMPILE_AS));
+
+// g_signal_connect(G_OBJECT(ManualMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_MANUAL));
+
+// g_signal_connect(G_OBJECT(AboutMenu), "activate",
+// G_CALLBACK(LD_WM_Command_call), GINT_TO_POINTER(MNU_ABOUT));
+// // Connect microcontroller signals automatically
+// for(int i = 0; i < NUM_SUPPORTED_MCUS; i++)
+// {
+// g_signal_connect(G_OBJECT(ProcessorMenuItems[i]), "toggled",
+// G_CALLBACK(ProcessorCall), GINT_TO_POINTER((MNU_PROCESSOR_0 + i)));
+// }
+}
+
+//-----------------------------------------------------------------------------
+// Entry point into the program.
+//-----------------------------------------------------------------------------
+int main(int argc, char** argv)
+{
+ /// Check if we're running in non-interactive mode; in that case we should
+ /// load the file, compile, and exit.
+ if(argc >= 2) {
+ RunningInBatchMode = TRUE;
+ char *err =
+ "Bad command line arguments: run 'ldmicro /c src.ld dest.hex'\n";
+ if(argc < 4)
+ {
+ printf(err);
+ exit(-1);
+ }
+ char *source = (char*)malloc(strlen(argv[2]) + strlen(argv[3]) + 2);
+ sprintf(source, "%s %s", argv[2], argv[3]);
+
+ while(isspace(*source)) {
+ source++;
+ }
+ if(*source == '\0')
+ {
+ Error(err);
+ free(source);
+ exit(-1);
+ }
+
+ char *dest = source;
+ while(!isspace(*dest) && *dest) {
+ dest++;
+ }
+ if(*dest == '\0')
+ {
+ Error(err);
+ free(source);
+ exit(-1);
+ }
+ *dest = '\0'; dest++;
+ while(isspace(*dest)) {
+ dest++;
+ }
+
+ if(*dest == '\0')
+ {
+ Error(err);
+ free(source);
+ exit(-1);
+ }
+
+ if(!LoadProjectFromFile(source)) {
+ Error("Couldn't open '%s', running non-interactively.\n", source);
+ free(source);
+ exit(-1);
+ }
+ strcpy(CurrentCompileFile, dest);
+ GenerateIoList(-1);
+ CompileProgram(FALSE);
+ exit(0);
+ }
+
+ //Basic qt application
+ ::QApplication app(argc, argv);
+ LDmicroApp = &app;
+ MainHeap = HeapCreate(0, 1024*64, 0);
+ QSize MwSize(800,600);
+
+ // Make main window
+ MainWindow = new QWidget;
+ MWIcon = new QIcon(LDMICRO_ICON);
+ MainMenu = new QMenuBar(MainWindow);
+
+ // QMenu TopMenu("Top Menu", MainWindow);
+ // MainMenu->addMenu(&TopMenu);
+ // MainWindow->layout()->setMenuBar(MainMenu);
+ MainWindow->setWindowTitle("LDmicro");
+ MainWindow->resize(MwSize);
+ MainWindow->move( 10, 10);
+ // MainWindow->setStyleSheet("background-color: black;");
+ //Default Icon for entire app
+ app.setWindowIcon(*MWIcon);
+ //Icon for main window
+ MainWindow->setWindowIcon(*MWIcon);
+ MakeMainWindowMenus();
+ InitForDrawing();
+ MakeMainWindowControls();
+ MainWindow->show();
+ MainWindowResized();
+ MenuHandler();
+ // MakeDialogBoxClass();
+
+
+ /*ThawWindowPos(MainWindow);
+ ThawDWORD(IoListHeight);
+ g_print("IoListHeight start: %d\n", IoListHeight);
+ MakeMainWindowControls(); /// takes care of MakeMainWindowMenus()
+ MainWindowResized();
+
+ /// Keyboard and mouse hooks equivalent to MainWndProc
+ g_signal_connect (MainWindow, "delete_event", G_CALLBACK (LD_WM_Close_call), NULL);
+ g_signal_connect (MainWindow, "key_press_event", G_CALLBACK (LD_WM_KeyDown_call), NULL);
+ g_signal_connect (MainWindow, "button_press_event", G_CALLBACK (LD_GTK_mouse_click_hook), NULL);
+ g_signal_connect (MainWindow, "scroll_event", G_CALLBACK (LD_GTK_mouse_scroll_hook), NULL);
+ g_signal_connect (MainWindow, "motion_notify_event", G_CALLBACK (LD_WM_MouseMove_call), NULL);
+ g_signal_connect (DrawWindow, "draw", G_CALLBACK (LD_WM_Paint_call), NULL);
+ g_signal_connect (MainWindow, "destroy_event", G_CALLBACK (LD_WM_Destroy_call), NULL);
+ g_signal_connect (MainWindow, "configure_event", G_CALLBACK (LD_WM_Size_call), NULL);
+ g_signal_connect (MainWindow, "focus_in_event", G_CALLBACK (LD_WM_SetFocus_call), NULL);
+ g_signal_connect (view, "row_activated", G_CALLBACK (LD_WM_Notify_Row_Activate_call), NULL);
+ g_signal_connect (view, "cursor_changed", G_CALLBACK (LD_WM_Notify_Cursor_Change_call), NULL);
+ MenuHandler();
+ /// Keyboard and mouse hooks equivalent to MainWndProc - end
+
+ NewProgram();
+ strcpy(CurrentSaveFile, "");
+
+ /// We are running interactively, or we would already have exited. We
+ /// can therefore show the window now, and otherwise set up the GUI.
+
+ /// Displaying the window
+ gtk_widget_show_all(MainWindow);
+
+ /// Blink cursor
+ SetTimer(DrawWindow, TIMER_BLINK_CURSOR, 200, BlinkCursor);
+ // SetTimer(MainWindow, TIMER_BLINK_CURSOR, 800, BlinkCursor);
+ */
+ /*if(argc >= 2) {
+ char line[MAX_PATH];
+ if(*argv[1] == '"') {
+ strcpy(line, argv[1]+1);
+ } else {
+ strcpy(line, argv[1]);
+ }
+ if(strchr(line, '"')) *strchr(line, '"') = '\0';
+
+ realpath(line, CurrentSaveFile);
+ if(!LoadProjectFromFile(CurrentSaveFile)) {
+ NewProgram();
+ Error(_("Couldn't open '%s'."), CurrentSaveFile);
+ CurrentSaveFile[0] = '\0';
+ }
+ UndoFlush();
+ }*/
+
+ /*GenerateIoListDontLoseSelection();
+ RefreshScrollbars();
+ UpdateMainWindowTitleBar();
+*/
+ // MSG msg;
+ // DWORD ret;
+ // while(ret = GetMessage(&msg, NULL, 0, 0)) {
+ // if(msg.hwnd == IoList && msg.message == WM_KEYDOWN) {
+ // if(msg.wParam == VK_TAB) {
+ // SetFocus(MainWindow);
+ // continue;
+ // }
+ // }
+ // if(msg.message == WM_KEYDOWN && msg.wParam != VK_UP &&
+ // msg.wParam != VK_DOWN && msg.wParam != VK_RETURN && msg.wParam
+ // != VK_SHIFT)
+ // {
+ // if(msg.hwnd == IoList) {
+ // msg.hwnd = MainWindow;
+ // SetFocus(MainWindow);
+ // }
+ // }
+ // TranslateMessage(&msg);
+ // DispatchMessage(&msg);
+ // }
+
+/* gtk_main();
+ return EXIT_SUCCESS;*/
+ return app.exec();
+ delete MainWindow;
+ delete MWIcon;
+} \ No newline at end of file