Help on Unix project

Just on their own line.

You have

}```

and

finally. ```/*

when you need

}
```

and

finally.
```
/*

I did that

Yes... the end part is good now.

And do the same with the "finally ``` /*" part...

Excellent! Thank you

Looks like we have a window manager I built for the Uno just yesterday, and today, and I would like feedback on how the system can use the EEPROM (32sector/32bytes each) and make it fully featured, like settings, background, now that I built a base. The alpha is at (Build 55/Refresh: http://b55.ct.ws) (Build 50/Oldbase: http://b50.ct.ws).

build 55:

/*

 * Arduino OS Windowing System API (Build 54)

 * Foundation: Stable Build 50 Beta

 * Optimization: High-speed partial redraws, zero-delay input processing.

 * Features: 24-bit TrueColor Gradient Titles, Pro Scrollbars (░/█).

 */



#include <Arduino.h>



#define BAUD_RATE 500000

#define BUILD_NUMBER 55



// --- System Constants ---

const char BUILD_STR[] PROGMEM = "Arduino (R) MiniOS (R) Build 55";



// Custom Lorem Ipsum Text stored in Flash

const char LOREM_TEXT[] PROGMEM =

"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam id lorem in diam lobortis rhoncus sed sit amet nisl. Phasellus aliquet enim mattis, sodales mi at, rhoncus urna. Duis eget varius lectus, fermentum vehicula nisi. Suspendisse enim leo, ultricies eget purus vel, blandit rutrum urna. Ut non condimentum purus. Vestibulum egestas, lectus vitae blandit faucibus, tellus sem ultrices augue, a consequat leo enim ut dolor. Etiam et nisl eleifend ligula placerat facilisis eget vel nibh. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam pretium nunc at dapibus posuere. Morbi et felis orci. Sed vel mauris congue, facilisis ante imperdiet, varius libero. Maecenas mollis dolor sed odio porta aliquet. Nulla vitae velit non tellus aliquet bibendum quis consequat lectus. Vivamus tincidunt egestas pharetra.\n"

"Pellentesque ultricies luctus turpis, at venenatis erat tristique vel. Sed dapibus mi quis arcu fermentum hendrerit. Aliquam erat volutpat. Aliquam eu felis ut libero porta aliquam vel vel urna. Nulla nec augue dui. In mauris lacus, vehicula eget risus et, egestas interdum dolor. Morbi lacus magna, facilisis a risus et, sodales gravida ligula. Praesent facilisis consequat nibh a vestibulum. Donec cursus mollis nibh at tempus. Phasellus congue luctus eros, quis bibendum lorem blandit a. Donec bibendum lobortis tortor, sed aliquet tellus egestas sed.\n"

"Proin molestie turpis non est eleifend, sit amet condimentum ex pharetra. Curabitur arcu velit, ultricies a nunc ut, placerat ultricies metus. Aenean turpis nibh, ultricies placerat porta a, faucibus a nunc. Donec urna nisl, pharetra a fermentum eu, efficitur eget dolor. Aenean porta, neque id imperdiet tincidunt, elit ipsum feugiat eros, sed pulvinar sapien diam ac enim. In eros enim, porta sit amet dignissim eget, rutrum dignissim risus. Ut non egestas diam. Nulla at arcu in ligula dignissim volutpat faucibus a felis.\n"

"Nam sit amet mi ac tellus molestie efficitur. Pellentesque ac magna fermentum, aliquet dolor sit amet, facilisis magna. Sed sed blandit enim. Quisque ultricies nec nisi et finibus. Etiam finibus nisi in quam dapibus euismod. Praesent ornare blandit velit, ac finibus dui convallis id. Nullam mollis et odio non laoreet. Phasellus iaculis lobortis lacus, sit amet porttitor tortor aliquet id. Vestibulum tristique libero a porttitor vestibulum. Proin mauris risus, mollis eu tortor sit amet, hendrerit luctus nunc.\n"

"Aliquam fringilla nec urna eget lobortis. Sed dictum lobortis lectus, sed aliquam nunc tempor sed. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aenean euismod rutrum tortor id facilisis. Nunc cursus risus at odio accumsan tempus. Quisque volutpat libero ac enim fermentum dignissim. Etiam eget faucibus justo. Donec at placerat dolor, et ullamcorper massa. Curabitur eget lorem vitae quam viverra aliquam sed vitae tellus. Nulla euismod finibus urna eget tempor. Sed ornare porttitor iaculis. Aenean augue felis, semper at purus sed, porta congue neque. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed magna lacus, fringilla ut placerat vel, sodales sit amet neque. Cras nec lectus quis nibh tristique elementum.\n"

"Sed dapibus, sapien nec mollis dapibus, lectus ante vestibulum felis, at rutrum ligula turpis non arcu. Sed sodales magna elementum efficitur blandit. Cras viverra pellentesque felis in iaculis. Vivamus scelerisque ex quam, sit amet mollis sem porttitor ac. Nullam laoreet pretium aliquet. Integer feugiat neque tortor, ut laoreet velit finibus eget. Integer pharetra nunc eu mauris gravida rutrum. Vestibulum viverra ipsum sem, et blandit ipsum facilisis sit amet. Donec suscipit elit purus, ac maximus leo vehicula eu. Pellentesque interdum pharetra justo ac efficitur. Praesent non lacinia nisl. Morbi auctor, risus viverra varius tincidunt, ligula risus sollicitudin lacus, non vehicula ligula augue quis purus. Pellentesque vel libero venenatis, bibendum turpis a, varius tortor. Fusce semper sit amet risus sit amet porta. Duis laoreet ligula dapibus ligula sollicitudin ornare. Sed in scelerisque purus.\n"

"Nulla non odio nec sapien consectetur feugiat. Etiam nec arcu aliquet, varius ipsum id, ultrices nisi. Etiam convallis ligula sed quam ornare commodo. Duis velit urna, sodales vitae dictum et, ornare vitae est. Ut et tellus eu lacus finibus mattis faucibus et leo. Aliquam at leo suscipit risus viverra convallis. Aliquam erat volutpat. Quisque dignissim luctus mi, sit amet cursus ante feugiat sit amet. Donec pharetra libero eget interdum congue. Vestibulum suscipit nibh non placerat scelerisque. Vestibulum auctor fringilla iaculis. Maecenas facilisis augue vel augue dictum, id mattis lectus mattis.\n"

"In commodo purus at dui dictum, ut vestibulum purus facilisis. Aliquam pharetra consectetur lorem, sit amet sollicitudin turpis egestas non. Fusce ac mauris mattis, pulvinar metus pulvinar, luctus mauris. Donec ac lorem ultricies, iaculis ipsum eu, rutrum urna. Fusce mattis tempus nunc. Sed euismod leo tortor, molestie suscipit sem iaculis eget. Integer quam nulla, molestie sit amet mi in, dapibus auctor nulla. Etiam volutpat facilisis mauris, ac facilisis lectus tristique a. Fusce efficitur sed arcu ut ultrices. Vivamus ut pellentesque lorem, id auctor felis. Fusce bibendum dapibus accumsan.\n"

"Nullam in enim ac sapien commodo fermentum. Curabitur imperdiet odio ut tincidunt ultricies. Nunc consectetur sapien magna, ac dignissim justo rhoncus ac. Aenean tempor viverra nunc quis dapibus. Praesent leo tellus, porta non ultricies ut, posuere id urna. Sed molestie sagittis turpis a pellentesque. Quisque accumsan nisi ac velit congue tincidunt. Integer fringilla mollis sem, sit amet efficitur urna. Integer dolor justo, ullamcorper ac est ut, varius blandit nunc.\n"

"Aliquam in gravida nibh, quis volutpat elit. Suspendisse potenti. Donec maximus nulla turpis, ac imperdiet lorem bibendum sed. Vestibulum mollis leo vitae lectus dictum, eget iaculis diam blandit. Mauris scelerisque risus velit, eget pulvinar felis suscipit sed. Aenean in sagittis tellus, vitae congue lacus. Sed at diam ipsum. Curabitur metus eros, rhoncus quis sem vitae, interdum dictum mi. Aliquam non magna lacus. Praesent cursus tortor vitae mauris commodo, id tempus est condimentum. In consectetur tempor diam, et rutrum est suscipit vitae.";



struct Color { uint8_t r, g, b; };



// --- Window Structure ---

struct Window {

  int x, y, w, h;

  char title[20];

  bool active;

  bool minimized;

  bool maximized;

  int oldX, oldY, oldW, oldH;

  float scrollPos;

};



// --- Global System State ---

Window mainWin = {5, 3, 50, 14, "miniOS Window", true, false, false, 5, 3, 50, 14, 0.0};

int termW = 80, termH = 24;

int lastMouseX = 1, lastMouseY = 1;



// Interaction State

bool isDragging = false;

bool isScrolling = false;

int dragOffX = 0, dragOffY = 0;

int ghostX = 0, ghostY = 0;



// --- ANSI 24-bit Color Wrappers ---

void setFg(Color c) { Serial.print(F("\033[38;2;")); Serial.print(c.r); Serial.print(';'); Serial.print(c.g); Serial.print(';'); Serial.print(c.b); Serial.print('m'); }

void setBg(Color c) { Serial.print(F("\033[48;2;")); Serial.print(c.r); Serial.print(';'); Serial.print(c.g); Serial.print(';'); Serial.print(c.b); Serial.print('m'); }

void setCursor(int x, int y) { Serial.print(F("\033[")); Serial.print(y); Serial.print(';'); Serial.print(x); Serial.print('H'); }

void resetFormat() { Serial.print(F("\033[0m")); }



void setSysColor(int fg, int bg = -1) {

  if (fg != -1) { Serial.print(F("\033[38;5;")); Serial.print(fg); Serial.print('m'); }

  if (bg != -1) { Serial.print(F("\033[48;5;")); Serial.print(bg); Serial.print('m'); }

}



// --- Core Redraw Logic ---



void redrawPoint(int x, int y) {

  if (x >= termW && y >= termH) return;



  // 1. Window Logic

  if (mainWin.active && !mainWin.minimized && x >= mainWin.x && x < mainWin.x + mainWin.w && y >= mainWin.y && y < mainWin.y + mainWin.h) {

    int rx = x - mainWin.x;

    int ry = y - mainWin.y;

    setCursor(x, y);



    if (ry == 0) { // Title Bar Gradient

      float t = (float)rx / mainWin.w;

      Color grad = {(uint8_t)(40 + t*40), (uint8_t)(60 + t*20), (uint8_t)(150 - t*50)};

      setBg(grad); setFg({255, 255, 255});

     

      if (rx == mainWin.w - 2) Serial.print(F("✕"));

      else if (rx == mainWin.w - 4) Serial.print(mainWin.maximized ? F("❒") : F("☐"));

      else if (rx == mainWin.w - 6) Serial.print(F("-"));

      else if (rx > 0 && rx <= (int)strlen(mainWin.title)) Serial.print(mainWin.title[rx-1]);

      else Serial.print(' ');

    } else if (rx == mainWin.w - 1) { // Pro Scrollbar

      // The scrollbar track is always visible in the right-most column of the window

      int thumbPos = 1 + (int)(mainWin.scrollPos * (mainWin.h - 2));

      setBg({231, 231, 231});

      if (ry == thumbPos) {

        setFg({100, 100, 100}); Serial.print(F("█"));

      } else {

        setFg({200, 200, 200}); Serial.print(F("░"));

      }

    } else { // Client Area

      setBg({255, 255, 255}); setFg({0, 0, 0});

      int charsPerLine = mainWin.w - 2;

      int totalTextLen = strlen_P(LOREM_TEXT);

     

      // Calculate how many lines are needed for the text

      int maxLines = (totalTextLen + charsPerLine - 1) / charsPerLine;

      int visibleLines = mainWin.h - 1; // excluding title bar

      int scrollRange = maxLines - visibleLines;

      if (scrollRange < 0) scrollRange = 0;

     

      int startLine = (int)(mainWin.scrollPos * scrollRange);

     

      int charIdx = (startLine + ry - 1) * charsPerLine + (rx - 1);

      if (charIdx >= 0 && charIdx < totalTextLen) {

        char c = (char)pgm_read_byte(LOREM_TEXT + charIdx);

        // Handle basic formatting if any, or just print char

        Serial.print(c == '\n' ? ' ' : c);

      } else {

        Serial.print(' ');

      }

    }

    return;

  }



  // 2. Corner Labels

  int len = strlen_P(BUILD_STR);

  if (!mainWin.maximized && ((y == 1 || y == termH) && (x <= len || x > termW - len))) {

    setCursor(x, y);

    resetFormat();

    if (x <= len) Serial.print((char)pgm_read_byte(BUILD_STR + (x - 1)));

    else Serial.print((char)pgm_read_byte(BUILD_STR + (x - (termW - len + 1))));

    return;

  }



  // 3. Desktop Background

  setCursor(x, y);

  resetFormat();

  Serial.print(' ');

}



// Partial Redraw: Only redraws the window area

void redrawWindow() {

  if (!mainWin.active || mainWin.minimized) return;

  for(int j = 0; j < mainWin.h; j++) {

    for(int i = 0; i < mainWin.w; i++) {

      redrawPoint(mainWin.x + i, mainWin.y + j);

    }

  }

}



void drawWireframe(int x, int y, int w, int h, bool erase) {

  if (erase) {

    for(int i=0; i<w; i++) { redrawPoint(x+i, y); redrawPoint(x+i, y+h-1); }

    for(int i=1; i<h-1; i++) { redrawPoint(x, y+i); redrawPoint(x+w-1, y+i); }

  } else {

    setSysColor(15, -1);

    for(int i=0; i<w; i++) { setCursor(x+i, y); Serial.print(':'); setCursor(x+i, y+h-1); Serial.print(':'); }

    for(int i=1; i<h-1; i++) { setCursor(x, y+i); Serial.print(':'); setCursor(x+w-1, y+i); Serial.print(':'); }

    resetFormat();

  }

}



void refreshAll() {

  resetFormat();

  Serial.print(F("\033[2J\033[H"));

  // Corners

  if (!mainWin.maximized) {

    int len = strlen_P(BUILD_STR);

    setCursor(1, 1); for(int i=0; i<len; i++) Serial.print((char)pgm_read_byte(BUILD_STR+i));

    setCursor(termW-len+1, 1); for(int i=0; i<len; i++) Serial.print((char)pgm_read_byte(BUILD_STR+i));

    setCursor(1, termH); for(int i=0; i<len; i++) Serial.print((char)pgm_read_byte(BUILD_STR+i));

    setCursor(termW-len+1, termH); for(int i=0; i<len; i++) Serial.print((char)pgm_read_byte(BUILD_STR+i));

  }

  redrawWindow();

}



void checkResolution() {

  Serial.print(F("\033[999;999H\033[6n"));

  unsigned long start = millis();

  int rIdx = 0; char resBuf[16];

  while (millis() - start < 50) { // Reduced delay for faster sensing

    if (Serial.available()) {

      char c = Serial.read();

      if (c == 'R') break;

      if ((c >= '0' && c <= '9') || c == ';') resBuf[rIdx++] = c;

      if (rIdx >= 15) break;

    }

  }

  resBuf[rIdx] = '\0';

  if (rIdx > 0) {

    int sep = -1;

    for(int i=0; i<rIdx; i++) if(resBuf[i] == ';') sep = i;

    if (sep != -1) {

      resBuf[sep] = '\0';

      int nH = atoi(resBuf);

      int nW = atoi(resBuf + sep + 1);

      if (nW > 20 && nH > 10 && (nW != termW || nH != termH)) {

        termW = nW; termH = nH;

        if (mainWin.maximized) { mainWin.w = termW; mainWin.h = termH; }

        refreshAll();

      }

    }

  }

}



void processMouse(char* seq) {

  // Manual parsing for speed (no String objects)

  char* ptr = strchr(seq, '<');

  if (!ptr) return;

  int btn = atoi(ptr + 1);

  ptr = strchr(ptr, ';'); if (!ptr) return;

  int mx = atoi(ptr + 1);

  ptr = strchr(ptr + 1, ';'); if (!ptr) return;

  int my = atoi(ptr + 1);

  bool isRelease = (seq[strlen(seq)-1] == 'm');



  if (mx != lastMouseX || my != lastMouseY) {

    if (isDragging) {

      drawWireframe(ghostX, ghostY, mainWin.w, mainWin.h, true);

      ghostX = mx - dragOffX; ghostY = my - dragOffY;

      drawWireframe(ghostX, ghostY, mainWin.w, mainWin.h, false);

    } else if (isScrolling) {

      // Calculate scroll position based on Y coordinate within the scrollbar area

      float newPos = (float)(my - mainWin.y - 1) / (mainWin.h - 2);

      if (newPos < 0) newPos = 0;

      if (newPos > 1.0) newPos = 1.0;

      if (newPos != mainWin.scrollPos) {

        mainWin.scrollPos = newPos;

        redrawWindow();

      }

    } else {

      redrawPoint(lastMouseX, lastMouseY);

    }

    lastMouseX = mx; lastMouseY = my;

    setCursor(mx, my);

    if (!(mx == termW && my == termH)) { setSysColor(11, -1); Serial.print(F("🮰")); }

  }



  if (btn == 0 && !isRelease) {

    // Check Title Bar interactions

    if (my == mainWin.y && mx >= mainWin.x && mx < mainWin.x + mainWin.w) {

      int rx = mx - mainWin.x;

      if (rx == mainWin.w - 2) { mainWin.active = false; refreshAll(); }

      else if (rx == mainWin.w - 4) {

        mainWin.maximized = !mainWin.maximized;

        if (mainWin.maximized) {

          mainWin.oldX = mainWin.x; mainWin.oldY = mainWin.y;

          mainWin.oldW = mainWin.w; mainWin.oldH = mainWin.h;

          mainWin.x = 1; mainWin.y = 1; mainWin.w = termW; mainWin.h = termH;

        } else {

          mainWin.x = mainWin.oldX; mainWin.y = mainWin.oldY;

          mainWin.w = mainWin.oldW; mainWin.h = mainWin.oldH;

        }

        refreshAll();

      } else if (!mainWin.maximized) {

        isDragging = true; dragOffX = mx - mainWin.x; dragOffY = my - mainWin.y;

        ghostX = mainWin.x; ghostY = mainWin.y;

        drawWireframe(ghostX, ghostY, mainWin.w, mainWin.h, false);

      }

    }

    // Check Scrollbar interaction (last column of the window)

    else if (mx == mainWin.x + mainWin.w - 1 && my > mainWin.y && my < mainWin.y + mainWin.h) {

      isScrolling = true;

      // Trigger initial scroll update on click

      float newPos = (float)(my - mainWin.y - 1) / (mainWin.h - 2);

      if (newPos < 0) newPos = 0; if (newPos > 1.0) newPos = 1.0;

      mainWin.scrollPos = newPos;

      redrawWindow();

    }

  } else if (isRelease) {

    if (isDragging) {

      isDragging = false;

      drawWireframe(ghostX, ghostY, mainWin.w, mainWin.h, true);

      mainWin.x = ghostX; mainWin.y = ghostY;

      refreshAll();

    }

    isScrolling = false;

  }

}



void setup() {

  Serial.begin(BAUD_RATE);

  delay(200);

  // Enable mouse reporting (SGR mode) and hide cursor

  Serial.print(F("\033[?1003h\033[?1006h\033[?25l"));

  checkResolution();

  refreshAll();

}



void loop() {

  static char buf[64];

  static int idx = 0;

  while (Serial.available() > 0) {

    char c = Serial.read();

    buf[idx++] = c;

    if (c == 'M' || c == 'm') {

      buf[idx] = '\0';

      if (buf[0] == '\033') processMouse(buf);

      idx = 0;

    }

    if (idx >= 63) idx = 0;

  }

} 

and build 50:

/*

* Arduino OS Windowing System API (Build 50)

* Features: Single Window System, Scrollbars, Dragging.

* Note: Taskbar and Debugger modules stripped. Background: White.

* Fixed: Corner labels (Build String) now redraw correctly when occluded.

*/



#include <Arduino.h>



#define BAUD_RATE 500000

#define BUILD_NUMBER 50



// --- System Constants & API Enums ---

enum DialogType { DLG_ERROR, DLG_WARNING, DLG_QUESTION };



struct Theme {

int desktop;

int winFrame;

int winTitle;

int winTitleText;

int clientBg;

int clientText;

int scrollBar;

int scrollTrack;

int taskbarBg;

int taskbarTile;

int taskbarActive;

};



// Background set to white (ANSI 231 or 15)

const Theme LIGHT_THEME = {231, 7, 12, 15, 7, 0, 244, 252, 235, 240, 250};



// --- Window Structure ---

struct Window {

int x, y, w, h;

char title[20];

bool active;

bool minimized;

bool maximized;

bool isDialog;

DialogType dType;

int oldX, oldY, oldW, oldH;

float scrollPos;

};



// --- Global System State ---

Window mainWin = {5, 3, 50, 14, "System Explorer", true, false, false, false, DLG_ERROR, 5, 3, 50, 14, 0.0};

Window diagWin = {20, 7, 32, 8, "System Message", false, false, false, true, DLG_ERROR, 20, 7, 32, 8, 0.0};



Theme currentTheme = LIGHT_THEME;

int lastMouseX = 1, lastMouseY = 1;

int termW = 80, termH = 24;

bool isSystemPanicked = false;



// Dragging State

bool isDragging = false;

int dragOffX = 0, dragOffY = 0;

int ghostX = 0, ghostY = 0;



bool isScrolling = false;



const char* BUILD_STR = "Arduino (R) MiniOS (R) Build 50";

const char* LOREM_TEXT = `Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam id lorem in diam lobortis rhoncus sed sit amet nisl. Phasellus aliquet enim mattis, sodales mi at, rhoncus urna. Duis eget varius lectus, fermentum vehicula nisi. Suspendisse enim leo, ultricies eget purus vel, blandit rutrum urna. Ut non condimentum purus. Vestibulum egestas, lectus vitae blandit faucibus, tellus sem ultrices augue, a consequat leo enim ut dolor. Etiam et nisl eleifend ligula placerat facilisis eget vel nibh. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam pretium nunc at dapibus posuere. Morbi et felis orci. Sed vel mauris congue, facilisis ante imperdiet, varius libero. Maecenas mollis dolor sed odio porta aliquet. Nulla vitae velit non tellus aliquet bibendum quis consequat lectus. Vivamus tincidunt egestas pharetra.

Pellentesque ultricies luctus turpis, at venenatis erat tristique vel. Sed dapibus mi quis arcu fermentum hendrerit. Aliquam erat volutpat. Aliquam eu felis ut libero porta aliquam vel vel urna. Nulla nec augue dui. In mauris lacus, vehicula eget risus et, egestas interdum dolor. Morbi lacus magna, facilisis a risus et, sodales gravida ligula. Praesent facilisis consequat nibh a vestibulum. Donec cursus mollis nibh at tempus. Phasellus congue luctus eros, quis bibendum lorem blandit a. Donec bibendum lobortis tortor, sed aliquet tellus egestas sed.`.replace(/\n/g, ' ');



// --- Core API: System Functions ---



void setCursor(int x, int y) {

Serial.print("\033["); Serial.print(y);

Serial.print(";"); Serial.print(x); Serial.print("H");

}



void resetFormat() { Serial.print("\033[0m"); }



void setSysColor(int fg, int bg = -1) {

if (fg != -1) { Serial.print("\033[38;5;"); Serial.print(fg); Serial.print("m"); }

if (bg != -1) { Serial.print("\033[48;5;"); Serial.print(bg); Serial.print("m"); }

}



void drawCornerLabels() {

int len = strlen(BUILD_STR);

setSysColor(0, currentTheme.desktop);


setCursor(1, 1); Serial.print(BUILD_STR);

setCursor(termW - len + 1, 1); Serial.print(BUILD_STR);

setCursor(1, termH); Serial.print(BUILD_STR);

setCursor(termW - len + 1, termH); Serial.print(BUILD_STR);

}



void drawWireframe(int x, int y, int w, int h, bool erase) {

setSysColor(erase ? 0 : 15, erase ? currentTheme.desktop : -1);

char edge = erase ? ' ' : ':';

for(int i=0; i<w; i++) {

setCursor(x+i, y); Serial.print(edge);

setCursor(x+i, y+h-1); Serial.print(edge);

}

for(int i=1; i<h-1; i++) {

setCursor(x, y+i); Serial.print(edge);

setCursor(x+w-1, y+i); Serial.print(edge);

}

}



void redrawPoint(int x, int y) {

if (isSystemPanicked || (x == termW && y == termH)) return;



// 1. Check if window covers this point

if (mainWin.active && !mainWin.minimized && x >= mainWin.x && x < mainWin.x + mainWin.w && y >= mainWin.y && y < mainWin.y + mainWin.h) {

int rx = x - mainWin.x;

int ry = y - mainWin.y;

setCursor(x, y);

if (ry == 0) {

setSysColor(currentTheme.winTitleText, currentTheme.winTitle);

if (rx == mainWin.w - 2) Serial.print("✕");

else if (rx == mainWin.w - 4) Serial.print(mainWin.maximized ? "❒" : "☐");

else if (rx == mainWin.w - 6) Serial.print("-");

else if (rx > 0 && rx <= (int)strlen(mainWin.title)) Serial.print(mainWin.title[rx-1]);

else Serial.print(" ");

} else if (rx == mainWin.w - 1) {

int thumbPos = 1 + (int)(mainWin.scrollPos * (mainWin.h - 2));

if (ry == thumbPos) { setSysColor(currentTheme.scrollBar, 7); Serial.print("▐"); }

else { setSysColor(currentTheme.scrollTrack, 7); Serial.print("▕"); }

} else {

setSysColor(currentTheme.clientText, 7);

int charsPerLine = mainWin.w - 2;

int totalTextLen = strlen(LOREM_TEXT);

int maxLines = (totalTextLen + charsPerLine - 1) / charsPerLine;

int scrollRange = maxLines - (mainWin.h - 1);

if (scrollRange < 0) scrollRange = 0;

int startLine = (int)(mainWin.scrollPos * scrollRange);


int charIdx = (startLine + ry - 1) * charsPerLine + (rx - 1);

if (charIdx >= 0 && charIdx < totalTextLen) Serial.print(LOREM_TEXT[charIdx]);

else Serial.print(" ");

}

}

// 2. Check if this is a corner label point

else {

int len = strlen(BUILD_STR);

setCursor(x, y);

setSysColor(0, currentTheme.desktop);


bool isCorner = false;

// Top Left / Top Right / Bottom Left / Bottom Right hits

if (y == 1) {

if (x >= 1 && x <= len) { Serial.print(BUILD_STR[x-1]); isCorner = true; }

else if (x >= termW - len + 1 && x <= termW) { Serial.print(BUILD_STR[x - (termW - len + 1)]); isCorner = true; }

} else if (y == termH) {

if (x >= 1 && x <= len) { Serial.print(BUILD_STR[x-1]); isCorner = true; }

else if (x >= termW - len + 1 && x <= termW) { Serial.print(BUILD_STR[x - (termW - len + 1)]); isCorner = true; }

}


if (!isCorner) Serial.print(" ");

}

}



void checkResolution() {

Serial.print("\033[999;999H\033[6n");

unsigned long start = millis();

char resBuf[16];

int rIdx = 0;

while (millis() - start < 150) {

if (Serial.available()) {

char c = Serial.read();

if (c == 'R') break;

if ((c >= '0' && c <= '9') || c == ';') resBuf[rIdx++] = c;

}

}

resBuf[rIdx] = '\0';

String res = String(resBuf);

int sep = res.indexOf(';');

if (sep != -1) {

int newH = res.substring(0, sep).toInt();

int newW = res.substring(sep + 1).toInt();

if (newW > 20 && newH > 10 && (newW != termW || newH != termH)) {

termW = newW; termH = newH;

refreshAll();

}

}

}



void drawWindow(Window &win) {

if (!win.active || win.minimized) return;

int tBg = win.isDialog ? (win.dType == DLG_ERROR ? 160 : 27) : currentTheme.winTitle;


setCursor(win.x, win.y);

setSysColor(15, tBg);

for(int i=0; i < win.w; i++) {

if (i == win.w - 2 && !win.isDialog) Serial.print("✕");

else if (i == win.w - 4 && !win.isDialog) Serial.print(win.maximized ? "❒" : "☐");

else if (i == win.w - 6 && !win.isDialog) Serial.print("-");

else if (i > 0 && i <= (int)strlen(win.title)) Serial.print(win.title[i-1]);

else Serial.print(" ");

}



int charsPerLine = win.w - 2;

int totalTextLen = strlen(LOREM_TEXT);

int maxLines = (totalTextLen + charsPerLine - 1) / charsPerLine;

int scrollRange = maxLines - (win.h - 1);

if (scrollRange < 0) scrollRange = 0;

int startLine = (int)(win.scrollPos * scrollRange);



for(int i=1; i < win.h; i++) {

if (win.y + i > termH) break;

setCursor(win.x, win.y + i);

setSysColor(0, 7);

int lineStartIdx = (startLine + i - 1) * charsPerLine;

for(int j=0; j < win.w - 1; j++) {

int charIdx = lineStartIdx + j;

if (!win.isDialog && charIdx >= 0 && charIdx < totalTextLen) Serial.print(LOREM_TEXT[charIdx]);

else Serial.print(" ");

}

int thumbPos = 1 + (int)(win.scrollPos * (win.h - 2));

if (i == thumbPos) { setSysColor(currentTheme.scrollBar, 7); Serial.print("▐"); }

else { setSysColor(currentTheme.scrollTrack, 7); Serial.print("▕"); }

}

}



void refreshAll() {

if (isSystemPanicked) return;

resetFormat();

Serial.print("\033[2J\033[H");

setSysColor(0, currentTheme.desktop);

for(int i=0; i < termH; i++) {

setCursor(1, i+1);

for(int j=0; j < termW; j++) Serial.print(" ");

}

drawCornerLabels();

drawWindow(mainWin);

if (diagWin.active) drawWindow(diagWin);

}



void handleInput() {

static char buf[64];

static int idx = 0;

while (Serial.available() > 0) {

char c = Serial.read();

buf[idx++] = c;

if (c == 'M' || c == 'm' || (c >= 'a' && c <= 'z')) {

buf[idx] = '\0';

if (buf[0] == '\033') processMouse(buf);

idx = 0;

}

if (idx >= 63) idx = 0;

}

}



void processMouse(char* seq) {

String s = String(seq);

int f = s.indexOf(';');

int sec = s.indexOf(';', f + 1);

if (f == -1 || sec == -1) return;



int btn = s.substring(s.indexOf('<') + 1, f).toInt();

int mx = s.substring(f + 1, sec).toInt();

int my = s.substring(sec + 1, s.length() - 1).toInt();

bool isRelease = s.endsWith("m");



if (mx != lastMouseX || my != lastMouseY) {

if (isDragging) {

drawWireframe(ghostX, ghostY, mainWin.w, mainWin.h, true);

ghostX = mx - dragOffX; ghostY = my - dragOffY;

drawWireframe(ghostX, ghostY, mainWin.w, mainWin.h, false);

} else if (isScrolling) {

float newPos = (float)(my - mainWin.y - 1) / (mainWin.h - 2);

if (newPos < 0) newPos = 0; if (newPos > 1.0) newPos = 1.0;

if (newPos != mainWin.scrollPos) { mainWin.scrollPos = newPos; drawWindow(mainWin); }

} else {

redrawPoint(lastMouseX, lastMouseY);

}

lastMouseX = mx; lastMouseY = my;

setCursor(mx, my);

if (!(mx == termW && my == termH)) { setSysColor(11, -1); Serial.print("🮰"); }

}



if (btn == 0 && !isRelease) {

if (my == mainWin.y && mx >= mainWin.x && mx < mainWin.x + mainWin.w) {

int rx = mx - mainWin.x;

if (rx == mainWin.w - 2) {

mainWin.active = false;

refreshAll();

} else if (rx == mainWin.w - 4) {

mainWin.maximized = !mainWin.maximized;

if (mainWin.maximized) {

mainWin.oldX = mainWin.x; mainWin.oldY = mainWin.y;

mainWin.oldW = mainWin.w; mainWin.oldH = mainWin.h;

mainWin.x = 1; mainWin.y = 1; mainWin.w = termW; mainWin.h = termH;

} else {

mainWin.x = mainWin.oldX; mainWin.y = mainWin.oldY;

mainWin.w = mainWin.oldW; mainWin.h = mainWin.oldH;

}

refreshAll();

} else if (rx == mainWin.w - 6) {

mainWin.minimized = true;

refreshAll();

} else if (rx < mainWin.w - 8 && !mainWin.maximized) {

isDragging = true;

dragOffX = mx - mainWin.x;

dragOffY = my - mainWin.y;

ghostX = mainWin.x; ghostY = mainWin.y;

drawWireframe(ghostX, ghostY, mainWin.w, mainWin.h, false);

}

}

else if (mx == mainWin.x + mainWin.w - 1 && my > mainWin.y && my < mainWin.y + mainWin.h) {

isScrolling = true;

}

} else if (isRelease) {

if (isDragging) {

isDragging = false;

drawWireframe(ghostX, ghostY, mainWin.w, mainWin.h, true);

mainWin.x = ghostX; mainWin.y = ghostY;

refreshAll();

}

isScrolling = false;

}

}



void setup() {

Serial.begin(BAUD_RATE);

delay(500);

Serial.print("\033[?1003h\033[?1006h\033[?25l");

checkResolution();

refreshAll();

}



void loop() {

handleInput();

static unsigned long lastResCheck = 0;

if (millis() - lastResCheck > 4000) {

checkResolution();

lastResCheck = millis();

}

}

What exactly kept complaining ?

If you are having trouble formatting your sketch and uploading it try this

Start by tidying up your code by using Tools/Auto Format in the IDE to make it easier to read. Then use Edit/Copy for Forum and paste what was copied in a new reply. Code tags will have been added to the code to make it easy to read in the forum thus making it easier to provide help