Skip to content

Commit 25d8ed4

Browse files
committed
feat: Improve Sciter archive support.
Now you can call `SetResourceArchive` and its files will be resolved automatically. refs sciter-sdk#163.
1 parent 93a8d4d commit 25d8ed4

File tree

7 files changed

+182
-45
lines changed

7 files changed

+182
-45
lines changed

examples/restest/res/simple.html

Lines changed: 42 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,42 @@
1-
<html>
2-
3-
<head>
4-
<title>angles demo</title>
5-
<style>
6-
#gradient-rotated {
7-
position: absolute;
8-
top: 40px;
9-
left: 40px;
10-
width: 300px;
11-
height: 300px;
12-
background: linear-gradient(45deg, red, yellow);
13-
background-image: -moz-linear-gradient(top left -45deg, red, yellow); // these guys use CCW direction in gradients for some reasons
14-
background-image: -webkit-linear-gradient(-45deg, red, yellow);
15-
}
16-
17-
#rotated {
18-
position: absolute;
19-
top: 40px;
20-
left: 40px;
21-
border: 1px dashed brown;
22-
width: 424px;
23-
height: 50px;
24-
transform: rotate(45deg);
25-
transform-origin: top left;
26-
-moz-transform: rotate(45deg);
27-
-webkit-transform: rotate(45deg);
28-
-moz-transform-origin: top left;
29-
-webkit-transform-origin: top left;
30-
background: linear-gradient(left, red, yellow);
31-
background-image: -moz-linear-gradient(left, red, yellow);
32-
background-image: -webkit-linear-gradient(left, red, yellow);
33-
}
34-
</style>
35-
</head>
36-
37-
<body>
38-
<div id=gradient-rotated>gradient rotated +45&deg;</div>
39-
<div id=rotated>element rotated +45&deg;</div>
40-
</body>
41-
42-
</html>
1+
<html>
2+
3+
<head>
4+
<title>angles demo (packed in rice archive)</title>
5+
<style>
6+
#gradient-rotated {
7+
position: absolute;
8+
top: 40px;
9+
left: 40px;
10+
width: 300px;
11+
height: 300px;
12+
background: linear-gradient(45deg, red, yellow);
13+
background-image: -moz-linear-gradient(top left -45deg, red, yellow); // these guys use CCW direction in gradients for some reasons
14+
background-image: -webkit-linear-gradient(-45deg, red, yellow);
15+
}
16+
17+
#rotated {
18+
position: absolute;
19+
top: 40px;
20+
left: 40px;
21+
border: 1px dashed brown;
22+
width: 424px;
23+
height: 50px;
24+
transform: rotate(45deg);
25+
transform-origin: top left;
26+
-moz-transform: rotate(45deg);
27+
-webkit-transform: rotate(45deg);
28+
-moz-transform-origin: top left;
29+
-webkit-transform-origin: top left;
30+
background: linear-gradient(left, red, yellow);
31+
background-image: -moz-linear-gradient(left, red, yellow);
32+
background-image: -webkit-linear-gradient(left, red, yellow);
33+
}
34+
</style>
35+
</head>
36+
37+
<body>
38+
<div id=gradient-rotated>gradient rotated +45&deg;</div>
39+
<div id=rotated>element rotated +45&deg;</div>
40+
</body>
41+
42+
</html>

examples/restest/restest.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ func main() {
3838
if err != nil {
3939
log.Fatal(err)
4040
}
41-
w.SetTitle("Example")
4241
w.Show()
4342
w.Run()
4443
}

examples/restest2/res.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package main
2+
3+
var resource_name []byte = []byte {
4+
0x53,0x41,0x72,0x00,0x0c,0x00,0x00,0x00,0x73,0x00,0xff,0xff,0x01,0x00,0xff,0xff,0x69,0x00,0xff,0xff,0x02,0x00,0xff,0xff,0x6d,0x00,0xff,0xff,0x03,0x00,0xff,0xff,0x70,0x00,0xff,0xff,0x04,0x00,0xff,0xff,0x6c,
5+
0x00,0xff,0xff,0x05,0x00,0xff,0xff,0x65,0x00,0xff,0xff,0x06,0x00,0xff,0xff,0x2e,0x00,0xff,0xff,0x07,0x00,0xff,0xff,0x68,0x00,0xff,0xff,0x08,0x00,0xff,0xff,0x74,0x00,0xff,0xff,0x09,0x00,0xff,0xff,0x6d,0x00,
6+
0xff,0xff,0x0a,0x00,0xff,0xff,0x6c,0x00,0xff,0xff,0x0b,0x00,0xff,0xff,0x00,0x00,0xff,0xff,0x01,0x00,0xff,0xff,0x01,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x0e,0x02,0x00,0x00,0xf5,0x04,0x00,0x00,0x0e,0x3c,0x68,
7+
0x74,0x6d,0x6c,0x3e,0x0d,0x0a,0x0d,0x0a,0x3c,0x68,0x65,0x61,0x64,0x20,0x09,0x00,0x20,0x20,0x00,0x13,0x3c,0x74,0x69,0x74,0x6c,0x65,0x3e,0x61,0x6e,0x67,0x6c,0x65,0x73,0x20,0x64,0x65,0x6d,0x6f,0x3c,0x2f,0x80,
8+
0x12,0xa0,0x1f,0x02,0x73,0x74,0x79,0xe0,0x00,0x0c,0x12,0x23,0x67,0x72,0x61,0x64,0x69,0x65,0x6e,0x74,0x2d,0x72,0x6f,0x74,0x61,0x74,0x65,0x64,0x20,0x7b,0x80,0x18,0x40,0x00,0x12,0x70,0x6f,0x73,0x69,0x74,0x69,
9+
0x6f,0x6e,0x3a,0x20,0x61,0x62,0x73,0x6f,0x6c,0x75,0x74,0x65,0x3b,0xe0,0x01,0x1c,0x08,0x74,0x6f,0x70,0x3a,0x20,0x34,0x30,0x70,0x78,0xe0,0x02,0x13,0x03,0x6c,0x65,0x66,0x74,0xe0,0x08,0x14,0x08,0x77,0x69,0x64,
10+
0x74,0x68,0x3a,0x20,0x33,0x30,0xe0,0x05,0x16,0x04,0x68,0x65,0x69,0x67,0x68,0x20,0x2d,0xe0,0x07,0x17,0x12,0x62,0x61,0x63,0x6b,0x67,0x72,0x6f,0x75,0x6e,0x64,0x3a,0x20,0x6c,0x69,0x6e,0x65,0x61,0x72,0x2d,0xc0,
11+
0xa3,0x13,0x28,0x34,0x35,0x64,0x65,0x67,0x2c,0x20,0x72,0x65,0x64,0x2c,0x20,0x79,0x65,0x6c,0x6c,0x6f,0x77,0x29,0xe0,0x0c,0x39,0x0c,0x2d,0x69,0x6d,0x61,0x67,0x65,0x3a,0x20,0x2d,0x6d,0x6f,0x7a,0x2d,0xe0,0x07,
12+
0x44,0x20,0xb8,0x60,0xa8,0x01,0x20,0x2d,0xe0,0x0b,0x4e,0x0f,0x20,0x2f,0x2f,0x20,0x74,0x68,0x65,0x73,0x65,0x20,0x67,0x75,0x79,0x73,0x20,0x75,0x20,0x08,0x08,0x43,0x43,0x57,0x20,0x64,0x69,0x72,0x65,0x63,0x41,
13+
0x0b,0x03,0x20,0x69,0x6e,0x20,0xc0,0x4a,0x09,0x73,0x20,0x66,0x6f,0x72,0x20,0x73,0x6f,0x6d,0x65,0x20,0x43,0x04,0x61,0x73,0x6f,0x6e,0x73,0xe0,0x14,0x8c,0x05,0x77,0x65,0x62,0x6b,0x69,0x74,0xe0,0x08,0x8f,0xe0,
14+
0x0c,0x86,0x80,0x48,0x00,0x7d,0x80,0x06,0x80,0x05,0x00,0x23,0xe1,0x50,0xa1,0x0f,0x62,0x6f,0x72,0x64,0x65,0x72,0x3a,0x20,0x31,0x70,0x78,0x20,0x64,0x61,0x73,0x68,0x20,0x63,0x04,0x62,0x72,0x6f,0x77,0x6e,0xe0,
15+
0x02,0x22,0xa1,0xc4,0x02,0x34,0x32,0x34,0xe0,0x04,0x39,0xc1,0xc4,0x00,0x35,0xe0,0x05,0x50,0x04,0x74,0x72,0x61,0x6e,0x73,0x21,0x1b,0x02,0x6d,0x3a,0x20,0x80,0xb4,0x81,0xb9,0xc0,0xd6,0x40,0x00,0xe0,0x00,0x22,
16+
0x05,0x2d,0x6f,0x72,0x69,0x67,0x69,0x20,0xc1,0x20,0xae,0x60,0x9e,0xe0,0x02,0x24,0x61,0xbf,0xe0,0x00,0x29,0xe0,0x11,0x4c,0xc1,0x5a,0xe0,0x1b,0x2a,0xe0,0x04,0x52,0xe0,0x14,0x7c,0xe0,0x07,0x54,0xe0,0x13,0x2c,
17+
0xe1,0x01,0xee,0xe2,0x09,0xb5,0x40,0x2a,0xe1,0x0c,0xde,0x40,0x00,0xe0,0x01,0x38,0xe2,0x00,0x27,0x40,0xa1,0xe0,0x37,0x43,0xa0,0xbb,0xe0,0x20,0x46,0xa2,0x69,0x01,0x3c,0x2f,0xc4,0x1c,0x01,0x3c,0x2f,0xa4,0x52,
18+
0x20,0x0a,0x03,0x62,0x6f,0x64,0x79,0x20,0x09,0x20,0x1f,0x08,0x20,0x3c,0x64,0x69,0x76,0x20,0x69,0x64,0x3d,0xc0,0x51,0xc4,0x36,0x00,0x3e,0xc0,0x10,0xa1,0x78,0x05,0x64,0x20,0x2b,0x34,0x35,0x26,0x21,0x7b,0x02,
19+
0x3b,0x3c,0x2f,0x20,0x32,0xe0,0x06,0x3d,0xa0,0x23,0x04,0x3e,0x65,0x6c,0x65,0x6d,0xe0,0x13,0x33,0x01,0x3c,0x2f,0xa0,0x7a,0x40,0x0a,0x64,0xec,0x01,0x0d,0x0a,
20+
}

examples/restest2/res/simple.html

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<html>
2+
3+
<head>
4+
<title>angles demo (packed in sciter archive)</title>
5+
<style>
6+
#gradient-rotated {
7+
position: absolute;
8+
top: 40px;
9+
left: 40px;
10+
width: 300px;
11+
height: 300px;
12+
background: linear-gradient(45deg, red, yellow);
13+
background-image: -moz-linear-gradient(top left -45deg, red, yellow); // these guys use CCW direction in gradients for some reasons
14+
background-image: -webkit-linear-gradient(-45deg, red, yellow);
15+
}
16+
17+
#rotated {
18+
position: absolute;
19+
top: 40px;
20+
left: 40px;
21+
border: 1px dashed brown;
22+
width: 424px;
23+
height: 50px;
24+
transform: rotate(45deg);
25+
transform-origin: top left;
26+
-moz-transform: rotate(45deg);
27+
-webkit-transform: rotate(45deg);
28+
-moz-transform-origin: top left;
29+
-webkit-transform-origin: top left;
30+
background: linear-gradient(left, red, yellow);
31+
background-image: -moz-linear-gradient(left, red, yellow);
32+
background-image: -webkit-linear-gradient(left, red, yellow);
33+
}
34+
</style>
35+
</head>
36+
37+
<body>
38+
<div id=gradient-rotated>gradient rotated +45&deg;</div>
39+
<div id=rotated>element rotated +45&deg;</div>
40+
</body>
41+
42+
</html>

examples/restest2/restest.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package main
2+
3+
import (
4+
"log"
5+
sciter "github.com/sciter-sdk/go-sciter"
6+
window "github.com/sciter-sdk/go-sciter/window"
7+
)
8+
9+
/*
10+
A Sciter archive usage example.
11+
12+
To build it you need the `packfolder` tool from the Sciter SDK:
13+
14+
* convert resources from folder `res` to `res.go` via `packfolder res res.go -v resource_name -go`
15+
* use it in your source code via `win.SetResourceArchive(resource_name)`
16+
17+
Now the resulting executable is completely stand-alone.
18+
*/
19+
func main() {
20+
// As usual, create a sciter window.
21+
w, err := window.New(sciter.SW_TITLEBAR|sciter.SW_RESIZEABLE|sciter.SW_CONTROLS|sciter.SW_MAIN, nil)
22+
if err != nil {
23+
log.Fatal(err)
24+
}
25+
26+
// 1. Handle resources via sciter archive loader.
27+
// It handles URLs like `this://app/`.
28+
w.SetResourceArchive(resource_name)
29+
30+
// 2. Load a packaged resource.
31+
err = w.LoadFile("this://app/simple.html")
32+
if err != nil {
33+
log.Fatal(err)
34+
}
35+
w.Show()
36+
w.Run()
37+
}

rice/rice.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func OnLoadData(s *sciter.Sciter) func(ld *sciter.ScnLoadData) int {
3535
path = strings.Join(ps[1:], "/")
3636
}
3737
} else {
38-
// do not handle file:// or rice://
38+
// // do not handle schemes other than file:// or rice://
3939
return sciter.LOAD_OK
4040
}
4141
// log.Println("rice loading:", path, "in box:", boxname)

sciter.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import "C"
3838
import (
3939
"fmt"
4040
"log"
41+
"strings"
4142
"runtime"
4243
"unsafe"
4344
)
@@ -449,7 +450,7 @@ func (s *Sciter) SetHomeURL(baseUrl string) (ok bool) {
449450
return true
450451
}
451452

452-
// Open a data blob of the Sciter compressed archive.
453+
// Open data blob of the provided compressed Sciter archive.
453454
func (s *Sciter) OpenArchive(data []byte) {
454455
s.har = C.SciterOpenArchive((*C.BYTE)(&data[0]), C.UINT(len(data)))
455456
}
@@ -475,6 +476,44 @@ func (s *Sciter) CloseArchive() {
475476
s.har = C.HSARCHIVE(nil)
476477
}
477478

479+
// Register `this://app/` URLs to be loaded from the given Sciter archive.
480+
//
481+
// Pack resources using `packfolder` tool:
482+
//
483+
// `$ packfolder res_folder res_packed.go -v resource_name -go`
484+
//
485+
// Usage:
486+
//
487+
//```
488+
// win.SetResourceArchive(resource_name)
489+
// win.LoadFile("this://app//index.htm")
490+
//```
491+
func (s *Sciter) SetResourceArchive(data []byte) {
492+
493+
// register `this://app/` schema
494+
callback := &CallbackHandler{
495+
OnLoadData: func(params *ScnLoadData) int {
496+
if strings.HasPrefix(params.Uri(), "this://app/") {
497+
// load resource starting with our schema
498+
url := params.Uri()[11:]
499+
fileData := s.GetArchiveItem(url)
500+
if fileData != nil {
501+
// use loaded resource
502+
s.DataReady(url, fileData)
503+
} else {
504+
// failed to load
505+
log.Println("error: failed to load " + params.Uri())
506+
// but fallback to Sciter anyway
507+
}
508+
}
509+
return LOAD_OK
510+
},
511+
}
512+
513+
s.OpenArchive(data)
514+
s.SetCallback(callback)
515+
}
516+
478517
// #if defined(OSX)
479518
// HWINDOW SciterCreateNSView ( LPRECT frame ) ;//{ return SAPI()->SciterCreateNSView ( frame ); }
480519
// #endif

0 commit comments

Comments
 (0)