diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml index 17bc4c90e..8e1c089f5 100644 --- a/.gitea/workflows/build.yaml +++ b/.gitea/workflows/build.yaml @@ -4,33 +4,26 @@ name: 'Build system' on: - push: - branches: - - 'main' pull_request: branches: - - '**' + - 'main' jobs: codestyle: name: "Check kernel codestyle" - runs-on: ubuntu-latest + runs-on: kolibri-toolchain steps: - name: Checkout uses: actions/checkout@v4 - - name: Setup dependencies - run: | - sudo apt update && sudo apt install perl -y - - name: Check codestyle run: | find kernel/trunk -iname '*.asm' -or -iname '*.inc' -exec bash -c "echo {}; cat {} | perl .gitea/workflows/checker.pl" \; build: name: 'Build' - runs-on: ubuntu-latest + runs-on: kolibri-toolchain steps: - name: Checkout @@ -38,29 +31,28 @@ jobs: - name: Get describe id: vars - run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITEA_OUTPUT - - name: Setup dependencies + - name: Get toolchain hash + id: toolchain-hash run: | - cd /tmp - sudo apt update - sudo apt install p7zip-full fasm nasm make gcc gcc-multilib g++ g++-multilib mtools mkisofs parted gdisk -y - wget http://mirrors.kernel.org/ubuntu/pool/universe/t/tup/tup_0.8-1_amd64.deb - sudo apt install ./tup_0.8-1_amd64.deb -y + a=$(find ${{ gitea.workspace }}/programs/develop/cmm/ -type f -print0 | sort -z | xargs -0 sha1sum) + b=$(sha1sum ${{ gitea.workspace }}/programs/develop/ktcc/trunk/bin/kos32-tcc) + c=$(find ${{ gitea.workspace }}/programs/develop/objconv/ -type f -print0 | sort -z | xargs -0 sha1sum) + d=$(find ${{ gitea.workspace }}/programs/other/kpack/kerpack_linux/ -type f -print0 | sort -z | xargs -0 sha1sum) + e=$(find ${{ gitea.workspace }}/programs/other/kpack/linux/ -type f -print0 | sort -z | xargs -0 sha1sum) + f=$(find ${{ gitea.workspace }}/programs/develop/clink/ -type f -print0 | sort -z | xargs -0 sha1sum) + echo hash=$(echo $a $b $c $d $e $f | sha1sum | awk '{print $1}') >> $GITEA_OUTPUT - - name: Install GCC toolchain - run: | - chmod +x ${{ gitea.workspace }}/.gitea/workflows/install_kgcc - ${{ gitea.workspace }}/.gitea/workflows/install_kgcc - - - name: Install JWasm - run: | - cd /tmp - wget -O JWasm211bl.zip https://sourceforge.net/projects/jwasm/files/JWasm%20Linux%20binary/JWasm211bl.zip/download - unzip JWasm211bl.zip "jwasm" -d /home/autobuild/tools/win32/bin/ - chmod +x /home/autobuild/tools/win32/bin/jwasm + - name: Restore toolchain + id: cache-toolchain + uses: actions/cache/restore@v4 + with: + path: /home/autobuild + key: kolibri-toolchain-${{ steps.toolchain-hash.outputs.hash }} - name: Build and install C-- + if: steps.cache-toolchain.outputs.cache-hit != 'true' run: | cd ${{ gitea.workspace }}/programs/develop/cmm/ make -f Makefile.lin32 @@ -70,105 +62,152 @@ jobs: make -f Makefile.lin32 clean - name: Install TCC + if: steps.cache-toolchain.outputs.cache-hit != 'true' run: | cp ${{ gitea.workspace }}/programs/develop/ktcc/trunk/bin/kos32-tcc /home/autobuild/tools/win32/bin/kos32-tcc chmod +x /home/autobuild/tools/win32/bin/kos32-tcc - - name: Compile objconv + - name: Build and install objconv + if: steps.cache-toolchain.outputs.cache-hit != 'true' run: | cd ${{ gitea.workspace }}/programs/develop/objconv/ g++ -o /home/autobuild/tools/win32/bin/objconv -O2 *.cpp chmod +x /home/autobuild/tools/win32/bin/objconv - - name: Compile kerpack + - name: Build and install kerpack + if: steps.cache-toolchain.outputs.cache-hit != 'true' run: | cd ${{ gitea.workspace }}/programs/other/kpack/kerpack_linux/ make chmod +x kerpack mv kerpack /home/autobuild/tools/win32/bin/. - - name: Compile kpack + - name: Build and install kpack + if: steps.cache-toolchain.outputs.cache-hit != 'true' run: | cd ${{ gitea.workspace }}/programs/other/kpack/linux/ bash build.sh chmod +x kpack mv kpack /home/autobuild/tools/win32/bin/. - - name: Compile clink + - name: Build and install clink + if: steps.cache-toolchain.outputs.cache-hit != 'true' run: | - cd ${{ github.workspace }}/programs/develop/clink + cd ${{ gitea.workspace }}/programs/develop/clink gcc main.c -o clink chmod a+x clink mv clink /home/autobuild/tools/win32/bin/clink + - name: Prepare cache folder + run: | + rm /home/autobuild + mv /root/autobuild /home/autobuild + if: steps.cache-toolchain.outputs.cache-hit != 'true' + + - name: Save toolchain + if: steps.cache-toolchain.outputs.cache-hit != 'true' + uses: actions/cache/save@v4 + with: + path: /home/autobuild + key: kolibri-toolchain-${{ steps.toolchain-hash.outputs.hash }} + - name: Configure tup run: | cd ${{ gitea.workspace }} - export ROOT=${{ gitea.workspace }} - cd $ROOT - echo "CONFIG_KPACK_CMD=&& kpack --nologo %o" > tup.config - echo "CONFIG_KERPACK_CMD=&& kerpack %o" >> tup.config - echo "CONFIG_PESTRIP_CMD=&& EXENAME=%o fasm $ROOT/data/common/pestrip.asm %o" >> tup.config - echo "CONFIG_NO_MSVC=full" >> tup.config - echo "CONFIG_INSERT_REVISION_ID=1" >> tup.config + export ROOT=${{ gitea.workspace }} + echo "CONFIG_KPACK_CMD= && kpack --nologo %o" | tee en_US.config ru_RU.config es_ES.config + echo "CONFIG_KERPACK_CMD= && kerpack %o" | tee -a en_US.config ru_RU.config es_ES.config + echo "CONFIG_PESTRIP_CMD= && EXENAME=%o fasm $ROOT/data/common/pestrip.asm %o" | tee -a en_US.config ru_RU.config es_ES.config + echo "CONFIG_NO_MSVC=full" | tee -a en_US.config ru_RU.config es_ES.config + echo "CONFIG_INSERT_REVISION_ID=1" | tee -a en_US.config ru_RU.config es_ES.config tup -v tup init - - name: Build KolibriOS (en_US) + # Configure en_US + echo "CONFIG_LANG=en_US" >> en_US.config + echo "CONFIG_BUILD_TYPE=en_US" >> en_US.config + tup variant en_US.config + + # Configure ru_RU + echo "CONFIG_LANG=ru_RU" >> ru_RU.config + echo "CONFIG_BUILD_TYPE=ru_RU" >> ru_RU.config + tup variant ru_RU.config + + # Configure es_ES + echo "CONFIG_LANG=es_ES" >> es_ES.config + echo "CONFIG_BUILD_TYPE=es_ES" >> es_ES.config + tup variant es_ES.config + + # -------------------------- Build en_US ------------------------- # + - name: (en_US) Build KolibriOS run: | - cp tup.config tup.config.en_US - echo "CONFIG_LANG=en_US" >> tup.config.en_US - echo "CONFIG_BUILD_TYPE=en_US" >> tup.config.en_US - export PATH=/home/autobuild/tools/win32/bin:$PATH - tup generate --config tup.config.en_US build-en_US.sh - ./build-en_US.sh + tup build-en_US - - name: Upload floppy image (en_US) + - name: (en_US) Upload floppy image uses: actions/upload-artifact@v3 with: name: kolibrios-en_US-${{ steps.vars.outputs.sha_short }}.img - path: data/kolibri.img + path: build-en_US/data/kolibri.img - - name: Upload CD image (en_US) + - name: (en_US) Upload CD image uses: actions/upload-artifact@v3 with: name: kolibrios-en_US-${{ steps.vars.outputs.sha_short }}.iso - path: data/kolibri.iso + path: build-en_US/data/kolibri.iso - - name: Upload raw image (en_US) + - name: (en_US) Upload raw image uses: actions/upload-artifact@v3 with: name: kolibrios-en_US-${{ steps.vars.outputs.sha_short }}.raw - path: data/kolibri.raw + path: build-en_US/data/kolibri.raw - - name: Build KolibriOS (ru_RU) + # -------------------------- Build ru_RU ------------------------- # + - name: (ru_RU) Build KolibriOS run: | - git clean -d -x -f -e tup.config - cp tup.config tup.config.ru_RU - echo "CONFIG_LANG=ru_RU" >> tup.config.ru_RU - echo "CONFIG_BUILD_TYPE=ru_RU" >> tup.config.ru_RU - export PATH=/home/autobuild/tools/win32/bin:$PATH - tup generate --config tup.config.ru_RU build-ru_RU.sh - ./build-ru_RU.sh + tup build-ru_RU - - name: Upload floppy image (ru_RU) + - name: (ru_RU) Upload floppy image uses: actions/upload-artifact@v3 with: name: kolibrios-ru_RU-${{ steps.vars.outputs.sha_short }}.img - path: data/kolibri.img + path: build-ru_RU/data/kolibri.img - - name: Upload CD image (ru_RU) + - name: (ru_RU) Upload CD image uses: actions/upload-artifact@v3 with: name: kolibrios-ru_RU-${{ steps.vars.outputs.sha_short }}.iso - path: data/kolibri.iso + path: build-ru_RU/data/kolibri.iso - - name: Upload raw image (ru_RU) + - name: (ru_RU) Upload raw image uses: actions/upload-artifact@v3 with: name: kolibrios-ru_RU-${{ steps.vars.outputs.sha_short }}.raw - path: data/kolibri.raw + path: build-ru_RU/data/kolibri.raw + + # -------------------------- Build es_ES ------------------------- # + - name: (es_ES) Build KolibriOS + run: | + export PATH=/home/autobuild/tools/win32/bin:$PATH + tup build-es_ES + + - name: (es_ES) Upload floppy image + uses: actions/upload-artifact@v3 + with: + name: kolibrios-es_ES-${{ steps.vars.outputs.sha_short }}.img + path: build-es_ES/data/kolibri.img + + - name: (es_ES) Upload CD image + uses: actions/upload-artifact@v3 + with: + name: kolibrios-es_ES-${{ steps.vars.outputs.sha_short }}.iso + path: build-es_ES/data/kolibri.iso + + - name: (es_ES) Upload raw image + uses: actions/upload-artifact@v3 + with: + name: kolibrios-es_ES-${{ steps.vars.outputs.sha_short }}.raw + path: build-es_ES/data/kolibri.raw diff --git a/programs/cmm/browser/TWB/TWB.c b/programs/cmm/browser/TWB/TWB.c index 5d1159c8d..49d610519 100644 --- a/programs/cmm/browser/TWB/TWB.c +++ b/programs/cmm/browser/TWB/TWB.c @@ -101,16 +101,16 @@ void TWebBrowser::SetPageDefaults() img_url.drop(); text_colors.drop(); text_colors.add(0); - if (!secondrun) { - bg_colors.drop(); - bg_colors.add(DEFAULT_BG_COL); - } else { + if (secondrun) { + canvas.Init(list.x, list.y, list.w, math.max(list.visible, list.count)); canvas.Fill(0, bg_colors.get(0)); } + bg_colors.drop(); + bg_colors.add(DEFAULT_BG_COL); header = NULL; draw_y = BODY_MARGIN; draw_x = left_gap = BODY_MARGIN; - draw_w = list.w - BODY_MARGIN; + draw_w = list.w - BODY_MARGIN - BODY_MARGIN; linebuf = 0; redirect = '\0'; list.SetFont(8, 14, 10011000b); @@ -136,8 +136,6 @@ void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){ dword bufpos; bufsize = _bufsize; - if (list.w!=canvas.bufw) canvas.Init(list.x, list.y, list.w, 400*20); - if (bufpointer == _bufpointer) { custom_encoding = cur_encoding; } else { @@ -156,7 +154,6 @@ void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){ } } - table.cols.drop(); secondrun = false; @@ -219,19 +216,15 @@ void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){ AddCharToTheLine(ESBYTE[bufpos]); } + RenderTextbuf(); + list.count = draw_y + style.cur_line_h; + list.CheckDoesValuesOkey(); + anchors.current = NULL; + if (!secondrun) { secondrun = true; goto _PARSE_START_; } - - RenderTextbuf(); - list.count = draw_y + style.cur_line_h; - - canvas.bufh = math.max(list.visible, list.count); - buf_data = realloc(buf_data, canvas.bufh * canvas.bufw * 4 + 8); - - list.CheckDoesValuesOkey(); - anchors.current = NULL; if (!header) { strncpy(#header, #version, sizeof(TWebBrowser.header)-1); DrawTitle(#header); diff --git a/programs/cmm/browser/TWB/render.h b/programs/cmm/browser/TWB/render.h index 80f3be413..f1968fb56 100644 --- a/programs/cmm/browser/TWB/render.h +++ b/programs/cmm/browser/TWB/render.h @@ -22,11 +22,10 @@ void TWebBrowser::RenderLine(dword _line) zoom = list.font_w / BASIC_CHAR_W; //there is some shit happens!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - if (pw > draw_w) { - //draw_w = pw; - NewLine(); + if (pw > draw_w + BODY_MARGIN) { + //debugln("shit"); } - + if (debug_mode) { canvas.DrawBar(draw_x, draw_y, pw, list.item_h, 0xCCCccc); debugln(_line); @@ -83,12 +82,13 @@ void TWebBrowser::RenderTextbuf() //debugln(" \\n"); - //Is a new line fits in the current line? + //Is a new line fits in the maximum line width? if (br * list.font_w + draw_x - left_gap >= draw_w) { br = draw_w - draw_x + left_gap /list.font_w; + if (br < 0) br = 0; while(br) { if (ESBYTE[lbp + br]==' ') { - br++; + if (br < len) br++; break; } br--; @@ -96,7 +96,16 @@ void TWebBrowser::RenderTextbuf() } //Maybe a new line is too big for the whole new line? Then we have to split it if (!br) && (len * list.font_w >= draw_w) { + //debugln("bigbr"); + //debugval("draw_x", draw_x); + //debugval("draw_w", draw_w); br = draw_w - draw_x / list.font_w; + //debugval("cut into 1", br * list.font_w); + if (br < 0) { + NewLine(); + br = draw_w - draw_x / list.font_w; + //debugval("cut into 2", br * list.font_w); + } } if (br) { @@ -120,9 +129,13 @@ void TWebBrowser::NewLine() if (draw_x==left_gap) && (draw_y==BODY_MARGIN) return; if (t_html) && (!t_body) return; - + if (draw_x == style.tag_list.level * 5 * list.font_w + left_gap) { - if (!empty_line) empty_line=true; else return; + if (!empty_line) { + empty_line=true; + } else { + return; + } } else { empty_line = false; } diff --git a/programs/cmm/browser/TWB/set_style.h b/programs/cmm/browser/TWB/set_style.h index 8d140fadd..1f0e0393d 100644 --- a/programs/cmm/browser/TWB/set_style.h +++ b/programs/cmm/browser/TWB/set_style.h @@ -61,7 +61,7 @@ void TWebBrowser::SetStyle() void TWebBrowser::tag_p() { IF (tag.prior[0] == 'h') || (streq(#tag.prior,"td")) return; - if (!tag.opened) && (streq(#tag.prior,"p")) return; + IF (!tag.opened) && (streq(#tag.prior,"p")) return; NewLine(); } @@ -119,6 +119,7 @@ void TWebBrowser::tag_iframe() void TWebBrowser::tag_a() { + if (!secondrun) return; if (tag.opened) { if (tag.get_value_of("href")) && (!strstr(tag.value,"javascript:")) @@ -133,6 +134,7 @@ void TWebBrowser::tag_a() void TWebBrowser::tag_meta_xml() { + if (secondrun) return; if (custom_encoding == -1) if (tag.get_value_of("charset")) || (tag.get_value_of("content")) || (tag.get_value_of("encoding")) { @@ -187,7 +189,7 @@ void TWebBrowser::tag_ol_ul_dt() void TWebBrowser::tag_li() { - if (style.nav) return; + //if (style.nav) return; if (tag.opened) { if (!style.tag_list.level) style.tag_list.upd_level(1, 'u'); if (!style.pre) NewLine(); @@ -216,13 +218,10 @@ void TWebBrowser::tag_hr() void TWebBrowser::tag_body() { t_body = tag.opened; - if (tag.get_value_of("link")) link_color_default = GetColor(tag.value); - if (tag.get_value_of("alink")) link_color_active = GetColor(tag.value); - if (tag.get_value_of("text")) text_colors.set(0, GetColor(tag.value)); - if (tag.get_value_of("bgcolor")) { - bg_colors.set(0, GetColor(tag.value)); - canvas.Fill(0, bg_colors.get(0)); - } + if (tag.get_value_of("link")) link_color_default = GetColor(tag.value); + if (tag.get_value_of("alink")) link_color_active = GetColor(tag.value); + if (tag.get_value_of("text")) text_colors.set(0, GetColor(tag.value)); + if (tag.get_value_of("bgcolor")) bg_colors.set(0, GetColor(tag.value)); // Autodetecting encoding if no encoding was set if (tag.opened) && (custom_encoding==-1) && (cur_encoding == CH_CP866) { if (strstr(bufpointer, "\208\190")) ChangeEncoding(CH_UTF8); @@ -250,10 +249,10 @@ void TWebBrowser::tag_h1234_caption() NewLine(); } if (tag.is("h1")) { - list.SetFont(BASIC_CHAR_W*2, 14+12, 10011001b); + list.SetFont(BASIC_CHAR_W*2, 14+14, 10011001b); style.b = true; } else if (tag.is("h2")) { - list.SetFont(BASIC_CHAR_W*2, 14+12, 10011001b); + list.SetFont(BASIC_CHAR_W*2, 14+14, 10011001b); } else { list.SetFont(6*2, 9+7, 10001001b); } @@ -294,7 +293,7 @@ void TWebBrowser::tag_img() if (!strcmp(tag.value + strrchr(tag.value, '.'), "webp")) goto NOIMG; strlcpy(#img_path, tag.value, sizeof(img_path)-1); - replace_char(#img_path, ' ', '\0', sizeof(img_path)); + replace_char(#img_path, ' ', '\0', sizeof(img_path)-1); get_absolute_url(#img_path, history.current()); if (check_is_the_adress_local(#img_path)) { @@ -331,31 +330,28 @@ NOIMG: text_colors.pop(); } - - - - struct TABLE { - int count; int depth; int margin; collection_int cols; - collection_int width; } table; - -int tr_pos, td_pos; -int row_start_y; -int colcount; -dword tallest_cell_in_row; +unsigned table_id; +unsigned colcount; +unsigned tr_pos; +unsigned td_pos; +unsigned row_start_y; +unsigned tallest_cell_in_row; +unsigned cur_cell_w; void TWebBrowser::tag_table_reset() { - table.depth = 0; - table.count = 0; + table_id = 0; colcount = 0; tr_pos = 0; td_pos = 0; + table.depth = 0; + cur_cell_w = 0; } void TWebBrowser::tag_table() @@ -369,15 +365,15 @@ void TWebBrowser::tag_table() if(tag.opened) { table.depth++; if (table.depth==1) { - table.count++; + table_id++; colcount = 0; td_pos = 0; row_start_y = draw_y; if (tag.get_number_of("width")) { if (strchr(tag.value, '%')) tag.number = list.w * tag.number / 100; - table.width.set(table.count, math.min(tag.number,list.w)); + cur_cell_w = math.min(tag.number,list.w); } else { - table.width.set(table.count, list.w); + cur_cell_w = list.w; } } } else { @@ -436,26 +432,17 @@ void TWebBrowser::tag_table() if (!tr_pos) goto _TR_FIX; - /* - if (tag.opened) { - if (tag.get_value_of("bgcolor")) { - bg_colors.add(GetColor(tag.value)); - } else { - bg_colors.add(bg_colors.get(0)); - } - } */ - tallest_cell_in_row = math.max(draw_y+style.cur_line_h-list.item_h+1, tallest_cell_in_row); style.cur_line_h = list.item_h; - if (tag.opened) { - + if (tag.opened) + { if (!td_pos) { - table.margin = list.w - table.width.get(table.count) / 2 + BODY_MARGIN; + table.margin = list.w - cur_cell_w / 2 + BODY_MARGIN; draw_x = left_gap = table.margin; - draw_w = table.width.get(table.count) - BODY_MARGIN; + draw_w = cur_cell_w - BODY_MARGIN; } else { draw_x = left_gap = left_gap + draw_w; - draw_w = table.width.get(table.count) - left_gap + table.margin - BODY_MARGIN; + draw_w = cur_cell_w - left_gap + table.margin - BODY_MARGIN; } if (EAX = table.cols.get(tr_pos-1)-td_pos) { @@ -466,20 +453,18 @@ void TWebBrowser::tag_table() } if (table.cols.get(tr_pos-1)-td_pos>1) && (tag.get_number_of("width")) { if (strchr(tag.value, '%')) { - tag.number = table.width.get(table.count) - table.margin - 23 - left_gap * tag.number / 100; + tag.number = cur_cell_w - table.margin - 23 - left_gap * tag.number / 100; } if (tag.number < draw_w) draw_w = tag.number; } draw_y = row_start_y; - //canvas.WriteText(draw_x, draw_y, 10001001b, 0x0000FE, itoa(draw_x), NULL); - //canvas.WriteText(draw_x, draw_y+20, 10001001b, 0xFF0000, itoa(draw_w), NULL); td_pos++; } } } - if (draw_x > table.width.get(table.count)) { + if (draw_x > cur_cell_w) { draw_x = left_gap = table.margin; - draw_w = table.width.get(table.count) - table.margin - 23 - left_gap; + draw_w = cur_cell_w - table.margin - 23 - left_gap; table.depth = 0; NewLine(); if (debug_mode) { @@ -487,11 +472,8 @@ void TWebBrowser::tag_table() canvas.DrawBar(0, draw_y, 20, 20, 0xFF0000); } } - /* - if (left_gap + draw_w > list.w) { - draw_w = list.w - left_gap; - if (debug_mode) debugln("anomaly draw_W"); - } - */ -} - + //if (left_gap + draw_w > list.w) { + // draw_w = list.w - left_gap; + // if (debug_mode) debugln("anomaly draw_W"); + //} +} \ No newline at end of file diff --git a/programs/cmm/browser/WebView.c b/programs/cmm/browser/WebView.c index 6ecfb9986..2a43dc97d 100644 --- a/programs/cmm/browser/WebView.c +++ b/programs/cmm/browser/WebView.c @@ -1,4 +1,4 @@ -//Copyright 2007-2021 by Veliant & Leency +//Copyright 2007-2025 by Veliant & Leency //Asper, lev, Lrz, Barsuk, Nable, hidnplayr... //BUGS diff --git a/programs/cmm/browser/const.h b/programs/cmm/browser/const.h index 7b5ce7496..f6b155a59 100644 --- a/programs/cmm/browser/const.h +++ b/programs/cmm/browser/const.h @@ -112,4 +112,4 @@ char editbox_icons[] = FROM "res/editbox_icons.raw"; #define DEFAULT_URL URL_SERVICE_HOMEPAGE -char version[]="WebView 3.8"; \ No newline at end of file +char version[]="WebView 3.82"; \ No newline at end of file diff --git a/programs/cmm/browser/res/homepage_en.htm b/programs/cmm/browser/res/homepage_en.htm index 77f5f175c..f5107e5bf 100644 --- a/programs/cmm/browser/res/homepage_en.htm +++ b/programs/cmm/browser/res/homepage_en.htm @@ -4,10 +4,10 @@
Welcome to WebView a Text-Based Browser. -Bookmarks: -1. KolibriOS homepage +KolibriOS Bookmarks: +1. Homepage 2. Night-builds -3. KolibriOS FTP +3. FTP Server By the way, • You can check for browser updates from the main menu. diff --git a/programs/cmm/browser/res/homepage_ru.htm b/programs/cmm/browser/res/homepage_ru.htm index 6db213579..2639aa66f 100644 --- a/programs/cmm/browser/res/homepage_ru.htm +++ b/programs/cmm/browser/res/homepage_ru.htm @@ -1,16 +1,15 @@ - - - -࠭ - -: -1. 樠 ᠩ KolibriOS -2. ᡮન -3. KolibriOS FTP + +࠭ +⥪⮢ 㧥 WebView! + + KolibriOS: , • 稥 • ᪠ Google ᭮ ப Ctrl+Enter • F6 ६頥 ⥪⮢ . • ࠭, ⮣ ࠢ 㣫 . - + diff --git a/programs/develop/libraries/console_coff/conscrl.inc b/programs/develop/libraries/console_coff/conscrl.inc index 24944515c..ea65dab51 100644 --- a/programs/develop/libraries/console_coff/conscrl.inc +++ b/programs/develop/libraries/console_coff/conscrl.inc @@ -1,5 +1,5 @@ -; ᯮ⥫ 䠩 console.inc - ᠭ scrollbar -; ⨪쭠 ப⪠ +; Helper file for console.inc - scrollbar definition +; Vertical scrolling virtual at 0 file 'conscrlv.bmp', 36h ; sanity check @@ -28,7 +28,7 @@ if con.vscroll_btn_height*4 + con.vscroll_bgr_height*2 \ error 'conscrlv.bmp: invalid dimensions!' end if -; 㦠 BMP, 室 ८ࠧ 7- 㭪樨 +; Load BMP data, converting it into data for sysfn 7 on the fly con.vscroll: repeat con.vscroll_height file 'conscrlv.bmp':36h + ((con.vscroll_width*3+3) and not 3)*(con.vscroll_height - %),\ diff --git a/programs/develop/libraries/console_coff/console.asm b/programs/develop/libraries/console_coff/console.asm index 1098b4db9..0163ffcf5 100644 --- a/programs/develop/libraries/console_coff/console.asm +++ b/programs/develop/libraries/console_coff/console.asm @@ -1,6 +1,7 @@ -; 㭪樨 ࠡ ᮫ ணࠬ +; SPDX-License-Identifier: GPL-2.0 +; Functions for interaction with the console for KolibriOS programs ; diamond, 2006-2008 - +; Copyright (C) 2006-2025 KolibriOS team format MS COFF @@ -56,7 +57,7 @@ START: or eax, -1 ret 4 -; 樠 ᮫ +; Console initialization ; void __stdcall con_init(dword wnd_width, dword wnd_height, ; dword scr_width, dword scr_height, const char* title); @@ -271,13 +272,13 @@ con_write_length: pop esi ebx ret 8 -; ᨬ -con.printfc.normal = 0 ; ଠ ᨬ +; Each character is classified as one of the following +con.printfc.normal = 0 ; normal character con.printfc.percent = 1 ; '%' con.printfc.dot = 2 ; '.' con.printfc.asterisk = 3 ; '*' con.printfc.zero = 4 ; '0' -con.printfc.digit = 5 ; 㫥 +con.printfc.digit = 5 ; non-null digit con.printfc.plus = 6 ; '+' con.printfc.minus = 7 ; '-' con.printfc.sharp = 8 ; '#' @@ -376,24 +377,24 @@ con_printf: jmp .normal .spec_begin: xor ebx, ebx -; bl = ⨯ 樨: -; 0 = 砫 -; 1 = ⠭ 騩 0 ᯥ䨪樨 ଠ -; 2 = ⠥ ਭ -; 3 = ⠥ 筮 -; 4 = ⠭ ࠧ 㬥 -; 5 = ⠥ ⨯ -; bh = 䫠: -; 1 = 䫠 '#', 뢮 0/0x/0X -; 2 = 䫠 '-', ࠢ -; 4 = 䫠 '0', ﬨ -; 8 = 䫠 'h', ⪨ 㬥 +; bl = position type: +; 0 = start +; 1 = read leading 0 in format specification +; 2 = read width field +; 3 = read precision field +; 4 = read argument size field +; 5 = read type field +; bh = flags: +; 1 = flag '#', output 0/0x/0X +; 2 = flag '-', align left +; 4 = flag '0', zero padding +; 8 = flag 'h', short argument push -1 ; dword [esp+8] = precision push -1 ; dword [esp+4] = width push 0 -; byte [esp] = 䫠 0/'+'/' ' +; byte [esp] = flag 0/'+'/' ' .spec: xor eax, eax lodsb @@ -529,7 +530,7 @@ con_printf: @@: push edx xor edx, edx -; eax, ᭮ ⥬ ecx +; number in eax, radix in ecx @@: cmp dword [esp+16+8], 0 jnz .print_num @@ -1777,10 +1778,10 @@ con.data2image: mov al, [esi+1] push eax and al, 0xF - mov ebx, eax ; 梥 ⥪ + mov ebx, eax ; text color pop eax shr al, 4 - mov ebp, eax ; 梥 䮭 + mov ebp, eax ; background color sub ebx, ebp lodsb inc esi @@ -2188,7 +2189,7 @@ con_gets2: sub ebx, 1 jle .ret mov byte [esi], 0 - xor ecx, ecx ; 㦥 ப + xor ecx, ecx ; length of the already entered string call con.get_data_ptr .loop: call con_getch2 @@ -2596,15 +2597,15 @@ con.wake: popad ret -; ⮪ ᮫. ࠡ뢠 뢮. +; Console window thread. Handles input and output. con.thread: -; ⮪ ॠ IPC, ᯮ ⮫쪮 ⮣, ⮡ 뫮 "ࠧ㤨" +; The thread responds to IPC, which is used only so that it can be "waken up" push 40 pop eax push 0x80000067 ; program dont getting events mouse, when it dont active pop ebx int 0x40 - xor ebx,ebx ;clear ebx + xor ebx,ebx ; clear ebx mov al, 60 mov bl, 1 mov ecx, con.ipc_buf @@ -3212,7 +3213,7 @@ con.draw_image: @@: int 0x40 push edx -; 塞 㭪 +; Calculate the height of the slider mov ax, dx sub eax, con.vscroll_btn_height mov ecx, eax @@ -3222,7 +3223,7 @@ con.draw_image: jae @f mov al, 5 @@: -; eax = 㭪. 塞 㭪 +; eax = slider height. Calculate the slider position mov [con.vscrollbar_size], eax xchg eax, ecx sub eax, ecx @@ -3232,7 +3233,7 @@ con.draw_image: div ebx pop edx push edx -; ecx = 㭪, eax = +; ecx = slider height, eax = position add eax, con.vscroll_btn_height mov [con.vscrollbar_pos], eax mov ebx, con.vscroll_bgr2 @@ -3331,8 +3332,8 @@ con.extended_numlock: cursor_esc dd 27 + ('[' shl 8) -; ⥪饩 ॠ樨 祭 㬮砭 ⠪. -; 饬 , , 뢠 ࠬ ini-䠩 console.ini. +; In the current implementation, the default values are: +; In the future, they may be read as parameters from the console.ini ini file. con.def_wnd_width dd 80 con.def_wnd_height dd 25 con.def_scr_width dd 80 diff --git a/programs/develop/libraries/console_coff/console_ru.txt b/programs/develop/libraries/console_coff/console_ru.txt index dd74634a3..c494d3cee 100644 --- a/programs/develop/libraries/console_coff/console_ru.txt +++ b/programs/develop/libraries/console_coff/console_ru.txt @@ -1,91 +1,91 @@ -console.obj : +console.obj экспортирует следующие функции: -typedef unsigned long dword; /* 32- */ -typedef unsigned short word; /* 16- */ +typedef unsigned long dword; /* 32-битное беззнаковое целое */ +typedef unsigned short word; /* 16-битное беззнаковое целое */ void __stdcall con_init(dword wnd_width, dword wnd_height, dword scr_width, dword scr_height, const char* title); - . . -wnd_width, wnd_height - ( ) - ; -scr_width, scr_height - ( ) ; - 4 -1 (=0xFFFFFFFF) - - ; -title - . +Инициализация консоли. Вызывается один раз в начале программы. +wnd_width, wnd_height - высота и ширина (в символах) видимой в окне консоли + области; +scr_width, scr_height - высота и ширина (в символах) всей консоли; +любые из первых 4 параметров могут быть установлены в -1 (=0xFFFFFFFF) + - использовать значения по умолчанию; +title - заголовок окна консоли. void __stdcall con_exit(bool bCloseWindow); - . () bCloseWindow -, , - , " [Finished]". +Вызывается при завершении программы. Если (байтовый) параметр bCloseWindow +нулевой, то окно консоли остаётся на экране до того момента, как пользователь +пожелает закрыть его, при этом к заголовку добавляется строка " [Finished]". void __stdcall con_set_title(const char* title); - . +Устанавливает новый заголовок окна консоли. void __stdcall con_write_asciiz(const char* string); - ASCIIZ- , . +Выводит ASCIIZ-строку в консоль в текущую позицию, продвигает текущую позицию. void __stdcall con_write_string(const char* string, dword length); - con_write_asciiz, length . +Аналогично con_write_asciiz, но выводит ровно length символов. int __cdecl con_printf(const char* format, ...) - printf ANSI C. +Стандартная printf из ANSI C. dword __stdcall con_get_flags(void); - . +Получает значение флагов вывода. dword __stdcall con_set_flags(dword new_flags); - . . - ( ): -/* */ +Устанавливает значение флагов вывода. Возвращает старое значение. +Флаги (битовая маска): +/* цвет текста */ #define CON_COLOR_BLUE 1 #define CON_COLOR_GREEN 2 #define CON_COLOR_RED 4 #define CON_COLOR_BRIGHT 8 -/* */ +/* цвет фона */ #define CON_BGR_BLUE 0x10 #define CON_BGR_GREEN 0x20 #define CON_BGR_RED 0x40 #define CON_BGR_BRIGHT 0x80 -/* */ +/* управление выводом */ #define CON_IGNORE_SPECIALS 0x100 -/* , : - 10 ('\n') - - 13 ('\r') - - 8 ('\b') - ( ) - 9 ('\t') - - 27 ('\033'='\x1B') - Esc-; - . */ -/* Esc-: - Esc[; ; m - : - , ; - 0 = ( ) - 1 = - 5 = - 7 = ( ) - 30 = - 31 = - 32 = - 33 = - 34 = - 35 = - 36 = - 37 = - 40 = - 41 = - 42 = - 43 = - 44 = - 45 = - 46 = - 47 = - 5 : - Esc[ A - - Esc[ B - - Esc[ C - - Esc[ D - +/* Если флаг сброшен, функция интерпретирует специальные символы: + 10 ('\n') - перевод в начало следующей строки + 13 ('\r') - перевод в начало текущей строки + 8 ('\b') - забой (на символ назад) + 9 ('\t') - табуляция + 27 ('\033'='\x1B') - начало Esc-последовательности; +иначе выводит их как обычные символы. */ +/* Поддерживаемые Esc-последовательности: + Esc[ ; ; m - выбор атрибутов символов: + можно указывать один, два или три кода в любом порядке; + 0 = нормальное изображение (белые символы на чёрном фоне) + 1 = выделение яркостью + 5 = яркий фон + 7 = реверсное изображение (чёрные символы на белом фоне) + 30 = чёрные символы + 31 = красные символы + 32 = зелёные символы + 33 = жёлтые символы + 34 = синие символы + 35 = фиолетовые символы + 36 = бирюзовые символы + 37 = белые символы + 40 = чёрный фон + 41 = красный фон + 42 = зелёный фон + 43 = жёлтый фон + 44 = синий фон + 45 = фиолетовый фон + 46 = бирюзовый фон + 47 = белый фон + Следующие последовательности появились в версии 5 библиотеки: + Esc[ A - переместить курсор на строк вверх + Esc[ B - переместить курсор на строк вниз + Esc[ C - переместить курсор на позиций вправо + Esc[ D - переместить курсор на позиций влево Esc[ ; H = Esc[ ; f - - , - Esc[2J - , - 9 : + установить курсор в позицию с координатами , + Esc[2J - очистить экран, переместить курсор в левый верхний угол + Следующие последовательности появились в версии 9 библиотеки: Esc[J or Esc[0J - Erase everything below cursor Esc[1J - Erase everything above cursor Esc[K - Erase in line @@ -107,83 +107,83 @@ dword __stdcall con_set_flags(dword new_flags); Esc]2 ST/BEL - Implemented identical as Esc]0. */ -/* ; 6 ; - con_set_flags */ +/* сигнал о закрытии окна консоли; появился в версии 6 библиотеки; + флаг игнорируется функцией con_set_flags */ #define CON_WINDOW_CLOSED 0x200 - = 7. +Значение по умолчанию для флагов = 7. int __stdcall con_get_font_height(void); - . +Возвращает значение высоты шрифта. int __stdcall con_get_cursor_height(void); - . +Получает значение высоты курсора. int __stdcall con_set_cursor_height(int new_height); - . . - ( 0 font_height-1) -. - 0 . - - 15% . +Устанавливает значение высоты курсора. Возвращает старое значение. +Попытка установить значение вне корректного интервала (от 0 до font_height-1) +игнорируется. +Курсор высоты 0 не отображается на экране. +Значение высоты по умолчанию - 15% от высоты шрифта. int __stdcall con_getch(void); - . - ASCII-. -(, Fx ) 0, - ( DOS- ). - 7 , - 0. +Считывает один символ с клавиатуры. +Для обычных символов возвращается ASCII-код. Для расширенных символов +(например, Fx и стрелочек) первый вызов функции возвращает 0, +а повторный вызов возвращает расширенный код (подобно DOS-функциям ввода). +Начиная с версии 7 библиотеки, после закрытия окна консоли возвращается +значение 0. word __stdcall con_getch2(void); - . ASCII- -(0 ), - -( BIOS- ). - 7 , - 0. +Считывает один символ с клавиатуры. Младший байт содержит ASCII-код клавиши +(0 для расширенных символов), старший - расширенный код +(подобно BIOS-функциям ввода). +Начиная с версии 7 библиотеки, после закрытия окна консоли возвращается +значение 0. int __stdcall con_kbhit(void); - 1, - , 0 . - con_getch con_getch2. - 6 , 1. +Возвращает 1, если какая-то клавиша была нажата, 0 иначе. Для считывания +нажатой клавиши предназначены функции con_getch и con_getch2. +Начиная с версии 6 библиотеки, после закрытия окна консоли всегда возвращает 1. char* __stdcall con_gets(char* str, int n); - . - , n-1 ( , - ). -str. . - 6 , - NULL, . -6 . +Считывает строку с клавиатуры. Ввод прерывается при поступлении символа +новой строки, а также по прочтении n-1 символа (в зависимости от того, что +произойдёт раньше). В первом случае символ новой строки также записывается в +str. Считанная строка дополняется нулевым символом. +Начиная с версии 6 библиотеки, функция возвращает указатель на введённую +строку при успешном чтении и NULL, если окно консоли было закрыто. До версии +6 возвращаемое значение было неопределено. typedef int (__stdcall * con_gets2_callback)(int keycode, char** pstr, int* pn, int* ppos); char* __stdcall con_gets2(con_gets2_callback callback, char* str, int n); - 4 . - con_gets , - , callback- -( , , up/down tab -). - , - . - (, - ), , - . - : 0= ; 1= , - ; 2= , ; -3= . - 6 , - NULL, . -6 . +Функция появилась в версии 4 библиотеки. +Полностью аналогична con_gets за исключением того, что когда пользователь +нажимает нераспознанную клавишу, вызывается указанная callback-процедура +(которая может, например, обрабатывать up/down для истории ввода и tab для +автодополнения). Процедуре передаётся код клавиши и три указателя - на строку, +на лимит и на текущую позицию в строке. Процедура может менять содержимое +строки и может менять саму строку (например, перераспределить память для +увеличения лимита), лимит, позицию в строке - для этого и передаются указатели. +Возвращаемое значение: 0=строка не менялась; 1=строка изменилась, необходимо +удалить старую и вывести новую; 2=строка изменилась, необходимо её вывести; +3=немедленно выйти из функции. +Начиная с версии 6 библиотеки, функция возвращает указатель на введённую +строку при успешном чтении и NULL, если окно консоли было закрыто. До версии +6 возвращаемое значение было неопределено. void __stdcall con_cls(); - 5 . - . +Функция появилась в версии 5 библиотеки. +Очищает экран и переводит курсор в левый верхний угол. void __stdcall con_get_cursor_pos(int* px, int* py); - 5 . - *px x, *py - y. +Функция появилась в версии 5 библиотеки. +Записывает в *px текущую координату курсора по оси x, в *py - по оси y. void __stdcall con_set_cursor_pos(int x, int y); - 5 . - . - - ( 0 scr_width-1 - x, 0 scr_height-1 y, scr_width scr_height - con_init), . +Функция появилась в версии 5 библиотеки. +Устанавливает курсор в позицию с указанными координатами. Если какой-то из +параметров выходит за пределы соответствующего диапазона (от 0 до scr_width-1 +для x, от 0 до scr_height-1 для y, scr_width и scr_height были заданы при +вызове con_init), то соответствующая координата курсора не меняется. int __stdcall con_get_input(char* buf, int buflen); Read as many input events as are available and fit in the receive buffer.