From darkjames w darkjames.ath.cx Sun Nov 2 13:32:45 2008 From: darkjames w darkjames.ath.cx (Jakub Zawadzki) Date: Sun, 2 Nov 2008 13:32:45 +0100 Subject: [ekg2-devel] [PATCH] ncurses i wykrywanie wklejania Message-ID: <20081102123245.GA5171@darkjames.ath.cx> Helo, commitnalem obsluge 'szybkich' timerow, to wypada korzystac z nich nie tylko jako hack do odswiezania okienka gtk :) W zalaczniku (proof of concept) latki ktora ma za zadanie w trybie jednolinijowym wykrywac wklejanie znacznej (> 2) ilosci linijek i jak wykryje przelaczyc na tryb wielolinijowy. (testowalem z /set ncurses:paste_detect_time 5) Pozdrawiam. -------------- następna część --------- Index: plugins/ncurses/old.h =================================================================== --- plugins/ncurses/old.h (wersja 4726) +++ plugins/ncurses/old.h (kopia robocza) @@ -151,7 +151,7 @@ extern int config_margin_size; extern int config_statusbar_size; extern int config_kill_irc_window; - +extern int config_paste_detect_time; extern int config_text_bottomalign; extern int config_typing_timeout; extern int config_typing_timeout_empty; Index: plugins/ncurses/main.c =================================================================== --- plugins/ncurses/main.c (wersja 4726) +++ plugins/ncurses/main.c (kopia robocza) @@ -53,6 +53,7 @@ int config_margin_size; int config_mark_on_window_change = 0; int config_kill_irc_window = 1; +int config_paste_detect_time = 0; // wartosc w ms, testowalem z 5ms - domyslne w irssi int config_statusbar_size; int config_lastlog_size; int config_lastlog_lock; @@ -773,6 +774,7 @@ variable_add(&ncurses_plugin, ("kill_irc_window"), VAR_BOOL, 1, &config_kill_irc_window, NULL, NULL, NULL); variable_add(&ncurses_plugin, ("margin_size"), VAR_INT, 1, &config_margin_size, NULL, NULL, NULL); variable_add(&ncurses_plugin, ("mark_on_window_change"), VAR_BOOL, 1, &config_mark_on_window_change, NULL, NULL, NULL); + variable_add(&ncurses_plugin, ("paste_detect_time"), VAR_INT, 1, &config_paste_detect_time, NULL, NULL, NULL); variable_add(&ncurses_plugin, ("statusbar_size"), VAR_INT, 1, &config_statusbar_size, header_statusbar_resize, NULL, NULL); variable_add(&ncurses_plugin, ("text_bottomalign"), VAR_INT, 1, &config_text_bottomalign, NULL, variable_map(3, 0, 0, "off", 1, 2, "except-floating", 2, 1, "all"), NULL); Index: plugins/ncurses/bindings.c =================================================================== --- plugins/ncurses/bindings.c (wersja 4726) +++ plugins/ncurses/bindings.c (kopia robocza) @@ -225,7 +225,130 @@ ncurses_typing_mod = 1; } } - + +/* + * note: + * to dziala troche inaczej niz chcialem (anyway jak dla mnie wystarczajaco dobrze) + * + * na poczatku byl pomysl zeby do binding_accept_line_timer trafiala strukturka accept_line_instance_t + * zawierajaca dane okna, gdzie wklepalismy komende, i zeby to okno nawet mozna bylo zabic + * + * napisalem troche kodu, kod wygladal okej, ale z wieloma sytuacjami krancowymi: + * - o uzytkownik zabil okno, co teraz? + * - o uzytkownik zmienil okno, podczas wklejania, co teraz? + * - o uzytkownik zrobile wklejke do okna XYZ, i do okna XYZ2, co teraz? + * + * wiec jest zrobione tak: + * - jest jedna instancja + * - jak chcemy sprawdzic czy dziala, wystarczy (accept_line_instance.t !is null) + * - gdy uzytkownik zabije okno, 1) 2) komenda/-y laduja w ncurses_lines + * [krancowy: zostaje stworzone okno z takim samym pointerem - zostanie wyslane toto] + * - gdy uzytkownik zmieni okno, 1) komenda zostanie wykonana + * 2) komendy laduja w ncurses_lines, w zwiazku z tym ze nie mamy w->lines, + * user moze byc confused + * + * - gdy uzytkownik zrobie wklejke do innego okna, zachowujemy sie po staremu -> pozwalamy mu na to + * + * 1) - timer timeoutnal, z [1;2] liniami + * 2) - timer timeoutnal, z [3;+n) liniami + * + * mozliwe ze w innych przypadkach kod tez sucks, dlatego domyslnie wylaczone, niech kazdy sobie potestuje, jak mu sie spodoba, to sobie wlaczy. + * + * XXX, mozna jakos probowac wylaczac niefajne sytuacje sprawdzajac w bindingach czy (accept_line_instance.t != NULL) i np. przy alt-k blokowac. + * + * - np. gdy uzytkownik zmieni nazwe okna + * - XXX, pomyslec o ncurses_history + * + * (przed commitem przetlumaczyc na ang) + */ + +static struct { + timer_t t; + window_t *w; + CHAR_T **cmd; +} accept_line_instance; + +static BINDING_FUNCTION(binding_accept_line); + +static TIMER(binding_accept_line_timer) { + window_t *w; + + CHAR_T *ncurses_line_tmp; + int line_index_tmp; + int line_start_tmp; + int j; + + if (type) { + accept_line_instance.t = NULL; + array_free((char **) accept_line_instance.cmd); + accept_line_instance.cmd = NULL; + return 0; + } + + if ((w = window_find_ptr(accept_line_instance.w))) { + CHAR_T **cmd = accept_line_instance.cmd; + + if (array_count((char **) cmd) <= 2) { // XXX, dorobic zmienna! + int i; + + for (i = 0; cmd[i]; i++) { + char *txt; + + command_exec(w->target, w->session, (txt = wcs_to_normal(cmd[i])), 0); + free_utf(txt); + } + return -1; + } + } + + print("generic2", "prawdopodobnie wkleiles duzo linijek w trybie jednolinijowym, " \ + "korzystasz z config_paste_detect_time, wiec zmienilismy na input-wielolinijowy, nacisnij alt-enter aby wykonac"); + + /* gdy nie wykonujemy (bo okno nie istnieje, lub wiecej niz 2 linijki) + * zmienmy typ wyswietlania inputa na multilinijkowy, i skopiujmy tam te linijki */ + + /* jak mamy tylko 1 linijke inputa, to dorobmy wiecej */ + if (input_size == 1) { /* powinno zawsze sie wykonac */ + input_size = 5; + ncurses_input_update(); + } + + line_index_tmp = line_index; + line_start_tmp = line_start; + + lines_index = 0; // chcemy dodawac elementy na samym poczatku! + lines_adjust(); + + ncurses_line_tmp = xmemdup(ncurses_line, LINE_MAXLEN*sizeof(CHAR_T)); // zapisujemy stara linie + + for (j = 0; accept_line_instance.cmd[j]; j++) { + int i; + xwcscpy(ncurses_line, accept_line_instance.cmd[j]); + + /* z binding_accept_line(), mozna zoptymalizowac */ + lines = xrealloc(lines, (array_count((char **) lines) + 2) * sizeof(CHAR_T *)); + + for (i = array_count((char **) lines); i > lines_index; i--) + lines[i + 1] = lines[i]; + + lines[lines_index + 1] = xmalloc(LINE_MAXLEN*sizeof(CHAR_T)); + lines_index++; + + lines_adjust(); + } + xwcscpy(ncurses_line, ncurses_line_tmp); // zeby na koncu ja przywroci + line_start = line_start_tmp; + line_index = line_index_tmp; + + lines_adjust(); + ncurses_redraw_input(0); + ncurses_commit(); + + xfree(ncurses_line_tmp); + + return -1; +} + static BINDING_FUNCTION(binding_accept_line) { char *txt; @@ -259,8 +382,25 @@ return; } if (arg != BINDING_HISTORY_NOEXEC) { - command_exec(window_current->target, window_current->session, (txt = wcs_to_normal(line)), 0); - free_utf(txt); + if (accept_line_instance.t == NULL) + accept_line_instance.w = window_current; + + if (accept_line_instance.w == window_current && config_paste_detect_time > 0) { + CHAR_T **tmp = accept_line_instance.cmd; + + array_add(&tmp, xmemdup(line, LINE_MAXLEN * sizeof(CHAR_T))); + accept_line_instance.cmd = NULL; + + /* odswiezmy timeout */ + timers_remove(accept_line_instance.t); + accept_line_instance.t = timer_add_ms(&ncurses_plugin, "nopaste", config_paste_detect_time, 0, binding_accept_line_timer, NULL); + + accept_line_instance.cmd = tmp; + + } else { + command_exec(window_current->target, window_current->session, (txt = wcs_to_normal(line)), 0); + free_utf(txt); + } } if (ncurses_plugin_destroyed) From darkjames w darkjames.ath.cx Sun Nov 2 18:09:33 2008 From: darkjames w darkjames.ath.cx (Jakub Zawadzki) Date: Sun, 2 Nov 2008 18:09:33 +0100 Subject: [ekg2-devel] [PATCH] ncurses i wykrywanie wklejania In-Reply-To: <20081102123245.GA5171@darkjames.ath.cx> References: <20081102123245.GA5171@darkjames.ath.cx> Message-ID: <20081102170933.GA19851@darkjames.ath.cx> On Sun, Nov 02, 2008 at 01:32:45PM +0100, Jakub Zawadzki wrote: > Helo, > > commitnalem obsluge 'szybkich' timerow, to wypada korzystac z nich nie > tylko jako hack do odswiezania okienka gtk :) > > W zalaczniku (proof of concept) latki ktora ma za zadanie w trybie > jednolinijowym wykrywac wklejanie znacznej (> 2) ilosci linijek i jak wykryje > przelaczyc na tryb wielolinijowy. > > (testowalem z /set ncurses:paste_detect_time 5) Nowsza wersja, tego samego wyglada troche lepiej :) I poprawilem blad zwiazany z ncurses_lines_index (mozliwy przy b. duzych wartosciach ncurses:paste_detect_time :>) dalej nieprzetestowane na unikodzie. -------------- następna część --------- Index: plugins/ncurses/old.h =================================================================== --- plugins/ncurses/old.h (wersja 4726) +++ plugins/ncurses/old.h (kopia robocza) @@ -151,7 +151,7 @@ extern int config_margin_size; extern int config_statusbar_size; extern int config_kill_irc_window; - +extern int config_paste_detect_time; extern int config_text_bottomalign; extern int config_typing_timeout; extern int config_typing_timeout_empty; Index: plugins/ncurses/main.c =================================================================== --- plugins/ncurses/main.c (wersja 4726) +++ plugins/ncurses/main.c (kopia robocza) @@ -53,6 +53,7 @@ int config_margin_size; int config_mark_on_window_change = 0; int config_kill_irc_window = 1; +int config_paste_detect_time = 0; // wartosc w ms, testowalem z 5ms - domyslne w irssi int config_statusbar_size; int config_lastlog_size; int config_lastlog_lock; @@ -773,6 +774,7 @@ variable_add(&ncurses_plugin, ("kill_irc_window"), VAR_BOOL, 1, &config_kill_irc_window, NULL, NULL, NULL); variable_add(&ncurses_plugin, ("margin_size"), VAR_INT, 1, &config_margin_size, NULL, NULL, NULL); variable_add(&ncurses_plugin, ("mark_on_window_change"), VAR_BOOL, 1, &config_mark_on_window_change, NULL, NULL, NULL); + variable_add(&ncurses_plugin, ("paste_detect_time"), VAR_INT, 1, &config_paste_detect_time, NULL, NULL, NULL); variable_add(&ncurses_plugin, ("statusbar_size"), VAR_INT, 1, &config_statusbar_size, header_statusbar_resize, NULL, NULL); variable_add(&ncurses_plugin, ("text_bottomalign"), VAR_INT, 1, &config_text_bottomalign, NULL, variable_map(3, 0, 0, "off", 1, 2, "except-floating", 2, 1, "all"), NULL); Index: plugins/ncurses/bindings.c =================================================================== --- plugins/ncurses/bindings.c (wersja 4726) +++ plugins/ncurses/bindings.c (kopia robocza) @@ -225,7 +225,106 @@ ncurses_typing_mod = 1; } } - + +/* + * note: + * to dziala troche inaczej niz chcialem (anyway jak dla mnie wystarczajaco dobrze) + * + * na poczatku byl pomysl zeby do binding_accept_line_timer trafiala strukturka accept_line_instance_t + * zawierajaca dane okna, gdzie wklepalismy komende, i zeby to okno nawet mozna bylo zabic + * + * napisalem troche kodu, kod wygladal okej, ale z wieloma sytuacjami krancowymi: + * - o uzytkownik zabil okno, co teraz? + * - o uzytkownik zmienil okno, podczas wklejania, co teraz? + * - o uzytkownik zrobile wklejke do okna XYZ, i do okna XYZ2, co teraz? + * + * wiec jest zrobione tak: + * - jest jedna instancja + * - jak chcemy sprawdzic czy dziala, wystarczy (accept_line_instance.t !is null) + * - gdy uzytkownik zabije okno, 1) 2) komenda/-y laduja w ncurses_lines + * [krancowy: zostaje stworzone okno z takim samym pointerem - zostanie wyslane toto] + * - gdy uzytkownik zmieni okno, 1) komenda zostanie wykonana + * 2) komendy laduja w ncurses_lines, w zwiazku z tym ze nie mamy w->lines, + * user moze byc confused + * + * - gdy uzytkownik zrobie wklejke do innego okna, zachowujemy sie po staremu -> pozwalamy mu na to + * + * 1) - timer timeoutnal, z [1;2] liniami + * 2) - timer timeoutnal, z [3;+n) liniami + * + * mozliwe ze w innych przypadkach kod tez sucks, dlatego domyslnie wylaczone, niech kazdy sobie potestuje, jak mu sie spodoba, to sobie wlaczy. + * + * XXX, mozna jakos probowac wylaczac niefajne sytuacje sprawdzajac w bindingach czy (accept_line_instance.t != NULL) i np. przy alt-k blokowac. + * + * - np. gdy uzytkownik zmieni nazwe okna + * - XXX, pomyslec o ncurses_history + * + * (przed commitem przetlumaczyc na ang) + */ + +static struct { + timer_t t; + window_t *w; + CHAR_T **cmd; +} accept_line_instance; + +static TIMER(binding_accept_line_timer) { + CHAR_T **cmd = accept_line_instance.cmd; + window_t *w; + int ncurses_lines_count, cmd_count; + int i; + + if (type) { + accept_line_instance.t = NULL; + array_free((char **) accept_line_instance.cmd); + accept_line_instance.cmd = NULL; + return 0; + } + + if ((w = window_find_ptr(accept_line_instance.w))) { + if (array_count((char **) cmd) <= 2) { // XXX, dorobic zmienna! + for (i = 0; cmd[i]; i++) { + char *txt; + + command_exec(w->target, w->session, (txt = wcs_to_normal(cmd[i])), 0); + free_utf(txt); + } + return -1; + } + } + /* gdy nie wykonujemy (bo okno nie istnieje, lub wiecej niz 2 linijki) + * zmienmy typ wyswietlania inputa na multilinijkowy, i skopiujmy tam te linijki */ + + print("generic2", "prawdopodobnie wkleiles duzo linijek w trybie jednolinijowym, " \ + "korzystasz z config_paste_detect_time, wiec zmienilismy na input-wielolinijowy, nacisnij alt-enter aby wykonac"); + + /* jak mamy tylko 1 linijke inputa, to dorobmy wiecej */ + if (input_size == 1) { /* powinno zawsze sie wykonac */ + input_size = 5; + ncurses_input_update(); + } + + cmd_count = array_count((char **) cmd); + ncurses_lines_count = array_count((char **) ncurses_lines); + + ncurses_lines = xrealloc(ncurses_lines, (cmd_count + ncurses_lines_count + 1) * sizeof(CHAR_T *)); + memmove(&ncurses_lines[cmd_count], ncurses_lines, (ncurses_lines_count + 1) * sizeof(CHAR_T *)); + + for (i = 0; i < cmd_count; i++) + ncurses_lines[i] = cmd[i]; + + lines_index += cmd_count; + + lines_adjust(); + ncurses_redraw_input(0); + ncurses_commit(); + + xfree(accept_line_instance.cmd); + accept_line_instance.cmd = NULL; + + return -1; +} + static BINDING_FUNCTION(binding_accept_line) { char *txt; @@ -259,8 +358,24 @@ return; } if (arg != BINDING_HISTORY_NOEXEC) { - command_exec(window_current->target, window_current->session, (txt = wcs_to_normal(line)), 0); - free_utf(txt); + if (accept_line_instance.t == NULL) + accept_line_instance.w = window_current; + + if (accept_line_instance.w == window_current && config_paste_detect_time > 0) { + CHAR_T **tmp = accept_line_instance.cmd; + + array_add(&tmp, xmemdup(line, LINE_MAXLEN * sizeof(CHAR_T))); + accept_line_instance.cmd = NULL; + + /* odswiezmy timeout */ + timers_remove(accept_line_instance.t); + accept_line_instance.t = timer_add_ms(&ncurses_plugin, "nopaste", config_paste_detect_time, 0, binding_accept_line_timer, NULL); + + accept_line_instance.cmd = tmp; + } else { + command_exec(window_current->target, window_current->session, (txt = wcs_to_normal(line)), 0); + free_utf(txt); + } } if (ncurses_plugin_destroyed) From porridge w debian.org Mon Nov 3 11:53:26 2008 From: porridge w debian.org (Marcin Owsiany) Date: Mon, 3 Nov 2008 10:53:26 +0000 Subject: [ekg2-devel] [PATCH] ncurses i wykrywanie wklejania In-Reply-To: <20081102170933.GA19851@darkjames.ath.cx> References: <20081102123245.GA5171@darkjames.ath.cx> <20081102170933.GA19851@darkjames.ath.cx> Message-ID: <20081103105326.GC544@beczulka> Trochę moich lamerskich komentarzy. Mam nadzieję że przyczynią się do poprawy jakości kodu, a może przynajmniej do mojego zrozumienia kodu :-) On Sun, Nov 02, 2008 at 06:09:33PM +0100, Jakub Zawadzki wrote: > + if (array_count((char **) cmd) <= 2) { // XXX, dorobic zmienna! Z ciekawości, dlaczego 2 traktujesz jako przypadek graniczny, a nie 1? > + print("generic2", "prawdopodobnie wkleiles duzo linijek w trybie jednolinijowym, " \ > + "korzystasz z config_paste_detect_time, wiec zmienilismy na input-wielolinijowy, nacisnij alt-enter aby wykonac"); ort: liniowy[m], nie "linijowy[m]" > + > + /* jak mamy tylko 1 linijke inputa, to dorobmy wiecej */ > + if (input_size == 1) { /* powinno zawsze sie wykonac */ Em, skoro zawsze, to po co ten warunek? Jeśli nie zawsze, to po co ten komentarz? :) > + input_size = 5; Dlaczego 5? Jeśli to jakaś wartość magiczna, to warto by z niej zrobić stałą. > + ncurses_input_update(); > + } > + > + cmd_count = array_count((char **) cmd); Tak jak napisałeś, to wartałoby liczyć tylko raz. > + ncurses_lines_count = array_count((char **) ncurses_lines); > + > + ncurses_lines = xrealloc(ncurses_lines, (cmd_count + ncurses_lines_count + 1) * sizeof(CHAR_T *)); > + memmove(&ncurses_lines[cmd_count], ncurses_lines, (ncurses_lines_count + 1) * sizeof(CHAR_T *)); Te powyższe linijki pewnie już gdzieś w kodzie istnieją. Może warto byłoby zrobić funkcję do "dodawania n linii do ncurses_lines"? Hermetyzacja to dobra praktyka. > + > + for (i = 0; i < cmd_count; i++) > + ncurses_lines[i] = cmd[i]; > + > + lines_index += cmd_count; Może ta hipotetyczna funkcja powinna zawierać też te powyższe 3 linijki? > @@ -259,8 +358,24 @@ > return; > } > if (arg != BINDING_HISTORY_NOEXEC) { > - command_exec(window_current->target, window_current->session, (txt = wcs_to_normal(line)), 0); > - free_utf(txt); > + if (accept_line_instance.t == NULL) > + accept_line_instance.w = window_current; > + > + if (accept_line_instance.w == window_current && config_paste_detect_time > 0) { > + CHAR_T **tmp = accept_line_instance.cmd; Dlaczego to tmp jest potrzebne? > + > + array_add(&tmp, xmemdup(line, LINE_MAXLEN * sizeof(CHAR_T))); > + accept_line_instance.cmd = NULL; Dlaczego tutaj tymczasowo ląduje NULL.. > + /* odswiezmy timeout */ > + timers_remove(accept_line_instance.t); > + accept_line_instance.t = timer_add_ms(&ncurses_plugin, "nopaste", config_paste_detect_time, 0, binding_accept_line_timer, NULL); > + > + accept_line_instance.cmd = tmp; ...skoro tutaj i tak podstawiamy spowrotem tmp? -- Marcin Owsiany http://marcin.owsiany.pl/ GnuPG: 1024D/60F41216 FE67 DA2D 0ACA FC5E 3F75 D6F6 3A0D 8AA0 60F4 1216 From darkjames w darkjames.ath.cx Mon Nov 3 17:52:44 2008 From: darkjames w darkjames.ath.cx (Jakub Zawadzki) Date: Mon, 3 Nov 2008 17:52:44 +0100 Subject: [ekg2-devel] [PATCH] ncurses i wykrywanie wklejania In-Reply-To: <20081103105326.GC544@beczulka> References: <20081102123245.GA5171@darkjames.ath.cx> <20081102170933.GA19851@darkjames.ath.cx> <20081103105326.GC544@beczulka> Message-ID: <20081103165244.GA31833@darkjames.ath.cx> On Mon, Nov 03, 2008 at 10:53:26AM +0000, Marcin Owsiany wrote: > On Sun, Nov 02, 2008 at 06:09:33PM +0100, Jakub Zawadzki wrote: > > + if (array_count((char **) cmd) <= 2) { // XXX, dorobic zmienna! > > Z ciekawości, dlaczego 2 traktujesz jako przypadek graniczny, a nie 1? w/g sjp kilka zaczyna sie od 3 (http://sjp.pwn.pl/haslo.php?id=2470765) pamietaj, to jest PoC :) > > + print("generic2", "prawdopodobnie wkleiles duzo linijek w trybie jednolinijowym, " \ > > + "korzystasz z config_paste_detect_time, wiec zmienilismy na input-wielolinijowy, nacisnij alt-enter aby wykonac"); > > ort: liniowy[m], nie "linijowy[m]" O kurcze, dzieki! (I tak mam nadzieje ze osoba ktora to bedzie commitowac bedzie tlumaczyc to i komentarze na angielski?) oraz: s/duzo/kilka/ > > + > > + /* jak mamy tylko 1 linijke inputa, to dorobmy wiecej */ > > + if (input_size == 1) { /* powinno zawsze sie wykonac */ > > Em, skoro zawsze, to po co ten warunek? Jeśli nie zawsze, to po co ten > komentarz? :) jak ktos ustawi sobie config_paste_detect_time na 10s (nie wiem po co, ale aktualny kod mu na to pozwala), to moze w miedzyczasie uzytkownik zmienic input na wielolinikowy dlatego to powinno, przy aktualnym kodzie nic zlego sie nie stanie przy starym sie psulo dlatego byl komentarz :) > > + input_size = 5; > > Dlaczego 5? Jeśli to jakaś wartość magiczna, to warto by z niej zrobić > stałą. kod z binding_toggle_input(), warto :) > > > + ncurses_input_update(); > > + } > > + > > + cmd_count = array_count((char **) cmd); > > Tak jak napisałeś, to wartałoby liczyć tylko raz. Nie rozumiem, cmd_count = array_count((char **) cmd); if ((w = window_find_ptr(accept_line_instance.w))) { /* i tutaj tez wykorzystac cmd_count zamiast array_count() */ } ? > > + ncurses_lines_count = array_count((char **) ncurses_lines); > > + > > + ncurses_lines = xrealloc(ncurses_lines, (cmd_count + ncurses_lines_count + 1) * sizeof(CHAR_T *)); > > + memmove(&ncurses_lines[cmd_count], ncurses_lines, (ncurses_lines_count + 1) * sizeof(CHAR_T *)); > > Te powyższe linijki pewnie już gdzieś w kodzie istnieją. Może warto > byłoby zrobić funkcję do "dodawania n linii do ncurses_lines"? > Hermetyzacja to dobra praktyka. Ja widze tylko w binding_accept_line(), z ktorego co prawda chcialem korzystac, ale w starej wersji (rowniez wtedy kiedy probowalem zrozumiec jak dziala kod w binding_accept_line(), i dlaczego moja wersja nie dziala) anyway jak masz pomysl jak ta funkcja ma wygladac, to b. chetnie :) > > @@ -259,8 +358,24 @@ > > [ciach] > > + CHAR_T **tmp = accept_line_instance.cmd; > > Dlaczego to tmp jest potrzebne? > > [ciach] > > + accept_line_instance.cmd = NULL; > > Dlaczego tutaj tymczasowo ląduje NULL.. > > [ciach] > > + accept_line_instance.cmd = tmp; > ...skoro tutaj i tak podstawiamy spowrotem tmp? ort: z powrotem To jest hack, przy usuwaniu timera, wywolujemy binding_accept_line_timer() z type == 1, a tam jest zwalnianie accept_line_instance.cmd, i NULLowanie wskaznika anyway, myslalem zeby zamiast timers_remove() + timer_add_ms() zrobic timer_renew_ms(), ktore by odswiezalo timeout timera, tylko nie wiem czy cos takiego jest naprawde konieczne. > Trochę moich lamerskich komentarzy. Mam nadzieję że przyczynią się do > poprawy jakości kodu, a może przynajmniej do mojego zrozumienia kodu :-) Dzieki za komentarze, w takim celu to komentowac jak czesto jak sie da! :) From porridge w debian.org Mon Nov 3 19:46:29 2008 From: porridge w debian.org (Marcin Owsiany) Date: Mon, 3 Nov 2008 18:46:29 +0000 Subject: [ekg2-devel] [PATCH] ncurses i wykrywanie wklejania In-Reply-To: <20081103165244.GA31833@darkjames.ath.cx> References: <20081102123245.GA5171@darkjames.ath.cx> <20081102170933.GA19851@darkjames.ath.cx> <20081103105326.GC544@beczulka> <20081103165244.GA31833@darkjames.ath.cx> Message-ID: <20081103184629.GA2890@beczulka> On Mon, Nov 03, 2008 at 05:52:44PM +0100, Jakub Zawadzki wrote: > On Mon, Nov 03, 2008 at 10:53:26AM +0000, Marcin Owsiany wrote: > > On Sun, Nov 02, 2008 at 06:09:33PM +0100, Jakub Zawadzki wrote: > > > + if (array_count((char **) cmd) <= 2) { // XXX, dorobic zmienna! > > > > Z ciekawości, dlaczego 2 traktujesz jako przypadek graniczny, a nie 1? > > w/g sjp kilka zaczyna sie od 3 (http://sjp.pwn.pl/haslo.php?id=2470765) > pamietaj, to jest PoC :) No dobra, ale chodzi raczej o oczekiwania użytkownika, a nie definicje słownikowe :-) > > > + print("generic2", "prawdopodobnie wkleiles duzo linijek w trybie jednolinijowym, " \ > > > + "korzystasz z config_paste_detect_time, wiec zmienilismy na input-wielolinijowy, nacisnij alt-enter aby wykonac"); > > > > ort: liniowy[m], nie "linijowy[m]" > > O kurcze, dzieki! > (I tak mam nadzieje ze osoba ktora to bedzie commitowac bedzie tlumaczyc to i komentarze na angielski?) Tak, ale tłumaczenie pewnie skopiowałaby do pl.po > > > + /* jak mamy tylko 1 linijke inputa, to dorobmy wiecej */ > > > + if (input_size == 1) { /* powinno zawsze sie wykonac */ > > > > Em, skoro zawsze, to po co ten warunek? Jeśli nie zawsze, to po co ten > > komentarz? :) > > jak ktos ustawi sobie config_paste_detect_time na 10s (nie wiem po co, > ale aktualny kod mu na to pozwala), to moze w miedzyczasie uzytkownik > zmienic input na wielolinikowy dlatego to powinno, przy aktualnym > kodzie nic zlego sie nie stanie przy starym sie psulo dlatego byl > komentarz :) Nie rozumiem, za długie zdanie jak na moją głowę. Jak podeślesz kolejną wersję łaty to może zrozumiem. > > > + cmd_count = array_count((char **) cmd); > > > > Tak jak napisałeś, to wartałoby liczyć tylko raz. > > Nie rozumiem, No na górze sam napisales "XXX dorobic zmienna". > cmd_count = array_count((char **) cmd); > if ((w = window_find_ptr(accept_line_instance.w))) { /* i tutaj tez wykorzystac cmd_count zamiast array_count() */ } ? Dokładnie. > > > + ncurses_lines_count = array_count((char **) ncurses_lines); > > > + > > > + ncurses_lines = xrealloc(ncurses_lines, (cmd_count + ncurses_lines_count + 1) * sizeof(CHAR_T *)); > > > + memmove(&ncurses_lines[cmd_count], ncurses_lines, (ncurses_lines_count + 1) * sizeof(CHAR_T *)); > > > > Te powyższe linijki pewnie już gdzieś w kodzie istnieją. Może warto > > byłoby zrobić funkcję do "dodawania n linii do ncurses_lines"? > > Hermetyzacja to dobra praktyka. > > Ja widze tylko w binding_accept_line() Ano właśnie, bindings.c:244, z tym że o ile dobrze rozumiem, to tam jest prostszy przypadek (1 linia) a tutaj mamy ogólniejszy (n linii). > anyway jak masz pomysl jak ta funkcja ma wygladac, to b. chetnie :) Chodzi mi o coś takiego prostego: void ncurses_append_lines(int count, char **lines) { int ncurses_lines_count = array_count((char **) ncurses_lines); ncurses_lines = xrealloc(ncurses_lines, (count + ncurses_lines_count + 1) * sizeof(CHAR_T *)); memmove(&ncurses_lines[count], ncurses_lines, (ncurses_lines_count + 1) * sizeof(CHAR_T *)); for (i = 0; i < count; i++) ncurses_lines[i] = lines[i]; lines_index += count; lines_adjust(); } Swoją drogą czy dobrze mi się wydaje że te linie są doklejane na początek tablicy? Dlaczego tak? ncurses liczy linie od dołu ekranu? Może to się powinno nazywać ncurses_prepend_lines w takim razie... > > > @@ -259,8 +358,24 @@ > > > [ciach] > > > + CHAR_T **tmp = accept_line_instance.cmd; > > > > Dlaczego to tmp jest potrzebne? > > > [ciach] > > > + accept_line_instance.cmd = NULL; > > > > Dlaczego tutaj tymczasowo ląduje NULL.. > > > [ciach] > > > + accept_line_instance.cmd = tmp; [...] > To jest hack, przy usuwaniu timera, wywolujemy binding_accept_line_timer() z type == 1, > a tam jest zwalnianie accept_line_instance.cmd, i NULLowanie wskaznika auć! Hm, a czy zwalnianie .cmd przy usuwaniu timera jest faktycznie potrzebne? Bo widzę, że timer po zakończeniu działania sam sobie zwalnia .cmd. Czy może się tak zdażyć, że timer zostanie zwolniony w momencie gdy .cmd będzie nie-NULL? > anyway, myslalem zeby zamiast timers_remove() + timer_add_ms() > zrobic timer_renew_ms(), ktore by odswiezalo timeout timera, > tylko nie wiem czy cos takiego jest naprawde konieczne. Jeśli odpowiedź na moje powyższe pytanie brzmi "tak", to mnie się wydaje że cokolwiek co pozwoli na uniknięcie takiej żonglerki jest przydatne. A tak z innej beczki: może by tak przemianować "type" na "action" i zrobić jakieś miłe stałe typu TIMER_RUN/TIMER_REMOVE? > > ...skoro tutaj i tak podstawiamy spowrotem tmp? > > ort: z powrotem Heh, swoją drogą czy ktoś odpalił w vimie sprawdzanie pisowni? -- Marcin Owsiany http://marcin.owsiany.pl/ GnuPG: 1024D/60F41216 FE67 DA2D 0ACA FC5E 3F75 D6F6 3A0D 8AA0 60F4 1216 From darkjames w darkjames.ath.cx Mon Nov 3 20:08:48 2008 From: darkjames w darkjames.ath.cx (Jakub Zawadzki) Date: Mon, 3 Nov 2008 20:08:48 +0100 Subject: [ekg2-devel] [PATCH] ncurses i wykrywanie wklejania In-Reply-To: <20081103184629.GA2890@beczulka> References: <20081102123245.GA5171@darkjames.ath.cx> <20081102170933.GA19851@darkjames.ath.cx> <20081103105326.GC544@beczulka> <20081103165244.GA31833@darkjames.ath.cx> <20081103184629.GA2890@beczulka> Message-ID: <20081103190848.GA3971@darkjames.ath.cx> On Mon, Nov 03, 2008 at 06:46:29PM +0000, Marcin Owsiany wrote: > Ano właśnie, bindings.c:244, z tym że o ile dobrze rozumiem, to tam jest > prostszy przypadek (1 linia) a tutaj mamy ogólniejszy (n linii). No wlasnie IMHO odwrotnie, w binding_accept_line() mamy kod ktory robi wiele rzeczy, np mamy tekst: Pierwsza linijka Druga linijka Trzecia linijka uzytkownik moze ustawic kursor po Druga i nacisnac Enter, wtedy mamy: Pierwsza linijka Druga linijka Trzecia linijka Tym ta swoja procedurka nie zrobisz (chyba?) > Swoją drogą czy dobrze mi się wydaje że te linie są doklejane na > początek tablicy? Dlaczego tak? ncurses liczy linie od dołu ekranu? Może > to się powinno nazywać ncurses_prepend_lines w takim razie... No moj kod dokleja na poczatek, w koncu im wczesniej tekst trafil do inputa, tym wczesniej powinien byc? Kod w binding_accept_line() zas dokleja w miejscu w ktorym jest ncurses_lines_index (aka lines_index) [nie ja ten kod pisalem, blame ekg team :)] > > To jest hack, przy usuwaniu timera, wywolujemy binding_accept_line_timer() z type == 1, > > a tam jest zwalnianie accept_line_instance.cmd, i NULLowanie wskaznika > > auć! > > Hm, a czy zwalnianie .cmd przy usuwaniu timera jest faktycznie > potrzebne? Bo widzę, że timer po zakończeniu działania sam sobie zwalnia > .cmd. Czy może się tak zdażyć, że timer zostanie zwolniony w momencie > gdy .cmd będzie nie-NULL? Tak, jak zamykamy ekg2, lub wyladowujemy ncurses. W sumie chyba mozna to robic w ncurses_plugin_destroy() > > anyway, myslalem zeby zamiast timers_remove() + timer_add_ms() > > zrobic timer_renew_ms(), ktore by odswiezalo timeout timera, > > tylko nie wiem czy cos takiego jest naprawde konieczne. > > Jeśli odpowiedź na moje powyższe pytanie brzmi "tak", to mnie się wydaje > że cokolwiek co pozwoli na uniknięcie takiej żonglerki jest przydatne. > > A tak z innej beczki: może by tak przemianować "type" na "action" i > zrobić jakieś miłe stałe typu TIMER_RUN/TIMER_REMOVE? Nie wiem, ja nie widze po co. W timerach anyway sa dwa stany, wiec mozna s/type/free_data/ w watchach sa trzy (watch_sie_selectnal/ zwolnic_dane / watch_timeoutnal) > > > ...skoro tutaj i tak podstawiamy spowrotem tmp? > > > > ort: z powrotem > > Heh, swoją drogą czy ktoś odpalił w vimie sprawdzanie pisowni? Ja chyba sie przesiadam na Thunderbirda, imap + kilka serwerow smtp, w thunderbirdzie to sie szybko wyklikuje. W mutt po przeczytaniu paru stron niby wiem jak to zrobic, ale khem, duzo roboty. From porridge w debian.org Sun Nov 23 16:41:02 2008 From: porridge w debian.org (Marcin Owsiany) Date: Sun, 23 Nov 2008 15:41:02 +0000 Subject: [ekg2-devel] [ekg2-commit] r4708 - trunk/ekg: trunk/ekg/legacyconfig.c In-Reply-To: <20081030133434.GA7057@darkjames.ath.cx> References: <20081030102418.GA29605@darkjames.ath.cx> <20081030111149.GB19787@beczulka> <20081030133434.GA7057@darkjames.ath.cx> Message-ID: <20081123154102.GB11035@beczulka> On Thu, Oct 30, 2008 at 02:34:34PM +0100, Jakub Zawadzki wrote: > W zalaczniku latka. Dzięki. -- Marcin Owsiany http://marcin.owsiany.pl/ GnuPG: 1024D/60F41216 FE67 DA2D 0ACA FC5E 3F75 D6F6 3A0D 8AA0 60F4 1216 From porridge w debian.org Mon Nov 24 20:17:39 2008 From: porridge w debian.org (Marcin Owsiany) Date: Mon, 24 Nov 2008 19:17:39 +0000 Subject: [ekg2-devel] =?iso-8859-2?q?Kwestia_zgodno=B6ci_kodu_Ekg2_=28ANSI?= =?iso-8859-2?q?_C=29_z_kompilatorem_g++=09=28C++=29?= In-Reply-To: <20081004221102.7beb73ba@gmail.com> References: <20080901093431.D4BC417B34@toxygen.net> <20080926083217.GB23761@beczulka> <20081004221102.7beb73ba@gmail.com> Message-ID: <20081124191739.GA18725@beczulka> On Sat, Oct 04, 2008 at 10:11:02PM +0200, Daniel Dettlaff wrote: > Witam > Darkjames i Wiechu prosili mnie bym napisał tu w mojej sprawie. > Otóż jak już część ludzi wtajemniczonych wie, zająłem się pisaniem > rozszerzenia do Ekg2 z interfejsem Qt4. > > Problemem na jaki trafiłem, jest niezgodność Ekg2-core z C++. > Chodzi o użycie w kodzie zarezerwowanych dla C++ słów: private i class. Zrobiłem gałąź "c++_renames" a w niej dwa commity: 4739 - zmiana "private" na "priv_data" 4740 - zmiana "class" na "klass" ekg2 kompiluje się i działa mi conajmniej plugin gg, więc sądzę że nie wprowadziłem żadnej destabilizacji? Pewnie w niejednym miejscu zmiany nie były konieczne, ale tam gdzie nie miałem pewności wolałem zmienić dla zachowania jednolitości. Tam gdzie to w ogóle to nie miało sensu zawsze można cofnąć. Proszę o uwagi i ew. poprawki. -- Marcin Owsiany http://marcin.owsiany.pl/ GnuPG: 1024D/60F41216 FE67 DA2D 0ACA FC5E 3F75 D6F6 3A0D 8AA0 60F4 1216 From darkjames w darkjames.ath.cx Mon Nov 24 23:06:22 2008 From: darkjames w darkjames.ath.cx (Jakub Zawadzki) Date: Mon, 24 Nov 2008 23:06:22 +0100 Subject: [ekg2-devel] =?iso-8859-2?q?Kwestia_zgodno=B6ci_kodu_Ekg2_=28ANSI?= =?iso-8859-2?q?_C=29_z_kompilatorem=09g++=3F=28C++=29?= In-Reply-To: <20081124191739.GA18725@beczulka> References: <20080901093431.D4BC417B34@toxygen.net> <20080926083217.GB23761@beczulka> <20081004221102.7beb73ba@gmail.com> <20081124191739.GA18725@beczulka> Message-ID: <20081124220622.GA11101@darkjames.ath.cx> On Mon, Nov 24, 2008 at 07:17:39PM +0000, Marcin Owsiany wrote: > On Sat, Oct 04, 2008 at 10:11:02PM +0200, Daniel Dettlaff wrote: > > Problemem na jaki trafiłem, jest niezgodność Ekg2-core z C++. > > Chodzi o użycie w kodzie zarezerwowanych dla C++ słów: private i class. > > Zrobiłem gałąź "c++_renames" a w niej dwa commity: > 4739 - zmiana "private" na "priv_data" > 4740 - zmiana "class" na "klass" klass mi się nie podoba ;/ w naglowkach jest class uzywane do wiadomosci, to moze mclass? > ekg2 kompiluje się i działa mi conajmniej plugin gg, więc sądzę że nie > wprowadziłem żadnej destabilizacji? Pewnie nie, moze trzeba bylo odrazu do trunka? Anyway plugin Qt to jest piesn przyszłosci, a ja nie widze wiekszego sensu pisania zwykłych pluginów w C++ (Qt anyway wystarczylo jako hack zrobić pare #define'ow: http://github.com/dmilith/ekg2-qt4/tree/master%2Fekg2_includes.h?raw=true From porridge w debian.org Wed Nov 26 20:09:59 2008 From: porridge w debian.org (Marcin Owsiany) Date: Wed, 26 Nov 2008 19:09:59 +0000 Subject: [ekg2-devel] =?iso-8859-2?q?Kwestia_zgodno=B6ci_kodu_Ekg2_=28ANSI?= =?iso-8859-2?q?_C=29_z=09kompilatorem=3Fg++=3F=28C++=29?= In-Reply-To: <20081124220622.GA11101@darkjames.ath.cx> References: <20080901093431.D4BC417B34@toxygen.net> <20080926083217.GB23761@beczulka> <20081004221102.7beb73ba@gmail.com> <20081124191739.GA18725@beczulka> <20081124220622.GA11101@darkjames.ath.cx> Message-ID: <20081126190959.GF8612@beczulka> On Mon, Nov 24, 2008 at 11:06:22PM +0100, Jakub Zawadzki wrote: > On Mon, Nov 24, 2008 at 07:17:39PM +0000, Marcin Owsiany wrote: > > On Sat, Oct 04, 2008 at 10:11:02PM +0200, Daniel Dettlaff wrote: > > > Problemem na jaki trafiłem, jest niezgodność Ekg2-core z C++. > > > Chodzi o użycie w kodzie zarezerwowanych dla C++ słów: private i class. > > > > Zrobiłem gałąź "c++_renames" a w niej dwa commity: > > 4739 - zmiana "private" na "priv_data" > > 4740 - zmiana "class" na "klass" > > klass mi się nie podoba ;/ > w naglowkach jest class uzywane do wiadomosci, to moze mclass? Zmienione. > > ekg2 kompiluje się i działa mi conajmniej plugin gg, więc sądzę że nie > > wprowadziłem żadnej destabilizacji? > > Pewnie nie, moze trzeba bylo odrazu do trunka? Może tak, ale wolałem ostrożnie. > (Qt anyway wystarczylo jako hack zrobić pare #define'ow: > http://github.com/dmilith/ekg2-qt4/tree/master%2Fekg2_includes.h?raw=true Niby tak, ale IMHO lepiej zachować jednolitość API. Ale ale.. widzę że tam są jeszcze trzy inne napisy... :-/ -- Marcin Owsiany http://marcin.owsiany.pl/ GnuPG: 1024D/60F41216 FE67 DA2D 0ACA FC5E 3F75 D6F6 3A0D 8AA0 60F4 1216 From porridge w debian.org Wed Nov 26 20:54:12 2008 From: porridge w debian.org (Marcin Owsiany) Date: Wed, 26 Nov 2008 19:54:12 +0000 Subject: [ekg2-devel] =?iso-8859-2?q?Kwestia_zgodno=B6ci_kodu_Ekg2_=28ANSI?= =?iso-8859-2?q?_C=29=09z=3Fkompilatorem=3Fg++=3F=28C++=29?= In-Reply-To: <20081126190959.GF8612@beczulka> References: <20080901093431.D4BC417B34@toxygen.net> <20080926083217.GB23761@beczulka> <20081004221102.7beb73ba@gmail.com> <20081124191739.GA18725@beczulka> <20081124220622.GA11101@darkjames.ath.cx> <20081126190959.GF8612@beczulka> Message-ID: <20081126195412.GG8612@beczulka> On Wed, Nov 26, 2008 at 07:09:59PM +0000, Marcin Owsiany wrote: > Ale ale.. widzę że tam są jeszcze trzy inne napisy... :-/ Dorzuciłem zmianę "new" na "new_nick" lub "new_", w zależności od kontekstu. Co do strcasestr, to trzeba będzie wyrzucić przy przejściu na -std=gnu99 Co do "print"... hm.. zawsze mi się wydawało to zbyt ogólne.. zmienić na ekg_print? Acha, coś mi świta, że gdzieś jest jakaś "wersja ABI" którą trzeba podbić przy tego typu zmianach? -- Marcin Owsiany http://marcin.owsiany.pl/ GnuPG: 1024D/60F41216 FE67 DA2D 0ACA FC5E 3F75 D6F6 3A0D 8AA0 60F4 1216 From darkjames w darkjames.ath.cx Sun Nov 30 22:20:21 2008 From: darkjames w darkjames.ath.cx (Jakub Zawadzki) Date: Sun, 30 Nov 2008 22:20:21 +0100 Subject: [ekg2-devel] utf-8 i wielkosc liter (http://bugs.ekg2.org/ticket/25) Message-ID: <20081130212021.GA12048@darkjames.ath.cx> Helo, nie wiem czy ktos oglada BTSa, od czasu do czasu pojawia sie fajny bug do naprawienia: http://bugs.ekg2.org/ticket/25 (BTW. leafnode daloby sie ustawic forwarding na ekg2-devel?) Aktualnie korzystamy z strncasecmp_pl() (stuff.c) ktora jest identyczna z implementacja w ekg1 - umie tylko locale: C/POSIX/LATIN2 w glibie mamy g_utf8_casefold() ale my nie korzystamy z gliba... jest jesszcze wcscasecmp() (GNU extension) ale nie testowalem jak i czy w ogole dziala. Jako workaround mozna zrobic strncasecmp_pl() z polskimi znaczkami dla utf-8 -> bedzie troche lepiej niz teraz...