From 197669677c71317b5d01e01147ae31bbb16914d0 Mon Sep 17 00:00:00 2001 From: bricks Date: Wed, 6 Jul 2022 22:07:48 -0400 Subject: [PATCH] Upload files to '' --- README | 58 +++ hello.c | 27 ++ main.c | 1393 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ makefile | 25 + screenshot.png | Bin 0 -> 77617 bytes 5 files changed, 1503 insertions(+) create mode 100644 README create mode 100644 hello.c create mode 100644 main.c create mode 100644 makefile create mode 100644 screenshot.png diff --git a/README b/README new file mode 100644 index 0000000..148ad11 --- /dev/null +++ b/README @@ -0,0 +1,58 @@ +This is a prototype (I'd even say a mockup) of an application I am developping as +well as a custom gui lib, so please keep that in mind. +I'm aware that this code is pure spagetti garbage, mostly because I was just throwing +shit at the wall to see what sticks and also to quickly get an MVP (somewhat) for +personal usage. + +!!! +This software is provided as is and should be treated as INCOMPLETE, BUGGY and +UNMAINTAINED. +!!! + +This is just a peak for those that are interested. + +I am currently in the process of slowly redoing everything from scratch the +right way. And except for the core ideas, nothing will be left in the new codebase, +not even the name of the project. + +No keyboard controls are implemented except for text fields (recognisable with a red +underscore in the text, arrows, pgup/down, home/end, only ascii letters - I didn't +bother with utf8 in this for now - it will be done in the real release tho). + +Use your mouse to navigate, left click to activate stuff. +For the chart in the main program you will need to be able to use mouse button 6-7 to +pan it left-right, usually it will be the left-right gestures on a trackpad (I made +this shit on a laptop). Mouse wheel (or button 4-5) to scroll up and down. You can also +left-right click on the table header to grow-shrink a column. +Double left cliking on a list or table row will activate it. +Windows can be resized. + +If you wish to fuck around with the appearance of the program, you can edit the +btk/btk-config.h file. +Btw the font is set to Terminus, if its not installed on your system the rendering +will be fucked up, so either install that font or change the btk_font_name[] property +to your font of choice - note that the internal font parameters have antialias disabled, +so preferably use a bitmap font or it will look like shit. + +There is a test "database" that the program takes cares of in ./htpt-db-example navigate +to it from the open button in the main program (in the file list if you want to go up to a +parent folder double click the topmost ".." row), a folder that has been populated with this +specific "db" (its a hidden ".htpt" file in the target dir) will be highlighed in green +by default, select it (without double click) then click the open button. +The "add file" button will copy whatever you select into the location the of "db" + +to compile: + make hello (just a hello world window) +or: + make hotpot (the actual program) + +dependencies : + xcb + cairo + libc + pthread + c99 compiler + +Again, this is a mockup of a program and lib, please don't scorn me for this, I promise +that in the actual release everything should be done as one would expect form a normal +library. diff --git a/hello.c b/hello.c new file mode 100644 index 0000000..eb1b95f --- /dev/null +++ b/hello.c @@ -0,0 +1,27 @@ +#include +#include + +#include "btk/btk.h" + +btk_session_t *s = NULL; +btk_window_t *w = NULL; +btk_window_t *W[1]; + +int +main(int argc, char **argv) +{ + s = btk_open(); + w = btk_window_create(s->x_con, s->x_scr, s->x_vis, 1, 1, 0, 0, 200, 0, 1, NULL); + + btk_window_set_name(w, "hello world"); + btk_cell_set_mark(&(w->cells[0]), 0, 0, 1, BTK_JUSTIFY_LEFT, "hello world"); + + W[0] = w; + btk_map(s, w); + btk_loop(s, W, 1); + + btk_close(s); + + return 0; +} + diff --git a/main.c b/main.c new file mode 100644 index 0000000..cb554f3 --- /dev/null +++ b/main.c @@ -0,0 +1,1393 @@ +#define _DEFAULT_SOURCE +#include +#include +#include +#include +#include +#include + +#include "btk/btk.h" + +/* for filesystem navigation */ +/* change depending on your system */ +#define NAME_SIZE 255 +#define PATH_SIZE 4096 + +/* buffer increments */ +#define DIR_BUFFER_INC 100 +#define DATA_BUFFER_INC 2 + +#define READ_SIZE 2048 +#define TEXT_SIZE 4096 +#define ITEM_SIZE 256 + +#define TAG_COL 0 +#define UID_COL 1 +#define NAME_COL 2 +#define DATA_COLS_N 9 /* excludes id, filename and tag */ + +enum tag_type { + TAG_NONE = 0, + TAG_STRAY = 1U << 0, + TAG_NEW = 1U << 1, + TAG_DEL = 1U << 2, + TAG_EDITED = 1U << 3, + TAG_VISIBILITY = 1U << 4 +}; + +enum status { + STATUS_NONE, + STATUS_ERROR, + STATUS_LATEST, + STATUS_EDITED, + STATUS_BUSY +}; + +enum dir_mode { + DIR_FILES = 1U << 0, + DIR_HIDDEN = 1U << 1 +}; + +typedef struct { + char uid[ITEM_SIZE]; + char filename[ITEM_SIZE]; + char misc[DATA_COLS_N][ITEM_SIZE]; + char notes[TEXT_SIZE]; + unsigned int notes_w; +} data_entry_t; + +/* window creation functions */ +void build_entry_form (); +void build_file_picker (); +void build_main_window (); +void build_settings (); + +/* functions */ +void clean_string_copy (char *, char *, unsigned int, int); +int cmp_str_for_qsort (const void *, const void*); +void entry_form_apply (); +void entry_form_close (); +void entry_form_open (); +int file_exists (); +void file_picker_close (); +void file_picker_open (int); +void file_picker_open_entry (); +void file_picker_open_open (); +void file_picker_open_new (); +void file_picker_select (); +int find_dir_spot (char *, char *); +char* get_data_item (unsigned int, unsigned int); +void hotpot_close (); +void hotpot_load (); +void hotpot_reload (); +void hotpot_sync (); +void hotpot_unload (); +void move_dir (int); +void open_ext_dir (); +void open_ext_entry (int); +void quit (); +int parse_dir (char *, int); +void push_entry (int, data_entry_t); +void settings_close (); +void settings_open (); +void set_activity_status (int, int); +void set_entry_tag_col (unsigned int, int); +void set_main_win_states (int); +void set_file_picker_states (int); +void str_to_lower_case (char *); +void toggle_del_tag (); +void toggle_col (int, btk_arg_t); +void toggle_hidden (int, btk_arg_t); +void toggle_notes (int, btk_arg_t); +void toggle_visibility_tag (); +void update_select_data (int); + +/* btk windows */ +btk_session_t *session; +btk_window_t *entry_form; +btk_window_t *file_picker; +btk_window_t *main_win; +btk_window_t *settings; +btk_window_t *windows[4]; + +/* btk important cells */ +btk_cell_t *table_cell; +btk_cell_t *dir_list_cell; +btk_cell_t *notes_view_cell; +btk_cell_t *file_select_cell; +btk_cell_t *activity_cell; +btk_cell_t *edited_note_cell; +unsigned int table_cell_id; +unsigned int dir_list_cell_id; +unsigned int notes_view_cell_id; +unsigned int file_select_cell_id; +unsigned int activity_cell_id; +unsigned int edited_note_cell_id; + +/* file navigation */ +char dir_current[PATH_SIZE]; +char *dir_list = NULL; +int *dir_spot = NULL; +unsigned int dir_list_n = 0; +int nav_select = -1; +int nav_mode; + +/* hotpot data */ +int file_picker_mode; +char open_dir[PATH_SIZE] = ""; +int hotpot_open = 0; +char *data = NULL; +char *data_notes = NULL; +int *data_tags = NULL; +int *data_spot = NULL; +char *data_rename = NULL; +unsigned int data_n = 0; +unsigned int data_buffer_n = 0; +unsigned int last_uid = 0; + +/* selected data */ +int select_data = -1; +char select_note[TEXT_SIZE]; + +/* edited data */ +char edited_uid[ITEM_SIZE]; +char edited_filename[ITEM_SIZE]; +char edited_misc[DATA_COLS_N][ITEM_SIZE]; +char edited_note[TEXT_SIZE]; + +/* misc gui stuff */ +char status_open_file[PATH_SIZE + NAME_SIZE]; +char status_files_n[15]; +char status_activity[9]; +char misc_titles[DATA_COLS_N][ITEM_SIZE]; +char misc_switches[DATA_COLS_N][ITEM_SIZE]; +unsigned int data_cols_cw[DATA_COLS_N + 3] = {1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2}; +int data_cols_ena[DATA_COLS_N + 3] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}; +char data_header[DATA_COLS_N + 3][ITEM_SIZE] = { + "TAGS", + "UID", + "FILENAME", + "TOPICS", + "AUTHORS", + "INSTITUTIONS", + "PUBLISHER", + "YEAR", + "VOL", + "NO", + "PAGES", + "ACCESSED" +}; + +/* misc */ +btk_arg_t dummy_arg = {.i = 0, .f = 0.0f, .c = NULL, .p = NULL}; + +/*******************************************************************/ + +void +build_entry_form() +{ + entry_form = btk_window_create(session->x_con, + session->x_scr, + session->x_vis, + 8, 6 + DATA_COLS_N, + 4, 3 + DATA_COLS_N, + 100, 0, + 10 + 2 * DATA_COLS_N, + entry_form_close); + btk_window_set_name(entry_form, "hotpot - entry form"); + + edited_note_cell_id = 0; + edited_note_cell = &(entry_form->cells[edited_note_cell_id]); + btk_cell_set_editor(edited_note_cell, 2, 2 + DATA_COLS_N, 6, 4, (char*)&edited_note, TEXT_SIZE); + + btk_cell_set_mark (&(entry_form->cells[1]), 0, 0, 2, BTK_JUSTIFY_RIGHT, "uid :"); + btk_cell_set_mark (&(entry_form->cells[2]), 0, 1, 2, BTK_JUSTIFY_RIGHT, "filename :"); + btk_cell_set_mark (&(entry_form->cells[3]), 2, 0, 6, BTK_JUSTIFY_LEFT, edited_uid); + btk_cell_set_input (&(entry_form->cells[4]), 2, 1, 6, (char*)edited_filename, NAME_SIZE); + btk_cell_set_mark (&(entry_form->cells[5]), 0, 2 + DATA_COLS_N, 2, BTK_JUSTIFY_RIGHT, "notes :"); + btk_cell_set_empty (&(entry_form->cells[6]), 0, 3 + DATA_COLS_N, 2, 1); + btk_cell_set_button (&(entry_form->cells[7]), 0, 4 + DATA_COLS_N, 2, "apply", entry_form_apply); + btk_cell_set_button (&(entry_form->cells[8]), 0, 5 + DATA_COLS_N, 2, "close", entry_form_close); + + /* generate input fields for misc data */ + for (int i = 0; i < DATA_COLS_N; i++) { + + strcpy(misc_titles[i], data_header[i + 3]); + str_to_lower_case(misc_titles[i]); + strcat(misc_titles[i], " :"); + + btk_cell_set_mark (&(entry_form->cells[9 + i]), 0, 2 + i, 2, BTK_JUSTIFY_RIGHT, misc_titles[i]); + btk_cell_set_input (&(entry_form->cells[10 + DATA_COLS_N + i]), 2, 2 + i, 6, (char*)edited_misc[i], NAME_SIZE); + } +} + +void +build_file_picker() +{ + file_picker = btk_window_create(session->x_con, + session->x_scr, + session->x_vis, + 4, 9, + 2, 2, + 0, 300, + 5, + file_picker_close); + btk_window_set_name(file_picker, "hotpot - file picker"); + + dir_list_cell_id = 0; + dir_list_cell = &(file_picker->cells[dir_list_cell_id]); + btk_cell_set_list (dir_list_cell, + 0, 1, 4, 5, + &dir_list, + &dir_list_n, + NAME_SIZE, + NULL, NULL, + &dir_spot, + move_dir, + set_file_picker_states); + + file_select_cell_id = 1; + file_select_cell = &(file_picker->cells[file_select_cell_id]); + btk_cell_set_button (file_select_cell, 0, 7, 4, "select", file_picker_select); + + btk_cell_set_mark (&(file_picker->cells[2]), 0, 0, 4, BTK_JUSTIFY_RIGHT, (char*)&dir_current); + btk_cell_set_switch (&(file_picker->cells[3]), 0, 6, 4, "show hidden", toggle_hidden, dummy_arg); + btk_cell_set_button (&(file_picker->cells[4]), 0, 8, 4, "cancel", file_picker_close); +} + +void +build_main_window() +{ + main_win = btk_window_create(session->x_con, + session->x_scr, + session->x_vis, + 13, 16, + 4, 7, + 400, 0, + 21, + quit); + btk_window_set_name(main_win, "hotpot"); + + table_cell_id = 0; + table_cell = &(main_win->cells[table_cell_id]); + btk_cell_set_table(table_cell, + 3, 0, 10, 15, + (char*)data_header, + &data, + ITEM_SIZE, + DATA_COLS_N + 3, + &data_n, + (int*)data_cols_ena, + data_cols_cw, + 2, + NULL, NULL, + &data_spot, + open_ext_entry, + update_select_data); + + strcpy(select_note, ""); + notes_view_cell_id = 1; + notes_view_cell = &(main_win->cells[notes_view_cell_id]); + btk_cell_set_editor(notes_view_cell, + 3, 9, 10, 6, + select_note, + TEXT_SIZE); + main_win->cells[notes_view_cell_id].state |= BTK_CELL_STATE_DISABLED; + main_win->cells[notes_view_cell_id].state |= BTK_CELL_STATE_HIDDEN; + + activity_cell_id = 18; + activity_cell = &(main_win->cells[activity_cell_id]); + btk_cell_set_mark (activity_cell, + 11, 15, 2, + BTK_JUSTIFY_RIGHT, + (char*)&status_activity); + + btk_cell_set_button (&(main_win->cells[2]), 0, 0, 3, "open", file_picker_open_open); + btk_cell_set_button (&(main_win->cells[3]), 0, 1, 3, "new", file_picker_open_new); + btk_cell_set_button (&(main_win->cells[4]), 0, 2, 3, "sync", hotpot_sync); + btk_cell_set_button (&(main_win->cells[5]), 0, 3, 3, "view directory", open_ext_dir); + btk_cell_set_button (&(main_win->cells[6]), 0, 4, 3, "reload", hotpot_reload); + btk_cell_set_button (&(main_win->cells[7]), 0, 5, 3, "close", hotpot_close); + btk_cell_set_button (&(main_win->cells[8]), 0, 6, 3, "quit", quit); + btk_cell_set_empty (&(main_win->cells[9]), 0, 7, 3, 1); + btk_cell_set_button (&(main_win->cells[10]), 0, 8, 3, "add file", file_picker_open_entry); + btk_cell_set_button (&(main_win->cells[11]), 0, 9, 3, "edit entry", entry_form_open); + btk_cell_set_button (&(main_win->cells[12]), 0, 10, 3, "tag for deletion", toggle_del_tag); + btk_cell_set_button (&(main_win->cells[19]), 0, 11, 3, "tag for visibility", toggle_visibility_tag); + btk_cell_set_button (&(main_win->cells[20]), 0, 12, 3, "export citation", NULL); + btk_cell_set_empty (&(main_win->cells[13]), 0, 13, 3, 1); + btk_cell_set_switch (&(main_win->cells[14]), 0, 14, 3, "show notes", toggle_notes, dummy_arg); + btk_cell_set_button (&(main_win->cells[15]), 0, 15, 3, "settings", settings_open); + btk_cell_set_mark (&(main_win->cells[16]), 3, 15, 6, BTK_JUSTIFY_RIGHT, (char*)&status_open_file); + btk_cell_set_mark (&(main_win->cells[17]), 9, 15, 2, BTK_JUSTIFY_RIGHT, (char*)&status_files_n); + + main_win->cells[15].state |= BTK_CELL_STATE_ON; + main_win->cells[20].state |= BTK_CELL_STATE_DISABLED; + set_main_win_states(0); +} + +void +build_settings() +{ + settings = btk_window_create(session->x_con, + session->x_scr, + session->x_vis, + 3, 3 + DATA_COLS_N, + -1, -1, + 0, 0, + 3 + DATA_COLS_N, + settings_close); + btk_window_set_name(settings, "hotpot - settings"); + + btk_arg_t col_arg= {.i = TAG_COL}; + + btk_cell_set_switch (&(settings->cells[0]), 0, 0, 3, "show tags", toggle_col, col_arg); + btk_cell_set_empty (&(settings->cells[1 + DATA_COLS_N]), 0, 1 + DATA_COLS_N, 3, 1); + btk_cell_set_button (&(settings->cells[2 + DATA_COLS_N]), 0, 2 + DATA_COLS_N, 3, "close", settings_close); + + settings->cells[0].state |= BTK_CELL_STATE_ON; + + /* generate col toggles for misc data */ + for (int i = 0; i < DATA_COLS_N; i++) { + + sprintf(misc_switches[i], "show %s", data_header[i + 3]); + str_to_lower_case(misc_switches[i]); + + btk_arg_t col_arg = {.i = i + 3}; + btk_cell_set_switch (&(settings->cells[1 + i]), 0, 1 + i, 3, misc_switches[i], toggle_col, col_arg); + settings->cells[1 + i].state |= BTK_CELL_STATE_ON; + } +} + +/****************************************************************************************/ + +int +main() +{ + getcwd(dir_current, PATH_SIZE); + strcat(dir_current, "/"); + + /* btk init */ + session = btk_open(); + build_entry_form(); + build_file_picker(); + build_main_window(); + build_settings(); + windows[0] = main_win; + windows[1] = file_picker; + windows[2] = entry_form; + windows[3] = settings; + + btk_map(session, main_win); + btk_loop(session, windows, 4); + + btk_close(session); + + quit(); + return 0; +} + +/****************************************************************************************/ + +void +clean_string_copy(char* dest, char* src, unsigned int max_size, int del_newline) +{ + if (!max_size) + return; + + char mid[max_size]; + + strncpy(mid, src, max_size); + if (del_newline) + *strchr(mid, '\n') = '\0'; + mid[max_size - 1] = '\0'; + strcpy(dest, mid); +} + +int +cmp_str_for_qsort(const void *a, const void *b) +{ + return strcmp((char*)a, (char*)b); +} + +/* check if any data changed, copy it and update status if so */ +void +entry_form_apply() +{ + int changed = 0; + + if (strcmp(edited_filename, get_data_item(NAME_COL, select_data))) { + strcpy(data_rename + select_data * ITEM_SIZE, get_data_item(NAME_COL, select_data)); + strcpy(get_data_item(NAME_COL, select_data), edited_filename); + changed = 1; + } + + for (int i = 0; i < DATA_COLS_N; i++) { + if (strcmp(edited_misc[i], get_data_item(i + 3, select_data))) { + strcpy(get_data_item(i + 3, select_data), edited_misc[i]); + changed = 1; + } + } + if (strcmp(edited_note, select_note)) { + strcpy(data_notes + select_data * TEXT_SIZE, edited_note); + strcpy(select_note, edited_note); + btk_cell_editor_update_text(notes_view_cell); + changed = 1; + } + + if (changed) { + data_tags[select_data] |= TAG_EDITED; + set_entry_tag_col(select_data, data_tags[select_data]); + set_activity_status(STATUS_EDITED, 1); + btk_window_redraw(main_win); + } +} + +void +entry_form_open() +{ + if (select_data < 0 || select_data >= data_n) + return; + + strcpy(edited_note, select_note); + btk_cell_editor_reset_caret(edited_note_cell); + + strcpy(edited_uid, get_data_item(1, select_data)); + strcpy(edited_filename, get_data_item(2, select_data)); + btk_cell_input_reset_caret(&(entry_form->cells[4])); + + for (int i = 0; i < DATA_COLS_N; i++) { + strcpy(edited_misc[i], get_data_item(i + 3, select_data)); + btk_cell_input_reset_caret(&(entry_form->cells[10 + DATA_COLS_N + i])); + } + + btk_cell_editor_update_text(edited_note_cell); + btk_window_disable(main_win); + btk_map(session, entry_form); +} + +void +entry_form_close() +{ + btk_window_enable(main_win); + btk_unmap(session, entry_form); +} + +/* checks if currently selected file in the file picker + * exists in the open hotpot directory */ +int +file_exists() +{ + DIR *d; + struct dirent *dir; + + d = opendir(open_dir); + if (!d) { + printf("ERROR - couldn't read directory"); + return 0; + } + + while ((dir = readdir(d))) { + if (!strcmp(dir->d_name, dir_list + nav_select * NAME_SIZE)) + return 1; + } + + return 0; +} + +void +file_picker_close() +{ + btk_window_enable(main_win); + btk_unmap(session, file_picker); +} + +void +file_picker_open(int mode) +{ + btk_cell_list_deselect(dir_list_cell); + set_file_picker_states(-1); + + file_picker_mode = mode; + if (!file_picker_mode) { + nav_mode |= DIR_FILES; + } else { + nav_mode &= ~DIR_FILES; + } + + btk_window_disable(main_win); + btk_map(session, file_picker); + parse_dir(dir_current, nav_mode); +} + +void file_picker_open_entry() { file_picker_open(0); } +void file_picker_open_open() { file_picker_open(1); } +void file_picker_open_new() { file_picker_open(2); } + +void +file_picker_select() +{ + if (nav_select < 0 || nav_select >= dir_list_n) { + printf("ERROR -> tried to open out of bound selection\n"); + return; + } + + switch(file_picker_mode) { + + /* copy selected file into open hotpot directory, then add it to data */ + case 0:; + /* compose command */ + char cmd[12 + 2 * PATH_SIZE + NAME_SIZE]; + sprintf(cmd, + "cp -n \'%s%s\' \'%s\'", + dir_current, + dir_list + nav_select * NAME_SIZE, + open_dir); + system(cmd); + /* create new entry */ + data_entry_t new_entry; + new_entry.notes_w = 0; + new_entry.notes[0] = '\0'; + new_entry.uid[0] = '\0'; + for (int i = 0; i < DATA_COLS_N; i++) + new_entry.misc[i][0] = '\0'; + strcpy(new_entry.filename, dir_list + nav_select * NAME_SIZE); + push_entry(TAG_NEW, new_entry); + /* update window */ + set_activity_status(STATUS_EDITED, 0); + set_entry_tag_col(data_n - 1, data_tags[data_n - 1]); + set_main_win_states(1); + break; + + /* open hotpot */ + case 1: + strcpy(open_dir, dir_current); + strcat(open_dir, dir_list + nav_select * NAME_SIZE); + hotpot_load(); + break; + + /* create hotpot file, then open it */ + case 2: + strcpy(open_dir, dir_current); + strcat(open_dir, dir_list + nav_select * NAME_SIZE); + char hotpot_file[PATH_SIZE + NAME_SIZE]; + strcpy(hotpot_file, open_dir); + strcat(hotpot_file, "/.htpt"); + FILE *f = fopen(hotpot_file, "w"); + if (!f) { + set_activity_status(STATUS_ERROR, 1); + printf("ERROR - couldn't create new hotpot file"); + return; + } + fclose(f); + hotpot_load(); + break; + } + + file_picker_close(); + set_main_win_states(1); +} + +/* returns the hilight color index of the directory */ +int +find_dir_spot(char *search_dir, char *sub_dir) +{ + char search_path[PATH_SIZE]; + strcpy(search_path, search_dir); + strcat(search_path, sub_dir); + strcat(search_path, "/"); + + DIR *d; + struct dirent *dir; + struct stat file_stats; + char file_path[PATH_SIZE + NAME_SIZE]; + + d = opendir(search_path); + if (!d) { + printf("ERROR - couldn't read directory"); + return 0; + } + + while ((dir = readdir(d))) { + strcpy(file_path, search_path); + strcat(file_path, dir->d_name); + stat(file_path, &file_stats); + if ((file_stats.st_mode & S_IFMT) != S_IFDIR) { + if (strcmp(dir->d_name, ".htpt") == 0) { + return 1; + } + } + } + return 2; +} + +char* +get_data_item(unsigned int col, unsigned int row) +{ + return data + ITEM_SIZE * (col + row * (DATA_COLS_N + 3)); +} + +void +hotpot_close() +{ + hotpot_unload(); + select_data = -1; + strcpy(select_note, ""); + strcpy(open_dir, ""); + + set_main_win_states(1); +} + +void +hotpot_load() +{ + set_activity_status(STATUS_BUSY, 1); + + char hotpot_file[PATH_SIZE + NAME_SIZE]; + strcpy(hotpot_file, open_dir); + strcat(hotpot_file, "/.htpt"); + + FILE *f = fopen(hotpot_file, "r"); + if (!f) { + printf("ERROR - couldn't read hotpot file\n"); + set_activity_status(STATUS_ERROR, 1); + return; + } + + hotpot_unload(); + + /* arrays preparation for on the go resizing */ + data_buffer_n = DATA_BUFFER_INC; + data = malloc(data_buffer_n * ITEM_SIZE * (DATA_COLS_N + 3)); + data_notes = malloc(data_buffer_n * TEXT_SIZE); + data_tags = malloc(data_buffer_n * sizeof(int)); + data_spot = malloc(data_buffer_n * sizeof(int)); + data_rename = malloc(data_buffer_n * ITEM_SIZE); /* used for syncing later */ + + data_entry_t entry_read; + char line_read[READ_SIZE]; + char *last_newline; + int in_section = 0, col = 0, w = 0; + + /* get lastest used uid on the first line */ + /* if it is not present it will be regenerated after the rest of the file has + * been parsed */ + if (fgets(line_read, READ_SIZE, f) && line_read[0] == '-') { + last_uid = strtol(line_read + 1, NULL, 16); + } else { + last_uid = 0; /* to be regenerated */ + } + + /* parse rest of .htpt file */ + while (fgets(line_read, READ_SIZE, f)) { + switch (line_read[0]) { + + /* open section, reset entry_read */ + case '[': + if (in_section) + break; + in_section = 1; + col = 0; + w = 0; + entry_read.notes_w = 0; + entry_read.notes[0] = '\0'; + entry_read.uid[0] = '\0'; + entry_read.filename[0] = '\0'; + for (int i = 0; i < DATA_COLS_N; i++) + entry_read.misc[i][0] = '\0'; + break; + + /* close section, push entry_read to data */ + case ']': + if (!in_section) + break; + in_section = 0; + last_newline = strrchr(entry_read.notes, '\n'); + if (last_newline) /* remove last unecessary newline */ + *last_newline = '\0'; + push_entry(TAG_STRAY, entry_read); + break; + + /* get uid */ + case '-': + if (!in_section) + break; + clean_string_copy(entry_read.uid, line_read + 1, ITEM_SIZE, 1); + break; + + /* get filename */ + case '+': + if (!in_section) + break; + clean_string_copy(entry_read.filename, line_read + 1, ITEM_SIZE, 1); + break; + + /* get other data */ + case '.': + if (!in_section || col >= DATA_COLS_N) + break; + clean_string_copy(entry_read.misc[col], line_read + 1, ITEM_SIZE, 1); + col++; + break; + + /* get notes on multiple lines until section close or reaching TEXT_SIZE + * character limit */ + case '*': + if (!in_section) + break; + w = strlen(line_read + 1); + if (entry_read.notes_w + w >= TEXT_SIZE) { + w = TEXT_SIZE - entry_read.notes_w; + } else { + strncat(entry_read.notes, line_read + 1, w); + } + entry_read.notes_w += w; + break; + + default: + break; + } + } + fclose(f); + + /* regenerate uid if needed */ + if (!last_uid) { + for (int i = 0; i < data_n; i++) + if (last_uid < strtol(get_data_item(UID_COL, i), NULL, 16)) + last_uid = strtol(get_data_item(UID_COL, i), NULL, 16); + } + + /* parse all files in hotpot directory and match them to parsed data */ + DIR *d = opendir(open_dir); + struct dirent *dir; + struct stat file_stats; + char file_path[PATH_SIZE + NAME_SIZE]; + int found = 0; + int new_files = 0; + int n = data_n; + int is_dir; + + data_entry_t dummy_entry; + dummy_entry.uid[0] = '\0'; + dummy_entry.notes[0] = '\0'; + dummy_entry.notes_w = 0; + for (int i = 0; i < DATA_COLS_N; i++) + dummy_entry.misc[i][0] = '\0'; + + /* scan found files */ + while ((dir = readdir(d))) { + found = 0; + strcpy(file_path, open_dir); + strcat(file_path, dir->d_name); + stat(file_path, &file_stats); + is_dir = (file_stats.st_mode & S_IFMT) == S_IFDIR ? 1 : 0; + //printf("%i\t%s\n", is_dir, dir->d_name); TODO fix directory detection + if (is_dir || dir->d_name[0] == '.') { + continue; + } + for (int i = 0; i < n; i++) { + if (strcmp(dir->d_name, get_data_item(NAME_COL, i)) == 0) { + data_tags[i] = TAG_NONE; + found = 1; + break; + } + } + /* if file not found, create new entry */ + if (!found) { + clean_string_copy(dummy_entry.filename, dir->d_name, ITEM_SIZE, 0); + push_entry(TAG_NEW, dummy_entry); + new_files = 1; + } + } + + /* set tag values in data */ + for (int i = 0; i < data_n; i++) { + set_entry_tag_col(i, data_tags[i]); + } + + btk_cell_table_deselect(table_cell); + strcpy(select_note, ""); + set_activity_status((new_files ? STATUS_EDITED : STATUS_LATEST), 1); + + + return; +} + +void +hotpot_reload() +{ + hotpot_unload(); + select_data = -1; + strcpy(select_note, ""); + + hotpot_load(); + + set_main_win_states(1); +} + +void +hotpot_sync() +{ + set_activity_status(STATUS_BUSY, 1); + + char hotpot_file[PATH_SIZE + NAME_SIZE]; + strcpy(hotpot_file, open_dir); + strcat(hotpot_file, "/.htpt"); + + FILE *f = fopen(hotpot_file, "w"); + if (!f) { + printf("ERROR - couldn't write hotpot file\n"); + set_activity_status(STATUS_ERROR, 1); + return; + } + + /* output last uid */ + fprintf(f, "-%X\n\n", last_uid); + + /* output rows of data */ + char *note_token; + char note[TEXT_SIZE]; + for (int i = 0; i < data_n; i++) { + + if ((data_tags[i] & TAG_DEL)) + continue; + + fprintf(f, "[\n"); + + fprintf(f, "-%s\n", get_data_item(UID_COL, i)); + fprintf(f, "+%s\n", get_data_item(NAME_COL, i)); + for (int j = 0; j < DATA_COLS_N; j++) + fprintf(f, ".%s\n", get_data_item(j + 3, i)); + + // TODO + /* + strcpy(note, data_notes + i * TEXT_SIZE); + char *lim = strchr(note, '\n'); + while (lim) { + *lim = '\0'; + printf("%lu >> \'%s\'\n", strlen(note), note); + fprintf(f, "*%s\n", note); + strcpy(note, ++lim); + lim = strchr(note, '\n'); + } + */ + + strcpy(note, data_notes + i * TEXT_SIZE); + note_token = strtok(note, "\n"); + while (note_token) { + fprintf(f, "*%s\n", note_token); + note_token = strtok(NULL, "\n"); + } + + fprintf(f, "]\n\n"); + } + fclose(f); + + /* rename edited files if those are not stray entries */ + char cmd_mv[11 + 2 * (PATH_SIZE + NAME_SIZE)]; + for (int i = 0; i < data_n; i++) { + if (!(data_tags[i] & TAG_STRAY) && strcmp(data_rename + i * ITEM_SIZE, "")) { + sprintf(cmd_mv, + "mv \'%s/%s\' \'%s/%s\'", + open_dir, + data_rename + i * ITEM_SIZE, + open_dir, + get_data_item(NAME_COL, i)); + system(cmd_mv); + } + } + + /* delete rows with DEL tag by shifting down */ + int c = 0; + char mid[TEXT_SIZE]; /* just to get rid of pointer overlap warning */ + char cmd_rm[5 + PATH_SIZE + NAME_SIZE]; + for (int i = 0; i < data_n; i++) { + if (c) { + data_tags[i - c] = data_tags[i]; + strcpy(mid, data_notes + i * TEXT_SIZE); + strcpy(data_notes + (i - c) * TEXT_SIZE, mid); + for (int j = 0; j < DATA_COLS_N + 3; j++) + strcpy(get_data_item(j, i - c), get_data_item(j, i)); + } + if ((data_tags[i] & TAG_DEL)) { + if (!(data_tags[i] & TAG_STRAY)) { + sprintf(cmd_rm, + "rm \'%s/%s\'", + open_dir, + get_data_item(NAME_COL, i)); + system(cmd_rm); + } + c++; + } + } + data_n -= c; + + /* remove EDIT and NEW tags */ + for (int i = 0; i < data_n; i++) { + data_tags[i] &= ~(TAG_EDITED | TAG_NEW); + } + + /* update tag values in data */ + for (int i = 0; i < data_n; i++) { + set_entry_tag_col(i, data_tags[i]); + } + + set_activity_status(STATUS_LATEST, 0); + btk_window_redraw(main_win); + + return; +} + +void +hotpot_unload() +{ + if (data_n) { + free(data); + free(data_tags); + free(data_spot); + free(data_notes); + free(data_rename); + data_n = 0; + } +} + +void +move_dir(int dir_sel) +{ + if (dir_sel < 0 || !dir_spot[dir_sel]) + return; + + /* if first item selected ("..") go one dir up, unless at / */ + if (!dir_sel) { + if (strlen(dir_current) <= 1) + return; + dir_current[strlen(dir_current) - 1] = '\0'; + *(strrchr(dir_current, '/')) = '\0'; + } else { + char dir_sel_name[PATH_SIZE]; + strcpy(dir_sel_name, dir_list + dir_sel * NAME_SIZE); + strcat(dir_current, dir_sel_name); + } + + strcat(dir_current, "/"); + parse_dir(dir_current, nav_mode); + btk_window_redraw_cell(file_picker, dir_list_cell_id); + btk_window_redraw_cell(file_picker, 2); + + if (dir_sel) { + btk_cell_list_deselect(dir_list_cell); + set_file_picker_states(-1); + } +} + +void +open_ext_dir() +{ + char *args[PATH_SIZE]={"./EXEC", open_dir, NULL}; + int pid = fork(); + + if (pid == 0) { + execvp("xdg-open", args); + } else if (pid < 0) { + printf("ERROR - couldn't open hotpot directory in file explorer\n"); + } +} + +void +open_ext_entry(int sel) +{ + if (sel < 0) + return; + + char file[PATH_SIZE + ITEM_SIZE]; + strcpy(file, open_dir); + strcat(file, "/"); + strcat(file, get_data_item(NAME_COL, sel)); + + char *args[PATH_SIZE]={"./EXEC", file, NULL}; + int pid = fork(); + + if (pid == 0) { + execvp("xdg-open", args); + } else if (pid < 0) { + printf("ERROR - couldn't open item externaly\n"); + } +} + +int +parse_dir(char *dir_path, int mode) +{ + DIR *d = opendir(dir_path); + if (!d) { + printf("ERROR - couldn't read directory"); + return 1; + } + + struct dirent *dir; + struct stat file_stats; + char file_path[PATH_SIZE + NAME_SIZE]; + unsigned int dir_buffer_n = DIR_BUFFER_INC; + int c = 0; + int is_dir; + + if (dir_list_n) { + free(dir_list); + free(dir_spot); + } + + dir_list_n = 0; + dir_list = malloc(dir_buffer_n * NAME_SIZE); + dir_spot = malloc(dir_buffer_n * sizeof(int)); + + while ((dir = readdir(d))) { + sprintf(file_path, "%s%s", dir_path, dir->d_name); + stat(file_path, &file_stats); + is_dir = (file_stats.st_mode & S_IFMT) == S_IFDIR ? 1 : 0; + if (((mode & DIR_FILES) || is_dir) && c && + ((mode & DIR_HIDDEN) || dir->d_name[0] != '.' || c < 2)) { + strcpy(dir_list + dir_list_n * NAME_SIZE, dir->d_name); + if (is_dir) /* adding '/' to dir items to easily detect them when sorting */ + strcat(dir_list + dir_list_n * NAME_SIZE, "/"); + dir_spot[dir_list_n] = 0; + dir_list_n++; + } + c++; + if (dir_list_n >= dir_buffer_n - 1) { + dir_buffer_n += DIR_BUFFER_INC; + dir_spot = realloc(dir_spot, dir_buffer_n * sizeof(int)); + dir_list = realloc(dir_list, dir_buffer_n * NAME_SIZE); + } + } + + /* sort dir list and set hilights */ + char *a; + qsort(dir_list, dir_list_n, NAME_SIZE, cmp_str_for_qsort); + for (int i = 0; i < dir_list_n; i++) { + a = strchr(dir_list + i * NAME_SIZE, '/'); + if (a) { + *a = '\0'; + dir_spot[i] = find_dir_spot(dir_path, dir_list + i * NAME_SIZE); + } + } + + return 0; +} + +void +push_entry(int tag, data_entry_t entry) +{ + if (!data) { + printf("ERROR - tried to push entry into NULL data array\n"); + return; + } + + if (data_n >= data_buffer_n - 1) { + data_buffer_n += DATA_BUFFER_INC; + data = realloc(data, data_buffer_n * ITEM_SIZE * (DATA_COLS_N + 3)); + data_notes = realloc(data_notes, data_buffer_n * TEXT_SIZE); + data_tags = realloc(data_tags, data_buffer_n * sizeof(int)); + data_spot = realloc(data_spot, data_buffer_n * sizeof(int)); + data_rename = realloc(data_rename, data_buffer_n * ITEM_SIZE); + } + + if (!strcmp(entry.uid, "")) { + char new_uid[64]; + sprintf(new_uid, "%X", ++last_uid); + strcpy(get_data_item(UID_COL, data_n), new_uid); + } else { + strcpy(get_data_item(UID_COL, data_n), entry.uid); + } + + data_tags[data_n] = tag; + strcpy(data_rename + data_n * ITEM_SIZE, ""); + strcpy(get_data_item(NAME_COL, data_n), entry.filename); + for (int i = 0; i < DATA_COLS_N; i++) + strcpy(get_data_item(i + 3, data_n), entry.misc[i]); + strcpy(data_notes + data_n * TEXT_SIZE, entry.notes); + + data_n++; +} + +void +quit() +{ + hotpot_unload(); + if (dir_list_n) { + free(dir_list); + free(dir_spot); + } + + btk_window_destroy(entry_form); + btk_window_destroy(file_picker); + btk_window_destroy(main_win); + btk_window_destroy(settings); + btk_close(session); + + exit(0); +} + +void +settings_close() +{ + btk_window_enable(main_win); + btk_unmap(session, settings); +} + +void +settings_open() +{ + btk_window_disable(main_win); + btk_map(session, settings); +} + +void +set_activity_status(int status, int redraw) +{ + switch (status) { + case STATUS_NONE: + strcpy(status_activity, "n/a"); + activity_cell->state |= BTK_CELL_STATE_DISABLED; + activity_cell->state &= ~BTK_CELL_STATE_BELL; + activity_cell->state &= ~BTK_CELL_STATE_ON; + break; + case STATUS_ERROR: + strcpy(status_activity, "error"); + activity_cell->state &= ~BTK_CELL_STATE_DISABLED; + activity_cell->state |= BTK_CELL_STATE_BELL; + activity_cell->state &= ~BTK_CELL_STATE_ON; + break; + case STATUS_LATEST: + strcpy(status_activity, "synced"); + activity_cell->state &= ~BTK_CELL_STATE_DISABLED; + activity_cell->state &= ~BTK_CELL_STATE_BELL; + activity_cell->state &= ~BTK_CELL_STATE_ON; + break; + case STATUS_EDITED: + strcpy(status_activity, "unsynced"); + activity_cell->state &= ~BTK_CELL_STATE_DISABLED; + activity_cell->state &= ~BTK_CELL_STATE_BELL; + activity_cell->state |= BTK_CELL_STATE_ON; + break; + case STATUS_BUSY: + strcpy(status_activity, "busy"); + activity_cell->state &= ~BTK_CELL_STATE_DISABLED; + activity_cell->state |= BTK_CELL_STATE_BELL; + activity_cell->state &= ~BTK_CELL_STATE_ON; + break; + } + + if (redraw) + btk_window_redraw_cell(main_win, activity_cell_id); +} + +void +set_edit_tag() +{ + if (select_data < 0 || select_data >= data_n) { + printf("ERROR - can't tag out of bounds selection\n"); + return; + } + + data_tags[select_data] |= TAG_DEL; + btk_window_redraw_cell(main_win, table_cell_id); +} + +void +set_entry_tag_col(unsigned int id, int tag) +{ + if (tag & TAG_DEL) { + strcpy(get_data_item(TAG_COL, id), "DEL"); + data_spot[id] = 1; + } else if (tag & TAG_VISIBILITY) { + strcpy(get_data_item(TAG_COL, id), "FOCUS"); + data_spot[id] = 4; + } else if (tag & TAG_EDITED){ + strcpy(get_data_item(TAG_COL, id), "EDIT"); + data_spot[id] = 1; + } else if (tag & TAG_STRAY){ + strcpy(get_data_item(TAG_COL, id), "STRAY"); + data_spot[id] = 3; + } else if (tag & TAG_NEW){ + strcpy(get_data_item(TAG_COL, id), "NEW"); + data_spot[id] = 2; + } else { + strcpy(get_data_item(TAG_COL, id), ""); + data_spot[id] = 0; + } +} + +void +set_file_picker_states(int sel) +{ + nav_select = sel; + + if (sel < 1) { /* separate to avoid segfault */ + file_select_cell->state |= BTK_CELL_STATE_DISABLED; + btk_window_redraw_cell(file_picker, file_select_cell_id); + return; + } + + switch (file_picker_mode) { + case 0:; + char forbidden_path[PATH_SIZE]; + strcpy(forbidden_path, open_dir); + strcat(forbidden_path, "/"); + if(!dir_spot[sel] && strcmp(dir_current, forbidden_path) != 0 && !file_exists()) { + file_select_cell->state &= ~(BTK_CELL_STATE_DISABLED); + } else { + file_select_cell->state |= BTK_CELL_STATE_DISABLED; + } + break; + case 1: + if (dir_spot[sel] == 1) { + file_select_cell->state &= ~(BTK_CELL_STATE_DISABLED); + } else { + file_select_cell->state |= BTK_CELL_STATE_DISABLED; + } + break; + case 2: + if (dir_spot[sel] == 1) { + file_select_cell->state |= BTK_CELL_STATE_DISABLED; + } else { + file_select_cell->state &= ~(BTK_CELL_STATE_DISABLED); + } + break; + } + + btk_window_redraw_cell(file_picker, file_select_cell_id); +} + +void +set_main_win_states(int redraw) +{ + if (!(strcmp(open_dir, ""))) { + main_win->cells[4].state |= BTK_CELL_STATE_DISABLED; + main_win->cells[5].state |= BTK_CELL_STATE_DISABLED; + main_win->cells[6].state |= BTK_CELL_STATE_DISABLED; + main_win->cells[7].state |= BTK_CELL_STATE_DISABLED; + main_win->cells[10].state |= BTK_CELL_STATE_DISABLED; + main_win->cells[16].state |= BTK_CELL_STATE_DISABLED; + main_win->cells[17].state |= BTK_CELL_STATE_DISABLED; + strcpy(status_open_file, "no hotpot opened"); + strcpy(status_files_n, "n/a entries"); + set_activity_status(STATUS_NONE, redraw); + } else { + main_win->cells[4].state &= ~BTK_CELL_STATE_DISABLED; + main_win->cells[5].state &= ~BTK_CELL_STATE_DISABLED; + main_win->cells[6].state &= ~BTK_CELL_STATE_DISABLED; + main_win->cells[7].state &= ~BTK_CELL_STATE_DISABLED; + main_win->cells[10].state &= ~BTK_CELL_STATE_DISABLED; + main_win->cells[16].state &= ~BTK_CELL_STATE_DISABLED; + main_win->cells[17].state &= ~BTK_CELL_STATE_DISABLED; + strcpy(status_open_file, open_dir); + sprintf(status_files_n, "%i entries", data_n); + } + + if (data_n < 1 || select_data < 0) { + main_win->cells[11].state |= BTK_CELL_STATE_DISABLED; + main_win->cells[12].state |= BTK_CELL_STATE_DISABLED; + main_win->cells[19].state |= BTK_CELL_STATE_DISABLED; + } else { + main_win->cells[11].state &= ~BTK_CELL_STATE_DISABLED; + main_win->cells[12].state &= ~BTK_CELL_STATE_DISABLED; + main_win->cells[19].state &= ~BTK_CELL_STATE_DISABLED; + } + + if (redraw) + btk_window_redraw(main_win); +} + +void +str_to_lower_case(char *str) +{ + for (int i = 0; str[i] != '\0'; i++) + if(str[i] >= 'A' && str[i] <= 'Z') + str[i] += 32; +} + +void +toggle_col(int val, btk_arg_t arg) +{ + data_cols_ena[arg.i] = val; + btk_cell_table_update_geometry(table_cell); + btk_window_redraw_cell(main_win, table_cell_id); +} + +void +toggle_del_tag() +{ + if (select_data < 0 || select_data >= data_n) { + printf("ERROR - can't tag out of bounds selection\n"); + return; + } + + data_tags[select_data] ^= TAG_DEL; + set_entry_tag_col(select_data, data_tags[select_data]); + set_activity_status(STATUS_EDITED, 1); + btk_window_redraw_cell(main_win, table_cell_id); +} + +void +toggle_hidden(int i, btk_arg_t arg) +{ + if (i) { + nav_mode |= DIR_HIDDEN; + } else { + nav_mode &= ~DIR_HIDDEN; + } + parse_dir(dir_current, nav_mode); + btk_window_redraw_cell(file_picker, dir_list_cell_id); +} + +void +toggle_notes(int val, btk_arg_t arg) +{ + if (val) { + table_cell->ca.h = 9; + notes_view_cell->state &= ~BTK_CELL_STATE_HIDDEN; + } else { + table_cell->ca.h = 15; + notes_view_cell->state |= BTK_CELL_STATE_HIDDEN; + } + btk_window_update_cell_area(main_win, table_cell); + btk_window_redraw(main_win); +} + +void +toggle_visibility_tag() +{ + if (select_data < 0 || select_data >= data_n) { + printf("ERROR - can't tag out of bounds selection\n"); + return; + } + + data_tags[select_data] ^= TAG_VISIBILITY; + set_entry_tag_col(select_data, data_tags[select_data]); + btk_window_redraw_cell(main_win, table_cell_id); +} + +void +update_select_data(int sel) +{ + select_data = sel; + if (sel > data_n) + select_data = -1; + + if (select_data < 0) { + strcpy(select_note, ""); + main_win->cells[11].state |= BTK_CELL_STATE_DISABLED; + main_win->cells[12].state |= BTK_CELL_STATE_DISABLED; + main_win->cells[19].state |= BTK_CELL_STATE_DISABLED; + } else { + strcpy(select_note,data_notes + sel * TEXT_SIZE); + main_win->cells[11].state &= ~BTK_CELL_STATE_DISABLED; + main_win->cells[12].state &= ~BTK_CELL_STATE_DISABLED; + main_win->cells[19].state &= ~BTK_CELL_STATE_DISABLED; + } + + btk_cell_editor_update_text(notes_view_cell); + btk_window_redraw_cell(main_win, notes_view_cell_id); + btk_window_redraw_cell(main_win, 11); + btk_window_redraw_cell(main_win, 12); + btk_window_redraw_cell(main_win, 19); +} diff --git a/makefile b/makefile new file mode 100644 index 0000000..9074e06 --- /dev/null +++ b/makefile @@ -0,0 +1,25 @@ +# hotpot - simple literrature manager + +# bucket version +VERSION = 1.0.0 + +# btk +BTK = btk +BTKFILES = ${BTK}/btk.c ${BTK}/btk-window.c ${BTK}/btk-cell.c ${BTK}/btk-text.c ${BTK}/btk-log.c + +# external libraries +LIBS = -lxcb -lcairo + +# flags +CPPFLAGS = -D_POSIX_C_SOURCE=200809L -DVERSION=\"${VERSION}\" +CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os + +# compiler and linker +CC = cc + + +hotpot: + ${CC} -o hotpot main.c ${BTKFILES} ${CPPFLAGS} ${CFLAGS} ${LIBS} + +hello: + ${CC} -o hello hello.c ${BTKFILES} ${CPPFLAGS} ${CFLAGS} ${LIBS} diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..0704af022084734bf2bb029d5ec707d558004549 GIT binary patch literal 77617 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