diff --git a/programs/cmm/TWB/TWB.c b/programs/cmm/TWB/TWB.c
index 6215b2eb17..b162e7b5b0 100644
--- a/programs/cmm/TWB/TWB.c
+++ b/programs/cmm/TWB/TWB.c
@@ -1,8 +1,7 @@
#include "..\TWB\colors.h"
#include "..\TWB\anchors.h"
#include "..\TWB\parce_tag.h"
-#include "..\TWB\absolute_url.h"
-#include "..\TWB\unicode_tags.h"
+#include "..\TWB\special.h"
#include "..\TWB\img_cache.h"
dword page_bg;
dword link_color_inactive;
@@ -22,6 +21,8 @@ struct _style {
image,
align;
dword bg_color;
+
+ dword main_title;
};
struct TWebBrowser {
@@ -63,13 +64,18 @@ void TWebBrowser::DrawStyle()
{
dword start_x, line_length, stolbec_len;
- if (!header)
+ if (style.main_title)
{
strncpy(#header, #line, sizeof(header)-1);
+ strncat(#header, " - ", sizeof(header)-1);
+ strncat(#header, #version, sizeof(header)-1);
+ line = 0;
+ return;
+ }
+ if (t_html) && (!t_body) {
line = 0;
return;
}
- if (t_html) && (!t_body) return;
if (line)
{
@@ -112,7 +118,7 @@ void TWebBrowser::DrawStyle()
void TWebBrowser::SetPageDefaults()
{
style.b = style.u = style.s = style.h = style.blq = t_html = t_body = style.pre =
- style.li = link = text_color_index = text_colors[0] = style.li_tab = false;
+ style.li = link = text_color_index = text_colors[0] = style.li_tab = style.main_title = false;
style.align = ALIGN_LEFT;
link_color_inactive = 0x0000FF;
link_color_active = 0xFF0000;
@@ -121,7 +127,7 @@ void TWebBrowser::SetPageDefaults()
DrawBuf.Fill(0, page_bg);
PageLinks.Clear();
anchors.clear();
- strncpy(#header, #version, sizeof(header)-1);
+ header = NULL;
cur_encoding = CH_NULL;
draw_y = body_magrin;
stolbec = 0;
@@ -258,25 +264,34 @@ void TWebBrowser::ParseHtml(){
list.count = draw_y;
list.CheckDoesValuesOkey();
anchors.current = NULL;
+ if (!header) {
+ strncpy(#header, #version, sizeof(header)-1);
+ DrawTitle(#header);
+ }
}
//============================================================================================
bool TWebBrowser::CheckForLineBreak()
{
int line_break_pos;
char new_line_text[4096];
+ //Do we need a line break?
if (strlen(#line)*zoom + stolbec < list.column_max) return false;
+ //Yes, we do. Lets calculate where...
line_break_pos = strrchr(#line, ' ');
+ //Is a new line fits in the current line?
if (line_break_pos*zoom + stolbec > list.column_max) {
line_break_pos = list.column_max/zoom - stolbec;
while(line_break_pos) && (line[line_break_pos]!=' ') line_break_pos--;
}
- if (!line_break_pos) && (strlen(#line)*zoom>list.column_max) {
- line_break_pos=list.column_max/zoom;
- if (!stolbec)&&(style.pre) draw_y-=list.item_h; //hack to fix https://prnt.sc/rk3kyt
+ //Maybe a new line is too big for the whole new line? Then we have to split it
+ if (!line_break_pos) && (style.li_tab*5 + strlen(#line) * zoom >= list.column_max) {
+ line_break_pos = list.column_max/zoom - stolbec;
}
strcpy(#new_line_text, #line + line_break_pos);
- line[line_break_pos] = 0x00;
+ line[line_break_pos] = 0x00;
+
DrawStyle();
+
strcpy(#line, #new_line_text);
NewLine();
//if (strlen(#line)*zoom + stolbec > list.column_max)CheckForLineBreak();
@@ -295,17 +310,11 @@ void TWebBrowser::SetStyle() {
list.first = draw_y;
anchors.current = NULL;
}
- }
-
+ }
if (tag.is("html")) {
t_html = tag.opened;
return;
}
- if (tag.is("title")) {
- if (tag.opened) header=NULL;
- return;
- }
-
if (tag.is("q"))
{
if (tag.opened) {
@@ -316,6 +325,11 @@ void TWebBrowser::SetStyle() {
if (!tag.opened) strcat(#line, "\" ");
return;
}
+ if (tag.is("title")) {
+ style.main_title = tag.opened;
+ if (!tag.opened) DrawTitle(#header);
+ return;
+ }
if (tag.is("body")) {
t_body = tag.opened;
if (value = tag.get_value_of("link=")) link_color_inactive = GetColor(value);
@@ -325,19 +339,6 @@ void TWebBrowser::SetStyle() {
style.bg_color = page_bg = GetColor(value);
DrawBuf.Fill(0, page_bg);
}
- if (tag.opened) {
- if (cur_encoding==CH_NULL) {
- cur_encoding = CH_CP866;
- //BufEncode(CH_UTF8);
- debugln("Document has no information about encoding!");
- }
- if (!streq(#header, #version)) {
- ChangeCharset(charsets[cur_encoding], "CP866", #header);
- strncat(#header, " - ", sizeof(header)-1);
- strncat(#header, #version, sizeof(header)-1);
- }
- DrawTitle(#header);
- }
return;
}
if (tag.is("a")) {
@@ -415,28 +416,25 @@ void TWebBrowser::SetStyle() {
//ImgCache.Images( list.x, draw_y, WB1.list.w);
return;
}
+ if (tag.is("h4")) {
+ NewLine();
+ style.h = tag.opened;
+ style.b = tag.opened;
+ }
if (tag.is("h1")) || (tag.is("h2")) || (tag.is("h3")) || (tag.is("caption")) {
style.h = tag.opened;
- if (tag.opened)
- {
+ if (tag.opened) {
NewLine();
draw_y += 10;
WB1.zoom=2;
WB1.list.font_type |= 10011001b;
- if (value = tag.get_value_of("align=")) {
- if (streq(value, "center")) style.align = ALIGN_CENTER;
- if (streq(value, "right")) style.align = ALIGN_RIGHT;
- }
- list.item_h = basic_line_h * 2;
+ list.item_h = basic_line_h * 2 - 2;
if (tag.is("h1")) style.b = true;
- }
- else
- {
+ } else {
if (tag.is("h1")) style.b = false;
NewLine();
WB1.zoom=1;
WB1.list.font_type = 10011000b;
- style.align = ALIGN_LEFT;
list.item_h = basic_line_h;
}
return;
@@ -451,6 +449,7 @@ void TWebBrowser::SetStyle() {
style.li = tag.opened;
if (tag.opened)
{
+ if (style.li_tab==0) style.li_tab++;
NewLine();
stolbec = style.li_tab * 5 - 2;
strcpy(#line, "\31 ");
@@ -462,10 +461,12 @@ void TWebBrowser::SetStyle() {
if (!tag.opened)
{
style.li = false;
- style.li_tab--;
+ if (style.li_tab>0) style.li_tab--;
NewLine();
}
- else style.li_tab++;
+ else {
+ if (style.li_tab<5) style.li_tab++;
+ }
}
if (tag.is("hr")) {
if (value = tag.get_value_of("color=")) EDI = GetColor(value); else EDI = 0x999999;
@@ -490,7 +491,13 @@ void TWebBrowser::SetStyle() {
else if (streq(value,"iso-8859-5")) || (streq(value,"iso8859-5")) meta_encoding = CH_ISO8859_5;
else if (streq(value,"koi8-r")) || (streq(value,"koi8-u")) meta_encoding = CH_KOI8;
}
- if (meta_encoding!=CH_NULL) BufEncode(meta_encoding);
+ if (meta_encoding!=CH_NULL) {
+ BufEncode(meta_encoding);
+ if (header) {
+ ChangeCharset(charsets[cur_encoding], "CP866", #header);
+ DrawTitle(#header);
+ }
+ }
return;
}
}
diff --git a/programs/cmm/TWB/absolute_url.h b/programs/cmm/TWB/absolute_url.h
deleted file mode 100644
index 4f2ce146ed..0000000000
--- a/programs/cmm/TWB/absolute_url.h
+++ /dev/null
@@ -1,53 +0,0 @@
-
-:dword GetAbsoluteURL(dword new_URL, base_URL)
-{
- int i;
- dword orig_URL = new_URL;
- char newurl[URL_SIZE+1];
- strcpy(#newurl, base_URL);
-
- while (i=strstr(new_URL, "&"))
- {
- strcpy(i+1, i+5);
- }
-
- if (check_is_the_url_absolute(new_URL)) return orig_URL;
-
- IF (!strncmp(new_URL,"//", 2))
- {
- strcpy(#newurl, "http:");
- strcat(#newurl, new_URL);
- strcpy(orig_URL, #newurl);
- return orig_URL;
- }
-
- IF (!strncmp(new_URL,"./", 2)) new_URL+=2;
-
- if (ESBYTE[new_URL] == '/') //remove everything after site domain name
- {
- i = strchr(#newurl+8, '/');
- if (i) ESBYTE[i]=0;
- new_URL+=1;
- }
-
- _CUT_ST_LEVEL_MARK:
-
- if (newurl[strrchr(#newurl, '/')-2]<>'/')
- {
- newurl[strrchr(#newurl, '/')] = 0x00;
- }
-
- IF (!strncmp(new_URL,"../",3))
- {
- new_URL+=3;
- newurl[strrchr(#newurl, '/')-1] = 0x00;
- goto _CUT_ST_LEVEL_MARK;
- }
-
- if (newurl[strlen(#newurl)-1]<>'/') strcat(#newurl, "/");
-
- strcat(#newurl, new_URL);
- strcpy(orig_URL, #newurl);
- return orig_URL;
-}
-
diff --git a/programs/cmm/TWB/links.h b/programs/cmm/TWB/links.h
index d8e7386012..030afa3782 100644
--- a/programs/cmm/TWB/links.h
+++ b/programs/cmm/TWB/links.h
@@ -54,6 +54,7 @@ dword LinksArray::GetURL(int id)
return links[id].link;
}
+bool open_new_window=false;
void LinksArray::Clear()
{
page_links.drop();
@@ -62,6 +63,7 @@ void LinksArray::Clear()
active = -1;
unic_count = 0;
CursorPointer.Restore();
+ open_new_window = false;
}
void LinksArray::DrawUnderline(dword und_id, list_first, list_y, color)
@@ -75,7 +77,7 @@ void LinksArray::DrawUnderline(dword und_id, list_first, list_y, color)
}
}
-PathShow_data status_text = {0, 17,250, 6, 250, 0, 0, 0x0, 0xFFFfff, 0, NULL, 0};
+PathShow_data status_text = {0, 17,250, 6, 250};
bool LinksArray::HoverAndProceed(dword mx, my, list_y, list_first)
{
@@ -93,7 +95,9 @@ bool LinksArray::HoverAndProceed(dword mx, my, list_y, list_first)
return false;
}
if (mouse.mkm) && (mouse.up) {
- RunProgram(#program_path, PageLinks.GetURL(PageLinks.active));
+ open_new_window = true;
+ EventClickLink(PageLinks.GetURL(PageLinks.active));
+ open_new_window = false;
return false;
}
if (mouse.lkm) && (mouse.up) {
diff --git a/programs/cmm/TWB/unicode_tags.h b/programs/cmm/TWB/special.h
similarity index 84%
rename from programs/cmm/TWB/unicode_tags.h
rename to programs/cmm/TWB/special.h
index 0f71c6dbe2..3ec4f7c4a6 100644
--- a/programs/cmm/TWB/unicode_tags.h
+++ b/programs/cmm/TWB/special.h
@@ -20,6 +20,14 @@ char *unicode_symbols[]={
"mdash", "-", //--
"rsquo", "'",
+"sect", "#",
+
+"ensp", " ",
+"emsp13", " ",
+"emsp14", " ",
+"numsp", " ",
+"puncsp", " ",
+"thinsp", " ",
"#1028", "\242",
"#1030", "I",
@@ -33,6 +41,8 @@ char *unicode_symbols[]={
"#8470", "N",
"#8722", "-",
"#9642", "-", //square in the middle of the line
+"#9658", ">",
+"#9660", "v",
"#65122", "+",
"uarr", "\24",
@@ -45,6 +55,9 @@ char *unicode_symbols[]={
"#xfeff", "",
+"times", "x",
+"lowast","*",
+
0};
diff --git a/programs/cmm/browser/WebView.c b/programs/cmm/browser/WebView.c
index e3b9b95a67..5177162226 100644
--- a/programs/cmm/browser/WebView.c
+++ b/programs/cmm/browser/WebView.c
@@ -30,45 +30,48 @@
#include "..\lib\patterns\simple_open_dialog.h"
#include "show_src.h"
-_http http = {0, 0, 0, 0, 0, 0, 0};
#include "download_manager.h"
_history history;
#include "history.h"
-
bool debug_mode = false;
-dword col_bg = 0xE3E2E2;
-dword panel_color = 0xE3E2E2;
-dword border_color = 0x787878;
#include "..\TWB\TWB.c"
+char version[]="WebView 2.0 Gold";
+
#ifdef LANG_RUS
-char version[]="Текстовый браузер 2.0 beta4";
char page_not_found[] = FROM "html\\page_not_found_ru.htm""\0";
char homepage[] = FROM "html\\homepage_ru.htm""\0";
char help[] = FROM "html\\help_ru.htm""\0";
char accept_language[]= "Accept-Language: ru\n";
char rmb_menu[] =
"Посмотреть исходник
-Редактировать исходник
+Редактировать исходник";
+char main_menu[] =
+"Открыть файл
+Новое окно
История
Менеджер загрузок";
char link_menu[] =
"Копировать ссылку
Скачать содержимое ссылки";
+char loading_text[] = "Загрузка...";
#else
-char version[]="Text-based Browser 2.0 beta4";
char page_not_found[] = FROM "html\\page_not_found_en.htm""\0";
char homepage[] = FROM "html\\homepage_en.htm""\0";
char help[] = FROM "html\\help_en.htm""\0";
char accept_language[]= "Accept-Language: en\n";
char rmb_menu[] =
"View source
-Edit source
+Edit source";
+char main_menu[] =
+"Open local file
+New window
History
Download Manager";
char link_menu[] =
"Copy link
Download link contents";
+char loading_text[] = "Loading...";
#endif
#define URL_SIZE 4000
@@ -77,12 +80,16 @@ Download link contents";
#define URL_SERVICE_HOMEPAGE "WebView:home"
#define URL_SERVICE_HELP "WebView:help"
-#define TOOLBAR_GAPS 10
-dword TOOLBAR_H = 40;
+#define PADDING 9
+#define SKIN_Y 24
+#define TSZE 25
+dword TOOLBAR_H = PADDING+TSZE+PADDING+2;
dword STATUSBAR_H = 15;
int action_buf;
+_http http = {0, 0, 0, 0, 0, 0, 0};
+
bool source_mode = false;
progress_bar wv_progress_bar;
@@ -97,6 +104,8 @@ enum {
SANDWICH_BUTTON,
VIEW_SOURCE,
EDIT_SOURCE,
+ OPEN_FILE,
+ NEW_WINDOW,
VIEW_HISTORY,
DOWNLOAD_MANAGER,
COPY_LINK_URL,
@@ -107,10 +116,9 @@ char default_dir[] = "/rd/1";
od_filter filter2 = { 16, "TXT\0HTM\0HTML\0\0" };
char editURL[URL_SIZE+1];
-edit_box address_box = {NULL,TOOLBAR_GAPS+TOOLBAR_GAPS+51,10,0xffffff,0x94AECE,0xffffff,
- 0xffffff,0x10000000,URL_SIZE-2,#editURL,0,NULL,19,19};
+edit_box address_box = {, PADDING+TSZE*2+PADDING+6, PADDING+3, 0xffffff,
+ 0x94AECE, 0xffffff, 0xffffff,0x10000000,URL_SIZE-2,#editURL,0,,19,19};
-#define SKIN_Y 24
void LoadLibraries()
{
@@ -143,8 +151,7 @@ void HandleParam()
void main()
{
- int redirect_count = 0;
- int i;
+ int i, btn, redirect_count=0;
LoadLibraries();
CreateDir("/tmp0/1/downloads");
Libimg_LoadImage(#skin, "/sys/toolbar.png");
@@ -171,10 +178,15 @@ void main()
WB1.DrawPage();
break;
}
+ if (mouse.up) && (! address_box.flags & ed_focus) && (address_box.flags & ed_shift_bac)
+ {
+ DrawOmnibox(); //reset text selection
+ }
break;
case evButton:
- ProcessEvent(GetButtonID());
+ btn = GetButtonID();
+ if (1==btn) ExitProcess(); else ProcessEvent(btn);
break;
case evKey:
@@ -225,7 +237,6 @@ void main()
GetScreenHeight()-700/2-random(80),800,700,0x73,0,0,0);
GetProcessInfo(#Form, SelfInfo);
system.color.get();
- col_bg = system.color.work;
if (Form.status_window>2) { DrawTitle(#header); break; }
if (Form.height<120) { MoveSize(OLD,OLD,OLD,120); break; }
if (Form.width<280) { MoveSize(OLD,OLD,280,OLD); break; }
@@ -233,79 +244,83 @@ void main()
break;
case evNetwork:
- if (http.transfer > 0) {
- http.receive();
- EventUpdateProgressBar();
- if (http.receive_result == 0) {
- // Handle redirects
- if (http.status_code >= 300) && (http.status_code < 400)
- {
- redirect_count++;
- if (redirect_count>5)
- {
- notify("'Too many redirects.' -E");
- StopLoading();
- }
- else
- {
- http.handle_redirect();
- http.free();
- GetAbsoluteURL(#http.redirect_url, history.current());
- debug("Redirect: "); debugln(#http.redirect_url);
- history.back();
- OpenPage(#http.redirect_url);
- }
- break;
- }
- redirect_count = 0;
- // Loading the page is complete, free resources
+ if (http.transfer <= 0) break;
+ http.receive();
+ EventUpdateProgressBar();
+ if (http.receive_result != 0) break;
+ if (http.status_code >= 300) && (http.status_code < 400)
+ {
+ // Handle redirects
+ if (redirect_count<=5) {
+ redirect_count++;
+ http.handle_redirect();
http.free();
- LoadInternalPage(http.content_pointer, http.content_received);
+ GetAbsoluteURL(#http.redirect_url, history.current());
+ history.back();
+ OpenPage(#http.redirect_url);
+ } else {
+ notify("'Too many redirects.' -E");
+ StopLoading();
}
+ } else {
+ // Loading the page is complete, free resources
+ redirect_count = 0;
+ http.free();
+ LoadInternalPage(http.content_pointer, http.content_received);
}
}
}
void SetElementSizes()
{
- address_box.top = TOOLBAR_H/2-10;
basic_line_h = calc(WB1.list.font_h * 130) / 100;
- address_box.width = Form.cwidth - address_box.left - 55;
+ address_box.width = Form.cwidth - address_box.left - 52 - 16;
WB1.list.SetSizes(0, TOOLBAR_H, Form.width - 10 - scroll_wv.size_x,
Form.cheight - TOOLBAR_H - STATUSBAR_H, basic_line_h);
WB1.list.wheel_size = 7 * basic_line_h;
WB1.list.column_max = WB1.list.w - scroll_wv.size_x / WB1.list.font_w + 1;
WB1.list.visible = WB1.list.h;
- if (WB1.list.w!=WB1.DrawBuf.bufw) {
- WB1.DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, 400*20);
- OpenPage(history.current());
- }
}
void draw_window()
{
- DrawBar(0,0, Form.cwidth,TOOLBAR_H-2, panel_color);
- DrawBar(0,TOOLBAR_H-2, Form.cwidth,1, 0xD7D0D3);
- DrawBar(0,TOOLBAR_H-1, Form.cwidth,1, border_color);
+ int i;
SetElementSizes();
- DefineHiddenButton(TOOLBAR_GAPS, address_box.top-2, 24, skin.h-2, BACK_BUTTON);
- DefineHiddenButton(TOOLBAR_GAPS+25, address_box.top-2, 24, skin.h-2, FORWARD_BUTTON);
- img_draw stdcall(skin.image, TOOLBAR_GAPS-1, address_box.top-3, 51, skin.h, 0, SKIN_Y);
- DefineHiddenButton(address_box.left+address_box.width-4, address_box.top-2, 20, skin.h-3, REFRESH_BUTTON);
- DefineHiddenButton(Form.cwidth-31, address_box.top-3, 24, skin.h-1, SANDWICH_BUTTON);
- img_draw stdcall(skin.image, Form.cwidth-27, address_box.top+1, 17, 18, 51, SKIN_Y);
- DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,STATUSBAR_H, col_bg);
- DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,1, border_color);
- if (!header) {
- OpenPage(history.current());
- WB1.DrawScroller();
+
+ DrawBar(0,0, Form.cwidth,PADDING, system.color.work);
+ DrawBar(0,PADDING+TSZE+1, Form.cwidth,PADDING-1, system.color.work);
+ DrawBar(0,TOOLBAR_H-2, Form.cwidth,1, system.color.work_dark);
+ DrawBar(0,TOOLBAR_H-1, Form.cwidth,1, system.color.work_graph);
+ DrawBar(0, PADDING, address_box.left-2, TSZE+1, system.color.work);
+ DrawBar(address_box.left+address_box.width+18, PADDING, Form.cwidth-address_box.left-address_box.width-18, TSZE+1, system.color.work);
+
+ DrawTopPanelButton(BACK_BUTTON, PADDING-1, 30);
+ DrawTopPanelButton(FORWARD_BUTTON, PADDING+TSZE+PADDING-2, 31);
+ DrawTopPanelButton(SANDWICH_BUTTON, Form.cwidth-PADDING-TSZE-3, -1);
+ for (i=0; i<=2; i++) DrawBar(Form.cwidth-PADDING-TSZE+3, i*5+PADDING+7, 15, 3, system.color.work_graph);
+
+ DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,STATUSBAR_H, system.color.work);
+ DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,1, system.color.work_graph);
+
+ DrawRectangle(WB1.list.x + WB1.list.w, WB1.list.y, scroll_wv.size_x,
+ WB1.list.h-1, scroll_wv.bckg_col);
+
+ if (WB1.list.w!=WB1.DrawBuf.bufw) {
+ WB1.DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, 400*20);
+ if (!strncmp(history.current(),"http",4)) {
+ //nihuya ne izyachnoe reshenie, no pust' poka butet tak
+ i=source_mode;
+ debugval("source_mode", source_mode);
+ LoadInternalPage(#loading_text, sizeof(loading_text));
+ source_mode=i;
+ debugval("source_mode", source_mode);
+ }
+ OpenPage(history.current());
} else {
WB1.DrawPage();
DrawOmnibox();
- DrawRectangle(scroll_wv.start_x, scroll_wv.start_y, scroll_wv.size_x,
- scroll_wv.size_y-1, scroll_wv.bckg_col);
}
DrawProgress();
}
@@ -315,8 +330,8 @@ void ProcessEvent(dword id__)
{
switch (id__)
{
- case 1:
- ExitProcess();
+ case NEW_WINDOW:
+ RunProgram(#program_path, NULL);
return;
case SCAN_CODE_BS:
case BACK_BUTTON:
@@ -342,7 +357,7 @@ void ProcessEvent(dword id__)
}
return;
case SANDWICH_BUTTON:
- EventShowPageMenu(Form.cwidth - 215, TOOLBAR_H-6);
+ EventShowMainMenu(Form.cwidth - 215, TOOLBAR_H-6);
return;
case VIEW_SOURCE:
EventViewSource();
@@ -374,6 +389,9 @@ void ProcessEvent(dword id__)
CreateThread(#Downloader,#downloader_stak+4092);
}
return;
+ case OPEN_FILE:
+ EventOpenDialog();
+ return;
case SCAN_CODE_F12:
debug_mode ^= 1;
if (debug_mode) notify("'Debug mode ON'-I");
@@ -443,6 +461,7 @@ void OpenPage(dword _open_URL)
StopLoading();
strcpy(#editURL, _open_URL);
+ address_box.flags=0;
DrawOmnibox();
strncpy(#new_url, _open_URL, URL_SIZE);
@@ -461,12 +480,8 @@ void OpenPage(dword _open_URL)
else LoadInternalPage(#page_not_found, sizeof(page_not_found));
} else if (!strncmp(#new_url,"http:",5)) || (!strncmp(#new_url,"https:",6)) {
//WEB PAGE
- img_draw stdcall(skin.image, address_box.left+address_box.width+1,
- address_box.top-3, 17, skin.h, 85, SKIN_Y);
-
if (ReplaceSpaceInUrl(#new_url, URL_SIZE)) {
strcpy(#editURL, #new_url);
- DrawOmnibox();
}
if (!strncmp(#new_url,"http:",5)) {
@@ -476,6 +491,9 @@ void OpenPage(dword _open_URL)
strncat(#new_url, _open_URL, URL_SIZE);
http.get(#new_url);
}
+
+ DrawOmnibox();
+
if (!http.transfer) {
StopLoading();
LoadInternalPage(#page_not_found, sizeof(page_not_found));
@@ -492,6 +510,13 @@ void EventClickLink(dword _click_URL)
{
char new_url[URL_SIZE+1];
+ if (open_new_window) {
+ strcpy(#new_url, _click_URL);
+ GetAbsoluteURL(#new_url, history.current());
+ RunProgram(#program_path, #new_url);
+ return;
+ }
+
if (ESBYTE[_click_URL]=='#') {
if (anchors.get_pos_by_name(_click_URL+1)!=-1) {
WB1.list.first = anchors.get_pos_by_name(_click_URL+1);
@@ -569,23 +594,6 @@ void EventSubmitOmnibox()
}
}
-void DrawOmnibox()
-{
- int skin_x_offset;
-
- DrawRectangle(address_box.left-2, address_box.top-3, address_box.width+5, 25,border_color);
-
- DrawBar(address_box.left-2, address_box.top-2, address_box.width+3, 1,0xD8DCD8);
- DrawBar(address_box.left-2, address_box.top-1, address_box.width+3, 1, address_box.color);
- img_draw stdcall(skin.image, address_box.left-2, address_box.top-3, 2, skin.h, 102, SKIN_Y);
- if (address_box.flags & ed_focus) address_box.flags = ed_focus; else address_box.flags = 0;
- EditBox_UpdateText(#address_box, address_box.flags);
- edit_box_draw stdcall(#address_box);
- if (http.transfer > 0) skin_x_offset = 85; else skin_x_offset = 68;
- img_draw stdcall(skin.image, address_box.left+address_box.width+1,
- address_box.top-3, 17, skin.h, skin_x_offset, SKIN_Y);
-}
-
void LoadInternalPage(dword _bufdata, _in_bufsize){
if (!_bufdata) || (!_in_bufsize) {
LoadInternalPage(#page_not_found, sizeof(page_not_found));
@@ -625,7 +633,7 @@ void DrawProgress()
} else {
persent = 10;
}
- DrawBar(address_box.left-1, address_box.top+20, persent*address_box.width/100, 2, 0x72B7EB);
+ DrawBar(address_box.left-1, address_box.top+20, persent*address_box.width+16/100, 2, 0x72B7EB);
}
void EventShowPageMenu(dword _left, _top)
@@ -633,6 +641,11 @@ void EventShowPageMenu(dword _left, _top)
menu.show(Form.left+_left-6,Form.top+_top+skin_height+3, 220, #rmb_menu, VIEW_SOURCE);
}
+void EventShowMainMenu(dword _left, _top)
+{
+ menu.show(Form.left+_left-6+77,Form.top+_top+skin_height-3, 140, #main_menu, OPEN_FILE);
+}
+
void EventShowLinkMenu(dword _left, _top)
{
menu.show(Form.left+_left-6,Form.top+_top+skin_height+3, 220, #link_menu, COPY_LINK_URL);
@@ -678,10 +691,83 @@ void DrawStatusBar(dword _status_text)
status_text.start_x = 10;
status_text.start_y = Form.cheight - STATUSBAR_H + 3;
status_text.area_size_x = Form.cwidth - status_text.start_x -3;
- DrawBar(status_text.start_x, status_text.start_y, status_text.area_size_x, 9, col_bg);
+ DrawBar(status_text.start_x, status_text.start_y, status_text.area_size_x, 9, system.color.work);
status_text.text_pointer = _status_text;
PathShow_prepare stdcall(#status_text);
PathShow_draw stdcall(#status_text);
}
+
+void DrawOvalBorder(dword x,y,w,h, light,dark,right,dots)
+{
+ DrawBar(x+1, y, w, 1, light);
+ DrawBar(x+1, y+h+1, w, 1, dark);
+ DrawBar(x, y+1, 1, h-1, light);
+ DrawBar(x+w+1, y+2, 1, h-2, right);
+
+ PutPixel(x, y, dots);
+ PutPixel(x+w+1, y+h+1, dots);
+ PutPixel(x, y+h+1, dots);
+ PutPixel(x+w+1, y, dots);
+
+ PutPixel(x, y+h, dark);
+ PutPixel(x+w+1, y+1, light);
+ PutPixel(x+w+1, y+h, dark);
+}
+
+libimg_image top_icons;
+libimg_image left_icons;
+
+void DrawTopPanelButton(dword _button_id, _x, signed int _icon_n)
+{
+ static dword semi_white=0, bg_col, bg_col_light, bg_col_dark, bg_dark;
+ if (!semi_white) {
+ bg_col = system.color.work;
+ if (GrayScaleImage(#bg_col,1,1)<65) bg_dark=true; else bg_dark=false;
+ Libimg_LoadImage(#top_icons, "/sys/icons16.png");
+ Libimg_LoadImage(#left_icons, "/sys/icons16.png");
+
+ semi_white = MixColors(system.color.work, 0xFFFfff, bg_dark*90 + 96);
+ bg_col_dark = MixColors(system.color.work, system.color.work_graph, 90);
+ bg_col_light = MixColors(semi_white, 0xFFFfff, bg_dark*90 + 10);
+
+ Libimg_ReplaceColor(top_icons.image, top_icons.w, top_icons.h, 0xffFFFfff, semi_white);
+ Libimg_ReplaceColor(top_icons.image, top_icons.w, top_icons.h, 0xffCACBD6, MixColors(semi_white, 0, 220));
+
+ Libimg_ReplaceColor(left_icons.image, left_icons.w, left_icons.h, 0xffFFFfff, system.color.work);
+ Libimg_ReplaceColor(left_icons.image, left_icons.w, left_icons.h, 0xffCACBD6, MixColors(system.color.work, 0, 200));
+ }
+
+ DrawWideRectangle(_x+1, PADDING+1, TSZE, TSZE, 5, semi_white);
+ DrawOvalBorder(_x, PADDING, TSZE, TSZE, bg_col_light, bg_col_dark, semi_white, system.color.work);
+
+ DefineHiddenButton(_x, PADDING, TSZE+1, TSZE+1, _button_id);
+ if (_icon_n==-1) {
+ DrawBar(_x+6, PADDING+5, 16, 16, semi_white);
+ } else {
+ img_draw stdcall(top_icons.image, _x+6, PADDING+5, 16, 16, 0, _icon_n*16);
+ }
+}
+
+void DrawOmnibox()
+{
+ int skin_x_offset;
+
+ DrawOvalBorder(address_box.left-2, address_box.top-3, address_box.width+18, 24, system.color.work_graph, system.color.work_graph, system.color.work_graph, system.color.work_dark);
+ DrawBar(address_box.left-1, address_box.top-2, address_box.width+18, 1, 0xD8DCD8);
+ DrawBar(address_box.left-1, address_box.top-1, address_box.width+18, 1, address_box.color);
+ DrawBar(address_box.left-1, address_box.top, 1, 22, address_box.color);
+
+ if (address_box.flags & ed_focus) address_box.flags = ed_focus; else address_box.flags = 0;
+ EditBox_UpdateText(#address_box, address_box.flags);
+ edit_box_draw stdcall(#address_box);
+ if (http.transfer > 0) skin_x_offset = 85; else skin_x_offset = 68;
+ img_draw stdcall(skin.image, address_box.left+address_box.width+1,
+ address_box.top-1, 16, skin.h-3, skin_x_offset, SKIN_Y+2);
+ DefineHiddenButton(address_box.left+address_box.width-1, address_box.top-2, 17, skin.h-3, REFRESH_BUTTON);
+
+ DrawProgress();
+}
+
+
stop:
\ No newline at end of file
diff --git a/programs/cmm/browser/show_src.h b/programs/cmm/browser/show_src.h
index 0c49c9c7eb..4acf25e2a4 100644
--- a/programs/cmm/browser/show_src.h
+++ b/programs/cmm/browser/show_src.h
@@ -80,9 +80,9 @@ dword ShowSource(dword _bufdata, _in_bufsize)
break;
case '\"':
case '\'':
- if (TAG == mode) SourceBufAdd(VALUE, "'");
- else if (VALUE == mode) SourceBufAdd(TAG, "'");
- else SourceBufAdd(NULL, "'");
+ if (TAG == mode) SourceBufAdd(VALUE, """);
+ else if (VALUE == mode) SourceBufAdd(TAG, """);
+ else SourceBufAdd(NULL, """);
break;
default:
ESBYTE[source_buf_end] = ESBYTE[i];
diff --git a/programs/cmm/lib/patterns/http_downloader.h b/programs/cmm/lib/patterns/http_downloader.h
index 7103fd178f..b9616942e6 100644
--- a/programs/cmm/lib/patterns/http_downloader.h
+++ b/programs/cmm/lib/patterns/http_downloader.h
@@ -214,3 +214,53 @@ void get_absolute_url(dword _rez, _base, _new)
_GET_ABSOLUTE_URL_END:
while (i=strstr(_rez, "&")) strcpy(i+1, i+5);
}
+
+
+:dword GetAbsoluteURL(dword new_URL, base_URL)
+{
+ int i;
+ dword orig_URL = new_URL;
+ char newurl[URL_SIZE+1];
+ strcpy(#newurl, base_URL);
+
+ while (i=strstr(new_URL, "&")) strcpy(i+1, i+5);
+
+ if (check_is_the_url_absolute(new_URL)) return orig_URL;
+
+ IF (!strncmp(new_URL,"//", 2))
+ {
+ strcpy(#newurl, "http:");
+ strcat(#newurl, new_URL);
+ strcpy(orig_URL, #newurl);
+ return orig_URL;
+ }
+
+ IF (!strncmp(new_URL,"./", 2)) new_URL+=2;
+
+ if (ESBYTE[new_URL] == '/') //remove everything after site domain name
+ {
+ i = strchr(#newurl+8, '/');
+ if (i) ESBYTE[i]=0;
+ new_URL+=1;
+ }
+
+ _CUT_ST_LEVEL_MARK:
+
+ if (newurl[strrchr(#newurl, '/')-2]<>'/')
+ {
+ newurl[strrchr(#newurl, '/')] = 0x00;
+ }
+
+ IF (!strncmp(new_URL,"../",3))
+ {
+ new_URL+=3;
+ newurl[strrchr(#newurl, '/')-1] = 0x00;
+ goto _CUT_ST_LEVEL_MARK;
+ }
+
+ if (newurl[strlen(#newurl)-1]<>'/') strcat(#newurl, "/");
+
+ strcat(#newurl, new_URL);
+ strcpy(orig_URL, #newurl);
+ return orig_URL;
+}
diff --git a/programs/cmm/lib/strings.h b/programs/cmm/lib/strings.h
index 59261bce1d..0aab99a995 100644
--- a/programs/cmm/lib/strings.h
+++ b/programs/cmm/lib/strings.h
@@ -249,7 +249,7 @@ inline fastcall int strlcpy(dword ESI, EDI, EBX)
:void strncpy(dword dst, src, len)
{
- while (len)
+ while (len) && (ESBYTE[src])
{
ESBYTE[dst] = ESBYTE[src];
dst++;