From c70ccfc936bdb59c4934111db79ea0205d8c5dc8 Mon Sep 17 00:00:00 2001 From: Rr42 Date: Tue, 26 Jun 2018 23:21:33 +0530 Subject: iolist.cpp ported, io pin selection dialog added. --- ldmicro/includes/ldmicro.h | 2 +- ldmicro/iolist.cpp | 388 ++++++++++++++++++++-------------------- ldmicro/ldmicro.cpp | 26 +-- ldmicro/lib/linuxUI/linuxLD.h | 2 +- ldmicro/lib/linuxUI/linuxUI.cpp | 7 +- ldmicro/maincontrols.cpp | 17 +- ldmicro/miscutil.cpp | 33 +++- ldmicro/simulate.cpp | 4 +- ldmicro/undoredo.cpp | 12 +- 9 files changed, 259 insertions(+), 232 deletions(-) (limited to 'ldmicro') 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); } //----------------------------------------------------------------------------- -- cgit