summaryrefslogtreecommitdiff
path: root/ldmicro
diff options
context:
space:
mode:
Diffstat (limited to 'ldmicro')
-rw-r--r--ldmicro/includes/ldmicro.h2
-rw-r--r--ldmicro/iolist.cpp388
-rw-r--r--ldmicro/ldmicro.cpp26
-rw-r--r--ldmicro/lib/linuxUI/linuxLD.h2
-rw-r--r--ldmicro/lib/linuxUI/linuxUI.cpp7
-rw-r--r--ldmicro/maincontrols.cpp17
-rw-r--r--ldmicro/miscutil.cpp33
-rw-r--r--ldmicro/simulate.cpp4
-rw-r--r--ldmicro/undoredo.cpp12
9 files changed, 259 insertions, 232 deletions
diff --git a/ldmicro/includes/ldmicro.h b/ldmicro/includes/ldmicro.h
index 1c56074..800f2f0 100644
--- a/ldmicro/includes/ldmicro.h
+++ b/ldmicro/includes/ldmicro.h
@@ -780,7 +780,7 @@ void WriteIhex(FILE *f, BYTE b);
void FinishIhex(FILE *f);
char *IoTypeToString(int ioType);
void PinNumberForIo(char *dest, PlcProgramSingleIo *io);
-HWID CreateWindowClient(GtkWindowType wType, char *windowName,
+HWID CreateWindowClient(GtkWindowType wType, GdkWindowTypeHint wthint, char *windowName,
int x, int y, int width, int height, HWND parent);
void MakeComponentListClass(void);
diff --git a/ldmicro/iolist.cpp b/ldmicro/iolist.cpp
index e3ba581..f20b2f7 100644
--- a/ldmicro/iolist.cpp
+++ b/ldmicro/iolist.cpp
@@ -47,7 +47,6 @@ static BOOL DialogDone;
static BOOL DialogCancel;
static HWID IoDialog;
-static HWID textLabel;
static HWID PinList;
static HWID OkButton;
@@ -397,8 +396,6 @@ void SaveIoListToFile(FILE *f)
//-----------------------------------------------------------------------------
static gboolean AnalogSliderDialogKeyboardProc(GtkWidget* widget, GdkEventKey* event, gpointer name)
{
- // g_print("key click!\n");
-
SWORD v = (SWORD)gtk_range_get_value(GTK_RANGE(AnalogSliderTrackbar));
SetAdcShadow((char*)name, v);
if (AnalogSliderDone == TRUE || AnalogSliderCancel == TRUE)
@@ -422,7 +419,6 @@ static gboolean AnalogSliderDialogKeyboardProc(GtkWidget* widget, GdkEventKey* e
static gboolean AnalogSliderDialogMouseProc(GtkWidget *widget, GdkEventButton *event, gpointer name)
{
- // g_print("mouse click! %i, %i\n", event->button, event->type == GDK_BUTTON_PRESS);
SWORD v = (SWORD)gtk_range_get_value(GTK_RANGE(AnalogSliderTrackbar));
SetAdcShadow((char*)name, v);
if (event->button == 1 && event->type == GDK_BUTTON_RELEASE){
@@ -435,7 +431,6 @@ static gboolean AnalogSliderDialogMouseProc(GtkWidget *widget, GdkEventButton *e
void AnalogSliderUpdateProc (GtkRange *range, GtkScrollType step, gpointer name)
{
- // g_print("dlide bar adj\n");
SWORD v = (SWORD)gtk_range_get_value(GTK_RANGE(AnalogSliderTrackbar));
SetAdcShadow((char*)name, v);
}
@@ -446,9 +441,6 @@ void AnalogSliderUpdateProc (GtkRange *range, GtkScrollType step, gpointer name)
//-----------------------------------------------------------------------------
void ShowAnalogSliderPopup(char *name)
{
- // POINT pt;
- // GetCursorPos(&pt);
-
SWORD currentVal = GetAdcShadow(name);
SWORD maxVal;
@@ -487,22 +479,6 @@ void ShowAnalogSliderPopup(char *name)
1);
gtk_range_set_value (GTK_RANGE(AnalogSliderTrackbar), currentVal);
- // gtk_scale_add_mark (GTK_SCALE(AnalogSliderTrackbar), (maxVal + 1)/8, GTK_POS_LEFT, NULL);
-
- // AnalogSliderMain = CreateWindowClient(0, "LDmicroAnalogSlider", "I/O Pin",
- // WS_VISIBLE | WS_POPUP | WS_DLGFRAME,
- // left, top, 30, 100, NULL, NULL, Instance, NULL);
-
- // AnalogSliderTrackbar = CreateWindowEx(0, TRACKBAR_CLASS, "", WS_CHILD |
- // TBS_AUTOTICKS | TBS_VERT | TBS_TOOLTIPS | WS_CLIPSIBLINGS | WS_VISIBLE,
- // 0, 0, 30, 100, AnalogSliderMain, NULL, Instance, NULL);
- // SendMessage(AnalogSliderTrackbar, TBM_SETRANGE, FALSE,
- // MAKELONG(0, maxVal));
- // SendMessage(AnalogSliderTrackbar, TBM_SETTICFREQ, (maxVal + 1)/8, 0);
- // SendMessage(AnalogSliderTrackbar, TBM_SETPOS, TRUE, currentVal);
-
- // EnableWindow(MainWindow, FALSE);
- // ShowWindow(AnalogSliderMain, TRUE);
gtk_container_add(GTK_CONTAINER(AnalogSliderMain), AnalogSliderTrackbar);
@@ -529,41 +505,95 @@ void ShowAnalogSliderPopup(char *name)
//-----------------------------------------------------------------------------
// Window proc for the contacts dialog box
//-----------------------------------------------------------------------------
-// static LRESULT CALLBACK IoDialogProc(HWND hwnd, UINT msg, WPARAM wParam,
-// LPARAM lParam)
-// {
-// switch (msg) {
-// case WM_COMMAND: {
-// HWND h = (HWND)lParam;
-// if(h == OkButton && wParam == BN_CLICKED) {
-// DialogDone = TRUE;
-// } else if(h == CancelButton && wParam == BN_CLICKED) {
-// DialogDone = TRUE;
-// DialogCancel = TRUE;
-// } else if(h == PinList && HIWORD(wParam) == LBN_DBLCLK) {
-// DialogDone = TRUE;
-// }
-// break;
-// }
-
-// case WM_CLOSE:
-// case WM_DESTROY:
-// DialogDone = TRUE;
-// DialogCancel = TRUE;
-// return 1;
-
-// default:
-// return DefWindowProc(hwnd, msg, wParam, lParam);
-// }
-
-// return 1;
-// }
+static void IoDialogProc(BOOL DialogDone, int item)
+{
+ if(DialogDone)
+ {
+ char pin[16];
+ ITLIST iter;
+
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(PinList));
+ gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
+
+ if(gtk_tree_selection_get_selected (selection, NULL, &iter))
+ {
+ GValue valproc = G_VALUE_INIT;
+
+ gtk_tree_model_get_value (gtk_tree_view_get_model (GTK_TREE_VIEW(PinList)),
+ &iter, 0, &valproc);
+ gchar* str = (char*)g_value_get_string(&valproc);
+ strcpy(pin, str);
+ g_free(str);
+ }
+ else
+ strcpy(pin, _("(no pin)"));
+
+ if(strcmp(pin, _("(no pin)"))==0)
+ {
+ int i;
+ for(i = 0; i < IoSeenPreviouslyCount; i++) {
+ if(strcmp(IoSeenPreviously[i].name,
+ Prog.io.assignment[item].name)==0)
+ {
+ IoSeenPreviously[i].pin = NO_PIN_ASSIGNED;
+ }
+ }
+ Prog.io.assignment[item].pin = NO_PIN_ASSIGNED;
+ }
+ else
+ {
+ Prog.io.assignment[item].pin = atoi(pin);
+ // Only one name can be bound to each pin; make sure that there's
+ // not another entry for this pin in the IoSeenPreviously list,
+ // that might get used if the user creates a new pin with that
+ // name.
+ int i;
+ for(i = 0; i < IoSeenPreviouslyCount; i++) {
+ if(IoSeenPreviously[i].pin == atoi(pin)) {
+ IoSeenPreviously[i].pin = NO_PIN_ASSIGNED;
+ }
+ }
+ }
+ RefreshControlsToSettings();
+ }
+
+ DestroyWindow(IoDialog);
+}
+
+void IoDialogRowActivateProc(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
+{
+ IoDialogProc(TRUE, GPOINTER_TO_INT(user_data));
+}
+
+void IoDialogCancelProc(HWID widget, gpointer data)
+{
+ IoDialogProc(FALSE, GPOINTER_TO_INT(data));
+}
+
+void IoDialogOkProc(HWID widget, gpointer data)
+{
+ IoDialogProc(TRUE, GPOINTER_TO_INT(data));
+}
+
+static gboolean IoDialogKeyPressProc(HWID widget, GdkEventKey* event, gpointer data)
+{
+ if (event -> keyval == GDK_KEY_Return)
+ {
+ IoDialogProc(TRUE, GPOINTER_TO_INT(data));
+ }
+ else if (event -> keyval == GDK_KEY_Escape)
+ {
+ IoDialogProc(FALSE, GPOINTER_TO_INT(data));
+ }
+
+ return FALSE;
+}
//-----------------------------------------------------------------------------
// Create our window class; nothing exciting.
//-----------------------------------------------------------------------------
-static BOOL MakeWindowClass()
-{
+// static BOOL MakeWindowClass()
+// {
// WNDCLASSEX wc;
// memset(&wc, 0, sizeof(wc));
// wc.cbSize = sizeof(wc);
@@ -582,30 +612,42 @@ static BOOL MakeWindowClass()
// IMAGE_ICON, 16, 16, 0);
// return RegisterClassEx(&wc);
-}
+// }
-static void MakeControls(void)
+static void MakeControls(HWID Dialog)
{
- // textLabel = gtk_text_view_new ();
-// HWND textLabel = CreateWindowEx(0, WC_STATIC, _("Assign:"),
-// WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
-// 6, 1, 80, 17, IoDialog, NULL, Instance, NULL);
- // NiceFont(textLabel);
-
-// PinList = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTBOX, "",
-// WS_CHILD | WS_TABSTOP | WS_CLIPSIBLINGS | WS_VISIBLE | WS_VSCROLL |
-// LBS_NOTIFY, 6, 18, 95, 320, IoDialog, NULL, Instance, NULL);
-// FixedFont(PinList);
-
-// OkButton = CreateWindowEx(0, WC_BUTTON, _("OK"),
-// WS_CHILD | WS_TABSTOP | WS_CLIPSIBLINGS | WS_VISIBLE | BS_DEFPUSHBUTTON,
-// 6, 325, 95, 23, IoDialog, NULL, Instance, NULL);
-// NiceFont(OkButton);
-
-// CancelButton = CreateWindowEx(0, WC_BUTTON, _("Cancel"),
-// WS_CHILD | WS_TABSTOP | WS_CLIPSIBLINGS | WS_VISIBLE,
-// 6, 356, 95, 23, IoDialog, NULL, Instance, NULL);
-// NiceFont(CancelButton);
+ HLIST IoPinList = (GtkTreeModel*)gtk_list_store_new (1, G_TYPE_STRING);
+
+ PinList = gtk_tree_view_new_with_model (GTK_TREE_MODEL(IoPinList));
+ HTVC column = gtk_tree_view_column_new_with_attributes(_("Assign:"),
+ gtk_cell_renderer_text_new(),
+ "text", 0,
+ NULL);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(PinList), column);
+ FixedFont(PinList);
+
+ OkButton = gtk_button_new_with_label (_("OK"));
+ NiceFont(OkButton);
+
+ CancelButton = gtk_button_new_with_label (_("Cancel"));
+ NiceFont(CancelButton);
+
+ /// Add list to scrolled window to enable scrolling
+ HWID PinScroll = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (PinScroll),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_ALWAYS);
+ gtk_widget_set_hexpand(GTK_WIDGET(PinScroll), TRUE);
+ gtk_widget_set_vexpand(GTK_WIDGET(PinScroll), TRUE);
+
+ gtk_container_add (GTK_CONTAINER(PinScroll), PinList);
+
+ /// Pack all the widgets into main window
+ HWID PinBox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_pack_start(GTK_BOX(PinBox), PinScroll, FALSE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(PinBox), OkButton, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(PinBox), CancelButton, FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(Dialog), PinBox);
}
void ShowIoDialog(int item)
@@ -651,128 +693,85 @@ void ShowIoDialog(int item)
return;
}
- // MakeWindowClass();
-
// We need the TOOLWINDOW style, or else the window will be forced to
// a minimum width greater than our current width. And without the
// APPWINDOW style, it becomes impossible to get the window back (by
// Alt+Tab or taskbar).
+ IoDialog = CreateWindowClient(GTK_WINDOW_TOPLEVEL, GDK_WINDOW_TYPE_HINT_MENU, _("I/O Pin"),
+ 100, 100, 107, 387, NULL);
+
+ MakeControls(IoDialog);
+
+ ITLIST iter;
+ GValue val = G_VALUE_INIT;
+ g_value_init (&val, G_TYPE_STRING);
- // IoDialog = CreateWindowClient(WS_EX_TOOLWINDOW | WS_EX_APPWINDOW,
- // "LDmicroIo", _("I/O Pin"),
- // WS_OVERLAPPED | WS_SYSMENU,
- // 100, 100, 107, 387, NULL, NULL, Instance, NULL);
-
- // MakeControls();
-
-// SendMessage(PinList, LB_ADDSTRING, 0, (LPARAM)_("(no pin)"));
-// int i;
-// for(i = 0; i < Prog.mcu->pinCount; i++) {
-// int j;
-// for(j = 0; j < Prog.io.count; j++) {
-// if(j == item) continue;
-// if(Prog.io.assignment[j].pin == Prog.mcu->pinInfo[i].pin) {
-// goto cant_use_this_io;
-// }
-// }
-
-// if(UartFunctionUsed() && Prog.mcu &&
-// ((Prog.mcu->pinInfo[i].pin == Prog.mcu->uartNeeds.rxPin) ||
-// (Prog.mcu->pinInfo[i].pin == Prog.mcu->uartNeeds.txPin)))
-// {
-// goto cant_use_this_io;
-// }
-
-// if(PwmFunctionUsed() &&
-// Prog.mcu->pinInfo[i].pin == Prog.mcu->pwmNeedsPin)
-// {
-// goto cant_use_this_io;
-// }
-
-// if(Prog.io.assignment[item].name[0] == 'A') {
-// for(j = 0; j < Prog.mcu->adcCount; j++) {
-// if(Prog.mcu->adcInfo[j].pin == Prog.mcu->pinInfo[i].pin) {
-// // okay; we know how to connect it up to the ADC
-// break;
-// }
-// }
-// if(j == Prog.mcu->adcCount) {
-// goto cant_use_this_io;
-// }
-// }
-
-// char buf[40];
-// if(Prog.mcu->pinCount <= 21) {
-// sprintf(buf, "%3d %c%c%d", Prog.mcu->pinInfo[i].pin,
-// Prog.mcu->portPrefix, Prog.mcu->pinInfo[i].port,
-// Prog.mcu->pinInfo[i].bit);
-// } else {
-// sprintf(buf, "%3d %c%c%d", Prog.mcu->pinInfo[i].pin,
-// Prog.mcu->portPrefix, Prog.mcu->pinInfo[i].port,
-// Prog.mcu->pinInfo[i].bit);
-// }
-// SendMessage(PinList, LB_ADDSTRING, 0, (LPARAM)buf);
-// cant_use_this_io:;
-// }
-
-// EnableWindow(MainWindow, FALSE);
- // ShowWindow(IoDialog, TRUE);
- // gtk_widget_show_all(IoDialog);
-// SetFocus(PinList);
-
-// MSG msg;
-// DWORD ret;
-// DialogDone = FALSE;
-// DialogCancel = FALSE;
-// while((ret = GetMessage(&msg, NULL, 0, 0)) && !DialogDone) {
-// if(msg.message == WM_KEYDOWN) {
-// if(msg.wParam == VK_RETURN) {
-// DialogDone = TRUE;
-// break;
-// } else if(msg.wParam == VK_ESCAPE) {
-// DialogDone = TRUE;
-// DialogCancel = TRUE;
-// break;
-// }
-// }
-
-// if(IsDialogMessage(IoDialog, &msg)) continue;
-// TranslateMessage(&msg);
-// DispatchMessage(&msg);
-// }
-
-// if(!DialogCancel) {
-// int sel = SendMessage(PinList, LB_GETCURSEL, 0, 0);
-// char pin[16];
-// SendMessage(PinList, LB_GETTEXT, (WPARAM)sel, (LPARAM)pin);
-// if(strcmp(pin, _("(no pin)"))==0) {
-// int i;
-// for(i = 0; i < IoSeenPreviouslyCount; i++) {
-// if(strcmp(IoSeenPreviously[i].name,
-// Prog.io.assignment[item].name)==0)
-// {
-// IoSeenPreviously[i].pin = NO_PIN_ASSIGNED;
-// }
-// }
-// Prog.io.assignment[item].pin = NO_PIN_ASSIGNED;
-// } else {
-// Prog.io.assignment[item].pin = atoi(pin);
-// // Only one name can be bound to each pin; make sure that there's
-// // not another entry for this pin in the IoSeenPreviously list,
-// // that might get used if the user creates a new pin with that
-// // name.
-// int i;
-// for(i = 0; i < IoSeenPreviouslyCount; i++) {
-// if(IoSeenPreviously[i].pin == atoi(pin)) {
-// IoSeenPreviously[i].pin = NO_PIN_ASSIGNED;
-// }
-// }
-// }
-// }
-
-// EnableWindow(MainWindow, TRUE);
-// DestroyWindow(IoDialog);
-// return;
+ HLIST model = gtk_tree_view_get_model (GTK_TREE_VIEW(PinList));
+
+ gtk_tree_model_get_iter_first (GTK_TREE_MODEL(model), &iter);
+
+ gtk_list_store_append (GTK_LIST_STORE(model), &iter);
+
+ g_value_set_string(&val, _("(no pin)"));
+ gtk_list_store_set_value (GTK_LIST_STORE(model), &iter, 0, &val);
+
+ int i;
+ for(i = 0; i < Prog.mcu->pinCount; i++) {
+ int j;
+ for(j = 0; j < Prog.io.count; j++) {
+ if(j == item) continue;
+ if(Prog.io.assignment[j].pin == Prog.mcu->pinInfo[i].pin) {
+ goto cant_use_this_io;
+ }
+ }
+
+ if(UartFunctionUsed() && Prog.mcu &&
+ ((Prog.mcu->pinInfo[i].pin == Prog.mcu->uartNeeds.rxPin) ||
+ (Prog.mcu->pinInfo[i].pin == Prog.mcu->uartNeeds.txPin)))
+ {
+ goto cant_use_this_io;
+ }
+
+ if(PwmFunctionUsed() &&
+ Prog.mcu->pinInfo[i].pin == Prog.mcu->pwmNeedsPin)
+ {
+ goto cant_use_this_io;
+ }
+
+ if(Prog.io.assignment[item].name[0] == 'A') {
+ for(j = 0; j < Prog.mcu->adcCount; j++) {
+ if(Prog.mcu->adcInfo[j].pin == Prog.mcu->pinInfo[i].pin) {
+ // okay; we know how to connect it up to the ADC
+ break;
+ }
+ }
+ if(j == Prog.mcu->adcCount) {
+ goto cant_use_this_io;
+ }
+ }
+
+ char buf[40];
+ if(Prog.mcu->pinCount <= 21) {
+ sprintf(buf, "%3d %c%c%d", Prog.mcu->pinInfo[i].pin,
+ Prog.mcu->portPrefix, Prog.mcu->pinInfo[i].port,
+ Prog.mcu->pinInfo[i].bit);
+ } else {
+ sprintf(buf, "%3d %c%c%d", Prog.mcu->pinInfo[i].pin,
+ Prog.mcu->portPrefix, Prog.mcu->pinInfo[i].port,
+ Prog.mcu->pinInfo[i].bit);
+ }
+ gtk_list_store_append (GTK_LIST_STORE(model), &iter);
+ g_value_set_string(&val, buf);
+ gtk_list_store_set_value (GTK_LIST_STORE(model), &iter, 0, &val);
+cant_use_this_io:;
+ }
+
+ gtk_widget_show_all(IoDialog);
+
+ g_signal_connect (PinList, "row_activated", G_CALLBACK (IoDialogRowActivateProc), GINT_TO_POINTER(item));
+ g_signal_connect (IoDialog, "key_press_event", G_CALLBACK (IoDialogKeyPressProc), GINT_TO_POINTER(item));
+ g_signal_connect (CancelButton, "clicked", G_CALLBACK (IoDialogCancelProc), GINT_TO_POINTER(item));
+ g_signal_connect (OkButton, "clicked", G_CALLBACK (IoDialogOkProc), GINT_TO_POINTER(item));
}
//-----------------------------------------------------------------------------
@@ -810,7 +809,6 @@ void IoListProc(NMHDR *h)
g_value_set_string(&val, (const char*)&IO_value_holder);
gtk_list_store_set_value (GTK_LIST_STORE(h->hlistFrom), h->hlistIter, LV_IO_PIN, &val);
}
-
/// case LV_IO_TYPE:
char *s = IoTypeToString(Prog.io.assignment[item].type);
diff --git a/ldmicro/ldmicro.cpp b/ldmicro/ldmicro.cpp
index 1a39b53..d2b54b5 100644
--- a/ldmicro/ldmicro.cpp
+++ b/ldmicro/ldmicro.cpp
@@ -646,6 +646,8 @@ void LD_WM_Close_call(GtkWidget *widget, GdkEvent *event, gpointer user_data)
/* Handles:
* WM_CLOSE
*/
+
+ CheckSaveUserCancels();
FreezeWindowPos(MainWindow);
FreezeDWORD(IoListHeight);
@@ -806,18 +808,18 @@ gboolean LD_WM_Paint_call(HWID widget, HCRDC cr, gpointer data)
return FALSE;
}
-gboolean LD_WM_Destroy_call(GtkWidget *widget, GdkEvent *event, gpointer user_data)
+void LD_WM_Destroy_call(GtkWidget *widget, GdkEvent *event, gpointer user_data)
{
/* Handles:
* WM_DESTROY
*/
- // if(CheckSaveUserCancels()) break;
+ CheckSaveUserCancels();
- // PostQuitMessage(0);
- // return 1;
+ FreezeWindowPos(MainWindow);
+ FreezeDWORD(IoListHeight);
- return FALSE;
+ gtk_main_quit();
}
gboolean LD_WM_Size_call(GtkWidget *widget, GdkEvent *event, gpointer user_data)
@@ -854,15 +856,15 @@ void LD_WM_Notify_Row_Activate_call(GtkTreeView *tree_view, GtkTreePath *path, G
* WM_NOTIFY
*/
- g_print("Row activated!\n");
-
+ // 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);
}
@@ -874,28 +876,27 @@ void LD_WM_Notify_Cursor_Change_call(GtkTreeView *tree_view, gpointer user_data)
ITLIST iter;
- BOOL empty = !gtk_tree_model_get_iter_first (IoList, &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
- gtk_tree_model_get_iter_first (IoList, &iter);
+ 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);
}
@@ -1174,6 +1175,7 @@ int main(int argc, char** argv)
/// Make main window - end
MakeMainWindowMenus();
+ MakeDialogBoxClass();
InitForDrawing();
diff --git a/ldmicro/lib/linuxUI/linuxLD.h b/ldmicro/lib/linuxUI/linuxLD.h
index 28116b2..ce0b812 100644
--- a/ldmicro/lib/linuxUI/linuxLD.h
+++ b/ldmicro/lib/linuxUI/linuxLD.h
@@ -182,7 +182,7 @@ typedef struct FontTag {
int nOrientation;
int fnWeight;
DWORD fdwItalic;
- LPCTSTR lpszFace;
+ LPTSTR lpszFace;
} *HFONT, FONT;
typedef struct tagLOGBRUSH {
diff --git a/ldmicro/lib/linuxUI/linuxUI.cpp b/ldmicro/lib/linuxUI/linuxUI.cpp
index 0d08de5..ba5eb95 100644
--- a/ldmicro/lib/linuxUI/linuxUI.cpp
+++ b/ldmicro/lib/linuxUI/linuxUI.cpp
@@ -316,14 +316,15 @@ HBRUSH CreateBrushIndirect(PLOGBRUSH plb)
HFONT CreateFont(int nHeight, int nWidth, int nOrientation, int fnWeight,
DWORD fdwItalic, LPCTSTR lpszFace)
{
- HFONT font = new FONT;
+ HFONT font = (HFONT)malloc(strlen(lpszFace) + 1 + sizeof(FONT));
font->nHeight = nHeight;
font->nWidth = nWidth;
font->nOrientation = nOrientation;
font->fnWeight = fnWeight;
font->fdwItalic = fdwItalic;
- font->lpszFace = lpszFace;
-
+ font->lpszFace = (char*)malloc(strlen(lpszFace)+1);
+ strcpy(font->lpszFace, lpszFace);
+
return font;
}
diff --git a/ldmicro/maincontrols.cpp b/ldmicro/maincontrols.cpp
index c24c4af..0deaf73 100644
--- a/ldmicro/maincontrols.cpp
+++ b/ldmicro/maincontrols.cpp
@@ -131,7 +131,6 @@ static int IoListSelectionPoint;
static BOOL IoListOutOfSync;
int IoListHeight;
int IoListTop;
-GtkTreeModel **IoListPtr = (GtkTreeModel**)GTK_TREE_MODEL (IoList);
// whether the simulation is running in real time
static BOOL RealTimeSimulationRunning;
@@ -970,9 +969,10 @@ void RefreshControlsToSettings(void)
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, IoListPtr, &iter))
+ GtkTreeModel *IoModelPtr;
+ if(gtk_tree_selection_get_selected (selection, &IoModelPtr, &iter))
{
- GtkTreePath *path = gtk_tree_model_get_path ( *IoListPtr , &iter ) ;
+ GtkTreePath *path = gtk_tree_model_get_path ( IoModelPtr, &iter ) ;
ip = gtk_tree_path_get_indices ( path ) ;
i = ip[0];
IoListSelectionPoint = i;
@@ -986,6 +986,7 @@ void RefreshControlsToSettings(void)
h.code = LVN_GETDISPINFO;
h.hlistFrom = IoList;
+ gtk_tree_model_get_iter_first (GTK_TREE_MODEL(IoList), &iter);
for(i = 0; i < Prog.io.count; i++) {
gtk_list_store_append (GTK_LIST_STORE(IoList), &iter);
h.item.iItem = i;
@@ -1065,21 +1066,20 @@ void GenerateIoListDontLoseSelection(void)
int * i ;
IoListSelectionPoint = -1;
-
+
// GtkTreeSelection * tsel = gtk_tree_view_get_selection (tv);
// GtkTreeModel * tm ;
GtkTreePath * path ;
+ GtkTreeModel *IoModelPtr;
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, IoListPtr, &iter))
+ if(gtk_tree_selection_get_selected (selection, &IoModelPtr, &iter))
{
- path = gtk_tree_model_get_path ( *IoListPtr , &iter ) ;
+ path = gtk_tree_model_get_path ( IoModelPtr , &iter ) ;
i = gtk_tree_path_get_indices ( path ) ;
IoListSelectionPoint = i[0];
}
-
// gtk_tree_model_iter_next (GTK_TREE_MODEL(IoList), iter);
// BOOL iter_v = gtk_list_store_iter_is_valid(GTK_LIST_STORE(IoList), iter);
// g_print("iter = %i\n", iter_v);
@@ -1095,7 +1095,6 @@ void GenerateIoListDontLoseSelection(void)
// can't just update the listview index; if I/O has been added then the
// new selection point might be out of range till we refill it
-
IoListOutOfSync = TRUE;
RefreshControlsToSettings();
}
diff --git a/ldmicro/miscutil.cpp b/ldmicro/miscutil.cpp
index fdf1647..1b191fd 100644
--- a/ldmicro/miscutil.cpp
+++ b/ldmicro/miscutil.cpp
@@ -204,13 +204,15 @@ void FinishIhex(FILE *f)
//-----------------------------------------------------------------------------
// Create a window with a given client area.
//-----------------------------------------------------------------------------
-HWID CreateWindowClient(GtkWindowType wType, char *windowName,
+HWID CreateWindowClient(GtkWindowType wType, GdkWindowTypeHint wthint, char *windowName,
int x, int y, int width, int height, HWND parent)
{
HWID h = gtk_window_new(wType);
gtk_window_set_title(GTK_WINDOW(h), windowName);
gtk_window_resize (GTK_WINDOW(h), width, height);
gtk_window_move(GTK_WINDOW(h), x, y);
+ gtk_window_set_type_hint (GTK_WINDOW(h), wthint);
+
// HWND h = CreateWindowEx(exStyle, className, windowName, style, x, y,
// width, height, parent, menu, instance, param);
@@ -266,7 +268,19 @@ static LRESULT CALLBACK DialogProc(HWND hwnd, UINT msg, WPARAM wParam,
//-----------------------------------------------------------------------------
void NiceFont(HWID h)
{
- gtk_widget_override_font(GTK_WIDGET(h), pango_font_description_from_string(MyNiceFont->lpszFace));
+ GtkCssProvider *provider = gtk_css_provider_new ();
+
+ char *cssdata = new char[strlen(MyNiceFont->lpszFace) + 26];
+ int fontSize = 10;
+ sprintf(cssdata, "textview { font: %ipx %s; }", fontSize, MyNiceFont->lpszFace);
+
+ gtk_css_provider_load_from_data (provider, cssdata, -1, NULL);
+
+ delete cssdata;
+
+ gtk_style_context_add_provider (gtk_widget_get_style_context(h),
+ GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER);
+
// SendMessage(h, WM_SETFONT, (WPARAM)MyNiceFont, TRUE);
}
@@ -274,8 +288,21 @@ void NiceFont(HWID h)
// Set the font of a control to a pretty fixed-width font (typ. Lucida
// Console).
//-----------------------------------------------------------------------------
-void FixedFont(HWND h)
+void FixedFont(HWID h)
{
+ GtkCssProvider *provider = gtk_css_provider_new ();
+
+ char *cssdata = new char[strlen(MyFixedFont->lpszFace) + 26];
+ int fontSize = 10;
+ sprintf(cssdata, "textview { font: %ipx %s; }", fontSize, MyFixedFont->lpszFace);
+
+ gtk_css_provider_load_from_data (provider, cssdata, -1, NULL);
+
+ delete cssdata;
+
+ gtk_style_context_add_provider (gtk_widget_get_style_context(h),
+ GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER);
+
// SendMessage(h, WM_SETFONT, (WPARAM)MyFixedFont, TRUE);
}
diff --git a/ldmicro/simulate.cpp b/ldmicro/simulate.cpp
index a3faf38..0b3c206 100644
--- a/ldmicro/simulate.cpp
+++ b/ldmicro/simulate.cpp
@@ -902,8 +902,8 @@ void ShowUartSimulationWindow(void)
if(TerminalW > 800) TerminalW = 100;
if(TerminalH > 800) TerminalH = 100;
- UartSimulationWindow = CreateWindowClient(GTK_WINDOW_TOPLEVEL, "UART Simulation (Terminal)",
- TerminalX, TerminalY, TerminalW, TerminalH, NULL);
+ UartSimulationWindow = CreateWindowClient(GTK_WINDOW_TOPLEVEL, GDK_WINDOW_TYPE_HINT_NORMAL,
+ "UART Simulation (Terminal)", TerminalX, TerminalY, TerminalW, TerminalH, NULL);
/// remove close button
gtk_window_set_deletable (GTK_WINDOW(UartSimulationWindow), FALSE);
diff --git a/ldmicro/undoredo.cpp b/ldmicro/undoredo.cpp
index 2a3c2fd..8bcfcc8 100644
--- a/ldmicro/undoredo.cpp
+++ b/ldmicro/undoredo.cpp
@@ -201,9 +201,9 @@ void UndoUndo(void)
} else {
SetUndoEnabled(FALSE, TRUE);
}
- // RefreshControlsToSettings();
- // RefreshScrollbars();
- // InvalidateRect(MainWindow, NULL, FALSE);
+ RefreshControlsToSettings();
+ RefreshScrollbars();
+ InvalidateRect(MainWindow, NULL, FALSE);
}
//-----------------------------------------------------------------------------
@@ -224,9 +224,9 @@ void UndoRedo(void)
} else {
SetUndoEnabled(TRUE, FALSE);
}
- //RefreshControlsToSettings();
- //RefreshScrollbars();
- //InvalidateRect(MainWindow, NULL, FALSE);
+ RefreshControlsToSettings();
+ RefreshScrollbars();
+ InvalidateRect(MainWindow, NULL, FALSE);
}
//-----------------------------------------------------------------------------