mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-05-18 01:36:56 +02:00
Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2dbf7da249 | |||
| 95838fc896 | |||
| bdef1448e1 | |||
| 0b39551470 | |||
| ab528f799d | |||
| 8805fafa99 | |||
| 1219c3d118 | |||
| b792328676 | |||
| a7380db47c | |||
| 086993a7c0 | |||
| 51e1337f40 | |||
| 6cef8d9ef6 | |||
| 6e36b81669 | |||
| 0758c7d900 | |||
| f77a303b30 | |||
| 3a81f7babb | |||
| 3d8778a7d6 | |||
| a42e809ade | |||
| 66c5766848 | |||
| ac56590791 | |||
| 4d67f5fed3 | |||
| c91224295f | |||
| 4b1e3bd448 | |||
| 1cb8ed7f10 | |||
| 90271f1f99 | |||
| 9fde9ed6f8 | |||
| ce4479eb9f | |||
| f3b7f5ac42 | |||
| 382896dfd2 | |||
| ff4187aecf |
@@ -6,3 +6,9 @@ dummy.go
|
|||||||
komorebic/applications.yaml
|
komorebic/applications.yaml
|
||||||
komorebic/applications.json
|
komorebic/applications.json
|
||||||
/.vs
|
/.vs
|
||||||
|
/bar-schema
|
||||||
|
/komorebi-schema
|
||||||
|
/.wrangler
|
||||||
|
/.xwin-cache
|
||||||
|
result
|
||||||
|
/.direnv
|
||||||
|
|||||||
Generated
+293
-266
File diff suppressed because it is too large
Load Diff
+4
-1
@@ -24,7 +24,7 @@ egui_extras = "0.33"
|
|||||||
dirs = "6"
|
dirs = "6"
|
||||||
dunce = "1"
|
dunce = "1"
|
||||||
hotwatch = "0.5"
|
hotwatch = "0.5"
|
||||||
schemars = "0.8"
|
schemars = "1.1"
|
||||||
lazy_static = "1"
|
lazy_static = "1"
|
||||||
serde = { version = "1", features = ["derive"] }
|
serde = { version = "1", features = ["derive"] }
|
||||||
serde_json = { package = "serde_json_lenient", version = "0.2" }
|
serde_json = { package = "serde_json_lenient", version = "0.2" }
|
||||||
@@ -82,3 +82,6 @@ lto = true
|
|||||||
panic = "abort"
|
panic = "abort"
|
||||||
codegen-units = 1
|
codegen-units = 1
|
||||||
strip = true
|
strip = true
|
||||||
|
|
||||||
|
[workspace.metadata.crane]
|
||||||
|
name = "komorebi-workspace"
|
||||||
|
|||||||
@@ -29,6 +29,32 @@ Tiling Window Management for Windows.
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
## Note: Students using devices enrolled in mobile device management (MDM)
|
||||||
|
|
||||||
|
Your usage still falls under the [Komorebi License 2.0.0](./LICENSE.md).
|
||||||
|
|
||||||
|
You can email me at the address I sign my commits with (add `.patch` to the end
|
||||||
|
of any commit URL on GitHub to find it) from the address associated with your
|
||||||
|
institution with the subject "komorebi - student with an MDM device", and I will
|
||||||
|
be able to remove the splash intended for corporate users, whose usage falls
|
||||||
|
under the [Individual Commercial Use
|
||||||
|
License](https://lgug2z.com/software/komorebi).
|
||||||
|
|
||||||
|
This is currently a manual process - most days this shouldn't take more than
|
||||||
|
12h, and you will receive an email reply from me when the process is complete.
|
||||||
|
|
||||||
|
If you haven't had a reply to your email within 24h you can reach out to me on
|
||||||
|
Discord.
|
||||||
|
|
||||||
|
## Note: Unexpected mobile device management (MDM) detection prompts
|
||||||
|
|
||||||
|
You have most likely unintentionally enrolled your device in "Bring Your Own
|
||||||
|
Device" (BYOD) MDM. You can confirm if this is the case by running `dsregcmd
|
||||||
|
/status` and then take the appropriate steps to remove the MDM profile and take
|
||||||
|
back full control of your system.
|
||||||
|
|
||||||
|
If you need help doing this you can ask on Discord.
|
||||||
|
|
||||||
## Note: komorebi for Mac
|
## Note: komorebi for Mac
|
||||||
|
|
||||||
If you made your way to this repo looking for [komorebi for
|
If you made your way to this repo looking for [komorebi for
|
||||||
|
|||||||
@@ -0,0 +1,432 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Check schema.json and schema.bar.json for missing docstrings and map them to Rust source files.
|
||||||
|
|
||||||
|
This script analyzes the generated JSON schemas and identifies:
|
||||||
|
1. Type definitions ($defs) missing top-level descriptions
|
||||||
|
2. Enum variants missing descriptions (in oneOf/anyOf)
|
||||||
|
3. Enum variants missing titles (object variants in oneOf/anyOf)
|
||||||
|
4. Struct properties missing descriptions
|
||||||
|
5. Top-level schema properties missing descriptions
|
||||||
|
|
||||||
|
For each missing docstring, it attempts to find the corresponding Rust source
|
||||||
|
file and line number where the docstring should be added.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import json
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class MissingDoc:
|
||||||
|
type_name: str
|
||||||
|
kind: str # "type", "variant", "property", "variant_title"
|
||||||
|
item_name: Optional[str] # variant or property name
|
||||||
|
rust_file: Optional[str] = None
|
||||||
|
rust_line: Optional[int] = None
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
location = ""
|
||||||
|
if self.rust_file and self.rust_line:
|
||||||
|
location = f" -> {self.rust_file}:{self.rust_line}"
|
||||||
|
elif self.rust_file:
|
||||||
|
location = f" -> {self.rust_file}"
|
||||||
|
|
||||||
|
if self.kind == "type":
|
||||||
|
return f"[TYPE] {self.type_name}{location}"
|
||||||
|
elif self.kind == "variant":
|
||||||
|
return f"[VARIANT] {self.type_name}::{self.item_name}{location}"
|
||||||
|
elif self.kind == "variant_title":
|
||||||
|
return f"[VARIANT_TITLE] {self.type_name}::{self.item_name}{location}"
|
||||||
|
else:
|
||||||
|
return f"[PROPERTY] {self.type_name}.{self.item_name}{location}"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class SchemaConfig:
|
||||||
|
"""Configuration for a schema to check."""
|
||||||
|
|
||||||
|
schema_file: str
|
||||||
|
search_paths: list[str]
|
||||||
|
display_name: str
|
||||||
|
|
||||||
|
|
||||||
|
def find_rust_definition(
|
||||||
|
type_name: str, item_name: Optional[str], kind: str, search_paths: list[Path]
|
||||||
|
) -> tuple[Optional[str], Optional[int]]:
|
||||||
|
"""Find the Rust file and line number for a type/variant/property definition."""
|
||||||
|
|
||||||
|
if kind == "type":
|
||||||
|
patterns = [
|
||||||
|
rf"pub\s+enum\s+{type_name}\b",
|
||||||
|
rf"pub\s+struct\s+{type_name}\b",
|
||||||
|
]
|
||||||
|
elif kind in ("variant", "variant_title"):
|
||||||
|
patterns = [
|
||||||
|
rf"^\s*{re.escape(item_name)}\s*[,\(\{{]",
|
||||||
|
rf"^\s*{re.escape(item_name)}\s*$",
|
||||||
|
rf"^\s*#\[.*\]\s*\n\s*{re.escape(item_name)}\b",
|
||||||
|
]
|
||||||
|
else: # property
|
||||||
|
patterns = [rf"pub\s+{re.escape(item_name)}\s*:"]
|
||||||
|
|
||||||
|
for search_path in search_paths:
|
||||||
|
for rust_file in search_path.rglob("*.rs"):
|
||||||
|
try:
|
||||||
|
content = rust_file.read_text()
|
||||||
|
lines = content.split("\n")
|
||||||
|
|
||||||
|
if kind == "type":
|
||||||
|
for pattern in patterns:
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
if re.search(pattern, line):
|
||||||
|
return str(rust_file), i + 1
|
||||||
|
|
||||||
|
elif kind in ("variant", "variant_title", "property"):
|
||||||
|
parent_pattern = rf"pub\s+(?:enum|struct)\s+{type_name}\b"
|
||||||
|
in_type = False
|
||||||
|
brace_count = 0
|
||||||
|
found_open_brace = False
|
||||||
|
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
if re.search(parent_pattern, line):
|
||||||
|
in_type = True
|
||||||
|
brace_count = 0
|
||||||
|
found_open_brace = False
|
||||||
|
|
||||||
|
if in_type:
|
||||||
|
if "{" in line:
|
||||||
|
found_open_brace = True
|
||||||
|
brace_count += line.count("{") - line.count("}")
|
||||||
|
|
||||||
|
for pattern in patterns:
|
||||||
|
if re.search(pattern, line):
|
||||||
|
return str(rust_file), i + 1
|
||||||
|
|
||||||
|
if found_open_brace and brace_count <= 0:
|
||||||
|
in_type = False
|
||||||
|
except Exception:
|
||||||
|
continue
|
||||||
|
|
||||||
|
return None, None
|
||||||
|
|
||||||
|
|
||||||
|
def _get_variant_identifier(variant: dict) -> str:
|
||||||
|
"""Extract a meaningful identifier for a variant.
|
||||||
|
|
||||||
|
Tries to find the best identifier by checking:
|
||||||
|
1. A top-level const value (e.g., {"const": "Linear"})
|
||||||
|
2. A property with a const value (e.g., {"kind": {"const": "Bar"}})
|
||||||
|
3. The first required property name
|
||||||
|
4. The type field
|
||||||
|
5. Falls back to "unknown"
|
||||||
|
"""
|
||||||
|
# Check for top-level const value (simple enum variant)
|
||||||
|
if "const" in variant:
|
||||||
|
return str(variant["const"])
|
||||||
|
|
||||||
|
properties = variant.get("properties", {})
|
||||||
|
|
||||||
|
# Check for a property with a const value (common pattern for tagged enums)
|
||||||
|
for prop_name, prop_def in properties.items():
|
||||||
|
if isinstance(prop_def, dict) and "const" in prop_def:
|
||||||
|
return str(prop_def["const"])
|
||||||
|
|
||||||
|
# Fall back to first required property name
|
||||||
|
required = variant.get("required", [])
|
||||||
|
if required:
|
||||||
|
return str(required[0])
|
||||||
|
|
||||||
|
# Fall back to type
|
||||||
|
if "type" in variant:
|
||||||
|
return str(variant["type"])
|
||||||
|
|
||||||
|
return "unknown"
|
||||||
|
|
||||||
|
|
||||||
|
def check_type_description(type_name: str, type_def: dict) -> list[MissingDoc]:
|
||||||
|
"""Check if a type definition has proper documentation."""
|
||||||
|
missing = []
|
||||||
|
has_top_description = "description" in type_def
|
||||||
|
|
||||||
|
# Always check for top-level type description first
|
||||||
|
# (except for types that are purely references or have special handling)
|
||||||
|
needs_type_description = True
|
||||||
|
|
||||||
|
# Check oneOf variants (tagged enums with variant descriptions)
|
||||||
|
if "oneOf" in type_def:
|
||||||
|
# oneOf types should have a top-level description
|
||||||
|
if not has_top_description:
|
||||||
|
missing.append(MissingDoc(type_name, "type", None, None, None))
|
||||||
|
|
||||||
|
for variant in type_def["oneOf"]:
|
||||||
|
# Case 1: Simple const variant (e.g., {"const": "Swap", "description": "..."})
|
||||||
|
variant_name = variant.get("const") or variant.get("title")
|
||||||
|
if variant_name and "description" not in variant:
|
||||||
|
missing.append(
|
||||||
|
MissingDoc(type_name, "variant", str(variant_name), None, None)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Case 2: String enum inside oneOf (e.g., {"type": "string", "enum": [...]})
|
||||||
|
# These variants don't have individual descriptions in the schema
|
||||||
|
if "enum" in variant and variant.get("type") == "string":
|
||||||
|
for enum_variant in variant["enum"]:
|
||||||
|
missing.append(
|
||||||
|
MissingDoc(type_name, "variant", str(enum_variant), None, None)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Case 3: Object variant with properties (e.g., CubicBezier)
|
||||||
|
if "properties" in variant and "description" not in variant:
|
||||||
|
for prop_name in variant.get("required", []):
|
||||||
|
missing.append(
|
||||||
|
MissingDoc(type_name, "variant", str(prop_name), None, None)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Case 4: Object variant missing title (needed for schema UI display)
|
||||||
|
# Object variants should have a title or const for proper display in editors
|
||||||
|
if (
|
||||||
|
"properties" in variant
|
||||||
|
and "title" not in variant
|
||||||
|
and "const" not in variant
|
||||||
|
):
|
||||||
|
# Try to find a good identifier for the variant (for display only)
|
||||||
|
variant_id = _get_variant_identifier(variant)
|
||||||
|
missing.append(
|
||||||
|
MissingDoc(type_name, "variant_title", str(variant_id), None, None)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check anyOf variants - check each variant individually
|
||||||
|
elif "anyOf" in type_def:
|
||||||
|
# anyOf types should have a top-level description
|
||||||
|
if not has_top_description:
|
||||||
|
missing.append(MissingDoc(type_name, "type", None, None, None))
|
||||||
|
|
||||||
|
# Check each variant for description (skip pure $ref and null types)
|
||||||
|
for variant in type_def["anyOf"]:
|
||||||
|
# Skip null type variants (used for Option<T>)
|
||||||
|
if variant.get("type") == "null":
|
||||||
|
continue
|
||||||
|
# Skip pure $ref variants (the referenced type is checked separately)
|
||||||
|
if "$ref" in variant and len(variant) == 1:
|
||||||
|
continue
|
||||||
|
# Skip $ref variants that have a description
|
||||||
|
if "$ref" in variant and "description" in variant:
|
||||||
|
continue
|
||||||
|
# Variant with $ref but no description
|
||||||
|
if "$ref" in variant and "description" not in variant:
|
||||||
|
# Extract the type name from the $ref
|
||||||
|
ref_name = variant["$ref"].split("/")[-1]
|
||||||
|
missing.append(MissingDoc(type_name, "variant", ref_name, None, None))
|
||||||
|
# Non-ref variant without description
|
||||||
|
elif "description" not in variant and "$ref" not in variant:
|
||||||
|
# Try to identify the variant by its type or const
|
||||||
|
variant_id = variant.get("const") or variant.get("type") or "unknown"
|
||||||
|
missing.append(
|
||||||
|
MissingDoc(type_name, "variant", str(variant_id), None, None)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check for missing title on object variants in anyOf
|
||||||
|
if (
|
||||||
|
"properties" in variant
|
||||||
|
and "title" not in variant
|
||||||
|
and "const" not in variant
|
||||||
|
):
|
||||||
|
variant_id = _get_variant_identifier(variant)
|
||||||
|
missing.append(
|
||||||
|
MissingDoc(type_name, "variant_title", str(variant_id), None, None)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check simple string enums (no oneOf means no variant descriptions possible in schema)
|
||||||
|
elif "enum" in type_def:
|
||||||
|
if not has_top_description:
|
||||||
|
missing.append(MissingDoc(type_name, "type", None, None, None))
|
||||||
|
# Each enum variant needs a docstring - these can't have descriptions in simple enum format
|
||||||
|
for variant in type_def["enum"]:
|
||||||
|
missing.append(MissingDoc(type_name, "variant", str(variant), None, None))
|
||||||
|
|
||||||
|
# Check struct properties
|
||||||
|
elif "properties" in type_def:
|
||||||
|
# Structs should always have a top-level description
|
||||||
|
if not has_top_description:
|
||||||
|
missing.append(MissingDoc(type_name, "type", None, None, None))
|
||||||
|
|
||||||
|
for prop_name, prop_def in type_def["properties"].items():
|
||||||
|
if "description" not in prop_def:
|
||||||
|
missing.append(MissingDoc(type_name, "property", prop_name, None, None))
|
||||||
|
|
||||||
|
# Simple type without description (like PathBuf, Hex)
|
||||||
|
elif not has_top_description:
|
||||||
|
# Only flag if it has a concrete type (not just a $ref)
|
||||||
|
if type_def.get("type") is not None:
|
||||||
|
missing.append(MissingDoc(type_name, "type", None, None, None))
|
||||||
|
|
||||||
|
return missing
|
||||||
|
|
||||||
|
|
||||||
|
def check_top_level_properties(schema: dict, root_type_name: str) -> list[MissingDoc]:
|
||||||
|
"""Check top-level schema properties for missing descriptions."""
|
||||||
|
missing = []
|
||||||
|
properties = schema.get("properties", {})
|
||||||
|
|
||||||
|
for prop_name, prop_def in properties.items():
|
||||||
|
if "description" not in prop_def:
|
||||||
|
missing.append(
|
||||||
|
MissingDoc(root_type_name, "property", prop_name, None, None)
|
||||||
|
)
|
||||||
|
|
||||||
|
return missing
|
||||||
|
|
||||||
|
|
||||||
|
def check_schema(
|
||||||
|
schema_path: Path,
|
||||||
|
search_paths: list[Path],
|
||||||
|
project_root: Path,
|
||||||
|
display_name: str,
|
||||||
|
) -> tuple[list[MissingDoc], int]:
|
||||||
|
"""Check a single schema file and return missing docs and exit code."""
|
||||||
|
if not schema_path.exists():
|
||||||
|
print(f"Error: {schema_path.name} not found at {schema_path}")
|
||||||
|
return [], 1
|
||||||
|
|
||||||
|
with open(schema_path) as f:
|
||||||
|
schema = json.load(f)
|
||||||
|
|
||||||
|
all_missing: list[MissingDoc] = []
|
||||||
|
|
||||||
|
# Check top-level schema properties
|
||||||
|
root_type_name = schema.get("title", "Root")
|
||||||
|
all_missing.extend(check_top_level_properties(schema, root_type_name))
|
||||||
|
|
||||||
|
# Check all type definitions
|
||||||
|
for type_name, type_def in sorted(schema.get("$defs", {}).items()):
|
||||||
|
# Skip PerAnimationPrefixConfig2/3 as they're generated variants
|
||||||
|
if (
|
||||||
|
type_name.startswith("PerAnimationPrefixConfig")
|
||||||
|
and type_name != "PerAnimationPrefixConfig"
|
||||||
|
):
|
||||||
|
continue
|
||||||
|
all_missing.extend(check_type_description(type_name, type_def))
|
||||||
|
|
||||||
|
# Find Rust source locations
|
||||||
|
print(f"Scanning Rust source files for {display_name}...", file=sys.stderr)
|
||||||
|
for doc in all_missing:
|
||||||
|
doc.rust_file, doc.rust_line = find_rust_definition(
|
||||||
|
doc.type_name, doc.item_name, doc.kind, search_paths
|
||||||
|
)
|
||||||
|
if doc.rust_file:
|
||||||
|
try:
|
||||||
|
doc.rust_file = str(Path(doc.rust_file).relative_to(project_root))
|
||||||
|
except ValueError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return all_missing, 0
|
||||||
|
|
||||||
|
|
||||||
|
def print_results(all_missing: list[MissingDoc], display_name: str) -> None:
|
||||||
|
"""Print the results for a schema check."""
|
||||||
|
# Group by file
|
||||||
|
by_file: dict[str, list[MissingDoc]] = {}
|
||||||
|
external: list[MissingDoc] = []
|
||||||
|
|
||||||
|
for doc in all_missing:
|
||||||
|
if doc.rust_file:
|
||||||
|
by_file.setdefault(doc.rust_file, []).append(doc)
|
||||||
|
else:
|
||||||
|
external.append(doc)
|
||||||
|
|
||||||
|
# Print summary
|
||||||
|
print("\n" + "=" * 70)
|
||||||
|
print(f"MISSING DOCSTRINGS IN SCHEMA ({display_name})")
|
||||||
|
print("=" * 70)
|
||||||
|
|
||||||
|
type_count = sum(1 for d in all_missing if d.kind == "type")
|
||||||
|
variant_count = sum(1 for d in all_missing if d.kind == "variant")
|
||||||
|
variant_title_count = sum(1 for d in all_missing if d.kind == "variant_title")
|
||||||
|
prop_count = sum(1 for d in all_missing if d.kind == "property")
|
||||||
|
|
||||||
|
print(f"\nTotal: {len(all_missing)} missing docstrings/titles")
|
||||||
|
print(f" - {type_count} types")
|
||||||
|
print(f" - {variant_count} variants")
|
||||||
|
print(f" - {variant_title_count} variant titles")
|
||||||
|
print(f" - {prop_count} properties")
|
||||||
|
|
||||||
|
# Print by file
|
||||||
|
for rust_file in sorted(by_file.keys()):
|
||||||
|
docs = sorted(by_file[rust_file], key=lambda d: d.rust_line or 0)
|
||||||
|
print(f"\n{rust_file}:")
|
||||||
|
print("-" * len(rust_file))
|
||||||
|
for doc in docs:
|
||||||
|
print(f" {doc}")
|
||||||
|
|
||||||
|
# Print external items (types not found in source)
|
||||||
|
if external:
|
||||||
|
print(f"\nExternal/Unknown location:")
|
||||||
|
print("-" * 25)
|
||||||
|
for doc in external:
|
||||||
|
print(f" {doc}")
|
||||||
|
|
||||||
|
print("\n" + "=" * 70)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
project_root = Path.cwd()
|
||||||
|
|
||||||
|
# Define schemas to check with their respective search paths
|
||||||
|
schemas = [
|
||||||
|
SchemaConfig(
|
||||||
|
schema_file="schema.json",
|
||||||
|
search_paths=["komorebi/src", "komorebi-themes/src"],
|
||||||
|
display_name="komorebi",
|
||||||
|
),
|
||||||
|
SchemaConfig(
|
||||||
|
schema_file="schema.bar.json",
|
||||||
|
search_paths=["komorebi-bar/src", "komorebi-themes/src"],
|
||||||
|
display_name="komorebi-bar",
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
||||||
|
total_missing = 0
|
||||||
|
has_errors = False
|
||||||
|
|
||||||
|
for schema_config in schemas:
|
||||||
|
schema_path = project_root / schema_config.schema_file
|
||||||
|
search_paths = [
|
||||||
|
project_root / p
|
||||||
|
for p in schema_config.search_paths
|
||||||
|
if (project_root / p).exists()
|
||||||
|
]
|
||||||
|
|
||||||
|
missing, error_code = check_schema(
|
||||||
|
schema_path,
|
||||||
|
search_paths,
|
||||||
|
project_root,
|
||||||
|
schema_config.display_name,
|
||||||
|
)
|
||||||
|
|
||||||
|
if error_code != 0:
|
||||||
|
has_errors = True
|
||||||
|
continue
|
||||||
|
|
||||||
|
print_results(missing, schema_config.display_name)
|
||||||
|
total_missing += len(missing)
|
||||||
|
|
||||||
|
# Print combined summary
|
||||||
|
if len(schemas) > 1:
|
||||||
|
print("\n" + "=" * 70)
|
||||||
|
print("COMBINED SUMMARY")
|
||||||
|
print("=" * 70)
|
||||||
|
print(f"Total missing docstrings across all schemas: {total_missing}")
|
||||||
|
print("=" * 70)
|
||||||
|
|
||||||
|
if has_errors:
|
||||||
|
return 1
|
||||||
|
|
||||||
|
return 1 if total_missing > 0 else 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
@@ -15,7 +15,7 @@ ignore = [
|
|||||||
{ id = "RUSTSEC-2020-0016", reason = "local tcp connectivity is an opt-in feature, and there is no upgrade path for TcpStreamExt" },
|
{ id = "RUSTSEC-2020-0016", reason = "local tcp connectivity is an opt-in feature, and there is no upgrade path for TcpStreamExt" },
|
||||||
{ id = "RUSTSEC-2024-0436", reason = "paste being unmaintained is not an issue in our use" },
|
{ id = "RUSTSEC-2024-0436", reason = "paste being unmaintained is not an issue in our use" },
|
||||||
{ id = "RUSTSEC-2024-0320", reason = "not using any yaml features from this library" },
|
{ id = "RUSTSEC-2024-0320", reason = "not using any yaml features from this library" },
|
||||||
{ id = "RUSTSEC-2025-0056", reason = "only used for colour palette generation" }
|
{ id = "RUSTSEC-2025-0056", reason = "only used for colour palette generation" },
|
||||||
]
|
]
|
||||||
|
|
||||||
[licenses]
|
[licenses]
|
||||||
@@ -36,7 +36,7 @@ allow = [
|
|||||||
"Ubuntu-font-1.0",
|
"Ubuntu-font-1.0",
|
||||||
"Unicode-3.0",
|
"Unicode-3.0",
|
||||||
"Zlib",
|
"Zlib",
|
||||||
"LicenseRef-Komorebi-2.0"
|
"LicenseRef-Komorebi-2.0",
|
||||||
]
|
]
|
||||||
confidence-threshold = 0.8
|
confidence-threshold = 0.8
|
||||||
|
|
||||||
|
|||||||
+100
-95
@@ -20,7 +20,7 @@
|
|||||||
"adler 1.0.2 registry+https://github.com/rust-lang/crates.io-index",
|
"adler 1.0.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"adler2 2.0.1 registry+https://github.com/rust-lang/crates.io-index",
|
"adler2 2.0.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ahash 0.8.12 registry+https://github.com/rust-lang/crates.io-index",
|
"ahash 0.8.12 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"aligned 0.4.2 registry+https://github.com/rust-lang/crates.io-index",
|
"aligned 0.4.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"allocator-api2 0.2.21 registry+https://github.com/rust-lang/crates.io-index",
|
"allocator-api2 0.2.21 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"anstream 0.6.21 registry+https://github.com/rust-lang/crates.io-index",
|
"anstream 0.6.21 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"anstyle 1.0.13 registry+https://github.com/rust-lang/crates.io-index",
|
"anstyle 1.0.13 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -46,13 +46,13 @@
|
|||||||
"block-buffer 0.10.4 registry+https://github.com/rust-lang/crates.io-index",
|
"block-buffer 0.10.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"bytemuck 1.24.0 registry+https://github.com/rust-lang/crates.io-index",
|
"bytemuck 1.24.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"bytemuck_derive 1.10.2 registry+https://github.com/rust-lang/crates.io-index",
|
"bytemuck_derive 1.10.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"cc 1.2.49 registry+https://github.com/rust-lang/crates.io-index",
|
"cc 1.2.51 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"cfg-if 0.1.10 registry+https://github.com/rust-lang/crates.io-index",
|
"cfg-if 0.1.10 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"cfg-if 1.0.4 registry+https://github.com/rust-lang/crates.io-index",
|
"cfg-if 1.0.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"chrono 0.4.42 registry+https://github.com/rust-lang/crates.io-index",
|
"chrono 0.4.42 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"chrono-tz 0.10.4 registry+https://github.com/rust-lang/crates.io-index",
|
"chrono-tz 0.10.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"clap 4.5.53 registry+https://github.com/rust-lang/crates.io-index",
|
"clap 4.5.54 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"clap_builder 4.5.53 registry+https://github.com/rust-lang/crates.io-index",
|
"clap_builder 4.5.54 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"clap_derive 4.5.49 registry+https://github.com/rust-lang/crates.io-index",
|
"clap_derive 4.5.49 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"clap_lex 0.7.6 registry+https://github.com/rust-lang/crates.io-index",
|
"clap_lex 0.7.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"color-eyre 0.6.5 registry+https://github.com/rust-lang/crates.io-index",
|
"color-eyre 0.6.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -82,29 +82,29 @@
|
|||||||
"dpi 0.1.2 registry+https://github.com/rust-lang/crates.io-index",
|
"dpi 0.1.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"dunce 1.0.5 registry+https://github.com/rust-lang/crates.io-index",
|
"dunce 1.0.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"dyn-clone 1.0.20 registry+https://github.com/rust-lang/crates.io-index",
|
"dyn-clone 1.0.20 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ecolor 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"ecolor 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ed25519 2.2.3 registry+https://github.com/rust-lang/crates.io-index",
|
"ed25519 2.2.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"eframe 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"eframe 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"egui 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"egui 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"egui-phosphor 0.10.0 git+https://github.com/amPerl/egui-phosphor?rev=d13688738478ecd12b426e3e74c59d6577a85b59",
|
"egui-phosphor 0.10.0 git+https://github.com/amPerl/egui-phosphor?rev=d13688738478ecd12b426e3e74c59d6577a85b59",
|
||||||
"egui-winit 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"egui-winit 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"egui_extras 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"egui_extras 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"egui_glow 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"egui_glow 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"either 1.15.0 registry+https://github.com/rust-lang/crates.io-index",
|
"either 1.15.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"emath 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"emath 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"encoding_rs 0.8.35 registry+https://github.com/rust-lang/crates.io-index",
|
"encoding_rs 0.8.35 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"enum-map 2.7.3 registry+https://github.com/rust-lang/crates.io-index",
|
"enum-map 2.7.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"enum-map-derive 0.17.0 registry+https://github.com/rust-lang/crates.io-index",
|
"enum-map-derive 0.17.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"env_home 0.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"env_home 0.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"epaint 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"epaint 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"epaint_default_fonts 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"epaint_default_fonts 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"equivalent 1.0.2 registry+https://github.com/rust-lang/crates.io-index",
|
"equivalent 1.0.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"eyre 0.6.12 registry+https://github.com/rust-lang/crates.io-index",
|
"eyre 0.6.12 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"fastrand 2.3.0 registry+https://github.com/rust-lang/crates.io-index",
|
"fastrand 2.3.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"fdeflate 0.3.7 registry+https://github.com/rust-lang/crates.io-index",
|
"fdeflate 0.3.7 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"filetime 0.2.26 registry+https://github.com/rust-lang/crates.io-index",
|
"filetime 0.2.26 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"find-msvc-tools 0.1.5 registry+https://github.com/rust-lang/crates.io-index",
|
"find-msvc-tools 0.1.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"flate2 1.1.7 registry+https://github.com/rust-lang/crates.io-index",
|
"flate2 1.1.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"fnv 1.0.7 registry+https://github.com/rust-lang/crates.io-index",
|
"fnv 1.0.7 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"form_urlencoded 1.2.2 registry+https://github.com/rust-lang/crates.io-index",
|
"form_urlencoded 1.2.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"futures 0.3.31 registry+https://github.com/rust-lang/crates.io-index",
|
"futures 0.3.31 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -149,18 +149,18 @@
|
|||||||
"imgref 1.12.0 registry+https://github.com/rust-lang/crates.io-index",
|
"imgref 1.12.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"indenter 0.3.4 registry+https://github.com/rust-lang/crates.io-index",
|
"indenter 0.3.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"indexmap 1.9.3 registry+https://github.com/rust-lang/crates.io-index",
|
"indexmap 1.9.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"indexmap 2.12.1 registry+https://github.com/rust-lang/crates.io-index",
|
"indexmap 2.13.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ipnet 2.11.0 registry+https://github.com/rust-lang/crates.io-index",
|
"ipnet 2.11.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"iri-string 0.7.9 registry+https://github.com/rust-lang/crates.io-index",
|
"iri-string 0.7.10 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"is_debug 1.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"is_debug 1.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"is_terminal_polyfill 1.70.2 registry+https://github.com/rust-lang/crates.io-index",
|
"is_terminal_polyfill 1.70.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"itertools 0.14.0 registry+https://github.com/rust-lang/crates.io-index",
|
"itertools 0.14.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"itoa 1.0.15 registry+https://github.com/rust-lang/crates.io-index",
|
"itoa 1.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"jobserver 0.1.34 registry+https://github.com/rust-lang/crates.io-index",
|
"jobserver 0.1.34 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"jpeg-decoder 0.1.22 registry+https://github.com/rust-lang/crates.io-index",
|
"jpeg-decoder 0.1.22 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"khronos_api 3.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"khronos_api 3.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"lazy_static 1.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
"lazy_static 1.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"libc 0.2.178 registry+https://github.com/rust-lang/crates.io-index",
|
"libc 0.2.180 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"libgit2-sys 0.18.3+1.9.2 registry+https://github.com/rust-lang/crates.io-index",
|
"libgit2-sys 0.18.3+1.9.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"libz-sys 1.1.23 registry+https://github.com/rust-lang/crates.io-index",
|
"libz-sys 1.1.23 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"linked-hash-map 0.5.6 registry+https://github.com/rust-lang/crates.io-index",
|
"linked-hash-map 0.5.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -177,11 +177,11 @@
|
|||||||
"miniz_oxide 0.4.4 registry+https://github.com/rust-lang/crates.io-index",
|
"miniz_oxide 0.4.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"miniz_oxide 0.8.9 registry+https://github.com/rust-lang/crates.io-index",
|
"miniz_oxide 0.8.9 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"miow 0.6.1 registry+https://github.com/rust-lang/crates.io-index",
|
"miow 0.6.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"moxcms 0.7.10 registry+https://github.com/rust-lang/crates.io-index",
|
"moxcms 0.7.11 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"native-tls 0.2.14 registry+https://github.com/rust-lang/crates.io-index",
|
"native-tls 0.2.14 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"net2 0.2.39 registry+https://github.com/rust-lang/crates.io-index",
|
"net2 0.2.39 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"nohash-hasher 0.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
"nohash-hasher 0.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ntapi 0.4.1 registry+https://github.com/rust-lang/crates.io-index",
|
"ntapi 0.4.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"num 0.4.3 registry+https://github.com/rust-lang/crates.io-index",
|
"num 0.4.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"num-bigint 0.4.6 registry+https://github.com/rust-lang/crates.io-index",
|
"num-bigint 0.4.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"num-complex 0.4.6 registry+https://github.com/rust-lang/crates.io-index",
|
"num-complex 0.4.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -210,14 +210,14 @@
|
|||||||
"png 0.18.0 registry+https://github.com/rust-lang/crates.io-index",
|
"png 0.18.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"powerfmt 0.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
"powerfmt 0.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ppv-lite86 0.2.21 registry+https://github.com/rust-lang/crates.io-index",
|
"ppv-lite86 0.2.21 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"proc-macro2 1.0.103 registry+https://github.com/rust-lang/crates.io-index",
|
"proc-macro2 1.0.105 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"profiling 1.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
"profiling 1.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"profiling-procmacros 1.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
"profiling-procmacros 1.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"psm 0.1.28 registry+https://github.com/rust-lang/crates.io-index",
|
"psm 0.1.28 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"pxfm 0.1.27 registry+https://github.com/rust-lang/crates.io-index",
|
"pxfm 0.1.27 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"qoi 0.4.1 registry+https://github.com/rust-lang/crates.io-index",
|
"qoi 0.4.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"quick-error 2.0.1 registry+https://github.com/rust-lang/crates.io-index",
|
"quick-error 2.0.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"quote 1.0.42 registry+https://github.com/rust-lang/crates.io-index",
|
"quote 1.0.43 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rand 0.7.3 registry+https://github.com/rust-lang/crates.io-index",
|
"rand 0.7.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rand 0.8.5 registry+https://github.com/rust-lang/crates.io-index",
|
"rand 0.8.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rand 0.9.2 registry+https://github.com/rust-lang/crates.io-index",
|
"rand 0.9.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -231,22 +231,24 @@
|
|||||||
"raw-window-handle 0.6.2 registry+https://github.com/rust-lang/crates.io-index",
|
"raw-window-handle 0.6.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rayon 1.11.0 registry+https://github.com/rust-lang/crates.io-index",
|
"rayon 1.11.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rayon-core 1.13.0 registry+https://github.com/rust-lang/crates.io-index",
|
"rayon-core 1.13.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
|
"ref-cast 1.0.25 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
|
"ref-cast-impl 1.0.25 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"regex 1.12.2 registry+https://github.com/rust-lang/crates.io-index",
|
"regex 1.12.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"regex-automata 0.4.13 registry+https://github.com/rust-lang/crates.io-index",
|
"regex-automata 0.4.13 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"regex-syntax 0.8.8 registry+https://github.com/rust-lang/crates.io-index",
|
"regex-syntax 0.8.8 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"reqwest 0.12.24 registry+https://github.com/rust-lang/crates.io-index",
|
"reqwest 0.12.28 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"roxmltree 0.20.0 registry+https://github.com/rust-lang/crates.io-index",
|
"roxmltree 0.20.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rustc-demangle 0.1.26 registry+https://github.com/rust-lang/crates.io-index",
|
"rustc-demangle 0.1.26 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rustc_version 0.4.1 registry+https://github.com/rust-lang/crates.io-index",
|
"rustc_version 0.4.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rustls-pki-types 1.13.1 registry+https://github.com/rust-lang/crates.io-index",
|
"rustls-pki-types 1.13.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ryu 1.0.20 registry+https://github.com/rust-lang/crates.io-index",
|
"ryu 1.0.22 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"scopeguard 1.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
"scopeguard 1.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"semver 1.0.27 registry+https://github.com/rust-lang/crates.io-index",
|
"semver 1.0.27 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde 1.0.228 registry+https://github.com/rust-lang/crates.io-index",
|
"serde 1.0.228 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_core 1.0.228 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_core 1.0.228 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_derive 1.0.228 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_derive 1.0.228 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_derive_internals 0.29.1 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_derive_internals 0.29.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_json 1.0.145 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_json 1.0.149 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_json_lenient 0.2.4 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_json_lenient 0.2.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_urlencoded 0.7.1 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_urlencoded 0.7.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_variant 0.1.3 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_variant 0.1.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -255,8 +257,8 @@
|
|||||||
"serde_yaml 0.8.26 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_yaml 0.8.26 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_yaml 0.9.34+deprecated registry+https://github.com/rust-lang/crates.io-index",
|
"serde_yaml 0.9.34+deprecated registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"sha2 0.10.9 registry+https://github.com/rust-lang/crates.io-index",
|
"sha2 0.10.9 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"shadow-rs 1.4.0 registry+https://github.com/rust-lang/crates.io-index",
|
"shadow-rs 1.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"shell-words 1.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"shell-words 1.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"shellexpand 2.1.2 registry+https://github.com/rust-lang/crates.io-index",
|
"shellexpand 2.1.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"shlex 1.3.0 registry+https://github.com/rust-lang/crates.io-index",
|
"shlex 1.3.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"signature 2.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
"signature 2.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -269,12 +271,12 @@
|
|||||||
"stacker 0.1.22 registry+https://github.com/rust-lang/crates.io-index",
|
"stacker 0.1.22 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"static_assertions 1.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"static_assertions 1.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"supports-color 3.0.2 registry+https://github.com/rust-lang/crates.io-index",
|
"supports-color 3.0.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"supports-hyperlinks 3.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"supports-hyperlinks 3.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"supports-unicode 3.0.0 registry+https://github.com/rust-lang/crates.io-index",
|
"supports-unicode 3.0.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"syn 1.0.109 registry+https://github.com/rust-lang/crates.io-index",
|
"syn 1.0.109 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"syn 2.0.111 registry+https://github.com/rust-lang/crates.io-index",
|
"syn 2.0.114 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"sync_wrapper 1.0.2 registry+https://github.com/rust-lang/crates.io-index",
|
"sync_wrapper 1.0.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tempfile 3.23.0 registry+https://github.com/rust-lang/crates.io-index",
|
"tempfile 3.24.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"terminal_size 0.4.3 registry+https://github.com/rust-lang/crates.io-index",
|
"terminal_size 0.4.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"thiserror 2.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
"thiserror 2.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"thiserror-impl 2.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
"thiserror-impl 2.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -285,9 +287,9 @@
|
|||||||
"ttf-parser 0.25.1 registry+https://github.com/rust-lang/crates.io-index",
|
"ttf-parser 0.25.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"typenum 1.19.0 registry+https://github.com/rust-lang/crates.io-index",
|
"typenum 1.19.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tz-rs 0.7.1 registry+https://github.com/rust-lang/crates.io-index",
|
"tz-rs 0.7.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tzdb 0.7.2 registry+https://github.com/rust-lang/crates.io-index",
|
"tzdb 0.7.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tzdb_data 0.2.2 registry+https://github.com/rust-lang/crates.io-index",
|
"tzdb_data 0.2.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"unicase 2.8.1 registry+https://github.com/rust-lang/crates.io-index",
|
"unicase 2.9.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"unicode-ident 1.0.22 registry+https://github.com/rust-lang/crates.io-index",
|
"unicode-ident 1.0.22 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"unicode-linebreak 0.1.5 registry+https://github.com/rust-lang/crates.io-index",
|
"unicode-linebreak 0.1.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"unicode-segmentation 1.12.0 registry+https://github.com/rust-lang/crates.io-index",
|
"unicode-segmentation 1.12.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -295,7 +297,7 @@
|
|||||||
"unicode-width 0.2.2 registry+https://github.com/rust-lang/crates.io-index",
|
"unicode-width 0.2.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"unicode-xid 0.2.6 registry+https://github.com/rust-lang/crates.io-index",
|
"unicode-xid 0.2.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"uom 0.37.0 registry+https://github.com/rust-lang/crates.io-index",
|
"uom 0.37.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"url 2.5.7 registry+https://github.com/rust-lang/crates.io-index",
|
"url 2.5.8 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"utf8_iter 1.0.4 registry+https://github.com/rust-lang/crates.io-index",
|
"utf8_iter 1.0.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"utf8parse 0.2.2 registry+https://github.com/rust-lang/crates.io-index",
|
"utf8parse 0.2.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"vcpkg 0.2.15 registry+https://github.com/rust-lang/crates.io-index",
|
"vcpkg 0.2.15 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -364,14 +366,14 @@
|
|||||||
"winit 0.30.12 registry+https://github.com/rust-lang/crates.io-index",
|
"winit 0.30.12 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"wmi 0.15.2 registry+https://github.com/rust-lang/crates.io-index",
|
"wmi 0.15.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"yaml-rust 0.4.5 registry+https://github.com/rust-lang/crates.io-index",
|
"yaml-rust 0.4.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zerocopy 0.8.31 registry+https://github.com/rust-lang/crates.io-index",
|
"zerocopy 0.8.33 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zerocopy-derive 0.8.31 registry+https://github.com/rust-lang/crates.io-index",
|
"zerocopy-derive 0.8.33 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zeroize 1.8.2 registry+https://github.com/rust-lang/crates.io-index",
|
"zeroize 1.8.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-core 0.4.12 registry+https://github.com/rust-lang/crates.io-index",
|
"zune-core 0.4.12 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-core 0.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
"zune-core 0.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-inflate 0.2.54 registry+https://github.com/rust-lang/crates.io-index",
|
"zune-inflate 0.2.54 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-jpeg 0.4.21 registry+https://github.com/rust-lang/crates.io-index",
|
"zune-jpeg 0.4.21 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-jpeg 0.5.5 registry+https://github.com/rust-lang/crates.io-index"
|
"zune-jpeg 0.5.8 registry+https://github.com/rust-lang/crates.io-index"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@@ -393,8 +395,8 @@
|
|||||||
"av1-grain 0.2.5 registry+https://github.com/rust-lang/crates.io-index",
|
"av1-grain 0.2.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rav1e 0.8.1 registry+https://github.com/rust-lang/crates.io-index",
|
"rav1e 0.8.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"v_frame 0.3.9 registry+https://github.com/rust-lang/crates.io-index",
|
"v_frame 0.3.9 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zerocopy 0.8.31 registry+https://github.com/rust-lang/crates.io-index",
|
"zerocopy 0.8.33 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zerocopy-derive 0.8.31 registry+https://github.com/rust-lang/crates.io-index"
|
"zerocopy-derive 0.8.33 registry+https://github.com/rust-lang/crates.io-index"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@@ -410,7 +412,7 @@
|
|||||||
"encoding_rs 0.8.35 registry+https://github.com/rust-lang/crates.io-index",
|
"encoding_rs 0.8.35 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"exr 1.74.0 registry+https://github.com/rust-lang/crates.io-index",
|
"exr 1.74.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"lebe 0.5.3 registry+https://github.com/rust-lang/crates.io-index",
|
"lebe 0.5.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"moxcms 0.7.10 registry+https://github.com/rust-lang/crates.io-index",
|
"moxcms 0.7.11 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"pxfm 0.1.27 registry+https://github.com/rust-lang/crates.io-index",
|
"pxfm 0.1.27 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ravif 0.12.0 registry+https://github.com/rust-lang/crates.io-index",
|
"ravif 0.12.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"subtle 2.6.1 registry+https://github.com/rust-lang/crates.io-index"
|
"subtle 2.6.1 registry+https://github.com/rust-lang/crates.io-index"
|
||||||
@@ -421,7 +423,7 @@
|
|||||||
[
|
[
|
||||||
"clipboard-win 5.4.1 registry+https://github.com/rust-lang/crates.io-index",
|
"clipboard-win 5.4.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"error-code 3.3.2 registry+https://github.com/rust-lang/crates.io-index",
|
"error-code 3.3.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ryu 1.0.20 registry+https://github.com/rust-lang/crates.io-index"
|
"ryu 1.0.22 registry+https://github.com/rust-lang/crates.io-index"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@@ -452,7 +454,7 @@
|
|||||||
"adler2 2.0.1 registry+https://github.com/rust-lang/crates.io-index",
|
"adler2 2.0.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ahash 0.8.12 registry+https://github.com/rust-lang/crates.io-index",
|
"ahash 0.8.12 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"aho-corasick 1.1.4 registry+https://github.com/rust-lang/crates.io-index",
|
"aho-corasick 1.1.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"aligned 0.4.2 registry+https://github.com/rust-lang/crates.io-index",
|
"aligned 0.4.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"aligned-vec 0.6.4 registry+https://github.com/rust-lang/crates.io-index",
|
"aligned-vec 0.6.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"allocator-api2 0.2.21 registry+https://github.com/rust-lang/crates.io-index",
|
"allocator-api2 0.2.21 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"anstream 0.6.21 registry+https://github.com/rust-lang/crates.io-index",
|
"anstream 0.6.21 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -489,15 +491,15 @@
|
|||||||
"calm_io 0.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
"calm_io 0.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"calmio_filters 0.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"calmio_filters 0.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"catppuccin-egui 5.6.0 git+https://github.com/LGUG2Z/catppuccin-egui?rev=b2f95cbf441d1dd99f3c955ef10dcb84ce23c20a",
|
"catppuccin-egui 5.6.0 git+https://github.com/LGUG2Z/catppuccin-egui?rev=b2f95cbf441d1dd99f3c955ef10dcb84ce23c20a",
|
||||||
"cc 1.2.49 registry+https://github.com/rust-lang/crates.io-index",
|
"cc 1.2.51 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"cfg-if 0.1.10 registry+https://github.com/rust-lang/crates.io-index",
|
"cfg-if 0.1.10 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"cfg-if 1.0.4 registry+https://github.com/rust-lang/crates.io-index",
|
"cfg-if 1.0.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"cfg_aliases 0.2.1 registry+https://github.com/rust-lang/crates.io-index",
|
"cfg_aliases 0.2.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"chrono 0.4.42 registry+https://github.com/rust-lang/crates.io-index",
|
"chrono 0.4.42 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"chrono-tz 0.10.4 registry+https://github.com/rust-lang/crates.io-index",
|
"chrono-tz 0.10.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"chumsky 0.9.3 registry+https://github.com/rust-lang/crates.io-index",
|
"chumsky 0.9.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"clap 4.5.53 registry+https://github.com/rust-lang/crates.io-index",
|
"clap 4.5.54 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"clap_builder 4.5.53 registry+https://github.com/rust-lang/crates.io-index",
|
"clap_builder 4.5.54 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"clap_derive 4.5.49 registry+https://github.com/rust-lang/crates.io-index",
|
"clap_derive 4.5.49 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"clap_lex 0.7.6 registry+https://github.com/rust-lang/crates.io-index",
|
"clap_lex 0.7.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"color-eyre 0.6.5 registry+https://github.com/rust-lang/crates.io-index",
|
"color-eyre 0.6.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -531,22 +533,22 @@
|
|||||||
"document-features 0.2.12 registry+https://github.com/rust-lang/crates.io-index",
|
"document-features 0.2.12 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"dpi 0.1.2 registry+https://github.com/rust-lang/crates.io-index",
|
"dpi 0.1.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"dyn-clone 1.0.20 registry+https://github.com/rust-lang/crates.io-index",
|
"dyn-clone 1.0.20 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ecolor 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"ecolor 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ed25519 2.2.3 registry+https://github.com/rust-lang/crates.io-index",
|
"ed25519 2.2.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"eframe 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"eframe 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"egui 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"egui 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"egui-phosphor 0.10.0 git+https://github.com/amPerl/egui-phosphor?rev=d13688738478ecd12b426e3e74c59d6577a85b59",
|
"egui-phosphor 0.10.0 git+https://github.com/amPerl/egui-phosphor?rev=d13688738478ecd12b426e3e74c59d6577a85b59",
|
||||||
"egui-winit 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"egui-winit 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"egui_extras 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"egui_extras 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"egui_glow 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"egui_glow 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"either 1.15.0 registry+https://github.com/rust-lang/crates.io-index",
|
"either 1.15.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"emath 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"emath 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"encoding_rs 0.8.35 registry+https://github.com/rust-lang/crates.io-index",
|
"encoding_rs 0.8.35 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"enum-map 2.7.3 registry+https://github.com/rust-lang/crates.io-index",
|
"enum-map 2.7.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"enum-map-derive 0.17.0 registry+https://github.com/rust-lang/crates.io-index",
|
"enum-map-derive 0.17.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"env_home 0.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"env_home 0.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"epaint 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"epaint 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"epaint_default_fonts 0.33.2 registry+https://github.com/rust-lang/crates.io-index",
|
"epaint_default_fonts 0.33.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"equator 0.4.2 registry+https://github.com/rust-lang/crates.io-index",
|
"equator 0.4.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"equator-macro 0.4.2 registry+https://github.com/rust-lang/crates.io-index",
|
"equator-macro 0.4.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"equivalent 1.0.2 registry+https://github.com/rust-lang/crates.io-index",
|
"equivalent 1.0.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -556,8 +558,8 @@
|
|||||||
"fax_derive 0.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
"fax_derive 0.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"fdeflate 0.3.7 registry+https://github.com/rust-lang/crates.io-index",
|
"fdeflate 0.3.7 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"filetime 0.2.26 registry+https://github.com/rust-lang/crates.io-index",
|
"filetime 0.2.26 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"find-msvc-tools 0.1.5 registry+https://github.com/rust-lang/crates.io-index",
|
"find-msvc-tools 0.1.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"flate2 1.1.7 registry+https://github.com/rust-lang/crates.io-index",
|
"flate2 1.1.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"flavours 0.7.2 git+https://github.com/LGUG2Z/flavours",
|
"flavours 0.7.2 git+https://github.com/LGUG2Z/flavours",
|
||||||
"fnv 1.0.7 registry+https://github.com/rust-lang/crates.io-index",
|
"fnv 1.0.7 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"font-loader 0.11.0 registry+https://github.com/rust-lang/crates.io-index",
|
"font-loader 0.11.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -582,7 +584,7 @@
|
|||||||
"glob 0.3.3 registry+https://github.com/rust-lang/crates.io-index",
|
"glob 0.3.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"glow 0.16.0 registry+https://github.com/rust-lang/crates.io-index",
|
"glow 0.16.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"glutin-winit 0.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
"glutin-winit 0.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"h2 0.4.12 registry+https://github.com/rust-lang/crates.io-index",
|
"h2 0.4.13 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"half 2.7.1 registry+https://github.com/rust-lang/crates.io-index",
|
"half 2.7.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"hashbrown 0.12.3 registry+https://github.com/rust-lang/crates.io-index",
|
"hashbrown 0.12.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"hashbrown 0.14.5 registry+https://github.com/rust-lang/crates.io-index",
|
"hashbrown 0.14.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -608,17 +610,17 @@
|
|||||||
"image-webp 0.2.4 registry+https://github.com/rust-lang/crates.io-index",
|
"image-webp 0.2.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"indenter 0.3.4 registry+https://github.com/rust-lang/crates.io-index",
|
"indenter 0.3.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"indexmap 1.9.3 registry+https://github.com/rust-lang/crates.io-index",
|
"indexmap 1.9.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"indexmap 2.12.1 registry+https://github.com/rust-lang/crates.io-index",
|
"indexmap 2.13.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ipnet 2.11.0 registry+https://github.com/rust-lang/crates.io-index",
|
"ipnet 2.11.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"iri-string 0.7.9 registry+https://github.com/rust-lang/crates.io-index",
|
"iri-string 0.7.10 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"is_debug 1.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"is_debug 1.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"is_terminal_polyfill 1.70.2 registry+https://github.com/rust-lang/crates.io-index",
|
"is_terminal_polyfill 1.70.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"itertools 0.14.0 registry+https://github.com/rust-lang/crates.io-index",
|
"itertools 0.14.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"itoa 1.0.15 registry+https://github.com/rust-lang/crates.io-index",
|
"itoa 1.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"jobserver 0.1.34 registry+https://github.com/rust-lang/crates.io-index",
|
"jobserver 0.1.34 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"jpeg-decoder 0.1.22 registry+https://github.com/rust-lang/crates.io-index",
|
"jpeg-decoder 0.1.22 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"lazy_static 1.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
"lazy_static 1.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"libc 0.2.178 registry+https://github.com/rust-lang/crates.io-index",
|
"libc 0.2.180 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"libgit2-sys 0.18.3+1.9.2 registry+https://github.com/rust-lang/crates.io-index",
|
"libgit2-sys 0.18.3+1.9.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"libz-sys 1.1.23 registry+https://github.com/rust-lang/crates.io-index",
|
"libz-sys 1.1.23 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"linked-hash-map 0.5.6 registry+https://github.com/rust-lang/crates.io-index",
|
"linked-hash-map 0.5.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -645,13 +647,13 @@
|
|||||||
"nanoid 0.4.0 registry+https://github.com/rust-lang/crates.io-index",
|
"nanoid 0.4.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"native-tls 0.2.14 registry+https://github.com/rust-lang/crates.io-index",
|
"native-tls 0.2.14 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"net2 0.2.39 registry+https://github.com/rust-lang/crates.io-index",
|
"net2 0.2.39 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"netdev 0.39.0 registry+https://github.com/rust-lang/crates.io-index",
|
"netdev 0.40.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"new_debug_unreachable 1.0.6 registry+https://github.com/rust-lang/crates.io-index",
|
"new_debug_unreachable 1.0.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"nohash-hasher 0.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
"nohash-hasher 0.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"nom 7.1.3 registry+https://github.com/rust-lang/crates.io-index",
|
"nom 7.1.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"nom 8.0.0 registry+https://github.com/rust-lang/crates.io-index",
|
"nom 8.0.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"noop_proc_macro 0.3.0 registry+https://github.com/rust-lang/crates.io-index",
|
"noop_proc_macro 0.3.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ntapi 0.4.1 registry+https://github.com/rust-lang/crates.io-index",
|
"ntapi 0.4.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"nu-ansi-term 0.50.3 registry+https://github.com/rust-lang/crates.io-index",
|
"nu-ansi-term 0.50.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"num 0.4.3 registry+https://github.com/rust-lang/crates.io-index",
|
"num 0.4.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"num-bigint 0.4.6 registry+https://github.com/rust-lang/crates.io-index",
|
"num-bigint 0.4.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -667,7 +669,7 @@
|
|||||||
"once_cell 1.21.3 registry+https://github.com/rust-lang/crates.io-index",
|
"once_cell 1.21.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"once_cell_polyfill 1.70.2 registry+https://github.com/rust-lang/crates.io-index",
|
"once_cell_polyfill 1.70.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"open 5.3.3 registry+https://github.com/rust-lang/crates.io-index",
|
"open 5.3.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"os_info 3.13.0 registry+https://github.com/rust-lang/crates.io-index",
|
"os_info 3.14.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"owo-colors 4.2.3 registry+https://github.com/rust-lang/crates.io-index",
|
"owo-colors 4.2.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"palette 0.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
"palette 0.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"palette_derive 0.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
"palette_derive 0.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -692,13 +694,13 @@
|
|||||||
"powerfmt 0.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
"powerfmt 0.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"powershell_script 1.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"powershell_script 1.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"ppv-lite86 0.2.21 registry+https://github.com/rust-lang/crates.io-index",
|
"ppv-lite86 0.2.21 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"proc-macro2 1.0.103 registry+https://github.com/rust-lang/crates.io-index",
|
"proc-macro2 1.0.105 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"profiling 1.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
"profiling 1.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"profiling-procmacros 1.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
"profiling-procmacros 1.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"psm 0.1.28 registry+https://github.com/rust-lang/crates.io-index",
|
"psm 0.1.28 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"qoi 0.4.1 registry+https://github.com/rust-lang/crates.io-index",
|
"qoi 0.4.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"quick-error 2.0.1 registry+https://github.com/rust-lang/crates.io-index",
|
"quick-error 2.0.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"quote 1.0.42 registry+https://github.com/rust-lang/crates.io-index",
|
"quote 1.0.43 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rand 0.7.3 registry+https://github.com/rust-lang/crates.io-index",
|
"rand 0.7.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rand 0.8.5 registry+https://github.com/rust-lang/crates.io-index",
|
"rand 0.8.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rand 0.9.2 registry+https://github.com/rust-lang/crates.io-index",
|
"rand 0.9.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -713,19 +715,21 @@
|
|||||||
"raw-window-handle 0.6.2 registry+https://github.com/rust-lang/crates.io-index",
|
"raw-window-handle 0.6.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rayon 1.11.0 registry+https://github.com/rust-lang/crates.io-index",
|
"rayon 1.11.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rayon-core 1.13.0 registry+https://github.com/rust-lang/crates.io-index",
|
"rayon-core 1.13.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
|
"ref-cast 1.0.25 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
|
"ref-cast-impl 1.0.25 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"regex 1.12.2 registry+https://github.com/rust-lang/crates.io-index",
|
"regex 1.12.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"regex-automata 0.4.13 registry+https://github.com/rust-lang/crates.io-index",
|
"regex-automata 0.4.13 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"regex-syntax 0.8.8 registry+https://github.com/rust-lang/crates.io-index",
|
"regex-syntax 0.8.8 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"reqwest 0.12.24 registry+https://github.com/rust-lang/crates.io-index",
|
"reqwest 0.12.28 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rgb 0.8.52 registry+https://github.com/rust-lang/crates.io-index",
|
"rgb 0.8.52 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"roxmltree 0.20.0 registry+https://github.com/rust-lang/crates.io-index",
|
"roxmltree 0.20.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rustc-demangle 0.1.26 registry+https://github.com/rust-lang/crates.io-index",
|
"rustc-demangle 0.1.26 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rustc_version 0.4.1 registry+https://github.com/rust-lang/crates.io-index",
|
"rustc_version 0.4.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"rustls-pki-types 1.13.1 registry+https://github.com/rust-lang/crates.io-index",
|
"rustls-pki-types 1.13.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"same-file 1.0.6 registry+https://github.com/rust-lang/crates.io-index",
|
"same-file 1.0.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"schannel 0.1.28 registry+https://github.com/rust-lang/crates.io-index",
|
"schannel 0.1.28 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"schemars 0.8.22 registry+https://github.com/rust-lang/crates.io-index",
|
"schemars 1.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"schemars_derive 0.8.22 registry+https://github.com/rust-lang/crates.io-index",
|
"schemars_derive 1.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"scoped_threadpool 0.1.9 registry+https://github.com/rust-lang/crates.io-index",
|
"scoped_threadpool 0.1.9 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"scopeguard 1.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
"scopeguard 1.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"semver 1.0.27 registry+https://github.com/rust-lang/crates.io-index",
|
"semver 1.0.27 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -733,7 +737,7 @@
|
|||||||
"serde_core 1.0.228 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_core 1.0.228 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_derive 1.0.228 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_derive 1.0.228 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_derive_internals 0.29.1 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_derive_internals 0.29.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_json 1.0.145 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_json 1.0.149 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_json_lenient 0.2.4 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_json_lenient 0.2.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_urlencoded 0.7.1 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_urlencoded 0.7.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_variant 0.1.3 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_variant 0.1.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -742,13 +746,13 @@
|
|||||||
"serde_yaml 0.8.26 registry+https://github.com/rust-lang/crates.io-index",
|
"serde_yaml 0.8.26 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"serde_yaml 0.9.34+deprecated registry+https://github.com/rust-lang/crates.io-index",
|
"serde_yaml 0.9.34+deprecated registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"sha2 0.10.9 registry+https://github.com/rust-lang/crates.io-index",
|
"sha2 0.10.9 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"shadow-rs 1.4.0 registry+https://github.com/rust-lang/crates.io-index",
|
"shadow-rs 1.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"sharded-slab 0.1.7 registry+https://github.com/rust-lang/crates.io-index",
|
"sharded-slab 0.1.7 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"shell-words 1.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"shell-words 1.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"shellexpand 2.1.2 registry+https://github.com/rust-lang/crates.io-index",
|
"shellexpand 2.1.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"shlex 1.3.0 registry+https://github.com/rust-lang/crates.io-index",
|
"shlex 1.3.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"signature 2.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
"signature 2.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"simd-adler32 0.3.7 registry+https://github.com/rust-lang/crates.io-index",
|
"simd-adler32 0.3.8 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"simd_helpers 0.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"simd_helpers 0.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"siphasher 0.3.11 registry+https://github.com/rust-lang/crates.io-index",
|
"siphasher 0.3.11 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"siphasher 1.0.1 registry+https://github.com/rust-lang/crates.io-index",
|
"siphasher 1.0.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -763,11 +767,11 @@
|
|||||||
"strum 0.27.2 registry+https://github.com/rust-lang/crates.io-index",
|
"strum 0.27.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"strum_macros 0.27.2 registry+https://github.com/rust-lang/crates.io-index",
|
"strum_macros 0.27.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"syn 1.0.109 registry+https://github.com/rust-lang/crates.io-index",
|
"syn 1.0.109 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"syn 2.0.111 registry+https://github.com/rust-lang/crates.io-index",
|
"syn 2.0.114 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"synstructure 0.13.2 registry+https://github.com/rust-lang/crates.io-index",
|
"synstructure 0.13.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"sysinfo 0.33.1 registry+https://github.com/rust-lang/crates.io-index",
|
"sysinfo 0.33.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"sysinfo 0.37.2 registry+https://github.com/rust-lang/crates.io-index",
|
"sysinfo 0.37.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tempfile 3.23.0 registry+https://github.com/rust-lang/crates.io-index",
|
"tempfile 3.24.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"terminal_size 0.4.3 registry+https://github.com/rust-lang/crates.io-index",
|
"terminal_size 0.4.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"textwrap 0.16.2 registry+https://github.com/rust-lang/crates.io-index",
|
"textwrap 0.16.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"thiserror 2.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
"thiserror 2.0.17 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -777,18 +781,18 @@
|
|||||||
"tiff 0.6.1 registry+https://github.com/rust-lang/crates.io-index",
|
"tiff 0.6.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"time 0.3.44 registry+https://github.com/rust-lang/crates.io-index",
|
"time 0.3.44 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"time-core 0.1.6 registry+https://github.com/rust-lang/crates.io-index",
|
"time-core 0.1.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tokio 1.48.0 registry+https://github.com/rust-lang/crates.io-index",
|
"tokio 1.49.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tokio-native-tls 0.3.1 registry+https://github.com/rust-lang/crates.io-index",
|
"tokio-native-tls 0.3.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tokio-util 0.7.17 registry+https://github.com/rust-lang/crates.io-index",
|
"tokio-util 0.7.18 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"toml 0.5.11 registry+https://github.com/rust-lang/crates.io-index",
|
"toml 0.5.11 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tower 0.5.2 registry+https://github.com/rust-lang/crates.io-index",
|
"tower 0.5.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tower-http 0.6.7 registry+https://github.com/rust-lang/crates.io-index",
|
"tower-http 0.6.8 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tower-layer 0.3.3 registry+https://github.com/rust-lang/crates.io-index",
|
"tower-layer 0.3.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tower-service 0.3.3 registry+https://github.com/rust-lang/crates.io-index",
|
"tower-service 0.3.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tracing 0.1.43 registry+https://github.com/rust-lang/crates.io-index",
|
"tracing 0.1.44 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tracing-appender 0.2.4 registry+https://github.com/rust-lang/crates.io-index",
|
"tracing-appender 0.2.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tracing-attributes 0.1.31 registry+https://github.com/rust-lang/crates.io-index",
|
"tracing-attributes 0.1.31 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tracing-core 0.1.35 registry+https://github.com/rust-lang/crates.io-index",
|
"tracing-core 0.1.36 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tracing-error 0.2.1 registry+https://github.com/rust-lang/crates.io-index",
|
"tracing-error 0.2.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tracing-log 0.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
"tracing-log 0.2.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tracing-subscriber 0.3.22 registry+https://github.com/rust-lang/crates.io-index",
|
"tracing-subscriber 0.3.22 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -796,9 +800,9 @@
|
|||||||
"ttf-parser 0.25.1 registry+https://github.com/rust-lang/crates.io-index",
|
"ttf-parser 0.25.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"typenum 1.19.0 registry+https://github.com/rust-lang/crates.io-index",
|
"typenum 1.19.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tz-rs 0.7.1 registry+https://github.com/rust-lang/crates.io-index",
|
"tz-rs 0.7.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tzdb_data 0.2.2 registry+https://github.com/rust-lang/crates.io-index",
|
"tzdb_data 0.2.3 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"uds_windows 1.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
"uds_windows 1.1.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"unicase 2.8.1 registry+https://github.com/rust-lang/crates.io-index",
|
"unicase 2.9.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"unicode-ident 1.0.22 registry+https://github.com/rust-lang/crates.io-index",
|
"unicode-ident 1.0.22 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"unicode-segmentation 1.12.0 registry+https://github.com/rust-lang/crates.io-index",
|
"unicode-segmentation 1.12.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"unicode-width 0.1.14 registry+https://github.com/rust-lang/crates.io-index",
|
"unicode-width 0.1.14 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -806,7 +810,7 @@
|
|||||||
"unicode-xid 0.2.6 registry+https://github.com/rust-lang/crates.io-index",
|
"unicode-xid 0.2.6 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"unsafe-libyaml 0.2.11 registry+https://github.com/rust-lang/crates.io-index",
|
"unsafe-libyaml 0.2.11 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"uom 0.37.0 registry+https://github.com/rust-lang/crates.io-index",
|
"uom 0.37.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"url 2.5.7 registry+https://github.com/rust-lang/crates.io-index",
|
"url 2.5.8 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"utf8_iter 1.0.4 registry+https://github.com/rust-lang/crates.io-index",
|
"utf8_iter 1.0.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"utf8parse 0.2.2 registry+https://github.com/rust-lang/crates.io-index",
|
"utf8parse 0.2.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"vcpkg 0.2.15 registry+https://github.com/rust-lang/crates.io-index",
|
"vcpkg 0.2.15 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -885,21 +889,22 @@
|
|||||||
"xml-rs 0.8.28 registry+https://github.com/rust-lang/crates.io-index",
|
"xml-rs 0.8.28 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"y4m 0.8.0 registry+https://github.com/rust-lang/crates.io-index",
|
"y4m 0.8.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"yaml-rust 0.4.5 registry+https://github.com/rust-lang/crates.io-index",
|
"yaml-rust 0.4.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zerocopy 0.8.31 registry+https://github.com/rust-lang/crates.io-index",
|
"zerocopy 0.8.33 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zerocopy-derive 0.8.31 registry+https://github.com/rust-lang/crates.io-index",
|
"zerocopy-derive 0.8.33 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zeroize 1.8.2 registry+https://github.com/rust-lang/crates.io-index",
|
"zeroize 1.8.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
|
"zmij 1.0.12 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-core 0.4.12 registry+https://github.com/rust-lang/crates.io-index",
|
"zune-core 0.4.12 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-core 0.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
"zune-core 0.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-inflate 0.2.54 registry+https://github.com/rust-lang/crates.io-index",
|
"zune-inflate 0.2.54 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-jpeg 0.4.21 registry+https://github.com/rust-lang/crates.io-index",
|
"zune-jpeg 0.4.21 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-jpeg 0.5.5 registry+https://github.com/rust-lang/crates.io-index"
|
"zune-jpeg 0.5.8 registry+https://github.com/rust-lang/crates.io-index"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"MIT-0",
|
"MIT-0",
|
||||||
[
|
[
|
||||||
"dunce 1.0.5 registry+https://github.com/rust-lang/crates.io-index",
|
"dunce 1.0.5 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"tzdb_data 0.2.2 registry+https://github.com/rust-lang/crates.io-index"
|
"tzdb_data 0.2.3 registry+https://github.com/rust-lang/crates.io-index"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@@ -912,13 +917,13 @@
|
|||||||
[
|
[
|
||||||
"OFL-1.1",
|
"OFL-1.1",
|
||||||
[
|
[
|
||||||
"epaint_default_fonts 0.33.2 registry+https://github.com/rust-lang/crates.io-index"
|
"epaint_default_fonts 0.33.3 registry+https://github.com/rust-lang/crates.io-index"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"Ubuntu-font-1.0",
|
"Ubuntu-font-1.0",
|
||||||
[
|
[
|
||||||
"epaint_default_fonts 0.33.2 registry+https://github.com/rust-lang/crates.io-index"
|
"epaint_default_fonts 0.33.3 registry+https://github.com/rust-lang/crates.io-index"
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
@@ -928,8 +933,8 @@
|
|||||||
"icu_locale_core 2.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
"icu_locale_core 2.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"icu_normalizer 2.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
"icu_normalizer 2.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"icu_normalizer_data 2.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
"icu_normalizer_data 2.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"icu_properties 2.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
"icu_properties 2.1.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"icu_properties_data 2.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
"icu_properties_data 2.1.2 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"icu_provider 2.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
"icu_provider 2.1.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"litemap 0.8.1 registry+https://github.com/rust-lang/crates.io-index",
|
"litemap 0.8.1 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"potential_utf 0.1.4 registry+https://github.com/rust-lang/crates.io-index",
|
"potential_utf 0.1.4 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
@@ -975,7 +980,7 @@
|
|||||||
"zune-core 0.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
"zune-core 0.5.0 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-inflate 0.2.54 registry+https://github.com/rust-lang/crates.io-index",
|
"zune-inflate 0.2.54 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-jpeg 0.4.21 registry+https://github.com/rust-lang/crates.io-index",
|
"zune-jpeg 0.4.21 registry+https://github.com/rust-lang/crates.io-index",
|
||||||
"zune-jpeg 0.5.5 registry+https://github.com/rust-lang/crates.io-index"
|
"zune-jpeg 0.5.8 registry+https://github.com/rust-lang/crates.io-index"
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://raw.githubusercontent.com/LGUG2Z/komorebi/v0.1.39/schema.bar.json",
|
"$schema": "https://raw.githubusercontent.com/LGUG2Z/komorebi/v0.1.40/schema.bar.json",
|
||||||
"monitor": 0,
|
|
||||||
"font_family": "JetBrains Mono",
|
"font_family": "JetBrains Mono",
|
||||||
"theme": {
|
"theme": {
|
||||||
"palette": "Base16",
|
"palette": "Base16",
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://raw.githubusercontent.com/LGUG2Z/komorebi/v0.1.39/schema.json",
|
"$schema": "https://raw.githubusercontent.com/LGUG2Z/komorebi/v0.1.40/schema.json",
|
||||||
"app_specific_configuration_path": "$Env:USERPROFILE/applications.json",
|
"app_specific_configuration_path": "$Env:USERPROFILE/applications.json",
|
||||||
"window_hiding_behaviour": "Cloak",
|
"window_hiding_behaviour": "Cloak",
|
||||||
"cross_monitor_move_behaviour": "Insert",
|
"cross_monitor_move_behaviour": "Insert",
|
||||||
|
|||||||
Generated
+179
@@ -0,0 +1,179 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"crane": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1766774972,
|
||||||
|
"narHash": "sha256-8qxEFpj4dVmIuPn9j9z6NTbU+hrcGjBOvaxTzre5HmM=",
|
||||||
|
"owner": "ipetkov",
|
||||||
|
"repo": "crane",
|
||||||
|
"rev": "01bc1d404a51a0a07e9d8759cd50a7903e218c82",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "ipetkov",
|
||||||
|
"repo": "crane",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1761588595,
|
||||||
|
"narHash": "sha256-XKUZz9zewJNUj46b4AJdiRZJAvSZ0Dqj2BNfXvFlJC4=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "f387cd2afec9419c8ee37694406ca490c3f34ee5",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-parts": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": "nixpkgs-lib"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1765835352,
|
||||||
|
"narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "a34fae9c08a15ad73f295041fec82323541400a9",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"git-hooks-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"gitignore": "gitignore",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1765911976,
|
||||||
|
"narHash": "sha256-t3T/xm8zstHRLx+pIHxVpQTiySbKqcQbK+r+01XVKc0=",
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "git-hooks.nix",
|
||||||
|
"rev": "b68b780b69702a090c8bb1b973bab13756cc7a27",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "git-hooks.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gitignore": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"git-hooks-nix",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1709087332,
|
||||||
|
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "gitignore.nix",
|
||||||
|
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "gitignore.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1766870016,
|
||||||
|
"narHash": "sha256-fHmxAesa6XNqnIkcS6+nIHuEmgd/iZSP/VXxweiEuQw=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "5c2bc52fb9f8c264ed6c93bd20afa2ff5e763dce",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-lib": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1765674936,
|
||||||
|
"narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixpkgs.lib",
|
||||||
|
"rev": "2075416fcb47225d9b68ac469a5c4801a9c4dd85",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixpkgs.lib",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"crane": "crane",
|
||||||
|
"flake-parts": "flake-parts",
|
||||||
|
"git-hooks-nix": "git-hooks-nix",
|
||||||
|
"nixpkgs": "nixpkgs",
|
||||||
|
"rust-overlay": "rust-overlay",
|
||||||
|
"treefmt-nix": "treefmt-nix"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rust-overlay": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1766890375,
|
||||||
|
"narHash": "sha256-0Zi7ChAtjq/efwQYmp7kOJPcSt6ya9ynSUe6ppgZhsQ=",
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"rev": "91e1f7a0017065360f447622d11b7ce6ed04772f",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"treefmt-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1766000401,
|
||||||
|
"narHash": "sha256-+cqN4PJz9y0JQXfAK5J1drd0U05D5fcAGhzhfVrDlsI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"rev": "42d96e75aa56a3f70cab7e7dc4a32868db28e8fd",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
@@ -0,0 +1,360 @@
|
|||||||
|
{
|
||||||
|
description = "komorebi for Windows";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
|
||||||
|
flake-parts.url = "github:hercules-ci/flake-parts";
|
||||||
|
crane.url = "github:ipetkov/crane";
|
||||||
|
rust-overlay.url = "github:oxalica/rust-overlay";
|
||||||
|
rust-overlay.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
treefmt-nix.url = "github:numtide/treefmt-nix";
|
||||||
|
treefmt-nix.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
git-hooks-nix.url = "github:cachix/git-hooks.nix";
|
||||||
|
git-hooks-nix.inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
inputs@{
|
||||||
|
self,
|
||||||
|
nixpkgs,
|
||||||
|
flake-parts,
|
||||||
|
crane,
|
||||||
|
rust-overlay,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
windowsSdkVersion = "10.0.26100";
|
||||||
|
windowsCrtVersion = "14.44.17.14";
|
||||||
|
|
||||||
|
mkWindowsSdk =
|
||||||
|
pkgs:
|
||||||
|
pkgs.stdenvNoCC.mkDerivation {
|
||||||
|
name = "windows-sdk-${windowsSdkVersion}-crt-${windowsCrtVersion}";
|
||||||
|
|
||||||
|
nativeBuildInputs = [ pkgs.xwin ];
|
||||||
|
|
||||||
|
outputHashAlgo = "sha256";
|
||||||
|
outputHashMode = "recursive";
|
||||||
|
outputHash = "sha256-6cLS5q1BDRpLPScfmmKpTTEHUzsgKTKD1+mKvGX9Deo=";
|
||||||
|
|
||||||
|
buildCommand = ''
|
||||||
|
export HOME=$(mktemp -d)
|
||||||
|
xwin --accept-license \
|
||||||
|
--sdk-version ${windowsSdkVersion} \
|
||||||
|
--crt-version ${windowsCrtVersion} \
|
||||||
|
splat --output $out
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
mkMsvcEnv =
|
||||||
|
{ pkgs, windowsSdk }:
|
||||||
|
let
|
||||||
|
clangVersion = pkgs.lib.versions.major pkgs.llvmPackages.clang.version;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
# linker for the windows target
|
||||||
|
CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_LINKER = "lld-link";
|
||||||
|
|
||||||
|
# c/c++ compiler
|
||||||
|
CC_x86_64_pc_windows_msvc = "clang-cl";
|
||||||
|
CXX_x86_64_pc_windows_msvc = "clang-cl";
|
||||||
|
AR_x86_64_pc_windows_msvc = "llvm-lib";
|
||||||
|
|
||||||
|
# IMPORTANT: libclang include path MUST come first to avoid header conflicts
|
||||||
|
CFLAGS_x86_64_pc_windows_msvc = builtins.concatStringsSep " " [
|
||||||
|
"--target=x86_64-pc-windows-msvc"
|
||||||
|
"-Wno-unused-command-line-argument"
|
||||||
|
"-fuse-ld=lld-link"
|
||||||
|
"/imsvc${pkgs.llvmPackages.libclang.lib}/lib/clang/${clangVersion}/include"
|
||||||
|
"/imsvc${windowsSdk}/crt/include"
|
||||||
|
"/imsvc${windowsSdk}/sdk/include/ucrt"
|
||||||
|
"/imsvc${windowsSdk}/sdk/include/um"
|
||||||
|
"/imsvc${windowsSdk}/sdk/include/shared"
|
||||||
|
];
|
||||||
|
|
||||||
|
CXXFLAGS_x86_64_pc_windows_msvc = builtins.concatStringsSep " " [
|
||||||
|
"--target=x86_64-pc-windows-msvc"
|
||||||
|
"-Wno-unused-command-line-argument"
|
||||||
|
"-fuse-ld=lld-link"
|
||||||
|
"/imsvc${pkgs.llvmPackages.libclang.lib}/lib/clang/${clangVersion}/include"
|
||||||
|
"/imsvc${windowsSdk}/crt/include"
|
||||||
|
"/imsvc${windowsSdk}/sdk/include/ucrt"
|
||||||
|
"/imsvc${windowsSdk}/sdk/include/um"
|
||||||
|
"/imsvc${windowsSdk}/sdk/include/shared"
|
||||||
|
];
|
||||||
|
|
||||||
|
# target-specific rust flags with linker flavor and library search paths
|
||||||
|
CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_RUSTFLAGS = builtins.concatStringsSep " " [
|
||||||
|
"-Clinker-flavor=lld-link"
|
||||||
|
"-Lnative=${windowsSdk}/crt/lib/x86_64"
|
||||||
|
"-Lnative=${windowsSdk}/sdk/lib/um/x86_64"
|
||||||
|
"-Lnative=${windowsSdk}/sdk/lib/ucrt/x86_64"
|
||||||
|
];
|
||||||
|
|
||||||
|
# cargo target
|
||||||
|
CARGO_BUILD_TARGET = "x86_64-pc-windows-msvc";
|
||||||
|
};
|
||||||
|
|
||||||
|
mkKomorebiPackages =
|
||||||
|
{ pkgs, windowsSdk }:
|
||||||
|
let
|
||||||
|
# toolchain with windows msvc target
|
||||||
|
toolchain = (pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml).override {
|
||||||
|
targets = [ "x86_64-pc-windows-msvc" ];
|
||||||
|
};
|
||||||
|
craneLib = (crane.mkLib pkgs).overrideToolchain toolchain;
|
||||||
|
version = "0.1.0";
|
||||||
|
|
||||||
|
msvcEnv = mkMsvcEnv { inherit pkgs windowsSdk; };
|
||||||
|
|
||||||
|
src = pkgs.lib.cleanSourceWith {
|
||||||
|
src = ./.;
|
||||||
|
filter =
|
||||||
|
path: type:
|
||||||
|
(craneLib.filterCargoSources path type)
|
||||||
|
|| (pkgs.lib.hasInfix "/docs/" path)
|
||||||
|
|| (builtins.match ".*/docs/.*" path != null);
|
||||||
|
};
|
||||||
|
|
||||||
|
commonArgs = {
|
||||||
|
inherit src version;
|
||||||
|
strictDeps = true;
|
||||||
|
COMMIT_HASH = self.rev or (pkgs.lib.removeSuffix "-dirty" self.dirtyRev);
|
||||||
|
|
||||||
|
# build inputs for cross-compilation
|
||||||
|
nativeBuildInputs = [
|
||||||
|
pkgs.llvmPackages.clang-unwrapped
|
||||||
|
pkgs.llvmPackages.lld
|
||||||
|
pkgs.llvmPackages.llvm
|
||||||
|
];
|
||||||
|
|
||||||
|
# cross-compilation environment
|
||||||
|
inherit (msvcEnv)
|
||||||
|
CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_LINKER
|
||||||
|
CC_x86_64_pc_windows_msvc
|
||||||
|
CXX_x86_64_pc_windows_msvc
|
||||||
|
AR_x86_64_pc_windows_msvc
|
||||||
|
CFLAGS_x86_64_pc_windows_msvc
|
||||||
|
CXXFLAGS_x86_64_pc_windows_msvc
|
||||||
|
CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_RUSTFLAGS
|
||||||
|
CARGO_BUILD_TARGET
|
||||||
|
;
|
||||||
|
};
|
||||||
|
|
||||||
|
cargoArtifacts = craneLib.buildDepsOnly commonArgs;
|
||||||
|
|
||||||
|
individualCrateArgs = commonArgs // {
|
||||||
|
inherit cargoArtifacts;
|
||||||
|
doCheck = false;
|
||||||
|
doDoc = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
fullBuild = craneLib.buildPackage (
|
||||||
|
individualCrateArgs
|
||||||
|
// {
|
||||||
|
pname = "komorebi-workspace";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
extractBinary =
|
||||||
|
binaryName:
|
||||||
|
pkgs.runCommand "komorebi-${binaryName}"
|
||||||
|
{
|
||||||
|
meta = fullBuild.meta // { };
|
||||||
|
}
|
||||||
|
''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
cp ${fullBuild}/bin/${binaryName}.exe $out/bin/
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
inherit
|
||||||
|
craneLib
|
||||||
|
src
|
||||||
|
individualCrateArgs
|
||||||
|
fullBuild
|
||||||
|
msvcEnv
|
||||||
|
;
|
||||||
|
komorebi = extractBinary "komorebi";
|
||||||
|
komorebic = extractBinary "komorebic";
|
||||||
|
komorebic-no-console = extractBinary "komorebic-no-console";
|
||||||
|
komorebi-bar = extractBinary "komorebi-bar";
|
||||||
|
komorebi-gui = extractBinary "komorebi-gui";
|
||||||
|
komorebi-shortcuts = extractBinary "komorebi-shortcuts";
|
||||||
|
};
|
||||||
|
|
||||||
|
mkPkgs =
|
||||||
|
system:
|
||||||
|
import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
overlays = [ (import rust-overlay) ];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
flake-parts.lib.mkFlake { inherit inputs; } {
|
||||||
|
systems = [
|
||||||
|
"aarch64-darwin"
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
];
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
inputs.treefmt-nix.flakeModule
|
||||||
|
inputs.git-hooks-nix.flakeModule
|
||||||
|
];
|
||||||
|
|
||||||
|
perSystem =
|
||||||
|
{ config, system, ... }:
|
||||||
|
let
|
||||||
|
pkgs = mkPkgs system;
|
||||||
|
windowsSdk = mkWindowsSdk pkgs;
|
||||||
|
build = mkKomorebiPackages { inherit pkgs windowsSdk; };
|
||||||
|
|
||||||
|
# toolchain with windows target and nightly rustfmt
|
||||||
|
rustToolchain = (pkgs.rust-bin.fromRustupToolchainFile ./rust-toolchain.toml).override {
|
||||||
|
targets = [ "x86_64-pc-windows-msvc" ];
|
||||||
|
};
|
||||||
|
nightlyRustfmt = pkgs.rust-bin.nightly.latest.rustfmt;
|
||||||
|
rustToolchainWithNightlyRustfmt = pkgs.symlinkJoin {
|
||||||
|
name = "rust-toolchain-with-nightly-rustfmt";
|
||||||
|
paths = [
|
||||||
|
nightlyRustfmt
|
||||||
|
rustToolchain
|
||||||
|
];
|
||||||
|
};
|
||||||
|
nightlyToolchain = pkgs.rust-bin.nightly.latest.default.override {
|
||||||
|
targets = [ "x86_64-pc-windows-msvc" ];
|
||||||
|
};
|
||||||
|
cargo-udeps = pkgs.writeShellScriptBin "cargo-udeps" ''
|
||||||
|
export PATH="${nightlyToolchain}/bin:$PATH"
|
||||||
|
exec ${pkgs.cargo-udeps}/bin/cargo-udeps "$@"
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
treefmt = {
|
||||||
|
projectRootFile = "flake.nix";
|
||||||
|
programs = {
|
||||||
|
deadnix.enable = true;
|
||||||
|
just.enable = true;
|
||||||
|
nixfmt.enable = true;
|
||||||
|
taplo.enable = true;
|
||||||
|
rustfmt = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.rust-bin.nightly.latest.rustfmt;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
checks = {
|
||||||
|
komorebi-workspace-clippy = build.craneLib.cargoClippy (
|
||||||
|
build.individualCrateArgs
|
||||||
|
// {
|
||||||
|
cargoClippyExtraArgs = "--all-targets -- -D warnings";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
komorebi-workspace-fmt = build.craneLib.cargoFmt {
|
||||||
|
inherit (build) src;
|
||||||
|
};
|
||||||
|
|
||||||
|
komorebi-workspace-toml-fmt = build.craneLib.taploFmt {
|
||||||
|
src = pkgs.lib.sources.sourceFilesBySuffices build.src [ ".toml" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
komorebi-workspace-deny = build.craneLib.cargoDeny {
|
||||||
|
inherit (build) src;
|
||||||
|
};
|
||||||
|
|
||||||
|
komorebi-workspace-nextest = build.craneLib.cargoNextest build.individualCrateArgs;
|
||||||
|
};
|
||||||
|
|
||||||
|
packages = {
|
||||||
|
inherit (build)
|
||||||
|
komorebi
|
||||||
|
komorebic
|
||||||
|
komorebic-no-console
|
||||||
|
komorebi-bar
|
||||||
|
komorebi-gui
|
||||||
|
komorebi-shortcuts
|
||||||
|
;
|
||||||
|
inherit windowsSdk;
|
||||||
|
komorebi-full = build.fullBuild;
|
||||||
|
default = build.fullBuild;
|
||||||
|
};
|
||||||
|
|
||||||
|
apps = {
|
||||||
|
komorebi = {
|
||||||
|
type = "app";
|
||||||
|
program = "${build.komorebi}/bin/komorebi.exe";
|
||||||
|
};
|
||||||
|
komorebic = {
|
||||||
|
type = "app";
|
||||||
|
program = "${build.komorebic}/bin/komorebic.exe";
|
||||||
|
};
|
||||||
|
komorebic-no-console = {
|
||||||
|
type = "app";
|
||||||
|
program = "${build.komorebic-no-console}/bin/komorebic-no-console.exe";
|
||||||
|
};
|
||||||
|
komorebi-bar = {
|
||||||
|
type = "app";
|
||||||
|
program = "${build.komorebi-bar}/bin/komorebi-bar.exe";
|
||||||
|
};
|
||||||
|
komorebi-gui = {
|
||||||
|
type = "app";
|
||||||
|
program = "${build.komorebi-gui}/bin/komorebi-gui.exe";
|
||||||
|
};
|
||||||
|
komorebi-shortcuts = {
|
||||||
|
type = "app";
|
||||||
|
program = "${build.komorebi-shortcuts}/bin/komorebi-shortcuts.exe";
|
||||||
|
};
|
||||||
|
default = {
|
||||||
|
type = "app";
|
||||||
|
program = "${build.fullBuild}/bin/komorebi.exe";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
devShells.default = pkgs.mkShell {
|
||||||
|
name = "komorebi";
|
||||||
|
|
||||||
|
RUST_BACKTRACE = "full";
|
||||||
|
|
||||||
|
# cross-compilation environment
|
||||||
|
inherit (build.msvcEnv)
|
||||||
|
CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_LINKER
|
||||||
|
CC_x86_64_pc_windows_msvc
|
||||||
|
CXX_x86_64_pc_windows_msvc
|
||||||
|
AR_x86_64_pc_windows_msvc
|
||||||
|
CFLAGS_x86_64_pc_windows_msvc
|
||||||
|
CXXFLAGS_x86_64_pc_windows_msvc
|
||||||
|
CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_RUSTFLAGS
|
||||||
|
CARGO_BUILD_TARGET
|
||||||
|
;
|
||||||
|
|
||||||
|
packages = [
|
||||||
|
rustToolchainWithNightlyRustfmt
|
||||||
|
cargo-udeps
|
||||||
|
|
||||||
|
# cross-compilation tooling
|
||||||
|
pkgs.llvmPackages.clang-unwrapped # provides clang-cl
|
||||||
|
pkgs.llvmPackages.lld # provides lld-link
|
||||||
|
pkgs.llvmPackages.llvm # provides llvm-lib
|
||||||
|
|
||||||
|
pkgs.cargo-deny
|
||||||
|
pkgs.cargo-nextest
|
||||||
|
pkgs.cargo-outdated
|
||||||
|
pkgs.jq
|
||||||
|
pkgs.just
|
||||||
|
pkgs.prettier
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
pre-commit = {
|
||||||
|
check.enable = true;
|
||||||
|
settings.hooks.treefmt = {
|
||||||
|
enable = true;
|
||||||
|
package = config.treefmt.build.wrapper;
|
||||||
|
pass_filenames = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -75,23 +75,38 @@ trace target $RUST_LOG="trace":
|
|||||||
deadlock $RUST_LOG="trace":
|
deadlock $RUST_LOG="trace":
|
||||||
cargo +stable run --bin komorebi --locked --no-default-features --features deadlock_detection
|
cargo +stable run --bin komorebi --locked --no-default-features --features deadlock_detection
|
||||||
|
|
||||||
docgen:
|
docgen starlight:
|
||||||
cargo run --package komorebic -- docgen
|
rm {{ starlight }}/src/data/cli/windows/*.md
|
||||||
Get-ChildItem -Path "docs/cli" -Recurse -File | ForEach-Object { (Get-Content $_.FullName) -replace 'Usage: ', 'Usage: komorebic.exe ' | Set-Content $_.FullName }
|
cargo run --package komorebic -- docgen --output {{ starlight }}/src/data/cli/windows
|
||||||
|
schemars-docgen ./schema.json --output {{ starlight }}/src/content/docs/reference/komorebi-windows.mdx --title "komorebi.json (Windows)" --description "komorebi for Windows configuration schema reference"
|
||||||
|
schemars-docgen ./schema.bar.json --output {{ starlight }}/src/content/docs/reference/bar-windows.mdx --title "komorebi.bar.json (Windows)" --description "komorebi-bar for Windows configuration schema reference"
|
||||||
|
|
||||||
jsonschema:
|
jsonschema:
|
||||||
cargo run --package komorebic -- static-config-schema > schema.json
|
cargo run --package komorebic -- static-config-schema > schema.json
|
||||||
cargo run --package komorebic -- application-specific-configuration-schema > schema.asc.json
|
cargo run --package komorebic -- application-specific-configuration-schema > schema.asc.json
|
||||||
cargo run --package komorebi-bar -- --schema > schema.bar.json
|
cargo run --package komorebi-bar -- --schema > schema.bar.json
|
||||||
|
|
||||||
# this part is run in a nix shell because python is a nightmare
|
version := `cargo metadata --format-version 1 --no-deps | jq -r '.packages[] | select(.name == "komorebi") | .version'`
|
||||||
schemagen:
|
|
||||||
rm -rf static-config-docs bar-config-docs
|
schemapub:
|
||||||
mkdir -p static-config-docs bar-config-docs
|
rm -Force komorebi-schema
|
||||||
generate-schema-doc ./schema.json --config template_name=js_offline --config minify=false ./static-config-docs/
|
mkdir -Force komorebi-schema
|
||||||
generate-schema-doc ./schema.bar.json --config template_name=js_offline --config minify=false ./bar-config-docs/
|
cp schema.json komorebi-schema/komorebi.{{ version }}.schema.json
|
||||||
mv ./bar-config-docs/schema.bar.html ./bar-config-docs/schema.html
|
cp schema.bar.json komorebi-schema/komorebi.bar.{{ version }}.schema.json
|
||||||
|
npx wrangler pages deploy --project-name komorebi --branch main .\komorebi-schema
|
||||||
|
|
||||||
|
depcheck:
|
||||||
|
cargo outdated --depth 2
|
||||||
|
cargo +nightly udeps --quiet
|
||||||
|
|
||||||
|
deps:
|
||||||
|
cargo update
|
||||||
|
just depgen
|
||||||
|
|
||||||
depgen:
|
depgen:
|
||||||
cargo deny check
|
cargo deny check
|
||||||
cargo deny list --format json | jq 'del(.unlicensed)' > dependencies.json
|
cargo deny list --format json | jq 'del(.unlicensed)' > dependencies.json
|
||||||
|
|
||||||
|
procdump:
|
||||||
|
cargo build --bin komorebi
|
||||||
|
.\procdump.exe -ma -e -x . .\target\debug\komorebi.exe
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "komorebi-bar"
|
name = "komorebi-bar"
|
||||||
version = "0.1.39"
|
version = "0.1.40"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
@@ -22,7 +22,7 @@ font-loader = "0.11"
|
|||||||
hotwatch = { workspace = true }
|
hotwatch = { workspace = true }
|
||||||
image = "0.25"
|
image = "0.25"
|
||||||
lazy_static = { workspace = true }
|
lazy_static = { workspace = true }
|
||||||
netdev = "0.39"
|
netdev = "0.40"
|
||||||
num = "0.4"
|
num = "0.4"
|
||||||
num-derive = "0.4"
|
num-derive = "0.4"
|
||||||
num-traits = "0.2"
|
num-traits = "0.2"
|
||||||
@@ -44,4 +44,8 @@ windows-icons-fallback = { package = "windows-icons", git = "https://github.com/
|
|||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["schemars"]
|
default = ["schemars"]
|
||||||
schemars = ["dep:schemars", "komorebi-client/default", "komorebi-themes/default"]
|
schemars = [
|
||||||
|
"dep:schemars",
|
||||||
|
"komorebi-client/default",
|
||||||
|
"komorebi-themes/default",
|
||||||
|
]
|
||||||
|
|||||||
+18
-10
@@ -55,6 +55,9 @@ use komorebi_client::SocketMessage;
|
|||||||
use komorebi_client::VirtualDesktopNotification;
|
use komorebi_client::VirtualDesktopNotification;
|
||||||
use komorebi_themes::Base16Wrapper;
|
use komorebi_themes::Base16Wrapper;
|
||||||
use komorebi_themes::Catppuccin;
|
use komorebi_themes::Catppuccin;
|
||||||
|
use komorebi_themes::KomobarThemeBase16;
|
||||||
|
use komorebi_themes::KomobarThemeCatppuccin;
|
||||||
|
use komorebi_themes::KomobarThemeCustom;
|
||||||
use komorebi_themes::catppuccin_egui;
|
use komorebi_themes::catppuccin_egui;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
use parking_lot::Mutex;
|
use parking_lot::Mutex;
|
||||||
@@ -183,12 +186,12 @@ pub fn apply_theme(
|
|||||||
render_config: Rc<RefCell<RenderConfig>>,
|
render_config: Rc<RefCell<RenderConfig>>,
|
||||||
) {
|
) {
|
||||||
let (auto_select_fill, auto_select_text) = match theme {
|
let (auto_select_fill, auto_select_text) = match theme {
|
||||||
KomobarTheme::Catppuccin {
|
KomobarTheme::Catppuccin(KomobarThemeCatppuccin {
|
||||||
name: catppuccin,
|
name: catppuccin,
|
||||||
accent: catppuccin_value,
|
accent: catppuccin_value,
|
||||||
auto_select_fill: catppuccin_auto_select_fill,
|
auto_select_fill: catppuccin_auto_select_fill,
|
||||||
auto_select_text: catppuccin_auto_select_text,
|
auto_select_text: catppuccin_auto_select_text,
|
||||||
} => {
|
}) => {
|
||||||
match catppuccin {
|
match catppuccin {
|
||||||
Catppuccin::Frappe => {
|
Catppuccin::Frappe => {
|
||||||
catppuccin_egui::set_theme(ctx, catppuccin_egui::FRAPPE);
|
catppuccin_egui::set_theme(ctx, catppuccin_egui::FRAPPE);
|
||||||
@@ -253,12 +256,12 @@ pub fn apply_theme(
|
|||||||
catppuccin_auto_select_text.map(|c| c.color32(catppuccin.as_theme())),
|
catppuccin_auto_select_text.map(|c| c.color32(catppuccin.as_theme())),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
KomobarTheme::Base16 {
|
KomobarTheme::Base16(KomobarThemeBase16 {
|
||||||
name: base16,
|
name: base16,
|
||||||
accent: base16_value,
|
accent: base16_value,
|
||||||
auto_select_fill: base16_auto_select_fill,
|
auto_select_fill: base16_auto_select_fill,
|
||||||
auto_select_text: base16_auto_select_text,
|
auto_select_text: base16_auto_select_text,
|
||||||
} => {
|
}) => {
|
||||||
ctx.set_style(base16.style());
|
ctx.set_style(base16.style());
|
||||||
let base16_value = base16_value.unwrap_or_default();
|
let base16_value = base16_value.unwrap_or_default();
|
||||||
let accent = base16_value.color32(Base16Wrapper::Base16(base16));
|
let accent = base16_value.color32(Base16Wrapper::Base16(base16));
|
||||||
@@ -276,12 +279,12 @@ pub fn apply_theme(
|
|||||||
base16_auto_select_text.map(|c| c.color32(Base16Wrapper::Base16(base16))),
|
base16_auto_select_text.map(|c| c.color32(Base16Wrapper::Base16(base16))),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
KomobarTheme::Custom {
|
KomobarTheme::Custom(KomobarThemeCustom {
|
||||||
colours,
|
colours,
|
||||||
accent: base16_value,
|
accent: base16_value,
|
||||||
auto_select_fill: base16_auto_select_fill,
|
auto_select_fill: base16_auto_select_fill,
|
||||||
auto_select_text: base16_auto_select_text,
|
auto_select_text: base16_auto_select_text,
|
||||||
} => {
|
}) => {
|
||||||
let background = colours.background();
|
let background = colours.background();
|
||||||
ctx.set_style(colours.style());
|
ctx.set_style(colours.style());
|
||||||
let base16_value = base16_value.unwrap_or_default();
|
let base16_value = base16_value.unwrap_or_default();
|
||||||
@@ -450,10 +453,11 @@ impl Komobar {
|
|||||||
self.right_widgets = right_widgets;
|
self.right_widgets = right_widgets;
|
||||||
|
|
||||||
let (usr_monitor_index, config_work_area_offset) = match &self.config.monitor {
|
let (usr_monitor_index, config_work_area_offset) = match &self.config.monitor {
|
||||||
MonitorConfigOrIndex::MonitorConfig(monitor_config) => {
|
Some(MonitorConfigOrIndex::MonitorConfig(monitor_config)) => {
|
||||||
(monitor_config.index, monitor_config.work_area_offset)
|
(monitor_config.index, monitor_config.work_area_offset)
|
||||||
}
|
}
|
||||||
MonitorConfigOrIndex::Index(idx) => (*idx, None),
|
Some(MonitorConfigOrIndex::Index(idx)) => (*idx, None),
|
||||||
|
None => (0, None),
|
||||||
};
|
};
|
||||||
|
|
||||||
let mapped_info = self.monitor_info.as_ref().map(|info| {
|
let mapped_info = self.monitor_info.as_ref().map(|info| {
|
||||||
@@ -863,9 +867,13 @@ impl eframe::App for Komobar {
|
|||||||
Ok(KomorebiEvent::Notification(notification)) => {
|
Ok(KomorebiEvent::Notification(notification)) => {
|
||||||
let state = ¬ification.state;
|
let state = ¬ification.state;
|
||||||
let usr_monitor_index = match &self.config.monitor {
|
let usr_monitor_index = match &self.config.monitor {
|
||||||
MonitorConfigOrIndex::MonitorConfig(monitor_config) => monitor_config.index,
|
Some(MonitorConfigOrIndex::MonitorConfig(monitor_config)) => {
|
||||||
MonitorConfigOrIndex::Index(idx) => *idx,
|
monitor_config.index
|
||||||
|
}
|
||||||
|
Some(MonitorConfigOrIndex::Index(idx)) => *idx,
|
||||||
|
None => 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
let monitor_index = state.monitor_usr_idx_map.get(&usr_monitor_index).copied();
|
let monitor_index = state.monitor_usr_idx_map.get(&usr_monitor_index).copied();
|
||||||
self.monitor_index = monitor_index;
|
self.monitor_index = monitor_index;
|
||||||
let mut should_apply_config = false;
|
let mut should_apply_config = false;
|
||||||
|
|||||||
+54
-77
@@ -5,7 +5,6 @@ use crate::widgets::widget::WidgetConfig;
|
|||||||
use eframe::egui::Pos2;
|
use eframe::egui::Pos2;
|
||||||
use eframe::egui::TextBuffer;
|
use eframe::egui::TextBuffer;
|
||||||
use eframe::egui::Vec2;
|
use eframe::egui::Vec2;
|
||||||
use komorebi_client::KomorebiTheme;
|
|
||||||
use komorebi_client::PathExt;
|
use komorebi_client::PathExt;
|
||||||
use komorebi_client::Rect;
|
use komorebi_client::Rect;
|
||||||
use komorebi_client::SocketMessage;
|
use komorebi_client::SocketMessage;
|
||||||
@@ -16,9 +15,10 @@ use std::path::PathBuf;
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
/// The `komorebi.bar.json` configuration file reference for `v0.1.39`
|
/// The `komorebi.bar.json` configuration file reference for `v0.1.40`
|
||||||
pub struct KomobarConfig {
|
pub struct KomobarConfig {
|
||||||
/// Bar height (default: 50)
|
/// Bar height
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 50.0)))]
|
||||||
pub height: Option<f32>,
|
pub height: Option<f32>,
|
||||||
/// Bar padding. Use one value for all sides or use a grouped padding for horizontal and/or
|
/// Bar padding. Use one value for all sides or use a grouped padding for horizontal and/or
|
||||||
/// vertical definition which can each take a single value for a symmetric padding or two
|
/// vertical definition which can each take a single value for a symmetric padding or two
|
||||||
@@ -76,20 +76,26 @@ pub struct KomobarConfig {
|
|||||||
/// Frame options (see: https://docs.rs/egui/latest/egui/containers/frame/struct.Frame.html)
|
/// Frame options (see: https://docs.rs/egui/latest/egui/containers/frame/struct.Frame.html)
|
||||||
pub frame: Option<FrameConfig>,
|
pub frame: Option<FrameConfig>,
|
||||||
/// The monitor index or the full monitor options
|
/// The monitor index or the full monitor options
|
||||||
pub monitor: MonitorConfigOrIndex,
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = MonitorConfigOrIndex::Index(0))))]
|
||||||
|
pub monitor: Option<MonitorConfigOrIndex>,
|
||||||
/// Font family
|
/// Font family
|
||||||
pub font_family: Option<String>,
|
pub font_family: Option<String>,
|
||||||
/// Font size (default: 12.5)
|
/// Font size
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 12.5)))]
|
||||||
pub font_size: Option<f32>,
|
pub font_size: Option<f32>,
|
||||||
/// Scale of the icons relative to the font_size [[1.0-2.0]]. (default: 1.4)
|
/// Scale of the icons relative to the font_size [[1.0-2.0]]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 1.4)))]
|
||||||
pub icon_scale: Option<f32>,
|
pub icon_scale: Option<f32>,
|
||||||
/// Max label width before text truncation (default: 400.0)
|
/// Max label width before text truncation
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 400.0)))]
|
||||||
pub max_label_width: Option<f32>,
|
pub max_label_width: Option<f32>,
|
||||||
/// Theme
|
/// Theme
|
||||||
pub theme: Option<KomobarTheme>,
|
pub theme: Option<KomobarTheme>,
|
||||||
/// Alpha value for the color transparency [[0-255]] (default: 200)
|
/// Alpha value for the color transparency [[0-255]]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 200)))]
|
||||||
pub transparency_alpha: Option<u8>,
|
pub transparency_alpha: Option<u8>,
|
||||||
/// Spacing between widgets (default: 10.0)
|
/// Spacing between widgets
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 10.0)))]
|
||||||
pub widget_spacing: Option<f32>,
|
pub widget_spacing: Option<f32>,
|
||||||
/// Visual grouping for widgets
|
/// Visual grouping for widgets
|
||||||
pub grouping: Option<Grouping>,
|
pub grouping: Option<Grouping>,
|
||||||
@@ -145,6 +151,7 @@ impl KomobarConfig {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Position configuration
|
||||||
pub struct PositionConfig {
|
pub struct PositionConfig {
|
||||||
/// The desired starting position of the bar (0,0 = top left of the screen)
|
/// The desired starting position of the bar (0,0 = top left of the screen)
|
||||||
#[serde(alias = "position")]
|
#[serde(alias = "position")]
|
||||||
@@ -156,6 +163,7 @@ pub struct PositionConfig {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Frame configuration
|
||||||
pub struct FrameConfig {
|
pub struct FrameConfig {
|
||||||
/// Margin inside the painted frame
|
/// Margin inside the painted frame
|
||||||
pub inner_margin: Position,
|
pub inner_margin: Position,
|
||||||
@@ -164,6 +172,7 @@ pub struct FrameConfig {
|
|||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
|
/// Monitor configuration or monitor index
|
||||||
pub enum MonitorConfigOrIndex {
|
pub enum MonitorConfigOrIndex {
|
||||||
/// The monitor index where you want the bar to show
|
/// The monitor index where you want the bar to show
|
||||||
Index(usize),
|
Index(usize),
|
||||||
@@ -173,6 +182,7 @@ pub enum MonitorConfigOrIndex {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Monitor configuration
|
||||||
pub struct MonitorConfig {
|
pub struct MonitorConfig {
|
||||||
/// Komorebi monitor index of the monitor on which to render the bar
|
/// Komorebi monitor index of the monitor on which to render the bar
|
||||||
pub index: usize,
|
pub index: usize,
|
||||||
@@ -190,9 +200,13 @@ pub type Margin = SpacingKind;
|
|||||||
// `Grouped` needs to come last, otherwise serde might mistaken an `IndividualSpacingConfig` for a
|
// `Grouped` needs to come last, otherwise serde might mistaken an `IndividualSpacingConfig` for a
|
||||||
// `GroupedSpacingConfig` with both `vertical` and `horizontal` set to `None` ignoring the
|
// `GroupedSpacingConfig` with both `vertical` and `horizontal` set to `None` ignoring the
|
||||||
// individual values.
|
// individual values.
|
||||||
|
/// Spacing kind
|
||||||
pub enum SpacingKind {
|
pub enum SpacingKind {
|
||||||
|
/// Spacing applied to all sides
|
||||||
All(f32),
|
All(f32),
|
||||||
|
/// Individual spacing applied to each side
|
||||||
Individual(IndividualSpacingConfig),
|
Individual(IndividualSpacingConfig),
|
||||||
|
/// Grouped vertical and horizontal spacing
|
||||||
Grouped(GroupedSpacingConfig),
|
Grouped(GroupedSpacingConfig),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -237,25 +251,36 @@ impl SpacingKind {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Grouped vertical and horizontal spacing
|
||||||
pub struct GroupedSpacingConfig {
|
pub struct GroupedSpacingConfig {
|
||||||
|
/// Vertical grouped spacing
|
||||||
pub vertical: Option<GroupedSpacingOptions>,
|
pub vertical: Option<GroupedSpacingOptions>,
|
||||||
|
/// Horizontal grouped spacing
|
||||||
pub horizontal: Option<GroupedSpacingOptions>,
|
pub horizontal: Option<GroupedSpacingOptions>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
|
/// Grouped spacing options
|
||||||
pub enum GroupedSpacingOptions {
|
pub enum GroupedSpacingOptions {
|
||||||
|
/// Symmetrical grouped spacing
|
||||||
Symmetrical(f32),
|
Symmetrical(f32),
|
||||||
|
/// Split grouped spacing
|
||||||
Split(f32, f32),
|
Split(f32, f32),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Individual spacing configuration
|
||||||
pub struct IndividualSpacingConfig {
|
pub struct IndividualSpacingConfig {
|
||||||
|
/// Spacing for the top
|
||||||
pub top: f32,
|
pub top: f32,
|
||||||
|
/// Spacing for the bottom
|
||||||
pub bottom: f32,
|
pub bottom: f32,
|
||||||
|
/// Spacing for the left
|
||||||
pub left: f32,
|
pub left: f32,
|
||||||
|
/// Spacing for the right
|
||||||
pub right: f32,
|
pub right: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,6 +360,7 @@ pub fn get_individual_spacing(
|
|||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
|
/// Mouse message
|
||||||
pub enum MouseMessage {
|
pub enum MouseMessage {
|
||||||
/// Send a message to the komorebi client.
|
/// Send a message to the komorebi client.
|
||||||
/// By default, a batch of messages are sent in the following order:
|
/// By default, a batch of messages are sent in the following order:
|
||||||
@@ -379,10 +405,13 @@ pub enum MouseMessage {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Komorebi socket mouse message
|
||||||
pub struct KomorebiMouseMessage {
|
pub struct KomorebiMouseMessage {
|
||||||
/// Send the FocusMonitorAtCursor message (default:true)
|
/// Send the FocusMonitorAtCursor message
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = true)))]
|
||||||
pub focus_monitor_at_cursor: Option<bool>,
|
pub focus_monitor_at_cursor: Option<bool>,
|
||||||
/// Wrap the {message} with a MouseFollowsFocus(false) and MouseFollowsFocus({original.value}) message (default:true)
|
/// Wrap the {message} with a MouseFollowsFocus(false) and MouseFollowsFocus({original.value}) message
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = true)))]
|
||||||
pub ignore_mouse_follows_focus: Option<bool>,
|
pub ignore_mouse_follows_focus: Option<bool>,
|
||||||
/// The message to send to the komorebi client
|
/// The message to send to the komorebi client
|
||||||
pub message: komorebi_client::SocketMessage,
|
pub message: komorebi_client::SocketMessage,
|
||||||
@@ -390,6 +419,7 @@ pub struct KomorebiMouseMessage {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Mouse configuration
|
||||||
pub struct MouseConfig {
|
pub struct MouseConfig {
|
||||||
/// Command to send on primary/left double button click
|
/// Command to send on primary/left double button click
|
||||||
pub on_primary_double_click: Option<MouseMessage>,
|
pub on_primary_double_click: Option<MouseMessage>,
|
||||||
@@ -402,14 +432,16 @@ pub struct MouseConfig {
|
|||||||
/// Command to send on extra2/forward button click
|
/// Command to send on extra2/forward button click
|
||||||
pub on_extra2_click: Option<MouseMessage>,
|
pub on_extra2_click: Option<MouseMessage>,
|
||||||
|
|
||||||
/// Defines how many points a user needs to scroll vertically to make a "tick" on a mouse/touchpad/touchscreen (default: 30)
|
/// Defines how many points a user needs to scroll vertically to make a "tick" on a mouse/touchpad/touchscreen
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 30.0)))]
|
||||||
pub vertical_scroll_threshold: Option<f32>,
|
pub vertical_scroll_threshold: Option<f32>,
|
||||||
/// Command to send on scrolling up (every tick)
|
/// Command to send on scrolling up (every tick)
|
||||||
pub on_scroll_up: Option<MouseMessage>,
|
pub on_scroll_up: Option<MouseMessage>,
|
||||||
/// Command to send on scrolling down (every tick)
|
/// Command to send on scrolling down (every tick)
|
||||||
pub on_scroll_down: Option<MouseMessage>,
|
pub on_scroll_down: Option<MouseMessage>,
|
||||||
|
|
||||||
/// Defines how many points a user needs to scroll horizontally to make a "tick" on a mouse/touchpad/touchscreen (default: 30)
|
/// Defines how many points a user needs to scroll horizontally to make a "tick" on a mouse/touchpad/touchscreen
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 30.0)))]
|
||||||
pub horizontal_scroll_threshold: Option<f32>,
|
pub horizontal_scroll_threshold: Option<f32>,
|
||||||
/// Command to send on scrolling left (every tick)
|
/// Command to send on scrolling left (every tick)
|
||||||
pub on_scroll_left: Option<MouseMessage>,
|
pub on_scroll_left: Option<MouseMessage>,
|
||||||
@@ -495,6 +527,7 @@ impl KomobarConfig {
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Position
|
||||||
pub struct Position {
|
pub struct Position {
|
||||||
/// X coordinate
|
/// X coordinate
|
||||||
pub x: f32,
|
pub x: f32,
|
||||||
@@ -520,71 +553,11 @@ impl From<Position> for Pos2 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
pub use komorebi_themes::KomobarTheme;
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
|
||||||
#[serde(tag = "palette")]
|
|
||||||
pub enum KomobarTheme {
|
|
||||||
/// A theme from catppuccin-egui
|
|
||||||
Catppuccin {
|
|
||||||
/// Name of the Catppuccin theme (theme previews: https://github.com/catppuccin/catppuccin)
|
|
||||||
name: komorebi_themes::Catppuccin,
|
|
||||||
accent: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
auto_select_fill: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
auto_select_text: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
},
|
|
||||||
/// A theme from base16-egui-themes
|
|
||||||
Base16 {
|
|
||||||
/// Name of the Base16 theme (theme previews: https://tinted-theming.github.io/tinted-gallery/)
|
|
||||||
name: komorebi_themes::Base16,
|
|
||||||
accent: Option<komorebi_themes::Base16Value>,
|
|
||||||
auto_select_fill: Option<komorebi_themes::Base16Value>,
|
|
||||||
auto_select_text: Option<komorebi_themes::Base16Value>,
|
|
||||||
},
|
|
||||||
/// A custom Base16 theme
|
|
||||||
Custom {
|
|
||||||
/// Colours of the custom Base16 theme palette
|
|
||||||
colours: Box<komorebi_themes::Base16ColourPalette>,
|
|
||||||
accent: Option<komorebi_themes::Base16Value>,
|
|
||||||
auto_select_fill: Option<komorebi_themes::Base16Value>,
|
|
||||||
auto_select_text: Option<komorebi_themes::Base16Value>,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<KomorebiTheme> for KomobarTheme {
|
|
||||||
fn from(value: KomorebiTheme) -> Self {
|
|
||||||
match value {
|
|
||||||
KomorebiTheme::Catppuccin {
|
|
||||||
name, bar_accent, ..
|
|
||||||
} => Self::Catppuccin {
|
|
||||||
name,
|
|
||||||
accent: bar_accent,
|
|
||||||
auto_select_fill: None,
|
|
||||||
auto_select_text: None,
|
|
||||||
},
|
|
||||||
KomorebiTheme::Base16 {
|
|
||||||
name, bar_accent, ..
|
|
||||||
} => Self::Base16 {
|
|
||||||
name,
|
|
||||||
accent: bar_accent,
|
|
||||||
auto_select_fill: None,
|
|
||||||
auto_select_text: None,
|
|
||||||
},
|
|
||||||
KomorebiTheme::Custom {
|
|
||||||
colours,
|
|
||||||
bar_accent,
|
|
||||||
..
|
|
||||||
} => Self::Custom {
|
|
||||||
colours,
|
|
||||||
accent: bar_accent,
|
|
||||||
auto_select_fill: None,
|
|
||||||
auto_select_text: None,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Label prefix
|
||||||
pub enum LabelPrefix {
|
pub enum LabelPrefix {
|
||||||
/// Show no prefix
|
/// Show no prefix
|
||||||
None,
|
None,
|
||||||
@@ -598,6 +571,7 @@ pub enum LabelPrefix {
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Display format
|
||||||
pub enum DisplayFormat {
|
pub enum DisplayFormat {
|
||||||
/// Show only icon
|
/// Show only icon
|
||||||
Icon,
|
Icon,
|
||||||
@@ -612,9 +586,10 @@ pub enum DisplayFormat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! extend_enum {
|
macro_rules! extend_enum {
|
||||||
($existing_enum:ident, $new_enum:ident, { $($(#[$meta:meta])* $variant:ident),* $(,)? }) => {
|
($(#[$type_meta:meta])* $existing_enum:ident, $new_enum:ident, { $($(#[$meta:meta])* $variant:ident),* $(,)? }) => {
|
||||||
#[derive(Copy, Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq)]
|
#[derive(Copy, Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
$(#[$type_meta])*
|
||||||
pub enum $new_enum {
|
pub enum $new_enum {
|
||||||
// Add new variants
|
// Add new variants
|
||||||
$(
|
$(
|
||||||
@@ -635,7 +610,9 @@ macro_rules! extend_enum {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
extend_enum!(DisplayFormat, WorkspacesDisplayFormat, {
|
extend_enum!(
|
||||||
|
/// Workspaces display format
|
||||||
|
DisplayFormat, WorkspacesDisplayFormat, {
|
||||||
/// Show all icons only
|
/// Show all icons only
|
||||||
AllIcons,
|
AllIcons,
|
||||||
/// Show both all icons and text
|
/// Show both all icons and text
|
||||||
|
|||||||
@@ -114,15 +114,8 @@ fn main() -> color_eyre::Result<()> {
|
|||||||
|
|
||||||
#[cfg(feature = "schemars")]
|
#[cfg(feature = "schemars")]
|
||||||
if opts.schema {
|
if opts.schema {
|
||||||
let settings = schemars::r#gen::SchemaSettings::default().with(|s| {
|
let bar_config = schemars::schema_for!(KomobarConfig);
|
||||||
s.option_nullable = false;
|
let schema = serde_json::to_string_pretty(&bar_config)?;
|
||||||
s.option_add_null_type = false;
|
|
||||||
s.inline_subschemas = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
let generator = settings.into_generator();
|
|
||||||
let socket_message = generator.into_root_schema_for::<KomobarConfig>();
|
|
||||||
let schema = serde_json::to_string_pretty(&socket_message)?;
|
|
||||||
|
|
||||||
println!("{schema}");
|
println!("{schema}");
|
||||||
std::process::exit(0);
|
std::process::exit(0);
|
||||||
@@ -223,11 +216,13 @@ fn main() -> color_eyre::Result<()> {
|
|||||||
)?)?;
|
)?)?;
|
||||||
|
|
||||||
let (usr_monitor_index, work_area_offset) = match &config.monitor {
|
let (usr_monitor_index, work_area_offset) = match &config.monitor {
|
||||||
MonitorConfigOrIndex::MonitorConfig(monitor_config) => {
|
Some(MonitorConfigOrIndex::MonitorConfig(monitor_config)) => {
|
||||||
(monitor_config.index, monitor_config.work_area_offset)
|
(monitor_config.index, monitor_config.work_area_offset)
|
||||||
}
|
}
|
||||||
MonitorConfigOrIndex::Index(idx) => (*idx, None),
|
Some(MonitorConfigOrIndex::Index(idx)) => (*idx, None),
|
||||||
|
None => (0, None),
|
||||||
};
|
};
|
||||||
|
|
||||||
let monitor_index = state
|
let monitor_index = state
|
||||||
.monitor_usr_idx_map
|
.monitor_usr_idx_map
|
||||||
.get(&usr_monitor_index)
|
.get(&usr_monitor_index)
|
||||||
|
|||||||
@@ -27,18 +27,24 @@ static SHOW_KOMOREBI_LAYOUT_OPTIONS: AtomicUsize = AtomicUsize::new(0);
|
|||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
#[serde(tag = "kind")]
|
#[serde(tag = "kind")]
|
||||||
|
/// Grouping
|
||||||
pub enum Grouping {
|
pub enum Grouping {
|
||||||
/// No grouping is applied
|
/// No grouping is applied
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "None"))]
|
||||||
None,
|
None,
|
||||||
/// Widgets are grouped as a whole
|
/// Widgets are grouped as a whole
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Bar"))]
|
||||||
Bar(GroupingConfig),
|
Bar(GroupingConfig),
|
||||||
/// Widgets are grouped by alignment
|
/// Widgets are grouped by alignment
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Alignment"))]
|
||||||
Alignment(GroupingConfig),
|
Alignment(GroupingConfig),
|
||||||
/// Widgets are grouped individually
|
/// Widgets are grouped individually
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Widget"))]
|
||||||
Widget(GroupingConfig),
|
Widget(GroupingConfig),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
/// Render configuration
|
||||||
pub struct RenderConfig {
|
pub struct RenderConfig {
|
||||||
/// Komorebi monitor index of the monitor on which to render the bar
|
/// Komorebi monitor index of the monitor on which to render the bar
|
||||||
pub monitor_idx: usize,
|
pub monitor_idx: usize,
|
||||||
@@ -93,8 +99,9 @@ impl RenderExt for &KomobarConfig {
|
|||||||
icon_font_id.size *= icon_scale.unwrap_or(1.4).clamp(1.0, 2.0);
|
icon_font_id.size *= icon_scale.unwrap_or(1.4).clamp(1.0, 2.0);
|
||||||
|
|
||||||
let monitor_idx = match &self.monitor {
|
let monitor_idx = match &self.monitor {
|
||||||
MonitorConfigOrIndex::MonitorConfig(monitor_config) => monitor_config.index,
|
Some(MonitorConfigOrIndex::MonitorConfig(monitor_config)) => monitor_config.index,
|
||||||
MonitorConfigOrIndex::Index(idx) => *idx,
|
Some(MonitorConfigOrIndex::Index(idx)) => *idx,
|
||||||
|
None => 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
// check if any of the alignments have a komorebi widget with the workspace set to show all icons
|
// check if any of the alignments have a komorebi widget with the workspace set to show all icons
|
||||||
@@ -356,6 +363,7 @@ impl RenderConfig {
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Grouping configuration
|
||||||
pub struct GroupingConfig {
|
pub struct GroupingConfig {
|
||||||
/// Styles for the grouping
|
/// Styles for the grouping
|
||||||
pub style: Option<GroupingStyle>,
|
pub style: Option<GroupingStyle>,
|
||||||
@@ -367,7 +375,9 @@ pub struct GroupingConfig {
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Grouping Style
|
||||||
pub enum GroupingStyle {
|
pub enum GroupingStyle {
|
||||||
|
/// Default
|
||||||
#[serde(alias = "CtByte")]
|
#[serde(alias = "CtByte")]
|
||||||
Default,
|
Default,
|
||||||
/// A shadow is added under the default group. (blur: 4, offset: x-1 y-1, spread: 3)
|
/// A shadow is added under the default group. (blur: 4, offset: x-1 y-1, spread: 3)
|
||||||
@@ -389,6 +399,7 @@ pub enum GroupingStyle {
|
|||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
|
/// Rounding configuration
|
||||||
pub enum RoundingConfig {
|
pub enum RoundingConfig {
|
||||||
/// All 4 corners are the same
|
/// All 4 corners are the same
|
||||||
Same(f32),
|
Same(f32),
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ const MIN_LAUNCH_INTERVAL: Duration = Duration::from_millis(800);
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Applications widget configuration
|
||||||
pub struct ApplicationsConfig {
|
pub struct ApplicationsConfig {
|
||||||
/// Enables or disables the applications widget.
|
/// Enables or disables the applications widget.
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
@@ -44,13 +45,14 @@ pub struct ApplicationsConfig {
|
|||||||
pub spacing: Option<f32>,
|
pub spacing: Option<f32>,
|
||||||
/// Default display format for all applications (optional).
|
/// Default display format for all applications (optional).
|
||||||
/// Could be overridden per application. Defaults to `Icon`.
|
/// Could be overridden per application. Defaults to `Icon`.
|
||||||
pub display: Option<DisplayFormat>,
|
pub display: Option<ApplicationsDisplayFormat>,
|
||||||
/// List of configured applications to display.
|
/// List of configured applications to display.
|
||||||
pub items: Vec<AppConfig>,
|
pub items: Vec<AppConfig>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Application button configuration
|
||||||
pub struct AppConfig {
|
pub struct AppConfig {
|
||||||
/// Whether to enable this application button (optional).
|
/// Whether to enable this application button (optional).
|
||||||
/// Inherits from the global `Applications` setting if omitted.
|
/// Inherits from the global `Applications` setting if omitted.
|
||||||
@@ -67,12 +69,13 @@ pub struct AppConfig {
|
|||||||
/// Command to execute (e.g. path to the application or shell command).
|
/// Command to execute (e.g. path to the application or shell command).
|
||||||
pub command: String,
|
pub command: String,
|
||||||
/// Display format for this application button (optional). Overrides global format if set.
|
/// Display format for this application button (optional). Overrides global format if set.
|
||||||
pub display: Option<DisplayFormat>,
|
pub display: Option<ApplicationsDisplayFormat>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Default)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Default)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
pub enum DisplayFormat {
|
/// Applications widget display format
|
||||||
|
pub enum ApplicationsDisplayFormat {
|
||||||
/// Show only the application icon.
|
/// Show only the application icon.
|
||||||
#[default]
|
#[default]
|
||||||
Icon,
|
Icon,
|
||||||
@@ -168,7 +171,7 @@ pub struct App {
|
|||||||
/// Command to execute when the application is launched.
|
/// Command to execute when the application is launched.
|
||||||
pub command: UserCommand,
|
pub command: UserCommand,
|
||||||
/// Display format (icon, text, or both).
|
/// Display format (icon, text, or both).
|
||||||
pub display: DisplayFormat,
|
pub display: ApplicationsDisplayFormat,
|
||||||
/// Whether to show the launch command on hover.
|
/// Whether to show the launch command on hover.
|
||||||
pub show_command_on_hover: bool,
|
pub show_command_on_hover: bool,
|
||||||
}
|
}
|
||||||
@@ -183,9 +186,9 @@ impl App {
|
|||||||
ui.spacing_mut().item_spacing = Vec2::splat(4.0);
|
ui.spacing_mut().item_spacing = Vec2::splat(4.0);
|
||||||
|
|
||||||
match self.display {
|
match self.display {
|
||||||
DisplayFormat::Icon => self.draw_icon(ctx, ui, icon_config),
|
ApplicationsDisplayFormat::Icon => self.draw_icon(ctx, ui, icon_config),
|
||||||
DisplayFormat::Text => self.draw_name(ui),
|
ApplicationsDisplayFormat::Text => self.draw_name(ui),
|
||||||
DisplayFormat::IconAndText => {
|
ApplicationsDisplayFormat::IconAndText => {
|
||||||
self.draw_icon(ctx, ui, icon_config);
|
self.draw_icon(ctx, ui, icon_config);
|
||||||
self.draw_name(ui);
|
self.draw_name(ui);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,12 +19,14 @@ use std::time::Instant;
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Battery widget configuration
|
||||||
pub struct BatteryConfig {
|
pub struct BatteryConfig {
|
||||||
/// Enable the Battery widget
|
/// Enable the Battery widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
/// Hide the widget if the battery is at full charge
|
/// Hide the widget if the battery is at full charge
|
||||||
pub hide_on_full_charge: Option<bool>,
|
pub hide_on_full_charge: Option<bool>,
|
||||||
/// Data refresh interval (default: 10 seconds)
|
/// Data refresh interval in seconds
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 10)))]
|
||||||
pub data_refresh_interval: Option<u64>,
|
pub data_refresh_interval: Option<u64>,
|
||||||
/// Display label prefix
|
/// Display label prefix
|
||||||
pub label_prefix: Option<LabelPrefix>,
|
pub label_prefix: Option<LabelPrefix>,
|
||||||
|
|||||||
@@ -18,10 +18,12 @@ use sysinfo::System;
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// CPU widget configuration
|
||||||
pub struct CpuConfig {
|
pub struct CpuConfig {
|
||||||
/// Enable the Cpu widget
|
/// Enable the Cpu widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
/// Data refresh interval (default: 10 seconds)
|
/// Data refresh interval in seconds
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 10)))]
|
||||||
pub data_refresh_interval: Option<u64>,
|
pub data_refresh_interval: Option<u64>,
|
||||||
/// Display label prefix
|
/// Display label prefix
|
||||||
pub label_prefix: Option<LabelPrefix>,
|
pub label_prefix: Option<LabelPrefix>,
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ impl CustomModifiers {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Date widget configuration
|
||||||
pub struct DateConfig {
|
pub struct DateConfig {
|
||||||
/// Enable the Date widget
|
/// Enable the Date widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
@@ -104,6 +105,7 @@ impl From<DateConfig> for Date {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Date widget format
|
||||||
pub enum DateFormat {
|
pub enum DateFormat {
|
||||||
/// Month/Date/Year format (09/08/24)
|
/// Month/Date/Year format (09/08/24)
|
||||||
MonthDateYear,
|
MonthDateYear,
|
||||||
@@ -114,8 +116,10 @@ pub enum DateFormat {
|
|||||||
/// Day Date Month Year format (8 September 2024)
|
/// Day Date Month Year format (8 September 2024)
|
||||||
DayDateMonthYear,
|
DayDateMonthYear,
|
||||||
/// Custom format (https://docs.rs/chrono/latest/chrono/format/strftime/index.html)
|
/// Custom format (https://docs.rs/chrono/latest/chrono/format/strftime/index.html)
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Custom"))]
|
||||||
Custom(String),
|
Custom(String),
|
||||||
/// Custom format with modifiers
|
/// Custom format with modifiers
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "CustomModifiers"))]
|
||||||
CustomModifiers(CustomModifiers),
|
CustomModifiers(CustomModifiers),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,15 +21,16 @@ use windows::Win32::UI::Input::KeyboardAndMouse::GetKeyboardLayout;
|
|||||||
use windows::Win32::UI::WindowsAndMessaging::GetForegroundWindow;
|
use windows::Win32::UI::WindowsAndMessaging::GetForegroundWindow;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::GetWindowThreadProcessId;
|
use windows::Win32::UI::WindowsAndMessaging::GetWindowThreadProcessId;
|
||||||
|
|
||||||
const DEFAULT_DATA_REFRESH_INTERVAL: u64 = 1;
|
|
||||||
const ERROR_TEXT: &str = "Error";
|
const ERROR_TEXT: &str = "Error";
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Keyboard widget configuration
|
||||||
pub struct KeyboardConfig {
|
pub struct KeyboardConfig {
|
||||||
/// Enable the Input widget
|
/// Enable the Input widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
/// Data refresh interval (default: 1 second)
|
/// Data refresh interval
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 10)))]
|
||||||
pub data_refresh_interval: Option<u64>,
|
pub data_refresh_interval: Option<u64>,
|
||||||
/// Display label prefix
|
/// Display label prefix
|
||||||
pub label_prefix: Option<LabelPrefix>,
|
pub label_prefix: Option<LabelPrefix>,
|
||||||
@@ -37,9 +38,7 @@ pub struct KeyboardConfig {
|
|||||||
|
|
||||||
impl From<KeyboardConfig> for Keyboard {
|
impl From<KeyboardConfig> for Keyboard {
|
||||||
fn from(value: KeyboardConfig) -> Self {
|
fn from(value: KeyboardConfig) -> Self {
|
||||||
let data_refresh_interval = value
|
let data_refresh_interval = value.data_refresh_interval.unwrap_or(10);
|
||||||
.data_refresh_interval
|
|
||||||
.unwrap_or(DEFAULT_DATA_REFRESH_INTERVAL);
|
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
enable: value.enable,
|
enable: value.enable,
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ use std::sync::atomic::Ordering;
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Komorebi widget configuration
|
||||||
pub struct KomorebiConfig {
|
pub struct KomorebiConfig {
|
||||||
/// Configure the Workspaces widget
|
/// Configure the Workspaces widget
|
||||||
pub workspaces: Option<KomorebiWorkspacesConfig>,
|
pub workspaces: Option<KomorebiWorkspacesConfig>,
|
||||||
@@ -67,6 +68,7 @@ pub struct KomorebiConfig {
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Komorebi widget workspaces configuration
|
||||||
pub struct KomorebiWorkspacesConfig {
|
pub struct KomorebiWorkspacesConfig {
|
||||||
/// Enable the Komorebi Workspaces widget
|
/// Enable the Komorebi Workspaces widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
@@ -78,6 +80,7 @@ pub struct KomorebiWorkspacesConfig {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Komorebi widget layout configuration
|
||||||
pub struct KomorebiLayoutConfig {
|
pub struct KomorebiLayoutConfig {
|
||||||
/// Enable the Komorebi Layout widget
|
/// Enable the Komorebi Layout widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
@@ -89,6 +92,7 @@ pub struct KomorebiLayoutConfig {
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Komorebi widget workspace layer configuration
|
||||||
pub struct KomorebiWorkspaceLayerConfig {
|
pub struct KomorebiWorkspaceLayerConfig {
|
||||||
/// Enable the Komorebi Workspace Layer widget
|
/// Enable the Komorebi Workspace Layer widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
@@ -100,10 +104,12 @@ pub struct KomorebiWorkspaceLayerConfig {
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Komorebi widget focused container configuration
|
||||||
pub struct KomorebiFocusedContainerConfig {
|
pub struct KomorebiFocusedContainerConfig {
|
||||||
/// Enable the Komorebi Focused Container widget
|
/// Enable the Komorebi Focused Container widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
/// DEPRECATED: use 'display' instead (Show the icon of the currently focused container)
|
/// DEPRECATED: use `display` instead (Show the icon of the currently focused container)
|
||||||
|
#[deprecated(note = "Use `display` instead")]
|
||||||
pub show_icon: Option<bool>,
|
pub show_icon: Option<bool>,
|
||||||
/// Display format of the currently focused container
|
/// Display format of the currently focused container
|
||||||
pub display: Option<DisplayFormat>,
|
pub display: Option<DisplayFormat>,
|
||||||
@@ -111,6 +117,7 @@ pub struct KomorebiFocusedContainerConfig {
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Komorebi widget locked container configuration
|
||||||
pub struct KomorebiLockedContainerConfig {
|
pub struct KomorebiLockedContainerConfig {
|
||||||
/// Enable the Komorebi Locked Container widget
|
/// Enable the Komorebi Locked Container widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
@@ -122,6 +129,7 @@ pub struct KomorebiLockedContainerConfig {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Komorebi widget configuration switcher configuration
|
||||||
pub struct KomorebiConfigurationSwitcherConfig {
|
pub struct KomorebiConfigurationSwitcherConfig {
|
||||||
/// Enable the Komorebi Configurations widget
|
/// Enable the Komorebi Configurations widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
@@ -506,7 +514,9 @@ impl FocusedContainerBar {
|
|||||||
if !value.enable {
|
if !value.enable {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle legacy setting - convert show_icon to display format
|
// Handle legacy setting - convert show_icon to display format
|
||||||
|
#[allow(deprecated)]
|
||||||
let format = value
|
let format = value
|
||||||
.display
|
.display
|
||||||
.unwrap_or(if value.show_icon.unwrap_or(false) {
|
.unwrap_or(if value.show_icon.unwrap_or(false) {
|
||||||
|
|||||||
@@ -26,11 +26,18 @@ use std::fmt::Formatter;
|
|||||||
#[derive(Copy, Clone, Debug, Serialize, PartialEq)]
|
#[derive(Copy, Clone, Debug, Serialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
|
/// Komorebi layout kind
|
||||||
pub enum KomorebiLayout {
|
pub enum KomorebiLayout {
|
||||||
|
/// Predefined layout
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Default"))]
|
||||||
Default(komorebi_client::DefaultLayout),
|
Default(komorebi_client::DefaultLayout),
|
||||||
|
/// Monocle mode
|
||||||
Monocle,
|
Monocle,
|
||||||
|
/// Floating layer
|
||||||
Floating,
|
Floating,
|
||||||
|
/// Paused
|
||||||
Paused,
|
Paused,
|
||||||
|
/// Custom layout
|
||||||
Custom,
|
Custom,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ use windows::Media::Control::GlobalSystemMediaTransportControlsSessionManager;
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Media widget configuration
|
||||||
pub struct MediaConfig {
|
pub struct MediaConfig {
|
||||||
/// Enable the Media widget
|
/// Enable the Media widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
|
|||||||
@@ -18,10 +18,12 @@ use sysinfo::System;
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Memory widget configuration
|
||||||
pub struct MemoryConfig {
|
pub struct MemoryConfig {
|
||||||
/// Enable the Memory widget
|
/// Enable the Memory widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
/// Data refresh interval (default: 10 seconds)
|
/// Data refresh interval in seconds
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 10)))]
|
||||||
pub data_refresh_interval: Option<u64>,
|
pub data_refresh_interval: Option<u64>,
|
||||||
/// Display label prefix
|
/// Display label prefix
|
||||||
pub label_prefix: Option<LabelPrefix>,
|
pub label_prefix: Option<LabelPrefix>,
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ use sysinfo::Networks;
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Network widget configuration
|
||||||
pub struct NetworkConfig {
|
pub struct NetworkConfig {
|
||||||
/// Enable the Network widget
|
/// Enable the Network widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
@@ -40,7 +41,8 @@ pub struct NetworkConfig {
|
|||||||
/// Characters to reserve for received and transmitted activity
|
/// Characters to reserve for received and transmitted activity
|
||||||
#[serde(alias = "network_activity_fill_characters")]
|
#[serde(alias = "network_activity_fill_characters")]
|
||||||
pub activity_left_padding: Option<usize>,
|
pub activity_left_padding: Option<usize>,
|
||||||
/// Data refresh interval (default: 10 seconds)
|
/// Data refresh interval in seconds
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 10)))]
|
||||||
pub data_refresh_interval: Option<u64>,
|
pub data_refresh_interval: Option<u64>,
|
||||||
/// Display label prefix
|
/// Display label prefix
|
||||||
pub label_prefix: Option<LabelPrefix>,
|
pub label_prefix: Option<LabelPrefix>,
|
||||||
@@ -50,6 +52,7 @@ pub struct NetworkConfig {
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Network select configuration
|
||||||
pub struct NetworkSelectConfig {
|
pub struct NetworkSelectConfig {
|
||||||
/// Select the total received data when it's over this value
|
/// Select the total received data when it's over this value
|
||||||
pub total_received_over: Option<u64>,
|
pub total_received_over: Option<u64>,
|
||||||
@@ -64,7 +67,9 @@ pub struct NetworkSelectConfig {
|
|||||||
impl From<NetworkConfig> for Network {
|
impl From<NetworkConfig> for Network {
|
||||||
fn from(value: NetworkConfig) -> Self {
|
fn from(value: NetworkConfig) -> Self {
|
||||||
let default_refresh_interval = 10;
|
let default_refresh_interval = 10;
|
||||||
let data_refresh_interval = value.data_refresh_interval.unwrap_or(10);
|
let data_refresh_interval = value
|
||||||
|
.data_refresh_interval
|
||||||
|
.unwrap_or(default_refresh_interval);
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
enable: value.enable,
|
enable: value.enable,
|
||||||
|
|||||||
@@ -18,16 +18,20 @@ use sysinfo::Disks;
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Storage widget configuration
|
||||||
pub struct StorageConfig {
|
pub struct StorageConfig {
|
||||||
/// Enable the Storage widget
|
/// Enable the Storage widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
/// Data refresh interval (default: 10 seconds)
|
/// Data refresh interval in seconds
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 10)))]
|
||||||
pub data_refresh_interval: Option<u64>,
|
pub data_refresh_interval: Option<u64>,
|
||||||
/// Display label prefix
|
/// Display label prefix
|
||||||
pub label_prefix: Option<LabelPrefix>,
|
pub label_prefix: Option<LabelPrefix>,
|
||||||
/// Show disks that are read only. (default: false)
|
/// Show disks that are read only
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = false)))]
|
||||||
pub show_read_only_disks: Option<bool>,
|
pub show_read_only_disks: Option<bool>,
|
||||||
/// Show removable disks. (default: true)
|
/// Show removable disks
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = true)))]
|
||||||
pub show_removable_disks: Option<bool>,
|
pub show_removable_disks: Option<bool>,
|
||||||
/// Select when the current percentage is over this value [[1-100]]
|
/// Select when the current percentage is over this value [[1-100]]
|
||||||
pub auto_select_over: Option<u8>,
|
pub auto_select_over: Option<u8>,
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ lazy_static! {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Time widget configuration
|
||||||
pub struct TimeConfig {
|
pub struct TimeConfig {
|
||||||
/// Enable the Time widget
|
/// Enable the Time widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
@@ -92,7 +93,7 @@ pub struct TimeConfig {
|
|||||||
///}
|
///}
|
||||||
/// ```
|
/// ```
|
||||||
pub timezone: Option<String>,
|
pub timezone: Option<String>,
|
||||||
/// Change the icon depending on the time. The default icon is used between 8:30 and 12:00. (default: false)
|
/// Change the icon depending on the time. The default icon is used between 8:30 and 12:00
|
||||||
pub changing_icon: Option<bool>,
|
pub changing_icon: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,6 +120,7 @@ impl From<TimeConfig> for Time {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Time format
|
||||||
pub enum TimeFormat {
|
pub enum TimeFormat {
|
||||||
/// Twelve-hour format (with seconds)
|
/// Twelve-hour format (with seconds)
|
||||||
TwelveHour,
|
TwelveHour,
|
||||||
@@ -133,6 +135,7 @@ pub enum TimeFormat {
|
|||||||
/// Twenty-four-hour format displayed as a binary clock with rectangles (with seconds) (https://en.wikipedia.org/wiki/Binary_clock)
|
/// Twenty-four-hour format displayed as a binary clock with rectangles (with seconds) (https://en.wikipedia.org/wiki/Binary_clock)
|
||||||
BinaryRectangle,
|
BinaryRectangle,
|
||||||
/// Custom format (https://docs.rs/chrono/latest/chrono/format/strftime/index.html)
|
/// Custom format (https://docs.rs/chrono/latest/chrono/format/strftime/index.html)
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Custom"))]
|
||||||
Custom(String),
|
Custom(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,10 +16,12 @@ use std::time::Instant;
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Update widget configuration
|
||||||
pub struct UpdateConfig {
|
pub struct UpdateConfig {
|
||||||
/// Enable the Update widget
|
/// Enable the Update widget
|
||||||
pub enable: bool,
|
pub enable: bool,
|
||||||
/// Data refresh interval (default: 12 hours)
|
/// Data refresh interval in hours
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 12)))]
|
||||||
pub data_refresh_interval: Option<u64>,
|
pub data_refresh_interval: Option<u64>,
|
||||||
/// Display label prefix
|
/// Display label prefix
|
||||||
pub label_prefix: Option<LabelPrefix>,
|
pub label_prefix: Option<LabelPrefix>,
|
||||||
|
|||||||
@@ -34,18 +34,43 @@ pub trait BarWidget {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Widget configuration
|
||||||
pub enum WidgetConfig {
|
pub enum WidgetConfig {
|
||||||
|
/// Applications widget configuration
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Applications"))]
|
||||||
Applications(ApplicationsConfig),
|
Applications(ApplicationsConfig),
|
||||||
|
/// Battery widget configuration
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Battery"))]
|
||||||
Battery(BatteryConfig),
|
Battery(BatteryConfig),
|
||||||
|
/// CPU widget configuration
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Cpu"))]
|
||||||
Cpu(CpuConfig),
|
Cpu(CpuConfig),
|
||||||
|
/// Date widget configuration
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Date"))]
|
||||||
Date(DateConfig),
|
Date(DateConfig),
|
||||||
|
/// Keyboard widget configuration
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Keyboard"))]
|
||||||
Keyboard(KeyboardConfig),
|
Keyboard(KeyboardConfig),
|
||||||
|
/// Komorebi widget configuration
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Komorebi"))]
|
||||||
Komorebi(KomorebiConfig),
|
Komorebi(KomorebiConfig),
|
||||||
|
/// Media widget configuration
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Media"))]
|
||||||
Media(MediaConfig),
|
Media(MediaConfig),
|
||||||
|
/// Memory widget configuration
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Memory"))]
|
||||||
Memory(MemoryConfig),
|
Memory(MemoryConfig),
|
||||||
|
/// Network widget configuration
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Network"))]
|
||||||
Network(NetworkConfig),
|
Network(NetworkConfig),
|
||||||
|
/// Storage widget configuration
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Storage"))]
|
||||||
Storage(StorageConfig),
|
Storage(StorageConfig),
|
||||||
|
/// Time widget configuration
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Time"))]
|
||||||
Time(TimeConfig),
|
Time(TimeConfig),
|
||||||
|
/// Update widget configuration
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Update"))]
|
||||||
Update(UpdateConfig),
|
Update(UpdateConfig),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "komorebi-client"
|
name = "komorebi-client"
|
||||||
version = "0.1.39"
|
version = "0.1.40"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "komorebi-gui"
|
name = "komorebi-gui"
|
||||||
version = "0.1.39"
|
version = "0.1.40"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "komorebi-themes"
|
name = "komorebi-themes"
|
||||||
version = "0.1.39"
|
version = "0.1.40"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
base16-egui-themes = { git = "https://github.com/LGUG2Z/base16-egui-themes", rev = "5472b1ab825c48af1a1726e324cfa13b7c385135" }
|
base16-egui-themes = { git = "https://github.com/LGUG2Z/base16-egui-themes", rev = "b9e26b31f7a0e7ed239b14e5317e95d1bdc544bd" }
|
||||||
#catppuccin-egui = { version = "5", default-features = false, features = ["egui32"] }
|
#catppuccin-egui = { version = "5", default-features = false, features = ["egui32"] }
|
||||||
catppuccin-egui = { git = "https://github.com/LGUG2Z/catppuccin-egui", rev = "b2f95cbf441d1dd99f3c955ef10dcb84ce23c20a", default-features = false, features = ["egui33"] }
|
catppuccin-egui = { git = "https://github.com/LGUG2Z/catppuccin-egui", rev = "b2f95cbf441d1dd99f3c955ef10dcb84ce23c20a", default-features = false, features = [
|
||||||
|
"egui33",
|
||||||
|
] }
|
||||||
eframe = { workspace = true }
|
eframe = { workspace = true }
|
||||||
schemars = { workspace = true, optional = true }
|
schemars = { workspace = true, optional = true }
|
||||||
serde = { workspace = true }
|
serde = { workspace = true }
|
||||||
|
|||||||
@@ -1,12 +1,8 @@
|
|||||||
use hex_color::HexColor;
|
use hex_color::HexColor;
|
||||||
#[cfg(feature = "schemars")]
|
#[cfg(feature = "schemars")]
|
||||||
|
use schemars::Schema;
|
||||||
|
#[cfg(feature = "schemars")]
|
||||||
use schemars::SchemaGenerator;
|
use schemars::SchemaGenerator;
|
||||||
#[cfg(feature = "schemars")]
|
|
||||||
use schemars::schema::InstanceType;
|
|
||||||
#[cfg(feature = "schemars")]
|
|
||||||
use schemars::schema::Schema;
|
|
||||||
#[cfg(feature = "schemars")]
|
|
||||||
use schemars::schema::SchemaObject;
|
|
||||||
|
|
||||||
use crate::Color32;
|
use crate::Color32;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
@@ -15,6 +11,7 @@ use serde::Serialize;
|
|||||||
#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)]
|
#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
|
/// Colour representation
|
||||||
pub enum Colour {
|
pub enum Colour {
|
||||||
/// Colour represented as RGB
|
/// Colour represented as RGB
|
||||||
Rgb(Rgb),
|
Rgb(Rgb),
|
||||||
@@ -56,22 +53,22 @@ impl From<Colour> for Color32 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Colour represented as a Hex string
|
||||||
#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)]
|
#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)]
|
||||||
pub struct Hex(pub HexColor);
|
pub struct Hex(pub HexColor);
|
||||||
|
|
||||||
#[cfg(feature = "schemars")]
|
#[cfg(feature = "schemars")]
|
||||||
impl schemars::JsonSchema for Hex {
|
impl schemars::JsonSchema for Hex {
|
||||||
fn schema_name() -> String {
|
fn schema_name() -> std::borrow::Cow<'static, str> {
|
||||||
String::from("Hex")
|
std::borrow::Cow::Borrowed("Hex")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn json_schema(_: &mut SchemaGenerator) -> Schema {
|
fn json_schema(_: &mut SchemaGenerator) -> Schema {
|
||||||
SchemaObject {
|
schemars::json_schema!({
|
||||||
instance_type: Some(InstanceType::String.into()),
|
"type": "string",
|
||||||
format: Some("color-hex".to_string()),
|
"format": "color-hex",
|
||||||
..Default::default()
|
"description": "Colour represented as a Hex string"
|
||||||
}
|
})
|
||||||
.into()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,6 +83,7 @@ impl From<Colour> for u32 {
|
|||||||
|
|
||||||
#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)]
|
#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Colour represented as RGB
|
||||||
pub struct Rgb {
|
pub struct Rgb {
|
||||||
/// Red
|
/// Red
|
||||||
pub r: u32,
|
pub r: u32,
|
||||||
|
|||||||
@@ -12,9 +12,12 @@ use serde::Serialize;
|
|||||||
|
|
||||||
#[derive(Debug, Default, Copy, Clone, Serialize, Deserialize, PartialEq)]
|
#[derive(Debug, Default, Copy, Clone, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Theme variant
|
||||||
pub enum ThemeVariant {
|
pub enum ThemeVariant {
|
||||||
#[default]
|
#[default]
|
||||||
|
/// Dark variant
|
||||||
Dark,
|
Dark,
|
||||||
|
/// Light variant
|
||||||
Light,
|
Light,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+345
-3
@@ -28,18 +28,19 @@ use serde_variant::to_variant_name;
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)]
|
||||||
#[serde(tag = "type")]
|
#[serde(tag = "type")]
|
||||||
|
/// Theme
|
||||||
pub enum Theme {
|
pub enum Theme {
|
||||||
/// A theme from catppuccin-egui
|
/// Theme from catppuccin-egui
|
||||||
Catppuccin {
|
Catppuccin {
|
||||||
name: Catppuccin,
|
name: Catppuccin,
|
||||||
accent: Option<CatppuccinValue>,
|
accent: Option<CatppuccinValue>,
|
||||||
},
|
},
|
||||||
/// A theme from base16-egui-themes
|
/// Theme from base16-egui-themes
|
||||||
Base16 {
|
Base16 {
|
||||||
name: Base16,
|
name: Base16,
|
||||||
accent: Option<Base16Value>,
|
accent: Option<Base16Value>,
|
||||||
},
|
},
|
||||||
/// A custom base16 palette
|
/// Custom base16 palette
|
||||||
Custom {
|
Custom {
|
||||||
palette: Box<Base16ColourPalette>,
|
palette: Box<Base16ColourPalette>,
|
||||||
accent: Option<Base16Value>,
|
accent: Option<Base16Value>,
|
||||||
@@ -47,22 +48,39 @@ pub enum Theme {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq)]
|
||||||
|
/// Base16 colour palette: https://github.com/chriskempson/base16
|
||||||
pub struct Base16ColourPalette {
|
pub struct Base16ColourPalette {
|
||||||
|
/// Base00
|
||||||
pub base_00: Colour,
|
pub base_00: Colour,
|
||||||
|
/// Base01
|
||||||
pub base_01: Colour,
|
pub base_01: Colour,
|
||||||
|
/// Base02
|
||||||
pub base_02: Colour,
|
pub base_02: Colour,
|
||||||
|
/// Base03
|
||||||
pub base_03: Colour,
|
pub base_03: Colour,
|
||||||
|
/// Base04
|
||||||
pub base_04: Colour,
|
pub base_04: Colour,
|
||||||
|
/// Base05
|
||||||
pub base_05: Colour,
|
pub base_05: Colour,
|
||||||
|
/// Base06
|
||||||
pub base_06: Colour,
|
pub base_06: Colour,
|
||||||
|
/// Base07
|
||||||
pub base_07: Colour,
|
pub base_07: Colour,
|
||||||
|
/// Base08
|
||||||
pub base_08: Colour,
|
pub base_08: Colour,
|
||||||
|
/// Base09
|
||||||
pub base_09: Colour,
|
pub base_09: Colour,
|
||||||
|
/// Base0A
|
||||||
pub base_0a: Colour,
|
pub base_0a: Colour,
|
||||||
|
/// Base0B
|
||||||
pub base_0b: Colour,
|
pub base_0b: Colour,
|
||||||
|
/// Base0C
|
||||||
pub base_0c: Colour,
|
pub base_0c: Colour,
|
||||||
|
/// Base0D
|
||||||
pub base_0d: Colour,
|
pub base_0d: Colour,
|
||||||
|
/// Base0E
|
||||||
pub base_0e: Colour,
|
pub base_0e: Colour,
|
||||||
|
/// Base0F
|
||||||
pub base_0f: Colour,
|
pub base_0f: Colour,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,28 +217,48 @@ impl Theme {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, Display, PartialEq)]
|
#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, Display, PartialEq)]
|
||||||
|
/// Base16 value
|
||||||
pub enum Base16Value {
|
pub enum Base16Value {
|
||||||
|
/// Base00
|
||||||
Base00,
|
Base00,
|
||||||
|
/// Base01
|
||||||
Base01,
|
Base01,
|
||||||
|
/// Base02
|
||||||
Base02,
|
Base02,
|
||||||
|
/// Base03
|
||||||
Base03,
|
Base03,
|
||||||
|
/// Base04
|
||||||
Base04,
|
Base04,
|
||||||
|
/// Base05
|
||||||
Base05,
|
Base05,
|
||||||
|
/// Base06
|
||||||
#[default]
|
#[default]
|
||||||
Base06,
|
Base06,
|
||||||
|
/// Base07
|
||||||
Base07,
|
Base07,
|
||||||
|
/// Base08
|
||||||
Base08,
|
Base08,
|
||||||
|
/// Base09
|
||||||
Base09,
|
Base09,
|
||||||
|
/// Base0A
|
||||||
Base0A,
|
Base0A,
|
||||||
|
/// Base0B
|
||||||
Base0B,
|
Base0B,
|
||||||
|
/// Base0C
|
||||||
Base0C,
|
Base0C,
|
||||||
|
/// Base0D
|
||||||
Base0D,
|
Base0D,
|
||||||
|
/// Base0E
|
||||||
Base0E,
|
Base0E,
|
||||||
|
/// Base0F
|
||||||
Base0F,
|
Base0F,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Wrapper around a Base16 colour palette
|
||||||
pub enum Base16Wrapper {
|
pub enum Base16Wrapper {
|
||||||
|
/// Predefined Base16 colour palette
|
||||||
Base16(Base16),
|
Base16(Base16),
|
||||||
|
/// Custom Base16 colour palette
|
||||||
Custom(Box<Base16ColourPalette>),
|
Custom(Box<Base16ColourPalette>),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -268,10 +306,15 @@ impl Base16Value {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, Display, PartialEq)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, JsonSchema, Display, PartialEq)]
|
||||||
|
/// Catppuccin palette
|
||||||
pub enum Catppuccin {
|
pub enum Catppuccin {
|
||||||
|
/// Frappe (https://catppuccin.com/palette#flavor-frappe)
|
||||||
Frappe,
|
Frappe,
|
||||||
|
/// Latte (https://catppuccin.com/palette#flavor-latte)
|
||||||
Latte,
|
Latte,
|
||||||
|
/// Macchiato (https://catppuccin.com/palette#flavor-macchiato)
|
||||||
Macchiato,
|
Macchiato,
|
||||||
|
/// Mocha (https://catppuccin.com/palette#flavor-mocha)
|
||||||
Mocha,
|
Mocha,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,33 +336,60 @@ impl From<Catppuccin> for catppuccin_egui::Theme {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, Display, PartialEq)]
|
#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema, Display, PartialEq)]
|
||||||
|
/// Catppuccin Value
|
||||||
pub enum CatppuccinValue {
|
pub enum CatppuccinValue {
|
||||||
|
/// Rosewater
|
||||||
Rosewater,
|
Rosewater,
|
||||||
|
/// Flamingo
|
||||||
Flamingo,
|
Flamingo,
|
||||||
|
/// Pink
|
||||||
Pink,
|
Pink,
|
||||||
|
/// Mauve
|
||||||
Mauve,
|
Mauve,
|
||||||
|
/// Red
|
||||||
Red,
|
Red,
|
||||||
|
/// Maroon
|
||||||
Maroon,
|
Maroon,
|
||||||
|
/// Peach
|
||||||
Peach,
|
Peach,
|
||||||
|
/// Yellow
|
||||||
Yellow,
|
Yellow,
|
||||||
|
/// Green
|
||||||
Green,
|
Green,
|
||||||
|
/// Teal
|
||||||
Teal,
|
Teal,
|
||||||
|
/// Sky
|
||||||
Sky,
|
Sky,
|
||||||
|
/// Sapphire
|
||||||
Sapphire,
|
Sapphire,
|
||||||
|
/// Blue
|
||||||
Blue,
|
Blue,
|
||||||
|
/// Lavender
|
||||||
Lavender,
|
Lavender,
|
||||||
#[default]
|
#[default]
|
||||||
|
/// Text
|
||||||
Text,
|
Text,
|
||||||
|
/// Subtext1
|
||||||
Subtext1,
|
Subtext1,
|
||||||
|
/// Subtext0
|
||||||
Subtext0,
|
Subtext0,
|
||||||
|
/// Overlay2
|
||||||
Overlay2,
|
Overlay2,
|
||||||
|
/// Overlay1
|
||||||
Overlay1,
|
Overlay1,
|
||||||
|
/// Overlay0
|
||||||
Overlay0,
|
Overlay0,
|
||||||
|
/// Surface2
|
||||||
Surface2,
|
Surface2,
|
||||||
|
/// Surface1
|
||||||
Surface1,
|
Surface1,
|
||||||
|
/// Surface0
|
||||||
Surface0,
|
Surface0,
|
||||||
|
/// Base
|
||||||
Base,
|
Base,
|
||||||
|
/// Mantle
|
||||||
Mantle,
|
Mantle,
|
||||||
|
/// Crust
|
||||||
Crust,
|
Crust,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -359,3 +429,275 @@ impl CatppuccinValue {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
|
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
|
||||||
|
/// Theme from catppuccin-egui
|
||||||
|
pub struct KomorebiThemeCatppuccin {
|
||||||
|
/// Name of the Catppuccin theme (previews: https://github.com/catppuccin/catppuccin)
|
||||||
|
pub name: Catppuccin,
|
||||||
|
/// Single window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CatppuccinValue::Blue)))]
|
||||||
|
pub single_border: Option<CatppuccinValue>,
|
||||||
|
/// Stack window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CatppuccinValue::Green)))]
|
||||||
|
pub stack_border: Option<CatppuccinValue>,
|
||||||
|
/// Monocle window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CatppuccinValue::Pink)))]
|
||||||
|
pub monocle_border: Option<CatppuccinValue>,
|
||||||
|
/// Floating window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CatppuccinValue::Yellow)))]
|
||||||
|
pub floating_border: Option<CatppuccinValue>,
|
||||||
|
/// Unfocused window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CatppuccinValue::Base)))]
|
||||||
|
pub unfocused_border: Option<CatppuccinValue>,
|
||||||
|
/// Unfocused locked window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CatppuccinValue::Red)))]
|
||||||
|
pub unfocused_locked_border: Option<CatppuccinValue>,
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
/// Stackbar focused text colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CatppuccinValue::Green)))]
|
||||||
|
pub stackbar_focused_text: Option<CatppuccinValue>,
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
/// Stackbar unfocused text colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CatppuccinValue::Text)))]
|
||||||
|
pub stackbar_unfocused_text: Option<CatppuccinValue>,
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
/// Stackbar background colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CatppuccinValue::Base)))]
|
||||||
|
pub stackbar_background: Option<CatppuccinValue>,
|
||||||
|
/// Bar accent colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CatppuccinValue::Blue)))]
|
||||||
|
pub bar_accent: Option<CatppuccinValue>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
|
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
|
||||||
|
/// Theme from base16-egui-themes
|
||||||
|
pub struct KomorebiThemeBase16 {
|
||||||
|
/// Name of the Base16 theme (theme previews: https://tinted-theming.github.io/tinted-gallery/)
|
||||||
|
pub name: Base16,
|
||||||
|
/// Single window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base0D)))]
|
||||||
|
pub single_border: Option<Base16Value>,
|
||||||
|
/// Stack window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base0B)))]
|
||||||
|
pub stack_border: Option<Base16Value>,
|
||||||
|
/// Monocle window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base0F)))]
|
||||||
|
pub monocle_border: Option<Base16Value>,
|
||||||
|
/// Floating window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base09)))]
|
||||||
|
pub floating_border: Option<Base16Value>,
|
||||||
|
/// Unfocused window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base01)))]
|
||||||
|
pub unfocused_border: Option<Base16Value>,
|
||||||
|
/// Unfocused locked window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base08)))]
|
||||||
|
pub unfocused_locked_border: Option<Base16Value>,
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
/// Stackbar focused text colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base0B)))]
|
||||||
|
pub stackbar_focused_text: Option<Base16Value>,
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
/// Stackbar unfocused text colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base05)))]
|
||||||
|
pub stackbar_unfocused_text: Option<Base16Value>,
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
/// Stackbar background colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base01)))]
|
||||||
|
pub stackbar_background: Option<Base16Value>,
|
||||||
|
/// Bar accent colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base0D)))]
|
||||||
|
pub bar_accent: Option<Base16Value>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
|
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
|
||||||
|
/// Custom Base16 theme
|
||||||
|
pub struct KomorebiThemeCustom {
|
||||||
|
/// Colours of the custom Base16 theme palette
|
||||||
|
pub colours: Box<Base16ColourPalette>,
|
||||||
|
/// Single window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base0D)))]
|
||||||
|
pub single_border: Option<Base16Value>,
|
||||||
|
/// Stack window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base0B)))]
|
||||||
|
pub stack_border: Option<Base16Value>,
|
||||||
|
/// Monocle window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base0F)))]
|
||||||
|
pub monocle_border: Option<Base16Value>,
|
||||||
|
/// Floating window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base09)))]
|
||||||
|
pub floating_border: Option<Base16Value>,
|
||||||
|
/// Unfocused window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base01)))]
|
||||||
|
pub unfocused_border: Option<Base16Value>,
|
||||||
|
/// Unfocused locked window border colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base08)))]
|
||||||
|
pub unfocused_locked_border: Option<Base16Value>,
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
/// Stackbar focused text colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base0B)))]
|
||||||
|
pub stackbar_focused_text: Option<Base16Value>,
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
/// Stackbar unfocused text colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base05)))]
|
||||||
|
pub stackbar_unfocused_text: Option<Base16Value>,
|
||||||
|
#[cfg(target_os = "windows")]
|
||||||
|
/// Stackbar background colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base01)))]
|
||||||
|
pub stackbar_background: Option<Base16Value>,
|
||||||
|
/// Bar accent colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base0D)))]
|
||||||
|
pub bar_accent: Option<Base16Value>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
|
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
|
||||||
|
#[serde(tag = "palette")]
|
||||||
|
/// Komorebi theme
|
||||||
|
pub enum KomorebiTheme {
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Catppuccin"))]
|
||||||
|
/// Theme from catppuccin-egui
|
||||||
|
Catppuccin(KomorebiThemeCatppuccin),
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Base16"))]
|
||||||
|
/// Theme from base16-egui-themes
|
||||||
|
Base16(KomorebiThemeBase16),
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Custom"))]
|
||||||
|
/// Custom Base16 theme
|
||||||
|
Custom(KomorebiThemeCustom),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
|
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
|
||||||
|
/// Theme from catppuccin-egui
|
||||||
|
pub struct KomobarThemeCatppuccin {
|
||||||
|
/// Name of the Catppuccin theme (previews: https://github.com/catppuccin/catppuccin)
|
||||||
|
pub name: Catppuccin,
|
||||||
|
/// Accent colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CatppuccinValue::Blue)))]
|
||||||
|
pub accent: Option<CatppuccinValue>,
|
||||||
|
/// Auto select fill colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub auto_select_fill: Option<CatppuccinValue>,
|
||||||
|
/// Auto select text colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub auto_select_text: Option<CatppuccinValue>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
|
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
|
||||||
|
/// Theme from base16-egui-themes
|
||||||
|
pub struct KomobarThemeBase16 {
|
||||||
|
/// Name of the Base16 theme (previews: https://tinted-theming.github.io/tinted-gallery/)
|
||||||
|
pub name: Base16,
|
||||||
|
/// Accent colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Base16Value::Base0D)))]
|
||||||
|
pub accent: Option<Base16Value>,
|
||||||
|
/// Auto select fill colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub auto_select_fill: Option<Base16Value>,
|
||||||
|
/// Auto select text colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub auto_select_text: Option<Base16Value>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
|
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
|
||||||
|
/// Theme from base16-egui-themes
|
||||||
|
pub struct KomobarThemeCustom {
|
||||||
|
/// Colours of the custom Base16 theme palette
|
||||||
|
pub colours: Box<Base16ColourPalette>,
|
||||||
|
/// Accent colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CatppuccinValue::Blue)))]
|
||||||
|
pub accent: Option<Base16Value>,
|
||||||
|
/// Auto select fill colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub auto_select_fill: Option<Base16Value>,
|
||||||
|
/// Auto select text colour
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub auto_select_text: Option<Base16Value>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||||
|
#[cfg_attr(feature = "schemars", derive(JsonSchema))]
|
||||||
|
#[serde(tag = "palette")]
|
||||||
|
/// Komorebi bar theme
|
||||||
|
pub enum KomobarTheme {
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Catppuccin"))]
|
||||||
|
/// Theme from catppuccin-egui
|
||||||
|
Catppuccin(KomobarThemeCatppuccin),
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Base16"))]
|
||||||
|
/// Theme from base16-egui-themes
|
||||||
|
Base16(KomobarThemeBase16),
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Custom"))]
|
||||||
|
/// Custom Base16 theme
|
||||||
|
Custom(KomobarThemeCustom),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<KomorebiTheme> for KomobarTheme {
|
||||||
|
fn from(value: KomorebiTheme) -> Self {
|
||||||
|
match value {
|
||||||
|
KomorebiTheme::Catppuccin(KomorebiThemeCatppuccin {
|
||||||
|
name, bar_accent, ..
|
||||||
|
}) => Self::Catppuccin(KomobarThemeCatppuccin {
|
||||||
|
name,
|
||||||
|
accent: bar_accent,
|
||||||
|
auto_select_fill: None,
|
||||||
|
auto_select_text: None,
|
||||||
|
}),
|
||||||
|
KomorebiTheme::Base16(KomorebiThemeBase16 {
|
||||||
|
name, bar_accent, ..
|
||||||
|
}) => Self::Base16(KomobarThemeBase16 {
|
||||||
|
name,
|
||||||
|
accent: bar_accent,
|
||||||
|
auto_select_fill: None,
|
||||||
|
auto_select_text: None,
|
||||||
|
}),
|
||||||
|
KomorebiTheme::Custom(KomorebiThemeCustom {
|
||||||
|
colours,
|
||||||
|
bar_accent,
|
||||||
|
..
|
||||||
|
}) => Self::Custom(KomobarThemeCustom {
|
||||||
|
colours,
|
||||||
|
accent: bar_accent,
|
||||||
|
auto_select_fill: None,
|
||||||
|
auto_select_text: None,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "komorebi"
|
name = "komorebi"
|
||||||
version = "0.1.39"
|
version = "0.1.40"
|
||||||
description = "A tiling window manager for Windows"
|
description = "A tiling window manager for Windows"
|
||||||
repository = "https://github.com/LGUG2Z/komorebi"
|
repository = "https://github.com/LGUG2Z/komorebi"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
@@ -51,7 +51,7 @@ windows-implement = { workspace = true }
|
|||||||
windows-interface = { workspace = true }
|
windows-interface = { workspace = true }
|
||||||
winput = "0.2"
|
winput = "0.2"
|
||||||
winreg = "0.55"
|
winreg = "0.55"
|
||||||
serde_with = { version = "3.12", features = ["schemars_0_8"] }
|
serde_with = { version = "3.12", features = ["schemars_1"] }
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
shadow-rs = { workspace = true }
|
shadow-rs = { workspace = true }
|
||||||
|
|||||||
@@ -25,8 +25,33 @@ use serde::Serialize;
|
|||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
|
/// Animation configuration
|
||||||
|
///
|
||||||
|
/// This can be either global:
|
||||||
|
/// ```json
|
||||||
|
/// {
|
||||||
|
/// "enabled": true,
|
||||||
|
/// "style": "EaseInSine",
|
||||||
|
/// "fps": 60,
|
||||||
|
/// "duration": 250
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// Or scoped by an animation kind prefix:
|
||||||
|
/// ```json
|
||||||
|
/// {
|
||||||
|
/// "movement": {
|
||||||
|
/// "enabled": true,
|
||||||
|
/// "style": "EaseInSine",
|
||||||
|
/// "fps": 60,
|
||||||
|
/// "duration": 250
|
||||||
|
/// }
|
||||||
|
/// }
|
||||||
|
/// ```
|
||||||
pub enum PerAnimationPrefixConfig<T> {
|
pub enum PerAnimationPrefixConfig<T> {
|
||||||
|
/// Animation configuration prefixed for a specific animation kind
|
||||||
Prefix(HashMap<AnimationPrefix, T>),
|
Prefix(HashMap<AnimationPrefix, T>),
|
||||||
|
/// Animation configuration for all animation kinds
|
||||||
Global(T),
|
Global(T),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -420,6 +420,7 @@ pub fn apply_ease_func(t: f64, style: AnimationStyle) -> f64 {
|
|||||||
AnimationStyle::EaseOutQuad => EaseOutQuad::evaluate(t),
|
AnimationStyle::EaseOutQuad => EaseOutQuad::evaluate(t),
|
||||||
AnimationStyle::EaseInOutQuad => EaseInOutQuad::evaluate(t),
|
AnimationStyle::EaseInOutQuad => EaseInOutQuad::evaluate(t),
|
||||||
AnimationStyle::EaseInCubic => EaseInCubic::evaluate(t),
|
AnimationStyle::EaseInCubic => EaseInCubic::evaluate(t),
|
||||||
|
AnimationStyle::EaseOutCubic => EaseOutCubic::evaluate(t),
|
||||||
AnimationStyle::EaseInOutCubic => EaseInOutCubic::evaluate(t),
|
AnimationStyle::EaseInOutCubic => EaseInOutCubic::evaluate(t),
|
||||||
AnimationStyle::EaseInQuart => EaseInQuart::evaluate(t),
|
AnimationStyle::EaseInQuart => EaseInQuart::evaluate(t),
|
||||||
AnimationStyle::EaseOutQuart => EaseOutQuart::evaluate(t),
|
AnimationStyle::EaseOutQuart => EaseOutQuart::evaluate(t),
|
||||||
|
|||||||
@@ -313,6 +313,11 @@ impl Border {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn destroy(&self) -> color_eyre::Result<()> {
|
pub fn destroy(&self) -> color_eyre::Result<()> {
|
||||||
|
// clear user data **BEFORE** closing window
|
||||||
|
// pending messages will see a null pointer and exit early
|
||||||
|
unsafe {
|
||||||
|
SetWindowLongPtrW(self.hwnd(), GWLP_USERDATA, 0);
|
||||||
|
}
|
||||||
WindowsApi::close_window(self.hwnd)
|
WindowsApi::close_window(self.hwnd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -767,6 +767,13 @@ fn remove_border(
|
|||||||
fn destroy_border(border: Box<Border>) -> color_eyre::Result<()> {
|
fn destroy_border(border: Box<Border>) -> color_eyre::Result<()> {
|
||||||
let raw_pointer = Box::into_raw(border);
|
let raw_pointer = Box::into_raw(border);
|
||||||
unsafe {
|
unsafe {
|
||||||
|
// release d2d resources **BEFORE** destroying window
|
||||||
|
// this drops render_target and brushes while HWND is still valid
|
||||||
|
// prevents EndDraw() from accessing freed HWND resources
|
||||||
|
(*raw_pointer).render_target = None;
|
||||||
|
(*raw_pointer).brushes.clear();
|
||||||
|
|
||||||
|
// Now safe to destroy window
|
||||||
(*raw_pointer).destroy()?;
|
(*raw_pointer).destroy()?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -813,10 +820,26 @@ pub fn hide_border(tracking_hwnd: isize) {
|
|||||||
|
|
||||||
#[derive(Debug, Copy, Clone, Display, Serialize, Deserialize, PartialEq)]
|
#[derive(Debug, Copy, Clone, Display, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Z Order (https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowpos)
|
||||||
pub enum ZOrder {
|
pub enum ZOrder {
|
||||||
|
/// HWND_TOP
|
||||||
|
///
|
||||||
|
/// Places the window at the top of the Z order.
|
||||||
Top,
|
Top,
|
||||||
|
/// HWND_NOTOPMOST
|
||||||
|
///
|
||||||
|
/// Places the window above all non-topmost windows (that is, behind all topmost windows).
|
||||||
|
/// This flag has no effect if the window is already a non-topmost window.
|
||||||
NoTopMost,
|
NoTopMost,
|
||||||
|
/// HWND_BOTTOM
|
||||||
|
///
|
||||||
|
/// Places the window at the bottom of the Z order. If the hWnd parameter identifies a topmost window,
|
||||||
|
/// the window loses its topmost status and is placed at the bottom of all other windows.
|
||||||
Bottom,
|
Bottom,
|
||||||
|
/// HWND_TOPMOST
|
||||||
|
///
|
||||||
|
/// Places the window above all non-topmost windows.
|
||||||
|
/// The window maintains its topmost position even when it is deactivated.
|
||||||
TopMost,
|
TopMost,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,38 +8,73 @@ use strum::EnumString;
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Display, EnumString, ValueEnum, PartialEq)]
|
#[derive(Copy, Clone, Debug, Display, EnumString, ValueEnum, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Mathematical function which describes the rate at which a value changes
|
||||||
pub enum AnimationStyle {
|
pub enum AnimationStyle {
|
||||||
|
/// Linear
|
||||||
Linear,
|
Linear,
|
||||||
|
/// Ease in sine
|
||||||
EaseInSine,
|
EaseInSine,
|
||||||
|
/// Ease out sine
|
||||||
EaseOutSine,
|
EaseOutSine,
|
||||||
|
/// Ease in out sine
|
||||||
EaseInOutSine,
|
EaseInOutSine,
|
||||||
|
/// Ease in quad
|
||||||
EaseInQuad,
|
EaseInQuad,
|
||||||
|
/// Ease out quad
|
||||||
EaseOutQuad,
|
EaseOutQuad,
|
||||||
|
/// Ease in out quad
|
||||||
EaseInOutQuad,
|
EaseInOutQuad,
|
||||||
|
/// Ease in cubic
|
||||||
EaseInCubic,
|
EaseInCubic,
|
||||||
|
/// Ease out cubic
|
||||||
|
EaseOutCubic,
|
||||||
|
/// Ease in out cubic
|
||||||
EaseInOutCubic,
|
EaseInOutCubic,
|
||||||
|
/// Ease in quart
|
||||||
EaseInQuart,
|
EaseInQuart,
|
||||||
|
/// Ease out quart
|
||||||
EaseOutQuart,
|
EaseOutQuart,
|
||||||
|
/// Ease in out quart
|
||||||
EaseInOutQuart,
|
EaseInOutQuart,
|
||||||
|
/// Ease in quint
|
||||||
EaseInQuint,
|
EaseInQuint,
|
||||||
|
/// Ease out quint
|
||||||
EaseOutQuint,
|
EaseOutQuint,
|
||||||
|
/// Ease in out quint
|
||||||
EaseInOutQuint,
|
EaseInOutQuint,
|
||||||
|
/// Ease in expo
|
||||||
EaseInExpo,
|
EaseInExpo,
|
||||||
|
/// Ease out expo
|
||||||
EaseOutExpo,
|
EaseOutExpo,
|
||||||
|
/// Ease in out expo
|
||||||
EaseInOutExpo,
|
EaseInOutExpo,
|
||||||
|
/// Ease in circ
|
||||||
EaseInCirc,
|
EaseInCirc,
|
||||||
|
/// Ease out circ
|
||||||
EaseOutCirc,
|
EaseOutCirc,
|
||||||
|
/// Ease in out circ
|
||||||
EaseInOutCirc,
|
EaseInOutCirc,
|
||||||
|
/// Ease in back
|
||||||
EaseInBack,
|
EaseInBack,
|
||||||
|
/// Ease out back
|
||||||
EaseOutBack,
|
EaseOutBack,
|
||||||
|
/// Ease in out back
|
||||||
EaseInOutBack,
|
EaseInOutBack,
|
||||||
|
/// Ease in elastic
|
||||||
EaseInElastic,
|
EaseInElastic,
|
||||||
|
/// Ease out elastic
|
||||||
EaseOutElastic,
|
EaseOutElastic,
|
||||||
|
/// Ease in out elastic
|
||||||
EaseInOutElastic,
|
EaseInOutElastic,
|
||||||
|
/// Ease in bounce
|
||||||
EaseInBounce,
|
EaseInBounce,
|
||||||
|
/// Ease out bounce
|
||||||
EaseOutBounce,
|
EaseOutBounce,
|
||||||
|
/// Ease in out bounce
|
||||||
EaseInOutBounce,
|
EaseInOutBounce,
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "CubicBezier"))]
|
||||||
#[value(skip)]
|
#[value(skip)]
|
||||||
|
/// Custom Cubic Bézier function
|
||||||
CubicBezier(f64, f64, f64, f64),
|
CubicBezier(f64, f64, f64, f64),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ impl Arrangement for DefaultLayout {
|
|||||||
.and_then(|o| o.scrolling.map(|s| s.columns))
|
.and_then(|o| o.scrolling.map(|s| s.columns))
|
||||||
.unwrap_or(3);
|
.unwrap_or(3);
|
||||||
|
|
||||||
let column_width = area.right / column_count as i32;
|
let column_width = area.right / column_count.min(len) as i32;
|
||||||
let mut layouts = Vec::with_capacity(len);
|
let mut layouts = Vec::with_capacity(len);
|
||||||
|
|
||||||
let visible_columns = area.right / column_width;
|
let visible_columns = area.right / column_width;
|
||||||
@@ -704,9 +704,13 @@ impl Arrangement for CustomLayout {
|
|||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Axis on which to perform an operation
|
||||||
pub enum Axis {
|
pub enum Axis {
|
||||||
|
/// Horizontal axis
|
||||||
Horizontal,
|
Horizontal,
|
||||||
|
/// Vertical axis
|
||||||
Vertical,
|
Vertical,
|
||||||
|
/// Both horizontal and vertical axes
|
||||||
HorizontalAndVertical,
|
HorizontalAndVertical,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,41 +53,64 @@ impl ApplicationOptions {
|
|||||||
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
|
/// Rule for matching applications
|
||||||
pub enum MatchingRule {
|
pub enum MatchingRule {
|
||||||
|
/// Simple matching rule which must evaluate to true
|
||||||
Simple(IdWithIdentifier),
|
Simple(IdWithIdentifier),
|
||||||
|
/// Composite matching rule where all conditions must evaluate to true
|
||||||
Composite(Vec<IdWithIdentifier>),
|
Composite(Vec<IdWithIdentifier>),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Rule for assigning applications to a workspace
|
||||||
pub struct WorkspaceMatchingRule {
|
pub struct WorkspaceMatchingRule {
|
||||||
|
/// Target monitor index
|
||||||
pub monitor_index: usize,
|
pub monitor_index: usize,
|
||||||
|
/// Target workspace index
|
||||||
pub workspace_index: usize,
|
pub workspace_index: usize,
|
||||||
|
/// Matching rule for the application
|
||||||
pub matching_rule: MatchingRule,
|
pub matching_rule: MatchingRule,
|
||||||
|
/// Whether to apply the rule only when the application is initially launched
|
||||||
pub initial_only: bool,
|
pub initial_only: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Rule for matching applications
|
||||||
pub struct IdWithIdentifier {
|
pub struct IdWithIdentifier {
|
||||||
|
/// Kind of identifier to target
|
||||||
pub kind: ApplicationIdentifier,
|
pub kind: ApplicationIdentifier,
|
||||||
|
/// Target identifier
|
||||||
pub id: String,
|
pub id: String,
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
/// Matching strategy to use
|
||||||
pub matching_strategy: Option<MatchingStrategy>,
|
pub matching_strategy: Option<MatchingStrategy>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Display)]
|
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Display)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Strategy for matching identifiers
|
||||||
pub enum MatchingStrategy {
|
pub enum MatchingStrategy {
|
||||||
|
/// Should not be used, only kept for backward compatibility
|
||||||
Legacy,
|
Legacy,
|
||||||
|
/// Equals
|
||||||
Equals,
|
Equals,
|
||||||
|
/// Starts With
|
||||||
StartsWith,
|
StartsWith,
|
||||||
|
/// Ends With
|
||||||
EndsWith,
|
EndsWith,
|
||||||
|
/// Contains
|
||||||
Contains,
|
Contains,
|
||||||
|
/// Regex
|
||||||
Regex,
|
Regex,
|
||||||
|
/// Does not end with
|
||||||
DoesNotEndWith,
|
DoesNotEndWith,
|
||||||
|
/// Does not start with
|
||||||
DoesNotStartWith,
|
DoesNotStartWith,
|
||||||
|
/// Does not equal
|
||||||
DoesNotEqual,
|
DoesNotEqual,
|
||||||
|
/// Does not contain
|
||||||
DoesNotContain,
|
DoesNotContain,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
use clap::ValueEnum;
|
use clap::ValueEnum;
|
||||||
|
use core::str::FromStr;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use strum::Display;
|
use strum::Display;
|
||||||
@@ -8,25 +9,129 @@ use super::OperationDirection;
|
|||||||
use super::Rect;
|
use super::Rect;
|
||||||
use super::Sizing;
|
use super::Sizing;
|
||||||
|
|
||||||
|
pub fn deserialize_option_none_default_layout<'de, D>(
|
||||||
|
deserializer: D,
|
||||||
|
) -> Result<Option<DefaultLayout>, D::Error>
|
||||||
|
where
|
||||||
|
D: serde::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let s = String::deserialize(deserializer)?;
|
||||||
|
if s == "None" {
|
||||||
|
Ok(None)
|
||||||
|
} else {
|
||||||
|
<DefaultLayout as FromStr>::from_str(&s)
|
||||||
|
.map(Some)
|
||||||
|
.map_err(serde::de::Error::custom)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(
|
#[derive(
|
||||||
Clone, Copy, Debug, Serialize, Deserialize, Eq, PartialEq, Display, EnumString, ValueEnum,
|
Clone, Copy, Debug, Serialize, Deserialize, Eq, PartialEq, Display, EnumString, ValueEnum,
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// A predefined komorebi layout
|
||||||
pub enum DefaultLayout {
|
pub enum DefaultLayout {
|
||||||
|
/// BSP Layout
|
||||||
|
///
|
||||||
|
/// ```text
|
||||||
|
/// +-------+-----+
|
||||||
|
/// | | |
|
||||||
|
/// | +--+--+
|
||||||
|
/// | | |--|
|
||||||
|
/// +-------+--+--+
|
||||||
|
/// ```
|
||||||
BSP,
|
BSP,
|
||||||
|
/// Columns Layout
|
||||||
|
///
|
||||||
|
/// ```text
|
||||||
|
/// +--+--+--+--+
|
||||||
|
/// | | | | |
|
||||||
|
/// | | | | |
|
||||||
|
/// | | | | |
|
||||||
|
/// +--+--+--+--+
|
||||||
|
/// ```
|
||||||
Columns,
|
Columns,
|
||||||
|
/// Rows Layout
|
||||||
|
///
|
||||||
|
/// ```text
|
||||||
|
/// +-----------+
|
||||||
|
/// |-----------|
|
||||||
|
/// |-----------|
|
||||||
|
/// |-----------|
|
||||||
|
/// +-----------+
|
||||||
|
/// ```
|
||||||
Rows,
|
Rows,
|
||||||
|
/// Vertical Stack Layout
|
||||||
|
///
|
||||||
|
/// ```text
|
||||||
|
/// +-------+-----+
|
||||||
|
/// | | |
|
||||||
|
/// | +-----+
|
||||||
|
/// | | |
|
||||||
|
/// +-------+-----+
|
||||||
|
/// ```
|
||||||
VerticalStack,
|
VerticalStack,
|
||||||
|
/// Horizontal Stack Layout
|
||||||
|
///
|
||||||
|
/// ```text
|
||||||
|
/// +------+------+
|
||||||
|
/// | |
|
||||||
|
/// |------+------+
|
||||||
|
/// | | |
|
||||||
|
/// +------+------+
|
||||||
|
/// ```
|
||||||
HorizontalStack,
|
HorizontalStack,
|
||||||
|
/// Ultrawide Vertical Stack Layout
|
||||||
|
///
|
||||||
|
/// ```text
|
||||||
|
/// +-----+-----------+-----+
|
||||||
|
/// | | | |
|
||||||
|
/// | | +-----+
|
||||||
|
/// | | | |
|
||||||
|
/// | | +-----+
|
||||||
|
/// | | | |
|
||||||
|
/// +-----+-----------+-----+
|
||||||
|
/// ```
|
||||||
UltrawideVerticalStack,
|
UltrawideVerticalStack,
|
||||||
|
/// Grid Layout
|
||||||
|
///
|
||||||
|
/// ```text
|
||||||
|
/// +-----+-----+ +---+---+---+ +---+---+---+ +---+---+---+
|
||||||
|
/// | | | | | | | | | | | | | | |
|
||||||
|
/// | | | | | | | | | | | | | +---+
|
||||||
|
/// +-----+-----+ | +---+---+ +---+---+---+ +---+---| |
|
||||||
|
/// | | | | | | | | | | | | | +---+
|
||||||
|
/// | | | | | | | | | | | | | | |
|
||||||
|
/// +-----+-----+ +---+---+---+ +---+---+---+ +---+---+---+
|
||||||
|
/// 4 windows 5 windows 6 windows 7 windows
|
||||||
|
/// ```
|
||||||
Grid,
|
Grid,
|
||||||
|
/// Right Main Vertical Stack Layout
|
||||||
|
///
|
||||||
|
/// ```text
|
||||||
|
/// +-----+-------+
|
||||||
|
/// | | |
|
||||||
|
/// +-----+ |
|
||||||
|
/// | | |
|
||||||
|
/// +-----+-------+
|
||||||
|
/// ```
|
||||||
RightMainVerticalStack,
|
RightMainVerticalStack,
|
||||||
|
/// Scrolling Layout
|
||||||
|
///
|
||||||
|
/// ```text
|
||||||
|
/// +--+--+--+--+--+--+
|
||||||
|
/// | | | |
|
||||||
|
/// | | | |
|
||||||
|
/// | | | |
|
||||||
|
/// +--+--+--+--+--+--+
|
||||||
|
/// ```
|
||||||
Scrolling,
|
Scrolling,
|
||||||
// NOTE: If any new layout is added, please make sure to register the same in `DefaultLayout::cycle`
|
// NOTE: If any new layout is added, please make sure to register the same in `DefaultLayout::cycle`
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Eq, PartialEq)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Eq, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Options for specific layouts
|
||||||
pub struct LayoutOptions {
|
pub struct LayoutOptions {
|
||||||
/// Options related to the Scrolling layout
|
/// Options related to the Scrolling layout
|
||||||
pub scrolling: Option<ScrollingLayoutOptions>,
|
pub scrolling: Option<ScrollingLayoutOptions>,
|
||||||
@@ -36,6 +141,7 @@ pub struct LayoutOptions {
|
|||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Eq, PartialEq)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Eq, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Options for the Scrolling layout
|
||||||
pub struct ScrollingLayoutOptions {
|
pub struct ScrollingLayoutOptions {
|
||||||
/// Desired number of visible columns (default: 3)
|
/// Desired number of visible columns (default: 3)
|
||||||
pub columns: usize,
|
pub columns: usize,
|
||||||
@@ -45,6 +151,7 @@ pub struct ScrollingLayoutOptions {
|
|||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Eq, PartialEq)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Eq, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Options for the Grid layout
|
||||||
pub struct GridLayoutOptions {
|
pub struct GridLayoutOptions {
|
||||||
/// Maximum number of rows per grid column
|
/// Maximum number of rows per grid column
|
||||||
pub rows: usize,
|
pub rows: usize,
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#![warn(clippy::all)]
|
#![warn(clippy::all)]
|
||||||
#![allow(clippy::missing_errors_doc, clippy::use_self, clippy::doc_markdown)]
|
#![allow(clippy::missing_errors_doc, clippy::use_self, clippy::doc_markdown)]
|
||||||
|
#![allow(deprecated)] // allow deprecated variants like HidingBehaviour::Hide to be used in derive macros
|
||||||
|
|
||||||
use std::num::NonZeroUsize;
|
use std::num::NonZeroUsize;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
@@ -273,17 +274,24 @@ pub struct SubscribeOptions {
|
|||||||
|
|
||||||
#[derive(Debug, Copy, Clone, Eq, PartialEq, Display, Serialize, Deserialize, ValueEnum)]
|
#[derive(Debug, Copy, Clone, Eq, PartialEq, Display, Serialize, Deserialize, ValueEnum)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Stackbar mode
|
||||||
pub enum StackbarMode {
|
pub enum StackbarMode {
|
||||||
|
/// Always show
|
||||||
Always,
|
Always,
|
||||||
|
/// Never show
|
||||||
Never,
|
Never,
|
||||||
|
/// Show on stack
|
||||||
OnStack,
|
OnStack,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Copy, Default, Clone, Eq, PartialEq, Display, Serialize, Deserialize)]
|
#[derive(Debug, Copy, Default, Clone, Eq, PartialEq, Display, Serialize, Deserialize)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Starbar label
|
||||||
pub enum StackbarLabel {
|
pub enum StackbarLabel {
|
||||||
#[default]
|
#[default]
|
||||||
|
/// Process name
|
||||||
Process,
|
Process,
|
||||||
|
/// Window title
|
||||||
Title,
|
Title,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -291,6 +299,7 @@ pub enum StackbarLabel {
|
|||||||
Default, Copy, Clone, Debug, Eq, PartialEq, Display, Serialize, Deserialize, ValueEnum,
|
Default, Copy, Clone, Debug, Eq, PartialEq, Display, Serialize, Deserialize, ValueEnum,
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Border style
|
||||||
pub enum BorderStyle {
|
pub enum BorderStyle {
|
||||||
#[default]
|
#[default]
|
||||||
/// Use the system border style
|
/// Use the system border style
|
||||||
@@ -305,6 +314,7 @@ pub enum BorderStyle {
|
|||||||
Default, Copy, Clone, Debug, Eq, PartialEq, Display, Serialize, Deserialize, ValueEnum,
|
Default, Copy, Clone, Debug, Eq, PartialEq, Display, Serialize, Deserialize, ValueEnum,
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Border style
|
||||||
pub enum BorderImplementation {
|
pub enum BorderImplementation {
|
||||||
#[default]
|
#[default]
|
||||||
/// Use the adjustable komorebi border implementation
|
/// Use the adjustable komorebi border implementation
|
||||||
@@ -328,13 +338,20 @@ pub enum BorderImplementation {
|
|||||||
Hash,
|
Hash,
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Window kind
|
||||||
pub enum WindowKind {
|
pub enum WindowKind {
|
||||||
|
/// Single window
|
||||||
Single,
|
Single,
|
||||||
|
/// Stack container
|
||||||
Stack,
|
Stack,
|
||||||
|
/// Monocle container
|
||||||
Monocle,
|
Monocle,
|
||||||
#[default]
|
#[default]
|
||||||
|
/// Unfocused window
|
||||||
Unfocused,
|
Unfocused,
|
||||||
|
/// Unfocused locked container
|
||||||
UnfocusedLocked,
|
UnfocusedLocked,
|
||||||
|
/// Floating window
|
||||||
Floating,
|
Floating,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -355,30 +372,37 @@ pub enum StateQuery {
|
|||||||
Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Display, EnumString, ValueEnum,
|
Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize, Display, EnumString, ValueEnum,
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Application identifier
|
||||||
pub enum ApplicationIdentifier {
|
pub enum ApplicationIdentifier {
|
||||||
|
/// Executable name
|
||||||
#[serde(alias = "exe")]
|
#[serde(alias = "exe")]
|
||||||
Exe,
|
Exe,
|
||||||
|
/// Class
|
||||||
#[serde(alias = "class")]
|
#[serde(alias = "class")]
|
||||||
Class,
|
Class,
|
||||||
#[serde(alias = "title")]
|
#[serde(alias = "title")]
|
||||||
|
/// Window title
|
||||||
Title,
|
Title,
|
||||||
|
/// Executable path
|
||||||
#[serde(alias = "path")]
|
#[serde(alias = "path")]
|
||||||
Path,
|
Path,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Display, EnumString, ValueEnum)]
|
#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize, Display, EnumString, ValueEnum)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Focus follows mouse implementation
|
||||||
pub enum FocusFollowsMouseImplementation {
|
pub enum FocusFollowsMouseImplementation {
|
||||||
/// A custom FFM implementation (slightly more CPU-intensive)
|
/// Custom FFM implementation (slightly more CPU-intensive)
|
||||||
Komorebi,
|
Komorebi,
|
||||||
/// The native (legacy) Windows FFM implementation
|
/// Native (legacy) Windows FFM implementation
|
||||||
Windows,
|
Windows,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Window management behaviour
|
||||||
pub struct WindowManagementBehaviour {
|
pub struct WindowManagementBehaviour {
|
||||||
/// The current WindowContainerBehaviour to be used
|
/// The current [`WindowContainerBehaviour`] to be used
|
||||||
pub current_behaviour: WindowContainerBehaviour,
|
pub current_behaviour: WindowContainerBehaviour,
|
||||||
/// Override of `current_behaviour` to open new windows as floating windows
|
/// Override of `current_behaviour` to open new windows as floating windows
|
||||||
/// that can be later toggled to tiled, when false it will default to
|
/// that can be later toggled to tiled, when false it will default to
|
||||||
@@ -397,7 +421,7 @@ pub struct WindowManagementBehaviour {
|
|||||||
pub floating_layer_placement: Placement,
|
pub floating_layer_placement: Placement,
|
||||||
/// The `Placement` to be used when spawning a window with float override active
|
/// The `Placement` to be used when spawning a window with float override active
|
||||||
pub float_override_placement: Placement,
|
pub float_override_placement: Placement,
|
||||||
/// The `Placement` to be used when spawning a window that matches a 'floating_applications' rule
|
/// The `Placement` to be used when spawning a window that matches a `floating_applications` rule
|
||||||
pub float_rule_placement: Placement,
|
pub float_rule_placement: Placement,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -405,6 +429,7 @@ pub struct WindowManagementBehaviour {
|
|||||||
Clone, Copy, Debug, Default, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq,
|
Clone, Copy, Debug, Default, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq,
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Window container behaviour when a new window is opened
|
||||||
pub enum WindowContainerBehaviour {
|
pub enum WindowContainerBehaviour {
|
||||||
/// Create a new container for each new window
|
/// Create a new container for each new window
|
||||||
#[default]
|
#[default]
|
||||||
@@ -417,6 +442,7 @@ pub enum WindowContainerBehaviour {
|
|||||||
Clone, Copy, Debug, Default, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq,
|
Clone, Copy, Debug, Default, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq,
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Floating layer behaviour when a new window is opened
|
||||||
pub enum FloatingLayerBehaviour {
|
pub enum FloatingLayerBehaviour {
|
||||||
/// Tile new windows (unless they match a float rule or float override is active)
|
/// Tile new windows (unless they match a float rule or float override is active)
|
||||||
#[default]
|
#[default]
|
||||||
@@ -429,6 +455,7 @@ pub enum FloatingLayerBehaviour {
|
|||||||
Clone, Copy, Debug, Default, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq,
|
Clone, Copy, Debug, Default, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq,
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Placement behaviour for floating windows
|
||||||
pub enum Placement {
|
pub enum Placement {
|
||||||
/// Does not change the size or position of the window
|
/// Does not change the size or position of the window
|
||||||
#[default]
|
#[default]
|
||||||
@@ -468,6 +495,7 @@ impl Placement {
|
|||||||
Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize, Display, EnumString, ValueEnum,
|
Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize, Display, EnumString, ValueEnum,
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Move behaviour when the operation works across a monitor boundary
|
||||||
pub enum MoveBehaviour {
|
pub enum MoveBehaviour {
|
||||||
/// Swap the window container with the window container at the edge of the adjacent monitor
|
/// Swap the window container with the window container at the edge of the adjacent monitor
|
||||||
#[default]
|
#[default]
|
||||||
@@ -482,6 +510,7 @@ pub enum MoveBehaviour {
|
|||||||
Clone, Copy, Debug, Default, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq,
|
Clone, Copy, Debug, Default, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq,
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Behaviour when an action would cross a monitor boundary
|
||||||
pub enum CrossBoundaryBehaviour {
|
pub enum CrossBoundaryBehaviour {
|
||||||
/// Attempt to perform actions across a workspace boundary
|
/// Attempt to perform actions across a workspace boundary
|
||||||
Workspace,
|
Workspace,
|
||||||
@@ -492,10 +521,12 @@ pub enum CrossBoundaryBehaviour {
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq)]
|
#[derive(Copy, Clone, Debug, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Window hiding behaviour
|
||||||
pub enum HidingBehaviour {
|
pub enum HidingBehaviour {
|
||||||
/// END OF LIFE FEATURE: Use the SW_HIDE flag to hide windows when switching workspaces (has issues with Electron apps)
|
/// END OF LIFE FEATURE: Use the `SW_HIDE` flag to hide windows when switching workspaces (has issues with Electron apps)
|
||||||
|
#[deprecated(note = "End of life feature")]
|
||||||
Hide,
|
Hide,
|
||||||
/// Use the SW_MINIMIZE flag to hide windows when switching workspaces (has issues with frequent workspace switching)
|
/// Use the `SW_MINIMIZE` flag to hide windows when switching workspaces (has issues with frequent workspace switching)
|
||||||
Minimize,
|
Minimize,
|
||||||
/// Use the undocumented SetCloak Win32 function to hide windows when switching workspaces
|
/// Use the undocumented SetCloak Win32 function to hide windows when switching workspaces
|
||||||
Cloak,
|
Cloak,
|
||||||
@@ -505,18 +536,22 @@ pub enum HidingBehaviour {
|
|||||||
Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize, Display, EnumString, ValueEnum,
|
Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize, Display, EnumString, ValueEnum,
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Operation behaviour for temporarily unmanaged and floating windows
|
||||||
pub enum OperationBehaviour {
|
pub enum OperationBehaviour {
|
||||||
/// Process komorebic commands on temporarily unmanaged/floated windows
|
/// Process commands on temporarily unmanaged/floated windows
|
||||||
#[default]
|
#[default]
|
||||||
Op,
|
Op,
|
||||||
/// Ignore komorebic commands on temporarily unmanaged/floated windows
|
/// Ignore commands on temporarily unmanaged/floated windows
|
||||||
NoOp,
|
NoOp,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ValueEnum)]
|
#[derive(Clone, Copy, Debug, Serialize, Deserialize, Display, EnumString, ValueEnum)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Sizing
|
||||||
pub enum Sizing {
|
pub enum Sizing {
|
||||||
|
/// Increase
|
||||||
Increase,
|
Increase,
|
||||||
|
/// Decrease
|
||||||
Decrease,
|
Decrease,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -540,9 +575,12 @@ impl Sizing {
|
|||||||
Clone, Copy, Debug, Default, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq,
|
Clone, Copy, Debug, Default, Serialize, Deserialize, Display, EnumString, ValueEnum, PartialEq,
|
||||||
)]
|
)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Window handling behaviour
|
||||||
pub enum WindowHandlingBehaviour {
|
pub enum WindowHandlingBehaviour {
|
||||||
#[default]
|
#[default]
|
||||||
|
/// Synchronous
|
||||||
Sync,
|
Sync,
|
||||||
|
/// Asynchronous
|
||||||
Async,
|
Async,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -121,13 +121,16 @@ impl<'de> serde_with::DeserializeAs<'de, PathBuf> for ResolvedPathBuf {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "schemars")]
|
#[cfg(feature = "schemars")]
|
||||||
impl serde_with::schemars_0_8::JsonSchemaAs<PathBuf> for ResolvedPathBuf {
|
impl serde_with::schemars_1::JsonSchemaAs<PathBuf> for ResolvedPathBuf {
|
||||||
fn schema_name() -> String {
|
fn schema_name() -> std::borrow::Cow<'static, str> {
|
||||||
"PathBuf".to_owned()
|
std::borrow::Cow::Borrowed("PathBuf")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::schema::Schema {
|
fn json_schema(_generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
|
||||||
<PathBuf as schemars::JsonSchema>::json_schema(generator)
|
schemars::json_schema!({
|
||||||
|
"type": "string",
|
||||||
|
"description": "A file system path. Environment variables like %VAR%, $Env:VAR, or $VAR are automatically resolved."
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,14 +4,15 @@ use windows::Win32::Foundation::RECT;
|
|||||||
|
|
||||||
#[derive(Debug, Default, Clone, Copy, Serialize, Deserialize, Eq, PartialEq)]
|
#[derive(Debug, Default, Clone, Copy, Serialize, Deserialize, Eq, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Rectangle dimensions
|
||||||
pub struct Rect {
|
pub struct Rect {
|
||||||
/// The left point in a Win32 Rect
|
/// Left point of the rectangle
|
||||||
pub left: i32,
|
pub left: i32,
|
||||||
/// The top point in a Win32 Rect
|
/// Top point of the rectangle
|
||||||
pub top: i32,
|
pub top: i32,
|
||||||
/// The right point in a Win32 Rect
|
/// Width of the recentangle (from the left point)
|
||||||
pub right: i32,
|
pub right: i32,
|
||||||
/// The bottom point in a Win32 Rect
|
/// Height of the rectangle (from the top point)
|
||||||
pub bottom: i32,
|
pub bottom: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -240,9 +240,13 @@ lazy_static! {
|
|||||||
static ref CURRENT_VIRTUAL_DESKTOP: Arc<Mutex<Option<Vec<u8>>>> = Arc::new(Mutex::new(None));
|
static ref CURRENT_VIRTUAL_DESKTOP: Arc<Mutex<Option<Vec<u8>>>> = Arc::new(Mutex::new(None));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub static DEFAULT_WORKSPACE_LAYOUT: AtomicCell<Option<DefaultLayout>> =
|
||||||
|
AtomicCell::new(Some(DefaultLayout::BSP));
|
||||||
pub static DEFAULT_WORKSPACE_PADDING: AtomicI32 = AtomicI32::new(10);
|
pub static DEFAULT_WORKSPACE_PADDING: AtomicI32 = AtomicI32::new(10);
|
||||||
pub static DEFAULT_CONTAINER_PADDING: AtomicI32 = AtomicI32::new(10);
|
pub static DEFAULT_CONTAINER_PADDING: AtomicI32 = AtomicI32::new(10);
|
||||||
|
pub static DEFAULT_RESIZE_DELTA: i32 = 50;
|
||||||
|
|
||||||
|
pub static DEFAULT_MOUSE_FOLLOWS_FOCUS: bool = true;
|
||||||
pub static INITIAL_CONFIGURATION_LOADED: AtomicBool = AtomicBool::new(false);
|
pub static INITIAL_CONFIGURATION_LOADED: AtomicBool = AtomicBool::new(false);
|
||||||
pub static CUSTOM_FFM: AtomicBool = AtomicBool::new(false);
|
pub static CUSTOM_FFM: AtomicBool = AtomicBool::new(false);
|
||||||
pub static SESSION_ID: AtomicU32 = AtomicU32::new(0);
|
pub static SESSION_ID: AtomicU32 = AtomicU32::new(0);
|
||||||
|
|||||||
@@ -176,7 +176,7 @@ struct Opts {
|
|||||||
/// Allow the use of komorebi's custom focus-follows-mouse implementation
|
/// Allow the use of komorebi's custom focus-follows-mouse implementation
|
||||||
#[clap(short, long = "ffm")]
|
#[clap(short, long = "ffm")]
|
||||||
focus_follows_mouse: bool,
|
focus_follows_mouse: bool,
|
||||||
/// Wait for 'komorebic complete-configuration' to be sent before processing events
|
/// Wait for `komorebic complete-configuration` to be sent before processing events
|
||||||
#[clap(short, long)]
|
#[clap(short, long)]
|
||||||
await_configuration: bool,
|
await_configuration: bool,
|
||||||
/// Start a TCP server on the given port to allow the direct sending of SocketMessages
|
/// Start a TCP server on the given port to allow the direct sending of SocketMessages
|
||||||
|
|||||||
@@ -2224,14 +2224,7 @@ if (!(Get-Process komorebi-bar -ErrorAction SilentlyContinue))
|
|||||||
SocketMessage::StaticConfigSchema => {
|
SocketMessage::StaticConfigSchema => {
|
||||||
#[cfg(feature = "schemars")]
|
#[cfg(feature = "schemars")]
|
||||||
{
|
{
|
||||||
let settings = schemars::r#gen::SchemaSettings::default().with(|s| {
|
let socket_message = schemars::schema_for!(SocketMessage);
|
||||||
s.option_nullable = false;
|
|
||||||
s.option_add_null_type = false;
|
|
||||||
s.inline_subschemas = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
let generator = settings.into_generator();
|
|
||||||
let socket_message = generator.into_root_schema_for::<StaticConfig>();
|
|
||||||
let schema = serde_json::to_string_pretty(&socket_message)?;
|
let schema = serde_json::to_string_pretty(&socket_message)?;
|
||||||
|
|
||||||
reply.write_all(schema.as_bytes())?;
|
reply.write_all(schema.as_bytes())?;
|
||||||
|
|||||||
@@ -183,6 +183,7 @@ fn find_orphans() -> color_eyre::Result<()> {
|
|||||||
for (hwnd, (m_idx, w_idx)) in cache.iter() {
|
for (hwnd, (m_idx, w_idx)) in cache.iter() {
|
||||||
let window = Window::from(*hwnd);
|
let window = Window::from(*hwnd);
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
if !window.is_window()
|
if !window.is_window()
|
||||||
|| (
|
|| (
|
||||||
// This one is a hack because WINWORD.EXE is an absolute trainwreck of an app
|
// This one is a hack because WINWORD.EXE is an absolute trainwreck of an app
|
||||||
|
|||||||
@@ -18,20 +18,23 @@ pub fn mdm_enrollment() -> eyre::Result<(bool, Option<String>)> {
|
|||||||
command.args(["/status"]);
|
command.args(["/status"]);
|
||||||
let stdout = command.output()?.stdout;
|
let stdout = command.output()?.stdout;
|
||||||
let output = std::str::from_utf8(&stdout)?;
|
let output = std::str::from_utf8(&stdout)?;
|
||||||
if !output.contains("MdmUrl") {
|
if !output.contains("WorkspaceTenantName") {
|
||||||
return Ok((false, None));
|
return Ok((false, None));
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut server = None;
|
let mut tenant = None;
|
||||||
|
|
||||||
for line in output.lines() {
|
for line in output.lines() {
|
||||||
if line.contains("MdmUrl") {
|
if line.contains("WorkspaceTenantName") {
|
||||||
let line = line.trim().to_string();
|
let line = line.trim().to_string();
|
||||||
server = Some(line.trim_start_matches("MdmUrl : ").to_string())
|
tenant = Some(
|
||||||
|
line.trim_start_matches("WorkspaceTenantName : ")
|
||||||
|
.to_string(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok((true, server))
|
Ok((true, tenant))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_valid_payload(raw: &str, fresh: bool) -> eyre::Result<bool> {
|
fn is_valid_payload(raw: &str, fresh: bool) -> eyre::Result<bool> {
|
||||||
|
|||||||
+188
-190
@@ -3,6 +3,9 @@ use crate::Axis;
|
|||||||
use crate::CrossBoundaryBehaviour;
|
use crate::CrossBoundaryBehaviour;
|
||||||
use crate::DATA_DIR;
|
use crate::DATA_DIR;
|
||||||
use crate::DEFAULT_CONTAINER_PADDING;
|
use crate::DEFAULT_CONTAINER_PADDING;
|
||||||
|
use crate::DEFAULT_MOUSE_FOLLOWS_FOCUS;
|
||||||
|
use crate::DEFAULT_RESIZE_DELTA;
|
||||||
|
use crate::DEFAULT_WORKSPACE_LAYOUT;
|
||||||
use crate::DEFAULT_WORKSPACE_PADDING;
|
use crate::DEFAULT_WORKSPACE_PADDING;
|
||||||
use crate::DISPLAY_INDEX_PREFERENCES;
|
use crate::DISPLAY_INDEX_PREFERENCES;
|
||||||
use crate::FLOATING_APPLICATIONS;
|
use crate::FLOATING_APPLICATIONS;
|
||||||
@@ -108,6 +111,7 @@ use uds_windows::UnixStream;
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Border colours for different container states
|
||||||
pub struct BorderColours {
|
pub struct BorderColours {
|
||||||
/// Border colour when the container contains a single window
|
/// Border colour when the container contains a single window
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
@@ -131,54 +135,69 @@ pub struct BorderColours {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Theme options
|
||||||
pub struct ThemeOptions {
|
pub struct ThemeOptions {
|
||||||
/// Specify Light or Dark variant for theme generation (default: Dark)
|
/// Specify Light or Dark variant for theme generation
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = komorebi_themes::ThemeVariant::Dark)))]
|
||||||
pub theme_variant: Option<komorebi_themes::ThemeVariant>,
|
pub theme_variant: Option<komorebi_themes::ThemeVariant>,
|
||||||
/// Border colour when the container contains a single window (default: Base0D)
|
/// Border colour when the container contains a single window
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = komorebi_themes::Base16Value::Base0D)))]
|
||||||
pub single_border: Option<komorebi_themes::Base16Value>,
|
pub single_border: Option<komorebi_themes::Base16Value>,
|
||||||
/// Border colour when the container contains multiple windows (default: Base0B)
|
/// Border colour when the container contains multiple windows
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = komorebi_themes::Base16Value::Base0B)))]
|
||||||
pub stack_border: Option<komorebi_themes::Base16Value>,
|
pub stack_border: Option<komorebi_themes::Base16Value>,
|
||||||
/// Border colour when the container is in monocle mode (default: Base0F)
|
/// Border colour when the container is in monocle mode
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = komorebi_themes::Base16Value::Base0F)))]
|
||||||
pub monocle_border: Option<komorebi_themes::Base16Value>,
|
pub monocle_border: Option<komorebi_themes::Base16Value>,
|
||||||
/// Border colour when the window is floating (default: Base09)
|
/// Border colour when the window is floating
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = komorebi_themes::Base16Value::Base09)))]
|
||||||
pub floating_border: Option<komorebi_themes::Base16Value>,
|
pub floating_border: Option<komorebi_themes::Base16Value>,
|
||||||
/// Border colour when the container is unfocused (default: Base01)
|
/// Border colour when the container is unfocused
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = komorebi_themes::Base16Value::Base01)))]
|
||||||
pub unfocused_border: Option<komorebi_themes::Base16Value>,
|
pub unfocused_border: Option<komorebi_themes::Base16Value>,
|
||||||
/// Border colour when the container is unfocused and locked (default: Base08)
|
/// Border colour when the container is unfocused and locked
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = komorebi_themes::Base16Value::Base08)))]
|
||||||
pub unfocused_locked_border: Option<komorebi_themes::Base16Value>,
|
pub unfocused_locked_border: Option<komorebi_themes::Base16Value>,
|
||||||
/// Stackbar focused tab text colour (default: Base0B)
|
/// Stackbar focused tab text colour
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = komorebi_themes::Base16Value::Base0B)))]
|
||||||
pub stackbar_focused_text: Option<komorebi_themes::Base16Value>,
|
pub stackbar_focused_text: Option<komorebi_themes::Base16Value>,
|
||||||
/// Stackbar unfocused tab text colour (default: Base05)
|
/// Stackbar unfocused tab text colour
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = komorebi_themes::Base16Value::Base05)))]
|
||||||
pub stackbar_unfocused_text: Option<komorebi_themes::Base16Value>,
|
pub stackbar_unfocused_text: Option<komorebi_themes::Base16Value>,
|
||||||
/// Stackbar tab background colour (default: Base01)
|
/// Stackbar tab background colour
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = komorebi_themes::Base16Value::Base01)))]
|
||||||
pub stackbar_background: Option<komorebi_themes::Base16Value>,
|
pub stackbar_background: Option<komorebi_themes::Base16Value>,
|
||||||
/// Komorebi status bar accent (default: Base0D)
|
/// Komorebi status bar accent
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = komorebi_themes::Base16Value::Base0D)))]
|
||||||
pub bar_accent: Option<komorebi_themes::Base16Value>,
|
pub bar_accent: Option<komorebi_themes::Base16Value>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[serde_with::serde_as]
|
#[serde_with::serde_as]
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Wallpaper configuration
|
||||||
pub struct Wallpaper {
|
pub struct Wallpaper {
|
||||||
/// Path to the wallpaper image file
|
/// Path to the wallpaper image file
|
||||||
#[serde_as(as = "ResolvedPathBuf")]
|
#[serde_as(as = "ResolvedPathBuf")]
|
||||||
pub path: PathBuf,
|
pub path: PathBuf,
|
||||||
/// Generate and apply Base16 theme for this wallpaper (default: true)
|
/// Generate and apply Base16 theme for this wallpaper
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = true)))]
|
||||||
pub generate_theme: Option<bool>,
|
pub generate_theme: Option<bool>,
|
||||||
/// Specify Light or Dark variant for theme generation (default: Dark)
|
/// Specify Light or Dark variant for theme generation
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = komorebi_themes::ThemeVariant::Dark)))]
|
||||||
pub theme_options: Option<ThemeOptions>,
|
pub theme_options: Option<ThemeOptions>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -186,23 +205,27 @@ pub struct Wallpaper {
|
|||||||
#[serde_with::serde_as]
|
#[serde_with::serde_as]
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Workspace configuration
|
||||||
pub struct WorkspaceConfig {
|
pub struct WorkspaceConfig {
|
||||||
/// Name
|
/// Name
|
||||||
pub name: String,
|
pub name: String,
|
||||||
/// Layout (default: BSP)
|
/// Layout
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = DefaultLayout::BSP)))]
|
||||||
pub layout: Option<DefaultLayout>,
|
pub layout: Option<DefaultLayout>,
|
||||||
/// Layout-specific options (default: None)
|
/// Layout-specific options
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub layout_options: Option<LayoutOptions>,
|
pub layout_options: Option<LayoutOptions>,
|
||||||
/// END OF LIFE FEATURE: Custom Layout (default: None)
|
/// END OF LIFE FEATURE: Custom Layout
|
||||||
|
#[deprecated(note = "End of life feature")]
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
#[serde_as(as = "Option<ResolvedPathBuf>")]
|
#[serde_as(as = "Option<ResolvedPathBuf>")]
|
||||||
pub custom_layout: Option<PathBuf>,
|
pub custom_layout: Option<PathBuf>,
|
||||||
/// Layout rules in the format of threshold => layout (default: None)
|
/// Layout rules in the format of threshold => layout
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub layout_rules: Option<HashMap<usize, DefaultLayout>>,
|
pub layout_rules: Option<HashMap<usize, DefaultLayout>>,
|
||||||
/// END OF LIFE FEATURE: Custom layout rules (default: None)
|
/// END OF LIFE FEATURE: Custom layout rules
|
||||||
|
#[deprecated(note = "End of life feature")]
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
#[serde(deserialize_with = "resolve_option_hashmap_usize_path", default)]
|
#[serde(deserialize_with = "resolve_option_hashmap_usize_path", default)]
|
||||||
pub custom_layout_rules: Option<HashMap<usize, PathBuf>>,
|
pub custom_layout_rules: Option<HashMap<usize, PathBuf>>,
|
||||||
@@ -218,29 +241,34 @@ pub struct WorkspaceConfig {
|
|||||||
/// Permanent workspace application rules
|
/// Permanent workspace application rules
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub workspace_rules: Option<Vec<MatchingRule>>,
|
pub workspace_rules: Option<Vec<MatchingRule>>,
|
||||||
/// Workspace specific work area offset (default: None)
|
/// Workspace specific work area offset
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub work_area_offset: Option<Rect>,
|
pub work_area_offset: Option<Rect>,
|
||||||
/// Apply this monitor's window-based work area offset (default: true)
|
/// Apply this monitor's window-based work area offset
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = true)))]
|
||||||
pub apply_window_based_work_area_offset: Option<bool>,
|
pub apply_window_based_work_area_offset: Option<bool>,
|
||||||
/// Determine what happens when a new window is opened (default: Create)
|
/// Determine what happens when a new window is opened
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = WindowContainerBehaviour::Create)))]
|
||||||
pub window_container_behaviour: Option<WindowContainerBehaviour>,
|
pub window_container_behaviour: Option<WindowContainerBehaviour>,
|
||||||
/// Window container behaviour rules in the format of threshold => behaviour (default: None)
|
/// Window container behaviour rules in the format of threshold => behaviour
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub window_container_behaviour_rules: Option<HashMap<usize, WindowContainerBehaviour>>,
|
pub window_container_behaviour_rules: Option<HashMap<usize, WindowContainerBehaviour>>,
|
||||||
/// Enable or disable float override, which makes it so every new window opens in floating mode (default: false)
|
/// Enable or disable float override, which makes it so every new window opens in floating mode
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = false)))]
|
||||||
pub float_override: Option<bool>,
|
pub float_override: Option<bool>,
|
||||||
/// Enable or disable tiling for the workspace (default: true)
|
/// Enable or disable tiling for the workspace
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = true)))]
|
||||||
pub tile: Option<bool>,
|
pub tile: Option<bool>,
|
||||||
/// Specify an axis on which to flip the selected layout (default: None)
|
/// Specify an axis on which to flip the selected layout
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub layout_flip: Option<Axis>,
|
pub layout_flip: Option<Axis>,
|
||||||
/// Determine what happens to a new window when the Floating workspace layer is active (default: Tile)
|
/// Determine what happens to a new window when the Floating workspace layer is active
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = FloatingLayerBehaviour::Tile)))]
|
||||||
pub floating_layer_behaviour: Option<FloatingLayerBehaviour>,
|
pub floating_layer_behaviour: Option<FloatingLayerBehaviour>,
|
||||||
/// Specify a wallpaper for this workspace
|
/// Specify a wallpaper for this workspace
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
@@ -299,11 +327,13 @@ impl From<&Workspace> for WorkspaceConfig {
|
|||||||
})
|
})
|
||||||
.flatten(),
|
.flatten(),
|
||||||
layout_options: value.layout_options,
|
layout_options: value.layout_options,
|
||||||
|
#[allow(deprecated)]
|
||||||
custom_layout: value
|
custom_layout: value
|
||||||
.workspace_config
|
.workspace_config
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.and_then(|c| c.custom_layout.clone()),
|
.and_then(|c| c.custom_layout.clone()),
|
||||||
layout_rules,
|
layout_rules,
|
||||||
|
#[allow(deprecated)]
|
||||||
custom_layout_rules: value
|
custom_layout_rules: value
|
||||||
.workspace_config
|
.workspace_config
|
||||||
.as_ref()
|
.as_ref()
|
||||||
@@ -333,17 +363,19 @@ impl From<&Workspace> for WorkspaceConfig {
|
|||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Monitor configuration
|
||||||
pub struct MonitorConfig {
|
pub struct MonitorConfig {
|
||||||
/// Workspace configurations
|
/// Workspace configurations
|
||||||
pub workspaces: Vec<WorkspaceConfig>,
|
pub workspaces: Vec<WorkspaceConfig>,
|
||||||
/// Monitor-specific work area offset (default: None)
|
/// Monitor-specific work area offset
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub work_area_offset: Option<Rect>,
|
pub work_area_offset: Option<Rect>,
|
||||||
/// Window based work area offset (default: None)
|
/// Window based work area offset
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub window_based_work_area_offset: Option<Rect>,
|
pub window_based_work_area_offset: Option<Rect>,
|
||||||
/// Open window limit after which the window based work area offset will no longer be applied (default: 1)
|
/// Open window limit after which the window based work area offset will no longer be applied
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = 1)))]
|
||||||
pub window_based_work_area_offset_limit: Option<isize>,
|
pub window_based_work_area_offset_limit: Option<isize>,
|
||||||
/// Container padding (default: global)
|
/// Container padding (default: global)
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
@@ -354,8 +386,9 @@ pub struct MonitorConfig {
|
|||||||
/// Specify a wallpaper for this monitor
|
/// Specify a wallpaper for this monitor
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub wallpaper: Option<Wallpaper>,
|
pub wallpaper: Option<Wallpaper>,
|
||||||
/// Determine what happens to a new window when the Floating workspace layer is active (default: Tile)
|
/// Determine what happens to a new window when the Floating workspace layer is active
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = FloatingLayerBehaviour::Tile)))]
|
||||||
pub floating_layer_behaviour: Option<FloatingLayerBehaviour>,
|
pub floating_layer_behaviour: Option<FloatingLayerBehaviour>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -402,19 +435,21 @@ impl From<&Monitor> for MonitorConfig {
|
|||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
|
/// Path(s) to application-specific configuration file(s)
|
||||||
pub enum AppSpecificConfigurationPath {
|
pub enum AppSpecificConfigurationPath {
|
||||||
/// A single applications.json file
|
/// A single `applications.json` file
|
||||||
Single(#[serde_as(as = "ResolvedPathBuf")] PathBuf),
|
Single(#[serde_as(as = "ResolvedPathBuf")] PathBuf),
|
||||||
/// Multiple applications.json files
|
/// Multiple `applications.json` files
|
||||||
Multiple(#[serde_as(as = "Vec<ResolvedPathBuf>")] Vec<PathBuf>),
|
Multiple(#[serde_as(as = "Vec<ResolvedPathBuf>")] Vec<PathBuf>),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[serde_with::serde_as]
|
#[serde_with::serde_as]
|
||||||
#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
/// The `komorebi.json` static configuration file reference for `v0.1.39`
|
/// The `komorebi.json` static configuration file reference for `v0.1.40`
|
||||||
pub struct StaticConfig {
|
pub struct StaticConfig {
|
||||||
/// DEPRECATED from v0.1.22: no longer required
|
/// DEPRECATED from v0.1.22: no longer required
|
||||||
|
#[deprecated(note = "No longer required")]
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub invisible_borders: Option<Rect>,
|
pub invisible_borders: Option<Rect>,
|
||||||
/// DISCOURAGED: Minimum width for a window to be eligible for tiling
|
/// DISCOURAGED: Minimum width for a window to be eligible for tiling
|
||||||
@@ -423,101 +458,127 @@ pub struct StaticConfig {
|
|||||||
/// DISCOURAGED: Minimum height for a window to be eligible for tiling
|
/// DISCOURAGED: Minimum height for a window to be eligible for tiling
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub minimum_window_height: Option<i32>,
|
pub minimum_window_height: Option<i32>,
|
||||||
/// Delta to resize windows by (default 50)
|
/// Delta to resize windows by
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = DEFAULT_RESIZE_DELTA)))]
|
||||||
pub resize_delta: Option<i32>,
|
pub resize_delta: Option<i32>,
|
||||||
/// Determine what happens when a new window is opened (default: Create)
|
/// Determine what happens when a new window is opened
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = WindowContainerBehaviour::Create)))]
|
||||||
pub window_container_behaviour: Option<WindowContainerBehaviour>,
|
pub window_container_behaviour: Option<WindowContainerBehaviour>,
|
||||||
/// Enable or disable float override, which makes it so every new window opens in floating mode
|
/// Enable or disable float override, which makes it so every new window opens in floating mode
|
||||||
/// (default: false)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = false)))]
|
||||||
pub float_override: Option<bool>,
|
pub float_override: Option<bool>,
|
||||||
/// Determines what happens on a new window when on the `FloatingLayer`
|
/// Determines what happens on a new window when on the `FloatingLayer`
|
||||||
/// (default: Tile)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = FloatingLayerBehaviour::Tile)))]
|
||||||
pub floating_layer_behaviour: Option<FloatingLayerBehaviour>,
|
pub floating_layer_behaviour: Option<FloatingLayerBehaviour>,
|
||||||
/// Determines the placement of a new window when toggling to float (default: CenterAndResize)
|
/// Determines the placement of a new window when toggling to float
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Placement::CenterAndResize)))]
|
||||||
pub toggle_float_placement: Option<Placement>,
|
pub toggle_float_placement: Option<Placement>,
|
||||||
/// Determines the `Placement` to be used when spawning a window on the floating layer with the
|
/// Determines the `Placement` to be used when spawning a window on the floating layer with the
|
||||||
/// `FloatingLayerBehaviour` set to `FloatingLayerBehaviour::Float` (default: Center)
|
/// `FloatingLayerBehaviour` set to `FloatingLayerBehaviour::Float`
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = Placement::Center)))]
|
||||||
pub floating_layer_placement: Option<Placement>,
|
pub floating_layer_placement: Option<Placement>,
|
||||||
/// Determines the `Placement` to be used when spawning a window with float override active
|
/// Determines the `Placement` to be used when spawning a window with float override active
|
||||||
/// (default: None)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub float_override_placement: Option<Placement>,
|
pub float_override_placement: Option<Placement>,
|
||||||
/// Determines the `Placement` to be used when spawning a window that matches a
|
/// Determines the `Placement` to be used when spawning a window that matches a
|
||||||
/// 'floating_applications' rule (default: None)
|
/// `floating_applications` rule
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub float_rule_placement: Option<Placement>,
|
pub float_rule_placement: Option<Placement>,
|
||||||
/// Determine what happens when a window is moved across a monitor boundary (default: Swap)
|
/// Determine what happens when a window is moved across a monitor boundary
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = MoveBehaviour::Swap)))]
|
||||||
pub cross_monitor_move_behaviour: Option<MoveBehaviour>,
|
pub cross_monitor_move_behaviour: Option<MoveBehaviour>,
|
||||||
/// Determine what happens when an action is called on a window at a monitor boundary (default: Monitor)
|
/// Determine what happens when an action is called on a window at a monitor boundary
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = CrossBoundaryBehaviour::Monitor)))]
|
||||||
pub cross_boundary_behaviour: Option<CrossBoundaryBehaviour>,
|
pub cross_boundary_behaviour: Option<CrossBoundaryBehaviour>,
|
||||||
/// Determine what happens when commands are sent while an unmanaged window is in the foreground (default: Op)
|
/// Determine what happens when commands are sent while an unmanaged window is in the foreground
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = OperationBehaviour::Op)))]
|
||||||
pub unmanaged_window_operation_behaviour: Option<OperationBehaviour>,
|
pub unmanaged_window_operation_behaviour: Option<OperationBehaviour>,
|
||||||
/// END OF LIFE FEATURE: Use https://github.com/LGUG2Z/masir instead
|
/// END OF LIFE FEATURE: Use https://github.com/LGUG2Z/masir instead
|
||||||
|
#[deprecated(
|
||||||
|
note = "End of life feature, use [masir](https://github.com/LGUG2Z/masir) instead"
|
||||||
|
)]
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub focus_follows_mouse: Option<FocusFollowsMouseImplementation>,
|
pub focus_follows_mouse: Option<FocusFollowsMouseImplementation>,
|
||||||
/// Enable or disable mouse follows focus (default: true)
|
/// Enable or disable mouse follows focus
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = DEFAULT_MOUSE_FOLLOWS_FOCUS)))]
|
||||||
pub mouse_follows_focus: Option<bool>,
|
pub mouse_follows_focus: Option<bool>,
|
||||||
/// Path to applications.json from komorebi-application-specific-configurations (default: None)
|
/// Path to applications.json from komorebi-application-specific-configurations
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub app_specific_configuration_path: Option<AppSpecificConfigurationPath>,
|
pub app_specific_configuration_path: Option<AppSpecificConfigurationPath>,
|
||||||
/// Width of the window border (default: 8)
|
/// Width of window borders
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
#[serde(alias = "active_window_border_width")]
|
#[serde(alias = "active_window_border_width")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = border_manager::BORDER_WIDTH)))]
|
||||||
pub border_width: Option<i32>,
|
pub border_width: Option<i32>,
|
||||||
/// Offset of the window border (default: -1)
|
/// Offset of window borders
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
#[serde(alias = "active_window_border_offset")]
|
#[serde(alias = "active_window_border_offset")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = border_manager::BORDER_OFFSET)))]
|
||||||
pub border_offset: Option<i32>,
|
pub border_offset: Option<i32>,
|
||||||
/// Display an active window border (default: true)
|
/// Display window borders
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
#[serde(alias = "active_window_border")]
|
#[serde(alias = "active_window_border")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = border_manager::BORDER_ENABLED)))]
|
||||||
pub border: Option<bool>,
|
pub border: Option<bool>,
|
||||||
/// Active window border colours for different container types
|
/// Window border colours for different container types (has no effect if [`theme`] is defined)
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
#[serde(alias = "active_window_border_colours")]
|
#[serde(alias = "active_window_border_colours")]
|
||||||
pub border_colours: Option<BorderColours>,
|
pub border_colours: Option<BorderColours>,
|
||||||
/// Active window border style (default: System)
|
/// Window border style
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
#[serde(alias = "active_window_border_style")]
|
#[serde(alias = "active_window_border_style")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = BorderStyle::System)))]
|
||||||
pub border_style: Option<BorderStyle>,
|
pub border_style: Option<BorderStyle>,
|
||||||
/// DEPRECATED from v0.1.31: no longer required
|
/// DEPRECATED from v0.1.31: no longer required
|
||||||
|
#[deprecated(note = "No longer required")]
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub border_z_order: Option<ZOrder>,
|
pub border_z_order: Option<ZOrder>,
|
||||||
/// Active window border implementation (default: Komorebi)
|
/// Window border implementation
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = BorderImplementation::Komorebi)))]
|
||||||
pub border_implementation: Option<BorderImplementation>,
|
pub border_implementation: Option<BorderImplementation>,
|
||||||
/// Add transparency to unfocused windows (default: false)
|
/// Add transparency to unfocused windows
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = transparency_manager::TRANSPARENCY_ENABLED)))]
|
||||||
pub transparency: Option<bool>,
|
pub transparency: Option<bool>,
|
||||||
/// Alpha value for unfocused window transparency [[0-255]] (default: 200)
|
/// Alpha value for unfocused window transparency [[0-255]]
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = transparency_manager::TRANSPARENCY_ALPHA)))]
|
||||||
pub transparency_alpha: Option<u8>,
|
pub transparency_alpha: Option<u8>,
|
||||||
/// Individual window transparency ignore rules
|
/// Individual window transparency ignore rules
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub transparency_ignore_rules: Option<Vec<MatchingRule>>,
|
pub transparency_ignore_rules: Option<Vec<MatchingRule>>,
|
||||||
/// Global default workspace padding (default: 10)
|
/// Global default workspace layout for new workspaces
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = DefaultLayout::BSP)))]
|
||||||
|
#[serde(deserialize_with = "crate::default_layout::deserialize_option_none_default_layout")]
|
||||||
|
pub default_workspace_layout: Option<DefaultLayout>,
|
||||||
|
/// Global default workspace padding
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = DEFAULT_WORKSPACE_PADDING)))]
|
||||||
pub default_workspace_padding: Option<i32>,
|
pub default_workspace_padding: Option<i32>,
|
||||||
/// Global default container padding (default: 10)
|
/// Global default container padding
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = DEFAULT_CONTAINER_PADDING)))]
|
||||||
pub default_container_padding: Option<i32>,
|
pub default_container_padding: Option<i32>,
|
||||||
/// Monitor and workspace configurations
|
/// Monitor and workspace configurations
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub monitors: Option<Vec<MonitorConfig>>,
|
pub monitors: Option<Vec<MonitorConfig>>,
|
||||||
/// Which Windows signal to use when hiding windows (default: Cloak)
|
/// Which Windows signal to use when hiding windows
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = HidingBehaviour::Cloak)))]
|
||||||
pub window_hiding_behaviour: Option<HidingBehaviour>,
|
pub window_hiding_behaviour: Option<HidingBehaviour>,
|
||||||
/// Global work area (space used for tiling) offset (default: None)
|
/// Global work area (space used for tiling) offset
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub global_work_area_offset: Option<Rect>,
|
pub global_work_area_offset: Option<Rect>,
|
||||||
/// Individual window floating rules
|
/// Individual window floating rules
|
||||||
@@ -536,13 +597,13 @@ pub struct StaticConfig {
|
|||||||
/// Identify tray and multi-window applications
|
/// Identify tray and multi-window applications
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub tray_and_multi_window_applications: Option<Vec<MatchingRule>>,
|
pub tray_and_multi_window_applications: Option<Vec<MatchingRule>>,
|
||||||
/// Identify applications that have the WS_EX_LAYERED extended window style
|
/// Identify applications that have the `WS_EX_LAYERED` extended window style
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub layered_applications: Option<Vec<MatchingRule>>,
|
pub layered_applications: Option<Vec<MatchingRule>>,
|
||||||
/// Identify applications that send EVENT_OBJECT_NAMECHANGE on launch (very rare)
|
/// Identify applications that send `EVENT_OBJECT_NAMECHANGE` on launch (very rare)
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub object_name_change_applications: Option<Vec<MatchingRule>>,
|
pub object_name_change_applications: Option<Vec<MatchingRule>>,
|
||||||
/// Do not process EVENT_OBJECT_NAMECHANGE events as Show events for identified applications matching these title regexes
|
/// Do not process `EVENT_OBJECT_NAMECHANGE` events as Show events for identified applications matching these title regexes
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub object_name_change_title_ignore_list: Option<Vec<String>>,
|
pub object_name_change_title_ignore_list: Option<Vec<String>>,
|
||||||
/// Set monitor index preferences
|
/// Set monitor index preferences
|
||||||
@@ -558,13 +619,16 @@ pub struct StaticConfig {
|
|||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub animation: Option<AnimationsConfig>,
|
pub animation: Option<AnimationsConfig>,
|
||||||
/// Theme configuration options
|
/// Theme configuration options
|
||||||
|
///
|
||||||
|
/// If a theme is specified, `border_colours` will have no effect
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub theme: Option<KomorebiTheme>,
|
pub theme: Option<KomorebiTheme>,
|
||||||
/// Identify applications which are slow to send initial event notifications
|
/// Identify applications which are slow to send initial event notifications
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub slow_application_identifiers: Option<Vec<MatchingRule>>,
|
pub slow_application_identifiers: Option<Vec<MatchingRule>>,
|
||||||
/// How long to wait when compensating for slow applications, in milliseconds (default: 20)
|
/// How long to wait when compensating for slow applications, in milliseconds
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = SLOW_APPLICATION_COMPENSATION_TIME)))]
|
||||||
pub slow_application_compensation_time: Option<u64>,
|
pub slow_application_compensation_time: Option<u64>,
|
||||||
/// Komorebi status bar configuration files for multiple instances on different monitors
|
/// Komorebi status bar configuration files for multiple instances on different monitors
|
||||||
// this option is a little special because it is only consumed by komorebic
|
// this option is a little special because it is only consumed by komorebic
|
||||||
@@ -577,137 +641,34 @@ pub struct StaticConfig {
|
|||||||
/// Aspect ratio to resize with when toggling floating mode for a window
|
/// Aspect ratio to resize with when toggling floating mode for a window
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub floating_window_aspect_ratio: Option<AspectRatio>,
|
pub floating_window_aspect_ratio: Option<AspectRatio>,
|
||||||
/// Which Windows API behaviour to use when manipulating windows (default: Sync)
|
/// Which Windows API behaviour to use when manipulating windows
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = WindowHandlingBehaviour::Sync)))]
|
||||||
pub window_handling_behaviour: Option<WindowHandlingBehaviour>,
|
pub window_handling_behaviour: Option<WindowHandlingBehaviour>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Animations configuration options
|
||||||
pub struct AnimationsConfig {
|
pub struct AnimationsConfig {
|
||||||
/// Enable or disable animations (default: false)
|
/// Enable or disable animations
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = PerAnimationPrefixConfig::Global(false))))]
|
||||||
pub enabled: PerAnimationPrefixConfig<bool>,
|
pub enabled: PerAnimationPrefixConfig<bool>,
|
||||||
/// Set the animation duration in ms (default: 250)
|
/// Set the animation duration in ms
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = PerAnimationPrefixConfig::Global(250))))]
|
||||||
pub duration: Option<PerAnimationPrefixConfig<u64>>,
|
pub duration: Option<PerAnimationPrefixConfig<u64>>,
|
||||||
/// Set the animation style (default: Linear)
|
/// Set the animation style
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = PerAnimationPrefixConfig::Global(AnimationStyle::Linear))))]
|
||||||
pub style: Option<PerAnimationPrefixConfig<AnimationStyle>>,
|
pub style: Option<PerAnimationPrefixConfig<AnimationStyle>>,
|
||||||
/// Set the animation FPS (default: 60)
|
/// Set the animation FPS
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = ANIMATION_FPS)))]
|
||||||
pub fps: Option<u64>,
|
pub fps: Option<u64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
pub use komorebi_themes::KomorebiTheme;
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
|
||||||
#[serde(tag = "palette")]
|
|
||||||
pub enum KomorebiTheme {
|
|
||||||
/// A theme from catppuccin-egui
|
|
||||||
Catppuccin {
|
|
||||||
/// Name of the Catppuccin theme (theme previews: https://github.com/catppuccin/catppuccin)
|
|
||||||
name: komorebi_themes::Catppuccin,
|
|
||||||
/// Border colour when the container contains a single window (default: Blue)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
single_border: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
/// Border colour when the container contains multiple windows (default: Green)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
stack_border: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
/// Border colour when the container is in monocle mode (default: Pink)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
monocle_border: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
/// Border colour when the window is floating (default: Yellow)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
floating_border: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
/// Border colour when the container is unfocused (default: Base)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
unfocused_border: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
/// Border colour when the container is unfocused and locked (default: Red)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
unfocused_locked_border: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
/// Stackbar focused tab text colour (default: Green)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
stackbar_focused_text: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
/// Stackbar unfocused tab text colour (default: Text)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
stackbar_unfocused_text: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
/// Stackbar tab background colour (default: Base)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
stackbar_background: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
/// Komorebi status bar accent (default: Blue)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
bar_accent: Option<komorebi_themes::CatppuccinValue>,
|
|
||||||
},
|
|
||||||
/// A theme from base16-egui-themes
|
|
||||||
Base16 {
|
|
||||||
/// Name of the Base16 theme (theme previews: https://tinted-theming.github.io/tinted-gallery/)
|
|
||||||
name: komorebi_themes::Base16,
|
|
||||||
/// Border colour when the container contains a single window (default: Base0D)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
single_border: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Border colour when the container contains multiple windows (default: Base0B)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
stack_border: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Border colour when the container is in monocle mode (default: Base0F)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
monocle_border: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Border colour when the window is floating (default: Base09)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
floating_border: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Border colour when the container is unfocused (default: Base01)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
unfocused_border: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Border colour when the container is unfocused and locked (default: Base08)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
unfocused_locked_border: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Stackbar focused tab text colour (default: Base0B)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
stackbar_focused_text: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Stackbar unfocused tab text colour (default: Base05)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
stackbar_unfocused_text: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Stackbar tab background colour (default: Base01)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
stackbar_background: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Komorebi status bar accent (default: Base0D)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
bar_accent: Option<komorebi_themes::Base16Value>,
|
|
||||||
},
|
|
||||||
/// A custom Base16 theme
|
|
||||||
Custom {
|
|
||||||
/// Colours of the custom Base16 theme palette
|
|
||||||
colours: Box<komorebi_themes::Base16ColourPalette>,
|
|
||||||
/// Border colour when the container contains a single window (default: Base0D)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
single_border: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Border colour when the container contains multiple windows (default: Base0B)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
stack_border: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Border colour when the container is in monocle mode (default: Base0F)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
monocle_border: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Border colour when the window is floating (default: Base09)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
floating_border: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Border colour when the container is unfocused (default: Base01)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
unfocused_border: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Border colour when the container is unfocused and locked (default: Base08)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
unfocused_locked_border: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Stackbar focused tab text colour (default: Base0B)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
stackbar_focused_text: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Stackbar unfocused tab text colour (default: Base05)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
stackbar_unfocused_text: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Stackbar tab background colour (default: Base01)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
stackbar_background: Option<komorebi_themes::Base16Value>,
|
|
||||||
/// Komorebi status bar accent (default: Base0D)
|
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
|
||||||
bar_accent: Option<komorebi_themes::Base16Value>,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
impl StaticConfig {
|
impl StaticConfig {
|
||||||
pub fn end_of_life(raw: &str) {
|
pub fn end_of_life(raw: &str) {
|
||||||
@@ -796,6 +757,7 @@ impl StaticConfig {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Stackbar tabs configuration
|
||||||
pub struct TabsConfig {
|
pub struct TabsConfig {
|
||||||
/// Width of a stackbar tab
|
/// Width of a stackbar tab
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
@@ -819,6 +781,7 @@ pub struct TabsConfig {
|
|||||||
|
|
||||||
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Stackbar configuration
|
||||||
pub struct StackbarConfig {
|
pub struct StackbarConfig {
|
||||||
/// Stackbar height
|
/// Stackbar height
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
@@ -826,8 +789,9 @@ pub struct StackbarConfig {
|
|||||||
/// Stackbar label
|
/// Stackbar label
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub label: Option<StackbarLabel>,
|
pub label: Option<StackbarLabel>,
|
||||||
/// Stackbar mode (default: Never)
|
/// Stackbar mode
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(extend("default" = StackbarMode::Never)))]
|
||||||
pub mode: Option<StackbarMode>,
|
pub mode: Option<StackbarMode>,
|
||||||
/// Stackbar tab configuration options
|
/// Stackbar tab configuration options
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
@@ -862,6 +826,7 @@ impl From<&WindowManager> for StaticConfig {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
|
#[allow(deprecated)]
|
||||||
invisible_borders: None,
|
invisible_borders: None,
|
||||||
resize_delta: Option::from(value.resize_delta),
|
resize_delta: Option::from(value.resize_delta),
|
||||||
window_container_behaviour: Option::from(
|
window_container_behaviour: Option::from(
|
||||||
@@ -890,6 +855,7 @@ impl From<&WindowManager> for StaticConfig {
|
|||||||
),
|
),
|
||||||
minimum_window_height: Some(window::MINIMUM_HEIGHT.load(Ordering::SeqCst)),
|
minimum_window_height: Some(window::MINIMUM_HEIGHT.load(Ordering::SeqCst)),
|
||||||
minimum_window_width: Some(window::MINIMUM_WIDTH.load(Ordering::SeqCst)),
|
minimum_window_width: Some(window::MINIMUM_WIDTH.load(Ordering::SeqCst)),
|
||||||
|
#[allow(deprecated)]
|
||||||
focus_follows_mouse: value.focus_follows_mouse,
|
focus_follows_mouse: value.focus_follows_mouse,
|
||||||
mouse_follows_focus: Option::from(value.mouse_follows_focus),
|
mouse_follows_focus: Option::from(value.mouse_follows_focus),
|
||||||
app_specific_configuration_path: None,
|
app_specific_configuration_path: None,
|
||||||
@@ -905,6 +871,7 @@ impl From<&WindowManager> for StaticConfig {
|
|||||||
),
|
),
|
||||||
transparency_ignore_rules: None,
|
transparency_ignore_rules: None,
|
||||||
border_style: Option::from(STYLE.load()),
|
border_style: Option::from(STYLE.load()),
|
||||||
|
#[allow(deprecated)]
|
||||||
border_z_order: None,
|
border_z_order: None,
|
||||||
border_implementation: Option::from(IMPLEMENTATION.load()),
|
border_implementation: Option::from(IMPLEMENTATION.load()),
|
||||||
default_workspace_padding: Option::from(
|
default_workspace_padding: Option::from(
|
||||||
@@ -946,6 +913,7 @@ impl From<&WindowManager> for StaticConfig {
|
|||||||
remove_titlebar_applications: Option::from(NO_TITLEBAR.lock().clone()),
|
remove_titlebar_applications: Option::from(NO_TITLEBAR.lock().clone()),
|
||||||
floating_window_aspect_ratio: Option::from(*FLOATING_WINDOW_TOGGLE_ASPECT_RATIO.lock()),
|
floating_window_aspect_ratio: Option::from(*FLOATING_WINDOW_TOGGLE_ASPECT_RATIO.lock()),
|
||||||
window_handling_behaviour: Option::from(WINDOW_HANDLING_BEHAVIOUR.load()),
|
window_handling_behaviour: Option::from(WINDOW_HANDLING_BEHAVIOUR.load()),
|
||||||
|
default_workspace_layout: DEFAULT_WORKSPACE_LAYOUT.load(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1024,13 +992,23 @@ impl StaticConfig {
|
|||||||
DEFAULT_CONTAINER_PADDING.store(container, Ordering::SeqCst);
|
DEFAULT_CONTAINER_PADDING.store(container, Ordering::SeqCst);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DEFAULT_WORKSPACE_LAYOUT.store(self.default_workspace_layout);
|
||||||
|
|
||||||
if let Some(workspace) = self.default_workspace_padding {
|
if let Some(workspace) = self.default_workspace_padding {
|
||||||
DEFAULT_WORKSPACE_PADDING.store(workspace, Ordering::SeqCst);
|
DEFAULT_WORKSPACE_PADDING.store(workspace, Ordering::SeqCst);
|
||||||
}
|
}
|
||||||
|
|
||||||
border_manager::BORDER_WIDTH.store(self.border_width.unwrap_or(8), Ordering::SeqCst);
|
if let Some(border_width) = self.border_width {
|
||||||
border_manager::BORDER_OFFSET.store(self.border_offset.unwrap_or(-1), Ordering::SeqCst);
|
border_manager::BORDER_WIDTH.store(border_width, Ordering::SeqCst);
|
||||||
border_manager::BORDER_ENABLED.store(self.border.unwrap_or(true), Ordering::SeqCst);
|
}
|
||||||
|
|
||||||
|
if let Some(border_offset) = self.border_offset {
|
||||||
|
border_manager::BORDER_OFFSET.store(border_offset, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(border_enabled) = self.border {
|
||||||
|
border_manager::BORDER_ENABLED.store(border_enabled, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(colours) = &self.border_colours {
|
if let Some(colours) = &self.border_colours {
|
||||||
if let Some(single) = colours.single {
|
if let Some(single) = colours.single {
|
||||||
@@ -1084,10 +1062,14 @@ impl StaticConfig {
|
|||||||
border_manager::send_notification(None);
|
border_manager::send_notification(None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(transparency_enabled) = self.transparency {
|
||||||
transparency_manager::TRANSPARENCY_ENABLED
|
transparency_manager::TRANSPARENCY_ENABLED
|
||||||
.store(self.transparency.unwrap_or(false), Ordering::SeqCst);
|
.store(transparency_enabled, Ordering::SeqCst);
|
||||||
transparency_manager::TRANSPARENCY_ALPHA
|
}
|
||||||
.store(self.transparency_alpha.unwrap_or(200), Ordering::SeqCst);
|
|
||||||
|
if let Some(transparency_alpha) = self.transparency_alpha {
|
||||||
|
transparency_manager::TRANSPARENCY_ALPHA.store(transparency_alpha, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
|
||||||
let mut ignore_identifiers = IGNORE_IDENTIFIERS.lock();
|
let mut ignore_identifiers = IGNORE_IDENTIFIERS.lock();
|
||||||
let mut regex_identifiers = REGEX_IDENTIFIERS.lock();
|
let mut regex_identifiers = REGEX_IDENTIFIERS.lock();
|
||||||
@@ -1311,9 +1293,12 @@ impl StaticConfig {
|
|||||||
unmanaged_window_operation_behaviour: value
|
unmanaged_window_operation_behaviour: value
|
||||||
.unmanaged_window_operation_behaviour
|
.unmanaged_window_operation_behaviour
|
||||||
.unwrap_or(OperationBehaviour::Op),
|
.unwrap_or(OperationBehaviour::Op),
|
||||||
resize_delta: value.resize_delta.unwrap_or(50),
|
resize_delta: value.resize_delta.unwrap_or(DEFAULT_RESIZE_DELTA),
|
||||||
|
#[allow(deprecated)]
|
||||||
focus_follows_mouse: value.focus_follows_mouse,
|
focus_follows_mouse: value.focus_follows_mouse,
|
||||||
mouse_follows_focus: value.mouse_follows_focus.unwrap_or(true),
|
mouse_follows_focus: value
|
||||||
|
.mouse_follows_focus
|
||||||
|
.unwrap_or(DEFAULT_MOUSE_FOLLOWS_FOCUS),
|
||||||
hotwatch: Hotwatch::new()?,
|
hotwatch: Hotwatch::new()?,
|
||||||
has_pending_raise_op: false,
|
has_pending_raise_op: false,
|
||||||
pending_move_op: Arc::new(None),
|
pending_move_op: Arc::new(None),
|
||||||
@@ -1322,6 +1307,7 @@ impl StaticConfig {
|
|||||||
known_hwnds: HashMap::new(),
|
known_hwnds: HashMap::new(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
match value.focus_follows_mouse {
|
match value.focus_follows_mouse {
|
||||||
None => WindowsApi::disable_focus_follows_mouse()?,
|
None => WindowsApi::disable_focus_follows_mouse()?,
|
||||||
Some(FocusFollowsMouseImplementation::Windows) => {
|
Some(FocusFollowsMouseImplementation::Windows) => {
|
||||||
@@ -1679,7 +1665,10 @@ impl StaticConfig {
|
|||||||
|
|
||||||
wm.enforce_workspace_rules()?;
|
wm.enforce_workspace_rules()?;
|
||||||
|
|
||||||
border_manager::BORDER_ENABLED.store(value.border.unwrap_or(true), Ordering::SeqCst);
|
if let Some(border_enabled) = value.border {
|
||||||
|
border_manager::BORDER_ENABLED.store(border_enabled, Ordering::SeqCst);
|
||||||
|
}
|
||||||
|
|
||||||
wm.window_management_behaviour.current_behaviour =
|
wm.window_management_behaviour.current_behaviour =
|
||||||
value.window_container_behaviour.unwrap_or_default();
|
value.window_container_behaviour.unwrap_or_default();
|
||||||
wm.window_management_behaviour.float_override = value.float_override.unwrap_or_default();
|
wm.window_management_behaviour.float_override = value.float_override.unwrap_or_default();
|
||||||
@@ -1699,10 +1688,15 @@ impl StaticConfig {
|
|||||||
wm.unmanaged_window_operation_behaviour = value
|
wm.unmanaged_window_operation_behaviour = value
|
||||||
.unmanaged_window_operation_behaviour
|
.unmanaged_window_operation_behaviour
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
wm.resize_delta = value.resize_delta.unwrap_or(50);
|
wm.resize_delta = value.resize_delta.unwrap_or(DEFAULT_RESIZE_DELTA);
|
||||||
wm.mouse_follows_focus = value.mouse_follows_focus.unwrap_or(true);
|
wm.mouse_follows_focus = value
|
||||||
|
.mouse_follows_focus
|
||||||
|
.unwrap_or(DEFAULT_MOUSE_FOLLOWS_FOCUS);
|
||||||
wm.work_area_offset = value.global_work_area_offset;
|
wm.work_area_offset = value.global_work_area_offset;
|
||||||
|
#[allow(deprecated)]
|
||||||
|
{
|
||||||
wm.focus_follows_mouse = value.focus_follows_mouse;
|
wm.focus_follows_mouse = value.focus_follows_mouse;
|
||||||
|
}
|
||||||
|
|
||||||
match wm.focus_follows_mouse {
|
match wm.focus_follows_mouse {
|
||||||
None => WindowsApi::disable_focus_follows_mouse()?,
|
None => WindowsApi::disable_focus_follows_mouse()?,
|
||||||
@@ -1969,6 +1963,7 @@ mod tests {
|
|||||||
"#;
|
"#;
|
||||||
let config = serde_json::from_str::<WorkspaceConfig>(config).unwrap();
|
let config = serde_json::from_str::<WorkspaceConfig>(config).unwrap();
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
let custom_layout_rules = config.custom_layout_rules.unwrap();
|
let custom_layout_rules = config.custom_layout_rules.unwrap();
|
||||||
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
@@ -1985,7 +1980,10 @@ mod tests {
|
|||||||
"name": "Test",
|
"name": "Test",
|
||||||
}
|
}
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
let config = serde_json::from_str::<WorkspaceConfig>(config).unwrap();
|
let config = serde_json::from_str::<WorkspaceConfig>(config).unwrap();
|
||||||
assert_eq!(config.custom_layout_rules, None);
|
#[allow(deprecated)]
|
||||||
|
let custom_layout_rules = config.custom_layout_rules;
|
||||||
|
assert_eq!(custom_layout_rules, None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ use crossbeam_channel::Receiver;
|
|||||||
use crossbeam_channel::Sender;
|
use crossbeam_channel::Sender;
|
||||||
use crossbeam_utils::atomic::AtomicCell;
|
use crossbeam_utils::atomic::AtomicCell;
|
||||||
use komorebi_themes::Base16Wrapper;
|
use komorebi_themes::Base16Wrapper;
|
||||||
|
use komorebi_themes::KomorebiThemeBase16 as Base16;
|
||||||
|
use komorebi_themes::KomorebiThemeCatppuccin as Catppuccin;
|
||||||
|
use komorebi_themes::KomorebiThemeCustom as Custom;
|
||||||
use komorebi_themes::colour::Colour;
|
use komorebi_themes::colour::Colour;
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::sync::OnceLock;
|
use std::sync::OnceLock;
|
||||||
@@ -84,7 +87,7 @@ pub fn handle_notifications() -> color_eyre::Result<()> {
|
|||||||
stackbar_unfocused_text,
|
stackbar_unfocused_text,
|
||||||
stackbar_background,
|
stackbar_background,
|
||||||
) = match theme {
|
) = match theme {
|
||||||
KomorebiTheme::Catppuccin {
|
KomorebiTheme::Catppuccin(Catppuccin {
|
||||||
name,
|
name,
|
||||||
single_border,
|
single_border,
|
||||||
stack_border,
|
stack_border,
|
||||||
@@ -96,7 +99,7 @@ pub fn handle_notifications() -> color_eyre::Result<()> {
|
|||||||
stackbar_unfocused_text,
|
stackbar_unfocused_text,
|
||||||
stackbar_background,
|
stackbar_background,
|
||||||
..
|
..
|
||||||
} => {
|
}) => {
|
||||||
let single_border = single_border
|
let single_border = single_border
|
||||||
.unwrap_or(komorebi_themes::CatppuccinValue::Blue)
|
.unwrap_or(komorebi_themes::CatppuccinValue::Blue)
|
||||||
.color32(name.as_theme());
|
.color32(name.as_theme());
|
||||||
@@ -145,7 +148,7 @@ pub fn handle_notifications() -> color_eyre::Result<()> {
|
|||||||
stackbar_background,
|
stackbar_background,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
KomorebiTheme::Base16 {
|
KomorebiTheme::Base16(Base16 {
|
||||||
name,
|
name,
|
||||||
single_border,
|
single_border,
|
||||||
stack_border,
|
stack_border,
|
||||||
@@ -157,7 +160,7 @@ pub fn handle_notifications() -> color_eyre::Result<()> {
|
|||||||
stackbar_unfocused_text,
|
stackbar_unfocused_text,
|
||||||
stackbar_background,
|
stackbar_background,
|
||||||
..
|
..
|
||||||
} => {
|
}) => {
|
||||||
let single_border = single_border
|
let single_border = single_border
|
||||||
.unwrap_or(komorebi_themes::Base16Value::Base0D)
|
.unwrap_or(komorebi_themes::Base16Value::Base0D)
|
||||||
.color32(Base16Wrapper::Base16(*name));
|
.color32(Base16Wrapper::Base16(*name));
|
||||||
@@ -206,7 +209,7 @@ pub fn handle_notifications() -> color_eyre::Result<()> {
|
|||||||
stackbar_background,
|
stackbar_background,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
KomorebiTheme::Custom {
|
KomorebiTheme::Custom(Custom {
|
||||||
colours,
|
colours,
|
||||||
single_border,
|
single_border,
|
||||||
stack_border,
|
stack_border,
|
||||||
@@ -218,7 +221,7 @@ pub fn handle_notifications() -> color_eyre::Result<()> {
|
|||||||
stackbar_unfocused_text,
|
stackbar_unfocused_text,
|
||||||
stackbar_background,
|
stackbar_background,
|
||||||
..
|
..
|
||||||
} => {
|
}) => {
|
||||||
let single_border = single_border
|
let single_border = single_border
|
||||||
.unwrap_or(komorebi_themes::Base16Value::Base0D)
|
.unwrap_or(komorebi_themes::Base16Value::Base0D)
|
||||||
.color32(Base16Wrapper::Custom(colours.clone()));
|
.color32(Base16Wrapper::Custom(colours.clone()));
|
||||||
|
|||||||
+10
-2
@@ -302,10 +302,13 @@ impl RenderDispatcher for TransparencyRenderDispatcher {
|
|||||||
#[derive(Copy, Clone, Debug, Display, EnumString, Serialize, Deserialize, PartialEq)]
|
#[derive(Copy, Clone, Debug, Display, EnumString, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
|
/// Aspect ratio for temporarily floating windows
|
||||||
pub enum AspectRatio {
|
pub enum AspectRatio {
|
||||||
/// A predefined aspect ratio
|
/// Predefined aspect ratio
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Predefined"))]
|
||||||
Predefined(PredefinedAspectRatio),
|
Predefined(PredefinedAspectRatio),
|
||||||
/// A custom W:H aspect ratio
|
/// Custom W:H aspect ratio
|
||||||
|
#[cfg_attr(feature = "schemars", schemars(title = "Custom"))]
|
||||||
Custom(i32, i32),
|
Custom(i32, i32),
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,6 +320,7 @@ impl Default for AspectRatio {
|
|||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Default, Display, EnumString, Serialize, Deserialize, PartialEq)]
|
#[derive(Copy, Clone, Debug, Default, Display, EnumString, Serialize, Deserialize, PartialEq)]
|
||||||
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
|
/// Predefined aspect ratio
|
||||||
pub enum PredefinedAspectRatio {
|
pub enum PredefinedAspectRatio {
|
||||||
/// 21:9
|
/// 21:9
|
||||||
Ultrawide,
|
Ultrawide,
|
||||||
@@ -491,6 +495,8 @@ impl Window {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let hiding_behaviour = HIDING_BEHAVIOUR.lock();
|
let hiding_behaviour = HIDING_BEHAVIOUR.lock();
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
match *hiding_behaviour {
|
match *hiding_behaviour {
|
||||||
HidingBehaviour::Hide => WindowsApi::hide_window(self.hwnd),
|
HidingBehaviour::Hide => WindowsApi::hide_window(self.hwnd),
|
||||||
HidingBehaviour::Minimize => WindowsApi::minimize_window(self.hwnd),
|
HidingBehaviour::Minimize => WindowsApi::minimize_window(self.hwnd),
|
||||||
@@ -515,6 +521,8 @@ impl Window {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let hiding_behaviour = HIDING_BEHAVIOUR.lock();
|
let hiding_behaviour = HIDING_BEHAVIOUR.lock();
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
match *hiding_behaviour {
|
match *hiding_behaviour {
|
||||||
HidingBehaviour::Hide | HidingBehaviour::Minimize => {
|
HidingBehaviour::Hide | HidingBehaviour::Minimize => {
|
||||||
WindowsApi::restore_window(self.hwnd);
|
WindowsApi::restore_window(self.hwnd);
|
||||||
|
|||||||
@@ -3876,6 +3876,7 @@ impl WindowManager {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
use crate::DEFAULT_WORKSPACE_LAYOUT;
|
||||||
use crate::monitor;
|
use crate::monitor;
|
||||||
use crossbeam_channel::Sender;
|
use crossbeam_channel::Sender;
|
||||||
use crossbeam_channel::bounded;
|
use crossbeam_channel::bounded;
|
||||||
@@ -5202,6 +5203,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_toggle_tiling() {
|
fn test_toggle_tiling() {
|
||||||
let (mut wm, _context) = setup_window_manager();
|
let (mut wm, _context) = setup_window_manager();
|
||||||
|
DEFAULT_WORKSPACE_LAYOUT.store(Some(DefaultLayout::BSP));
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut m = monitor::new(
|
let mut m = monitor::new(
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ use std::mem::size_of;
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use windows::Win32::Foundation::COLORREF;
|
use windows::Win32::Foundation::COLORREF;
|
||||||
use windows::Win32::Foundation::CloseHandle;
|
use windows::Win32::Foundation::CloseHandle;
|
||||||
|
use windows::Win32::Foundation::GetLastError;
|
||||||
use windows::Win32::Foundation::HANDLE;
|
use windows::Win32::Foundation::HANDLE;
|
||||||
use windows::Win32::Foundation::HINSTANCE;
|
use windows::Win32::Foundation::HINSTANCE;
|
||||||
use windows::Win32::Foundation::HMODULE;
|
use windows::Win32::Foundation::HMODULE;
|
||||||
@@ -17,6 +18,8 @@ use windows::Win32::Foundation::HWND;
|
|||||||
use windows::Win32::Foundation::LPARAM;
|
use windows::Win32::Foundation::LPARAM;
|
||||||
use windows::Win32::Foundation::POINT;
|
use windows::Win32::Foundation::POINT;
|
||||||
use windows::Win32::Foundation::RECT;
|
use windows::Win32::Foundation::RECT;
|
||||||
|
use windows::Win32::Foundation::SetLastError;
|
||||||
|
use windows::Win32::Foundation::WIN32_ERROR;
|
||||||
use windows::Win32::Foundation::WPARAM;
|
use windows::Win32::Foundation::WPARAM;
|
||||||
use windows::Win32::Graphics::Dwm::DWM_CLOAKED_APP;
|
use windows::Win32::Graphics::Dwm::DWM_CLOAKED_APP;
|
||||||
use windows::Win32::Graphics::Dwm::DWM_CLOAKED_INHERITED;
|
use windows::Win32::Graphics::Dwm::DWM_CLOAKED_INHERITED;
|
||||||
@@ -911,18 +914,42 @@ impl WindowsApi {
|
|||||||
fn window_long_ptr_w(hwnd: HWND, index: WINDOW_LONG_PTR_INDEX) -> eyre::Result<isize> {
|
fn window_long_ptr_w(hwnd: HWND, index: WINDOW_LONG_PTR_INDEX) -> eyre::Result<isize> {
|
||||||
// Can return 0, which does not always mean that an error has occurred
|
// Can return 0, which does not always mean that an error has occurred
|
||||||
// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowlongptrw
|
// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowlongptrw
|
||||||
Result::from(WindowsResult::from(unsafe {
|
unsafe {
|
||||||
GetWindowLongPtrW(hwnd, index)
|
SetLastError(WIN32_ERROR(0));
|
||||||
}))
|
let result = GetWindowLongPtrW(hwnd, index);
|
||||||
|
|
||||||
|
if result != 0 {
|
||||||
|
Ok(result)
|
||||||
|
} else {
|
||||||
|
let last_error = GetLastError();
|
||||||
|
if last_error == WIN32_ERROR(0) {
|
||||||
|
Ok(0)
|
||||||
|
} else {
|
||||||
|
Err(std::io::Error::from_raw_os_error(last_error.0 as i32).into())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_pointer_width = "32")]
|
#[cfg(target_pointer_width = "32")]
|
||||||
fn window_long_ptr_w(hwnd: HWND, index: WINDOW_LONG_PTR_INDEX) -> eyre::Result<i32> {
|
fn window_long_ptr_w(hwnd: HWND, index: WINDOW_LONG_PTR_INDEX) -> eyre::Result<i32> {
|
||||||
// Can return 0, which does not always mean that an error has occurred
|
// Can return 0, which does not always mean that an error has occurred
|
||||||
// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowlongptrw
|
// https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowlongptrw
|
||||||
Result::from(WindowsResult::from(unsafe {
|
unsafe {
|
||||||
GetWindowLongPtrW(hwnd, index)
|
SetLastError(WIN32_ERROR(0));
|
||||||
}))
|
let result = GetWindowLongPtrW(hwnd, index);
|
||||||
|
|
||||||
|
if result != 0 {
|
||||||
|
Ok(result)
|
||||||
|
} else {
|
||||||
|
let last_error = GetLastError();
|
||||||
|
if last_error == WIN32_ERROR(0) {
|
||||||
|
Ok(0)
|
||||||
|
} else {
|
||||||
|
Err(std::io::Error::from_raw_os_error(last_error.0 as i32).into())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_pointer_width = "64")]
|
#[cfg(target_pointer_width = "64")]
|
||||||
|
|||||||
+23
-13
@@ -8,6 +8,7 @@ use std::sync::atomic::Ordering;
|
|||||||
|
|
||||||
use crate::DATA_DIR;
|
use crate::DATA_DIR;
|
||||||
use crate::DEFAULT_CONTAINER_PADDING;
|
use crate::DEFAULT_CONTAINER_PADDING;
|
||||||
|
use crate::DEFAULT_WORKSPACE_LAYOUT;
|
||||||
use crate::DEFAULT_WORKSPACE_PADDING;
|
use crate::DEFAULT_WORKSPACE_PADDING;
|
||||||
use crate::FloatingLayerBehaviour;
|
use crate::FloatingLayerBehaviour;
|
||||||
use crate::INITIAL_CONFIGURATION_LOADED;
|
use crate::INITIAL_CONFIGURATION_LOADED;
|
||||||
@@ -40,6 +41,7 @@ use crate::windows_api::WindowsApi;
|
|||||||
use color_eyre::eyre;
|
use color_eyre::eyre;
|
||||||
use color_eyre::eyre::OptionExt;
|
use color_eyre::eyre::OptionExt;
|
||||||
use komorebi_themes::Base16ColourPalette;
|
use komorebi_themes::Base16ColourPalette;
|
||||||
|
use komorebi_themes::KomorebiThemeCustom as Custom;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use uds_windows::UnixStream;
|
use uds_windows::UnixStream;
|
||||||
@@ -106,6 +108,8 @@ impl_ring_elements!(Workspace, Window, "floating_window");
|
|||||||
|
|
||||||
impl Default for Workspace {
|
impl Default for Workspace {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
|
let default_layout = DEFAULT_WORKSPACE_LAYOUT.load();
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
name: None,
|
name: None,
|
||||||
containers: Ring::default(),
|
containers: Ring::default(),
|
||||||
@@ -114,7 +118,7 @@ impl Default for Workspace {
|
|||||||
maximized_window_restore_idx: None,
|
maximized_window_restore_idx: None,
|
||||||
monocle_container_restore_idx: None,
|
monocle_container_restore_idx: None,
|
||||||
floating_windows: Ring::default(),
|
floating_windows: Ring::default(),
|
||||||
layout: Layout::Default(DefaultLayout::BSP),
|
layout: Layout::Default(default_layout.unwrap_or(DefaultLayout::BSP)),
|
||||||
layout_options: None,
|
layout_options: None,
|
||||||
layout_rules: vec![],
|
layout_rules: vec![],
|
||||||
layout_flip: None,
|
layout_flip: None,
|
||||||
@@ -122,7 +126,7 @@ impl Default for Workspace {
|
|||||||
container_padding: Option::from(DEFAULT_CONTAINER_PADDING.load(Ordering::SeqCst)),
|
container_padding: Option::from(DEFAULT_CONTAINER_PADDING.load(Ordering::SeqCst)),
|
||||||
latest_layout: vec![],
|
latest_layout: vec![],
|
||||||
resize_dimensions: vec![],
|
resize_dimensions: vec![],
|
||||||
tile: true,
|
tile: default_layout.is_some(),
|
||||||
work_area_offset: None,
|
work_area_offset: None,
|
||||||
apply_window_based_work_area_offset: true,
|
apply_window_based_work_area_offset: true,
|
||||||
window_container_behaviour: None,
|
window_container_behaviour: None,
|
||||||
@@ -174,14 +178,19 @@ impl Workspace {
|
|||||||
self.layout = Layout::Default(*layout);
|
self.layout = Layout::Default(*layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
if let Some(pathbuf) = &config.custom_layout {
|
if let Some(pathbuf) = &config.custom_layout {
|
||||||
let layout = CustomLayout::from_path(pathbuf)?;
|
let layout = CustomLayout::from_path(pathbuf)?;
|
||||||
self.layout = Layout::Custom(layout);
|
self.layout = Layout::Custom(layout);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.tile =
|
#[allow(deprecated)]
|
||||||
!(config.custom_layout.is_none() && config.layout.is_none() && config.tile.is_none()
|
{
|
||||||
|
self.tile = !(config.custom_layout.is_none()
|
||||||
|
&& config.layout.is_none()
|
||||||
|
&& config.tile.is_none()
|
||||||
|| config.tile.is_some_and(|tile| !tile));
|
|| config.tile.is_some_and(|tile| !tile));
|
||||||
|
}
|
||||||
|
|
||||||
let mut all_layout_rules = vec![];
|
let mut all_layout_rules = vec![];
|
||||||
if let Some(layout_rules) = &config.layout_rules {
|
if let Some(layout_rules) = &config.layout_rules {
|
||||||
@@ -195,6 +204,7 @@ impl Workspace {
|
|||||||
|
|
||||||
self.layout_rules = all_layout_rules.clone();
|
self.layout_rules = all_layout_rules.clone();
|
||||||
|
|
||||||
|
#[allow(deprecated)]
|
||||||
if let Some(layout_rules) = &config.custom_layout_rules {
|
if let Some(layout_rules) = &config.custom_layout_rules {
|
||||||
for (count, pathbuf) in layout_rules {
|
for (count, pathbuf) in layout_rules {
|
||||||
let rule = CustomLayout::from_path(pathbuf)?;
|
let rule = CustomLayout::from_path(pathbuf)?;
|
||||||
@@ -328,7 +338,7 @@ impl Workspace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(palette) = base16_palette {
|
if let Some(palette) = base16_palette {
|
||||||
let komorebi_theme = KomorebiTheme::Custom {
|
let komorebi_theme = KomorebiTheme::Custom(Custom {
|
||||||
colours: Box::new(palette),
|
colours: Box::new(palette),
|
||||||
single_border: wallpaper
|
single_border: wallpaper
|
||||||
.theme_options
|
.theme_options
|
||||||
@@ -367,7 +377,7 @@ impl Workspace {
|
|||||||
.as_ref()
|
.as_ref()
|
||||||
.and_then(|o| o.stackbar_background),
|
.and_then(|o| o.stackbar_background),
|
||||||
bar_accent: wallpaper.theme_options.as_ref().and_then(|o| o.bar_accent),
|
bar_accent: wallpaper.theme_options.as_ref().and_then(|o| o.bar_accent),
|
||||||
};
|
});
|
||||||
|
|
||||||
let bytes = SocketMessage::Theme(Box::new(komorebi_theme)).as_bytes()?;
|
let bytes = SocketMessage::Theme(Box::new(komorebi_theme)).as_bytes()?;
|
||||||
|
|
||||||
@@ -1264,7 +1274,7 @@ impl Workspace {
|
|||||||
0 | 1 => self.enforce_no_resize(),
|
0 | 1 => self.enforce_no_resize(),
|
||||||
_ => {
|
_ => {
|
||||||
// Zero is actually on the left
|
// Zero is actually on the left
|
||||||
if let Some(mut left) = resize_dimensions[0] {
|
if let Some(left) = resize_dimensions[0].as_mut() {
|
||||||
left.top = 0;
|
left.top = 0;
|
||||||
left.bottom = 0;
|
left.bottom = 0;
|
||||||
left.left = 0;
|
left.left = 0;
|
||||||
@@ -1297,7 +1307,7 @@ impl Workspace {
|
|||||||
0 | 1 => self.enforce_no_resize(),
|
0 | 1 => self.enforce_no_resize(),
|
||||||
_ => {
|
_ => {
|
||||||
// Zero is actually on the right
|
// Zero is actually on the right
|
||||||
if let Some(mut left) = resize_dimensions[1] {
|
if let Some(left) = resize_dimensions[1].as_mut() {
|
||||||
left.top = 0;
|
left.top = 0;
|
||||||
left.bottom = 0;
|
left.bottom = 0;
|
||||||
left.right = 0;
|
left.right = 0;
|
||||||
@@ -1328,7 +1338,7 @@ impl Workspace {
|
|||||||
match resize_dimensions.len() {
|
match resize_dimensions.len() {
|
||||||
0 | 1 => self.enforce_no_resize(),
|
0 | 1 => self.enforce_no_resize(),
|
||||||
_ => {
|
_ => {
|
||||||
if let Some(mut left) = resize_dimensions[0] {
|
if let Some(left) = resize_dimensions[0].as_mut() {
|
||||||
left.top = 0;
|
left.top = 0;
|
||||||
left.left = 0;
|
left.left = 0;
|
||||||
left.right = 0;
|
left.right = 0;
|
||||||
@@ -1359,14 +1369,14 @@ impl Workspace {
|
|||||||
// Two windows can only be resized in the middle
|
// Two windows can only be resized in the middle
|
||||||
2 => {
|
2 => {
|
||||||
// Zero is actually on the right
|
// Zero is actually on the right
|
||||||
if let Some(mut right) = resize_dimensions[0] {
|
if let Some(right) = resize_dimensions[0].as_mut() {
|
||||||
right.top = 0;
|
right.top = 0;
|
||||||
right.bottom = 0;
|
right.bottom = 0;
|
||||||
right.right = 0;
|
right.right = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// One is on the left
|
// One is on the left
|
||||||
if let Some(mut left) = resize_dimensions[1] {
|
if let Some(left) = resize_dimensions[1].as_mut() {
|
||||||
left.top = 0;
|
left.top = 0;
|
||||||
left.bottom = 0;
|
left.bottom = 0;
|
||||||
left.left = 0;
|
left.left = 0;
|
||||||
@@ -1376,13 +1386,13 @@ impl Workspace {
|
|||||||
// stack on the right
|
// stack on the right
|
||||||
_ => {
|
_ => {
|
||||||
// Central can be resized left or right
|
// Central can be resized left or right
|
||||||
if let Some(mut right) = resize_dimensions[0] {
|
if let Some(right) = resize_dimensions[0].as_mut() {
|
||||||
right.top = 0;
|
right.top = 0;
|
||||||
right.bottom = 0;
|
right.bottom = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Left one can only be resized to the right
|
// Left one can only be resized to the right
|
||||||
if let Some(mut left) = resize_dimensions[1] {
|
if let Some(left) = resize_dimensions[1].as_mut() {
|
||||||
left.top = 0;
|
left.top = 0;
|
||||||
left.bottom = 0;
|
left.bottom = 0;
|
||||||
left.left = 0;
|
left.left = 0;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "komorebic-no-console"
|
name = "komorebic-no-console"
|
||||||
version = "0.1.39"
|
version = "0.1.40"
|
||||||
description = "The command-line interface (without a console) for Komorebi, a tiling window manager for Windows"
|
description = "The command-line interface (without a console) for Komorebi, a tiling window manager for Windows"
|
||||||
repository = "https://github.com/LGUG2Z/komorebi"
|
repository = "https://github.com/LGUG2Z/komorebi"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
@@ -8,5 +8,3 @@ edition = "2024"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "komorebic"
|
name = "komorebic"
|
||||||
version = "0.1.39"
|
version = "0.1.40"
|
||||||
description = "The command-line interface for Komorebi, a tiling window manager for Windows"
|
description = "The command-line interface for Komorebi, a tiling window manager for Windows"
|
||||||
repository = "https://github.com/LGUG2Z/komorebi"
|
repository = "https://github.com/LGUG2Z/komorebi"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|||||||
+36
-21
@@ -1,5 +1,6 @@
|
|||||||
#![warn(clippy::all)]
|
#![warn(clippy::all)]
|
||||||
#![allow(clippy::missing_errors_doc, clippy::doc_markdown)]
|
#![allow(clippy::missing_errors_doc, clippy::doc_markdown)]
|
||||||
|
#![allow(unused_assignments)] // false positives for the error reporter
|
||||||
|
|
||||||
use chrono::Utc;
|
use chrono::Utc;
|
||||||
use komorebi_client::PathExt;
|
use komorebi_client::PathExt;
|
||||||
@@ -784,6 +785,13 @@ struct AnimationStyle {
|
|||||||
animation_type: Option<komorebi_client::AnimationPrefix>,
|
animation_type: Option<komorebi_client::AnimationPrefix>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Parser)]
|
||||||
|
struct Docgen {
|
||||||
|
/// Output directory for generated documentation files
|
||||||
|
#[clap(short, long)]
|
||||||
|
output: Option<PathBuf>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
#[allow(clippy::struct_excessive_bools)]
|
#[allow(clippy::struct_excessive_bools)]
|
||||||
struct Start {
|
struct Start {
|
||||||
@@ -795,7 +803,7 @@ struct Start {
|
|||||||
#[clap(short, long)]
|
#[clap(short, long)]
|
||||||
#[clap(value_parser = replace_env_in_path)]
|
#[clap(value_parser = replace_env_in_path)]
|
||||||
config: Option<PathBuf>,
|
config: Option<PathBuf>,
|
||||||
/// Wait for 'komorebic complete-configuration' to be sent before processing events
|
/// Wait for `komorebic complete-configuration` to be sent before processing events
|
||||||
#[clap(short, long)]
|
#[clap(short, long)]
|
||||||
await_configuration: bool,
|
await_configuration: bool,
|
||||||
/// Start a TCP server on the given port to allow the direct sending of SocketMessages
|
/// Start a TCP server on the given port to allow the direct sending of SocketMessages
|
||||||
@@ -1014,7 +1022,7 @@ struct Opts {
|
|||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
enum SubCommand {
|
enum SubCommand {
|
||||||
#[clap(hide = true)]
|
#[clap(hide = true)]
|
||||||
Docgen,
|
Docgen(Docgen),
|
||||||
#[clap(hide = true)]
|
#[clap(hide = true)]
|
||||||
Splash(Splash),
|
Splash(Splash),
|
||||||
/// Gather example configurations for a new-user quickstart
|
/// Gather example configurations for a new-user quickstart
|
||||||
@@ -1386,6 +1394,7 @@ enum SubCommand {
|
|||||||
/// For legacy komorebi.ahk or komorebi.ps1 configurations, signal that the final configuration option has been sent
|
/// For legacy komorebi.ahk or komorebi.ps1 configurations, signal that the final configuration option has been sent
|
||||||
CompleteConfiguration,
|
CompleteConfiguration,
|
||||||
/// DEPRECATED since v0.1.22
|
/// DEPRECATED since v0.1.22
|
||||||
|
#[deprecated(note = "No longer required")]
|
||||||
#[clap(arg_required_else_help = true)]
|
#[clap(arg_required_else_help = true)]
|
||||||
#[clap(hide = true)]
|
#[clap(hide = true)]
|
||||||
AltFocusHack(AltFocusHack),
|
AltFocusHack(AltFocusHack),
|
||||||
@@ -1523,7 +1532,7 @@ enum SubCommand {
|
|||||||
#[clap(arg_required_else_help = true)]
|
#[clap(arg_required_else_help = true)]
|
||||||
#[clap(alias = "convert-asc")]
|
#[clap(alias = "convert-asc")]
|
||||||
ConvertAppSpecificConfiguration(ConvertAppSpecificConfiguration),
|
ConvertAppSpecificConfiguration(ConvertAppSpecificConfiguration),
|
||||||
/// Format a YAML file for use with the 'app-specific-configuration' command
|
/// Format a YAML file for use with the `app-specific-configuration` command
|
||||||
#[clap(arg_required_else_help = true)]
|
#[clap(arg_required_else_help = true)]
|
||||||
#[clap(alias = "fmt-asc")]
|
#[clap(alias = "fmt-asc")]
|
||||||
#[clap(hide = true)]
|
#[clap(hide = true)]
|
||||||
@@ -1580,10 +1589,12 @@ fn main() -> eyre::Result<()> {
|
|||||||
let opts: Opts = Opts::parse();
|
let opts: Opts = Opts::parse();
|
||||||
|
|
||||||
match opts.subcmd {
|
match opts.subcmd {
|
||||||
SubCommand::Docgen => {
|
SubCommand::Docgen(args) => {
|
||||||
let mut cli = Opts::command();
|
let mut cli = Opts::command();
|
||||||
let subcommands = cli.get_subcommands_mut();
|
let subcommands = cli.get_subcommands_mut();
|
||||||
std::fs::create_dir_all("docs/cli")?;
|
|
||||||
|
let output_dir = args.output.unwrap_or_else(|| PathBuf::from("docs/cli"));
|
||||||
|
std::fs::create_dir_all(&output_dir)?;
|
||||||
|
|
||||||
let ignore = [
|
let ignore = [
|
||||||
"docgen",
|
"docgen",
|
||||||
@@ -1604,10 +1615,10 @@ fn main() -> eyre::Result<()> {
|
|||||||
let name = cmd.get_name().to_string();
|
let name = cmd.get_name().to_string();
|
||||||
if !ignore.contains(&name.as_str()) {
|
if !ignore.contains(&name.as_str()) {
|
||||||
let help_text = cmd.render_long_help().to_string();
|
let help_text = cmd.render_long_help().to_string();
|
||||||
let outpath = format!("docs/cli/{name}.md");
|
let outpath = output_dir.join(format!("{name}.md"));
|
||||||
let markdown = format!("# {name}\n\n```\n{help_text}\n```");
|
let markdown = format!("```\n{help_text}\n```");
|
||||||
std::fs::write(outpath, markdown)?;
|
std::fs::write(&outpath, markdown)?;
|
||||||
println!(" - cli/{name}.md");
|
println!("{}", outpath.display());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2509,9 +2520,13 @@ if (!(Get-Process whkd -ErrorAction SilentlyContinue))
|
|||||||
komorebi_json.is_file().then_some(komorebi_json)
|
komorebi_json.is_file().then_some(komorebi_json)
|
||||||
});
|
});
|
||||||
|
|
||||||
if args.bar
|
if args.bar {
|
||||||
&& let Some(config) = &static_config
|
let mut fallthrough = false;
|
||||||
{
|
match static_config {
|
||||||
|
None => {
|
||||||
|
fallthrough = true;
|
||||||
|
}
|
||||||
|
Some(ref config) => {
|
||||||
let mut config = StaticConfig::read(config)?;
|
let mut config = StaticConfig::read(config)?;
|
||||||
if let Some(display_bar_configurations) = &mut config.bar_configurations {
|
if let Some(display_bar_configurations) = &mut config.bar_configurations {
|
||||||
for config_file_path in &mut *display_bar_configurations {
|
for config_file_path in &mut *display_bar_configurations {
|
||||||
@@ -2530,6 +2545,12 @@ if (!(Get-Process whkd -ErrorAction SilentlyContinue))
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
fallthrough = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if fallthrough {
|
||||||
let script = r"
|
let script = r"
|
||||||
if (!(Get-Process komorebi-bar -ErrorAction SilentlyContinue))
|
if (!(Get-Process komorebi-bar -ErrorAction SilentlyContinue))
|
||||||
{
|
{
|
||||||
@@ -3342,15 +3363,8 @@ if (Get-Command Get-CimInstance -ErrorAction SilentlyContinue) {
|
|||||||
SubCommand::StaticConfigSchema => {
|
SubCommand::StaticConfigSchema => {
|
||||||
#[cfg(feature = "schemars")]
|
#[cfg(feature = "schemars")]
|
||||||
{
|
{
|
||||||
let settings = schemars::r#gen::SchemaSettings::default().with(|s| {
|
let static_config = schemars::schema_for!(StaticConfig);
|
||||||
s.option_nullable = false;
|
let schema = serde_json::to_string_pretty(&static_config)?;
|
||||||
s.option_add_null_type = false;
|
|
||||||
s.inline_subschemas = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
let generator = settings.into_generator();
|
|
||||||
let socket_message = generator.into_root_schema_for::<StaticConfig>();
|
|
||||||
let schema = serde_json::to_string_pretty(&socket_message)?;
|
|
||||||
println!("{schema}");
|
println!("{schema}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3358,6 +3372,7 @@ if (Get-Command Get-CimInstance -ErrorAction SilentlyContinue) {
|
|||||||
print_query(&SocketMessage::GenerateStaticConfig);
|
print_query(&SocketMessage::GenerateStaticConfig);
|
||||||
}
|
}
|
||||||
// Deprecated
|
// Deprecated
|
||||||
|
#[allow(deprecated)]
|
||||||
SubCommand::AltFocusHack(_) | SubCommand::IdentifyBorderOverflowApplication(_) => {
|
SubCommand::AltFocusHack(_) | SubCommand::IdentifyBorderOverflowApplication(_) => {
|
||||||
println!("Command deprecated - this is now automatically handled by komorebi! 🎉");
|
println!("Command deprecated - this is now automatically handled by komorebi! 🎉");
|
||||||
}
|
}
|
||||||
|
|||||||
+100
-37
@@ -1,18 +1,34 @@
|
|||||||
{
|
{
|
||||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||||
"title": "ApplicationSpecificConfiguration",
|
"title": "ApplicationSpecificConfiguration",
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"additionalProperties": {
|
"additionalProperties": {
|
||||||
"$ref": "#/definitions/AscApplicationRulesOrSchema"
|
"$ref": "#/$defs/AscApplicationRulesOrSchema"
|
||||||
},
|
},
|
||||||
"definitions": {
|
"$defs": {
|
||||||
"ApplicationIdentifier": {
|
"ApplicationIdentifier": {
|
||||||
|
"description": "Application identifier",
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"description": "Executable name",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"const": "Exe"
|
||||||
"Exe",
|
},
|
||||||
"Class",
|
{
|
||||||
"Title",
|
"description": "Class",
|
||||||
"Path"
|
"type": "string",
|
||||||
|
"const": "Class"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Window title",
|
||||||
|
"type": "string",
|
||||||
|
"const": "Title"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Executable path",
|
||||||
|
"type": "string",
|
||||||
|
"const": "Path"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"AscApplicationRules": {
|
"AscApplicationRules": {
|
||||||
@@ -26,7 +42,7 @@
|
|||||||
"null"
|
"null"
|
||||||
],
|
],
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/MatchingRule"
|
"$ref": "#/$defs/MatchingRule"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ignore": {
|
"ignore": {
|
||||||
@@ -36,7 +52,7 @@
|
|||||||
"null"
|
"null"
|
||||||
],
|
],
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/MatchingRule"
|
"$ref": "#/$defs/MatchingRule"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"layered": {
|
"layered": {
|
||||||
@@ -46,7 +62,7 @@
|
|||||||
"null"
|
"null"
|
||||||
],
|
],
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/MatchingRule"
|
"$ref": "#/$defs/MatchingRule"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"manage": {
|
"manage": {
|
||||||
@@ -56,7 +72,7 @@
|
|||||||
"null"
|
"null"
|
||||||
],
|
],
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/MatchingRule"
|
"$ref": "#/$defs/MatchingRule"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"object_name_change": {
|
"object_name_change": {
|
||||||
@@ -66,7 +82,7 @@
|
|||||||
"null"
|
"null"
|
||||||
],
|
],
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/MatchingRule"
|
"$ref": "#/$defs/MatchingRule"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"slow_application": {
|
"slow_application": {
|
||||||
@@ -76,7 +92,7 @@
|
|||||||
"null"
|
"null"
|
||||||
],
|
],
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/MatchingRule"
|
"$ref": "#/$defs/MatchingRule"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"transparency_ignore": {
|
"transparency_ignore": {
|
||||||
@@ -86,7 +102,7 @@
|
|||||||
"null"
|
"null"
|
||||||
],
|
],
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/MatchingRule"
|
"$ref": "#/$defs/MatchingRule"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tray_and_multi_window": {
|
"tray_and_multi_window": {
|
||||||
@@ -96,7 +112,7 @@
|
|||||||
"null"
|
"null"
|
||||||
],
|
],
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/MatchingRule"
|
"$ref": "#/$defs/MatchingRule"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -104,7 +120,7 @@
|
|||||||
"AscApplicationRulesOrSchema": {
|
"AscApplicationRulesOrSchema": {
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
"$ref": "#/definitions/AscApplicationRules"
|
"$ref": "#/$defs/AscApplicationRules"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "string"
|
"type": "string"
|
||||||
@@ -112,56 +128,103 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"IdWithIdentifier": {
|
"IdWithIdentifier": {
|
||||||
|
"description": "Rule for matching applications",
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"required": [
|
|
||||||
"id",
|
|
||||||
"kind"
|
|
||||||
],
|
|
||||||
"properties": {
|
"properties": {
|
||||||
"id": {
|
"id": {
|
||||||
|
"description": "Target identifier",
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
"kind": {
|
"kind": {
|
||||||
"$ref": "#/definitions/ApplicationIdentifier"
|
"description": "Kind of identifier to target",
|
||||||
|
"$ref": "#/$defs/ApplicationIdentifier"
|
||||||
},
|
},
|
||||||
"matching_strategy": {
|
"matching_strategy": {
|
||||||
|
"description": "Matching strategy to use",
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
"$ref": "#/definitions/MatchingStrategy"
|
"$ref": "#/$defs/MatchingStrategy"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "null"
|
"type": "null"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
"required": [
|
||||||
|
"kind",
|
||||||
|
"id"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"MatchingRule": {
|
"MatchingRule": {
|
||||||
|
"description": "Rule for matching applications",
|
||||||
"anyOf": [
|
"anyOf": [
|
||||||
{
|
{
|
||||||
"$ref": "#/definitions/IdWithIdentifier"
|
"description": "Simple matching rule which must evaluate to true",
|
||||||
|
"$ref": "#/$defs/IdWithIdentifier"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"description": "Composite matching rule where all conditions must evaluate to true",
|
||||||
"type": "array",
|
"type": "array",
|
||||||
"items": {
|
"items": {
|
||||||
"$ref": "#/definitions/IdWithIdentifier"
|
"$ref": "#/$defs/IdWithIdentifier"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"MatchingStrategy": {
|
"MatchingStrategy": {
|
||||||
|
"description": "Strategy for matching identifiers",
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"description": "Should not be used, only kept for backward compatibility",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"const": "Legacy"
|
||||||
"Legacy",
|
},
|
||||||
"Equals",
|
{
|
||||||
"StartsWith",
|
"description": "Equals",
|
||||||
"EndsWith",
|
"type": "string",
|
||||||
"Contains",
|
"const": "Equals"
|
||||||
"Regex",
|
},
|
||||||
"DoesNotEndWith",
|
{
|
||||||
"DoesNotStartWith",
|
"description": "Starts With",
|
||||||
"DoesNotEqual",
|
"type": "string",
|
||||||
"DoesNotContain"
|
"const": "StartsWith"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Ends With",
|
||||||
|
"type": "string",
|
||||||
|
"const": "EndsWith"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Contains",
|
||||||
|
"type": "string",
|
||||||
|
"const": "Contains"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Regex",
|
||||||
|
"type": "string",
|
||||||
|
"const": "Regex"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Does not end with",
|
||||||
|
"type": "string",
|
||||||
|
"const": "DoesNotEndWith"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Does not start with",
|
||||||
|
"type": "string",
|
||||||
|
"const": "DoesNotStartWith"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Does not equal",
|
||||||
|
"type": "string",
|
||||||
|
"const": "DoesNotEqual"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Does not contain",
|
||||||
|
"type": "string",
|
||||||
|
"const": "DoesNotContain"
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+7248
-60336
File diff suppressed because it is too large
Load Diff
+4034
-4449
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user