Merge branch 'master' into fix_2827

This commit is contained in:
Peter F. Patel-Schneider 2025-12-10 10:59:18 -05:00 committed by GitHub
commit d1cf4958f9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
30 changed files with 2606 additions and 807 deletions

View File

@ -1,3 +1,29 @@
# 1.1.17
* Add dark icons
* Permit onboard profiles version 5
* Update Russian and Polish translations
* Add onboard profiles warning to sensitivity tooltip
* Better error messages for solaar profile
* Remove Solaar name for mice with WPID 4008
* Prevent lock failure when showing debug messages
* Replace color picker (#3028)
* Add setting for HAPTIC feature
* Add setting to adjust force needed for force-sensing buttons
* Expand new settings type
* Add new settings type for structure-backed setting
* Use PATH instead of hardcoded absolute paths (#3014)
* Add scroll ratchet force setting
* Fix debug messages for MouseClick rule
* Improve debug message for rule evaluation
* App wrapper and launch agent scripts for MacOS
* Ignore hidden features
* Don't pop up window in response to ADC changes
* Update bug report template
* Fixed malformed doc file by adding closing tag
* Fix error in low-level request for device with no recevier
* Update documentation files
# 1.1.16
* Add new flags for reprogrammable keys feature

View File

@ -1,5 +1,13 @@
# Notes on Major Changes in Releases
## Version 1.1.17
* Several new features have been added related to the MX Master 4
* The scroll ratchet force can be adjusted
* The force required to click the button under your thumb can be adjusted
* The haptic force can be adjusted
* Haptic feeback can be triggered by commands like `solaar config 'mx master 4' haptic-play 'HAPPY ALER'`
## Version 1.1.16
* Two bugs that were affecting users in 1.1.15 are fixed.

View File

@ -178,7 +178,7 @@ For more information on Mouse Gestures rule conditions see
Solaar uses the standard Logitech names for keyboard keys. Some Logitech keyboards have different icons on some of their keys and have different functionality than suggested by these names.
Solaar is uses the standard US keyboard layout. This currently only matters for the `Per-key Lighting` setting. Users who want to have the key names for this setting reflect the keyboard layout that they use can create and edit `~/.config/solaar/keys.yaml` which contains a YAML dictionary of key names and locations. For example, switching the `Y` and `Z` keys can be done as:
Solaar uses the standard US keyboard layout. This currently only matters for the `Per-key Lighting` setting. Users who want to have the key names for this setting reflect the keyboard layout that they use can create and edit `~/.config/solaar/keys.yaml` which contains a YAML dictionary of key names and locations. For example, switching the `Y` and `Z` keys can be done as:
Z: 25
Y: 26

View File

@ -7,8 +7,7 @@ layout: page
An easy way to install the most recent release version of Solaar is from the PyPI repository.
First install pip, and then run
`pip install --user solaar` or `pipx install --system-site-packages solaar` or
If you are using pipx add the `` flag.
`pip install --user solaar` or `pipx install --system-site-packages solaar`.
This will not install the Solaar udev rule, which you will need to install manually by copying
`~/.local/lib/udev/rules.d/42-logitech-unify-permissions.rules`
@ -31,12 +30,12 @@ brew install hidapi gtk+3 pygobject3
* Option A (recommended): Configure a LaunchAgent to automatically start Solaar and keep it running in the background.
It will also automatically restart Solaar if it crashed or closed.
```
bash <(curl -fsSL https://raw.githubusercontent.com/pwr-Solaar/Solaar/refs/heads/master/tools/create-macos-app.sh)
bash <(curl -fsSL https://raw.githubusercontent.com/pwr-Solaar/Solaar/refs/heads/master/tools/create-macos-launchagent.sh)
```
* Option B: Create Solaar.app launcher in /Applications.
It can be added to Login Items to start on login, but it will not automatically recover on crashes.
```
bash <(curl -fsSL https://raw.githubusercontent.com/pwr-Solaar/Solaar/refs/heads/master/tools/create-macos-launchagent.sh)
bash <(curl -fsSL https://raw.githubusercontent.com/pwr-Solaar/Solaar/refs/heads/master/tools/create-macos-app.sh)
```
# Installating from GitHub

View File

@ -381,7 +381,7 @@ _D(
),
)
_D("Couch Mouse M515", codename="M515", protocol=2.0, wpid="4007")
_D("Wireless Mouse M175", codename="M175", protocol=2.0, wpid="4008")
# _D("Wireless Mouse M175", codename="M175", protocol=2.0, wpid="4008")
_D("Wireless Mouse M325", codename="M325", protocol=2.0, wpid="400A")
_D("Wireless Mouse M525", codename="M525", protocol=2.0, wpid="4013")
_D("Wireless Mouse M345", codename="M345", protocol=2.0, wpid="4017")

View File

@ -140,7 +140,7 @@ class Device:
self._modelId = None # model id (contains identifiers for the transports of the device)
self._tid_map = None # map from transports to product identifiers
self._persister = None # persister holds settings
self._led_effects = self._firmware = self._keys = self._remap_keys = self._gestures = None
self._led_effects = self._firmware = self._keys = self._remap_keys = self._gestures = self._force_buttons = None
self._profiles = self._backlight = self._settings = None
self.registers = []
self.notification_flags = None
@ -346,6 +346,12 @@ class Device:
self._profiles = _hidpp20.get_profiles(self)
return self._profiles
def force_buttons(self):
if self._force_buttons is None:
if self.online and self.protocol >= 2.0:
self._force_buttons = _hidpp20.get_force_buttons(self) or ()
return self._force_buttons
def set_configuration(self, configuration_, no_reply=False):
if self.online and self.protocol >= 2.0:
_hidpp20.config_change(self, configuration_, no_reply=no_reply)

View File

@ -189,7 +189,7 @@ class Hidpp10:
write_register(device, Registers.THREE_LEDS, v1, v2)
def get_notification_flags(self, device: Device):
return self._get_register(device, Registers.NOTIFICATIONS)
return NotificationFlag(self._get_register(device, Registers.NOTIFICATIONS))
def set_notification_flags(self, device: Device, *flag_bits: NotificationFlag):
assert device is not None

View File

@ -21,6 +21,7 @@ import socket
import struct
import threading
from collections import UserDict
from enum import Flag
from enum import IntEnum
from typing import Any
@ -1449,7 +1450,7 @@ class OnboardProfiles:
device.ping()
response = device.feature_request(SupportedFeature.ONBOARD_PROFILES, 0x00)
memory, profile, _macro = struct.unpack("!BBB", response[0:3])
if memory != 0x01 or profile > 0x04:
if memory != 0x01 or profile > 0x05:
return
count, oob, buttons, sectors, size, shift = struct.unpack("!BBBBHB", response[3:10])
gbuttons = buttons if (shift & 0x3 == 0x2) else 0
@ -1713,6 +1714,12 @@ class Hidpp20:
if SupportedFeature.BACKLIGHT2 in device.features:
return Backlight(device)
def get_force_buttons(self, device: Device):
if getattr(device, "_force_buttons", None) is not None:
return device._force_buttons
if SupportedFeature.FORCE_SENSING_BUTTON in device.features:
return ForceSensingButtonArray(device)
def get_profiles(self, device: Device):
if getattr(device, "_profiles", None) is not None:
return device._profiles
@ -2021,3 +2028,94 @@ def estimate_battery_level_percentage(value_millivolt: int) -> int | None:
percent = p_low + (p_high - p_low) * (value_millivolt - v_low) / (v_high - v_low)
return round(percent)
return 0
class ForceSensingButton:
"""A button that has a force value at which to trigger the button"""
@classmethod
def create(cls, device, number: int):
buttondata = device.feature_request(SupportedFeature.FORCE_SENSING_BUTTON, 0x10, number)
buttoncurrent = device.feature_request(SupportedFeature.FORCE_SENSING_BUTTON, 0x20, number)
if buttondata is not None and buttoncurrent is not None:
changeable, default, max_value, min_value = struct.unpack("!HHHH", buttondata[:8])
changeable = changeable & 0x01
current = struct.unpack("!H", buttoncurrent[:2])[0]
return cls(device, number, changeable, default, max_value, min_value, current)
def __init__(self, device, number: int, changeable: bool, default: int, max_value: int, min_value: int, current: int):
self._device = device
self.number = number
self.changeable = changeable
self.default = default
self.min_value = min_value
self.max_value = max_value
self._current = current
def get_current(self) -> int:
return self._current
def set_current(self, current: int) -> None:
if not self.changeable:
logger.warning(f"FORCE_SENSING_BUTTON on device {self._device} does not allow changing force.")
if self.min_value <= current <= self.max_value:
ret = self._device.feature_request(
SupportedFeature.FORCE_SENSING_BUTTON, 0x30, struct.pack("!BH", self.number, current)
)
if ret is None and logger.isEnabledFor(logging.DEBUG):
logger.debug(f"FORCE_SENSING_BUTTON setButtonConfig on device {self._device} didn't respond.")
def acceptable_current(self, value: int) -> bool:
return self.min_value <= value <= self.max_value
class ForceSensingButtonArray(UserDict):
"""A map of buttons supporting force sensing"""
def __new__(cls, device: Device):
assert device is not None
count = device.feature_request(SupportedFeature.FORCE_SENSING_BUTTON, 0x00)
if count:
instance = super().__new__(cls)
instance._count = ord(count[:1])
return instance
def __init__(self, device: Device):
super().__init__(self)
self.device = device
for index in range(0, self._count):
self[index] = None
def __getitem__(self, index: int):
item = super().__getitem__(index)
if item is None:
self.query_key(index)
return super().__getitem__(index)
def query_key(self, index):
if index not in self:
raise IndexError(index)
button = ForceSensingButton.create(self.device, index)
if button:
self[index] = button
return button
def query(self):
for index in self:
button = ForceSensingButton.create(self.device, index)
if button:
self[index] = button
return self
# interface for single force button
def get_current(self):
return self[0].get_current()
def set_current(self, current: int) -> None:
self[0].set_current(current)
def acceptable(self, value: int) -> bool:
return self[0].acceptable(value)
def acceptable_current_key(self, index: int, value: int) -> bool:
return self[index].acceptable(value)

View File

@ -65,6 +65,8 @@ class SupportedFeature(IntEnum):
BACKLIGHT2 = 0x1982
BACKLIGHT3 = 0x1983
ILLUMINATION = 0x1990
FORCE_SENSING_BUTTON = 0x19C0
HAPTIC = 0x19B0
PRESENTER_CONTROL = 0x1A00
SENSOR_3D = 0x1A01
REPROG_CONTROLS = 0x1B00
@ -276,3 +278,23 @@ class ParamId(IntEnum):
PIXEL_ZONE = 2 # 4 2-byte integers, left, bottom, width, height; pixels
RATIO_ZONE = 3 # 4 bytes, left, bottom, width, height; unit 1/240 pad size
SCALE_FACTOR = 4 # 2-byte integer, with 256 as normal scale
HapticWaveForms = NamedInts(
SHARP_STATE_CHANGE=0x00,
DAMP_STATE_CHANGE=0x01,
SHARP_COLLISION=0x02,
DAMP_COLLISION=0x03,
SUBTLE_COLLISION=0x04,
HAPPY_ALERT=0x05,
ANGRY_ALERT=0x06,
COMPLETED=0x07,
SQUARE=0x08,
WAVE=0x09,
FIREWORK=0x0A,
MAD=0x0B,
KNOCK=0x0C,
JINGLE=0x0D,
RINGING=0xE,
WHISPER_COLLISION=0x1B,
)

View File

@ -35,6 +35,7 @@ SENSITIVITY_IGNORE = "ignore"
class Kind(IntEnum):
NONE = 0
TOGGLE = 0x01
CHOICE = 0x02
RANGE = 0x04
@ -43,6 +44,8 @@ class Kind(IntEnum):
PACKED_RANGE = 0x20
MULTIPLE_RANGE = 0x40
HETERO = 0x80
MAP_RANGE = 0x102
COLOR = 0x200
class Setting:
@ -55,6 +58,7 @@ class Setting:
rw_options = {}
validator_class = None
validator_options = {}
display = True # display setting in UI
def __init__(self, device, rw, validator):
self._device = device

View File

@ -0,0 +1,206 @@
## Copyright (C) 2025 Solaar contributors
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License along
## with this program; if not, write to the Free Software Foundation, Inc.,
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
## A new way of supporting settings, using a feature-specifi device class to store, read, and write relevant information
## The setting uses the device class to interact with the device feature.
## The setting uses a persist class to keep track of the setting.
## Interface:
import logging
from .settings import Kind
logger = logging.getLogger(__name__)
class Setting:
name = None # Solaar internal name for the setting
label = None # Solaar user name for the setting (translatable)
description = None # Solaar extra desciption for the setting (translatable)
feature = None # Logitech feature that the setting uses
min_version = 0 # Minimum version of the feature needed
setup = None # method name on Device class to get the device object
get = None # method name on the device object to get the setting value
set = None # method name on the device object to set the setting value
acceptable = None # method name on the device object to check for acceptable values
choices_universe = None # All possible acceptable keys, for settings with keys
kind = Kind.NONE # What GUI interface to use
persist = True # Whether to remember the setting
display = True # display setting in UI
_device = None # The device that this setting is for
_device_object = None # The object that interacts with the feature for the device
_value = None # Stored value as maintained by Solaar, used for persistence
def __init__(self, device, device_object):
self._device = device
self._device_object = device_object
@classmethod
def build(cls, device):
cls.check_properties(cls)
device_object = getattr(device, cls.setup)()
if device_object:
setting = cls(device, device_object)
return setting
@classmethod
def check_properties(cl, cls):
assert cls.name and cls.label and cls.description, "New settings require a name, label, and description"
assert cls.feature, "New settings require a feature"
assert cls.setup, "New settings require a setup device method"
assert cls.get and cls.set and cls.acceptable, "New settings require get, set, and acceptable methods"
def setup_from_class(self, clss):
"""Copy settings methods for a new setting from a settting class"""
self.name = clss.name
self.label = clss.label
self.description = clss.description
self.feature = clss.feature
self.min_version = clss.min_version
self.setup = clss.setup
self.get = clss.get
self.set = clss.set
self.acceptable = clss.acceptable
self.choices_universe = clss.choices_universe
self.kind = clss.kind
self.persist = clss.persist
def _pre_read(self, cached):
"""Get information from and save information to the persister"""
# Get the persister map if available and not done already
if self.persist and self._value is None and getattr(self._device, "persister", None):
self._value = self._device.persister.get(self.name)
# If this is new save its current value for the next time
if cached and self._value is not None:
if getattr(self._device, "persister", None) and self.name not in self._device.persister:
self._device.persister[self.name] = self._value if self.persist else None
def read(self, cached=True):
"""Get all the data for the setting. If cached is True the data in the _value can be used."""
self._pre_read(cached)
if logger.isEnabledFor(logging.DEBUG):
logger.debug("%s: setting read %r from %s", self.name, self._value, self._device)
if cached and self._value is not None:
return self._value
if cached:
self._value = getattr(self._device_object, self.get)()
return self._value
if self._device.online:
self._value = getattr(self._device_object.query(), self.get)()
return self._value
def write(self, value, save=True):
"""Write the value to the device. If saved is True also save in the persister"""
pass ## fill out
def apply(self):
"""Write saved data to the device, using persisted data if available"""
if logger.isEnabledFor(logging.DEBUG):
logger.debug("%s: apply (%s)", self.name, self._device)
value = None
try:
value = self.read(self.persist) # Don't use persisted value if setting doesn't persist
if self.persist and value is not None: # If setting doesn't persist no need to write value just read
self.write(value, save=False)
except Exception as e:
if logger.isEnabledFor(logging.WARNING):
logger.warning("%s: error applying %s so ignore it (%s): %s", self.name, value, self._device, repr(e))
@property
def range(self):
if self.kind == Kind.RANGE:
return self.min_value, self.max_value
def val_to_string(self, value):
return str(value)
## key mapping from symbols to values????
class Settings(Setting):
"""A setting descriptor for multiple keys.
Supported by a class that provides the interface to the device, see ForceSensingButtonArray in hidpp20.py
Picks out a field from the mapped device feature objects."""
# setup creates a dictionary with entries for all the keys
# _value is a map from keys to values
# get, set, and acceptable are methods of dict value objects, not of the device object itself #### FIX THIS! MAYBE??
def __init__(self, device, device_object):
super().__init__(device, device_object)
self._value = {}
def read(self, cached=True):
self._pre_read(cached)
if logger.isEnabledFor(logging.DEBUG):
logger.debug("%s: settings read %r from %s", self.name, self._value, self._device)
for key in self._device_object:
self.read_key(key, cached)
return self._value
def read_key(self, key, cached=True):
"""Get the data for the key. If cached is True the data in the device_object can be used."""
self._pre_read(cached)
if key not in self._device_object:
logger.error("%s: settings illegal read key %r for %s", self.name, key, self._device)
return None
if logger.isEnabledFor(logging.DEBUG):
logger.debug("%s: settings key %r read %r from %s", self.name, key, self._value, self._device)
if cached and key in self._value and self._value[key] is not None:
return self._value[key]
if cached:
data = self._device_object[key]
self._value[key] = getattr(data, self.get)()
return self._value[key]
if self._device.online:
data = self._device_object.query_key(key)
self._value[key] = getattr(data, self.get)()
return self._value[key]
def write(self, value, save=True):
if logger.isEnabledFor(logging.DEBUG):
logger.debug("%s: settings read %r from %s", self.name, self._value, self._device)
if isinstance(value, dict):
for key, val in value.items():
self.write_key_value(key, val, save)
else: # to mimic interface for non-dict setting
key = next(iter(self._device_object))
self.write_key_value(key, value, save)
return value
def write_key_value(self, key, value, save=True):
"""Write the data for the key. If saved is True also save in the persister"""
if key not in self._device_object:
logger.error("%s: settings illegal write key %r for %s", self.name, key, self._device)
return None
if logger.isEnabledFor(logging.DEBUG):
logger.debug("%s: settings write key %r value %r to %s", self.name, key, value, self._device)
if self._device.online:
if self._device_object[key] is None:
self.read_key(key)
if self._device_object[key] is None:
logger.error("%s: settings illegal write key %r for %s", self.name, key, self._device)
return None
if not getattr(self._device_object[key], self.acceptable)(value):
logger.error("%s: settings illegal write key %r value %r for %s", self.name, key, value, self._device)
return None
self._value[key] = value
if self._device.persister and self.persist and save:
self._device.persister[self.name][key] = value
getattr(self._device_object[key], self.set)(value)
return value

View File

@ -36,6 +36,7 @@ from . import exceptions
from . import hidpp20
from . import hidpp20_constants
from . import settings
from . import settings_new
from . import settings_validator
from . import special_keys
from .hidpp10_constants import Registers
@ -1015,7 +1016,7 @@ def produce_dpi_list(feature, function, ignore, device, direction):
class AdjustableDpi(settings.Setting):
name = "dpi"
label = _("Sensitivity (DPI)")
description = _("Mouse movement sensitivity")
description = _("Mouse movement sensitivity") + "\n" + _("May need Onboard Profiles set to Disable to be effective.")
feature = _F.ADJUSTABLE_DPI
rw_options = {"read_fnid": 0x20, "write_fnid": 0x30}
choices_universe = common.NamedInts.range(100, 4000, str, 50)
@ -1643,7 +1644,7 @@ class LEDZoneSetting(settings.Setting):
label = _("LED Zone Effects")
description = _("Set effect for LED Zone") + "\n" + _("LED Control needs to be set to Solaar to be effective.")
feature = _F.COLOR_LED_EFFECTS
color_field = {"name": _LEDP.color, "kind": settings.Kind.CHOICE, "label": None, "choices": colors}
color_field = {"name": _LEDP.color, "kind": settings.Kind.COLOR, "label": _("Color")}
speed_field = {"name": _LEDP.speed, "kind": settings.Kind.RANGE, "label": _("Speed"), "min": 0, "max": 255}
period_field = {"name": _LEDP.period, "kind": settings.Kind.RANGE, "label": _("Period"), "min": 100, "max": 5000}
intensity_field = {"name": _LEDP.intensity, "kind": settings.Kind.RANGE, "label": _("Intensity"), "min": 0, "max": 100}
@ -1779,6 +1780,101 @@ class PerKeyLighting(settings.Settings):
return result
# Allow changes to force sensing buttons
class ForceSensing(settings_new.Settings):
name = "force-sensing"
label = _("Force Sensing Buttons")
description = _("Change the force required to activate button.")
feature = _F.FORCE_SENSING_BUTTON
setup = "force_buttons"
get = "get_current"
set = "set_current"
acceptable = "acceptable_current_key"
choices_universe = list(range(0, 256))
kind = settings.Kind.MAP_RANGE
@classmethod
def build(cls, device):
cls.check_properties(cls)
device_object = getattr(device, cls.setup)()
if device_object:
setting = cls(device, device_object)
if setting and len(device_object) == 1:
## If there is only one force button a simpler interface can be used
setting.label = _("Force Sensing Button")
setting.acceptable = "acceptable_current"
setting.min_value = device_object[0].min_value
setting.max_value = device_object[0].max_value
setting.kind = settings.Kind.RANGE
return setting
class HapticLevel(settings.Setting):
name = "haptic-level"
label = _("Haptic Feeback Level")
description = _("Change power of haptic feedback. (Zero to turn off.)")
feature = _F.HAPTIC
choices_universe = common.NamedInts(Off=0, Low=25, Medium=50, High=75, Maximum=100)
min_value = 0
max_value = 100
class rw_class(settings.FeatureRW):
def __init__(self, feature):
super().__init__(feature, read_fnid=0x10, write_fnid=0x20)
def read(self, device, data_bytes=b""):
result = device.feature_request(self.feature, 0x10)
if result[0] & 0x01 == 0: # disabled, return 0
return b"\x00"
else: # enabled, return second byte
return result[1:2]
def write(self, device, data_bytes):
if data_bytes == b"\x00":
write_bytes = b"\x00\x32" # disable, at 50 percent
else:
write_bytes = b"\x01" + data_bytes
reply = device.feature_request(self.feature, 0x20, write_bytes)
return reply
@classmethod
def build(cls, device):
response = device.feature_request(cls.feature, 0x10)
if response:
rw = cls.rw_class(cls.feature)
levels = response[2] & 0x01
if levels: # device only has four levels
validator = settings_validator.ChoicesValidator(choices=cls.choices_universe)
else: # device has all levels
validator = settings_validator.RangeValidator(min_value=cls.min_value, max_value=cls.max_value)
return cls(device, rw, validator)
# This setting is not displayed in the UI
# Use `solaar config <device> haptic-play <form>` to play a haptic form
class PlayHapticWaveForm(settings.Setting):
name = "haptic-play"
label = _("Play Haptic Waveform")
description = _("Tell device to play a haptic waveform.")
feature = _F.HAPTIC
choices_universe = hidpp20_constants.HapticWaveForms
rw_options = {"read_fnid": None, "write_fnid": 0x40} # nothing to read
persist = False # persisting this setting is useless
display = False # don't display in UI, interact using `solaar config ...`
class validator_class(settings_validator.ChoicesValidator):
@classmethod
def build(cls, setting_class, device):
response = device.feature_request(_F.HAPTIC, 0x00)
if response:
waves = common.NamedInts()
waveforms = int.from_bytes(response[4:8])
for waveform in hidpp20_constants.HapticWaveForms:
if (1 << int(waveform)) & waveforms:
waves[int(waveform)] = str(waveform)
return cls(choices=waves, byte_count=1)
SETTINGS: list[settings.Setting] = [
RegisterHandDetection, # simple
RegisterSmoothScroll, # simple
@ -1824,6 +1920,7 @@ SETTINGS: list[settings.Setting] = [
PersistentRemappableAction,
DivertKeys, # working
DisableKeyboardKeys, # working
ForceSensing,
CrownSmooth, # working
DivertCrown, # working
DivertGkeys, # working
@ -1835,6 +1932,8 @@ SETTINGS: list[settings.Setting] = [
Gesture2Gestures, # working
Gesture2Divert,
Gesture2Params, # working
HapticLevel,
PlayHapticWaveForm,
Sidetone,
Equalizer,
ADCPower,
@ -1939,7 +2038,7 @@ def check_feature(device, settings_class: SettingsProtocol) -> None | bool | Set
try:
detected = settings_class.build(device)
if logger.isEnabledFor(logging.DEBUG):
logger.debug("check_feature %s [%s] detected %s", settings_class.name, settings_class.feature, detected)
logger.debug("check_feature %s [%s] detected", settings_class.name, settings_class.feature)
return detected
except Exception as e:
logger.error(

View File

@ -278,6 +278,8 @@ def set(dev, setting: SettingsProtocol, args, save):
key = args.value_key
all_keys = getattr(setting, "choices_universe", None)
ikey = all_keys[int(key) if key.isdigit() else key] if isinstance(all_keys, NamedInts) else to_int(key)
print("S", args.extra2, key, type(all_keys), ikey)
print("SS", args)
if args.extra2 is None or to_int(args.extra2) is None:
raise Exception(f"{setting.name}: setting needs an integer value, not {args.extra2}")
if not setting._value: # ensure that there are values to look through
@ -295,7 +297,19 @@ def set(dev, setting: SettingsProtocol, args, save):
result = setting.write_key_value(int(k), item, save=save)
value = item
elif setting.kind == settings.Kind.MAP_RANGE:
if args.extra_subkey is None:
_print_setting_keyed(setting, args.value_key)
return None, None, None
key = int(args.value_key)
value = int(args.extra_subkey)
if key not in setting._device_object:
raise Exception(f"{setting.name}: key '{key}' not in setting")
message = f"Setting {setting.name} of {dev.name} key {key} to {value}"
result = setting.write_key_value(key, value, save=save)
else:
print("KIND", setting.kind)
raise Exception("NotImplemented")
return result, message, value

View File

@ -38,7 +38,7 @@ def run(receivers, args, find_receiver, _ignore):
assert receiver
# check if it's necessary to set the notification flags
old_notification_flags = _hidpp10.get_notification_flags(receiver) or 0
old_notification_flags = _hidpp10.get_notification_flags(receiver)
if not (old_notification_flags & hidpp10_constants.NotificationFlag.WIRELESS):
_hidpp10.set_notification_flags(receiver, old_notification_flags | hidpp10_constants.NotificationFlag.WIRELESS)

View File

@ -38,8 +38,10 @@ def run(receivers, args, find_receiver, find_device):
if not dev:
raise Exception(f"no online device found matching '{device_name}'")
if not (dev.online and dev.profiles):
print(f"Device {dev.name} is either offline or has no onboard profiles")
if not dev.online:
print(f"Device {dev.name} is offline.")
elif not dev.profiles:
print(f"Device {dev.name} has no onboard profiles that Solaar supports.")
elif not profiles_file:
print(f"#Dumping profiles from {dev.name}")
print(yaml.dump(dev.profiles))

View File

@ -260,7 +260,8 @@ def _print_device(dev, num=None):
v = setting.val_to_string(setting._device.persister.get(setting.name))
print(f" {setting.label} (saved): {v}")
try:
v = setting.val_to_string(setting.read(False))
v = setting.read(False)
v = setting.val_to_string(v)
except exceptions.FeatureCallError as e:
v = "HID++ error " + str(e)
except AssertionError as e:

View File

@ -16,7 +16,6 @@
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import logging
import traceback
from enum import Enum
from threading import Timer
@ -47,6 +46,7 @@ class GtkSignal(Enum):
NOTIFY_ACTIVE = "notify::active"
TOGGLED = "toggled"
VALUE_CHANGED = "value-changed"
COLOR_SET = "color-set"
def _read_async(setting, force_read, sbox, device_is_online, sensitive):
@ -70,7 +70,6 @@ def _write_async(setting, value, sbox, sensitive=True, key=None):
v = setting.write_key_value(key, v)
v = {key: v}
except Exception:
traceback.print_exc()
v = None
if sb:
GLib.idle_add(_update_setting_item, sb, v, True, sensitive, priority=99)
@ -147,6 +146,11 @@ class SliderControl(Gtk.Scale, Control):
self.set_increments(1, 5)
self.connect(GtkSignal.VALUE_CHANGED.value, self.changed)
def set_value(self, value):
if isinstance(value, dict):
value = next(iter(value.values()))
return super().set_value(value)
def get_value(self):
return int(super().get_value())
@ -562,6 +566,10 @@ class HeteroKeyControl(Gtk.HBox, Control):
item_box.set_active(0)
item_box.connect(GtkSignal.CHANGED.value, self.changed)
self.pack_start(item_box, False, False, 0)
elif item["kind"] == settings.Kind.COLOR:
item_box = Gtk.ColorButton()
item_box.connect(GtkSignal.COLOR_SET.value, self.changed)
self.pack_start(item_box, False, False, 0)
elif item["kind"] == settings.Kind.RANGE:
item_box = Scale()
item_box.set_range(item["min"], item["max"])
@ -576,7 +584,14 @@ class HeteroKeyControl(Gtk.HBox, Control):
def get_value(self):
result = {}
for k, (_lblbox, box) in self._items.items():
result[str(k)] = box.get_value()
if isinstance(box, Gtk.ColorButton):
rgba = box.get_rgba()
r = int(rgba.red * 255)
g = int(rgba.green * 255)
b = int(rgba.blue * 255)
result[str(k)] = (r << 16) | (g << 8) | b
else:
result[str(k)] = box.get_value()
result = hidpp20.LEDEffectSetting(**result)
return result
@ -586,7 +601,13 @@ class HeteroKeyControl(Gtk.HBox, Control):
for k, v in value.__dict__.items():
if k in self._items:
(lblbox, box) = self._items[k]
box.set_value(v)
if isinstance(box, Gtk.ColorButton):
rgba = Gdk.RGBA()
color_string = f"#{v:06X}" # e.g. "#FF0000"
rgba.parse(color_string)
box.set_rgba(rgba)
else:
box.set_value(v)
else:
self.sbox._failed.set_visible(True)
self.setup_visibles(value.ID if value is not None else 0)
@ -655,6 +676,8 @@ def _change_icon(allowed, icon):
def _create_sbox(s, _device):
if not s.display:
return
sbox = Gtk.HBox(homogeneous=False, spacing=6)
sbox.setting = s
sbox.kind = s.kind

View File

@ -1 +1 @@
1.1.16
1.1.17

538
po/pl.po

File diff suppressed because it is too large Load Diff

560
po/ru.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,190 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
width="100"
height="100"
id="svg5"
sodipodi:docname="solaar-attention.svg"
xml:space="preserve"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><sodipodi:namedview
id="namedview5"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showguides="true"
inkscape:zoom="6.355"
inkscape:cx="-0.70810385"
inkscape:cy="42.800944"
inkscape:current-layer="g3-7" /><title
id="title1">Solaar attention</title><defs
id="defs4"><linearGradient
id="gradient_blue"><stop
style="stop-color:#009099;stop-opacity:1"
offset="0"
id="stop1" /><stop
style="stop-color:#00a899;stop-opacity:0.9"
offset="1"
id="stop2" /></linearGradient><linearGradient
id="gradient_yellow"><stop
style="stop-color:#f0ff18;stop-opacity:1"
offset="0"
id="stop3" /><stop
style="stop-color:#f3ff2b;stop-opacity:0.94901961;"
offset="0.49391085"
id="stop6" /><stop
style="stop-color:#f8ff40;stop-opacity:0.9"
offset="1"
id="stop4" /></linearGradient><linearGradient
x1="5"
y1="50"
x2="95"
y2="50"
id="gradient_rect"
xlink:href="#gradient_yellow"
gradientUnits="userSpaceOnUse" /><linearGradient
x1="37"
y1="50"
x2="63"
y2="50"
id="gradient_dot"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse" /><linearGradient
id="gradient_black"><stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop1-47" /><stop
style="stop-color:#000000;stop-opacity:0.9"
offset="1"
id="stop2-6" /></linearGradient><linearGradient
x1="5"
y1="50"
x2="95"
y2="50"
id="gradient_rect-3"
xlink:href="#gradient_black"
gradientUnits="userSpaceOnUse" /><linearGradient
x1="37"
y1="50"
x2="63"
y2="50"
id="gradient_dot-1"
xlink:href="#gradient_black"
gradientUnits="userSpaceOnUse" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20-5"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20-7"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect18"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><linearGradient
x1="50"
y1="5.5"
x2="50"
y2="94.5"
id="gradient_rect-8"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-110.09871,-4.4507114)" /><linearGradient
x1="50.01833"
y1="5"
x2="50.01833"
y2="95"
id="gradient_dot-5"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse" /></defs><metadata
id="metadata4"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>Solaar attention</dc:title><dc:creator><cc:Agent><dc:title>Daniel Pavel</dc:title></cc:Agent></dc:creator><cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" /><dc:date>2013-06-25</dc:date><dc:identifier>solaar-attention</dc:identifier></cc:Work><cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/3.0/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" /></cc:License></rdf:RDF></metadata><g
id="g3-7"><rect
style="fill:#f3ff2b;fill-opacity:0.94901961;stroke:none;stroke-width:3;stroke-linejoin:round;stroke-opacity:0.996078;paint-order:fill markers stroke"
id="rect17"
width="90"
height="90"
x="5"
y="5"
rx="10"
ry="10" /><path
id="path11-5"
style="display:inline;fill:#131313;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.905882;paint-order:markers fill stroke"
d="m 36.326172,18.050781 c -0.653587,3.07e-4 -1.295564,0.172759 -1.861328,0.5 l -3.260348,1.886206 c -0.369666,0.213862 -0.976947,0.555623 -1.294346,0.840227 -1.095169,0.982014 -1.50919,2.530927 -1.050063,3.928399 0.133086,0.405083 0.488934,1.004291 0.702637,1.37405 l 5.656751,9.787566 c 0.62092,1.074344 0.455955,2.70357 -0.225142,3.739812 -0.385108,0.585915 -0.736584,1.1959 -1.052473,1.826946 C 33.386764,43.042894 32.056577,44 30.815708,44 H 19.405457 c -0.377101,0 -0.99151,-0.0065 -1.361861,0.06167 C 16.311702,44.380584 14.999644,45.89844 15,47.722656 v 4.554688 C 14.999599,54.333476 16.666524,56.000401 18.722656,56 h 12.093052 c 1.240869,0 2.571057,0.957108 3.126154,2.066017 0.315889,0.631045 0.667365,1.24103 1.052473,1.826945 0.681096,1.03624 0.84606,2.665465 0.22514,3.739809 l -6.043694,10.457073 c -1.028907,1.779844 -0.420325,4.056781 1.359375,5.085937 l 3.929688,2.273438 c 1.779707,1.029944 4.057417,0.421155 5.085937,-1.359375 l 6.043694,-10.457073 c 0.62092,-1.074344 2.114654,-1.744293 3.352326,-1.666259 C 49.29502,67.988467 49.64608,68 50,68 c 0.353931,0 0.705,-0.01153 1.053229,-0.03349 1.237655,-0.07804 2.731376,0.591916 3.352296,1.66626 l 6.043694,10.457073 c 1.02852,1.78053 3.30623,2.389319 5.085937,1.359375 l 3.929688,-2.273438 c 1.7797,-1.029156 2.388282,-3.306093 1.359375,-5.085937 L 64.780525,63.632771 c -0.62092,-1.074344 -0.455955,-2.70357 0.225142,-3.739812 0.385108,-0.585915 0.736584,-1.1959 1.052473,-1.826946 C 66.613236,56.957106 67.943423,56 69.184291,56 H 81.277344 C 83.333476,56.000401 85.000401,54.333476 85,52.277344 V 47.722656 C 85.000401,45.666524 83.333476,43.999599 81.277344,44 H 69.184291 c -1.240868,0 -2.571056,-0.957108 -3.126153,-2.066017 -0.315889,-0.631045 -0.667365,-1.24103 -1.052473,-1.826945 -0.681096,-1.03624 -0.84606,-2.665465 -0.22514,-3.739809 l 6.043694,-10.457073 c 1.028907,-1.779844 0.420325,-4.056781 -1.359375,-5.085937 l -3.929688,-2.273438 c -1.779707,-1.029944 -4.057417,-0.421155 -5.085937,1.359375 l -6.043694,10.457073 c -0.62092,1.074344 -2.114654,1.744293 -3.352326,1.666259 C 50.70498,32.011533 50.35392,32 50,32 c -0.353931,0 -0.705,0.01153 -1.053229,0.03349 -1.237655,0.07804 -2.731376,-0.591916 -3.352296,-1.66626 L 39.550781,19.910156 C 38.885414,18.758657 37.656082,18.0498 36.326172,18.050781 Z M 50,38.746094 C 56.215539,38.745663 61.254337,43.784461 61.253906,50 61.254337,56.215539 56.215539,61.254337 50,61.253906 43.784461,61.254337 38.745663,56.215539 38.746094,50 38.745663,43.784461 43.784461,38.745663 50,38.746094 Z"
inkscape:path-effect="#path-effect20-7"
inkscape:original-d="m 36.326172,18.050781 a 3.721056,3.721056 0 0 0 -1.861328,0.5 l -3.929688,2.273438 a 3.7228036,3.7228036 0 0 0 -1.359375,5.085937 L 36.34375,38.3125 C 34.921877,39.972287 33.808215,41.898777 33.0625,44 H 18.722656 A 3.7219297,3.7219297 0 0 0 15,47.722656 v 4.554688 A 3.7219297,3.7219297 0 0 0 18.722656,56 H 33.0625 c 0.745715,2.101223 1.859377,4.027713 3.28125,5.6875 l -7.167969,12.402344 a 3.7228036,3.7228036 0 0 0 1.359375,5.085937 l 3.929688,2.273438 a 3.721056,3.721056 0 0 0 5.085937,-1.359375 L 46.71875,67.6875 C 47.784179,67.884035 48.877705,68 50,68 c 1.122295,0 2.215821,-0.115965 3.28125,-0.3125 l 7.167969,12.402344 a 3.721056,3.721056 0 0 0 5.085937,1.359375 l 3.929688,-2.273438 a 3.7228036,3.7228036 0 0 0 1.359375,-5.085937 L 63.65625,61.6875 C 65.078123,60.027713 66.191785,58.101223 66.9375,56 H 81.277344 A 3.7219297,3.7219297 0 0 0 85,52.277344 V 47.722656 A 3.7219297,3.7219297 0 0 0 81.277344,44 H 66.9375 c -0.745715,-2.101223 -1.859377,-4.027713 -3.28125,-5.6875 l 7.167969,-12.402344 a 3.7228036,3.7228036 0 0 0 -1.359375,-5.085937 l -3.929688,-2.273438 a 3.721056,3.721056 0 0 0 -5.085937,1.359375 L 53.28125,32.3125 C 52.215821,32.115965 51.122295,32 50,32 c -1.122295,0 -2.215821,0.115965 -3.28125,0.3125 L 39.550781,19.910156 A 3.721056,3.721056 0 0 0 36.326172,18.050781 Z M 50,38.746094 A 11.253125,11.253125 0 0 1 61.253906,50 11.253125,11.253125 0 0 1 50,61.253906 11.253125,11.253125 0 0 1 38.746094,50 11.253125,11.253125 0 0 1 50,38.746094 Z" /></g></svg>

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
width="100"
height="100"
id="svg3"
sodipodi:docname="solaar.svg"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xml:space="preserve"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><sodipodi:namedview
id="namedview3"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showguides="true"
inkscape:zoom="8"
inkscape:cx="0.5625"
inkscape:cy="79.25"
inkscape:current-layer="svg3" /><title
id="title1">Solaar</title><defs
id="defs2"><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect18"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><linearGradient
id="linearGradient17"
inkscape:collect="always"><stop
style="stop-color:#009099;stop-opacity:1;"
offset="0"
id="stop17" /><stop
style="stop-color:#00a899;stop-opacity:1;"
offset="1"
id="stop18" /></linearGradient><linearGradient
id="gradient_blue"><stop
style="stop-color:#009099;stop-opacity:1"
offset="0"
id="stop1" /><stop
style="stop-color:#00a899;stop-opacity:0.9"
offset="1"
id="stop2" /></linearGradient><linearGradient
x1="50"
y1="5.5"
x2="50"
y2="94.5"
id="gradient_rect"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-110.09871,-4.4507114)" /><linearGradient
x1="50.01833"
y1="5"
x2="50.01833"
y2="95"
id="gradient_dot"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="always"
xlink:href="#linearGradient17"
id="linearGradient18"
x1="50"
y1="5"
x2="50"
y2="95"
gradientUnits="userSpaceOnUse" /></defs><metadata
id="metadata2"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>Solaar</dc:title><dc:creator><cc:Agent><dc:title>Daniel Pavel</dc:title></cc:Agent></dc:creator><cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" /><dc:date>2013-06-25</dc:date><dc:identifier>solaar</dc:identifier></cc:Work><cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/3.0/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" /></cc:License></rdf:RDF></metadata><g
id="g3"><rect
style="fill:url(#linearGradient18);fill-opacity:1;stroke:none;stroke-width:3;stroke-linejoin:round;stroke-opacity:0.996078;paint-order:fill markers stroke"
id="rect17"
width="90"
height="90"
x="5"
y="5"
rx="10"
ry="10" /><path
id="path11"
style="display:inline;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.905882;paint-order:markers fill stroke"
d="m 36.326172,18.050781 c -0.653587,3.07e-4 -1.295564,0.172759 -1.861328,0.5 l -3.260348,1.886206 c -0.369666,0.213862 -0.976947,0.555623 -1.294346,0.840227 -1.095169,0.982014 -1.50919,2.530927 -1.050063,3.928399 0.133086,0.405083 0.488934,1.004291 0.702637,1.37405 l 5.656751,9.787566 c 0.62092,1.074344 0.455955,2.70357 -0.225142,3.739812 -0.385108,0.585915 -0.736584,1.1959 -1.052473,1.826946 C 33.386764,43.042894 32.056577,44 30.815708,44 H 19.405457 c -0.377101,0 -0.99151,-0.0065 -1.361861,0.06167 C 16.311702,44.380584 14.999644,45.89844 15,47.722656 v 4.554688 C 14.999599,54.333476 16.666524,56.000401 18.722656,56 h 12.093052 c 1.240869,0 2.571057,0.957108 3.126154,2.066017 0.315889,0.631045 0.667365,1.24103 1.052473,1.826945 0.681096,1.03624 0.84606,2.665465 0.22514,3.739809 l -6.043694,10.457073 c -1.028907,1.779844 -0.420325,4.056781 1.359375,5.085937 l 3.929688,2.273438 c 1.779707,1.029944 4.057417,0.421155 5.085937,-1.359375 l 6.043694,-10.457073 c 0.62092,-1.074344 2.114654,-1.744293 3.352326,-1.666259 C 49.29502,67.988467 49.64608,68 50,68 c 0.353931,0 0.705,-0.01153 1.053229,-0.03349 1.237655,-0.07804 2.731376,0.591916 3.352296,1.66626 l 6.043694,10.457073 c 1.02852,1.78053 3.30623,2.389319 5.085937,1.359375 l 3.929688,-2.273438 c 1.7797,-1.029156 2.388282,-3.306093 1.359375,-5.085937 L 64.780525,63.632771 c -0.62092,-1.074344 -0.455955,-2.70357 0.225142,-3.739812 0.385108,-0.585915 0.736584,-1.1959 1.052473,-1.826946 C 66.613236,56.957106 67.943423,56 69.184291,56 H 81.277344 C 83.333476,56.000401 85.000401,54.333476 85,52.277344 V 47.722656 C 85.000401,45.666524 83.333476,43.999599 81.277344,44 H 69.184291 c -1.240868,0 -2.571056,-0.957108 -3.126153,-2.066017 -0.315889,-0.631045 -0.667365,-1.24103 -1.052473,-1.826945 -0.681096,-1.03624 -0.84606,-2.665465 -0.22514,-3.739809 l 6.043694,-10.457073 c 1.028907,-1.779844 0.420325,-4.056781 -1.359375,-5.085937 l -3.929688,-2.273438 c -1.779707,-1.029944 -4.057417,-0.421155 -5.085937,1.359375 l -6.043694,10.457073 c -0.62092,1.074344 -2.114654,1.744293 -3.352326,1.666259 C 50.70498,32.011533 50.35392,32 50,32 c -0.353931,0 -0.705,0.01153 -1.053229,0.03349 -1.237655,0.07804 -2.731376,-0.591916 -3.352296,-1.66626 L 39.550781,19.910156 C 38.885414,18.758657 37.656082,18.0498 36.326172,18.050781 Z M 50,38.746094 C 56.215539,38.745663 61.254337,43.784461 61.253906,50 61.254337,56.215539 56.215539,61.254337 50,61.253906 43.784461,61.254337 38.745663,56.215539 38.746094,50 38.745663,43.784461 43.784461,38.745663 50,38.746094 Z"
inkscape:path-effect="#path-effect20"
inkscape:original-d="m 36.326172,18.050781 a 3.721056,3.721056 0 0 0 -1.861328,0.5 l -3.929688,2.273438 a 3.7228036,3.7228036 0 0 0 -1.359375,5.085937 L 36.34375,38.3125 C 34.921877,39.972287 33.808215,41.898777 33.0625,44 H 18.722656 A 3.7219297,3.7219297 0 0 0 15,47.722656 v 4.554688 A 3.7219297,3.7219297 0 0 0 18.722656,56 H 33.0625 c 0.745715,2.101223 1.859377,4.027713 3.28125,5.6875 l -7.167969,12.402344 a 3.7228036,3.7228036 0 0 0 1.359375,5.085937 l 3.929688,2.273438 a 3.721056,3.721056 0 0 0 5.085937,-1.359375 L 46.71875,67.6875 C 47.784179,67.884035 48.877705,68 50,68 c 1.122295,0 2.215821,-0.115965 3.28125,-0.3125 l 7.167969,12.402344 a 3.721056,3.721056 0 0 0 5.085937,1.359375 l 3.929688,-2.273438 a 3.7228036,3.7228036 0 0 0 1.359375,-5.085937 L 63.65625,61.6875 C 65.078123,60.027713 66.191785,58.101223 66.9375,56 H 81.277344 A 3.7219297,3.7219297 0 0 0 85,52.277344 V 47.722656 A 3.7219297,3.7219297 0 0 0 81.277344,44 H 66.9375 c -0.745715,-2.101223 -1.859377,-4.027713 -3.28125,-5.6875 l 7.167969,-12.402344 a 3.7228036,3.7228036 0 0 0 -1.359375,-5.085937 l -3.929688,-2.273438 a 3.721056,3.721056 0 0 0 -5.085937,1.359375 L 53.28125,32.3125 C 52.215821,32.115965 51.122295,32 50,32 c -1.122295,0 -2.215821,0.115965 -3.28125,0.3125 L 39.550781,19.910156 A 3.721056,3.721056 0 0 0 36.326172,18.050781 Z M 50,38.746094 A 11.253125,11.253125 0 0 1 61.253906,50 11.253125,11.253125 0 0 1 50,61.253906 11.253125,11.253125 0 0 1 38.746094,50 11.253125,11.253125 0 0 1 50,38.746094 Z" /></g></svg>

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1,234 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
width="100"
height="100"
id="svg3"
sodipodi:docname="solaar-init.svg"
xml:space="preserve"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><sodipodi:namedview
id="namedview3"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showguides="true"
inkscape:zoom="7.297342"
inkscape:cx="15.005464"
inkscape:cy="46.86638"
inkscape:current-layer="svg3"><sodipodi:guide
position="33.74894,95"
orientation="0,-1"
id="guide3"
inkscape:locked="false" /><sodipodi:guide
position="5,53.923662"
orientation="1,0"
id="guide4"
inkscape:locked="false" /><sodipodi:guide
position="67.152677,5"
orientation="0,-1"
id="guide5"
inkscape:locked="false" /><sodipodi:guide
position="95,74.370155"
orientation="1,0"
id="guide6"
inkscape:locked="false" /></sodipodi:namedview><title
id="title1">Solaar init</title><defs
id="defs2"><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect7"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><linearGradient
id="gradient_gray"><stop
style="stop-color:#848484;stop-opacity:1"
offset="0"
id="stop1" /><stop
style="stop-color:#9c9c9c;stop-opacity:0.9"
offset="1"
id="stop2" /></linearGradient><linearGradient
x1="5"
y1="50"
x2="95"
y2="50"
id="gradient_rect"
xlink:href="#gradient_gray"
gradientUnits="userSpaceOnUse" /><linearGradient
x1="37"
y1="50"
x2="63"
y2="50"
id="gradient_dot"
xlink:href="#gradient_gray"
gradientUnits="userSpaceOnUse" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20-7"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><linearGradient
id="gradient_black"><stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop1-3" /><stop
style="stop-color:#000000;stop-opacity:0.9"
offset="1"
id="stop2-3" /></linearGradient><linearGradient
x1="5"
y1="50"
x2="95"
y2="50"
id="gradient_rect-3"
xlink:href="#gradient_black"
gradientUnits="userSpaceOnUse" /><linearGradient
x1="37"
y1="50"
x2="63"
y2="50"
id="gradient_dot-8"
xlink:href="#gradient_black"
gradientUnits="userSpaceOnUse" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20-5"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20-7-6"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect18"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><linearGradient
id="gradient_blue"><stop
style="stop-color:#009099;stop-opacity:1"
offset="0"
id="stop1-4" /><stop
style="stop-color:#00a899;stop-opacity:0.9"
offset="1"
id="stop2-1" /></linearGradient><linearGradient
x1="50"
y1="5.5"
x2="50"
y2="94.5"
id="gradient_rect-8"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-110.09871,-4.4507114)" /><linearGradient
x1="50.01833"
y1="5"
x2="50.01833"
y2="95"
id="gradient_dot-5"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse" /></defs><metadata
id="metadata2"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>Solaar init</dc:title><dc:creator><cc:Agent><dc:title>Daniel Pavel</dc:title></cc:Agent></dc:creator><cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" /><dc:date>2013-06-25</dc:date><dc:identifier>solaar-init</dc:identifier></cc:Work><cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/3.0/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" /></cc:License></rdf:RDF></metadata><rect
style="fill:#808080;fill-opacity:1;stroke:none;stroke-width:3;stroke-linejoin:round;stroke-opacity:0.996078;paint-order:fill markers stroke"
id="rect17"
width="90"
height="90"
x="5"
y="5"
rx="10"
ry="10" /><path
id="path11-5"
style="display:inline;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.905882;paint-order:markers fill stroke"
d="m 36.326172,18.050781 c -0.653587,3.07e-4 -1.295564,0.172759 -1.861328,0.5 l -3.260348,1.886206 c -0.369666,0.213862 -0.976947,0.555623 -1.294346,0.840227 -1.095169,0.982014 -1.50919,2.530927 -1.050063,3.928399 0.133086,0.405083 0.488934,1.004291 0.702637,1.37405 l 5.656751,9.787566 c 0.62092,1.074344 0.455955,2.70357 -0.225142,3.739812 -0.385108,0.585915 -0.736584,1.1959 -1.052473,1.826946 C 33.386764,43.042894 32.056577,44 30.815708,44 H 19.405457 c -0.377101,0 -0.99151,-0.0065 -1.361861,0.06167 C 16.311702,44.380584 14.999644,45.89844 15,47.722656 v 4.554688 C 14.999599,54.333476 16.666524,56.000401 18.722656,56 h 12.093052 c 1.240869,0 2.571057,0.957108 3.126154,2.066017 0.315889,0.631045 0.667365,1.24103 1.052473,1.826945 0.681096,1.03624 0.84606,2.665465 0.22514,3.739809 l -6.043694,10.457073 c -1.028907,1.779844 -0.420325,4.056781 1.359375,5.085937 l 3.929688,2.273438 c 1.779707,1.029944 4.057417,0.421155 5.085937,-1.359375 l 6.043694,-10.457073 c 0.62092,-1.074344 2.114654,-1.744293 3.352326,-1.666259 C 49.29502,67.988467 49.64608,68 50,68 c 0.353931,0 0.705,-0.01153 1.053229,-0.03349 1.237655,-0.07804 2.731376,0.591916 3.352296,1.66626 l 6.043694,10.457073 c 1.02852,1.78053 3.30623,2.389319 5.085937,1.359375 l 3.929688,-2.273438 c 1.7797,-1.029156 2.388282,-3.306093 1.359375,-5.085937 L 64.780525,63.632771 c -0.62092,-1.074344 -0.455955,-2.70357 0.225142,-3.739812 0.385108,-0.585915 0.736584,-1.1959 1.052473,-1.826946 C 66.613236,56.957106 67.943423,56 69.184291,56 H 81.277344 C 83.333476,56.000401 85.000401,54.333476 85,52.277344 V 47.722656 C 85.000401,45.666524 83.333476,43.999599 81.277344,44 H 69.184291 c -1.240868,0 -2.571056,-0.957108 -3.126153,-2.066017 -0.315889,-0.631045 -0.667365,-1.24103 -1.052473,-1.826945 -0.681096,-1.03624 -0.84606,-2.665465 -0.22514,-3.739809 l 6.043694,-10.457073 c 1.028907,-1.779844 0.420325,-4.056781 -1.359375,-5.085937 l -3.929688,-2.273438 c -1.779707,-1.029944 -4.057417,-0.421155 -5.085937,1.359375 l -6.043694,10.457073 c -0.62092,1.074344 -2.114654,1.744293 -3.352326,1.666259 C 50.70498,32.011533 50.35392,32 50,32 c -0.353931,0 -0.705,0.01153 -1.053229,0.03349 -1.237655,0.07804 -2.731376,-0.591916 -3.352296,-1.66626 L 39.550781,19.910156 C 38.885414,18.758657 37.656082,18.0498 36.326172,18.050781 Z M 50,38.746094 C 56.215539,38.745663 61.254337,43.784461 61.253906,50 61.254337,56.215539 56.215539,61.254337 50,61.253906 43.784461,61.254337 38.745663,56.215539 38.746094,50 38.745663,43.784461 43.784461,38.745663 50,38.746094 Z"
inkscape:path-effect="#path-effect20-7"
inkscape:original-d="m 36.326172,18.050781 a 3.721056,3.721056 0 0 0 -1.861328,0.5 l -3.929688,2.273438 a 3.7228036,3.7228036 0 0 0 -1.359375,5.085937 L 36.34375,38.3125 C 34.921877,39.972287 33.808215,41.898777 33.0625,44 H 18.722656 A 3.7219297,3.7219297 0 0 0 15,47.722656 v 4.554688 A 3.7219297,3.7219297 0 0 0 18.722656,56 H 33.0625 c 0.745715,2.101223 1.859377,4.027713 3.28125,5.6875 l -7.167969,12.402344 a 3.7228036,3.7228036 0 0 0 1.359375,5.085937 l 3.929688,2.273438 a 3.721056,3.721056 0 0 0 5.085937,-1.359375 L 46.71875,67.6875 C 47.784179,67.884035 48.877705,68 50,68 c 1.122295,0 2.215821,-0.115965 3.28125,-0.3125 l 7.167969,12.402344 a 3.721056,3.721056 0 0 0 5.085937,1.359375 l 3.929688,-2.273438 a 3.7228036,3.7228036 0 0 0 1.359375,-5.085937 L 63.65625,61.6875 C 65.078123,60.027713 66.191785,58.101223 66.9375,56 H 81.277344 A 3.7219297,3.7219297 0 0 0 85,52.277344 V 47.722656 A 3.7219297,3.7219297 0 0 0 81.277344,44 H 66.9375 c -0.745715,-2.101223 -1.859377,-4.027713 -3.28125,-5.6875 l 7.167969,-12.402344 a 3.7228036,3.7228036 0 0 0 -1.359375,-5.085937 l -3.929688,-2.273438 a 3.721056,3.721056 0 0 0 -5.085937,1.359375 L 53.28125,32.3125 C 52.215821,32.115965 51.122295,32 50,32 c -1.122295,0 -2.215821,0.115965 -3.28125,0.3125 L 39.550781,19.910156 A 3.721056,3.721056 0 0 0 36.326172,18.050781 Z M 50,38.746094 A 11.253125,11.253125 0 0 1 61.253906,50 11.253125,11.253125 0 0 1 50,61.253906 11.253125,11.253125 0 0 1 38.746094,50 11.253125,11.253125 0 0 1 50,38.746094 Z" /></svg>

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -0,0 +1,241 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
width="100"
height="100"
id="svg3"
sodipodi:docname="solaar-init.svg"
xml:space="preserve"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><sodipodi:namedview
id="namedview3"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showguides="true"
inkscape:zoom="7.297342"
inkscape:cx="15.005464"
inkscape:cy="46.86638"
inkscape:current-layer="svg3"><sodipodi:guide
position="33.74894,95"
orientation="0,-1"
id="guide3"
inkscape:locked="false" /><sodipodi:guide
position="5,53.923662"
orientation="1,0"
id="guide4"
inkscape:locked="false" /><sodipodi:guide
position="67.152677,5"
orientation="0,-1"
id="guide5"
inkscape:locked="false" /><sodipodi:guide
position="95,74.370155"
orientation="1,0"
id="guide6"
inkscape:locked="false" /></sodipodi:namedview><title
id="title1">Solaar init</title><defs
id="defs2"><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect7"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><linearGradient
id="gradient_gray"><stop
style="stop-color:#848484;stop-opacity:1"
offset="0"
id="stop1" /><stop
style="stop-color:#9c9c9c;stop-opacity:0.9"
offset="1"
id="stop2" /></linearGradient><linearGradient
x1="5"
y1="50"
x2="95"
y2="50"
id="gradient_rect"
xlink:href="#gradient_gray"
gradientUnits="userSpaceOnUse" /><linearGradient
x1="37"
y1="50"
x2="63"
y2="50"
id="gradient_dot"
xlink:href="#gradient_gray"
gradientUnits="userSpaceOnUse" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20-7"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><linearGradient
id="gradient_black"><stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop1-3" /><stop
style="stop-color:#000000;stop-opacity:0.9"
offset="1"
id="stop2-3" /></linearGradient><linearGradient
x1="5"
y1="50"
x2="95"
y2="50"
id="gradient_rect-3"
xlink:href="#gradient_black"
gradientUnits="userSpaceOnUse" /><linearGradient
x1="37"
y1="50"
x2="63"
y2="50"
id="gradient_dot-8"
xlink:href="#gradient_black"
gradientUnits="userSpaceOnUse" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20-5"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20-7-6"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect18"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><linearGradient
id="gradient_blue"><stop
style="stop-color:#009099;stop-opacity:1"
offset="0"
id="stop1-4" /><stop
style="stop-color:#00a899;stop-opacity:0.9"
offset="1"
id="stop2-1" /></linearGradient><linearGradient
x1="50"
y1="5.5"
x2="50"
y2="94.5"
id="gradient_rect-8"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-110.09871,-4.4507114)" /><linearGradient
x1="50.01833"
y1="5"
x2="50.01833"
y2="95"
id="gradient_dot-5"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse" /></defs><metadata
id="metadata2"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>Solaar init</dc:title><dc:creator><cc:Agent><dc:title>Daniel Pavel</dc:title></cc:Agent></dc:creator><cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" /><dc:date>2013-06-25</dc:date><dc:identifier>solaar-init</dc:identifier></cc:Work><cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/3.0/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" /></cc:License></rdf:RDF></metadata><rect
style="fill:#808080;fill-opacity:1;stroke:none;stroke-width:3;stroke-linejoin:round;stroke-opacity:0.996078;paint-order:fill markers stroke"
id="rect17"
width="90"
height="90"
x="5"
y="5"
rx="10"
ry="10" /><path
id="path6"
style="display:inline;fill:#131313;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.880197;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.905882;paint-order:markers fill stroke"
d="m 36.326172,18.050781 c -0.653587,3.07e-4 -1.295564,0.172759 -1.861328,0.5 l -3.260348,1.886206 c -0.369666,0.213862 -0.976947,0.555623 -1.294346,0.840227 -1.095169,0.982014 -1.50919,2.530927 -1.050063,3.928399 0.133086,0.405083 0.488934,1.004291 0.702637,1.37405 l 5.656751,9.787566 c 0.62092,1.074344 0.455955,2.70357 -0.225142,3.739812 -0.385108,0.585915 -0.736584,1.1959 -1.052473,1.826946 C 33.386764,43.042894 32.056577,44 30.815708,44 H 19.405457 c -0.377101,0 -0.99151,-0.0065 -1.361861,0.06167 C 16.311703,44.380584 14.999644,45.89844 15,47.722656 v 4.554688 C 14.999599,54.333476 16.666524,56.000401 18.722656,56 h 12.093052 c 1.240869,0 2.571057,0.957108 3.126154,2.066017 0.315889,0.631045 0.667365,1.24103 1.052473,1.826945 0.681096,1.03624 0.84606,2.665465 0.22514,3.739809 l -6.043694,10.457073 c -1.028907,1.779844 -0.420325,4.056781 1.359375,5.085937 l 3.929688,2.273438 c 1.779707,1.029944 4.057417,0.421155 5.085937,-1.359375 l 6.043694,-10.457073 c 0.62092,-1.074344 2.114654,-1.744293 3.352326,-1.666259 C 49.29502,67.988467 49.64608,68 50,68 c 0.353931,0 0.705,-0.01153 1.053229,-0.03349 1.237655,-0.07804 2.731376,0.591916 3.352296,1.66626 l 6.043694,10.457073 c 1.02852,1.78053 3.30623,2.389319 5.085937,1.359375 l 3.929688,-2.273438 c 1.7797,-1.029156 2.388282,-3.306093 1.359375,-5.085937 L 64.780525,63.632771 c -0.62092,-1.074344 -0.455955,-2.70357 0.225142,-3.739812 0.385108,-0.585915 0.736584,-1.1959 1.052473,-1.826946 C 66.613236,56.957106 67.943423,56 69.184291,56 H 81.277344 C 83.333476,56.000401 85.000401,54.333476 85,52.277344 V 47.722656 C 85.000401,45.666524 83.333476,43.999599 81.277344,44 H 69.184291 c -1.240868,0 -2.571056,-0.957108 -3.126153,-2.066017 -0.315889,-0.631045 -0.667365,-1.24103 -1.052473,-1.826945 -0.681096,-1.03624 -0.84606,-2.665465 -0.22514,-3.739809 l 6.043694,-10.457073 c 1.028907,-1.779844 0.420325,-4.056781 -1.359375,-5.085937 l -3.929688,-2.273438 c -1.779707,-1.029944 -4.057417,-0.421155 -5.085937,1.359375 l -6.043694,10.457073 c -0.62092,1.074344 -2.114654,1.744293 -3.352326,1.666259 C 50.70498,32.011533 50.35392,32 50,32 c -0.353931,0 -0.705,0.01153 -1.053229,0.03349 -1.237655,0.07804 -2.731376,-0.591916 -3.352296,-1.66626 L 39.550781,19.910156 C 38.885414,18.758657 37.656082,18.0498 36.326172,18.050781 Z m 13.347319,17.858481 c 6.215539,-4.32e-4 13.90713,7.251873 13.906698,13.467412 4.32e-4,6.21554 -7.19351,14.539222 -13.409049,14.538791 -6.215539,4.31e-4 -14.18,-6.257225 -14.179568,-12.472764 -4.32e-4,-6.215539 7.46638,-15.533871 13.681919,-15.533439 z"
inkscape:path-effect="#path-effect7"
inkscape:original-d="m 36.326172,18.050781 c -0.653587,3.07e-4 -1.295564,0.172759 -1.861328,0.5 l -3.929688,2.273438 c -1.7797,1.029156 -2.388282,3.306093 -1.359375,5.085937 L 36.34375,38.3125 C 34.921877,39.972287 33.808215,41.898777 33.0625,44 H 18.722656 C 16.666524,43.999599 14.999599,45.666524 15,47.722656 v 4.554688 C 14.999599,54.333476 16.666524,56.000401 18.722656,56 H 33.0625 c 0.745715,2.101223 1.859377,4.027713 3.28125,5.6875 l -7.167969,12.402344 c -1.028907,1.779844 -0.420325,4.056781 1.359375,5.085937 l 3.929688,2.273438 c 1.779707,1.029944 4.057417,0.421155 5.085937,-1.359375 L 46.71875,67.6875 C 47.784179,67.884035 48.877705,68 50,68 c 1.122295,0 2.215821,-0.115965 3.28125,-0.3125 l 7.167969,12.402344 c 1.02852,1.78053 3.30623,2.389319 5.085937,1.359375 l 3.929688,-2.273438 c 1.7797,-1.029156 2.388282,-3.306093 1.359375,-5.085937 L 63.65625,61.6875 C 65.078123,60.027713 66.191785,58.101223 66.9375,56 H 81.277344 C 83.333476,56.000401 85.000401,54.333476 85,52.277344 V 47.722656 C 85.000401,45.666524 83.333476,43.999599 81.277344,44 H 66.9375 c -0.745715,-2.101223 -1.859377,-4.027713 -3.28125,-5.6875 l 7.167969,-12.402344 c 1.028907,-1.779844 0.420325,-4.056781 -1.359375,-5.085937 l -3.929688,-2.273438 c -1.779707,-1.029944 -4.057417,-0.421155 -5.085937,1.359375 L 53.28125,32.3125 C 52.215821,32.115965 51.122295,32 50,32 c -1.122295,0 -2.215821,0.115965 -3.28125,0.3125 L 39.550781,19.910156 C 38.885414,18.758657 37.656082,18.0498 36.326172,18.050781 Z m 13.347319,17.858481 c 6.215539,-4.32e-4 13.90713,7.251873 13.906698,13.467412 4.32e-4,6.21554 -7.19351,14.539222 -13.409049,14.538791 -6.215539,4.31e-4 -14.18,-6.257225 -14.179568,-12.472764 -4.32e-4,-6.215539 7.46638,-15.533871 13.681919,-15.533439 z"
transform="matrix(1.0973922,0.29404534,-0.29404534,1.0973922,9.8327959,-19.571815)"
sodipodi:nodetypes="cccccccccccccccccsccccccccccccccccccscccccccc" /><path
id="path11-5"
style="display:inline;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.905882;paint-order:markers fill stroke"
d="m 36.326172,18.050781 c -0.653587,3.07e-4 -1.295564,0.172759 -1.861328,0.5 l -3.260348,1.886206 c -0.369666,0.213862 -0.976947,0.555623 -1.294346,0.840227 -1.095169,0.982014 -1.50919,2.530927 -1.050063,3.928399 0.133086,0.405083 0.488934,1.004291 0.702637,1.37405 l 5.656751,9.787566 c 0.62092,1.074344 0.455955,2.70357 -0.225142,3.739812 -0.385108,0.585915 -0.736584,1.1959 -1.052473,1.826946 C 33.386764,43.042894 32.056577,44 30.815708,44 H 19.405457 c -0.377101,0 -0.99151,-0.0065 -1.361861,0.06167 C 16.311702,44.380584 14.999644,45.89844 15,47.722656 v 4.554688 C 14.999599,54.333476 16.666524,56.000401 18.722656,56 h 12.093052 c 1.240869,0 2.571057,0.957108 3.126154,2.066017 0.315889,0.631045 0.667365,1.24103 1.052473,1.826945 0.681096,1.03624 0.84606,2.665465 0.22514,3.739809 l -6.043694,10.457073 c -1.028907,1.779844 -0.420325,4.056781 1.359375,5.085937 l 3.929688,2.273438 c 1.779707,1.029944 4.057417,0.421155 5.085937,-1.359375 l 6.043694,-10.457073 c 0.62092,-1.074344 2.114654,-1.744293 3.352326,-1.666259 C 49.29502,67.988467 49.64608,68 50,68 c 0.353931,0 0.705,-0.01153 1.053229,-0.03349 1.237655,-0.07804 2.731376,0.591916 3.352296,1.66626 l 6.043694,10.457073 c 1.02852,1.78053 3.30623,2.389319 5.085937,1.359375 l 3.929688,-2.273438 c 1.7797,-1.029156 2.388282,-3.306093 1.359375,-5.085937 L 64.780525,63.632771 c -0.62092,-1.074344 -0.455955,-2.70357 0.225142,-3.739812 0.385108,-0.585915 0.736584,-1.1959 1.052473,-1.826946 C 66.613236,56.957106 67.943423,56 69.184291,56 H 81.277344 C 83.333476,56.000401 85.000401,54.333476 85,52.277344 V 47.722656 C 85.000401,45.666524 83.333476,43.999599 81.277344,44 H 69.184291 c -1.240868,0 -2.571056,-0.957108 -3.126153,-2.066017 -0.315889,-0.631045 -0.667365,-1.24103 -1.052473,-1.826945 -0.681096,-1.03624 -0.84606,-2.665465 -0.22514,-3.739809 l 6.043694,-10.457073 c 1.028907,-1.779844 0.420325,-4.056781 -1.359375,-5.085937 l -3.929688,-2.273438 c -1.779707,-1.029944 -4.057417,-0.421155 -5.085937,1.359375 l -6.043694,10.457073 c -0.62092,1.074344 -2.114654,1.744293 -3.352326,1.666259 C 50.70498,32.011533 50.35392,32 50,32 c -0.353931,0 -0.705,0.01153 -1.053229,0.03349 -1.237655,0.07804 -2.731376,-0.591916 -3.352296,-1.66626 L 39.550781,19.910156 C 38.885414,18.758657 37.656082,18.0498 36.326172,18.050781 Z M 50,38.746094 C 56.215539,38.745663 61.254337,43.784461 61.253906,50 61.254337,56.215539 56.215539,61.254337 50,61.253906 43.784461,61.254337 38.745663,56.215539 38.746094,50 38.745663,43.784461 43.784461,38.745663 50,38.746094 Z"
inkscape:path-effect="#path-effect20-7"
inkscape:original-d="m 36.326172,18.050781 a 3.721056,3.721056 0 0 0 -1.861328,0.5 l -3.929688,2.273438 a 3.7228036,3.7228036 0 0 0 -1.359375,5.085937 L 36.34375,38.3125 C 34.921877,39.972287 33.808215,41.898777 33.0625,44 H 18.722656 A 3.7219297,3.7219297 0 0 0 15,47.722656 v 4.554688 A 3.7219297,3.7219297 0 0 0 18.722656,56 H 33.0625 c 0.745715,2.101223 1.859377,4.027713 3.28125,5.6875 l -7.167969,12.402344 a 3.7228036,3.7228036 0 0 0 1.359375,5.085937 l 3.929688,2.273438 a 3.721056,3.721056 0 0 0 5.085937,-1.359375 L 46.71875,67.6875 C 47.784179,67.884035 48.877705,68 50,68 c 1.122295,0 2.215821,-0.115965 3.28125,-0.3125 l 7.167969,12.402344 a 3.721056,3.721056 0 0 0 5.085937,1.359375 l 3.929688,-2.273438 a 3.7228036,3.7228036 0 0 0 1.359375,-5.085937 L 63.65625,61.6875 C 65.078123,60.027713 66.191785,58.101223 66.9375,56 H 81.277344 A 3.7219297,3.7219297 0 0 0 85,52.277344 V 47.722656 A 3.7219297,3.7219297 0 0 0 81.277344,44 H 66.9375 c -0.745715,-2.101223 -1.859377,-4.027713 -3.28125,-5.6875 l 7.167969,-12.402344 a 3.7228036,3.7228036 0 0 0 -1.359375,-5.085937 l -3.929688,-2.273438 a 3.721056,3.721056 0 0 0 -5.085937,1.359375 L 53.28125,32.3125 C 52.215821,32.115965 51.122295,32 50,32 c -1.122295,0 -2.215821,0.115965 -3.28125,0.3125 L 39.550781,19.910156 A 3.721056,3.721056 0 0 0 36.326172,18.050781 Z M 50,38.746094 A 11.253125,11.253125 0 0 1 61.253906,50 11.253125,11.253125 0 0 1 50,61.253906 11.253125,11.253125 0 0 1 38.746094,50 11.253125,11.253125 0 0 1 50,38.746094 Z" /></svg>

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -0,0 +1,182 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
width="100"
height="100"
id="svg3"
sodipodi:docname="solaar-symbolic_dark.svg"
xml:space="preserve"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><sodipodi:namedview
id="namedview3"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showguides="true"
inkscape:zoom="4.4936636"
inkscape:cx="76.440969"
inkscape:cy="79.445199"
inkscape:current-layer="svg3"><sodipodi:guide
position="40.341527,95"
orientation="0,-1"
id="guide3"
inkscape:locked="false" /><sodipodi:guide
position="5,55.07737"
orientation="1,0"
id="guide4"
inkscape:locked="false" /><sodipodi:guide
position="95,52.215267"
orientation="1,0"
id="guide5"
inkscape:locked="false" /><sodipodi:guide
position="61.950078,5"
orientation="0,-1"
id="guide6"
inkscape:locked="false" /></sodipodi:namedview><title
id="title1">Solaar</title><defs
id="defs2"><linearGradient
id="gradient_black"><stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop1" /><stop
style="stop-color:#000000;stop-opacity:0.9"
offset="1"
id="stop2" /></linearGradient><linearGradient
x1="5"
y1="50"
x2="95"
y2="50"
id="gradient_rect"
xlink:href="#gradient_black"
gradientUnits="userSpaceOnUse" /><linearGradient
x1="37"
y1="50"
x2="63"
y2="50"
id="gradient_dot"
xlink:href="#gradient_black"
gradientUnits="userSpaceOnUse" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20-5"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20-7"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect18"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><linearGradient
id="gradient_blue"><stop
style="stop-color:#009099;stop-opacity:1"
offset="0"
id="stop1-4" /><stop
style="stop-color:#00a899;stop-opacity:0.9"
offset="1"
id="stop2-1" /></linearGradient><linearGradient
x1="50"
y1="5.5"
x2="50"
y2="94.5"
id="gradient_rect-8"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-110.09871,-4.4507114)" /><linearGradient
x1="50.01833"
y1="5"
x2="50.01833"
y2="95"
id="gradient_dot-5"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse" /></defs><metadata
id="metadata2"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>Solaar</dc:title><dc:creator><cc:Agent><dc:title>Daniel Pavel</dc:title></cc:Agent></dc:creator><cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" /><dc:date>2013-06-25</dc:date><dc:identifier>solaar</dc:identifier></cc:Work><cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/3.0/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" /></cc:License></rdf:RDF></metadata><g
id="g3-7"><rect
style="fill:#f2f2f2;fill-opacity:1;stroke:none;stroke-width:3;stroke-linejoin:round;stroke-opacity:0.996078;paint-order:fill markers stroke"
id="rect17"
width="90"
height="90"
x="5"
y="5"
rx="10"
ry="10" /><path
id="path11-5"
style="display:inline;fill:#131313;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.905882;paint-order:markers fill stroke"
d="m 36.326172,18.050781 c -0.653587,3.07e-4 -1.295564,0.172759 -1.861328,0.5 l -3.260348,1.886206 c -0.369666,0.213862 -0.976947,0.555623 -1.294346,0.840227 -1.095169,0.982014 -1.50919,2.530927 -1.050063,3.928399 0.133086,0.405083 0.488934,1.004291 0.702637,1.37405 l 5.656751,9.787566 c 0.62092,1.074344 0.455955,2.70357 -0.225142,3.739812 -0.385108,0.585915 -0.736584,1.1959 -1.052473,1.826946 C 33.386764,43.042894 32.056577,44 30.815708,44 H 19.405457 c -0.377101,0 -0.99151,-0.0065 -1.361861,0.06167 C 16.311702,44.380584 14.999644,45.89844 15,47.722656 v 4.554688 C 14.999599,54.333476 16.666524,56.000401 18.722656,56 h 12.093052 c 1.240869,0 2.571057,0.957108 3.126154,2.066017 0.315889,0.631045 0.667365,1.24103 1.052473,1.826945 0.681096,1.03624 0.84606,2.665465 0.22514,3.739809 l -6.043694,10.457073 c -1.028907,1.779844 -0.420325,4.056781 1.359375,5.085937 l 3.929688,2.273438 c 1.779707,1.029944 4.057417,0.421155 5.085937,-1.359375 l 6.043694,-10.457073 c 0.62092,-1.074344 2.114654,-1.744293 3.352326,-1.666259 C 49.29502,67.988467 49.64608,68 50,68 c 0.353931,0 0.705,-0.01153 1.053229,-0.03349 1.237655,-0.07804 2.731376,0.591916 3.352296,1.66626 l 6.043694,10.457073 c 1.02852,1.78053 3.30623,2.389319 5.085937,1.359375 l 3.929688,-2.273438 c 1.7797,-1.029156 2.388282,-3.306093 1.359375,-5.085937 L 64.780525,63.632771 c -0.62092,-1.074344 -0.455955,-2.70357 0.225142,-3.739812 0.385108,-0.585915 0.736584,-1.1959 1.052473,-1.826946 C 66.613236,56.957106 67.943423,56 69.184291,56 H 81.277344 C 83.333476,56.000401 85.000401,54.333476 85,52.277344 V 47.722656 C 85.000401,45.666524 83.333476,43.999599 81.277344,44 H 69.184291 c -1.240868,0 -2.571056,-0.957108 -3.126153,-2.066017 -0.315889,-0.631045 -0.667365,-1.24103 -1.052473,-1.826945 -0.681096,-1.03624 -0.84606,-2.665465 -0.22514,-3.739809 l 6.043694,-10.457073 c 1.028907,-1.779844 0.420325,-4.056781 -1.359375,-5.085937 l -3.929688,-2.273438 c -1.779707,-1.029944 -4.057417,-0.421155 -5.085937,1.359375 l -6.043694,10.457073 c -0.62092,1.074344 -2.114654,1.744293 -3.352326,1.666259 C 50.70498,32.011533 50.35392,32 50,32 c -0.353931,0 -0.705,0.01153 -1.053229,0.03349 -1.237655,0.07804 -2.731376,-0.591916 -3.352296,-1.66626 L 39.550781,19.910156 C 38.885414,18.758657 37.656082,18.0498 36.326172,18.050781 Z M 50,38.746094 C 56.215539,38.745663 61.254337,43.784461 61.253906,50 61.254337,56.215539 56.215539,61.254337 50,61.253906 43.784461,61.254337 38.745663,56.215539 38.746094,50 38.745663,43.784461 43.784461,38.745663 50,38.746094 Z"
inkscape:path-effect="#path-effect20-7"
inkscape:original-d="m 36.326172,18.050781 a 3.721056,3.721056 0 0 0 -1.861328,0.5 l -3.929688,2.273438 a 3.7228036,3.7228036 0 0 0 -1.359375,5.085937 L 36.34375,38.3125 C 34.921877,39.972287 33.808215,41.898777 33.0625,44 H 18.722656 A 3.7219297,3.7219297 0 0 0 15,47.722656 v 4.554688 A 3.7219297,3.7219297 0 0 0 18.722656,56 H 33.0625 c 0.745715,2.101223 1.859377,4.027713 3.28125,5.6875 l -7.167969,12.402344 a 3.7228036,3.7228036 0 0 0 1.359375,5.085937 l 3.929688,2.273438 a 3.721056,3.721056 0 0 0 5.085937,-1.359375 L 46.71875,67.6875 C 47.784179,67.884035 48.877705,68 50,68 c 1.122295,0 2.215821,-0.115965 3.28125,-0.3125 l 7.167969,12.402344 a 3.721056,3.721056 0 0 0 5.085937,1.359375 l 3.929688,-2.273438 a 3.7228036,3.7228036 0 0 0 1.359375,-5.085937 L 63.65625,61.6875 C 65.078123,60.027713 66.191785,58.101223 66.9375,56 H 81.277344 A 3.7219297,3.7219297 0 0 0 85,52.277344 V 47.722656 A 3.7219297,3.7219297 0 0 0 81.277344,44 H 66.9375 c -0.745715,-2.101223 -1.859377,-4.027713 -3.28125,-5.6875 l 7.167969,-12.402344 a 3.7228036,3.7228036 0 0 0 -1.359375,-5.085937 l -3.929688,-2.273438 a 3.721056,3.721056 0 0 0 -5.085937,1.359375 L 53.28125,32.3125 C 52.215821,32.115965 51.122295,32 50,32 c -1.122295,0 -2.215821,0.115965 -3.28125,0.3125 L 39.550781,19.910156 A 3.721056,3.721056 0 0 0 36.326172,18.050781 Z M 50,38.746094 A 11.253125,11.253125 0 0 1 61.253906,50 11.253125,11.253125 0 0 1 50,61.253906 11.253125,11.253125 0 0 1 38.746094,50 11.253125,11.253125 0 0 1 50,38.746094 Z" /></g></svg>

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1,182 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
width="100"
height="100"
id="svg3"
sodipodi:docname="solaar-symbolic.svg"
xml:space="preserve"
inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"><sodipodi:namedview
id="namedview3"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#505050"
showguides="true"
inkscape:zoom="6.355"
inkscape:cx="8.5759245"
inkscape:cy="34.618411"
inkscape:current-layer="g3-7"><sodipodi:guide
position="40.341527,95"
orientation="0,-1"
id="guide3"
inkscape:locked="false" /><sodipodi:guide
position="5,55.07737"
orientation="1,0"
id="guide4"
inkscape:locked="false" /><sodipodi:guide
position="95,52.215267"
orientation="1,0"
id="guide5"
inkscape:locked="false" /><sodipodi:guide
position="61.950078,5"
orientation="0,-1"
id="guide6"
inkscape:locked="false" /></sodipodi:namedview><title
id="title1">Solaar</title><defs
id="defs2"><linearGradient
id="gradient_black"><stop
style="stop-color:#000000;stop-opacity:1"
offset="0"
id="stop1" /><stop
style="stop-color:#000000;stop-opacity:0.9"
offset="1"
id="stop2" /></linearGradient><linearGradient
x1="5"
y1="50"
x2="95"
y2="50"
id="gradient_rect"
xlink:href="#gradient_black"
gradientUnits="userSpaceOnUse" /><linearGradient
x1="37"
y1="50"
x2="63"
y2="50"
id="gradient_dot"
xlink:href="#gradient_black"
gradientUnits="userSpaceOnUse" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20-5"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect20-7"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,0,1,0,0.77328184,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0.68280054,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,2.2467915,0,1 @ F,0,0,1,0,0,0,1 | F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><inkscape:path-effect
effect="fillet_chamfer"
id="path-effect18"
is_visible="true"
lpeversion="1"
nodesatellites_param="F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,3.7219297,0,1 @ F,0,1,1,0,3.7219297,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1 @ F,0,0,1,0,0,0,1"
radius="0"
unit="px"
method="auto"
mode="F"
chamfer_steps="1"
flexible="false"
use_knot_distance="true"
apply_no_radius="true"
apply_with_radius="true"
only_selected="false"
hide_knots="false" /><linearGradient
id="gradient_blue"><stop
style="stop-color:#009099;stop-opacity:1"
offset="0"
id="stop1-4" /><stop
style="stop-color:#00a899;stop-opacity:0.9"
offset="1"
id="stop2-1" /></linearGradient><linearGradient
x1="50"
y1="5.5"
x2="50"
y2="94.5"
id="gradient_rect-8"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-110.09871,-4.4507114)" /><linearGradient
x1="50.01833"
y1="5"
x2="50.01833"
y2="95"
id="gradient_dot-5"
xlink:href="#gradient_blue"
gradientUnits="userSpaceOnUse" /></defs><metadata
id="metadata2"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>Solaar</dc:title><dc:creator><cc:Agent><dc:title>Daniel Pavel</dc:title></cc:Agent></dc:creator><cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" /><dc:date>2013-06-25</dc:date><dc:identifier>solaar</dc:identifier></cc:Work><cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/3.0/"><cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" /><cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" /><cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" /><cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" /><cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" /></cc:License></rdf:RDF></metadata><g
id="g3-7"><rect
style="fill:#131313;fill-opacity:1;stroke:none;stroke-width:3;stroke-linejoin:round;stroke-opacity:0.996078;paint-order:fill markers stroke"
id="rect17"
width="90"
height="90"
x="5"
y="5"
rx="10"
ry="10" /><path
id="path11-5"
style="display:inline;fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:0.905882;paint-order:markers fill stroke"
d="m 36.326172,18.050781 c -0.653587,3.07e-4 -1.295564,0.172759 -1.861328,0.5 l -3.260348,1.886206 c -0.369666,0.213862 -0.976947,0.555623 -1.294346,0.840227 -1.095169,0.982014 -1.50919,2.530927 -1.050063,3.928399 0.133086,0.405083 0.488934,1.004291 0.702637,1.37405 l 5.656751,9.787566 c 0.62092,1.074344 0.455955,2.70357 -0.225142,3.739812 -0.385108,0.585915 -0.736584,1.1959 -1.052473,1.826946 C 33.386764,43.042894 32.056577,44 30.815708,44 H 19.405457 c -0.377101,0 -0.99151,-0.0065 -1.361861,0.06167 C 16.311702,44.380584 14.999644,45.89844 15,47.722656 v 4.554688 C 14.999599,54.333476 16.666524,56.000401 18.722656,56 h 12.093052 c 1.240869,0 2.571057,0.957108 3.126154,2.066017 0.315889,0.631045 0.667365,1.24103 1.052473,1.826945 0.681096,1.03624 0.84606,2.665465 0.22514,3.739809 l -6.043694,10.457073 c -1.028907,1.779844 -0.420325,4.056781 1.359375,5.085937 l 3.929688,2.273438 c 1.779707,1.029944 4.057417,0.421155 5.085937,-1.359375 l 6.043694,-10.457073 c 0.62092,-1.074344 2.114654,-1.744293 3.352326,-1.666259 C 49.29502,67.988467 49.64608,68 50,68 c 0.353931,0 0.705,-0.01153 1.053229,-0.03349 1.237655,-0.07804 2.731376,0.591916 3.352296,1.66626 l 6.043694,10.457073 c 1.02852,1.78053 3.30623,2.389319 5.085937,1.359375 l 3.929688,-2.273438 c 1.7797,-1.029156 2.388282,-3.306093 1.359375,-5.085937 L 64.780525,63.632771 c -0.62092,-1.074344 -0.455955,-2.70357 0.225142,-3.739812 0.385108,-0.585915 0.736584,-1.1959 1.052473,-1.826946 C 66.613236,56.957106 67.943423,56 69.184291,56 H 81.277344 C 83.333476,56.000401 85.000401,54.333476 85,52.277344 V 47.722656 C 85.000401,45.666524 83.333476,43.999599 81.277344,44 H 69.184291 c -1.240868,0 -2.571056,-0.957108 -3.126153,-2.066017 -0.315889,-0.631045 -0.667365,-1.24103 -1.052473,-1.826945 -0.681096,-1.03624 -0.84606,-2.665465 -0.22514,-3.739809 l 6.043694,-10.457073 c 1.028907,-1.779844 0.420325,-4.056781 -1.359375,-5.085937 l -3.929688,-2.273438 c -1.779707,-1.029944 -4.057417,-0.421155 -5.085937,1.359375 l -6.043694,10.457073 c -0.62092,1.074344 -2.114654,1.744293 -3.352326,1.666259 C 50.70498,32.011533 50.35392,32 50,32 c -0.353931,0 -0.705,0.01153 -1.053229,0.03349 -1.237655,0.07804 -2.731376,-0.591916 -3.352296,-1.66626 L 39.550781,19.910156 C 38.885414,18.758657 37.656082,18.0498 36.326172,18.050781 Z M 50,38.746094 C 56.215539,38.745663 61.254337,43.784461 61.253906,50 61.254337,56.215539 56.215539,61.254337 50,61.253906 43.784461,61.254337 38.745663,56.215539 38.746094,50 38.745663,43.784461 43.784461,38.745663 50,38.746094 Z"
inkscape:path-effect="#path-effect20-7"
inkscape:original-d="m 36.326172,18.050781 a 3.721056,3.721056 0 0 0 -1.861328,0.5 l -3.929688,2.273438 a 3.7228036,3.7228036 0 0 0 -1.359375,5.085937 L 36.34375,38.3125 C 34.921877,39.972287 33.808215,41.898777 33.0625,44 H 18.722656 A 3.7219297,3.7219297 0 0 0 15,47.722656 v 4.554688 A 3.7219297,3.7219297 0 0 0 18.722656,56 H 33.0625 c 0.745715,2.101223 1.859377,4.027713 3.28125,5.6875 l -7.167969,12.402344 a 3.7228036,3.7228036 0 0 0 1.359375,5.085937 l 3.929688,2.273438 a 3.721056,3.721056 0 0 0 5.085937,-1.359375 L 46.71875,67.6875 C 47.784179,67.884035 48.877705,68 50,68 c 1.122295,0 2.215821,-0.115965 3.28125,-0.3125 l 7.167969,12.402344 a 3.721056,3.721056 0 0 0 5.085937,1.359375 l 3.929688,-2.273438 a 3.7228036,3.7228036 0 0 0 1.359375,-5.085937 L 63.65625,61.6875 C 65.078123,60.027713 66.191785,58.101223 66.9375,56 H 81.277344 A 3.7219297,3.7219297 0 0 0 85,52.277344 V 47.722656 A 3.7219297,3.7219297 0 0 0 81.277344,44 H 66.9375 c -0.745715,-2.101223 -1.859377,-4.027713 -3.28125,-5.6875 l 7.167969,-12.402344 a 3.7228036,3.7228036 0 0 0 -1.359375,-5.085937 l -3.929688,-2.273438 a 3.721056,3.721056 0 0 0 -5.085937,1.359375 L 53.28125,32.3125 C 52.215821,32.115965 51.122295,32 50,32 c -1.122295,0 -2.215821,0.115965 -3.28125,0.3125 L 39.550781,19.910156 A 3.721056,3.721056 0 0 0 36.326172,18.050781 Z M 50,38.746094 A 11.253125,11.253125 0 0 1 61.253906,50 11.253125,11.253125 0 0 1 50,61.253906 11.253125,11.253125 0 0 1 38.746094,50 11.253125,11.253125 0 0 1 50,38.746094 Z" /></g></svg>

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -48,6 +48,7 @@
</screenshots>
<releases>
<release version="1.1.17" date="2025-12-09"/>
<release version="1.1.16" date="2025-10-23"/>
<release version="1.1.14" date="2025-01-01"/>
<release version="1.1.13" date="2024-05-11"/>

View File

@ -248,7 +248,7 @@ def test_set_3leds_missing(device, mocker):
def test_get_notification_flags(device):
result = _hidpp10.get_notification_flags(device)
assert result == int("000900", 16)
assert result == hidpp10_constants.NotificationFlag(int("000900", 16))
def test_set_notification_flags(mocker):

View File

@ -1,10 +1,8 @@
from dataclasses import dataclass
from dataclasses import field
from typing import Any
from typing import Callable
from typing import List
from typing import Optional
from unittest import mock
import gi
import pytest
@ -26,7 +24,6 @@ class Device:
@dataclass
class Receiver:
find_paired_node_wpid_func: Callable[[str, int], Any]
name: str
receiver_kind: str
_set_lock: bool = True
@ -87,12 +84,12 @@ class Assistant:
@pytest.mark.parametrize(
"receiver, lock_open, discovering, page_type",
[
(Receiver(mock.Mock(), "unifying", "unifying", True), True, False, Gtk.AssistantPageType.PROGRESS),
(Receiver(mock.Mock(), "unifying", "unifying", False), False, False, Gtk.AssistantPageType.SUMMARY),
(Receiver(mock.Mock(), "nano", "nano", True, _remaining_pairings=5), True, False, Gtk.AssistantPageType.PROGRESS),
(Receiver(mock.Mock(), "nano", "nano", False), False, False, Gtk.AssistantPageType.SUMMARY),
(Receiver(mock.Mock(), "bolt", "bolt", True), False, True, Gtk.AssistantPageType.PROGRESS),
(Receiver(mock.Mock(), "bolt", "bolt", False), False, False, Gtk.AssistantPageType.SUMMARY),
(Receiver("unifying", "unifying", True), True, False, Gtk.AssistantPageType.PROGRESS),
(Receiver("unifying", "unifying", False), False, False, Gtk.AssistantPageType.SUMMARY),
(Receiver("nano", "nano", True, _remaining_pairings=5), True, False, Gtk.AssistantPageType.PROGRESS),
(Receiver("nano", "nano", False), False, False, Gtk.AssistantPageType.SUMMARY),
(Receiver("bolt", "bolt", True), False, True, Gtk.AssistantPageType.PROGRESS),
(Receiver("bolt", "bolt", False), False, False, Gtk.AssistantPageType.SUMMARY),
],
)
def test_create(receiver, lock_open, discovering, page_type):
@ -108,10 +105,10 @@ def test_create(receiver, lock_open, discovering, page_type):
@pytest.mark.parametrize(
"receiver, expected_result, expected_error",
[
(Receiver(mock.Mock(), "unifying", "unifying", True), True, False),
(Receiver(mock.Mock(), "unifying", "unifying", False), False, True),
(Receiver(mock.Mock(), "bolt", "bolt", True), True, False),
(Receiver(mock.Mock(), "bolt", "bolt", False), False, True),
(Receiver("unifying", "unifying", True), True, False),
(Receiver("unifying", "unifying", False), False, True),
(Receiver("bolt", "bolt", True), True, False),
(Receiver("bolt", "bolt", False), False, True),
],
)
def test_prepare(receiver, expected_result, expected_error):
@ -123,7 +120,7 @@ def test_prepare(receiver, expected_result, expected_error):
@pytest.mark.parametrize("assistant, expected_result", [(Assistant(True), True), (Assistant(False), False)])
def test_check_lock_state_drawable(assistant, expected_result):
r = Receiver(mock.Mock(), "succeed", "unifying", True, receiver.Pairing(lock_open=True))
r = Receiver("succeed", "unifying", True, receiver.Pairing(lock_open=True))
result = pair_window.check_lock_state(assistant, r, 2)
@ -134,24 +131,23 @@ def test_check_lock_state_drawable(assistant, expected_result):
@pytest.mark.parametrize(
"receiver, count, expected_result",
[
(Receiver(mock.Mock(), "fail", "unifying", False, receiver.Pairing(lock_open=False)), 2, False),
(Receiver(mock.Mock(), "succeed", "unifying", True, receiver.Pairing(lock_open=True)), 1, True),
(Receiver(mock.Mock(), "error", "unifying", True, receiver.Pairing(error="error")), 0, False),
(Receiver(mock.Mock(), "new device", "unifying", True, receiver.Pairing(new_device=Device())), 2, False),
(Receiver(mock.Mock(), "closed", "unifying", True, receiver.Pairing()), 2, False),
(Receiver(mock.Mock(), "closed", "unifying", True, receiver.Pairing()), 1, False),
(Receiver(mock.Mock(), "closed", "unifying", True, receiver.Pairing()), 0, False),
(Receiver(mock.Mock(), "fail bolt", "bolt", False), 1, False),
(Receiver(mock.Mock(), "succeed bolt", "bolt", True, receiver.Pairing(lock_open=True)), 0, True),
(Receiver(mock.Mock(), "error bolt", "bolt", True, receiver.Pairing(error="error")), 2, False),
(Receiver(mock.Mock(), "new device", "bolt", True, receiver.Pairing(lock_open=True, new_device=Device())), 1, False),
(Receiver(mock.Mock(), "discovering", "bolt", True, receiver.Pairing(lock_open=True)), 1, True),
(Receiver(mock.Mock(), "closed", "bolt", True, receiver.Pairing()), 2, False),
(Receiver(mock.Mock(), "closed", "bolt", True, receiver.Pairing()), 1, False),
(Receiver(mock.Mock(), "closed", "bolt", True, receiver.Pairing()), 0, False),
(Receiver("fail", "unifying", False, receiver.Pairing(lock_open=False)), 2, False),
(Receiver("succeed", "unifying", True, receiver.Pairing(lock_open=True)), 1, True),
(Receiver("error", "unifying", True, receiver.Pairing(error="error")), 0, False),
(Receiver("new device", "unifying", True, receiver.Pairing(new_device=Device())), 2, False),
(Receiver("closed", "unifying", True, receiver.Pairing()), 2, False),
(Receiver("closed", "unifying", True, receiver.Pairing()), 1, False),
(Receiver("closed", "unifying", True, receiver.Pairing()), 0, False),
(Receiver("fail bolt", "bolt", False), 1, False),
(Receiver("succeed bolt", "bolt", True, receiver.Pairing(lock_open=True)), 0, True),
(Receiver("error bolt", "bolt", True, receiver.Pairing(error="error")), 2, False),
(Receiver("new device", "bolt", True, receiver.Pairing(lock_open=True, new_device=Device())), 1, False),
(Receiver("discovering", "bolt", True, receiver.Pairing(lock_open=True)), 1, True),
(Receiver("closed", "bolt", True, receiver.Pairing()), 2, False),
(Receiver("closed", "bolt", True, receiver.Pairing()), 1, False),
(Receiver("closed", "bolt", True, receiver.Pairing()), 0, False),
(
Receiver(
mock.Mock(),
"pass1",
"bolt",
True,
@ -162,7 +158,6 @@ def test_check_lock_state_drawable(assistant, expected_result):
),
(
Receiver(
mock.Mock(),
"pass2",
"bolt",
True,
@ -173,7 +168,6 @@ def test_check_lock_state_drawable(assistant, expected_result):
),
(
Receiver(
mock.Mock(),
"adt",
"bolt",
True,
@ -185,7 +179,6 @@ def test_check_lock_state_drawable(assistant, expected_result):
),
(
Receiver(
mock.Mock(),
"adf",
"bolt",
True,
@ -195,7 +188,7 @@ def test_check_lock_state_drawable(assistant, expected_result):
2,
False,
),
(Receiver(mock.Mock(), "add fail", "bolt", False, receiver.Pairing(device_address=2, device_passkey=5)), 2, False),
(Receiver("add fail", "bolt", False, receiver.Pairing(device_address=2, device_passkey=5)), 2, False),
],
)
def test_check_lock_state(receiver, count, expected_result):
@ -210,22 +203,22 @@ def test_check_lock_state(receiver, count, expected_result):
"receiver, pair_device, set_lock, discover, error",
[
(
Receiver(mock.Mock(), "unifying", "unifying", pairing=receiver.Pairing(lock_open=False, error="error")),
Receiver("unifying", "unifying", pairing=receiver.Pairing(lock_open=False, error="error")),
0,
0,
0,
None,
),
(
Receiver(mock.Mock(), "unifying", "unifying", pairing=receiver.Pairing(lock_open=True, error="error")),
Receiver("unifying", "unifying", pairing=receiver.Pairing(lock_open=True, error="error")),
0,
1,
0,
"error",
),
(Receiver(mock.Mock(), "bolt", "bolt", pairing=receiver.Pairing(lock_open=False, error="error")), 0, 0, 0, None),
(Receiver(mock.Mock(), "bolt", "bolt", pairing=receiver.Pairing(lock_open=True, error="error")), 1, 0, 0, "error"),
(Receiver(mock.Mock(), "bolt", "bolt", pairing=receiver.Pairing(discovering=True, error="error")), 0, 0, 1, "error"),
(Receiver("bolt", "bolt", pairing=receiver.Pairing(lock_open=False, error="error")), 0, 0, 0, None),
(Receiver("bolt", "bolt", pairing=receiver.Pairing(lock_open=True, error="error")), 1, 0, 0, "error"),
(Receiver("bolt", "bolt", pairing=receiver.Pairing(discovering=True, error="error")), 0, 0, 1, "error"),
],
)
def test_finish(receiver, pair_device, set_lock, discover, error, mocker):
@ -247,6 +240,6 @@ def test_finish(receiver, pair_device, set_lock, discover, error, mocker):
def test_create_failure_page(error, mocker):
spy_create = mocker.spy(pair_window, "_create_page")
pair_window._pairing_failed(Assistant(True), Receiver(mock.Mock(), "nano", "nano"), error)
pair_window._pairing_failed(Assistant(True), Receiver("nano", "nano"), error)
assert spy_create.call_count == 1