From e666ca32de610ea586d465031c9d0d2e5fd18cd8 Mon Sep 17 00:00:00 2001 From: Tomas Rivera Date: Tue, 2 Jun 2026 14:03:05 +0200 Subject: [PATCH 01/11] feat: button return to note selection from journal entry selection --- src/main.c | 30 +++++++++++++++++++----------- src/notes.c | 7 +++++-- src/notes.h | 3 ++- 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/main.c b/src/main.c index 1916e4a..4fbcf6c 100644 --- a/src/main.c +++ b/src/main.c @@ -695,24 +695,32 @@ backup_config_end: int *journalWasUpdated = malloc(sizeof(int)); *journalWasUpdated = 0; + + // used to go back to note selection + int *returnNoteSelection = malloc(sizeof(int)); + *returnNoteSelection = 0; + if (!regexReturn) { // if the regex matches -> it's a journal debug("%s is a journal. Updating it...", noteSelected); - fullPath = updateJournal(fullPath, noteSelected, timeFormat, journalWasUpdated, + fullPath = updateJournal(fullPath, noteSelected, timeFormat, journalWasUpdated, returnNoteSelection, shouldDebug); // we return the path. As if it is a divided journal we // must point to the correct entry } - if (newLineOnOpening) { - if (*journalWasUpdated) { - appendToFile(fullPath, " \n", - shouldDebug); // when updating the journal it adds a \n char at the - // end. So appendToFile(\n) does not work. We append a - // (special and rare) whitespace character + \n to - // bypass this issue. + if (!*returnNoteSelection) { // if we don't need to return to the note selection + if (newLineOnOpening) { + if (*journalWasUpdated) { + appendToFile(fullPath, " \n", + shouldDebug); // when updating the journal it adds a \n char at the + // end. So appendToFile(\n) does not work. We append a + // (special and rare) whitespace character + \n to + // bypass this issue. + } + appendToFile(fullPath, "\n", shouldDebug); } - appendToFile(fullPath, "\n", shouldDebug); + openEditor(fullPath, editorToOpen, shouldRender, shouldJumpToEnd, shouldDebug); + free(fullPath); } - openEditor(fullPath, editorToOpen, shouldRender, shouldJumpToEnd, shouldDebug); - free(fullPath); + free(returnNoteSelection); } else if (strcmp(noteSelected, "Create new note") == 0) { note_creation: noteSelected = createNewNote(notesDirectoryString, vaultSelected, bypassSelectionNote, bypassSelectionNoteValue, journalRegex, shouldDebug); diff --git a/src/notes.c b/src/notes.c index f6ebf5f..a809bda 100644 --- a/src/notes.c +++ b/src/notes.c @@ -188,7 +188,7 @@ char **getVaultsFromDirectories(char **directoryStringArray, int directoryNumber return vaultsArray; } -char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int shouldDebug) { +char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int *returnNoteSelection, int shouldDebug) { path[PATH_MAX] = '\0'; // it assures it is a string (Most cases this does nothing). But rewriting at least // one bytes make the compile happy. He doesn't want to return an unchanged input. debug("Handling the journal %s", path); @@ -221,13 +221,14 @@ char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWas that the Create new entry in journal is on top entryArray = realloc(entryArray, sizeof(char*));*/ // simpler to just malloc 2 and later realloc - const int extraOptions = 3; + const int extraOptions = 4; char **entryArray = malloc(extraOptions * sizeof(char *)); char *createEntryMessage = malloc(PATH_MAX); snprintf(createEntryMessage, PATH_MAX, "Create new entry for the journal %s", journal); entryArray[0] = createEntryMessage; entryArray[1] = "Open random entry"; entryArray[2] = "Search inside entries"; + entryArray[3] = "Return to the note selection"; int entryCount = extraOptions; // we need to count how many dirs there is to always readjust // how many memory we alloc // Refer https://pubs.opengroup.org/onlinepubs/7990989775/xsh/readdir.html @@ -301,6 +302,8 @@ char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWas snprintf(selectedOption, PATH_MAX, "%s/%s", path, temp); path = strdup(selectedOption); free(selectedOption); + } else if (strcmp(selectedOption, "Return to the note selection") == 0) { + *returnNoteSelection = 1; } else { // we just recreate the path to the selected entry // snprintf does not like to have the same variable as input and output so we use a // buffer diff --git a/src/notes.h b/src/notes.h index f9a1747..8538ce2 100644 --- a/src/notes.h +++ b/src/notes.h @@ -25,6 +25,7 @@ char **getVaultsFromDirectories(char **directoryStringArray, int directoryNumber // handles both type of journal (divided and unified). // creates new entry with date. // for divided select if we want to acces to a new entry or a old one. +// returnNoteSelection tells us if the user wants to go back to the note selection. // returns the path to the file that needs to be opened. -char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int shouldDebug); +char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWasUpdated, int *returnNoteSelection, int shouldDebug); #endif From 19a8f7e07f3241aae7e32532ec55d1f3713132d8 Mon Sep 17 00:00:00 2001 From: Tomas Rivera Date: Tue, 2 Jun 2026 14:30:16 +0200 Subject: [PATCH 02/11] feat: ncurses quick select --- src/main.c | 9 ++++---- src/notes.c | 9 ++++---- src/ui.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 75 insertions(+), 9 deletions(-) diff --git a/src/main.c b/src/main.c index 4fbcf6c..9d84076 100644 --- a/src/main.c +++ b/src/main.c @@ -598,7 +598,8 @@ backup_config_end: *backupMessage = 0; // we reset it to show the message only once - vaultSelected = ncursesSelect(vaultsArray, "Select vault to open (Use arrows or WASD, Enter to select):", vaultsCount, extraOptions, " ", "Or select an option below", "", shouldDebug); + vaultSelected = ncursesSelect(vaultsArray, "Select vault to open (Use arrows or WASD, Enter to select or use 1-9 to quick select or use 1-9 to quick select):", vaultsCount, extraOptions, " ", + "Or select an option below", "", shouldDebug); // now that we won't use vaultsArray in this iteration of the loop, we should free it and // all its elements. (As this is memory in the heap and not the stack and thus is our @@ -666,8 +667,8 @@ backup_config_end: goto note_creation; } } - noteSelected = - ncursesSelect(filesArray, "Select note or journal to open (Use arrows or WASD, Enter to select):", filesCount, extraNotesOptions, " ", "Or select an option below", "", shouldDebug); + noteSelected = ncursesSelect(filesArray, "Select note or journal to open (Use arrows or WASD, Enter to select or use 1-9 to quick select):", filesCount, extraNotesOptions, " ", + "Or select an option below", "", shouldDebug); // now that we won't use filesArray in this iteration of the loop, we should free it // and all its elements. (As this is memory in the heap and not the stack and thus // is our responsability to manage) @@ -741,7 +742,7 @@ backup_config_end: const char *yesNo[] = {"No, go back to note selection.", "Yes."}; char *answer = ncursesSelect((char **)yesNo, "Are you sure you want to delete the entire vault? This can " - "not be undone (Use arrows or WASD, Enter to select):", + "not be undone (Use arrows or WASD, Enter to select or use 1-9 to quick select):", 1, 1, " ", "", "", shouldDebug); debug("You answered: %s for deleting the vault %s", answer, vaultSelected); if (strcmp(answer, "Yes.") == 0) { diff --git a/src/notes.c b/src/notes.c index a809bda..a9d8d33 100644 --- a/src/notes.c +++ b/src/notes.c @@ -260,10 +260,11 @@ char *updateJournal(char *path, char *journal, char *timeFormat, int *journalWas // element // we must now select to create new entry or to enter in old one - char *selectedOption = ncursesSelect(entryArray, "Create new entry or acces old entry (Use arrows or WASD, Enter to select):", extraOptions, entryCount - extraOptions, " ", " ", "", - shouldDebug); // the "Create new entry for the journal %s" will be the only options. All - // other will be extraOptions. This is made so that "Create [...] %s" will - // always be on top + char *selectedOption = + ncursesSelect(entryArray, "Create new entry or acces old entry (Use arrows or WASD, Enter to select or use 1-9 to quick select):", extraOptions, entryCount - extraOptions, " ", " ", "", + shouldDebug); // the "Create new entry for the journal %s" will be the only options. All + // other will be extraOptions. This is made so that "Create [...] %s" will + // always be on top debug("Selected option from journal entry selection: %s", selectedOption); if (strcmp(selectedOption, createEntryMessage) == 0) { // create new entry char temp[PATH_MAX]; diff --git a/src/ui.c b/src/ui.c index 653f6f1..f4fe9ac 100644 --- a/src/ui.c +++ b/src/ui.c @@ -6,7 +6,8 @@ void createNewVault(char **directoriesArray, int directoryCount, char **vaultsAr int emptyWarning = 0; // set to 1 later if inpted empty name input_screen: // choose in which directory the vault will be created - char *dirToVault = ncursesSelect(directoriesArray, "Select a directory, in which the vault will remain (Use arrows or WASD, Enter to select)", directoryCount, 0, "", "", " ", shouldDebug); + char *dirToVault = + ncursesSelect(directoriesArray, "Select a directory, in which the vault will remain (Use arrows or WASD, Enter to select or use 1-9 to quick select)", directoryCount, 0, "", "", " ", shouldDebug); char *vaultName = malloc(PATH_MAX); if (!bypass) { // if won't bypass (if -v or --vault weren't set) echo(); @@ -309,6 +310,69 @@ char *ncursesSelect(char **options, char *optionsText, int optionsNumber, int ex highlight = 0; } break; + case '1': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 1."); + highlight = 0; + goto end_loop; + } + break; + case '2': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 2."); + highlight = 1; + goto end_loop; + } + break; + case '3': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 3."); + highlight = 2; + goto end_loop; + } + break; + case '4': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 4."); + highlight = 3; + goto end_loop; + } + break; + case '5': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 5."); + highlight = 4; + goto end_loop; + } + break; + case '6': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 6."); + highlight = 5; + goto end_loop; + } + break; + case '7': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 7."); + highlight = 6; + goto end_loop; + } + break; + case '8': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 8."); + highlight = 7; + goto end_loop; + } + break; + case '9': + if (optionsNumber + extraOptionsNumber >= 1) { + debug("Quickselected option 9."); + highlight = 8; + goto end_loop; + } + break; case 10: //\n goto end_loop; } From d47bdb82ebb70fc455f46f675d74a1957e3623ac Mon Sep 17 00:00:00 2001 From: Tomas Rivera Date: Tue, 2 Jun 2026 14:37:39 +0200 Subject: [PATCH 03/11] feat: vault indicator --- src/main.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main.c b/src/main.c index 9d84076..0bf15cf 100644 --- a/src/main.c +++ b/src/main.c @@ -667,8 +667,9 @@ backup_config_end: goto note_creation; } } - noteSelected = ncursesSelect(filesArray, "Select note or journal to open (Use arrows or WASD, Enter to select or use 1-9 to quick select):", filesCount, extraNotesOptions, " ", - "Or select an option below", "", shouldDebug); + char vaultMessage[PATH_MAX]; + snprintf(vaultMessage, PATH_MAX, "%s: Select note or journal to open (Use arrows or WASD, Enter to select or use 1-9 to quick select):", vaultSelected); + noteSelected = ncursesSelect(filesArray, vaultMessage, filesCount, extraNotesOptions, " ", "Or select an option below", "", shouldDebug); // now that we won't use filesArray in this iteration of the loop, we should free it // and all its elements. (As this is memory in the heap and not the stack and thus // is our responsability to manage) From 5ad8f2f99e9958018fc5ab42d59807fbf290a498 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 2 Jun 2026 12:40:33 +0000 Subject: [PATCH 04/11] chore(release): v2.3.0 --- flake.lock | 6 +++--- flake.nix | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/flake.lock b/flake.lock index c5e45df..96f37ec 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1779560665, - "narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", + "lastModified": 1780243769, + "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", + "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index a45087b..6a463e7 100644 --- a/flake.nix +++ b/flake.nix @@ -13,7 +13,7 @@ in { packages.default = pkgs.stdenv.mkDerivation (finalAttrs: { pname = "notewrapper"; - version = "v2.2.1"; + version = "v2.3.0"; src = ./.; From 29d86955f4078566a5a8a7865434c08187cea53d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 8 Jun 2026 08:19:19 +0000 Subject: [PATCH 05/11] chore: weekly flake update --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 96f37ec..8f6b10e 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1780243769, - "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", + "lastModified": 1780749050, + "narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", + "rev": "a799d3e3886da994fa307f817a6bc705ae538eeb", "type": "github" }, "original": { From 6c7cc413dabb652ed436c5e5bd4127737063cec5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 15 Jun 2026 09:31:17 +0000 Subject: [PATCH 06/11] chore: weekly flake update --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 8f6b10e..4e41dd2 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1780749050, - "narHash": "sha256-3av0pIjlOWQ6rDbNOmpUSvbNnJkGORQKKjb4LtCZsIY=", + "lastModified": 1781074563, + "narHash": "sha256-md8WlXOlfnIeHeOScMTTHFyf2d6iaTwPl2apR5EQ3P4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a799d3e3886da994fa307f817a6bc705ae538eeb", + "rev": "9ae611a455b90cf061d8f332b977e387bda8e1ca", "type": "github" }, "original": { From 27cc3de27d3af3fec20a4a751e390145a6b55f52 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 22 Jun 2026 09:18:09 +0000 Subject: [PATCH 07/11] chore: weekly flake update --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 4e41dd2..225d4a9 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1781074563, - "narHash": "sha256-md8WlXOlfnIeHeOScMTTHFyf2d6iaTwPl2apR5EQ3P4=", + "lastModified": 1781577229, + "narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9ae611a455b90cf061d8f332b977e387bda8e1ca", + "rev": "567a49d1913ce81ac6e9582e3553dd90a955875f", "type": "github" }, "original": { From c6aac8095154562fc6c126658449a595f99bd9aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 13 Jul 2026 06:26:42 +0000 Subject: [PATCH 08/11] chore: weekly flake update --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 225d4a9..96bc53e 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1781577229, - "narHash": "sha256-lrp67w8AulE9Ks53n27I45ADSzbOCn4H+CNW1Ck8B+8=", + "lastModified": 1783776592, + "narHash": "sha256-UgCQzxeWI75XM8G+hPrPh+MKzEPjG3SpAj7dtqSbksA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "567a49d1913ce81ac6e9582e3553dd90a955875f", + "rev": "e7a3ca8092b61ff85b6a45bf863ea2b2d6a661b3", "type": "github" }, "original": { From 693e85d974f4358a779a7c119b0933971addf938 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 27 Jul 2026 06:37:15 +0000 Subject: [PATCH 09/11] chore: weekly flake update --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 96bc53e..bdd5c20 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1783776592, - "narHash": "sha256-UgCQzxeWI75XM8G+hPrPh+MKzEPjG3SpAj7dtqSbksA=", + "lastModified": 1785090369, + "narHash": "sha256-m0pDuRJG7EDo9ri+4Ksu83VsI+PlxNC9lNBfydejce4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e7a3ca8092b61ff85b6a45bf863ea2b2d6a661b3", + "rev": "624af665418d3c65d544145b4d34ad696439570e", "type": "github" }, "original": { From ab1928551af6f02290f0a123951fd23b0895ccc0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 3 Aug 2026 06:31:05 +0000 Subject: [PATCH 10/11] chore: weekly flake update --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index bdd5c20..0160bf2 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1785090369, - "narHash": "sha256-m0pDuRJG7EDo9ri+4Ksu83VsI+PlxNC9lNBfydejce4=", + "lastModified": 1785571196, + "narHash": "sha256-KoTsyMQqnXQZq8deCEnu4QkyldkwH/bpMMhUcfMdGIw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "624af665418d3c65d544145b4d34ad696439570e", + "rev": "148bab9c1c3c53136ecb44a6ea356a0ed5b39b06", "type": "github" }, "original": { From e54933e5fa9b1da396cee7370d98aa2f60b3199b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 10 Aug 2026 04:45:43 +0000 Subject: [PATCH 11/11] chore: weekly flake update --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 0160bf2..5b70120 100644 --- a/flake.lock +++ b/flake.lock @@ -20,11 +20,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1785571196, - "narHash": "sha256-KoTsyMQqnXQZq8deCEnu4QkyldkwH/bpMMhUcfMdGIw=", + "lastModified": 1786106723, + "narHash": "sha256-zDSUbpoeo/9ZmD2+wXnzxoo1+uhL8vxc0b8yuYMKYq0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "148bab9c1c3c53136ecb44a6ea356a0ed5b39b06", + "rev": "f13ff45afd1bb73e640eaa08a7066dbed07e3238", "type": "github" }, "original": {