Compare commits
18 commits
explo/gh-a
...
master
Author | SHA1 | Date | |
---|---|---|---|
396bdb9897 | |||
3982bf9ec8 | |||
e054220b82 | |||
784bb77d91 | |||
3f1ac02fe7 | |||
76e05847c4 | |||
e056ee91f6 | |||
9262f1bc59 | |||
2970fabeb1 | |||
fb91eac669 | |||
5d1bec47ad | |||
bc39ba3c6c | |||
6c33eaec6d | |||
f81c9e269d | |||
27e12057bc | |||
d27039fdb7 | |||
c35438c33d | |||
175815a305 |
30
.github/workflows/dist.yml
vendored
30
.github/workflows/dist.yml
vendored
|
@ -1,30 +0,0 @@
|
||||||
---
|
|
||||||
name: dist
|
|
||||||
"on":
|
|
||||||
push:
|
|
||||||
branches: [master, explo/gh-actions]
|
|
||||||
jobs:
|
|
||||||
dist:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Check out the repo
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Set up Go
|
|
||||||
uses: actions/setup-go@v3
|
|
||||||
with:
|
|
||||||
go-version: "^1.19.1"
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt update
|
|
||||||
sudo apt install libgtk-3-dev libcairo2-dev libglib2.0-dev
|
|
||||||
|
|
||||||
- name: Run `make dist`
|
|
||||||
run: make dist
|
|
||||||
|
|
||||||
- name: Upload dist package
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: dist-package
|
|
||||||
path: target/Gomics*.zip
|
|
6
.golangci.yml
Normal file
6
.golangci.yml
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
|
||||||
|
run:
|
||||||
|
skip-dirs:
|
||||||
|
- ".*go/pkg.*"
|
||||||
|
- ".*go/src.*"
|
39
Makefile
39
Makefile
|
@ -1,24 +1,35 @@
|
||||||
.PHONY: build clean dist
|
# --- PREAMBLE
|
||||||
|
SHELL := bash
|
||||||
|
.ONESHELL:
|
||||||
|
.SHELLFLAGS := -eu -o pipefail -c
|
||||||
|
MAKEFLAGS += --warn-undefined-variables
|
||||||
|
|
||||||
BUILD_DATE := $(shell date +'%Y%m%d')
|
BUILD_DATE := $(shell date +'%Y%m%d')
|
||||||
VERSION := $(shell support/get-version.sh)
|
VERSION := $(shell support/get-version.sh)
|
||||||
|
|
||||||
build:
|
build:
|
||||||
go build -o target/gomicsv \
|
go build -o target/gomicsv \
|
||||||
-ldflags="-X main.buildDate=$(BUILD_DATE) -X main.versionString=$(VERSION)" \
|
-ldflags="-X main.buildDate=$(BUILD_DATE) -X main.versionString=$(VERSION)" \
|
||||||
cmd/gomicsv/main.go
|
cmd/gomicsv/main.go
|
||||||
|
.PHONY: build
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -rf target/; \
|
rm -rf target/
|
||||||
|
.PHONY: clean
|
||||||
|
|
||||||
dist: build
|
dist: build
|
||||||
rm -rf target/dist; \
|
rm -rf target/dist
|
||||||
rm -rf target/*.zip; \
|
rm -rf target/*.zip
|
||||||
mkdir -p target/dist/gomicsv; \
|
mkdir -p target/dist/gomicsv
|
||||||
cp target/gomicsv target/dist/gomicsv/gomicsv; \
|
cp target/gomicsv target/dist/gomicsv/gomicsv
|
||||||
cp README.md target/dist/gomicsv; \
|
cp README.md target/dist/gomicsv
|
||||||
cp COPYING.md target/dist/gomicsv; \
|
cp COPYING.md target/dist/gomicsv
|
||||||
cp CHANGELOG.md target/dist/gomicsv; \
|
cp CHANGELOG.md target/dist/gomicsv
|
||||||
cd target/dist; \
|
pushd target/dist
|
||||||
zip -r ../Gomics-v_$(VERSION).zip gomicsv; \
|
zip -r ../Gomics-v_$(VERSION).zip gomicsv
|
||||||
rm -rf gomicsv; \
|
rm -rf gomicsv
|
||||||
|
.PHONY: dist
|
||||||
|
|
||||||
|
lint:
|
||||||
|
golangci-lint run
|
||||||
|
.PHONY: lint
|
||||||
|
|
20
README.md
20
README.md
|
@ -18,6 +18,9 @@ This fork has been made with personal use for reading manga with
|
||||||
mouse-centered navigation in mind. Consequently, some aspects of other workflows
|
mouse-centered navigation in mind. Consequently, some aspects of other workflows
|
||||||
might have been broken.
|
might have been broken.
|
||||||
|
|
||||||
|
The program has only been confirmed to work on Linux, but it is possible it
|
||||||
|
would work on other platforms.
|
||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="screenshot.png" title="A screenshot of Gomics-v">
|
<img src="screenshot.png" title="A screenshot of Gomics-v">
|
||||||
</p>
|
</p>
|
||||||
|
@ -69,10 +72,11 @@ might have been broken.
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
Download the latest release package from the [Releases] page and extract it to
|
Download the latest release package from the [Releases] page (Linux only) and
|
||||||
the location where you want to keep the program files (e.g., `/opt/gomicsv`).
|
extract it to the location where you want to keep the program files (e.g.,
|
||||||
|
`/opt/gomicsv`).
|
||||||
|
|
||||||
Or build it from the source:
|
Or build it from the source (see below).
|
||||||
|
|
||||||
[Releases]: https://github.com/fauu/gomicsv/releases
|
[Releases]: https://github.com/fauu/gomicsv/releases
|
||||||
|
|
||||||
|
@ -94,6 +98,14 @@ Building requires [go] and some GTK-related dependencies. See
|
||||||
[gomics: Requirements][gomics-requirements]. GTK-related build steps might take
|
[gomics: Requirements][gomics-requirements]. GTK-related build steps might take
|
||||||
up to 15 minutes on first compile.
|
up to 15 minutes on first compile.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Extra information for Windows and macOS:
|
||||||
|
|
||||||
|
- <https://github.com/gotk3/gotk3/wiki/Installing-on-Windows>
|
||||||
|
|
||||||
|
- <https://github.com/gotk3/gotk3/wiki/Installing-on-macOS>
|
||||||
|
|
||||||
[go]: https://go.dev/
|
[go]: https://go.dev/
|
||||||
[gomics-requirements]: https://github.com/salviati/gomics#requirements
|
[gomics-requirements]: https://github.com/salviati/gomics#requirements
|
||||||
|
|
||||||
|
@ -101,7 +113,7 @@ up to 15 minutes on first compile.
|
||||||
|
|
||||||
Gomics-v\
|
Gomics-v\
|
||||||
Copyright (c) 2013–2021 Utkan Güngördü <utkan@freeconsole.org>\
|
Copyright (c) 2013–2021 Utkan Güngördü <utkan@freeconsole.org>\
|
||||||
Copyright (c) 2021–2022 Piotr Grabowski
|
Copyright (c) 2021–2024 Piotr Grabowski
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify it under
|
This program is free software: you can redistribute it and/or modify it under
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
|
|
8
app.go
8
app.go
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -70,6 +70,7 @@ type State struct {
|
||||||
RecentManager *gtk.RecentManager
|
RecentManager *gtk.RecentManager
|
||||||
BackgroundColorCssProvider *gtk.CssProvider
|
BackgroundColorCssProvider *gtk.CssProvider
|
||||||
PageCacheTrimTimeoutHandle *glib.SourceHandle
|
PageCacheTrimTimeoutHandle *glib.SourceHandle
|
||||||
|
UITemporarilyRevealed bool
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:embed about.jpg
|
//go:embed about.jpg
|
||||||
|
@ -236,6 +237,11 @@ func (app *App) handleKeyPress(key uint, shift bool, ctrl bool) {
|
||||||
} else {
|
} else {
|
||||||
app.W.MenuItemNextPage.Activate()
|
app.W.MenuItemNextPage.Activate()
|
||||||
}
|
}
|
||||||
|
case gdk.KEY_Alt_L:
|
||||||
|
if app.Config.HideUI {
|
||||||
|
app.S.UITemporarilyRevealed = !app.S.UITemporarilyRevealed
|
||||||
|
app.toggleHideUI(!app.S.UITemporarilyRevealed)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -24,7 +24,6 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"reflect"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/fauu/gomicsv/archive"
|
"github.com/fauu/gomicsv/archive"
|
||||||
|
@ -119,7 +118,7 @@ func (app *App) doLoadArchive(path string, assumeHTTPURL bool, httpReferer strin
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *App) archiveIsLoaded() bool {
|
func (app *App) archiveIsLoaded() bool {
|
||||||
return app.S.Archive != nil && !reflect.ValueOf(app.S.Archive).IsNil() && app.S.ArchivePath != ""
|
return app.S.ArchivePath != ""
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *App) archiveGetBaseName() string {
|
func (app *App) archiveGetBaseName() string {
|
||||||
|
@ -144,7 +143,6 @@ func (app *App) archiveClose() {
|
||||||
|
|
||||||
app.S.Archive.Close()
|
app.S.Archive.Close()
|
||||||
|
|
||||||
app.S.Archive = nil
|
|
||||||
app.S.ArchivePath = ""
|
app.S.ArchivePath = ""
|
||||||
app.S.ArchivePos = 0
|
app.S.ArchivePos = 0
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -64,7 +64,9 @@ func NewArchive(path string, pageCache *pagecache.PageCache, httpReferer string)
|
||||||
switch ext {
|
switch ext {
|
||||||
case "zip", "cbz":
|
case "zip", "cbz":
|
||||||
return NewZip(path)
|
return NewZip(path)
|
||||||
case "7z", "rar", "tar", "tgz", "gz", "tbz2", "cb7", "cbr", "cbt", "lha":
|
case "rar":
|
||||||
|
return NewRar(path)
|
||||||
|
case "7z", "tar", "tgz", "gz", "tbz2", "cb7", "cbr", "cbt", "lha":
|
||||||
return nil, errors.New("Archive type not supported, please unpack it first")
|
return nil, errors.New("Archive type not supported, please unpack it first")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
162
archive/rar.go
Normal file
162
archive/rar.go
Normal file
|
@ -0,0 +1,162 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package archive
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"path/filepath"
|
||||||
|
"sort"
|
||||||
|
|
||||||
|
"github.com/fauu/gomicsv/pixbuf"
|
||||||
|
"github.com/gotk3/gotk3/gdk"
|
||||||
|
"github.com/nwaples/rardecode/v2"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Rar struct {
|
||||||
|
files RarMembers // Sorted by name
|
||||||
|
reader *rardecode.ReadCloser
|
||||||
|
name string
|
||||||
|
}
|
||||||
|
|
||||||
|
type RarMember struct {
|
||||||
|
Header *rardecode.FileHeader
|
||||||
|
Offset int // in terms of files
|
||||||
|
}
|
||||||
|
|
||||||
|
type RarMembers []RarMember
|
||||||
|
|
||||||
|
func (p RarMembers) Len() int { return len(p) }
|
||||||
|
func (p RarMembers) Less(i, j int) bool { return strcmp(p[i].Header.Name, p[j].Header.Name, true) }
|
||||||
|
func (p RarMembers) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
||||||
|
|
||||||
|
// NewRar reads supported image filenames from a given rar archive and sorts them
|
||||||
|
func NewRar(name string) (*Rar, error) {
|
||||||
|
var err error
|
||||||
|
|
||||||
|
ar := new(Rar)
|
||||||
|
|
||||||
|
ar.name = filepath.Base(name)
|
||||||
|
ar.files = make([]RarMember, 0, MaxArchiveEntries)
|
||||||
|
ar.reader, err = rardecode.OpenReader(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
offsetAcc := -1
|
||||||
|
for {
|
||||||
|
offsetAcc += 1
|
||||||
|
|
||||||
|
header, err := ar.reader.Next()
|
||||||
|
if err != nil {
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
log.Printf("error reading a file inside the rar archive: %v", err)
|
||||||
|
}
|
||||||
|
if header.IsDir {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if !extensionMatches(header.Name, imageExtensions) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
ar.files = append(ar.files, RarMember{
|
||||||
|
Header: header,
|
||||||
|
Offset: offsetAcc,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(ar.files) == 0 {
|
||||||
|
return nil, errors.New(ar.name + ": no supported images in the rar file")
|
||||||
|
}
|
||||||
|
|
||||||
|
sort.Sort(RarMembers(ar.files))
|
||||||
|
|
||||||
|
ar.Close()
|
||||||
|
|
||||||
|
return ar, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ar *Rar) checkbounds(i int) error {
|
||||||
|
if i < 0 || i >= len(ar.files) {
|
||||||
|
return ErrBounds
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ar *Rar) Load(i int, autorotate bool, _nPreload int) (*gdk.Pixbuf, error) {
|
||||||
|
var err error
|
||||||
|
if err = ar.checkbounds(i); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ar.reader, err = rardecode.OpenReader(ar.name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
targetOffset := ar.files[i].Offset
|
||||||
|
offsetAcc := -1
|
||||||
|
for {
|
||||||
|
offsetAcc += 1
|
||||||
|
|
||||||
|
header, err := ar.reader.Next()
|
||||||
|
if err != nil {
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
log.Printf("error reading a file inside the rar archive: %v", err)
|
||||||
|
}
|
||||||
|
if header.IsDir {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if offsetAcc == targetOffset {
|
||||||
|
defer ar.Close()
|
||||||
|
return pixbuf.Load(ar.reader, autorotate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, fmt.Errorf(ar.name + ": could not find a file inside the rar archive")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ar *Rar) Kind() Kind {
|
||||||
|
return Packed
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ar *Rar) ArchiveName() string {
|
||||||
|
return ar.name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ar *Rar) Name(i int) (string, error) {
|
||||||
|
if err := ar.checkbounds(i); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return ar.files[i].Header.Name, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ar *Rar) Len() *int {
|
||||||
|
l := len(ar.files)
|
||||||
|
return &l
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ar *Rar) Close() error {
|
||||||
|
return ar.reader.Close()
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -37,7 +37,7 @@ type Loader interface {
|
||||||
Len() int
|
Len() int
|
||||||
}
|
}
|
||||||
|
|
||||||
var archiveExtensions = []string{".zip", ".cbz"}
|
var archiveExtensions = []string{".zip", ".cbz", ".rar"}
|
||||||
var imageExtensions []string
|
var imageExtensions []string
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -119,7 +119,7 @@ func NewFile(f *os.File) *File {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *File) Size() (int64, error) {
|
func (r *File) Size() (int64, error) {
|
||||||
fi, err := r.Stat()
|
fi, err := r.Stat() // nolint:typecheck
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
@ -127,11 +127,11 @@ func (r *File) Size() (int64, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *File) SetSize(n int64) error {
|
func (r *File) SetSize(n int64) error {
|
||||||
return r.Truncate(n)
|
return r.Truncate(n) // nolint:typecheck
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *File) Ext() string {
|
func (r *File) Ext() string {
|
||||||
ext := filepath.Ext(r.Name())
|
ext := filepath.Ext(r.Name()) // nolint:typecheck
|
||||||
if len(ext) <= 1 || ext[0] != '.' {
|
if len(ext) <= 1 || ext[0] != '.' {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
@ -156,7 +156,7 @@ func (b *Buffer) SetSize(int64) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Buffer) Size() (int64, error) {
|
func (b *Buffer) Size() (int64, error) {
|
||||||
return int64(b.Len()), nil
|
return int64(b.Len()), nil // nolint:typecheck
|
||||||
}
|
}
|
||||||
|
|
||||||
func strcmp(a, b string, nat bool) bool {
|
func strcmp(a, b string, nat bool) bool {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
2
color.go
2
color.go
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
23
config.go
23
config.go
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -194,30 +194,15 @@ func (app *App) setVFlip(vflip bool) {
|
||||||
|
|
||||||
func (app *App) setFullscreen(fullscreen bool) {
|
func (app *App) setFullscreen(fullscreen bool) {
|
||||||
app.Config.Fullscreen = fullscreen
|
app.Config.Fullscreen = fullscreen
|
||||||
|
app.toggleFullscreen(fullscreen)
|
||||||
if fullscreen {
|
|
||||||
app.W.MainWindow.Fullscreen()
|
|
||||||
} else {
|
|
||||||
app.W.MainWindow.Unfullscreen()
|
|
||||||
}
|
|
||||||
|
|
||||||
app.W.MenuItemFullscreen.SetActive(fullscreen)
|
app.W.MenuItemFullscreen.SetActive(fullscreen)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *App) setHideUI(hideUI bool) {
|
func (app *App) setHideUI(hideUI bool) {
|
||||||
app.Config.HideUI = hideUI
|
app.Config.HideUI = hideUI
|
||||||
|
app.toggleHideUI(hideUI)
|
||||||
if hideUI {
|
|
||||||
app.W.Menubar.Hide()
|
|
||||||
app.W.Toolbar.Hide()
|
|
||||||
app.W.Statusbar.Hide()
|
|
||||||
} else {
|
|
||||||
app.W.Menubar.Show()
|
|
||||||
app.W.Toolbar.Show()
|
|
||||||
app.W.Statusbar.Show()
|
|
||||||
}
|
|
||||||
|
|
||||||
app.W.MenuItemHideUI.SetActive(hideUI)
|
app.W.MenuItemHideUI.SetActive(hideUI)
|
||||||
|
app.S.UITemporarilyRevealed = false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *App) setShrink(shrink bool) {
|
func (app *App) setShrink(shrink bool) {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
11
go.mod
11
go.mod
|
@ -2,11 +2,12 @@ module github.com/fauu/gomicsv
|
||||||
|
|
||||||
replace github.com/fauu/gomicsv => ./
|
replace github.com/fauu/gomicsv => ./
|
||||||
|
|
||||||
go 1.17
|
go 1.20
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/flytam/filenamify v1.1.0
|
github.com/flytam/filenamify v1.2.0
|
||||||
github.com/gotk3/gotk3 v0.6.1
|
github.com/gotk3/gotk3 v0.6.3
|
||||||
github.com/spf13/pflag v1.0.5
|
github.com/nwaples/rardecode/v2 v2.0.0-beta.2
|
||||||
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6
|
github.com/spf13/pflag v1.0.5
|
||||||
|
golang.org/x/sys v0.24.0
|
||||||
)
|
)
|
||||||
|
|
30
go.sum
30
go.sum
|
@ -1,16 +1,22 @@
|
||||||
github.com/diamondburned/gotk4 v0.0.3-0.20220418035147-8a785583d00a h1:u+75gz/SWdpIWJaD0TFR4lgmz+s0JUkKfLXgJesf+GQ=
|
github.com/flytam/filenamify v1.1.2 h1:dGlfWU4zrhDlsmvob4IFcfgjG5vIjfo4UwLyec6Wx94=
|
||||||
github.com/diamondburned/gotk4 v0.0.3-0.20220418035147-8a785583d00a/go.mod h1:WbOkeM91aOubLbxqcbYwd7q/HCKxAmqObvT5Dhpzm1Y=
|
github.com/flytam/filenamify v1.1.2/go.mod h1:Dzf9kVycwcsBlr2ATg6uxjqiFgKGH+5SKFuhdeP5zu8=
|
||||||
github.com/diamondburned/gotk4/pkg v0.0.0-20220418035147-8a785583d00a h1:UrzOwwQiOLckSyU1ETP66Qz9XV/vvVCn0RS1YTY1prk=
|
github.com/flytam/filenamify v1.2.0 h1:7RiSqXYR4cJftDQ5NuvljKMfd/ubKnW/j9C6iekChgI=
|
||||||
github.com/diamondburned/gotk4/pkg v0.0.0-20220418035147-8a785583d00a/go.mod h1:rLH6FHos690jFgAM/GYEpMykuE/9NmN6zOvFlr8JTvE=
|
github.com/flytam/filenamify v1.2.0/go.mod h1:Dzf9kVycwcsBlr2ATg6uxjqiFgKGH+5SKFuhdeP5zu8=
|
||||||
github.com/flytam/filenamify v1.1.0 h1:iEOcC/1UgxJf4lp2E2CWtYO7TMyYmgb2RPSTou89FLs=
|
|
||||||
github.com/flytam/filenamify v1.1.0/go.mod h1:Dzf9kVycwcsBlr2ATg6uxjqiFgKGH+5SKFuhdeP5zu8=
|
|
||||||
github.com/gotk3/gotk3 v0.6.0 h1:Aqlq4/6VabNwtCyA9M9zFNad5yHAqCi5heWnZ9y+3dA=
|
|
||||||
github.com/gotk3/gotk3 v0.6.0/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
|
|
||||||
github.com/gotk3/gotk3 v0.6.1 h1:GJ400a0ecEEWrzjBvzBzH+pB/esEMIGdB9zPSmBdoeo=
|
github.com/gotk3/gotk3 v0.6.1 h1:GJ400a0ecEEWrzjBvzBzH+pB/esEMIGdB9zPSmBdoeo=
|
||||||
github.com/gotk3/gotk3 v0.6.1/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
|
github.com/gotk3/gotk3 v0.6.1/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
|
||||||
|
github.com/gotk3/gotk3 v0.6.2 h1:sx/PjaKfKULJPTPq8p2kn2ZbcNFxpOJqi4VLzMbEOO8=
|
||||||
|
github.com/gotk3/gotk3 v0.6.2/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
|
||||||
|
github.com/gotk3/gotk3 v0.6.3 h1:+Ke4WkM1TQUNOlM2TZH6szqknqo+zNbX3BZWVXjSHYw=
|
||||||
|
github.com/gotk3/gotk3 v0.6.3/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
|
||||||
|
github.com/gotk3/gotk3 v0.6.4 h1:5ur/PRr86PwCG8eSj98D1eXvhrNNK6GILS2zq779dCg=
|
||||||
|
github.com/gotk3/gotk3 v0.6.4/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
|
||||||
|
github.com/nwaples/rardecode/v2 v2.0.0-beta.2 h1:e3mzJFJs4k83GXBEiTaQ5HgSc/kOK8q0rDaRO0MPaOk=
|
||||||
|
github.com/nwaples/rardecode/v2 v2.0.0-beta.2/go.mod h1:yntwv/HfMc/Hbvtq9I19D1n58te3h6KsqCf3GxyfBGY=
|
||||||
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5 h1:y/woIyUBFbpQGKS0u1aHF/40WUDnek3fPOyD08H5Vng=
|
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
|
||||||
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60=
|
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
|
||||||
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
|
||||||
|
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||||
|
|
43
gomicsv.ui
43
gomicsv.ui
|
@ -1,7 +1,7 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!--
|
<!--
|
||||||
Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
Copyright (c) 2021-2022 Piotr Grabowski
|
Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -23,6 +23,7 @@
|
||||||
<mime-types>
|
<mime-types>
|
||||||
<mime-type>application/zip</mime-type>
|
<mime-type>application/zip</mime-type>
|
||||||
<mime-type>application/x-cbz</mime-type>
|
<mime-type>application/x-cbz</mime-type>
|
||||||
|
<mime-type>application/vnd.rar</mime-type>
|
||||||
</mime-types>
|
</mime-types>
|
||||||
</object>
|
</object>
|
||||||
<object class="GtkRecentFilter" id="RecentFilter">
|
<object class="GtkRecentFilter" id="RecentFilter">
|
||||||
|
@ -168,6 +169,28 @@
|
||||||
<object class="GtkMenu" id="MenuView">
|
<object class="GtkMenu" id="MenuView">
|
||||||
<property name="visible">true</property>
|
<property name="visible">true</property>
|
||||||
<property name="can-focus">false</property>
|
<property name="can-focus">false</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckMenuItem" id="MenuItemFullscreen">
|
||||||
|
<property name="visible">true</property>
|
||||||
|
<property name="can-focus">false</property>
|
||||||
|
<property name="label" translatable="yes">Fullscreen</property>
|
||||||
|
<property name="use-underline">true</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckMenuItem" id="MenuItemHideUI">
|
||||||
|
<property name="visible">true</property>
|
||||||
|
<property name="can-focus">false</property>
|
||||||
|
<property name="label" translatable="yes">Hide UI</property>
|
||||||
|
<property name="use-underline">true</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkSeparatorMenuItem" id="menuitem0">
|
||||||
|
<property name="visible">true</property>
|
||||||
|
<property name="can-focus">false</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkCheckMenuItem" id="MenuItemShrink">
|
<object class="GtkCheckMenuItem" id="MenuItemShrink">
|
||||||
<property name="visible">true</property>
|
<property name="visible">true</property>
|
||||||
|
@ -243,22 +266,6 @@
|
||||||
<property name="can-focus">false</property>
|
<property name="can-focus">false</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
|
||||||
<object class="GtkCheckMenuItem" id="MenuItemFullscreen">
|
|
||||||
<property name="visible">true</property>
|
|
||||||
<property name="can-focus">false</property>
|
|
||||||
<property name="label" translatable="yes">Fullscreen</property>
|
|
||||||
<property name="use-underline">true</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child>
|
|
||||||
<object class="GtkCheckMenuItem" id="MenuItemHideUI">
|
|
||||||
<property name="visible">true</property>
|
|
||||||
<property name="can-focus">false</property>
|
|
||||||
<property name="label" translatable="yes">Hide UI</property>
|
|
||||||
<property name="use-underline">true</property>
|
|
||||||
</object>
|
|
||||||
</child>
|
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkCheckMenuItem" id="MenuItemSeamless">
|
<object class="GtkCheckMenuItem" id="MenuItemSeamless">
|
||||||
<property name="visible">true</property>
|
<property name="visible">true</property>
|
||||||
|
@ -726,7 +733,7 @@
|
||||||
<property name="transient-for">MainWindow</property>
|
<property name="transient-for">MainWindow</property>
|
||||||
<property name="program-name">Gomics-v</property>
|
<property name="program-name">Gomics-v</property>
|
||||||
<property name="copyright" translatable="yes">Copyright (c) 2013–2021 Utkan Güngördü
|
<property name="copyright" translatable="yes">Copyright (c) 2013–2021 Utkan Güngördü
|
||||||
Copyright (c) 2021–2022 Piotr Grabowski</property>
|
Copyright (c) 2021–2024 Piotr Grabowski</property>
|
||||||
<property name="comments" translatable="yes">Gomics-v is a GTK comic and image archive viewer written in Go, available under the GNU GPL v3 or later.</property>
|
<property name="comments" translatable="yes">Gomics-v is a GTK comic and image archive viewer written in Go, available under the GNU GPL v3 or later.</property>
|
||||||
<property name="website">https://github.com/fauu/gomicsv</property>
|
<property name="website">https://github.com/fauu/gomicsv</property>
|
||||||
<property name="authors">Utkan Güngördü, Piotr Grabowski</property>
|
<property name="authors">Utkan Güngördü, Piotr Grabowski</property>
|
||||||
|
|
2
goto.go
2
goto.go
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
2
gtk.go
2
gtk.go
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
2
image.go
2
image.go
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -35,6 +35,12 @@ func (app *App) imageAreaInit() {
|
||||||
})
|
})
|
||||||
|
|
||||||
app.W.ScrolledWindow.Connect("button-press-event", func(self *gtk.ScrolledWindow, event *gdk.Event) bool {
|
app.W.ScrolledWindow.Connect("button-press-event", func(self *gtk.ScrolledWindow, event *gdk.Event) bool {
|
||||||
|
if app.S.UITemporarilyRevealed {
|
||||||
|
app.S.UITemporarilyRevealed = false
|
||||||
|
app.toggleHideUI(true)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
be := &gdk.EventButton{Event: event}
|
be := &gdk.EventButton{Event: event}
|
||||||
switch be.Button() {
|
switch be.Button() {
|
||||||
case 1:
|
case 1:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -25,6 +25,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
|
||||||
"github.com/gotk3/gotk3/gdk"
|
"github.com/gotk3/gotk3/gdk"
|
||||||
)
|
)
|
||||||
|
@ -166,6 +167,6 @@ func kamiteSendOCRImageCommand(port int, imgBytes []byte, w, h int) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func kamiteMakeEndpointURL(port int, suffix string) string {
|
func kamiteMakeEndpointURL(port int, suffix string) string {
|
||||||
// TODO(fau): Go 1.19+ url.JoinPath()
|
path, _ := url.JoinPath(fmt.Sprintf(kamiteCMDEndpointBaseTpl, port), suffix)
|
||||||
return fmt.Sprintf(kamiteCMDEndpointBaseTpl, port) + suffix
|
return path
|
||||||
}
|
}
|
||||||
|
|
2
md5.go
2
md5.go
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
2
menu.go
2
menu.go
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -293,7 +293,7 @@ func (app *App) currentArchiveIdx() (idx int, err error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if idx == -1 {
|
if idx == -1 {
|
||||||
return 0, errors.New("Couldn't find the current archive in the current dir. Deleted, perhaps?")
|
return 0, errors.New("could not find the current archive in the current directory. Deleted, perhaps?")
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -321,7 +321,7 @@ func (app *App) archiveNameRelativeToCurrent(relIdx int) (newName string, err er
|
||||||
|
|
||||||
idx := currIdx + relIdx
|
idx := currIdx + relIdx
|
||||||
if idx < 0 || idx >= len(arNames) {
|
if idx < 0 || idx >= len(arNames) {
|
||||||
err = errors.New("No more archives in the directory")
|
err = errors.New("no more archives in the directory")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
2
page.go
2
page.go
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -95,6 +95,7 @@ func (app *App) scroll(dx, dy float64) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *App) scrollToStart() {
|
func (app *App) scrollToStart() {
|
||||||
|
app.W.ScrolledWindow.SetVAdjustment(nil) // Needed to prevent a bug where it scrolls back by itself
|
||||||
app.W.ScrolledWindow.GetVAdjustment().SetValue(0) // Vertical: top
|
app.W.ScrolledWindow.GetVAdjustment().SetValue(0) // Vertical: top
|
||||||
|
|
||||||
var newHadj float64 = 0
|
var newHadj float64 = 0
|
||||||
|
@ -102,18 +103,21 @@ func (app *App) scrollToStart() {
|
||||||
imgw, _ := app.getImageAreaInnerSize()
|
imgw, _ := app.getImageAreaInnerSize()
|
||||||
newHadj = float64(imgw)
|
newHadj = float64(imgw)
|
||||||
}
|
}
|
||||||
|
app.W.ScrolledWindow.SetHAdjustment(nil)
|
||||||
app.W.ScrolledWindow.GetHAdjustment().SetValue(newHadj) // Horizontal: left (non-manga) or right (manga) edge
|
app.W.ScrolledWindow.GetHAdjustment().SetValue(newHadj) // Horizontal: left (non-manga) or right (manga) edge
|
||||||
}
|
}
|
||||||
|
|
||||||
func (app *App) scrollToEnd() {
|
func (app *App) scrollToEnd() {
|
||||||
imgw, imgh := app.getImageAreaInnerSize()
|
imgw, imgh := app.getImageAreaInnerSize()
|
||||||
|
|
||||||
|
app.W.ScrolledWindow.SetVAdjustment(nil)
|
||||||
app.W.ScrolledWindow.GetVAdjustment().SetValue(float64(imgh)) // Vertical: bottom
|
app.W.ScrolledWindow.GetVAdjustment().SetValue(float64(imgh)) // Vertical: bottom
|
||||||
|
|
||||||
var newHadj float64 = 0
|
var newHadj float64 = 0
|
||||||
if !app.Config.MangaMode {
|
if !app.Config.MangaMode {
|
||||||
newHadj = float64(imgw)
|
newHadj = float64(imgw)
|
||||||
}
|
}
|
||||||
|
app.W.ScrolledWindow.SetHAdjustment(nil)
|
||||||
app.W.ScrolledWindow.GetHAdjustment().SetValue(newHadj) // Horizontal: left (manga) or right (non-manga) edge
|
app.W.ScrolledWindow.GetHAdjustment().SetValue(newHadj) // Horizontal: left (manga) or right (non-manga) edge
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
41
standard_paths_darwin.go
Normal file
41
standard_paths_darwin.go
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
//go:build darwin
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package gomicsv
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getConfigLocation(appName string) (string, error) {
|
||||||
|
return getUserDataLocation(appName)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getUserDataLocation(appName string) (string, error) {
|
||||||
|
if appName == "" {
|
||||||
|
return "", errors.New("'appName' is empty")
|
||||||
|
}
|
||||||
|
if envHome := os.Getenv("HOME"); envHome != "" {
|
||||||
|
return filepath.Join(envHome, "Library", "Application Support", appName), nil
|
||||||
|
}
|
||||||
|
return "", errors.New("getting user appdata directory")
|
||||||
|
}
|
41
standard_paths_windows.go
Normal file
41
standard_paths_windows.go
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
//go:build windows
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package gomicsv
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
func getConfigLocation(appName string) (string, error) {
|
||||||
|
return getUserDataLocation(appName)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getUserDataLocation(appName string) (string, error) {
|
||||||
|
if appName == "" {
|
||||||
|
return "", errors.New("'appName' is empty")
|
||||||
|
}
|
||||||
|
if envAppdata := os.Getenv("APPDATA"); envAppdata != "" {
|
||||||
|
return filepath.Join(envAppdata, appName), nil
|
||||||
|
}
|
||||||
|
return "", errors.New("getting user appdata directory")
|
||||||
|
}
|
|
@ -1,9 +1,8 @@
|
||||||
//go:build linux
|
//go:build freebsd || linux || netbsd || openbsd || solaris
|
||||||
// +build linux
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
22
ui.go
22
ui.go
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -119,3 +119,23 @@ func (app *App) syncWidgetsToConfig() {
|
||||||
app.W.KamitePortContainer.SetSensitive(app.Config.KamiteEnabled)
|
app.W.KamitePortContainer.SetSensitive(app.Config.KamiteEnabled)
|
||||||
app.W.KamitePortEntry.SetText(fmt.Sprint(app.Config.KamitePort))
|
app.W.KamitePortEntry.SetText(fmt.Sprint(app.Config.KamitePort))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (app *App) toggleHideUI(hideUI bool) {
|
||||||
|
if hideUI {
|
||||||
|
app.W.Menubar.Hide()
|
||||||
|
app.W.Toolbar.Hide()
|
||||||
|
app.W.Statusbar.Hide()
|
||||||
|
} else {
|
||||||
|
app.W.Menubar.Show()
|
||||||
|
app.W.Toolbar.Show()
|
||||||
|
app.W.Statusbar.Show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (app *App) toggleFullscreen(fullscreen bool) {
|
||||||
|
if fullscreen {
|
||||||
|
app.W.MainWindow.Fullscreen()
|
||||||
|
} else {
|
||||||
|
app.W.MainWindow.Unfullscreen()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
* Copyright (c) 2013-2021 Utkan Güngördü <utkan@freeconsole.org>
|
||||||
* Copyright (c) 2021-2022 Piotr Grabowski
|
* Copyright (c) 2021-2024 Piotr Grabowski
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
Loading…
Reference in a new issue