fix stack vs heap issues by moving all coprocessor strings toward malloced arrays, reintroduce command caching. cut new potential gm release

This commit is contained in:
camh 2022-02-23 09:52:20 -08:00
parent fbc7e3a1ec
commit bf120297be
7 changed files with 96 additions and 69 deletions

View File

@ -1,4 +1,5 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <Serial.h> #include <Serial.h>
#include <math.h> #include <math.h>
#include <Devices.h> #include <Devices.h>
@ -15,10 +16,9 @@ IOParam incomingSerialPortReference;
#define MAX_ATTEMPTS 10 #define MAX_ATTEMPTS 10
#define RECEIVE_WINDOW_SIZE 32767 // receive in up to 32kb chunks #define RECEIVE_WINDOW_SIZE 32767 // receive in up to 32kb chunks
#define MAX_RECEIVE_SIZE 32767 // matching RECEIVE_WINDOW_SIZE for now #define MAX_RECEIVE_SIZE 32767 // matching RECEIVE_WINDOW_SIZE for now
char GlobalSerialInputBuffer[MAX_RECEIVE_SIZE]; char *GlobalSerialInputBuffer;
char tempOutput[MAX_RECEIVE_SIZE]; char *tempOutput;
char *application_id;
char application_id[255];
int call_counter = 0; int call_counter = 0;
// from: https://stackoverflow.com/questions/29847915/implementing-strtok-whose-delimiter-has-more-than-one-character // from: https://stackoverflow.com/questions/29847915/implementing-strtok-whose-delimiter-has-more-than-one-character
@ -142,7 +142,7 @@ void setupSerialPort(const char *name) {
return; return;
} }
err = MacOpenDriver(serialPortInputName, &serialPortInput); // result in 0 but still doesn't work err = MacOpenDriver(serialPortInputName, &serialPortInput);
#ifdef PRINT_ERRORS #ifdef PRINT_ERRORS
@ -398,6 +398,10 @@ void setupCoprocessor(char *applicationId, const char *serialDeviceName) {
#ifdef DEBUG_FUNCTION_CALLS #ifdef DEBUG_FUNCTION_CALLS
writeSerialPortDebug(boutRefNum, "DEBUG_FUNCTION_CALLS: setupCoprocessor"); writeSerialPortDebug(boutRefNum, "DEBUG_FUNCTION_CALLS: setupCoprocessor");
#endif #endif
GlobalSerialInputBuffer = malloc(sizeof(char) * MAX_RECEIVE_SIZE);
tempOutput = malloc(sizeof(char) * MAX_RECEIVE_SIZE);
application_id = malloc(sizeof(char) * 255);
strcpy(application_id, applicationId); strcpy(application_id, applicationId);
@ -667,7 +671,7 @@ void callFunctionOnCoprocessor(char* functionName, char* parameters, char* outpu
getReturnValueFromResponse(serialPortResponse, "FUNCTION", output); getReturnValueFromResponse(serialPortResponse, "FUNCTION", output);
#ifdef DEBUGGING #ifdef DEBUGGING
writeSerialPortDebug(boutRefNum, "Greturn value from response"); writeSerialPortDebug(boutRefNum, "Got return value from response");
writeSerialPortDebug(boutRefNum, output); writeSerialPortDebug(boutRefNum, output);
#endif #endif

Binary file not shown.

Binary file not shown.

View File

@ -95,7 +95,6 @@ void PROFILE_COMPLETE() {
#include "Quickdraw.h" #include "Quickdraw.h"
#include "output_js.h" #include "output_js.h"
#include "coprocessorjs.h" #include "coprocessorjs.h"
#include "nuklear_app.c" #include "nuklear_app.c"
/* GMac is used to hold the result of a SysEnvirons call. This makes /* GMac is used to hold the result of a SysEnvirons call. This makes

View File

@ -17111,14 +17111,14 @@ nk_do_edit(nk_flags *state, struct nk_command_buffer *out,
cursor.y -= edit->scrollbar.y; cursor.y -= edit->scrollbar.y;
nk_fill_rect(out, cursor, 0, cursor_color, true); nk_fill_rect(out, cursor, 0, cursor_color, true);
#ifdef COMMAND_CACHING // #ifdef COMMAND_CACHING
struct nk_rect whiteTextarea2; // struct nk_rect whiteTextarea2;
whiteTextarea2.x = cursor.x + cursor.w; // whiteTextarea2.x = cursor.x + cursor.w;
whiteTextarea2.y = cursor.y - 2; // whiteTextarea2.y = cursor.y - 2;
whiteTextarea2.h = cursor.h + 6; // whiteTextarea2.h = cursor.h + 6;
whiteTextarea2.w = 9; //cursor.w * 2; // this was previously used when cursor.w = 4, doesn't work well at = 1 // whiteTextarea2.w = 9; //cursor.w * 2; // this was previously used when cursor.w = 4, doesn't work well at = 1
nk_fill_rect(out, whiteTextarea2, 0, qd.black, false); // nk_fill_rect(out, whiteTextarea2, 0, qd.black, false);
#endif // #endif
} else { } else {
/* draw cursor inside text */ /* draw cursor inside text */
// short glyph_len; // short glyph_len;
@ -17139,8 +17139,11 @@ nk_do_edit(nk_flags *state, struct nk_command_buffer *out,
// txt.text = cursor_text_color; // txt.text = cursor_text_color;
nk_fill_rect(out, label, 0, cursor_color, true); nk_fill_rect(out, label, 0, cursor_color, true);
// TODO: if we want to fix the dangling cursor when typing in the middle of the text,
// we need to create a white box at the previous cursor location, and draw it there.
// this is a start towards that, but it will draw over the top of the text:
// struct nk_rect whiteTextarea2; // struct nk_rect whiteTextarea2;
// whiteTextarea2.x = label.x + label.w; // whiteTextarea2.x = label.x - label.w;
// whiteTextarea2.y = label.y - 2; // whiteTextarea2.y = label.y - 2;
// whiteTextarea2.h = label.h + 6; // whiteTextarea2.h = label.h + 6;
// whiteTextarea2.w = label.w; // whiteTextarea2.w = label.w;
@ -17172,14 +17175,14 @@ nk_do_edit(nk_flags *state, struct nk_command_buffer *out,
// background_color = whiteColor; // background_color = whiteColor;
// else // else
// background_color = background; // background_color = background;
#ifdef COMMAND_CACHING // #ifdef COMMAND_CACHING
struct nk_rect whiteTextarea; // struct nk_rect whiteTextarea;
whiteTextarea.x = area.x; // whiteTextarea.x = area.x;
whiteTextarea.y = area.y; // whiteTextarea.y = area.y;
whiteTextarea.h = area.h; // whiteTextarea.h = area.h;
whiteTextarea.w = area.w; // whiteTextarea.w = area.w;
nk_fill_rect(out, whiteTextarea, 0, qd.black, false); // nk_fill_rect(out, whiteTextarea, 0, qd.black, false);
#endif // #endif
nk_edit_draw_text(out, style, area.x - edit->scrollbar.x, area.y - edit->scrollbar.y, 0, begin, l, row_height, font, style->normal, style->text_normal, nk_false, true); nk_edit_draw_text(out, style, area.x - edit->scrollbar.x, area.y - edit->scrollbar.y, 0, begin, l, row_height, font, style->normal, style->text_normal, nk_false, true);
} }

View File

@ -97,19 +97,20 @@ void aFailed(char *file, int line) {
#define MAX_CHAT_MESSAGES 17 #define MAX_CHAT_MESSAGES 17
#define MAX_RECEIVE_SIZE 32767 // this has a corresponding value in coprocessor.c #define MAX_RECEIVE_SIZE 32767 // this has a corresponding value in coprocessor.c
#define MAX_FRIENDLY_NAME_LENGTH 64
Boolean firstOrMouseMove = true; Boolean firstOrMouseMove = true;
Boolean gotMouseEvent = false; Boolean gotMouseEvent = false;
char activeChat[64]; char *activeChat;
char activeChatMessages[MAX_CHAT_MESSAGES][2048]; // this should match to MAX_ROWS in index.js char *activeChatMessages;
char box_input_buffer[2048]; char *box_input_buffer;
char chatFriendlyNames[16][64]; char *chatFriendlyNames;
char ip_input_buffer[255]; char *ip_input_buffer;
char jsFunctionResponse[MAX_RECEIVE_SIZE]; char *jsFunctionResponse;
char chatCountFunctionResponse[MAX_RECEIVE_SIZE]; char *chatCountFunctionResponse;
char tempChatCountFunctionResponse[MAX_RECEIVE_SIZE]; char *tempChatCountFunctionResponse;
char previousChatCountFunctionResponse[MAX_RECEIVE_SIZE]; char *previousChatCountFunctionResponse;
char new_message_input_buffer[255]; char *new_message_input_buffer;
int activeMessageCounter = 0; int activeMessageCounter = 0;
int chatFriendlyNamesCounter = 0; int chatFriendlyNamesCounter = 0;
int coprocessorLoaded = 0; int coprocessorLoaded = 0;
@ -134,7 +135,6 @@ struct nk_context *ctx;
aFailed(__FILE__, __LINE__) aFailed(__FILE__, __LINE__)
#include <Types.h> #include <Types.h>
#include "nuklear.h"
#include "nuklear_quickdraw.h" #include "nuklear_quickdraw.h"
#include "coprocessorjs.h" #include "coprocessorjs.h"
@ -148,7 +148,7 @@ void getMessagesFromjsFunctionResponse() {
for (int i = 0; i < MAX_CHAT_MESSAGES; i++) { for (int i = 0; i < MAX_CHAT_MESSAGES; i++) {
memset(&activeChatMessages[i], '\0', 2048); memset(&activeChatMessages[i * 2048], '\0', 2048);
} }
activeMessageCounter = 0; activeMessageCounter = 0;
@ -158,7 +158,7 @@ void getMessagesFromjsFunctionResponse() {
// loop through the string to extract all other tokens // loop through the string to extract all other tokens
while (token != NULL) { while (token != NULL) {
sprintf(activeChatMessages[activeMessageCounter], "%s", token); sprintf(&activeChatMessages[activeMessageCounter * 2048], "%s", token);
token = (char *)strtokm(NULL, "ENDLASTMESSAGE"); token = (char *)strtokm(NULL, "ENDLASTMESSAGE");
activeMessageCounter++; activeMessageCounter++;
} }
@ -176,7 +176,7 @@ void sendMessage() {
char output[2048]; char output[2048];
sprintf(output, "%s&&&%.*s", activeChat, box_input_len, box_input_buffer); sprintf(output, "%s&&&%.*s", activeChat, box_input_len, box_input_buffer);
memset(&box_input_buffer, '\0', 2048); memset(box_input_buffer, '\0', 2048);
box_input_len = 0; box_input_len = 0;
// this was an attempt to get the text in the textbox to go away... doesn't really work for a few more redraws // this was an attempt to get the text in the textbox to go away... doesn't really work for a few more redraws
@ -207,7 +207,7 @@ void getChats() {
while (token != NULL) { while (token != NULL) {
writeSerialPortDebug(boutRefNum, token); writeSerialPortDebug(boutRefNum, token);
sprintf(chatFriendlyNames[chatFriendlyNamesCounter++], "%s", token); sprintf(&chatFriendlyNames[chatFriendlyNamesCounter++ * MAX_FRIENDLY_NAME_LENGTH], "%s", token);
token = (char *)strtokm(NULL, ","); token = (char *)strtokm(NULL, ",");
} }
@ -354,10 +354,10 @@ void getChatCounts() {
for (int i = 0; i < chatFriendlyNamesCounter; i++) { for (int i = 0; i < chatFriendlyNamesCounter; i++) {
if (strstr(chatFriendlyNames[i], " new) ") != NULL) { if (strstr(&chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH], " new) ") != NULL) {
char chatName[64]; char chatName[64];
sprintf(chatName, "%.63s", chatFriendlyNames[i]); sprintf(chatName, "%.63s", &chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH]);
int updateResults = 0; int updateResults = 0;
char *(*updatePieces[2])[64]; char *(*updatePieces[2])[64];
@ -391,14 +391,14 @@ void getChatCounts() {
if (count == 0 || !strcmp(activeChat, (char *)chatUpdate[0])) { if (count == 0 || !strcmp(activeChat, (char *)chatUpdate[0])) {
sprintf(chatFriendlyNames[i], "%.63s", (char *)chatUpdate[0]); sprintf(&chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH], "%.63s", (char *)chatUpdate[0]);
} else { } else {
sprintf(chatFriendlyNames[i], "(%d new) %.63s", count, (char *)chatUpdate[0]); sprintf(&chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH], "(%d new) %.63s", count, (char *)chatUpdate[0]);
} }
break; break;
} }
} else if (prefix(chatFriendlyNames[i], (char *)chatUpdate[0])) { } else if (prefix(&chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH], (char *)chatUpdate[0])) {
#ifdef MESSAGES_FOR_MACINTOSH_DEBUGGING #ifdef MESSAGES_FOR_MACINTOSH_DEBUGGING
writeSerialPortDebug(boutRefNum, "match2"); writeSerialPortDebug(boutRefNum, "match2");
@ -407,10 +407,10 @@ void getChatCounts() {
if (count == 0 || !strcmp(activeChat, (char *)chatUpdate[0])) { if (count == 0 || !strcmp(activeChat, (char *)chatUpdate[0])) {
sprintf(chatFriendlyNames[i], "%.63s", (char *)chatUpdate[0]); sprintf(&chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH], "%.63s", (char *)chatUpdate[0]);
} else { } else {
sprintf(chatFriendlyNames[i], "(%d new) %.63s", count, (char *)chatUpdate[0]); sprintf(&chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH], "(%d new) %.63s", count, (char *)chatUpdate[0]);
} }
break; break;
} }
@ -563,7 +563,7 @@ static void nuklearApp(struct nk_context *ctx) {
for (int i = 0; i < MAX_CHAT_MESSAGES; i++) { for (int i = 0; i < MAX_CHAT_MESSAGES; i++) {
memset(&activeChatMessages[i], '\0', 2048); memset(&activeChatMessages[i * 2048], '\0', 2048);
} }
getMessages(activeChat, 0); getMessages(activeChat, 0);
@ -600,12 +600,12 @@ static void nuklearApp(struct nk_context *ctx) {
nk_layout_row_push(ctx, 169); nk_layout_row_push(ctx, 169);
if (nk_button_label(ctx, chatFriendlyNames[i])) { if (nk_button_label(ctx, &chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH])) {
if (strstr(chatFriendlyNames[i], " new) ") != NULL) { if (strstr(&chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH], " new) ") != NULL) {
char chatName[96]; char chatName[96];
sprintf(chatName, "%.63s", chatFriendlyNames[i]); sprintf(chatName, "%.63s", &chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH]);
#ifdef MESSAGES_FOR_MACINTOSH_DEBUGGING #ifdef MESSAGES_FOR_MACINTOSH_DEBUGGING
writeSerialPortDebug(boutRefNum, "clicked1 chatName"); writeSerialPortDebug(boutRefNum, "clicked1 chatName");
@ -628,15 +628,15 @@ static void nuklearApp(struct nk_context *ctx) {
#endif #endif
sprintf(activeChat, "%.63s", name); sprintf(activeChat, "%.63s", name);
sprintf(chatFriendlyNames[i], "%.63s", name); sprintf(&chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH], "%.63s", name);
} else { } else {
#ifdef MESSAGES_FOR_MACINTOSH_DEBUGGING #ifdef MESSAGES_FOR_MACINTOSH_DEBUGGING
writeSerialPortDebug(boutRefNum, "clicked2 chatName"); writeSerialPortDebug(boutRefNum, "clicked2 chatName");
writeSerialPortDebug(boutRefNum, chatFriendlyNames[i]); writeSerialPortDebug(boutRefNum, chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH]);
#endif #endif
sprintf(activeChat, "%.63s", chatFriendlyNames[i]); sprintf(activeChat, "%.63s", &chatFriendlyNames[i * MAX_FRIENDLY_NAME_LENGTH]);
} }
forceRedrawChats = 6; // redraw the chat list for several iterations in an attempt to get rid of the hovered button forceRedrawChats = 6; // redraw the chat list for several iterations in an attempt to get rid of the hovered button
@ -682,7 +682,7 @@ static void nuklearApp(struct nk_context *ctx) {
// writeSerialPortDebug(boutRefNum, "activeChatMessages[i]"); // writeSerialPortDebug(boutRefNum, "activeChatMessages[i]");
// writeSerialPortDebug(boutRefNum, activeChatMessages[i]); // writeSerialPortDebug(boutRefNum, activeChatMessages[i]);
nk_label(ctx, activeChatMessages[i], NK_TEXT_ALIGN_LEFT); nk_label(ctx, &activeChatMessages[i * 2048], NK_TEXT_ALIGN_LEFT);
} }
} }
@ -727,9 +727,18 @@ struct nk_context* initializeNuklearApp() {
writeSerialPortDebug(boutRefNum, "DEBUG_FUNCTION_CALLS: initializeNuklearApp"); writeSerialPortDebug(boutRefNum, "DEBUG_FUNCTION_CALLS: initializeNuklearApp");
#endif #endif
activeChat = malloc(sizeof(char) * MAX_FRIENDLY_NAME_LENGTH);
activeChatMessages = malloc(sizeof(char) * (MAX_CHAT_MESSAGES * 2048)); // this should match to MAX_ROWS in index.js
box_input_buffer = malloc(sizeof(char) * 2048);
chatFriendlyNames = malloc(sizeof(char) * (16 * MAX_FRIENDLY_NAME_LENGTH));
ip_input_buffer = malloc(sizeof(char) * 255);
jsFunctionResponse = malloc(sizeof(char) * MAX_RECEIVE_SIZE);
chatCountFunctionResponse = malloc(sizeof(char) * MAX_RECEIVE_SIZE);
tempChatCountFunctionResponse = malloc(sizeof(char) * MAX_RECEIVE_SIZE);
previousChatCountFunctionResponse = malloc(sizeof(char) * MAX_RECEIVE_SIZE);
new_message_input_buffer = malloc(sizeof(char) * 255);
sprintf(activeChat, "no active chat"); sprintf(activeChat, "no active chat");
memset(&chatCountFunctionResponse, '\0', MAX_RECEIVE_SIZE);
memset(&previousChatCountFunctionResponse, '\0', MAX_RECEIVE_SIZE);
graphql_input_window_size = nk_rect(WINDOW_WIDTH / 2 - 118, 80, 234, 100); graphql_input_window_size = nk_rect(WINDOW_WIDTH / 2 - 118, 80, 234, 100);
chats_window_size = nk_rect(0, 0, 180, WINDOW_HEIGHT); chats_window_size = nk_rect(0, 0, 180, WINDOW_HEIGHT);

View File

@ -23,9 +23,11 @@
#include <Scrap.h> #include <Scrap.h>
#include <Serial.h> #include <Serial.h>
#include "SerialHelper.h" #include "SerialHelper.h"
#include <stdlib.h>
#define ENABLED_DOUBLE_BUFFERING #define ENABLED_DOUBLE_BUFFERING
// #define COMMAND_CACHING #define COMMAND_CACHING
#include "nuklear.h"
// #define NK_QUICKDRAW_GRAPHICS_DEBUGGING // #define NK_QUICKDRAW_GRAPHICS_DEBUGGING
// #define DRAW_BLIT_LOCATION // #define DRAW_BLIT_LOCATION
@ -556,7 +558,7 @@ void updateBounds(int top, int bottom, int left, int right) {
#ifdef COMMAND_CACHING #ifdef COMMAND_CACHING
if (!forceRedraw && cmd->type == lastCmd->type && memcmp(r, lastCmd, sizeof(struct nk_command_rect)) == 0) { if (!lastInputWasBackspace && cmd->type == lastCmd->type && memcmp(r, lastCmd, sizeof(struct nk_command_rect)) == 0) {
#ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING #ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING
writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_rect"); writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_rect");
@ -609,7 +611,7 @@ void updateBounds(int top, int bottom, int left, int right) {
} }
#ifdef COMMAND_CACHING #ifdef COMMAND_CACHING
if (!forceRedraw && cmd->type == lastCmd->type && memcmp(r, lastCmd, sizeof(struct nk_command_rect_filled)) == 0) { if (!lastInputWasBackspace && cmd->type == lastCmd->type && memcmp(r, lastCmd, sizeof(struct nk_command_rect_filled)) == 0) {
#ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING #ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING
writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_rect_filled"); writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_rect_filled");
@ -646,7 +648,7 @@ void updateBounds(int top, int bottom, int left, int right) {
const struct nk_command_text *t = (const struct nk_command_text*)cmd; const struct nk_command_text *t = (const struct nk_command_text*)cmd;
#ifdef COMMAND_CACHING #ifdef COMMAND_CACHING
if (!forceRedraw && t->allowCache && cmd->type == lastCmd->type && memcmp(t, lastCmd, sizeof(struct nk_command_text)) == 0) { if (!lastInputWasBackspace && t->allowCache && cmd->type == lastCmd->type && memcmp(t, lastCmd, sizeof(struct nk_command_text)) == 0) {
#ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING #ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING
char log[255]; char log[255];
@ -700,7 +702,7 @@ void updateBounds(int top, int bottom, int left, int right) {
#ifdef COMMAND_CACHING #ifdef COMMAND_CACHING
if (!forceRedraw && cmd->type == lastCmd->type && memcmp(l, lastCmd, sizeof(struct nk_command_line)) == 0) { if (!lastInputWasBackspace && cmd->type == lastCmd->type && memcmp(l, lastCmd, sizeof(struct nk_command_line)) == 0) {
#ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING #ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING
writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_line"); writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_line");
@ -728,7 +730,7 @@ void updateBounds(int top, int bottom, int left, int right) {
const struct nk_command_circle *c = (const struct nk_command_circle *)cmd; const struct nk_command_circle *c = (const struct nk_command_circle *)cmd;
#ifdef COMMAND_CACHING #ifdef COMMAND_CACHING
if (!forceRedraw && cmd->type == lastCmd->type && memcmp(c, lastCmd, sizeof(struct nk_command_circle)) == 0) { if (!lastInputWasBackspace && cmd->type == lastCmd->type && memcmp(c, lastCmd, sizeof(struct nk_command_circle)) == 0) {
#ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING #ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING
writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_circle"); writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_circle");
@ -763,7 +765,7 @@ void updateBounds(int top, int bottom, int left, int right) {
const struct nk_command_circle_filled *c = (const struct nk_command_circle_filled *)cmd; const struct nk_command_circle_filled *c = (const struct nk_command_circle_filled *)cmd;
#ifdef COMMAND_CACHING #ifdef COMMAND_CACHING
if (!forceRedraw && cmd->type == lastCmd->type && memcmp(c, lastCmd, sizeof(struct nk_command_circle_filled)) == 0) { if (!lastInputWasBackspace && cmd->type == lastCmd->type && memcmp(c, lastCmd, sizeof(struct nk_command_circle_filled)) == 0) {
#ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING #ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING
writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_circle_filled"); writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_circle_filled");
@ -802,7 +804,7 @@ void updateBounds(int top, int bottom, int left, int right) {
const struct nk_command_triangle *t = (const struct nk_command_triangle*)cmd; const struct nk_command_triangle *t = (const struct nk_command_triangle*)cmd;
#ifdef COMMAND_CACHING #ifdef COMMAND_CACHING
if (!forceRedraw && cmd->type == lastCmd->type && memcmp(t, lastCmd, sizeof(struct nk_command_triangle)) == 0) { if (!lastInputWasBackspace && cmd->type == lastCmd->type && memcmp(t, lastCmd, sizeof(struct nk_command_triangle)) == 0) {
#ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING #ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING
writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_triangle"); writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_triangle");
@ -832,7 +834,7 @@ void updateBounds(int top, int bottom, int left, int right) {
const struct nk_command_triangle_filled *t = (const struct nk_command_triangle_filled *)cmd; const struct nk_command_triangle_filled *t = (const struct nk_command_triangle_filled *)cmd;
#ifdef COMMAND_CACHING #ifdef COMMAND_CACHING
if (!forceRedraw && cmd->type == lastCmd->type && memcmp(t, lastCmd, sizeof(struct nk_command_triangle_filled)) == 0) { if (!lastInputWasBackspace && cmd->type == lastCmd->type && memcmp(t, lastCmd, sizeof(struct nk_command_triangle_filled)) == 0) {
#ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING #ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING
writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_triangle_filled"); writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_triangle_filled");
@ -868,7 +870,7 @@ void updateBounds(int top, int bottom, int left, int right) {
const struct nk_command_polygon *p = (const struct nk_command_polygon*)cmd; const struct nk_command_polygon *p = (const struct nk_command_polygon*)cmd;
#ifdef COMMAND_CACHING #ifdef COMMAND_CACHING
if (!forceRedraw && cmd->type == lastCmd->type && memcmp(p, lastCmd, sizeof(struct nk_command_polygon)) == 0) { if (!lastInputWasBackspace && cmd->type == lastCmd->type && memcmp(p, lastCmd, sizeof(struct nk_command_polygon)) == 0) {
#ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING #ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING
writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_polygon"); writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_polygon");
@ -908,7 +910,7 @@ void updateBounds(int top, int bottom, int left, int right) {
const struct nk_command_polygon_filled *p = (const struct nk_command_polygon_filled*)cmd; const struct nk_command_polygon_filled *p = (const struct nk_command_polygon_filled*)cmd;
#ifdef COMMAND_CACHING #ifdef COMMAND_CACHING
if (!forceRedraw && cmd->type == lastCmd->type && memcmp(p, lastCmd, sizeof(struct nk_command_polygon_filled)) == 0) { if (!lastInputWasBackspace && cmd->type == lastCmd->type && memcmp(p, lastCmd, sizeof(struct nk_command_polygon_filled)) == 0) {
#ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING #ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING
writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_polygon_filled"); writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_polygon_filled");
@ -957,7 +959,7 @@ void updateBounds(int top, int bottom, int left, int right) {
const struct nk_command_polygon *p = (const struct nk_command_polygon*)cmd; const struct nk_command_polygon *p = (const struct nk_command_polygon*)cmd;
#ifdef COMMAND_CACHING #ifdef COMMAND_CACHING
if (!forceRedraw && cmd->type == lastCmd->type && memcmp(p, lastCmd, sizeof(struct nk_command_polygon)) == 0) { if (!lastInputWasBackspace && cmd->type == lastCmd->type && memcmp(p, lastCmd, sizeof(struct nk_command_polygon)) == 0) {
#ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING #ifdef NK_QUICKDRAW_GRAPHICS_DEBUGGING
writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_polygon"); writeSerialPortDebug(boutRefNum, "ALREADY DREW CMD nk_command_polygon");
@ -1144,7 +1146,7 @@ NK_API void nk_quickdraw_render(WindowPtr window, struct nk_context *ctx) {
// TODO: if this becomes worth pursuing later, it causes address errors. I suspect that the memcpy // TODO: if this becomes worth pursuing later, it causes address errors. I suspect that the memcpy
// command that builds up the last variable is not properly allocating memory. // command that builds up the last variable is not properly allocating memory.
// the address error pops up on the line of the conditional itself and can sometimes take hours to trigger. // the address error pops up on the line of the conditional itself and can sometimes take hours to trigger.
if (currentCalls < lastCalls && lastCmd && lastCmd->next && lastCmd->next < ctx->memory.allocated) { if (currentCalls < lastCalls && lastCmd && lastCmd->next) {
lastCmd = nk_ptr_add_const(struct nk_command, last, lastCmd->next); lastCmd = nk_ptr_add_const(struct nk_command, last, lastCmd->next);
} }
@ -1190,6 +1192,7 @@ NK_API void nk_quickdraw_render(WindowPtr window, struct nk_context *ctx) {
#ifdef DRAW_BLIT_LOCATION #ifdef DRAW_BLIT_LOCATION
ForeColor(blackColor); ForeColor(blackColor);
// FillRoundRect(&quickDrawRectangle, 0, 0, &qd.ltGray);
FrameRoundRect(&quickDrawRectangle, 0, 0); FrameRoundRect(&quickDrawRectangle, 0, 0);
#endif #endif
@ -1360,6 +1363,9 @@ NK_API int nk_quickdraw_handle_event(EventRecord *event, struct nk_context *nukl
nk_input_key(nuklear_context, NK_KEY_SHIFT, isKeyDown); nk_input_key(nuklear_context, NK_KEY_SHIFT, isKeyDown);
} else if (key == deleteKey && isKeyDown) { } else if (key == deleteKey && isKeyDown) {
#ifdef COMMAND_CACHING
lastInputWasBackspace = true;
#endif
nk_input_key(nuklear_context, NK_KEY_DEL, isKeyDown); nk_input_key(nuklear_context, NK_KEY_DEL, isKeyDown);
} else if (key == enterKey) { } else if (key == enterKey) {
@ -1372,9 +1378,15 @@ NK_API int nk_quickdraw_handle_event(EventRecord *event, struct nk_context *nukl
nk_input_key(nuklear_context, NK_KEY_TAB, isKeyDown); nk_input_key(nuklear_context, NK_KEY_TAB, isKeyDown);
} else if (key == leftArrowKey) { } else if (key == leftArrowKey) {
#ifdef COMMAND_CACHING
lastInputWasBackspace = true;
#endif
nk_input_key(nuklear_context, NK_KEY_LEFT, isKeyDown); nk_input_key(nuklear_context, NK_KEY_LEFT, isKeyDown);
} else if (key == rightArrowKey) { } else if (key == rightArrowKey) {
#ifdef COMMAND_CACHING
lastInputWasBackspace = true;
#endif
nk_input_key(nuklear_context, NK_KEY_RIGHT, isKeyDown); nk_input_key(nuklear_context, NK_KEY_RIGHT, isKeyDown);
} else if (key == upArrowKey) { } else if (key == upArrowKey) {