#include #include #include #include #include #include #include #include #include "buf.h" #include "render.h" #define WIN_W_START 800 #define WIN_H_START 600 #define WIN_WMIN 400 #define WIN_HMIN 300 #define SCROLLBAR_SZ 20 char *buffer = NULL, *data = NULL; uint8_t key_code; uint32_t wheels, button; int force = 50; pen_t pen = {0}; ksys_thread_t form; scrollbar hscroll, wscroll; #define BUF_DRAW_X (form.clientwidth - SCROLLBAR_SZ) #define BUF_DRAW_Y (form.clientheight - SCROLLBAR_SZ) // ReDraw functions void draw_buffer() { drawBuffer(buffer, 0, 0, wscroll.position, hscroll.position, BUF_DRAW_X, BUF_DRAW_Y); } void draw_scrolls() { hscroll.all_redraw = wscroll.all_redraw = 1; scrollbar_v_draw(&hscroll); scrollbar_h_draw(&wscroll); } void draw_window() { _ksys_start_draw(); _ksys_create_window(rand() % (_ksys_screen_size().x - WIN_W_START), rand() % (_ksys_screen_size().y - WIN_H_START), WIN_W_START, WIN_H_START, "Marker [Do not leak our hard work]", 0x121212, 0x73); _ksys_thread_info(&form, KSYS_THIS_SLOT); if (!(form.window_state & 4)) { _ksys_change_window(form.winx_start, form.winy_start, max(WIN_WMIN, form.winx_size), max(WIN_HMIN, form.winy_size)); hscroll.xpos = BUF_DRAW_X; hscroll.ysize = hscroll.cur_area = BUF_DRAW_Y; wscroll.ypos = BUF_DRAW_Y; wscroll.xsize = wscroll.cur_area = BUF_DRAW_X; hscroll.position = min(hscroll.position, gh(buffer) - BUF_DRAW_Y); wscroll.position = min(wscroll.position, gw(buffer) - BUF_DRAW_X); draw_buffer(); draw_scrolls(); _ksys_draw_bar(BUF_DRAW_X, BUF_DRAW_Y, SCROLLBAR_SZ, SCROLLBAR_SZ, 0x121212); } _ksys_end_draw(); } void parse(char *filename) { ksys_ufile_t ld = _ksys_load_file(filename); if (ld.data == NULL) { _ksys_exec("/sys/@notify", "'Marker\nFile not found!' -E -t"); exit(0); } int n = ld.size; data = ld.data; //puts(data); for (int i = 0; i < ld.size; i++) { if (data[i] == '\n') { render_NewLn(&pen); if (pen.mode == header) { pen.mul = 1; pen.mode = plain; } if (pen.mode == quote) { pen.color = 0xF7F7F7; pen.mode = plain; } } else if (data[i] == '\\' && i + 1 < n) { i++; render_DrawLen(&pen, buffer, data + i, 1); } else if (data[i] == '*' || data[i] == '_') { if (i + 1 < n && data[i + 1] == data[i]) { pen.bold ^= 1; i++; } else { pen.italic ^= 1; } } else if (data[i] == '~' && i + 1 < n && data[i + 1] == '~') { pen.strike ^= 1; i++; } else if (data[i] == '`') { pen.underline ^= 1; } else if ((i == 0 || (i > 0 && data[i - 1] == '\n')) && data[i] == '#') { int cnt = 1; while (i + cnt < n && data[i + cnt] == '#') cnt++; if (cnt <= 6) { pen.mode = header; pen.mul = 1 + (6 - cnt) * 0.2; i += cnt - 1; while (i + 1 < n && data[i + 1] == ' ') i++; } } else if ((i == 0 || (i > 0 && data[i - 1] == '\n')) && data[i] == '>') { pen.color = 0xF4FF00; pen.mode = quote; i++; } else { render_DrawLen(&pen, buffer, data + i, 1); } } free(data); } int main(int argc, char **argv) { srand(time(0)); _ksys_set_event_mask(KSYS_EVM_REDRAW + KSYS_EVM_KEY + KSYS_EVM_BUTTON + KSYS_EVM_MOUSE + KSYS_EVM_MOUSE_FILTER); pen.mul = 1; pen.font_size.x = 8; pen.font_size.y = 16; pen.color = 0xF7F7F7; buffer = createBuffer(2000, 2000, 0x121212); /// Dynamic size or something else ??? if (argc == 1) { open_dialog *open = kolibri_new_open_dialog(OPEN, 0, 0, 400, 300); OpenDialog_init(open); OpenDialog_start(open); if (open->status != SUCCESS) { _ksys_exec("/sys/@notify", "'Marker\nNo file selected!' -F -t"); exit(0); } parse(open->openfile_path); } else { parse(argv[1]); } hscroll.xsize = SCROLLBAR_SZ - 1; hscroll.ypos = 0; hscroll.btn_height = SCROLLBAR_SZ - 1; hscroll.type = 2; hscroll.max_area = gh(buffer); hscroll.back_color = hscroll.line_color = 0x3F3F3F; hscroll.front_color = 0x7B7B7B; hscroll.ar_offset = force; wscroll.xpos = 0; wscroll.ysize = SCROLLBAR_SZ - 1; wscroll.btn_height = SCROLLBAR_SZ - 1; wscroll.type = 2; wscroll.max_area = gw(buffer); wscroll.back_color = wscroll.line_color = 0x3F3F3F; wscroll.front_color = 0x7B7B7B; wscroll.ar_offset = force; bool isRunning = 1; while (isRunning) { switch (_ksys_get_event()) { case KSYS_EVENT_REDRAW: draw_window(); break; case KSYS_EVENT_KEY: key_code = _ksys_get_key().code; if (form.window_state & 4) break; //printf("%d\n", key_code); switch (key_code) { case 184: // PgUp hscroll.position = max(0, (int)hscroll.position - form.clientheight); break; case 183: // PgDn hscroll.position = min(gh(buffer) - BUF_DRAW_Y, hscroll.position + form.clientheight); break; case 178: // Up hscroll.position = max(0, (int)hscroll.position - force); break; case 177: // Down hscroll.position = min(gh(buffer) - BUF_DRAW_Y, hscroll.position + force); break; case 176: // Left wscroll.position = max(0, (int)wscroll.position - force); break; case 179: // Right wscroll.position = min(gw(buffer) - BUF_DRAW_X, wscroll.position + force); break; } draw_buffer(); draw_scrolls(); break; case KSYS_EVENT_BUTTON: if (_ksys_get_button() == 1) isRunning = 0; break; case KSYS_EVENT_MOUSE: wheels = _ksys_get_mouse_wheels(); button = _ksys_get_mouse_buttons(); if (form.window_state & 4) break; scrollbar_v_mouse(&hscroll); scrollbar_h_mouse(&wscroll); if (wheels & 0xFFFF) { int ctrl = _ksys_get_control_key_state(); if (ctrl & (KSYS_CONTROL_LSHIFT | KSYS_CONTROL_RSHIFT)) { wscroll.position = max(min((int)wscroll.position + force * (short)wheels, gw(buffer) - BUF_DRAW_X), 0); } else { hscroll.position = max(min((int)hscroll.position + force * (short)wheels, gh(buffer) - BUF_DRAW_Y), 0); } draw_buffer(); draw_scrolls(); } if (button) draw_buffer(); break; } } free(buffer); return 0; }