Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for cursor shapes and images #304

Merged
merged 1 commit into from
Aug 2, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
.idea
.vscode
/darktile
26 changes: 18 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,19 @@ Darktile is a GPU rendered terminal emulator designed for tiling window managers

- GPU rendering
- Unicode support
- Variety of themes available (or build your own!)
- Compiled-in powerline font
- Configurable/customisable, supports custom themes, fonts etc.
- Hints: Context-aware overlays e.g. hex colour viewer
- Works with your favourite monospaced TTF/OTF fonts
- Font ligatures (turn it off if you're not a ligature fan)
- Hints: Context-aware overlays e.g. hex colour viewer, octal permission annotation
- Take screenshots with a single key-binding
- Sixel support
- Transparency
- Sixels
- Window transparency (0-100%)
- Customisable cursor (most popular image formats supported)

<p align="center">
<img src="cursor.gif">
</p>

## Installation

Expand Down Expand Up @@ -43,11 +50,14 @@ Darktile will use sensible defaults if no config/theme files are available. The
Found in the config directory (see above) inside `config.yaml`.

```yaml
opacity: 1.0 # window opacity: 0.0 is fully transparent, 1.0 is fully opaque
opacity: 1.0 # Window opacity: 0.0 is fully transparent, 1.0 is fully opaque
font:
family: "" # Find possible values for this by running 'darktile list-fonts'
size: 16
dpi: 72
family: "" # Font family. Find possible values for this by running 'darktile list-fonts'
size: 16 # Font size
dpi: 72 # DPI
ligatures: true # Enable font ligatures e.g. render '≡' instead of '==='
cursor:
image: "" # Path to an image to render as your cursor (defaults to standard rectangular cursor)
```

### Example Theme
Expand Down
Binary file added cursor.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 23 additions & 0 deletions internal/app/darktile/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package cmd
import (
"errors"
"fmt"
"image"
"os"
"time"

Expand Down Expand Up @@ -48,6 +49,8 @@ var rootCmd = &cobra.Command{
if _, err := conf.Save(); err != nil {
return fmt.Errorf("failed to write config file: %w", err)
}
fmt.Println("Config written.")
return nil
}

var theme *termutil.Theme
Expand Down Expand Up @@ -91,6 +94,16 @@ var rootCmd = &cobra.Command{
gui.WithFontSize(conf.Font.Size),
gui.WithFontFamily(conf.Font.Family),
gui.WithOpacity(conf.Opacity),
gui.WithLigatures(conf.Font.Ligatures),
}

if conf.Cursor.Image != "" {
img, err := getImageFromFilePath(conf.Cursor.Image)
if err != nil {
startupErrors = append(startupErrors, err)
} else {
options = append(options, gui.WithCursorImage(img))
}
}

if screenshotAfterMS > 0 {
Expand Down Expand Up @@ -118,6 +131,16 @@ var rootCmd = &cobra.Command{
},
}

func getImageFromFilePath(filePath string) (image.Image, error) {
f, err := os.Open(filePath)
if err != nil {
return nil, err
}
defer f.Close()
image, _, err := image.Decode(f)
return image, err
}

func Execute() error {
rootCmd.Flags().BoolVar(&showVersion, "version", showVersion, "Show darktile version information and exit")
rootCmd.Flags().BoolVar(&rewriteConfig, "rewrite-config", rewriteConfig, "Write the resultant config after parsing config files and merging with defauls back to the config file")
Expand Down
12 changes: 9 additions & 3 deletions internal/app/darktile/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,18 @@ import (
type Config struct {
Opacity float64
Font Font
Cursor Cursor
}

type Font struct {
Family string
Size float64
DPI float64
Family string
Size float64
DPI float64
Ligatures bool
}

type Cursor struct {
Image string
}

type ErrorFileNotFound struct {
Expand Down
7 changes: 4 additions & 3 deletions internal/app/darktile/config/default.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@ import (
var defaultConfig = Config{
Opacity: 1.0,
Font: Font{
Family: "", // internally packed font will be loaded by default
Size: 18.0,
DPI: 72.0,
Family: "", // internally packed font will be loaded by default
Size: 18.0,
DPI: 72.0,
Ligatures: true,
},
}

Expand Down
Loading