From 17fd09ae896153f2e6a04509e3c0b4bf46008dce Mon Sep 17 00:00:00 2001 From: IFo Hancroft Date: Mon, 27 Sep 2021 22:11:27 +0300 Subject: [PATCH] Just updating --- .../Macro/Icons/SketcherKB_CreateSwitch.svg | 276 +++ .../Icons/SketcherKB_CreateSwitchRotated.svg | 300 +++ .../Icons/Sketcher_Pointer_Create_Switch.svg | 91 + .FreeCAD/Macro/MyDrawingMacro.FCMacro | 42 + .FreeCAD/Macro/Stabilizer-Floating.FCMacro | 162 ++ .FreeCAD/Macro/Stabilizer.FCMacro | 163 ++ .FreeCAD/Macro/Switch-Floating.FCMacro | 33 + .FreeCAD/Macro/Switch.FCMacro | 34 + .../Macro/SwitchHittingPlate-Floating.FCMacro | 202 ++ .FreeCAD/Macro/SwitchHittingPlate.FCMacro | 203 ++ .FreeCAD/system.cfg | 22 + .FreeCAD/user.cfg | 306 ++- .bashrc | 1 + .config/FreeCAD/FreeCAD.conf | 10 +- .config/GIMP/2.10/controllerrc | 2 +- .config/GIMP/2.10/devicerc | 123 +- .config/GIMP/2.10/gimprc | 4 +- .config/GIMP/2.10/sessionrc | 13 +- .config/audacious/config | 6 +- .config/audacious/plugin-registry | 130 +- .config/inkscape/preferences.xml | 255 +-- .../basic/profiles/ifohancroft/basic.ini | 19 +- .../obs-studio/basic/scenes/ifohancroft.json | 858 +------- .config/obs-studio/global.ini | 10 +- .config/qpdfview/qpdfview.conf | 6 +- .config/quicktile.cfg | 22 - .config/smplayer/smplayer.ini | 8 +- .config/termite/config | 41 +- .config/viewnior/viewnior.conf | 2 +- .config/weechat/alias.conf | 50 + .config/weechat/buflist.conf | 41 + .config/weechat/charset.conf | 18 + .config/weechat/exec.conf | 19 + .config/weechat/fifo.conf | 14 + .config/weechat/fset.conf | 96 + .config/weechat/guile.conf | 14 + .config/weechat/irc.conf | 257 +++ .config/weechat/logger.conf | 36 + .config/weechat/lua.conf | 14 + .config/weechat/perl.conf | 14 + .config/weechat/plugins.conf | 68 + .config/weechat/python.conf | 14 + .config/weechat/relay.conf | 59 + .config/weechat/ruby.conf | 14 + .config/weechat/script.conf | 57 + .config/weechat/spell.conf | 33 + .config/weechat/tcl.conf | 14 + .config/weechat/trigger.conf | 67 + .config/weechat/typing.conf | 19 + .config/weechat/weechat.conf | 43 +- .config/weechat/xfer.conf | 49 + .local/share/weechat/python/autoload/title.py | 1 + .../share/weechat/python/autoload/vimode.py | 1 + .local/share/weechat/python/title.py | 123 ++ .local/share/weechat/python/vimode.py | 1884 +++++++++++++++++ .vimrc | 2 + 56 files changed, 5096 insertions(+), 1269 deletions(-) create mode 100644 .FreeCAD/Macro/Icons/SketcherKB_CreateSwitch.svg create mode 100644 .FreeCAD/Macro/Icons/SketcherKB_CreateSwitchRotated.svg create mode 100644 .FreeCAD/Macro/Icons/Sketcher_Pointer_Create_Switch.svg create mode 100644 .FreeCAD/Macro/MyDrawingMacro.FCMacro create mode 100644 .FreeCAD/Macro/Stabilizer-Floating.FCMacro create mode 100644 .FreeCAD/Macro/Stabilizer.FCMacro create mode 100644 .FreeCAD/Macro/Switch-Floating.FCMacro create mode 100644 .FreeCAD/Macro/Switch.FCMacro create mode 100644 .FreeCAD/Macro/SwitchHittingPlate-Floating.FCMacro create mode 100644 .FreeCAD/Macro/SwitchHittingPlate.FCMacro create mode 100644 .FreeCAD/system.cfg delete mode 100644 .config/quicktile.cfg create mode 100644 .config/weechat/alias.conf create mode 100644 .config/weechat/buflist.conf create mode 100644 .config/weechat/charset.conf create mode 100644 .config/weechat/exec.conf create mode 100644 .config/weechat/fifo.conf create mode 100644 .config/weechat/fset.conf create mode 100644 .config/weechat/guile.conf create mode 100644 .config/weechat/irc.conf create mode 100644 .config/weechat/logger.conf create mode 100644 .config/weechat/lua.conf create mode 100644 .config/weechat/perl.conf create mode 100644 .config/weechat/plugins.conf create mode 100644 .config/weechat/python.conf create mode 100644 .config/weechat/relay.conf create mode 100644 .config/weechat/ruby.conf create mode 100644 .config/weechat/script.conf create mode 100644 .config/weechat/spell.conf create mode 100644 .config/weechat/tcl.conf create mode 100644 .config/weechat/trigger.conf create mode 100644 .config/weechat/typing.conf create mode 100644 .config/weechat/xfer.conf create mode 120000 .local/share/weechat/python/autoload/title.py create mode 120000 .local/share/weechat/python/autoload/vimode.py create mode 100644 .local/share/weechat/python/title.py create mode 100644 .local/share/weechat/python/vimode.py diff --git a/.FreeCAD/Macro/Icons/SketcherKB_CreateSwitch.svg b/.FreeCAD/Macro/Icons/SketcherKB_CreateSwitch.svg new file mode 100644 index 0000000..96c09c7 --- /dev/null +++ b/.FreeCAD/Macro/Icons/SketcherKB_CreateSwitch.svg @@ -0,0 +1,276 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + [wmayer] + + + Sketcher_CreateRectangle + 2011-10-10 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Sketcher/Gui/Resources/icons/Sketcher_CreateRectangle.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.FreeCAD/Macro/Icons/SketcherKB_CreateSwitchRotated.svg b/.FreeCAD/Macro/Icons/SketcherKB_CreateSwitchRotated.svg new file mode 100644 index 0000000..74a4fd3 --- /dev/null +++ b/.FreeCAD/Macro/Icons/SketcherKB_CreateSwitchRotated.svg @@ -0,0 +1,300 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + [wmayer] + + + + 2011-10-10 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Sketcher/Gui/Resources/icons/Sketcher_CreateRectangle.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.FreeCAD/Macro/Icons/Sketcher_Pointer_Create_Switch.svg b/.FreeCAD/Macro/Icons/Sketcher_Pointer_Create_Switch.svg new file mode 100644 index 0000000..cef3a29 --- /dev/null +++ b/.FreeCAD/Macro/Icons/Sketcher_Pointer_Create_Switch.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + diff --git a/.FreeCAD/Macro/MyDrawingMacro.FCMacro b/.FreeCAD/Macro/MyDrawingMacro.FCMacro new file mode 100644 index 0000000..13fc4ec --- /dev/null +++ b/.FreeCAD/Macro/MyDrawingMacro.FCMacro @@ -0,0 +1,42 @@ +import FreeCAD +import FreeCADGui +import Sketcher +import PySide2 + +from PySide2 import QtGui, QtWidgets +from PySide2.QtWidgets import QApplication +from PySide2.QtGui import QPixmap, QCursor + +class SwitchCutout: + def __init__(self): + self.changeCursor() + self.attachViewObserver() + def attachViewObserver(self): + if Gui.activeView() and repr(Gui.activeView()) == "View3DInventor": + self.view = Gui.activeView() + self.view_callback = self.view.addEventCallback("SoMouseButtonEvent", self.viewObserver) + else: + FreeCAD.Console.PrintMessage("ViewObserver cannot be set, no active 3D view\n") + def detachViewObserver(self): + self.view.removeEventCallback("SoMouseButtonEvent", self.view_callback) + self.resetCursor() + def viewObserver(self, info): + if info["State"] == "DOWN": + if info["Button"] == "BUTTON1": + self.origin_x = self.view.getPoint(info["Position"])[0] + self.origin_y = self.view.getPoint(info["Position"])[1] + self.draw() + elif info["Button"] == "BUTTON2": + self.detachViewObserver() + def changeCursor(self): + cursorImage = FreeCAD.getUserAppDataDir() + "Macro/Icons/Sketcher_Pointer_Create_Switch.svg" + pixmap = QPixmap(cursorImage) + cursor = QCursor(pixmap) + QApplication.setOverrideCursor(cursor) + def resetCursor(self): + QApplication.restoreOverrideCursor() + def draw(self): + # Just a placeholder for now. I will add the drawing part later. + FreeCAD.Console.PrintMessage("You clicked: " + str(self.origin_x) + "," + str(self.origin_y) + "\n") + +SwitchCutout() diff --git a/.FreeCAD/Macro/Stabilizer-Floating.FCMacro b/.FreeCAD/Macro/Stabilizer-Floating.FCMacro new file mode 100644 index 0000000..1e6745f --- /dev/null +++ b/.FreeCAD/Macro/Stabilizer-Floating.FCMacro @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- + +# Macro Begin: /home/ifohancroft/.FreeCAD/Macro/Stabilizer-Floating.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++ +import FreeCAD +import Sketcher + +# Geometry +(g0,g1,g2,g3,g4,g5,g6,g7,g8,g9,g10,g11,g12,g13,g14,g15,g16,g17,g18,g19,g20,g21,g22,g23,g24,g25,g26,g27,g28,g29,g30,g31,g32,g33,g34,g35,g36) = ActiveSketch.addGeometry([ + + Part.LineSegment(App.Vector(-7, 7, 0), App.Vector(7, 7, 0)), + Part.LineSegment(App.Vector(7, 7, 0), App.Vector(7, 2.3, 0)), + Part.LineSegment(App.Vector(7, 2.3, 0), App.Vector(8.525, 2.3, 0)), + Part.LineSegment(App.Vector(8.525, 2.3, 0), App.Vector(8.525, 5.53, 0)), + Part.LineSegment(App.Vector(8.525, 5.53, 0), App.Vector(15.275, 5.53, 0)), + Part.LineSegment(App.Vector(15.275, 5.53, 0), App.Vector(15.275, 2.3, 0)), + Part.LineSegment(App.Vector(15.275, 2.3, 0), App.Vector(16.1, 2.3, 0)), + Part.LineSegment(App.Vector(16.1, 2.3, 0), App.Vector(16.1, -0.485, 0)), + Part.LineSegment(App.Vector(16.1, -0.485, 0), App.Vector(15.275, -0.485, 0)), + Part.LineSegment(App.Vector(15.275, -0.485, 0), App.Vector(15.275, -6.77, 0)), + Part.LineSegment(App.Vector(15.275, -6.77, 0), App.Vector(13.55, -6.77, 0)), + Part.LineSegment(App.Vector(13.55, -6.77, 0), App.Vector(13.55, -7.97, 0)), + Part.LineSegment(App.Vector(13.55, -7.97, 0), App.Vector(10.25, -7.97, 0)), + Part.LineSegment(App.Vector(10.25, -7.97, 0), App.Vector(10.25, -6.77, 0)), + Part.LineSegment(App.Vector(10.25, -6.77, 0), App.Vector(8.525, -6.77, 0)), + Part.LineSegment(App.Vector(8.525, -6.77, 0), App.Vector(8.525, -2.3, 0)), + Part.LineSegment(App.Vector(8.525, -2.3, 0), App.Vector(7, -2.3, 0)), + Part.LineSegment(App.Vector(7, -2.3, 0), App.Vector(7, -7, 0)), + Part.LineSegment(App.Vector(7, -7, 0), App.Vector(-7, -7, 0)), + Part.LineSegment(App.Vector(-7, -7, 0), App.Vector(-7, -2.3, 0)), + Part.LineSegment(App.Vector(-7, -2.3, 0), App.Vector(-8.525, -2.3, 0)), + Part.LineSegment(App.Vector(-8.525, -2.3, 0), App.Vector(-8.525, -6.77, 0)), + Part.LineSegment(App.Vector(-8.525, -6.77, 0), App.Vector(-10.25, -6.77, 0)), + Part.LineSegment(App.Vector(-10.25, -6.77, 0), App.Vector(-10.25, -7.97, 0)), + Part.LineSegment(App.Vector(-10.25, -7.97, 0), App.Vector(-13.55, -7.97, 0)), + Part.LineSegment(App.Vector(-13.55, -7.97, 0), App.Vector(-13.55, -6.77, 0)), + Part.LineSegment(App.Vector(-13.55, -6.77, 0), App.Vector(-15.275, -6.77, 0)), + Part.LineSegment(App.Vector(-15.275, -6.77, 0), App.Vector(-15.275, -0.485, 0)), + Part.LineSegment(App.Vector(-15.275, -0.485, 0), App.Vector(-16.1, -0.485, 0)), + Part.LineSegment(App.Vector(-16.1, -0.485, 0), App.Vector(-16.1, 2.3, 0)), + Part.LineSegment(App.Vector(-16.1, 2.3, 0), App.Vector(-15.275, 2.3, 0)), + Part.LineSegment(App.Vector(-15.275, 2.3, 0), App.Vector(-15.275, 5.53, 0)), + Part.LineSegment(App.Vector(-15.275, 5.53, 0), App.Vector(-8.525, 5.53, 0)), + Part.LineSegment(App.Vector(-8.525, 5.53, 0), App.Vector(-8.525, 2.3, 0)), + Part.LineSegment(App.Vector(-8.525, 2.3, 0), App.Vector(-7, 2.3, 0)), + Part.LineSegment(App.Vector(-7, 2.3, 0), App.Vector(-7, 7, 0)), + Part.Point(App.Vector(0, 0, 0)) + +], False) + +# Constraints +ActiveSketch.addConstraint([ + + Sketcher.Constraint('Perpendicular', g0, g1), + Sketcher.Constraint('Parallel', g2, g0), + Sketcher.Constraint('Parallel', g3, g1), + Sketcher.Constraint('Parallel', g4, g0), + Sketcher.Constraint('Parallel', g5, g1), + Sketcher.Constraint('Parallel', g6, g0), + Sketcher.Constraint('Parallel', g7, g1), + Sketcher.Constraint('Parallel', g8, g0), + Sketcher.Constraint('Parallel', g9, g1), + Sketcher.Constraint('Parallel', g10, g0), + Sketcher.Constraint('Parallel', g11, g1), + Sketcher.Constraint('Parallel', g12, g0), + Sketcher.Constraint('Parallel', g13, g1), + Sketcher.Constraint('Parallel', g14, g0), + Sketcher.Constraint('Parallel', g15, g1), + Sketcher.Constraint('Parallel', g16, g0), + Sketcher.Constraint('Parallel', g17, g1), + Sketcher.Constraint('Parallel', g18, g0), + Sketcher.Constraint('Parallel', g19, g1), + Sketcher.Constraint('Parallel', g20, g0), + Sketcher.Constraint('Parallel', g21, g1), + Sketcher.Constraint('Parallel', g22, g0), + Sketcher.Constraint('Parallel', g23, g1), + Sketcher.Constraint('Parallel', g24, g0), + Sketcher.Constraint('Parallel', g25, g1), + Sketcher.Constraint('Parallel', g26, g0), + Sketcher.Constraint('Parallel', g28, g0), + Sketcher.Constraint('Parallel', g29, g1), + Sketcher.Constraint('Parallel', g30, g0), + Sketcher.Constraint('Parallel', g31, g1), + Sketcher.Constraint('Parallel', g32, g0), + Sketcher.Constraint('Parallel', g33, g1), + Sketcher.Constraint('Parallel', g34, g0), + Sketcher.Constraint('Parallel', g35, g1), + Sketcher.Constraint('Coincident', g0, 2, g1, 1), + Sketcher.Constraint('Coincident', g1, 2, g2, 1), + Sketcher.Constraint('Coincident', g2, 2, g3, 1), + Sketcher.Constraint('Coincident', g3, 2, g4, 1), + Sketcher.Constraint('Coincident', g4, 2, g5, 1), + Sketcher.Constraint('Coincident', g5, 2, g6, 1), + Sketcher.Constraint('Coincident', g6, 2, g7, 1), + Sketcher.Constraint('Coincident', g7, 2, g8, 1), + Sketcher.Constraint('Coincident', g8, 2, g9, 1), + Sketcher.Constraint('Coincident', g9, 2, g10, 1), + Sketcher.Constraint('Coincident', g10, 2, g11, 1), + Sketcher.Constraint('Coincident', g11, 2, g12, 1), + Sketcher.Constraint('Coincident', g12, 2, g13, 1), + Sketcher.Constraint('Coincident', g13, 2, g14, 1), + Sketcher.Constraint('Coincident', g14, 2, g15, 1), + Sketcher.Constraint('Coincident', g15, 2, g16, 1), + Sketcher.Constraint('Coincident', g16, 2, g17, 1), + Sketcher.Constraint('Coincident', g17, 2, g18, 1), + Sketcher.Constraint('Coincident', g18, 2, g19, 1), + Sketcher.Constraint('Coincident', g19, 2, g20, 1), + Sketcher.Constraint('Coincident', g20, 2, g21, 1), + Sketcher.Constraint('Coincident', g21, 2, g22, 1), + Sketcher.Constraint('Coincident', g22, 2, g23, 1), + Sketcher.Constraint('Coincident', g23, 2, g24, 1), + Sketcher.Constraint('Coincident', g24, 2, g25, 1), + Sketcher.Constraint('Coincident', g25, 2, g26, 1), + Sketcher.Constraint('Coincident', g26, 2, g27, 1), + Sketcher.Constraint('Coincident', g27, 2, g28, 1), + Sketcher.Constraint('Coincident', g28, 2, g29, 1), + Sketcher.Constraint('Coincident', g29, 2, g30, 1), + Sketcher.Constraint('Coincident', g30, 2, g31, 1), + Sketcher.Constraint('Coincident', g31, 2, g32, 1), + Sketcher.Constraint('Coincident', g32, 2, g33, 1), + Sketcher.Constraint('Coincident', g33, 2, g34, 1), + Sketcher.Constraint('Coincident', g34, 2, g35, 1), + Sketcher.Constraint('Coincident', g35, 2, g0, 1), + Sketcher.Constraint('Distance', g0, 14), + Sketcher.Constraint('Distance', g1, 4.7), + Sketcher.Constraint('Distance', g2, 1.525), + Sketcher.Constraint('Distance', g3, 3.23), + Sketcher.Constraint('Distance', g4, 6.75), + Sketcher.Constraint('Equal', g5, g3), + Sketcher.Constraint('Distance', g6, 0.825), + Sketcher.Constraint('Distance', g7, 2.785), + Sketcher.Constraint('Equal', g8, g6), + Sketcher.Constraint('Distance', g9, 6.285), + Sketcher.Constraint('Distance', g10, 1.725), + Sketcher.Constraint('Distance', g11, 1.2), + Sketcher.Constraint('Distance', g12, 3.3), + Sketcher.Constraint('Equal', g13, g11), + Sketcher.Constraint('Equal', g14, g10), + Sketcher.Constraint('Distance', g15, 4.47), + Sketcher.Constraint('Equal', g16, g2), + Sketcher.Constraint('Equal', g17, g1), + Sketcher.Constraint('Equal', g18, g0), + Sketcher.Constraint('Equal', g19, g1), + Sketcher.Constraint('Equal', g20, g2), + Sketcher.Constraint('Equal', g21, g15), + Sketcher.Constraint('Equal', g22, g10), + Sketcher.Constraint('Equal', g23, g11), + Sketcher.Constraint('Equal', g24, g12), + Sketcher.Constraint('Equal', g25, g11), + Sketcher.Constraint('Equal', g26, g10), + Sketcher.Constraint('Equal', g28, g6), + Sketcher.Constraint('Equal', g29, g7), + Sketcher.Constraint('Equal', g30, g6), + Sketcher.Constraint('Equal', g31, g3), + Sketcher.Constraint('Equal', g32, g4), + Sketcher.Constraint('Equal', g33, g3), + Sketcher.Constraint('Equal', g34, g2), + Sketcher.Constraint('Equal', g35, g1), + Sketcher.Constraint('Symmetric', g0, 2, g18, 2, g36, 1) + +]) + +# Macro End: /home/ifohancroft/.FreeCAD/Macro/Stabilizer-Floating.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/.FreeCAD/Macro/Stabilizer.FCMacro b/.FreeCAD/Macro/Stabilizer.FCMacro new file mode 100644 index 0000000..a8f12e3 --- /dev/null +++ b/.FreeCAD/Macro/Stabilizer.FCMacro @@ -0,0 +1,163 @@ +# -*- coding: utf-8 -*- + +# Macro Begin: /home/ifohancroft/.FreeCAD/Macro/Stabilizer.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++ +import FreeCAD +import Sketcher + +# Geometry +(g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21, g22, g23, g24, g25, g26, g27, g28, g29, g30, g31, g32, g33, g34, g35, g36) = ActiveSketch.addGeometry([ + + Part.LineSegment(App.Vector(-7, 7, 0), App.Vector(7, 7, 0)), + Part.LineSegment(App.Vector(7, 7, 0), App.Vector(7, 2.3, 0)), + Part.LineSegment(App.Vector(7, 2.3, 0), App.Vector(8.525, 2.3, 0)), + Part.LineSegment(App.Vector(8.525, 2.3, 0), App.Vector(8.525, 5.53, 0)), + Part.LineSegment(App.Vector(8.525, 5.53, 0), App.Vector(15.275, 5.53, 0)), + Part.LineSegment(App.Vector(15.275, 5.53, 0), App.Vector(15.275, 2.3, 0)), + Part.LineSegment(App.Vector(15.275, 2.3, 0), App.Vector(16.1, 2.3, 0)), + Part.LineSegment(App.Vector(16.1, 2.3, 0), App.Vector(16.1, -0.485, 0)), + Part.LineSegment(App.Vector(16.1, -0.485, 0), App.Vector(15.275, -0.485, 0)), + Part.LineSegment(App.Vector(15.275, -0.485, 0), App.Vector(15.275, -6.77, 0)), + Part.LineSegment(App.Vector(15.275, -6.77, 0), App.Vector(13.55, -6.77, 0)), + Part.LineSegment(App.Vector(13.55, -6.77, 0), App.Vector(13.55, -7.97, 0)), + Part.LineSegment(App.Vector(13.55, -7.97, 0), App.Vector(10.25, -7.97, 0)), + Part.LineSegment(App.Vector(10.25, -7.97, 0), App.Vector(10.25, -6.77, 0)), + Part.LineSegment(App.Vector(10.25, -6.77, 0), App.Vector(8.525, -6.77, 0)), + Part.LineSegment(App.Vector(8.525, -6.77, 0), App.Vector(8.525, -2.3, 0)), + Part.LineSegment(App.Vector(8.525, -2.3, 0), App.Vector(7, -2.3, 0)), + Part.LineSegment(App.Vector(7, -2.3, 0), App.Vector(7, -7, 0)), + Part.LineSegment(App.Vector(7, -7, 0), App.Vector(-7, -7, 0)), + Part.LineSegment(App.Vector(-7, -7, 0), App.Vector(-7, -2.3, 0)), + Part.LineSegment(App.Vector(-7, -2.3, 0), App.Vector(-8.525, -2.3, 0)), + Part.LineSegment(App.Vector(-8.525, -2.3, 0), App.Vector(-8.525, -6.77, 0)), + Part.LineSegment(App.Vector(-8.525, -6.77, 0), App.Vector(-10.25, -6.77, 0)), + Part.LineSegment(App.Vector(-10.25, -6.77, 0), App.Vector(-10.25, -7.97, 0)), + Part.LineSegment(App.Vector(-10.25, -7.97, 0), App.Vector(-13.55, -7.97, 0)), + Part.LineSegment(App.Vector(-13.55, -7.97, 0), App.Vector(-13.55, -6.77, 0)), + Part.LineSegment(App.Vector(-13.55, -6.77, 0), App.Vector(-15.275, -6.77, 0)), + Part.LineSegment(App.Vector(-15.275, -6.77, 0), App.Vector(-15.275, -0.485, 0)), + Part.LineSegment(App.Vector(-15.275, -0.485, 0), App.Vector(-16.1, -0.485, 0)), + Part.LineSegment(App.Vector(-16.1, -0.485, 0), App.Vector(-16.1, 2.3, 0)), + Part.LineSegment(App.Vector(-16.1, 2.3, 0), App.Vector(-15.275, 2.3, 0)), + Part.LineSegment(App.Vector(-15.275, 2.3, 0), App.Vector(-15.275, 5.53, 0)), + Part.LineSegment(App.Vector(-15.275, 5.53, 0), App.Vector(-8.525, 5.53, 0)), + Part.LineSegment(App.Vector(-8.525, 5.53, 0), App.Vector(-8.525, 2.3, 0)), + Part.LineSegment(App.Vector(-8.525, 2.3, 0), App.Vector(-7, 2.3, 0)), + Part.LineSegment(App.Vector(-7, 2.3, 0), App.Vector(-7, 7, 0)), + Part.Point(App.Vector(0, 0, 0)) + +], False) + +# Constraints +ActiveSketch.addConstraint([ + + Sketcher.Constraint('Horizontal', g0), + Sketcher.Constraint('Vertical', g1), + Sketcher.Constraint('Horizontal', g2), + Sketcher.Constraint('Vertical', g3), + Sketcher.Constraint('Horizontal', g4), + Sketcher.Constraint('Vertical', g5), + Sketcher.Constraint('Horizontal', g6), + Sketcher.Constraint('Vertical', g7), + Sketcher.Constraint('Horizontal', g8), + Sketcher.Constraint('Vertical', g9), + Sketcher.Constraint('Horizontal', g10), + Sketcher.Constraint('Vertical', g11), + Sketcher.Constraint('Horizontal', g12), + Sketcher.Constraint('Vertical', g13), + Sketcher.Constraint('Horizontal', g14), + Sketcher.Constraint('Vertical', g15), + Sketcher.Constraint('Horizontal', g16), + Sketcher.Constraint('Vertical', g17), + Sketcher.Constraint('Horizontal', g18), + Sketcher.Constraint('Vertical', g19), + Sketcher.Constraint('Horizontal', g20), + Sketcher.Constraint('Vertical', g21), + Sketcher.Constraint('Horizontal', g22), + Sketcher.Constraint('Vertical', g23), + Sketcher.Constraint('Horizontal', g24), + Sketcher.Constraint('Vertical', g25), + Sketcher.Constraint('Horizontal', g26), + Sketcher.Constraint('Vertical', g27), + Sketcher.Constraint('Horizontal', g28), + Sketcher.Constraint('Horizontal', g30), + Sketcher.Constraint('Vertical', g31), + Sketcher.Constraint('Horizontal', g32), + Sketcher.Constraint('Vertical', g33), + Sketcher.Constraint('Horizontal', g34), + Sketcher.Constraint('Vertical', g35), + Sketcher.Constraint('Coincident', g0, 2, g1, 1), + Sketcher.Constraint('Coincident', g1, 2, g2, 1), + Sketcher.Constraint('Coincident', g2, 2, g3, 1), + Sketcher.Constraint('Coincident', g3, 2, g4, 1), + Sketcher.Constraint('Coincident', g4, 2, g5, 1), + Sketcher.Constraint('Coincident', g5, 2, g6, 1), + Sketcher.Constraint('Coincident', g6, 2, g7, 1), + Sketcher.Constraint('Coincident', g7, 2, g8, 1), + Sketcher.Constraint('Coincident', g8, 2, g9, 1), + Sketcher.Constraint('Coincident', g9, 2, g10, 1), + Sketcher.Constraint('Coincident', g10, 2, g11, 1), + Sketcher.Constraint('Coincident', g11, 2, g12, 1), + Sketcher.Constraint('Coincident', g12, 2, g13, 1), + Sketcher.Constraint('Coincident', g13, 2, g14, 1), + Sketcher.Constraint('Coincident', g14, 2, g15, 1), + Sketcher.Constraint('Coincident', g15, 2, g16, 1), + Sketcher.Constraint('Coincident', g16, 2, g17, 1), + Sketcher.Constraint('Coincident', g17, 2, g18, 1), + Sketcher.Constraint('Coincident', g18, 2, g19, 1), + Sketcher.Constraint('Coincident', g19, 2, g20, 1), + Sketcher.Constraint('Coincident', g20, 2, g21, 1), + Sketcher.Constraint('Coincident', g21, 2, g22, 1), + Sketcher.Constraint('Coincident', g22, 2, g23, 1), + Sketcher.Constraint('Coincident', g23, 2, g24, 1), + Sketcher.Constraint('Coincident', g24, 2, g25, 1), + Sketcher.Constraint('Coincident', g25, 2, g26, 1), + Sketcher.Constraint('Coincident', g26, 2, g27, 1), + Sketcher.Constraint('Coincident', g27, 2, g28, 1), + Sketcher.Constraint('Coincident', g28, 2, g29, 1), + Sketcher.Constraint('Coincident', g29, 2, g30, 1), + Sketcher.Constraint('Coincident', g30, 2, g31, 1), + Sketcher.Constraint('Coincident', g31, 2, g32, 1), + Sketcher.Constraint('Coincident', g32, 2, g33, 1), + Sketcher.Constraint('Coincident', g33, 2, g34, 1), + Sketcher.Constraint('Coincident', g34, 2, g35, 1), + Sketcher.Constraint('Coincident', g35, 2, g0, 1), + Sketcher.Constraint('Distance', g0, 14), + Sketcher.Constraint('Distance', g1, 4.7), + Sketcher.Constraint('Distance', g2, 1.525), + Sketcher.Constraint('Distance', g3, 3.23), + Sketcher.Constraint('Distance', g4, 6.75), + Sketcher.Constraint('Equal', g5, g3), + Sketcher.Constraint('Distance', g6, 0.825), + Sketcher.Constraint('Distance', g7, 2.785), + Sketcher.Constraint('Equal', g8, g6), + Sketcher.Constraint('Distance', g9, 6.285), + Sketcher.Constraint('Distance', g10, 1.725), + Sketcher.Constraint('Distance', g11, 1.2), + Sketcher.Constraint('Distance', g12, 3.3), + Sketcher.Constraint('Equal', g13, g11), + Sketcher.Constraint('Equal', g14, g10), + Sketcher.Constraint('Distance', g15, 4.47), + Sketcher.Constraint('Equal', g16, g2), + Sketcher.Constraint('Equal', g17, g1), + Sketcher.Constraint('Equal', g18, g0), + Sketcher.Constraint('Equal', g19, g1), + Sketcher.Constraint('Equal', g20, g2), + Sketcher.Constraint('Equal', g21, g15), + Sketcher.Constraint('Equal', g22, g10), + Sketcher.Constraint('Equal', g23, g11), + Sketcher.Constraint('Equal', g24, g12), + Sketcher.Constraint('Equal', g25, g11), + Sketcher.Constraint('Equal', g26, g10), + Sketcher.Constraint('Equal', g28, g6), + Sketcher.Constraint('Equal', g29, g7), + Sketcher.Constraint('Equal', g30, g6), + Sketcher.Constraint('Equal', g31, g3), + Sketcher.Constraint('Equal', g32, g4), + Sketcher.Constraint('Equal', g33, g3), + Sketcher.Constraint('Equal', g34, g2), + Sketcher.Constraint('Equal', g35, g1), + Sketcher.Constraint('Symmetric', g0, 2, g18, 2, g36, 1) + +]) + +# Macro End: /home/ifohancroft/.FreeCAD/Macro/Stabilizer.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/.FreeCAD/Macro/Switch-Floating.FCMacro b/.FreeCAD/Macro/Switch-Floating.FCMacro new file mode 100644 index 0000000..1439e03 --- /dev/null +++ b/.FreeCAD/Macro/Switch-Floating.FCMacro @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- + +# Macro Begin: /home/ifohancroft/.FreeCAD/Macro/Switch-Floating.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++ +import FreeCAD +import Sketcher + +# Geometry +(g0, g1, g2, g3) = ActiveSketch.addGeometry([ + + Part.LineSegment(App.Vector(-7, 7, 0),App.Vector(7, 7, 0)), + Part.LineSegment(App.Vector(7, 7, 0),App.Vector(7, -7, 0)), + Part.LineSegment(App.Vector(7, -7, 0),App.Vector(-7, -7, 0)), + Part.LineSegment(App.Vector(-7, -7, 0),App.Vector(-7, 7, 0)) + +], False) + +# Constraints +ActiveSketch.addConstraint([ + + Sketcher.Constraint('Perpendicular', g0, g1), + Sketcher.Constraint('Parallel', g1, g3), + Sketcher.Constraint('Parallel', g2, g0), + Sketcher.Constraint('Coincident',g0,2,g1,1), + Sketcher.Constraint('Coincident',g1,2,g2,1), + Sketcher.Constraint('Coincident',g2,2,g3,1), + Sketcher.Constraint('Coincident',g3,2,g0,1), + Sketcher.Constraint('Distance',g0,14), + Sketcher.Constraint('Equal',g1,g0) + +]) + + +# Macro End: /home/ifohancroft/.FreeCAD/Macro/Switch-Floating.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/.FreeCAD/Macro/Switch.FCMacro b/.FreeCAD/Macro/Switch.FCMacro new file mode 100644 index 0000000..d03f226 --- /dev/null +++ b/.FreeCAD/Macro/Switch.FCMacro @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- + +# Macro Begin: /home/ifohancroft/.FreeCAD/Macro/Switch.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++ +import FreeCAD +import Sketcher + +# Geometry +(g0, g1, g2, g3) = ActiveSketch.addGeometry([ + + Part.LineSegment(App.Vector(-7, 7, 0),App.Vector(7, 7, 0)), + Part.LineSegment(App.Vector(7, 7, 0),App.Vector(7, -7, 0)), + Part.LineSegment(App.Vector(7, -7, 0),App.Vector(-7, -7, 0)), + Part.LineSegment(App.Vector(-7, -7, 0),App.Vector(-7, 7, 0)) + +], False) + +# Constraints +ActiveSketch.addConstraint([ + + Sketcher.Constraint('Horizontal', g0), + Sketcher.Constraint('Horizontal', g2), + Sketcher.Constraint('Vertical', g1), + Sketcher.Constraint('Vertical', g3), + Sketcher.Constraint('Coincident',g0,2,g1,1), + Sketcher.Constraint('Coincident',g1,2,g2,1), + Sketcher.Constraint('Coincident',g2,2,g3,1), + Sketcher.Constraint('Coincident',g3,2,g0,1), + Sketcher.Constraint('Distance',g0,14), + Sketcher.Constraint('Equal',g1,g0) + +]) + + +# Macro End: /home/ifohancroft/.FreeCAD/Macro/Switch.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/.FreeCAD/Macro/SwitchHittingPlate-Floating.FCMacro b/.FreeCAD/Macro/SwitchHittingPlate-Floating.FCMacro new file mode 100644 index 0000000..9e9cefc --- /dev/null +++ b/.FreeCAD/Macro/SwitchHittingPlate-Floating.FCMacro @@ -0,0 +1,202 @@ +# -*- coding: utf-8 -*- + +# Macro Begin: /home/ifohancroft/.FreeCAD/Macro/SwitchHittingPlate-Floating.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++ +import FreeCAD +import Sketcher + +# Geometry +(g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21, g22, g23, g24, g25, g26, g27, g28, g29, g30, g31, g32, g33, g34, g35) = ActiveSketch.addGeometry([ + + # Top Middle + Part.LineSegment(App.Vector(-1, 7.8, 0), App.Vector(1, 7.8, 0)), + Part.LineSegment(App.Vector(1, 7.8, 0), App.Vector(1, 7, 0)), + Part.LineSegment(App.Vector(1, 7, 0), App.Vector(-1, 7, 0)), + Part.LineSegment(App.Vector(-1, 7, 0), App.Vector(-1, 7.8, 0)), + + # Top Right + Part.LineSegment(App.Vector(2.7, 7.8, 0), App.Vector(7, 7.8, 0)), + Part.ArcOfCircle(Part.Circle(App.Vector(7, 7, 0), App.Vector(0, 0, 1), 0.8), 0, 1.570796), + Part.LineSegment(App.Vector(7.8, 7, 0), App.Vector(7.8, 5.8, 0)), + Part.LineSegment(App.Vector(7.8, 5.8, 0), App.Vector(7, 5.8, 0)), + Part.LineSegment(App.Vector(7, 5.8, 0), App.Vector(7, 7, 0)), + Part.LineSegment(App.Vector(7, 7, 0), App.Vector(2.7, 7, 0)), + Part.LineSegment(App.Vector(2.7, 7, 0), App.Vector(2.7, 7.8, 0)), + + # Bottom Right + Part.LineSegment(App.Vector(2.7, -7, 0), App.Vector(7, -7, 0)), + Part.LineSegment(App.Vector(7, -7, 0), App.Vector(7, -5.8, 0)), + Part.LineSegment(App.Vector(7, -5.8, 0), App.Vector(7.8, -5.8, 0)), + Part.LineSegment(App.Vector(7.8, -5.8, 0), App.Vector(7.8, -7, 0)), + Part.ArcOfCircle(Part.Circle(App.Vector(7, -7, 0), App.Vector(0, 0, 1), 0.8), -1.570796, 0), + Part.LineSegment(App.Vector(7, -7.8, 0), App.Vector(2.7, -7.8, 0)), + Part.LineSegment(App.Vector(2.7, -7.8, 0), App.Vector(2.7, -7, 0)), + + # Bottom Middle + Part.LineSegment(App.Vector(-1, -7, 0), App.Vector(1, -7, 0)), + Part.LineSegment(App.Vector(1, -7, 0), App.Vector(1, -7.8, 0)), + Part.LineSegment(App.Vector(1, -7.8, 0), App.Vector(-1, -7.8, 0)), + Part.LineSegment(App.Vector(-1, -7.8, 0), App.Vector(-1, -7, 0)), + + # Bottom Left + Part.LineSegment(App.Vector(-7, -7, 0), App.Vector(-2.7, -7, 0)), + Part.LineSegment(App.Vector(-2.7, -7, 0), App.Vector(-2.7, -7.8, 0)), + Part.LineSegment(App.Vector(-2.7, -7.8, 0), App.Vector(-7, -7.8, 0)), + Part.ArcOfCircle(Part.Circle(App.Vector(-7, -7, 0), App.Vector(0, 0, 1), 0.8), -3.141593, -1.570796), + Part.LineSegment(App.Vector(-7.8, -7, 0), App.Vector(-7.8, -5.8, 0)), + Part.LineSegment(App.Vector(-7.8, -5.8, 0), App.Vector(-7, -5.8, 0)), + Part.LineSegment(App.Vector(-7, -5.8, 0), App.Vector(-7, -7, 0)), + + # Top Left + Part.LineSegment(App.Vector(-7, 7.8, 0), App.Vector(-2.7, 7.8, 0)), + Part.LineSegment(App.Vector(-2.7, 7.8, 0), App.Vector(-2.7, 7, 0)), + Part.LineSegment(App.Vector(-2.7, 7, 0), App.Vector(-7, 7, 0)), + Part.LineSegment(App.Vector(-7, 7, 0), App.Vector(-7, 5.8, 0)), + Part.LineSegment(App.Vector(-7, 5.8, 0), App.Vector(-7.8, 5.8, 0)), + Part.LineSegment(App.Vector(-7.8, 5.8, 0), App.Vector(-7.8, 7, 0)), + Part.ArcOfCircle(Part.Circle(App.Vector(-7, 7, 0), App.Vector(0, 0, 1), 0.8), 1.570796, 3.141593) + +], False) + +# Construction Geometry +(cg0, cg1, cg2, cg3, cg4, cg5) = ActiveSketch.addGeometry([ + + # Outer Square + Part.LineSegment(App.Vector(-7.8, 7.8, 0), App.Vector(7.8, 7.8, 0)), + Part.LineSegment(App.Vector(7.8, 7.8, 0), App.Vector(7.8, -7.8, 0)), + Part.LineSegment(App.Vector(7.8, -7.8, 0), App.Vector(-7.8, -7.8, 0)), + Part.LineSegment(App.Vector(-7.8, -7.8, 0), App.Vector(-7.8, 7.8, 0)), + + # Center Line + Part.LineSegment(App.Vector(0, 7, 0), App.Vector(0, -7, 0)), + + # Center Dot + Part.Point(App.Vector(0, 0, 0)) + +], True) + +# Constraints +ActiveSketch.addConstraint([ + + # Top Middle + Sketcher.Constraint('Parallel', g1, cg1), + Sketcher.Constraint('Parallel', g2, cg0), + Sketcher.Constraint('Parallel', g3, cg1), + Sketcher.Constraint('Tangent', g0, cg0), + Sketcher.Constraint('Coincident', g0, 2, g1, 1), + Sketcher.Constraint('Coincident', g1, 2, g2, 1), + Sketcher.Constraint('Coincident', g2, 2, g3, 1), + Sketcher.Constraint('Coincident', g3, 2, g0, 1), + Sketcher.Constraint('Distance', g0, 2), + + # Top Right + Sketcher.Constraint('Parallel', g7, cg0), + Sketcher.Constraint('Parallel', g8, cg1), + Sketcher.Constraint('Parallel', g9, cg0), + Sketcher.Constraint('Parallel', g10, cg1), + Sketcher.Constraint('Tangent', g4, cg0), + Sketcher.Constraint('Tangent', g4, 2, g5, 2), + Sketcher.Constraint('Tangent', g5, 1, g6, 1), + Sketcher.Constraint('Tangent', g6, cg1), + Sketcher.Constraint('Coincident', g6, 2, g7, 1), + Sketcher.Constraint('Coincident', g7, 2, g8, 1), + Sketcher.Constraint('Coincident', g8, 2, g5, 3), + Sketcher.Constraint('Coincident', g5, 3, g9, 1), + Sketcher.Constraint('Coincident', g9, 2, g10, 1), + Sketcher.Constraint('Coincident', g10, 2, g4, 1), + Sketcher.Constraint('Distance', g4, 4.3), + Sketcher.Constraint('Diameter', g5, 1.6), + Sketcher.Constraint('Distance', g6, 1.2), + Sketcher.Constraint('Equal', g7, g1), + + # Bottom Right + Sketcher.Constraint('Parallel', g11, cg0), + Sketcher.Constraint('Parallel', g12, cg1), + Sketcher.Constraint('Parallel', g13, cg0), + Sketcher.Constraint('Parallel', g17, cg1), + Sketcher.Constraint('Coincident', g11, 2, g15, 3), + Sketcher.Constraint('Coincident', g15, 3, g12, 1), + Sketcher.Constraint('Coincident', g12, 2, g13, 1), + Sketcher.Constraint('Coincident', g13, 2, g14, 1), + Sketcher.Constraint('Tangent', g14, cg1), + Sketcher.Constraint('Tangent', g14, 2, g15, 2), + Sketcher.Constraint('Tangent', g15, 1, g16, 1), + Sketcher.Constraint('Tangent', g16, cg2), + Sketcher.Constraint('Coincident', g16, 2, g17, 1), + Sketcher.Constraint('Coincident', g17, 2, g11, 1), + Sketcher.Constraint('Equal', g13, g1), + Sketcher.Constraint('Equal', g14, g6), + Sketcher.Constraint('Equal', g16, g4), + + # Bottom Middle + Sketcher.Constraint('Parallel', g18, cg0), + Sketcher.Constraint('Parallel', g19, cg1), + Sketcher.Constraint('Parallel', g21, cg1), + Sketcher.Constraint('Coincident', g18, 2, g19, 1), + Sketcher.Constraint('Coincident', g19, 2, g20, 1), + Sketcher.Constraint('Tangent', g20, cg2), + Sketcher.Constraint('Coincident', g20, 2, g21, 1), + Sketcher.Constraint('Coincident', g21, 2, g18, 1), + Sketcher.Constraint('Equal', g19, g1), + Sketcher.Constraint('Equal', g20, g0), + + # Bottom Left + Sketcher.Constraint('Parallel', g22, cg0), + Sketcher.Constraint('Parallel', g23, cg1), + Sketcher.Constraint('Parallel', g27, cg0), + Sketcher.Constraint('Parallel', g28, cg1), + Sketcher.Constraint('Coincident', g22, 2, g23, 1), + Sketcher.Constraint('Coincident', g23, 2, g24, 1), + Sketcher.Constraint('Tangent', g24, cg2), + Sketcher.Constraint('Tangent', g24, 2, g25, 2), + Sketcher.Constraint('Tangent', g25, 1, g26, 1), + Sketcher.Constraint('Tangent', g26, cg3), + Sketcher.Constraint('Coincident', g26, 2, g27, 1), + Sketcher.Constraint('Coincident', g27, 2, g28, 1), + Sketcher.Constraint('Coincident', g28, 2, g25, 3), + Sketcher.Constraint('Coincident', g25, 3, g22, 1), + Sketcher.Constraint('Equal', g24, g4), + Sketcher.Constraint('Equal', g26, g6), + Sketcher.Constraint('Equal', g27, g1), + + # Top Left + Sketcher.Constraint('Parallel', g30, cg1), + Sketcher.Constraint('Parallel', g31, cg0), + Sketcher.Constraint('Parallel', g32, cg1), + Sketcher.Constraint('Parallel', g33, cg0), + Sketcher.Constraint('Tangent', g29, cg0), + Sketcher.Constraint('Coincident', g29, 2, g30, 1), + Sketcher.Constraint('Coincident', g30, 2, g31, 1), + Sketcher.Constraint('Coincident', g31, 2, g35, 3), + Sketcher.Constraint('Coincident', g35, 3, g32, 1), + Sketcher.Constraint('Coincident', g32, 2, g33, 1), + Sketcher.Constraint('Coincident', g33, 2, g34, 1), + Sketcher.Constraint('Tangent', g34, cg3), + Sketcher.Constraint('Tangent', g34, 2, g35, 2), + Sketcher.Constraint('Tangent', g35, 1, g29, 1), + Sketcher.Constraint('Equal', g29, g4), + Sketcher.Constraint('Equal', g33, g1), + Sketcher.Constraint('Equal', g34, g6), + + # Outer Square + Sketcher.Constraint('Perpendicular', cg0, cg1), + Sketcher.Constraint('Parallel', cg0, cg2), + Sketcher.Constraint('Parallel', cg1, cg3), + Sketcher.Constraint('Coincident', cg0, 2, cg1, 1), + Sketcher.Constraint('Coincident', cg1, 2, cg2, 1), + Sketcher.Constraint('Coincident', cg2, 2, cg3, 1), + Sketcher.Constraint('Coincident', cg3, 2, cg0, 1), + Sketcher.Constraint('Distance', cg3, 15.6), + Sketcher.Constraint('Equal', cg3, cg0), + + # Center Line + Sketcher.Constraint('Parallel', cg4, cg1), + Sketcher.Constraint('Symmetric', g2, 1, g2, 2, cg4, 1), + Sketcher.Constraint('Symmetric', g18, 1, g18, 2, cg4, 2), + + # Center Dot + Sketcher.Constraint('Symmetric', g5, 3, g25, 3, cg5, 1), + Sketcher.Constraint('PointOnObject', cg5, 1, cg4) + +]) + +# Macro End: /home/ifohancroft/.FreeCAD/Macro/SwitchHittingPlate-Floating.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/.FreeCAD/Macro/SwitchHittingPlate.FCMacro b/.FreeCAD/Macro/SwitchHittingPlate.FCMacro new file mode 100644 index 0000000..4611b25 --- /dev/null +++ b/.FreeCAD/Macro/SwitchHittingPlate.FCMacro @@ -0,0 +1,203 @@ +# -*- coding: utf-8 -*- + +# Macro Begin: /home/ifohancroft/.FreeCAD/Macro/SwitchHittingPlate.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++ +import FreeCAD +import Sketcher + +# Geometry +(g0, g1, g2, g3, g4, g5, g6, g7, g8, g9, g10, g11, g12, g13, g14, g15, g16, g17, g18, g19, g20, g21, g22, g23, g24, g25, g26, g27, g28, g29, g30, g31, g32, g33, g34, g35) = ActiveSketch.addGeometry([ + + # Top Middle + Part.LineSegment(App.Vector(-1, 7.8, 0), App.Vector(1, 7.8, 0)), + Part.LineSegment(App.Vector(1, 7.8, 0), App.Vector(1, 7, 0)), + Part.LineSegment(App.Vector(1, 7, 0), App.Vector(-1, 7, 0)), + Part.LineSegment(App.Vector(-1, 7, 0), App.Vector(-1, 7.8, 0)), + + # Top Right + Part.LineSegment(App.Vector(2.7, 7.8, 0), App.Vector(7, 7.8, 0)), + Part.ArcOfCircle(Part.Circle(App.Vector(7, 7, 0), App.Vector(0, 0, 1), 0.8), 0, 1.570796), + Part.LineSegment(App.Vector(7.8, 7, 0), App.Vector(7.8, 5.8, 0)), + Part.LineSegment(App.Vector(7.8, 5.8, 0), App.Vector(7, 5.8, 0)), + Part.LineSegment(App.Vector(7, 5.8, 0), App.Vector(7, 7, 0)), + Part.LineSegment(App.Vector(7, 7, 0), App.Vector(2.7, 7, 0)), + Part.LineSegment(App.Vector(2.7, 7, 0), App.Vector(2.7, 7.8, 0)), + + # Bottom Right + Part.LineSegment(App.Vector(2.7, -7, 0), App.Vector(7, -7, 0)), + Part.LineSegment(App.Vector(7, -7, 0), App.Vector(7, -5.8, 0)), + Part.LineSegment(App.Vector(7, -5.8, 0), App.Vector(7.8, -5.8, 0)), + Part.LineSegment(App.Vector(7.8, -5.8, 0), App.Vector(7.8, -7, 0)), + Part.ArcOfCircle(Part.Circle(App.Vector(7, -7, 0), App.Vector(0, 0, 1), 0.8), -1.570796, 0), + Part.LineSegment(App.Vector(7, -7.8, 0), App.Vector(2.7, -7.8, 0)), + Part.LineSegment(App.Vector(2.7, -7.8, 0), App.Vector(2.7, -7, 0)), + + # Bottom Middle + Part.LineSegment(App.Vector(-1, -7, 0), App.Vector(1, -7, 0)), + Part.LineSegment(App.Vector(1, -7, 0), App.Vector(1, -7.8, 0)), + Part.LineSegment(App.Vector(1, -7.8, 0), App.Vector(-1, -7.8, 0)), + Part.LineSegment(App.Vector(-1, -7.8, 0), App.Vector(-1, -7, 0)), + + # Bottom Left + Part.LineSegment(App.Vector(-7, -7, 0), App.Vector(-2.7, -7, 0)), + Part.LineSegment(App.Vector(-2.7, -7, 0), App.Vector(-2.7, -7.8, 0)), + Part.LineSegment(App.Vector(-2.7, -7.8, 0), App.Vector(-7, -7.8, 0)), + Part.ArcOfCircle(Part.Circle(App.Vector(-7, -7, 0), App.Vector(0, 0, 1), 0.8), -3.141593, -1.570796), + Part.LineSegment(App.Vector(-7.8, -7, 0), App.Vector(-7.8, -5.8, 0)), + Part.LineSegment(App.Vector(-7.8, -5.8, 0), App.Vector(-7, -5.8, 0)), + Part.LineSegment(App.Vector(-7, -5.8, 0), App.Vector(-7, -7, 0)), + + # Top Left + Part.LineSegment(App.Vector(-7, 7.8, 0), App.Vector(-2.7, 7.8, 0)), + Part.LineSegment(App.Vector(-2.7, 7.8, 0), App.Vector(-2.7, 7, 0)), + Part.LineSegment(App.Vector(-2.7, 7, 0), App.Vector(-7, 7, 0)), + Part.LineSegment(App.Vector(-7, 7, 0), App.Vector(-7, 5.8, 0)), + Part.LineSegment(App.Vector(-7, 5.8, 0), App.Vector(-7.8, 5.8, 0)), + Part.LineSegment(App.Vector(-7.8, 5.8, 0), App.Vector(-7.8, 7, 0)), + Part.ArcOfCircle(Part.Circle(App.Vector(-7, 7, 0), App.Vector(0, 0, 1), 0.8), 1.570796, 3.141593) + +], False) + +# Construction Geometry +(cg0, cg1, cg2, cg3, cg4, cg5) = ActiveSketch.addGeometry([ + + # Outer Square + Part.LineSegment(App.Vector(-7.8, 7.8, 0), App.Vector(7.8, 7.8, 0)), + Part.LineSegment(App.Vector(7.8, 7.8, 0), App.Vector(7.8, -7.8, 0)), + Part.LineSegment(App.Vector(7.8, -7.8, 0), App.Vector(-7.8, -7.8, 0)), + Part.LineSegment(App.Vector(-7.8, -7.8, 0), App.Vector(-7.8, 7.8, 0)), + + # Center Line + Part.LineSegment(App.Vector(0, 7, 0), App.Vector(0, -7, 0)), + + # Center Dot + Part.Point(App.Vector(0, 0, 0)) + +], True) + +# Constraints +ActiveSketch.addConstraint([ + + # Top Middle + Sketcher.Constraint('Vertical', g1), + Sketcher.Constraint('Horizontal', g2), + Sketcher.Constraint('Vertical', g3), + Sketcher.Constraint('Tangent', g0, cg0), + Sketcher.Constraint('Coincident', g0, 2, g1, 1), + Sketcher.Constraint('Coincident', g1, 2, g2, 1), + Sketcher.Constraint('Coincident', g2, 2, g3, 1), + Sketcher.Constraint('Coincident', g3, 2, g0, 1), + Sketcher.Constraint('Distance', g0, 2), + + # Top Right + Sketcher.Constraint('Horizontal', g7), + Sketcher.Constraint('Vertical', g8), + Sketcher.Constraint('Horizontal', g9), + Sketcher.Constraint('Vertical', g10), + Sketcher.Constraint('Tangent', g4, cg0), + Sketcher.Constraint('Tangent', g4, 2, g5, 2), + Sketcher.Constraint('Tangent', g5, 1, g6, 1), + Sketcher.Constraint('Tangent', g6, cg1), + Sketcher.Constraint('Coincident', g6, 2, g7, 1), + Sketcher.Constraint('Coincident', g7, 2, g8, 1), + Sketcher.Constraint('Coincident', g8, 2, g5, 3), + Sketcher.Constraint('Coincident', g5, 3, g9, 1), + Sketcher.Constraint('Coincident', g9, 2, g10, 1), + Sketcher.Constraint('Coincident', g10, 2, g4, 1), + Sketcher.Constraint('Distance', g4, 4.3), + Sketcher.Constraint('Diameter', g5, 1.6), + Sketcher.Constraint('Distance', g6, 1.2), + Sketcher.Constraint('Equal', g7, g1), + + # Bottom Right + Sketcher.Constraint('Horizontal', g11), + Sketcher.Constraint('Vertical', g12), + Sketcher.Constraint('Horizontal', g13), + Sketcher.Constraint('Vertical', g17), + Sketcher.Constraint('Coincident', g11, 2, g15, 3), + Sketcher.Constraint('Coincident', g15, 3, g12, 1), + Sketcher.Constraint('Coincident', g12, 2, g13, 1), + Sketcher.Constraint('Coincident', g13, 2, g14, 1), + Sketcher.Constraint('Tangent', g14, cg1), + Sketcher.Constraint('Tangent', g14, 2, g15, 2), + Sketcher.Constraint('Tangent', g15, 1, g16, 1), + Sketcher.Constraint('Tangent', g16, cg2), + Sketcher.Constraint('Coincident', g16, 2, g17, 1), + Sketcher.Constraint('Coincident', g17, 2, g11, 1), + Sketcher.Constraint('Equal', g13, g1), + Sketcher.Constraint('Equal', g14, g6), + Sketcher.Constraint('Equal', g16, g4), + + # Bottom Middle + Sketcher.Constraint('Horizontal', g18), + Sketcher.Constraint('Vertical', g19), + Sketcher.Constraint('Vertical', g21), + Sketcher.Constraint('Coincident', g18, 2, g19, 1), + Sketcher.Constraint('Coincident', g19, 2, g20, 1), + Sketcher.Constraint('Tangent', g20, cg2), + Sketcher.Constraint('Coincident', g20, 2, g21, 1), + Sketcher.Constraint('Coincident', g21, 2, g18, 1), + Sketcher.Constraint('Equal', g19, g1), + Sketcher.Constraint('Equal', g20, g0), + + # Bottom Left + Sketcher.Constraint('Horizontal', g22), + Sketcher.Constraint('Vertical', g23), + Sketcher.Constraint('Horizontal', g27), + Sketcher.Constraint('Vertical', g28), + Sketcher.Constraint('Coincident', g22, 2, g23, 1), + Sketcher.Constraint('Coincident', g23, 2, g24, 1), + Sketcher.Constraint('Tangent', g24, cg2), + Sketcher.Constraint('Tangent', g24, 2, g25, 2), + Sketcher.Constraint('Tangent', g25, 1, g26, 1), + Sketcher.Constraint('Tangent', g26, cg3), + Sketcher.Constraint('Coincident', g26, 2, g27, 1), + Sketcher.Constraint('Coincident', g27, 2, g28, 1), + Sketcher.Constraint('Coincident', g28, 2, g25, 3), + Sketcher.Constraint('Coincident', g25, 3, g22, 1), + Sketcher.Constraint('Equal', g24, g4), + Sketcher.Constraint('Equal', g26, g6), + Sketcher.Constraint('Equal', g27, g1), + + # Top Left + Sketcher.Constraint('Vertical', g30), + Sketcher.Constraint('Horizontal', g31), + Sketcher.Constraint('Vertical', g32), + Sketcher.Constraint('Horizontal', g33), + Sketcher.Constraint('Tangent', g29, cg0), + Sketcher.Constraint('Coincident', g29, 2, g30, 1), + Sketcher.Constraint('Coincident', g30, 2, g31, 1), + Sketcher.Constraint('Coincident', g31, 2, g35, 3), + Sketcher.Constraint('Coincident', g35, 3, g32, 1), + Sketcher.Constraint('Coincident', g32, 2, g33, 1), + Sketcher.Constraint('Coincident', g33, 2, g34, 1), + Sketcher.Constraint('Tangent', g34, cg3), + Sketcher.Constraint('Tangent', g34, 2, g35, 2), + Sketcher.Constraint('Tangent', g35, 1, g29, 1), + Sketcher.Constraint('Equal', g29, g4), + Sketcher.Constraint('Equal', g33, g1), + Sketcher.Constraint('Equal', g34, g6), + + # Outer Square + Sketcher.Constraint('Horizontal', cg0), + Sketcher.Constraint('Vertical', cg1), + Sketcher.Constraint('Horizontal', cg2), + Sketcher.Constraint('Vertical', cg3), + Sketcher.Constraint('Coincident', cg0, 2, cg1, 1), + Sketcher.Constraint('Coincident', cg1, 2, cg2, 1), + Sketcher.Constraint('Coincident', cg2, 2, cg3, 1), + Sketcher.Constraint('Coincident', cg3, 2, cg0, 1), + Sketcher.Constraint('Distance', cg3, 15.6), + Sketcher.Constraint('Equal', cg3, cg0), + + # Center Line + Sketcher.Constraint('Vertical', cg4), + Sketcher.Constraint('Symmetric', g2, 1, g2, 2, cg4, 1), + Sketcher.Constraint('Symmetric', g18, 1, g18, 2, cg4, 2), + + # Center Dot + Sketcher.Constraint('Symmetric', g5, 3, g25, 3, cg5, 1), + Sketcher.Constraint('PointOnObject', cg5, 1, cg4) + +]) + +# Macro End: /home/ifohancroft/.FreeCAD/Macro/SwitchHittingPlate.FCMacro +++++++++++++++++++++++++++++++++++++++++++++++++ diff --git a/.FreeCAD/system.cfg b/.FreeCAD/system.cfg new file mode 100644 index 0000000..bf33fed --- /dev/null +++ b/.FreeCAD/system.cfg @@ -0,0 +1,22 @@ + + + + + + Image/Help/index.html + Image + ImageWorkbench.py + + + Path/Help/index.html + Path + PathWorkbench.py + + + Spreadsheet/Help/index.html + Spreadsheet + SpreadsheetWorkbench.py + + + + diff --git a/.FreeCAD/user.cfg b/.FreeCAD/user.cfg index 821441c..8e88d28 100644 --- a/.FreeCAD/user.cfg +++ b/.FreeCAD/user.cfg @@ -7,15 +7,19 @@ - /home/ifohancroft/Projects/Battlestation + /home/ifohancroft/Projects/Keyboards/Hardware/ErgoDox GG/Case PartDesignWorkbench - PartDesignWorkbench + PartDesignWorkbench + + Supported formats ( *.3ds *.FCMacro *.FCMat *.FCScript *.asc *.ast *.bdf *.bmp *.bms *.brep *.brp *.cnc *.csg *.csv *.dae *.dat *.dwg *.dxf *.emn *.frd *.gc *.gcad *.gcode *.html *.ifc *.iges *.igs *.inc *.inp *.iv *.jpg *.json *.kicad_mod *.kicad_pcb *.med *.meshjson *.meshyaml *.nc *.ncc *.ngc *.obj *.oca *.off *.pcd *.plmxml *.ply *.png *.pov *.py *.shp *.smf *.step *.stl *.stp *.stpZ *.stpz *.svg *.svgz *.tap *.unv *.vrml *.vtk *.vtu *.wrl *.wrl.gz *.wrz *.xdmf *.xhtml *.xlsx *.xml *.xpm *.yaml *.z88 *.zip) + + - + @@ -46,7 +50,7 @@ - + @@ -82,12 +86,12 @@ - + - + @@ -202,9 +206,9 @@ - + - + /home/ifohancroft/Downloads/Anticheww/PCB/Duckegg 0.0 @@ -220,9 +224,12 @@ - + /usr/share/kicad/modules/packages3d - + + + + @@ -236,12 +243,25 @@ + + + + + + + + + + + - 10.00 mm - + 10.000000 mm + 10.0000000 mm + 10.00000 mm + 10.00 mm @@ -254,6 +274,8 @@ + + @@ -275,10 +297,30 @@ + + + + + + + + %N = %V + + + + + + + + + + + + @@ -394,6 +436,17 @@ + + + + + + + + + + + @@ -401,6 +454,7 @@ + /home/ifohancroft/.FreeCAD/Macro/Icons Std_SelForward @@ -415,7 +469,7 @@ - + @@ -424,7 +478,7 @@ - + @@ -479,7 +533,7 @@ - + @@ -487,7 +541,7 @@ - + @@ -508,7 +562,7 @@ - + @@ -549,14 +603,18 @@ - + + App::PropertyLength + Parameters + + - - + + @@ -580,19 +638,34 @@ - /home/ifohancroft/Projects/Battlestation/New Desk Test.FCStd - /home/ifohancroft/Projects/Battlestation/New Desk Test 2.FCStd - /home/ifohancroft/Projects/Battlestation/Desk v1.FCStd - /home/ifohancroft/Projects/Battlestation/Desk Reference.FCStd + /home/ifohancroft/Projects/Keyboards/Hardware/ErgoDox GG/Case/ErgoDox-Test-Case.FCStd + /home/ifohancroft/Downloads/GASKET_MODEL.STEP + /home/ifohancroft/Projects/Keyboards/Hardware/ErgoCroft/Case/ErgoCroft-Case-FEM-tests.FCStd + /home/ifohancroft/Projects/Keyboards/Hardware/ErgoCroft/Case/ErgoCroft-Old-Case.FCStd + /home/ifohancroft/.FreeCAD/Macro/Switch.FCMacro + /home/ifohancroft/.FreeCAD/Macro/test.FCMacro + /home/ifohancroft/.FreeCAD/Macro/CommandTest.FCMacro + /home/ifohancroft/.FreeCAD/Macro/SecondCommandTest.FCMacro + /home/ifohancroft/.FreeCAD/Macro/Geneva_Wheel.FCMacro + /home/ifohancroft/.FreeCAD/Macro/MyDialog.FCMacro + /home/ifohancroft/.FreeCAD/Macro/Stabilizer.FCMacro + /home/ifohancroft/.FreeCAD/Macro/SwitchHittingPlate-Floating.FCMacro + /home/ifohancroft/.FreeCAD/Macro/SwitchHittingPlate.FCMacro + /home/ifohancroft/.FreeCAD/Macro/Stabilizer-Floating.FCMacro + /home/ifohancroft/.FreeCAD/Macro/Switch-Floating.FCMacro + /home/ifohancroft/.FreeCAD/Macro/Backup-SwitchHittingPlate.FCMacro - + Ctrl+Shift+ - + + + + @@ -600,20 +673,26 @@ - BaseApp.Preferences.PropertyView - (560,222,1359,821) + BaseApp.History + (197,178,1647,1023) + + + Ctrl+Shift+C + + + - + - + @@ -621,7 +700,7 @@ - + @@ -651,53 +730,129 @@ - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - PartDesignWorkbench,SketcherWorkbench,SpreadsheetWorkbench,TechDrawWorkbench,KiCadStepUpWB,MeshWorkbench,FemWorkbench,PartWorkbench,SurfaceWorkbench - - ArchWorkbench,DraftWorkbench,DrawingWorkbench,ImageWorkbench,InspectionWorkbench,NoneWorkbench,OpenSCADWorkbench,PathWorkbench,PointsWorkbench,RaytracingWorkbench,ReverseEngineeringWorkbench,RobotWorkbench,StartWorkbench,TestWorkbench,WebWorkbench - IconText - PartDesignWorkbench,SketcherWorkbench,SpreadsheetWorkbench,TechDrawWorkbench,KiCadStepUpWB,MeshWorkbench,FemWorkbench,PartWorkbench,SurfaceWorkbench,ArchWorkbench,DraftWorkbench,DrawingWorkbench,ImageWorkbench,InspectionWorkbench,NoneWorkbench,OpenSCADWorkbench,PathWorkbench,PointsWorkbench,RaytracingWorkbench,ReverseEngineeringWorkbench,RobotWorkbench,StartWorkbench,TestWorkbench,WebWorkbench + - + + + + + + + + + + + + - PartDesignWorkbench,SketcherWorkbench,SpreadsheetWorkbench,TechDrawWorkbench,KiCadStepUpWB,MeshWorkbench,FemWorkbench,PartWorkbench,SurfaceWorkbench, - NoneWorkbench,ArchWorkbench,DraftWorkbench,DrawingWorkbench,ImageWorkbench,InspectionWorkbench,OpenSCADWorkbench,PathWorkbench,PointsWorkbench,RaytracingWorkbench,ReverseEngineeringWorkbench,RobotWorkbench,StartWorkbench,TestWorkbench,WebWorkbench, + PartDesignWorkbench,SketcherWorkbench,SpreadsheetWorkbench,TechDrawWorkbench,KiCadStepUpWB,MeshWorkbench,PartWorkbench,FemWorkbench,DraftWorkbench,ImageWorkbench,Assembly3Workbench,Assembly4Workbench, + NoneWorkbench,ArchWorkbench,DrawingWorkbench,GliderWorkbench,InspectionWorkbench,OpenSCADWorkbench,PathWorkbench,PointsWorkbench,RaytracingWorkbench,ReverseEngineeringWorkbench,RobotWorkbench,StartWorkbench,SurfaceWorkbench,TestWorkbench,WebWorkbench, - 25.00 mm - 18.00 mm + 1.500000 mm + 1.600000 mm + 10.000000 mm + 10.00000 mm + 7.50000 mm + 6.00000 mm - 100.00 mm + 100.000000 mm + 100.00000 mm + 100.00 mm - 0.00 mm + 0.000000 mm + 0.00000 mm + 0.00 mm - 464.00 mm - 318.65 mm - 180.00 mm - 188.87 mm - 18.00 mm - 33.58 mm + 57.150000 mm + 102.393750 mm + 10 mm + 12.001204 mm + 10 mm + 5.767080 mm + + 30 ° + 33.824563 ° + 30 ° + 30.338402 ° + 30 ° + -33.836538 ° + + + 1.600000 mm + 1.600000 + 1.600000 mm + 5.000000 mm + 10 mm + 10.00000 mm + + + 100.000000 mm + 100.00000 mm + + 0.000000 mm + 0.00000 mm + + @@ -709,7 +864,7 @@ - Part Design Helper,Part Design Modeling,Measure + Part Design Helper,Part Design Modeling,Measure,Structure Tabs @@ -724,13 +879,47 @@ - - - + + + Structure,Sketcher geometries,Sketcher constraints,Sketcher virtual space + + + + + + + Spreadsheet,Structure + Tabs + + + + + + + + + + + + + + + + + + - + + + + + + + + + @@ -738,5 +927,4 @@ - diff --git a/.bashrc b/.bashrc index 6c42569..301618e 100644 --- a/.bashrc +++ b/.bashrc @@ -6,6 +6,7 @@ alias grep='grep --color=auto' alias nvidia-settings='nvidia-settings --config="$XDG_CONFIG_HOME"/nvidia/settings' alias ugly-dotfiles="ls -a | grep -v 'Assets\|.cache\|Desktop\|Music\|Public\|.config\|Documents\|Downloads\|Games\|.local\|Pictures\|Projects\|Templates\|Videos'" alias checkSpace='ncdu' +alias mutt='xseticon -id "$(xdotool getactivewindow)" $XDG_DATA_HOME/icons/hicolor/32x32/apps/mutt.png && mutt && xseticon -id "$(xdotool getactivewindow)" /usr/share/icons/mate/32x32/apps/utilities-terminal.png' shopt -s histappend diff --git a/.config/FreeCAD/FreeCAD.conf b/.config/FreeCAD/FreeCAD.conf index 56584c3..5b8241e 100644 --- a/.config/FreeCAD/FreeCAD.conf +++ b/.config/FreeCAD/FreeCAD.conf @@ -1,7 +1,7 @@ [Qt5.12] -MainWindowState="@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x3\0\0\0\0\0\0\x1\xa5\0\0\x3\xc7\xfc\x2\0\0\0\x2\xfb\0\0\0\x1c\0S\0\x65\0l\0\x65\0\x63\0t\0i\0o\0n\0 \0v\0i\0\x65\0w\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x85\0\xff\xff\xff\xfc\0\0\0;\0\0\x3\xc7\0\0\0\xe1\0\xff\xff\xff\xfa\0\0\0\0\x2\0\0\0\x2\xfb\0\0\0\x14\0\x43\0o\0m\0\x62\0o\0 \0V\0i\0\x65\0w\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\xe1\0\xff\xff\xff\xfb\0\0\0\x16\0k\0i\0\x63\0\x61\0\x64\0S\0t\0\x65\0p\0U\0p\x2\0\0\0\0\0\0\0q\0\0\0\xac\0\0\x2\x4\0\0\0\x1\0\0\x2\x5\0\0\x3\xc6\xfc\x2\0\0\0\x15\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0;\0\0\x3\xc6\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0;\0\0\x3\xc6\0\0\0\0\0\0\0\0\0\0\0\x3\0\0\a\x80\0\0\0\xd3\xfc\x1\0\0\0\x2\xfb\0\0\0\x16\0R\0\x65\0p\0o\0r\0t\0 \0v\0i\0\x65\0w\0\0\0\0\0\0\0\a\x80\0\0\0\x46\0\xff\xff\xff\xfb\0\0\0\x1c\0P\0y\0t\0h\0o\0n\0 \0\x63\0o\0n\0s\0o\0l\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x46\0\xff\xff\xff\0\0\x5\xd5\0\0\x3\xc7\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x1\0\0\0\x2\0\0\0\xf\0\0\0\x14\0\x44\0r\0\x61\0\x66\0t\0 \0t\0r\0\x61\0y\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\b\0\x46\0i\0l\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x12\0W\0o\0r\0k\0\x62\0\x65\0n\0\x63\0h\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\n\0M\0\x61\0\x63\0r\0o\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\b\0V\0i\0\x65\0w\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x12\0S\0t\0r\0u\0\x63\0t\0u\0r\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0$\0P\0\x61\0r\0t\0 \0\x44\0\x65\0s\0i\0g\0n\0 \0H\0\x65\0l\0p\0\x65\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0(\0P\0\x61\0r\0t\0 \0\x44\0\x65\0s\0i\0g\0n\0 \0M\0o\0\x64\0\x65\0l\0i\0n\0g\x1\0\0\x1\x82\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\xe\0M\0\x65\0\x61\0s\0u\0r\0\x65\0\0\0\x5\xb5\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x10\0S\0k\0\x65\0t\0\x63\0h\0\x65\0r\0\0\0\x4Z\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0&\0S\0k\0\x65\0t\0\x63\0h\0\x65\0r\0 \0g\0\x65\0o\0m\0\x65\0t\0r\0i\0\x65\0s\0\0\0\x5\xd5\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0(\0S\0k\0\x65\0t\0\x63\0h\0\x65\0r\0 \0\x63\0o\0n\0s\0t\0r\0\x61\0i\0n\0t\0s\0\0\0\a\x11\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x1c\0S\0k\0\x65\0t\0\x63\0h\0\x65\0r\0 \0t\0o\0o\0l\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0.\0S\0k\0\x65\0t\0\x63\0h\0\x65\0r\0 \0\x42\0-\0s\0p\0l\0i\0n\0\x65\0 \0t\0o\0o\0l\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0,\0S\0k\0\x65\0t\0\x63\0h\0\x65\0r\0 \0v\0i\0r\0t\0u\0\x61\0l\0 \0s\0p\0\x61\0\x63\0\x65\0\0\0\aO\xff\xff\xff\xff\0\0\0\0\0\0\0\0)" +MainWindowState="@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x3\0\0\0\0\0\0\x1\x9b\0\0\x3\xcc\xfc\x2\0\0\0\x2\xfb\0\0\0\x1c\0S\0\x65\0l\0\x65\0\x63\0t\0i\0o\0n\0 \0v\0i\0\x65\0w\0\0\0\0\x36\0\0\0\xc8\0\0\0~\0\xff\xff\xff\xfc\0\0\0\x36\0\0\x3\xcc\0\0\0\xd2\0\xff\xff\xff\xfa\0\0\0\0\x2\0\0\0\x2\xfb\0\0\0\x14\0\x43\0o\0m\0\x62\0o\0 \0V\0i\0\x65\0w\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\xd2\0\xff\xff\xff\xfb\0\0\0\x16\0k\0i\0\x63\0\x61\0\x64\0S\0t\0\x65\0p\0U\0p\x2\0\0\0\"\0\0\0l\0\0\0\xac\0\0\x2\x4\0\0\0\x1\0\0\x2\x5\0\0\x3\xcc\xfc\x2\0\0\0\x19\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x3\xeb\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x14\0\0\x4\t\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0;\0\0\x3\xc6\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0;\0\0\x3\xc6\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0:\0\0\x3\xc8\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0:\0\0\x3\xc8\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0:\0\0\x3\xc8\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0:\0\0\x3\xc8\0\0\0\0\0\0\0\0\0\0\0\x3\0\0\a^\0\0\0\xd1\xfc\x1\0\0\0\x2\xfb\0\0\0\x16\0R\0\x65\0p\0o\0r\0t\0 \0v\0i\0\x65\0w\x3\0\0\a\x80\0\0\x2>\0\0\a\x7f\0\0\x1\xfa\xfb\0\0\0\x1c\0P\0y\0t\0h\0o\0n\0 \0\x63\0o\0n\0s\0o\0l\0\x65\x3\0\0\a\x80\0\0\0\x1b\0\0\a\x80\0\0\x2#\0\0\x5\xe0\0\0\x3\xcc\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\x2\0\0\0\t\0\0\0$\0P\0\x61\0r\0t\0 \0\x44\0\x65\0s\0i\0g\0n\0 \0H\0\x65\0l\0p\0\x65\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0(\0P\0\x61\0r\0t\0 \0\x44\0\x65\0s\0i\0g\0n\0 \0M\0o\0\x64\0\x65\0l\0i\0n\0g\x1\0\0\x1\x66\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\xe\0M\0\x65\0\x61\0s\0u\0r\0\x65\x1\0\0\x4\x46\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x12\0S\0t\0r\0u\0\x63\0t\0u\0r\0\x65\x1\0\0\x5\x30\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x14\0\x44\0r\0\x61\0\x66\0t\0 \0t\0r\0\x61\0y\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\b\0\x46\0i\0l\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x12\0W\0o\0r\0k\0\x62\0\x65\0n\0\x63\0h\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\n\0M\0\x61\0\x63\0r\0o\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\b\0V\0i\0\x65\0w\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0)" Maximized=true -Position=@Point(1920 27) +Position=@Point(0 27) Size=@Size(1920 1026) StatusBar=false @@ -13,8 +13,8 @@ Size=@Size(1920 1026) StatusBar=false [Qt5.15] -MainWindowState="@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x3\0\0\0\0\0\0\x1\x62\0\0\x3\xca\xfc\x2\0\0\0\x2\xfb\0\0\0\x1c\0S\0\x65\0l\0\x65\0\x63\0t\0i\0o\0n\0 \0v\0i\0\x65\0w\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x82\0\xff\xff\xff\xfc\0\0\0\x38\0\0\x3\xca\0\0\0\xd6\0\xff\xff\xff\xfa\0\0\0\0\x2\0\0\0\x2\xfb\0\0\0\x14\0\x43\0o\0m\0\x62\0o\0 \0V\0i\0\x65\0w\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\xd6\0\xff\xff\xff\xfb\0\0\0\x16\0k\0i\0\x63\0\x61\0\x64\0S\0t\0\x65\0p\0U\0p\x2\0\0\nr\0\0\0\xee\0\0\0\xac\0\0\x2\x4\0\0\0\x1\0\0\x1\xf8\0\0\x3\xca\xfc\x2\0\0\0\x4\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x39\0\0\x3\xc9\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x39\0\0\x3\xc9\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0=\0\0\x3\xc4\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x38\0\0\x3\xca\0\0\0\0\0\0\0\0\0\0\0\x3\0\0\a\\\0\0\0\xd1\xfc\x1\0\0\0\x2\xfb\0\0\0\x16\0R\0\x65\0p\0o\0r\0t\0 \0v\0i\0\x65\0w\0\0\0\0$\0\0\a\\\0\0\0\x41\0\xff\xff\xff\xfb\0\0\0\x1c\0P\0y\0t\0h\0o\0n\0 \0\x63\0o\0n\0s\0o\0l\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x41\0\xff\xff\xff\0\0\x5\xf5\0\0\x3\xca\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\b\0T\0\x61\0\x62\0s\x3\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x2\0\0\0\x12\0\0\0$\0P\0\x61\0r\0t\0 \0\x44\0\x65\0s\0i\0g\0n\0 \0H\0\x65\0l\0p\0\x65\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0(\0P\0\x61\0r\0t\0 \0\x44\0\x65\0s\0i\0g\0n\0 \0M\0o\0\x64\0\x65\0l\0i\0n\0g\x1\0\0\x1\x66\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\xe\0M\0\x65\0\x61\0s\0u\0r\0\x65\x1\0\0\x4\x46\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x14\0\x44\0r\0\x61\0\x66\0t\0 \0t\0r\0\x61\0y\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\b\0\x46\0i\0l\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x12\0W\0o\0r\0k\0\x62\0\x65\0n\0\x63\0h\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\n\0M\0\x61\0\x63\0r\0o\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\b\0V\0i\0\x65\0w\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x12\0S\0t\0r\0u\0\x63\0t\0u\0r\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x10\0S\0k\0\x65\0t\0\x63\0h\0\x65\0r\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0&\0S\0k\0\x65\0t\0\x63\0h\0\x65\0r\0 \0g\0\x65\0o\0m\0\x65\0t\0r\0i\0\x65\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0(\0S\0k\0\x65\0t\0\x63\0h\0\x65\0r\0 \0\x63\0o\0n\0s\0t\0r\0\x61\0i\0n\0t\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x1c\0S\0k\0\x65\0t\0\x63\0h\0\x65\0r\0 \0t\0o\0o\0l\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0.\0S\0k\0\x65\0t\0\x63\0h\0\x65\0r\0 \0\x42\0-\0s\0p\0l\0i\0n\0\x65\0 \0t\0o\0o\0l\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0,\0S\0k\0\x65\0t\0\x63\0h\0\x65\0r\0 \0v\0i\0r\0t\0u\0\x61\0l\0 \0s\0p\0\x61\0\x63\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\f\0S\0o\0l\0i\0\x64\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x14\0P\0\x61\0r\0t\0 \0t\0o\0o\0l\0s\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\xe\0\x42\0o\0o\0l\0\x65\0\x61\0n\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0)" +MainWindowState="@ByteArray(\0\0\0\xff\0\0\0\0\xfd\0\0\0\x3\0\0\0\0\0\0\x1i\0\0\x3\xf2\xfc\x2\0\0\0\x2\xfb\0\0\0\x1c\0S\0\x65\0l\0\x65\0\x63\0t\0i\0o\0n\0 \0v\0i\0\x65\0w\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x89\0\xff\xff\xff\xfc\0\0\0<\0\0\x3\xf2\0\0\0\xe5\0\xff\xff\xff\xfa\0\0\0\0\x2\0\0\0\x2\xfb\0\0\0\x14\0\x43\0o\0m\0\x62\0o\0 \0V\0i\0\x65\0w\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\xe5\0\xff\xff\xff\xfb\0\0\0\x16\0k\0i\0\x63\0\x61\0\x64\0S\0t\0\x65\0p\0U\0p\x2\0\0\nr\0\0\0\xee\0\0\0\xac\0\0\x2\x4\0\0\0\x1\0\0\x1\xf8\0\0\x3\xca\xfc\x2\0\0\0\a\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x39\0\0\x3\xc9\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x39\0\0\x3\xc9\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0=\0\0\x3\xc4\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x38\0\0\x3\xca\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x38\0\0\x3\xca\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x38\0\0\x3\xca\0\0\0\0\0\0\0\0\xfb\0\0\0,\0\x45\0v\0\x61\0l\0u\0\x61\0t\0\x65\0 \0&\0 \0R\0\x65\0p\0\x61\0i\0r\0 \0M\0\x65\0s\0h\x1\0\0\0\x38\0\0\x3\xca\0\0\0\0\0\0\0\0\0\0\0\x3\0\0\a\\\0\0\0\xd1\xfc\x1\0\0\0\x2\xfb\0\0\0\x16\0R\0\x65\0p\0o\0r\0t\0 \0v\0i\0\x65\0w\0\0\0\0$\0\0\a\\\0\0\0\x46\0\xff\xff\xff\xfb\0\0\0\x1c\0P\0y\0t\0h\0o\0n\0 \0\x63\0o\0n\0s\0o\0l\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\0\x46\0\xff\xff\xff\0\0\x6;\0\0\x3\xf2\0\0\0\x4\0\0\0\x4\0\0\0\b\0\0\0\b\xfc\0\0\0\x2\0\0\0\0\0\0\0\x1\0\0\0\b\0T\0\x61\0\x62\0s\x3\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x2\0\0\0\t\0\0\0$\0P\0\x61\0r\0t\0 \0\x44\0\x65\0s\0i\0g\0n\0 \0H\0\x65\0l\0p\0\x65\0r\x1\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0(\0P\0\x61\0r\0t\0 \0\x44\0\x65\0s\0i\0g\0n\0 \0M\0o\0\x64\0\x65\0l\0i\0n\0g\x1\0\0\x1w\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\xe\0M\0\x65\0\x61\0s\0u\0r\0\x65\x1\0\0\x4{\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x14\0\x44\0r\0\x61\0\x66\0t\0 \0t\0r\0\x61\0y\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\b\0\x46\0i\0l\0\x65\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x12\0W\0o\0r\0k\0\x62\0\x65\0n\0\x63\0h\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\n\0M\0\x61\0\x63\0r\0o\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\b\0V\0i\0\x65\0w\0\0\0\0\0\xff\xff\xff\xff\0\0\0\0\0\0\0\0\0\0\0\x12\0S\0t\0r\0u\0\x63\0t\0u\0r\0\x65\x1\0\0\x5r\xff\xff\xff\xff\0\0\0\0\0\0\0\0)" Maximized=true -Position=@Point(0 27) -Size=@Size(1920 1026) +Position=@Point(0 28) +Size=@Size(2003 1070) StatusBar=false diff --git a/.config/GIMP/2.10/controllerrc b/.config/GIMP/2.10/controllerrc index c2d662a..cd25699 100644 --- a/.config/GIMP/2.10/controllerrc +++ b/.config/GIMP/2.10/controllerrc @@ -14,8 +14,8 @@ (map "scroll-up-shift-alt" "tools-angle-increase") (map "scroll-down-shift-primary-alt" "tools-spacing-decrease") (map "scroll-down-shift-alt" "tools-angle-decrease") - (map "scroll-up" "view-zoom-in") (map "scroll-down-primary-alt" "tools-size-decrease") + (map "scroll-up" "view-zoom-in") (map "scroll-up-shift-primary-alt" "tools-spacing-increase") (map "scroll-up-alt" "tools-opacity-increase") (map "scroll-down-alt" "tools-opacity-decrease") diff --git a/.config/GIMP/2.10/devicerc b/.config/GIMP/2.10/devicerc index fe9d70c..b57ec98 100644 --- a/.config/GIMP/2.10/devicerc +++ b/.config/GIMP/2.10/devicerc @@ -3,15 +3,19 @@ (GimpDeviceInfo "Core Pointer" (icon-name "gimp-cursor") (name "Core Pointer") - (tool-options "GimpRectangleSelectOptions" - (tool "gimp-rect-select-tool")) - (use-fg-bg no) + (tool-options "GimpBucketFillOptions" + (tool "gimp-bucket-fill-tool") + (background (color-rgb 0.7764706015586853 0.65882354974746704 0.56470590829849243)) + (pattern "Pine") + (brush-size 51) + (brush-hardness 0.5)) + (use-fg-bg yes) (use-opacity-paint-mode no) (use-brush no) (use-dynamics no) (use-mypaint-brush no) (use-gradient no) - (use-pattern no) + (use-pattern yes) (use-palette no) (use-font no) (mode screen) @@ -52,35 +56,6 @@ (point-types 0) (n-samples 256) (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) -(GimpDeviceInfo "RAZER Razer Mouse Dock Consumer Control" - (icon-name "gimp-cursor") - (name "RAZER Razer Mouse Dock Consumer Control") - (tool-options "GimpPencilOptions" - (tool "gimp-pencil-tool") - (brush "Pixel (1x1 square)") - (dynamics "Dynamics Off") - (gradient "FG to BG (RGB)") - (palette "Color History") - (brush-size 10) - (brush-spacing 0.5)) - (use-fg-bg yes) - (use-opacity-paint-mode no) - (use-brush yes) - (use-dynamics yes) - (use-mypaint-brush no) - (use-gradient yes) - (use-pattern no) - (use-palette yes) - (use-font no) - (mode disabled) - (axes 4 x y pressure xtilt) - (keys 0) - (pressure-curve - (curve-type smooth) - (points 0) - (point-types 0) - (n-samples 256) - (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) (GimpDeviceInfo "Razer Razer Viper Ultimate Dongle" (name "Razer Razer Viper Ultimate Dongle") (tool-options "GimpPencilOptions" @@ -109,33 +84,12 @@ (point-types 0) (n-samples 256) (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) -(GimpDeviceInfo "Razer Razer Viper Ultimate Dongle Consumer Control" - (name "Razer Razer Viper Ultimate Dongle Consumer Control") - (tool-options "GimpRectangleSelectOptions" - (tool "gimp-rect-select-tool")) - (use-fg-bg no) - (use-opacity-paint-mode no) - (use-brush no) - (use-dynamics no) - (use-mypaint-brush no) - (use-gradient no) - (use-pattern no) - (use-palette no) - (use-font no) - (mode disabled) - (axes 4 x y pressure xtilt) - (keys 0) - (pressure-curve - (curve-type smooth) - (points 0) - (point-types 0) - (n-samples 256) - (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) (GimpDeviceInfo "Virtual core XTEST pointer" (icon-name "gimp-cursor") (name "Virtual core XTEST pointer") (tool-options "GimpCropOptions" - (tool "gimp-crop-tool")) + (tool "gimp-crop-tool") + (pattern "Pine")) (use-fg-bg no) (use-opacity-paint-mode no) (use-brush no) @@ -219,7 +173,8 @@ (icon-name "gimp-cursor") (name "Logitech Gaming Mouse G502") (tool-options "GimpCropOptions" - (tool "gimp-crop-tool")) + (tool "gimp-crop-tool") + (pattern "Pine")) (use-fg-bg no) (use-opacity-paint-mode no) (use-brush no) @@ -242,7 +197,8 @@ (icon-name "gimp-cursor") (name "Logitech Gaming Mouse G502 Consumer Control") (tool-options "GimpCropOptions" - (tool "gimp-crop-tool")) + (tool "gimp-crop-tool") + (pattern "Pine")) (use-fg-bg no) (use-opacity-paint-mode no) (use-brush no) @@ -261,6 +217,57 @@ (point-types 2 smooth smooth) (n-samples 256) (samples 256 0 0.0039220000000000001 0.0078429999999999993 0.011764999999999999 0.015685999999999999 0.019608 0.023529000000000001 0.027451 0.031372999999999998 0.035293999999999999 0.039216000000000001 0.043137000000000002 0.047058999999999997 0.050979999999999998 0.054901999999999999 0.058824000000000001 0.062744999999999995 0.066667000000000004 0.070587999999999998 0.074510000000000007 0.078431000000000001 0.082352999999999996 0.086275000000000004 0.090195999999999998 0.094117999999999993 0.098039000000000001 0.101961 0.105882 0.109804 0.11372500000000001 0.117647 0.121569 0.12548999999999999 0.129412 0.13333300000000001 0.13725499999999999 0.141176 0.145098 0.14902000000000001 0.15294099999999999 0.156863 0.16078400000000001 0.16470599999999999 0.168627 0.17254900000000001 0.17647099999999999 0.180392 0.18431400000000001 0.18823500000000001 0.19215699999999999 0.196078 0.20000000000000001 0.20392199999999999 0.207843 0.21176500000000001 0.21568599999999999 0.219608 0.22352900000000001 0.22745099999999999 0.231373 0.235294 0.23921600000000001 0.24313699999999999 0.247059 0.25097999999999998 0.25490200000000002 0.258824 0.26274500000000001 0.26666699999999999 0.270588 0.27450999999999998 0.27843099999999998 0.28235300000000002 0.286275 0.29019600000000001 0.29411799999999999 0.298039 0.30196099999999998 0.30588199999999999 0.30980400000000002 0.31372499999999998 0.31764700000000001 0.32156899999999999 0.32549 0.32941199999999998 0.33333299999999999 0.33725500000000003 0.34117599999999998 0.34509800000000002 0.34902 0.352941 0.35686299999999999 0.36078399999999999 0.36470599999999997 0.36862699999999998 0.37254900000000002 0.376471 0.38039200000000001 0.38431399999999999 0.388235 0.39215699999999998 0.39607799999999999 0.40000000000000002 0.403922 0.40784300000000001 0.41176499999999999 0.415686 0.41960799999999998 0.42352899999999999 0.42745100000000003 0.43137300000000001 0.43529400000000001 0.439216 0.443137 0.44705899999999998 0.45097999999999999 0.45490199999999997 0.45882400000000001 0.46274500000000002 0.466667 0.47058800000000001 0.47450999999999999 0.478431 0.48235299999999998 0.48627500000000001 0.49019600000000002 0.494118 0.49803900000000001 0.50196099999999999 0.50588200000000005 0.50980400000000003 0.51372499999999999 0.51764699999999997 0.52156899999999995 0.52549000000000001 0.52941199999999999 0.53333299999999995 0.53725500000000004 0.54117599999999999 0.54509799999999997 0.54901999999999995 0.55294100000000002 0.556863 0.56078399999999995 0.56470600000000004 0.56862699999999999 0.57254899999999997 0.57647099999999996 0.58039200000000002 0.584314 0.58823499999999995 0.59215700000000004 0.596078 0.59999999999999998 0.60392199999999996 0.60784300000000002 0.611765 0.61568599999999996 0.61960800000000005 0.623529 0.62745099999999998 0.63137299999999996 0.63529400000000003 0.63921600000000001 0.64313699999999996 0.64705900000000005 0.65098 0.65490199999999998 0.65882399999999997 0.66274500000000003 0.66666700000000001 0.67058799999999996 0.67451000000000005 0.67843100000000001 0.68235299999999999 0.68627499999999997 0.69019600000000003 0.69411800000000001 0.69803899999999997 0.70196099999999995 0.70588200000000001 0.70980399999999999 0.71372500000000005 0.71764700000000003 0.72156900000000002 0.72548999999999997 0.72941199999999995 0.73333300000000001 0.73725499999999999 0.74117599999999995 0.74509800000000004 0.74902000000000002 0.75294099999999997 0.75686299999999995 0.76078400000000002 0.764706 0.76862699999999995 0.77254900000000004 0.77647100000000002 0.78039199999999997 0.78431399999999996 0.78823500000000002 0.792157 0.79607799999999995 0.80000000000000004 0.80392200000000003 0.80784299999999998 0.81176499999999996 0.81568600000000002 0.819608 0.82352899999999996 0.82745100000000005 0.83137300000000003 0.83529399999999998 0.83921599999999996 0.84313700000000003 0.84705900000000001 0.85097999999999996 0.85490200000000005 0.85882400000000003 0.86274499999999998 0.86666699999999997 0.87058800000000003 0.87451000000000001 0.87843099999999996 0.88235300000000005 0.88627500000000003 0.89019599999999999 0.89411799999999997 0.89803900000000003 0.90196100000000001 0.90588199999999997 0.90980399999999995 0.91372500000000001 0.91764699999999999 0.92156899999999997 0.92549000000000003 0.92941200000000002 0.93333299999999997 0.93725499999999995 0.94117600000000001 0.94509799999999999 0.94901999999999997 0.95294100000000004 0.95686300000000002 0.96078399999999997 0.96470599999999995 0.96862700000000002 0.972549 0.97647099999999998 0.98039200000000004 0.98431400000000002 0.98823499999999997 0.99215699999999996 0.99607800000000002 1))) +(GimpDeviceInfo "RAZER Razer Mouse Dock Consumer Control" + (icon-name "gimp-cursor") + (name "RAZER Razer Mouse Dock Consumer Control") + (tool-options "GimpPencilOptions" + (tool "gimp-pencil-tool") + (brush "Pixel (1x1 square)") + (dynamics "Dynamics Off") + (gradient "FG to BG (RGB)") + (palette "Color History") + (brush-size 10) + (brush-spacing 0.5)) + (use-fg-bg yes) + (use-opacity-paint-mode no) + (use-brush yes) + (use-dynamics yes) + (use-mypaint-brush no) + (use-gradient yes) + (use-pattern no) + (use-palette yes) + (use-font no) + (mode disabled) + (axes 4 x y pressure xtilt) + (keys 0) + (pressure-curve + (curve-type smooth) + (points 0) + (point-types 0) + (n-samples 256) + (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) +(GimpDeviceInfo "Razer Razer Viper Ultimate Dongle Consumer Control" + (name "Razer Razer Viper Ultimate Dongle Consumer Control") + (tool-options "GimpRectangleSelectOptions" + (tool "gimp-rect-select-tool")) + (use-fg-bg no) + (use-opacity-paint-mode no) + (use-brush no) + (use-dynamics no) + (use-mypaint-brush no) + (use-gradient no) + (use-pattern no) + (use-palette no) + (use-font no) + (mode disabled) + (axes 4 x y pressure xtilt) + (keys 0) + (pressure-curve + (curve-type smooth) + (points 0) + (point-types 0) + (n-samples 256) + (samples 256 0 0.0039215686274509803 0.0078431372549019607 0.011764705882352941 0.015686274509803921 0.019607843137254902 0.023529411764705882 0.027450980392156862 0.031372549019607843 0.035294117647058823 0.039215686274509803 0.043137254901960784 0.047058823529411764 0.050980392156862744 0.054901960784313725 0.058823529411764705 0.062745098039215685 0.066666666666666666 0.070588235294117646 0.074509803921568626 0.078431372549019607 0.082352941176470587 0.086274509803921567 0.090196078431372548 0.094117647058823528 0.098039215686274508 0.10196078431372549 0.10588235294117647 0.10980392156862745 0.11372549019607843 0.11764705882352941 0.12156862745098039 0.12549019607843137 0.12941176470588237 0.13333333333333333 0.13725490196078433 0.14117647058823529 0.14509803921568629 0.14901960784313725 0.15294117647058825 0.15686274509803921 0.16078431372549021 0.16470588235294117 0.16862745098039217 0.17254901960784313 0.17647058823529413 0.1803921568627451 0.18431372549019609 0.18823529411764706 0.19215686274509805 0.19607843137254902 0.20000000000000001 0.20392156862745098 0.20784313725490197 0.21176470588235294 0.21568627450980393 0.2196078431372549 0.22352941176470589 0.22745098039215686 0.23137254901960785 0.23529411764705882 0.23921568627450981 0.24313725490196078 0.24705882352941178 0.25098039215686274 0.25490196078431371 0.25882352941176473 0.2627450980392157 0.26666666666666666 0.27058823529411763 0.27450980392156865 0.27843137254901962 0.28235294117647058 0.28627450980392155 0.29019607843137257 0.29411764705882354 0.29803921568627451 0.30196078431372547 0.30588235294117649 0.30980392156862746 0.31372549019607843 0.31764705882352939 0.32156862745098042 0.32549019607843138 0.32941176470588235 0.33333333333333331 0.33725490196078434 0.3411764705882353 0.34509803921568627 0.34901960784313724 0.35294117647058826 0.35686274509803922 0.36078431372549019 0.36470588235294116 0.36862745098039218 0.37254901960784315 0.37647058823529411 0.38039215686274508 0.3843137254901961 0.38823529411764707 0.39215686274509803 0.396078431372549 0.40000000000000002 0.40392156862745099 0.40784313725490196 0.41176470588235292 0.41568627450980394 0.41960784313725491 0.42352941176470588 0.42745098039215684 0.43137254901960786 0.43529411764705883 0.4392156862745098 0.44313725490196076 0.44705882352941179 0.45098039215686275 0.45490196078431372 0.45882352941176469 0.46274509803921571 0.46666666666666667 0.47058823529411764 0.47450980392156861 0.47843137254901963 0.4823529411764706 0.48627450980392156 0.49019607843137253 0.49411764705882355 0.49803921568627452 0.50196078431372548 0.50588235294117645 0.50980392156862742 0.51372549019607838 0.51764705882352946 0.52156862745098043 0.52549019607843139 0.52941176470588236 0.53333333333333333 0.53725490196078429 0.54117647058823526 0.54509803921568623 0.5490196078431373 0.55294117647058827 0.55686274509803924 0.5607843137254902 0.56470588235294117 0.56862745098039214 0.5725490196078431 0.57647058823529407 0.58039215686274515 0.58431372549019611 0.58823529411764708 0.59215686274509804 0.59607843137254901 0.59999999999999998 0.60392156862745094 0.60784313725490191 0.61176470588235299 0.61568627450980395 0.61960784313725492 0.62352941176470589 0.62745098039215685 0.63137254901960782 0.63529411764705879 0.63921568627450975 0.64313725490196083 0.6470588235294118 0.65098039215686276 0.65490196078431373 0.6588235294117647 0.66274509803921566 0.66666666666666663 0.6705882352941176 0.67450980392156867 0.67843137254901964 0.68235294117647061 0.68627450980392157 0.69019607843137254 0.69411764705882351 0.69803921568627447 0.70196078431372544 0.70588235294117652 0.70980392156862748 0.71372549019607845 0.71764705882352942 0.72156862745098038 0.72549019607843135 0.72941176470588232 0.73333333333333328 0.73725490196078436 0.74117647058823533 0.74509803921568629 0.74901960784313726 0.75294117647058822 0.75686274509803919 0.76078431372549016 0.76470588235294112 0.7686274509803922 0.77254901960784317 0.77647058823529413 0.7803921568627451 0.78431372549019607 0.78823529411764703 0.792156862745098 0.79607843137254897 0.80000000000000004 0.80392156862745101 0.80784313725490198 0.81176470588235294 0.81568627450980391 0.81960784313725488 0.82352941176470584 0.82745098039215681 0.83137254901960789 0.83529411764705885 0.83921568627450982 0.84313725490196079 0.84705882352941175 0.85098039215686272 0.85490196078431369 0.85882352941176465 0.86274509803921573 0.8666666666666667 0.87058823529411766 0.87450980392156863 0.8784313725490196 0.88235294117647056 0.88627450980392153 0.8901960784313725 0.89411764705882357 0.89803921568627454 0.90196078431372551 0.90588235294117647 0.90980392156862744 0.9137254901960784 0.91764705882352937 0.92156862745098034 0.92549019607843142 0.92941176470588238 0.93333333333333335 0.93725490196078431 0.94117647058823528 0.94509803921568625 0.94901960784313721 0.95294117647058818 0.95686274509803926 0.96078431372549022 0.96470588235294119 0.96862745098039216 0.97254901960784312 0.97647058823529409 0.98039215686274506 0.98431372549019602 0.9882352941176471 0.99215686274509807 0.99607843137254903 1))) (GimpDeviceInfo "SEMITEK USB-HID Gaming Keyboard Mouse" (icon-name "gimp-cursor") (name "SEMITEK USB-HID Gaming Keyboard Mouse") diff --git a/.config/GIMP/2.10/gimprc b/.config/GIMP/2.10/gimprc index 3e48da8..3f5cc4a 100644 --- a/.config/GIMP/2.10/gimprc +++ b/.config/GIMP/2.10/gimprc @@ -41,8 +41,8 @@ (theme "System") (icon-theme "Color") (user-manual-online yes) -(image-convert-indexed-palette-type custom) -(image-convert-indexed-max-colors 2) +(image-convert-indexed-palette-type mono) +(image-convert-indexed-max-colors 4) (image-resize-fill-type white) (image-resize-layer-set all) (layer-new-name "Background") diff --git a/.config/GIMP/2.10/sessionrc b/.config/GIMP/2.10/sessionrc index c4d5835..c4a7d70 100644 --- a/.config/GIMP/2.10/sessionrc +++ b/.config/GIMP/2.10/sessionrc @@ -29,8 +29,8 @@ (aux-info (show-button-bar "true")))) (book - (position 525) - (current-page 0) + (position 546) + (current-page 1) (dockable "gimp-layer-list" (tab-style automatic) (preview-size 32) @@ -55,8 +55,7 @@ (size 942 643)) (session-info "toplevel" (factory-entry "gimp-toolbox-color-dialog") - (position 906 0) - (monitor 1)) + (position 901 0)) (session-info "toplevel" (factory-entry "gimp-preferences-dialog") (position 180 86) @@ -79,11 +78,11 @@ (size 1920 1019)) (session-info "toplevel" (factory-entry "gimp-operation-tool-dialog") - (position 1256 161) - (monitor 1)) + (position 1256 161)) (session-info "toplevel" (factory-entry "gimp-brightness-contrast-tool-dialog") - (position 190 131)) + (position 190 131) + (monitor 1)) (session-info "toplevel" (factory-entry "gimp-file-open-location-dialog") (position 0 126)) diff --git a/.config/audacious/config b/.config/audacious/config index 0d04975..dbc64f9 100644 --- a/.config/audacious/config +++ b/.config/audacious/config @@ -4,7 +4,7 @@ cover_name_exclude= enable_replay_gain=FALSE [audgui] -filesel_path=/home/ifohancroft/Music/Other +filesel_path=/home/ifohancroft/Music [skins] equalizer_visible=TRUE @@ -12,14 +12,18 @@ equalizer_x=3565 equalizer_y=143 player_x=3565 player_y=27 +playlist_height=290 playlist_visible=TRUE playlist_x=3565 playlist_y=259 skin=/usr/share/audacious/Skins/Refugee [skins-layout] +albumart-qt=3269,98,288,192 +eq_presets=3550,27,288,192 playlist-manager-qt=3550,27,288,192 search-tool-qt=2731,415,288,192 +song-info-qt=3231,440,467,322 [song_change] cmd_line=echo "%a - %T " > /home/ifohancroft/Projects/ifohancroft/Twitch/currentsong.txt diff --git a/.config/audacious/plugin-registry b/.config/audacious/plugin-registry index 9fe5432..3a1a42d 100644 --- a/.config/audacious/plugin-registry +++ b/.config/audacious/plugin-registry @@ -1,6 +1,6 @@ format 11 transport /usr/lib/audacious/Transport/gio.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name GIO Plugin @@ -14,7 +14,7 @@ scheme sftp scheme smb scheme mtp transport /usr/lib/audacious/Transport/mms.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name MMS Plugin @@ -25,7 +25,7 @@ config 0 enabled 1 scheme mms transport /usr/lib/audacious/Transport/neon.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Neon HTTP/HTTPS Plugin @@ -37,7 +37,7 @@ enabled 1 scheme http scheme https playlist /usr/lib/audacious/Container/asx.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name ASXv1/ASXv2 Playlists @@ -49,7 +49,7 @@ enabled 1 ext asx saves 0 playlist /usr/lib/audacious/Container/asx3.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name ASXv3 Playlists @@ -61,7 +61,7 @@ enabled 1 ext asx saves 1 playlist /usr/lib/audacious/Container/audpl.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Audacious Playlists (audpl) @@ -73,7 +73,7 @@ enabled 1 ext audpl saves 1 playlist /usr/lib/audacious/Container/cue.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Cue Sheet Plugin @@ -85,7 +85,7 @@ enabled 1 ext cue saves 0 playlist /usr/lib/audacious/Container/m3u.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name M3U Playlists @@ -98,7 +98,7 @@ ext m3u ext m3u8 saves 1 playlist /usr/lib/audacious/Container/pls.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name PLS Playlists @@ -110,7 +110,7 @@ enabled 1 ext pls saves 1 playlist /usr/lib/audacious/Container/xspf.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name XML Shareable Playlists (XSPF) @@ -122,7 +122,7 @@ enabled 1 ext xspf saves 1 input /usr/lib/audacious/Input/xsf.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name 2SF Decoder @@ -136,7 +136,7 @@ scheme mini2sf subtunes 0 writes 0 input /usr/lib/audacious/Input/aac-raw.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name AAC (Raw) Decoder @@ -150,7 +150,7 @@ ext audio/aac subtunes 0 writes 0 input /usr/lib/audacious/Input/amidi-plug.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name AMIDI-Plug (MIDI Player) @@ -167,7 +167,7 @@ ext audio/midi subtunes 0 writes 0 input /usr/lib/audacious/Input/cdaudio-ng.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Audio CD Plugin @@ -180,7 +180,7 @@ mime cdda subtunes 2 writes 0 input /usr/lib/audacious/Input/console.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Game Console Music Decoder @@ -203,7 +203,7 @@ scheme vgz subtunes 2 writes 0 input /usr/lib/audacious/Input/madplug.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name MPG123 Plugin @@ -223,7 +223,7 @@ ext audio/x-mpeg subtunes 0 writes 1 input /usr/lib/audacious/Input/psf2.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name OpenPSF PSF1/PSF2 Decoder @@ -241,7 +241,7 @@ scheme spx subtunes 0 writes 0 input /usr/lib/audacious/Input/sid.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name SID Player @@ -255,7 +255,7 @@ scheme psid subtunes 2 writes 0 input /usr/lib/audacious/Input/metronom.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Tact Generator @@ -268,7 +268,7 @@ mime tact subtunes 0 writes 0 input /usr/lib/audacious/Input/tonegen.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Tone Generator @@ -281,7 +281,7 @@ mime tone subtunes 0 writes 0 input /usr/lib/audacious/Input/vtx.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name VTX Decoder @@ -294,7 +294,7 @@ scheme vtx subtunes 0 writes 0 input /usr/lib/audacious/Input/wavpack.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name WavPack Decoder @@ -308,7 +308,7 @@ ext audio/x-wavpack subtunes 0 writes 1 input /usr/lib/audacious/Input/flacng.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name FLAC Decoder @@ -324,7 +324,7 @@ ext audio/x-flac subtunes 0 writes 1 input /usr/lib/audacious/Input/modplug.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name ModPlug (Module Player) @@ -356,7 +356,7 @@ scheme ft2 subtunes 2 writes 0 input /usr/lib/audacious/Input/vorbis.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Ogg Vorbis Decoder @@ -375,7 +375,7 @@ ext audio/x-vorbis+ogg subtunes 0 writes 1 input /usr/lib/audacious/Input/sndfile.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Sndfile Plugin @@ -393,7 +393,7 @@ ext audio/x-wav subtunes 0 writes 0 input /usr/lib/audacious/Input/ffaudio.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name FFmpeg Plugin @@ -428,7 +428,7 @@ ext audio/mp4 subtunes 0 writes 1 effect /usr/lib/audacious/Effect/bs2b.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Bauer Stereophonic-to-Binaural (BS2B) @@ -438,7 +438,7 @@ about 0 config 1 enabled 0 effect /usr/lib/audacious/Effect/crystalizer.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Crystalizer @@ -448,7 +448,7 @@ about 0 config 1 enabled 0 effect /usr/lib/audacious/Effect/compressor.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Dynamic Range Compressor @@ -458,7 +458,7 @@ about 1 config 1 enabled 0 effect /usr/lib/audacious/Effect/echo.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Echo @@ -468,7 +468,7 @@ about 1 config 1 enabled 0 effect /usr/lib/audacious/Effect/stereo.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Extra Stereo @@ -478,7 +478,7 @@ about 1 config 1 enabled 0 effect /usr/lib/audacious/Effect/silence-removal.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Silence Removal @@ -488,7 +488,7 @@ about 1 config 1 enabled 0 effect /usr/lib/audacious/Effect/speed-pitch.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Speed and Pitch @@ -498,7 +498,7 @@ about 0 config 1 enabled 0 effect /usr/lib/audacious/Effect/voice_removal.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Voice Removal @@ -508,7 +508,7 @@ about 0 config 0 enabled 0 effect /usr/lib/audacious/Effect/mixer.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Channel Mixer @@ -518,7 +518,7 @@ about 1 config 1 enabled 0 effect /usr/lib/audacious/Effect/resample.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Sample Rate Converter @@ -528,7 +528,7 @@ about 1 config 1 enabled 0 effect /usr/lib/audacious/Effect/sox-resampler.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name SoX Resampler @@ -538,7 +538,7 @@ about 1 config 1 enabled 0 effect /usr/lib/audacious/Effect/crossfade.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Crossfade @@ -548,7 +548,7 @@ about 1 config 1 enabled 0 output /usr/lib/audacious/Output/pulse_audio.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name PulseAudio Output @@ -558,7 +558,7 @@ about 1 config 1 enabled 1 output /usr/lib/audacious/Output/alsa.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name ALSA Output @@ -568,7 +568,7 @@ about 1 config 1 enabled 0 output /usr/lib/audacious/Output/oss4.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name OSS3 Output @@ -578,7 +578,7 @@ about 1 config 1 enabled 0 output /usr/lib/audacious/Output/sdlout.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name SDL Output @@ -588,7 +588,7 @@ about 1 config 0 enabled 0 output /usr/lib/audacious/Output/filewriter.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name FileWriter Plugin @@ -598,7 +598,7 @@ about 1 config 1 enabled 0 output /usr/lib/audacious/Output/jack-ng.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name JACK Output @@ -608,7 +608,7 @@ about 0 config 1 enabled 0 vis /usr/lib/audacious/Visualization/blur_scope-qt.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name Blur Scope @@ -618,7 +618,7 @@ about 0 config 1 enabled 0 vis /usr/lib/audacious/Visualization/gl-spectrum-qt.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name OpenGL Spectrum Analyzer @@ -628,7 +628,7 @@ about 1 config 0 enabled 0 vis /usr/lib/audacious/Visualization/qt-spectrum.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name Spectrum Analyzer @@ -638,7 +638,7 @@ about 0 config 0 enabled 0 vis /usr/lib/audacious/Visualization/vumeter-qt.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name VU Meter @@ -648,7 +648,7 @@ about 1 config 1 enabled 0 general /usr/lib/audacious/General/albumart-qt.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name Album Art @@ -658,7 +658,7 @@ about 0 config 0 enabled 0 general /usr/lib/audacious/General/cd-menu-items.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Audio CD Menu Items @@ -668,7 +668,7 @@ about 0 config 0 enabled 1 general /usr/lib/audacious/General/delete-files.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Delete Files @@ -678,7 +678,7 @@ about 0 config 1 enabled 0 general /usr/lib/audacious/General/notify.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Desktop Notifications @@ -688,7 +688,7 @@ about 1 config 1 enabled 0 general /usr/lib/audacious/General/qthotkey.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name Global Hotkeys @@ -698,7 +698,7 @@ about 1 config 1 enabled 0 general /usr/lib/audacious/General/lirc.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name LIRC Plugin @@ -708,7 +708,7 @@ about 1 config 1 enabled 0 general /usr/lib/audacious/General/lyricwiki-qt.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name Lyrics @@ -718,7 +718,7 @@ about 0 config 1 enabled 0 general /usr/lib/audacious/General/mpris2.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name MPRIS 2 Server @@ -728,7 +728,7 @@ about 0 config 0 enabled 0 general /usr/lib/audacious/General/playlist-manager-qt.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name Playlist Manager @@ -738,7 +738,7 @@ about 0 config 0 enabled 0 general /usr/lib/audacious/General/scrobbler.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Scrobbler 2.0 @@ -748,7 +748,7 @@ about 1 config 1 enabled 0 general /usr/lib/audacious/General/search-tool-qt.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name Search Tool @@ -758,7 +758,7 @@ about 0 config 1 enabled 0 general /usr/lib/audacious/General/song_change.so -stamp 1615448284 +stamp 1627540018 version 48 flags 0 name Song Change @@ -768,7 +768,7 @@ about 0 config 1 enabled 1 general /usr/lib/audacious/General/song-info-qt.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name Song Info @@ -778,7 +778,7 @@ about 0 config 0 enabled 0 general /usr/lib/audacious/General/statusicon-qt.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name Status Icon @@ -788,7 +788,7 @@ about 1 config 1 enabled 0 iface /usr/lib/audacious/General/qtui.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name Qt Interface @@ -798,7 +798,7 @@ about 0 config 1 enabled 0 iface /usr/lib/audacious/General/skins-qt.so -stamp 1615448284 +stamp 1627540018 version 48 flags 2 name Winamp Classic Interface diff --git a/.config/inkscape/preferences.xml b/.config/inkscape/preferences.xml index 61d30f3..94626f1 100644 --- a/.config/inkscape/preferences.xml +++ b/.config/inkscape/preferences.xml @@ -1,8 +1,8 @@ + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"> + width="34" + height="345" /> + rx="27.8139" + ry="27.8139" /> + usecurrent="0" /> + keep_selected="1" + abs_width="1" + unit="mm"> + style="fill:black;fill-opacity:1;line-height:1.25;stroke:none;font-family:sans-serif;font-style:normal;font-weight:normal;font-size:40px;" + selcue="1" /> + measure-start="57.071,718.849" + measure-end="20.2093,718.849" + fontsize="10"> + + + @@ -547,60 +557,35 @@ id="toolbox" /> + placement="2" /> + id="filtereffects" /> + id="textandfont" /> + id="align" /> + h="500" + w="300" /> + id="object" /> + path=""> + value="page" /> + path="/home/ifohancroft/Projects/Hacking/Mice/Razer Viper Ultimate/Housing/Rubber Sidegrips/Scans/Second Scan/" /> + id="clonetiler" /> - + placement="2" /> + placement="1" /> + @@ -763,8 +724,6 @@ + value="8.0" /> @@ -848,9 +807,6 @@ - @@ -859,7 +815,7 @@ value="0.4" /> + value="0" /> @@ -898,6 +854,9 @@ + @@ -938,6 +897,9 @@ + + + + + id="commandpalette"> + + + + org.inkscape.input.svg.scale="auto" /> + style="fill:#ff0000;font-size:96px;stroke:#ff0000;stroke-width:5;stroke-linejoin:round;stroke-linecap:round"> + id="geometry" /> + small="0" /> - - + gtkTheme="Minwaita-Inkscape" + iconTheme="hicolor" + defaultTheme="BlueMenta" /> + diff --git a/.config/obs-studio/basic/profiles/ifohancroft/basic.ini b/.config/obs-studio/basic/profiles/ifohancroft/basic.ini index 8f687f2..4a78ad9 100644 --- a/.config/obs-studio/basic/profiles/ifohancroft/basic.ini +++ b/.config/obs-studio/basic/profiles/ifohancroft/basic.ini @@ -29,16 +29,21 @@ FFVEncoderId=27 FFVEncoder=h264_nvenc FFAEncoderId=86028 FFAEncoder=flac -FFAudioMixes=2 +FFAudioMixes=1 FFFilePath=/home/ifohancroft/Videos FFFileNameWithoutSpace=true FFExtension=mkv FFVBitrate=6541 FFABitrate=320 -Track1Bitrate=96 +Track1Bitrate=320 Track2Bitrate=320 FFVGOPSize=250 ApplyServiceSettings=true +Track3Bitrate=320 +Track4Bitrate=320 +Track6Bitrate=320 +VodTrackEnabled=false +VodTrackIndex=1 [Audio] PeakMeterType=1 @@ -46,3 +51,13 @@ MeterDecayRate=8.5700000000000003 [Stats] geometry=AdnQywADAAAAAAmvAAABjwAADNAAAALCAAAJsAAAAaoAAAzPAAACwQAAAAEAAAAAB4AAAAmwAAABqgAADM8AAALB + +[WebsocketAPI] +ServerEnabled=true +ServerPort=4444 +LockToIPv4=false +DebugEnabled=false +AlertsEnabled=true +AuthRequired=true +AuthSecret=2xd8FizUcJiuZ4Cm4L5vTOKIK9zjqNmS7zebz7P7/+Y= +AuthSalt=RAfmmDp9xfMHSuez51KUgdA5EG21wHu2ZWgxlZzLuR0= diff --git a/.config/obs-studio/basic/scenes/ifohancroft.json b/.config/obs-studio/basic/scenes/ifohancroft.json index cbcba97..38b6d83 100644 --- a/.config/obs-studio/basic/scenes/ifohancroft.json +++ b/.config/obs-studio/basic/scenes/ifohancroft.json @@ -1,857 +1 @@ -{ - "AuxAudioDevice1": { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "filters": [ - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": {}, - "id": "noise_suppress_filter", - "mixers": 255, - "monitoring_type": 0, - "muted": false, - "name": "Noise Suppression", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": {}, - "sync": 0, - "versioned_id": "noise_suppress_filter", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": {}, - "id": "noise_gate_filter", - "mixers": 255, - "monitoring_type": 0, - "muted": false, - "name": "Noise Gate", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "open_threshold": -29.0 - }, - "sync": 0, - "versioned_id": "noise_gate_filter", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": {}, - "id": "compressor_filter", - "mixers": 255, - "monitoring_type": 0, - "muted": false, - "name": "Compressor", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "ratio": 4.0 - }, - "sync": 0, - "versioned_id": "compressor_filter", - "volume": 1.0 - } - ], - "flags": 0, - "hotkeys": { - "libobs.mute": [], - "libobs.push-to-mute": [], - "libobs.push-to-talk": [], - "libobs.unmute": [] - }, - "id": "pulse_input_capture", - "mixers": 255, - "monitoring_type": 0, - "muted": false, - "name": "Mic/Aux", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "device_id": "alsa_input.usb-audio-technica_AT2020USB_-00.analog-stereo" - }, - "sync": 0, - "versioned_id": "pulse_input_capture", - "volume": 1.0 - }, - "DesktopAudioDevice1": { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "filters": [ - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": {}, - "id": "compressor_filter", - "mixers": 255, - "monitoring_type": 0, - "muted": false, - "name": "Compressor", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "attack_time": 22, - "ratio": 3.0, - "release_time": 748, - "sidechain_source": "Mic/Aux", - "threshold": -44.100000000000001 - }, - "sync": 0, - "versioned_id": "compressor_filter", - "volume": 1.0 - } - ], - "flags": 0, - "hotkeys": { - "libobs.mute": [], - "libobs.push-to-mute": [], - "libobs.push-to-talk": [], - "libobs.unmute": [] - }, - "id": "pulse_output_capture", - "mixers": 255, - "monitoring_type": 0, - "muted": false, - "name": "Desktop Audio", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "device_id": "alsa_output.pci-0000_00_1f.3.analog-stereo.monitor" - }, - "sync": 0, - "versioned_id": "pulse_output_capture", - "volume": 1.0 - }, - "current_program_scene": "Testing", - "current_scene": "Testing", - "current_transition": "Fade", - "groups": [], - "modules": { - "auto-scene-switcher": { - "active": false, - "interval": 300, - "non_matching_scene": "", - "switch_if_not_matching": false, - "switches": [] - }, - "decklink_captions": { - "source": "" - }, - "output-timer": { - "autoStartRecordTimer": false, - "autoStartStreamTimer": false, - "pauseRecordTimer": false, - "recordTimerHours": 0, - "recordTimerMinutes": 0, - "recordTimerSeconds": 0, - "streamTimerHours": 0, - "streamTimerMinutes": 0, - "streamTimerSeconds": 0 - }, - "scripts-tool": [] - }, - "name": "ifohancroft", - "preview_locked": false, - "quick_transitions": [ - { - "duration": 300, - "fade_to_black": false, - "hotkeys": [], - "id": 1, - "name": "Cut" - }, - { - "duration": 300, - "fade_to_black": false, - "hotkeys": [], - "id": 2, - "name": "Fade" - }, - { - "duration": 300, - "fade_to_black": true, - "hotkeys": [], - "id": 3, - "name": "Fade" - } - ], - "saved_projectors": [], - "scaling_enabled": false, - "scaling_level": 0, - "scaling_off_x": 0.0, - "scaling_off_y": 0.0, - "scene_order": [ - { - "name": "Tech" - }, - { - "name": "Gaming" - }, - { - "name": "Testing" - } - ], - "sources": [ - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": {}, - "id": "v4l2_input", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "Second Camera", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "Exposure, Auto": 1, - "Exposure, Auto Priority": false, - "Focus, Auto": false, - "Power Line Frequency": 1, - "White Balance Temperature, Auto": false, - "buffering": false, - "color_range": 1, - "device_id": "/dev/video0", - "framerate": 65596, - "input": 0, - "pixelformat": 842094169, - "resolution": 83886800 - }, - "sync": 0, - "versioned_id": "v4l2_input", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": { - "OBSBasic.SelectScene": [], - "libobs.hide_scene_item.Camera": [], - "libobs.hide_scene_item.Desktop": [], - "libobs.hide_scene_item.Notifications": [], - "libobs.hide_scene_item.Second Camera": [], - "libobs.show_scene_item.Camera": [], - "libobs.show_scene_item.Desktop": [], - "libobs.show_scene_item.Notifications": [], - "libobs.show_scene_item.Second Camera": [] - }, - "id": "scene", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "Tech", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "custom_size": false, - "id_counter": 9, - "items": [ - { - "align": 5, - "bounds": { - "x": 0.0, - "y": 0.0 - }, - "bounds_align": 0, - "bounds_type": 0, - "crop_bottom": 0, - "crop_left": 0, - "crop_right": 0, - "crop_top": 0, - "group_item_backup": false, - "hide_transition": { - "duration": 0 - }, - "id": 4, - "locked": true, - "name": "Desktop", - "pos": { - "x": 0.0, - "y": 0.0 - }, - "private_settings": {}, - "rot": 0.0, - "scale": { - "x": 1.0, - "y": 1.0 - }, - "scale_filter": "disable", - "show_transition": { - "duration": 0 - }, - "visible": true - }, - { - "align": 5, - "bounds": { - "x": 1.0, - "y": 1.0 - }, - "bounds_align": 0, - "bounds_type": 0, - "crop_bottom": 0, - "crop_left": 0, - "crop_right": 0, - "crop_top": 0, - "group_item_backup": false, - "hide_transition": { - "duration": 0 - }, - "id": 9, - "locked": true, - "name": "Second Camera", - "pos": { - "x": 1440.0, - "y": 0.0 - }, - "private_settings": {}, - "rot": 0.0, - "scale": { - "x": 0.375, - "y": 0.375 - }, - "scale_filter": "disable", - "show_transition": { - "duration": 0 - }, - "visible": true - }, - { - "align": 5, - "bounds": { - "x": 1.0, - "y": 1.0 - }, - "bounds_align": 0, - "bounds_type": 0, - "crop_bottom": 0, - "crop_left": 0, - "crop_right": 0, - "crop_top": 0, - "group_item_backup": false, - "hide_transition": { - "duration": 0 - }, - "id": 5, - "locked": true, - "name": "Camera", - "pos": { - "x": 1440.0, - "y": 0.0 - }, - "private_settings": {}, - "rot": 0.0, - "scale": { - "x": 0.375, - "y": 0.375 - }, - "scale_filter": "disable", - "show_transition": { - "duration": 0 - }, - "visible": true - }, - { - "align": 5, - "bounds": { - "x": 0.0, - "y": 0.0 - }, - "bounds_align": 0, - "bounds_type": 0, - "crop_bottom": 0, - "crop_left": 0, - "crop_right": 0, - "crop_top": 0, - "group_item_backup": false, - "hide_transition": { - "duration": 0 - }, - "id": 2, - "locked": true, - "name": "Notifications", - "pos": { - "x": 0.0, - "y": 0.0 - }, - "private_settings": {}, - "rot": 0.0, - "scale": { - "x": 1.0, - "y": 1.0 - }, - "scale_filter": "disable", - "show_transition": { - "duration": 0 - }, - "visible": true - } - ] - }, - "sync": 0, - "versioned_id": "scene", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": { - "OBSBasic.SelectScene": [], - "libobs.hide_scene_item.Camera": [], - "libobs.hide_scene_item.Game": [], - "libobs.hide_scene_item.Notifications": [], - "libobs.hide_scene_item.Second Camera": [], - "libobs.show_scene_item.Camera": [], - "libobs.show_scene_item.Game": [], - "libobs.show_scene_item.Notifications": [], - "libobs.show_scene_item.Second Camera": [] - }, - "id": "scene", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "Gaming", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "custom_size": false, - "id_counter": 7, - "items": [ - { - "align": 5, - "bounds": { - "x": 0.0, - "y": 0.0 - }, - "bounds_align": 0, - "bounds_type": 0, - "crop_bottom": 0, - "crop_left": 0, - "crop_right": 0, - "crop_top": 0, - "group_item_backup": false, - "hide_transition": { - "duration": 0 - }, - "id": 1, - "locked": true, - "name": "Game", - "pos": { - "x": 0.0, - "y": 0.0 - }, - "private_settings": {}, - "rot": 0.0, - "scale": { - "x": 1.0, - "y": 1.0 - }, - "scale_filter": "disable", - "show_transition": { - "duration": 0 - }, - "visible": true - }, - { - "align": 5, - "bounds": { - "x": 1.0, - "y": 1.0 - }, - "bounds_align": 0, - "bounds_type": 0, - "crop_bottom": 0, - "crop_left": 0, - "crop_right": 0, - "crop_top": 0, - "group_item_backup": false, - "hide_transition": { - "duration": 0 - }, - "id": 7, - "locked": true, - "name": "Second Camera", - "pos": { - "x": 1440.0, - "y": 0.0 - }, - "private_settings": {}, - "rot": 0.0, - "scale": { - "x": 0.375, - "y": 0.375 - }, - "scale_filter": "disable", - "show_transition": { - "duration": 0 - }, - "visible": true - }, - { - "align": 5, - "bounds": { - "x": 1.0, - "y": 1.0 - }, - "bounds_align": 0, - "bounds_type": 0, - "crop_bottom": 0, - "crop_left": 0, - "crop_right": 0, - "crop_top": 0, - "group_item_backup": false, - "hide_transition": { - "duration": 0 - }, - "id": 6, - "locked": true, - "name": "Camera", - "pos": { - "x": 1440.0, - "y": 0.0 - }, - "private_settings": {}, - "rot": 0.0, - "scale": { - "x": 0.375, - "y": 0.375 - }, - "scale_filter": "disable", - "show_transition": { - "duration": 0 - }, - "visible": true - }, - { - "align": 5, - "bounds": { - "x": 0.0, - "y": 0.0 - }, - "bounds_align": 0, - "bounds_type": 0, - "crop_bottom": 0, - "crop_left": 0, - "crop_right": 0, - "crop_top": 0, - "group_item_backup": false, - "hide_transition": { - "duration": 0 - }, - "id": 4, - "locked": true, - "name": "Notifications", - "pos": { - "x": 0.0, - "y": 0.0 - }, - "private_settings": {}, - "rot": 0.0, - "scale": { - "x": 1.0, - "y": 1.0 - }, - "scale_filter": "disable", - "show_transition": { - "duration": 0 - }, - "visible": true - } - ] - }, - "sync": 0, - "versioned_id": "scene", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": {}, - "id": "xcomposite_input", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "Game", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "capture_window": "16777219\r\nTop Panel\r\nmate-panel" - }, - "sync": 0, - "versioned_id": "xcomposite_input", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": { - "libobs.mute": [], - "libobs.push-to-mute": [], - "libobs.push-to-talk": [], - "libobs.unmute": [] - }, - "id": "browser_source", - "mixers": 255, - "monitoring_type": 0, - "muted": false, - "name": "Notifications", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "fps": 60, - "height": 1080, - "url": "https://streamlabs.com/alert-box/v3/E04F7CA9EFF66BB09395", - "width": 1920 - }, - "sync": 0, - "versioned_id": "browser_source", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": {}, - "id": "xshm_input", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "Desktop", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "advanced": false - }, - "sync": 0, - "versioned_id": "xshm_input", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": { - "OBSBasic.SelectScene": [], - "libobs.hide_scene_item.Camera": [], - "libobs.hide_scene_item.Second Camera": [], - "libobs.show_scene_item.Camera": [], - "libobs.show_scene_item.Second Camera": [] - }, - "id": "scene", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "Testing", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "custom_size": false, - "id_counter": 4, - "items": [ - { - "align": 5, - "bounds": { - "x": 0.0, - "y": 0.0 - }, - "bounds_align": 0, - "bounds_type": 0, - "crop_bottom": 0, - "crop_left": 0, - "crop_right": 0, - "crop_top": 0, - "group_item_backup": false, - "hide_transition": { - "duration": 0 - }, - "id": 4, - "locked": true, - "name": "Second Camera", - "pos": { - "x": 0.0, - "y": 0.0 - }, - "private_settings": {}, - "rot": 0.0, - "scale": { - "x": 1.0, - "y": 1.0 - }, - "scale_filter": "disable", - "show_transition": { - "duration": 0 - }, - "visible": true - }, - { - "align": 5, - "bounds": { - "x": 0.0, - "y": 0.0 - }, - "bounds_align": 0, - "bounds_type": 0, - "crop_bottom": 0, - "crop_left": 0, - "crop_right": 0, - "crop_top": 0, - "group_item_backup": false, - "hide_transition": { - "duration": 0 - }, - "id": 2, - "locked": true, - "name": "Camera", - "pos": { - "x": 0.0, - "y": 0.0 - }, - "private_settings": {}, - "rot": 0.0, - "scale": { - "x": 1.0, - "y": 1.0 - }, - "scale_filter": "disable", - "show_transition": { - "duration": 0 - }, - "visible": true - } - ] - }, - "sync": 0, - "versioned_id": "scene", - "volume": 1.0 - }, - { - "balance": 0.5, - "deinterlace_field_order": 0, - "deinterlace_mode": 0, - "enabled": true, - "flags": 0, - "hotkeys": {}, - "id": "v4l2_input", - "mixers": 0, - "monitoring_type": 0, - "muted": false, - "name": "Camera", - "prev_ver": 436273154, - "private_settings": {}, - "push-to-mute": false, - "push-to-mute-delay": 0, - "push-to-talk": false, - "push-to-talk-delay": 0, - "settings": { - "Exposure (Absolute)": 3, - "Exposure, Auto": 1, - "Focus, Auto": false, - "Power Line Frequency": 1, - "White Balance Temperature": 4500, - "White Balance Temperature, Auto": false, - "buffering": false, - "color_range": 1, - "device_id": "/dev/video2", - "framerate": 65566, - "input": 0, - "pixelformat": 842093913, - "resolution": 83886800 - }, - "sync": 0, - "versioned_id": "v4l2_input", - "volume": 1.0 - } - ], - "transition_duration": 300, - "transitions": [] -} \ No newline at end of file +{"AuxAudioDevice1":{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"filters":[{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{},"id":"noise_suppress_filter","mixers":255,"monitoring_type":0,"muted":false,"name":"Noise Suppression","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{},"sync":0,"versioned_id":"noise_suppress_filter","volume":1.0},{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{},"id":"noise_gate_filter","mixers":255,"monitoring_type":0,"muted":false,"name":"Noise Gate","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"open_threshold":-29.0},"sync":0,"versioned_id":"noise_gate_filter","volume":1.0},{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{},"id":"compressor_filter","mixers":255,"monitoring_type":0,"muted":false,"name":"Compressor","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"ratio":4.0},"sync":0,"versioned_id":"compressor_filter","volume":1.0}],"flags":0,"hotkeys":{"libobs.mute":[],"libobs.push-to-mute":[],"libobs.push-to-talk":[],"libobs.unmute":[]},"id":"pulse_input_capture","mixers":255,"monitoring_type":0,"muted":false,"name":"Mic/Aux","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"device_id":"alsa_input.usb-audio-technica_AT2020USB_-00.analog-stereo"},"sync":0,"versioned_id":"pulse_input_capture","volume":1.0},"DesktopAudioDevice1":{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"filters":[{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{},"id":"compressor_filter","mixers":255,"monitoring_type":0,"muted":false,"name":"Compressor","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"attack_time":22,"ratio":3.0,"release_time":748,"sidechain_source":"Mic/Aux","threshold":-44.100000000000001},"sync":0,"versioned_id":"compressor_filter","volume":1.0}],"flags":0,"hotkeys":{"libobs.mute":[],"libobs.push-to-mute":[],"libobs.push-to-talk":[],"libobs.unmute":[]},"id":"pulse_output_capture","mixers":255,"monitoring_type":0,"muted":false,"name":"Desktop Audio","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"device_id":"alsa_output.pci-0000_00_1f.3.analog-stereo.monitor"},"sync":0,"versioned_id":"pulse_output_capture","volume":1.0},"current_program_scene":"Gaming","current_scene":"Gaming","current_transition":"Cut","groups":[],"modules":{"auto-scene-switcher":{"active":false,"interval":300,"non_matching_scene":"","switch_if_not_matching":false,"switches":[]},"decklink_captions":{"source":""},"output-timer":{"autoStartRecordTimer":false,"autoStartStreamTimer":false,"pauseRecordTimer":false,"recordTimerHours":0,"recordTimerMinutes":0,"recordTimerSeconds":0,"streamTimerHours":0,"streamTimerMinutes":0,"streamTimerSeconds":0},"scripts-tool":[]},"name":"ifohancroft","preview_locked":false,"quick_transitions":[{"duration":300,"fade_to_black":false,"hotkeys":[],"id":1,"name":"Cut"},{"duration":300,"fade_to_black":false,"hotkeys":[],"id":2,"name":"Fade"},{"duration":300,"fade_to_black":true,"hotkeys":[],"id":3,"name":"Fade"}],"saved_projectors":[],"scaling_enabled":false,"scaling_level":0,"scaling_off_x":0.0,"scaling_off_y":0.0,"scene_order":[{"name":"Gaming"},{"name":"Console Gaming"},{"name":"Screen"},{"name":"Tech"}],"sources":[{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{},"id":"xshm_input","mixers":0,"monitoring_type":0,"muted":false,"name":"Capture Card","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{},"sync":0,"versioned_id":"xshm_input","volume":1.0},{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{"OBSBasic.SelectScene":[],"libobs.hide_scene_item.Capture Card":[],"libobs.hide_scene_item.Facecam":[],"libobs.hide_scene_item.Notifications":[],"libobs.show_scene_item.Capture Card":[],"libobs.show_scene_item.Facecam":[],"libobs.show_scene_item.Notifications":[]},"id":"scene","mixers":0,"monitoring_type":0,"muted":false,"name":"Console Gaming","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"custom_size":false,"id_counter":4,"items":[{"align":5,"bounds":{"x":0.0,"y":0.0},"bounds_align":0,"bounds_type":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"crop_top":0,"group_item_backup":false,"hide_transition":{"duration":0},"id":3,"locked":true,"name":"Capture Card","pos":{"x":0.0,"y":0.0},"private_settings":{},"rot":0.0,"scale":{"x":1.0,"y":1.0},"scale_filter":"disable","show_transition":{"duration":0},"visible":true},{"align":5,"bounds":{"x":1.0,"y":1.0},"bounds_align":0,"bounds_type":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"crop_top":0,"group_item_backup":false,"hide_transition":{"duration":0},"id":4,"locked":true,"name":"Facecam","pos":{"x":1440.0,"y":0.0},"private_settings":{},"rot":0.0,"scale":{"x":0.25,"y":0.25},"scale_filter":"disable","show_transition":{"duration":0},"visible":true},{"align":5,"bounds":{"x":0.0,"y":0.0},"bounds_align":0,"bounds_type":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"crop_top":0,"group_item_backup":false,"hide_transition":{"duration":0},"id":1,"locked":true,"name":"Notifications","pos":{"x":0.0,"y":0.0},"private_settings":{},"rot":0.0,"scale":{"x":1.0,"y":1.0},"scale_filter":"disable","show_transition":{"duration":0},"visible":true}]},"sync":0,"versioned_id":"scene","volume":1.0},{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{},"id":"v4l2_input","mixers":0,"monitoring_type":0,"muted":false,"name":"Facecam","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"Backlight Compensation":0,"Brightness":128,"Contrast":128,"Exposure (Absolute)":3,"Exposure, Auto":1,"Exposure, Auto Priority":false,"Focus (absolute)":0,"Focus, Auto":false,"Gain":0,"Pan (Absolute)":0,"Power Line Frequency":1,"Saturation":128,"Sharpness":128,"Tilt (Absolute)":0,"White Balance Temperature":4500,"White Balance Temperature, Auto":false,"Zoom, Absolute":100,"auto_reset":false,"buffering":false,"color_range":1,"device_id":"/dev/video0","dv_timing":-1,"framerate":65566,"input":0,"pixelformat":842094169,"resolution":125830200,"standard":-1,"timeout_frames":5},"sync":0,"versioned_id":"v4l2_input","volume":1.0},{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{"OBSBasic.SelectScene":[],"libobs.hide_scene_item.Facecam":[],"libobs.hide_scene_item.Notifications":[],"libobs.hide_scene_item.Overhead Cam":[],"libobs.show_scene_item.Facecam":[],"libobs.show_scene_item.Notifications":[],"libobs.show_scene_item.Overhead Cam":[]},"id":"scene","mixers":0,"monitoring_type":0,"muted":false,"name":"Tech","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"custom_size":false,"id_counter":4,"items":[{"align":5,"bounds":{"x":1.0,"y":1.0},"bounds_align":0,"bounds_type":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"crop_top":0,"group_item_backup":false,"hide_transition":{"duration":0},"id":2,"locked":true,"name":"Overhead Cam","pos":{"x":0.0,"y":0.0},"private_settings":{},"rot":0.0,"scale":{"x":1.5,"y":1.5},"scale_filter":"disable","show_transition":{"duration":0},"visible":true},{"align":5,"bounds":{"x":1.0,"y":1.0},"bounds_align":0,"bounds_type":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"crop_top":0,"group_item_backup":false,"hide_transition":{"duration":0},"id":3,"locked":true,"name":"Facecam","pos":{"x":1440.0,"y":0.0},"private_settings":{},"rot":0.0,"scale":{"x":0.25,"y":0.25},"scale_filter":"disable","show_transition":{"duration":0},"visible":true},{"align":5,"bounds":{"x":0.0,"y":0.0},"bounds_align":0,"bounds_type":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"crop_top":0,"group_item_backup":false,"hide_transition":{"duration":0},"id":1,"locked":true,"name":"Notifications","pos":{"x":0.0,"y":0.0},"private_settings":{},"rot":0.0,"scale":{"x":1.0,"y":1.0},"scale_filter":"disable","show_transition":{"duration":0},"visible":true}]},"sync":0,"versioned_id":"scene","volume":1.0},{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{},"id":"v4l2_input","mixers":0,"monitoring_type":0,"muted":false,"name":"Overhead Cam","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"Backlight Compensation":0,"Brightness":128,"Contrast":128,"Exposure (Absolute)":3,"Exposure, Auto":1,"Exposure, Auto Priority":false,"Focus (absolute)":0,"Focus, Auto":false,"Gain":0,"Pan (Absolute)":0,"Power Line Frequency":1,"Saturation":128,"Sharpness":128,"Tilt (Absolute)":0,"White Balance Temperature":4500,"White Balance Temperature, Auto":false,"Zoom, Absolute":100,"auto_reset":false,"buffering":false,"color_range":1,"device_id":"/dev/video2","dv_timing":-1,"framerate":65566,"input":0,"pixelformat":842093913,"resolution":125830200,"standard":-1,"timeout_frames":5},"sync":0,"versioned_id":"v4l2_input","volume":1.0},{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{"libobs.mute":[],"libobs.push-to-mute":[],"libobs.push-to-talk":[],"libobs.unmute":[]},"id":"browser_source","mixers":255,"monitoring_type":0,"muted":false,"name":"Notifications","prev_ver":452984833,"private_settings":{"mixer_hidden":false},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"css":"body { background-color: rgba(0, 0, 0, 0); margin: 0px auto; overflow: hidden; }","fps":60,"fps_custom":true,"height":1080,"reroute_audio":false,"restart_when_active":false,"shutdown":false,"url":"https://streamlabs.com/alert-box/v3/E04F7CA9EFF66BB09395","width":1920},"sync":0,"versioned_id":"browser_source","volume":1.0},{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{},"id":"xshm_input","mixers":0,"monitoring_type":0,"muted":false,"name":"Desktop","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"advanced":false,"cut_bot":0,"cut_left":0,"cut_right":0,"cut_top":0,"screen":0,"show_cursor":true},"sync":0,"versioned_id":"xshm_input","volume":1.0},{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{},"id":"xcomposite_input","mixers":0,"monitoring_type":0,"muted":false,"name":"Game Capture","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"capture_window":"52428807\r\nMutt with 251 messages\r\ntermite","cut_bot":0,"cut_left":0,"cut_right":0,"cut_top":0,"exclude_alpha":false,"include_border":false,"lock_x":false,"show_cursor":true,"swap_redblue":false},"sync":0,"versioned_id":"xcomposite_input","volume":1.0},{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{"OBSBasic.SelectScene":[],"libobs.hide_scene_item.Facecam":[],"libobs.hide_scene_item.Game Capture":[],"libobs.hide_scene_item.Notifications":[],"libobs.show_scene_item.Facecam":[],"libobs.show_scene_item.Game Capture":[],"libobs.show_scene_item.Notifications":[]},"id":"scene","mixers":0,"monitoring_type":0,"muted":false,"name":"Gaming","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"custom_size":false,"id_counter":15,"items":[{"align":5,"bounds":{"x":0.0,"y":0.0},"bounds_align":0,"bounds_type":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"crop_top":0,"group_item_backup":false,"hide_transition":{"duration":0},"id":1,"locked":true,"name":"Game Capture","pos":{"x":0.0,"y":0.0},"private_settings":{},"rot":0.0,"scale":{"x":1.0,"y":1.0},"scale_filter":"disable","show_transition":{"duration":0},"visible":true},{"align":5,"bounds":{"x":1.0,"y":1.0},"bounds_align":0,"bounds_type":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"crop_top":0,"group_item_backup":false,"hide_transition":{"duration":0},"id":15,"locked":true,"name":"Facecam","pos":{"x":1440.0,"y":0.0},"private_settings":{},"rot":0.0,"scale":{"x":0.25,"y":0.25},"scale_filter":"disable","show_transition":{"duration":0},"visible":true},{"align":5,"bounds":{"x":0.0,"y":0.0},"bounds_align":0,"bounds_type":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"crop_top":0,"group_item_backup":false,"hide_transition":{"duration":0},"id":8,"locked":true,"name":"Notifications","pos":{"x":0.0,"y":0.0},"private_settings":{},"rot":0.0,"scale":{"x":1.0,"y":1.0},"scale_filter":"disable","show_transition":{"duration":0},"visible":true}]},"sync":0,"versioned_id":"scene","volume":1.0},{"balance":0.5,"deinterlace_field_order":0,"deinterlace_mode":0,"enabled":true,"flags":0,"hotkeys":{"OBSBasic.SelectScene":[],"libobs.hide_scene_item.Desktop":[],"libobs.hide_scene_item.Facecam":[],"libobs.hide_scene_item.Notifications":[],"libobs.show_scene_item.Desktop":[],"libobs.show_scene_item.Facecam":[],"libobs.show_scene_item.Notifications":[]},"id":"scene","mixers":0,"monitoring_type":0,"muted":false,"name":"Screen","prev_ver":452984833,"private_settings":{},"push-to-mute":false,"push-to-mute-delay":0,"push-to-talk":false,"push-to-talk-delay":0,"settings":{"custom_size":false,"id_counter":16,"items":[{"align":5,"bounds":{"x":0.0,"y":0.0},"bounds_align":0,"bounds_type":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"crop_top":0,"group_item_backup":false,"hide_transition":{"duration":0},"id":4,"locked":true,"name":"Desktop","pos":{"x":0.0,"y":0.0},"private_settings":{},"rot":0.0,"scale":{"x":1.0,"y":1.0},"scale_filter":"disable","show_transition":{"duration":0},"visible":true},{"align":5,"bounds":{"x":1.0,"y":1.0},"bounds_align":0,"bounds_type":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"crop_top":0,"group_item_backup":false,"hide_transition":{"duration":0},"id":16,"locked":true,"name":"Facecam","pos":{"x":1440.0,"y":0.0},"private_settings":{},"rot":0.0,"scale":{"x":0.25,"y":0.25},"scale_filter":"disable","show_transition":{"duration":0},"visible":true},{"align":5,"bounds":{"x":0.0,"y":0.0},"bounds_align":0,"bounds_type":0,"crop_bottom":0,"crop_left":0,"crop_right":0,"crop_top":0,"group_item_backup":false,"hide_transition":{"duration":0},"id":12,"locked":true,"name":"Notifications","pos":{"x":0.0,"y":0.0},"private_settings":{},"rot":0.0,"scale":{"x":1.0,"y":1.0},"scale_filter":"disable","show_transition":{"duration":0},"visible":true}]},"sync":0,"versioned_id":"scene","volume":1.0}],"transition_duration":500,"transitions":[]} \ No newline at end of file diff --git a/.config/obs-studio/global.ini b/.config/obs-studio/global.ini index b9177b9..0d6a563 100644 --- a/.config/obs-studio/global.ini +++ b/.config/obs-studio/global.ini @@ -4,7 +4,7 @@ Pre21Defaults=false Pre23Defaults=false Pre24.1Defaults=false FirstRun=true -LastVersion=436273154 +LastVersion=452984833 WarnedAboutClosingDocks=true [Basic] @@ -21,8 +21,8 @@ WarnBeforeStoppingRecord=false HideProjectorCursor=false ProjectorAlwaysOnTop=false SysTrayEnabled=false -geometry=AdnQywADAAAAAAAAAAAAGwAAB38AAAQ3AAABLQAAADYAAAVjAAADDwAAAAACAAAAB4AAAAAAAAAANgAAB38AAAQ3 -DockState=AAAA/wAAAAD9AAAAAwAAAAAAAAG/AAADKvwCAAAAAfsAAAAwAEUAZABpAHQAIABTAHQAcgBlAGEAbQBfAGUAeAB0AHIAYQBCAHIAbwB3AHMAZQByAgAACiAAAABYAAABvwAAAyoAAAABAAABwQAAAyr8AgAAAAL7AAAAMABTAHQAcgBlAGEAbQAgAEMAaABhAHQAXwBlAHgAdAByAGEAQgByAG8AdwBzAGUAcgIAAAyoAAAApAAAAcEAAAMq+wAAADYAUwB0AHIAZQBhAG0AIABQAHIAZQB2AGkAZQB3AF8AZQB4AHQAcgBhAEIAcgBvAHcAcwBlAHIAAAAAFgAAAyoAAAAAAAAAAAAAAAMAAAeAAAAAu/wBAAAABvsAAAAUAHMAYwBlAG4AZQBzAEQAbwBjAGsBAAAAAAAAAUwAAACgAP////sAAAAWAHMAbwB1AHIAYwBlAHMARABvAGMAawEAAAFRAAABTAAAAKAA////+wAAABIAbQBpAHgAZQByAEQAbwBjAGsBAAACogAAAjEAAADcAP////sAAAAeAHQAcgBhAG4AcwBpAHQAaQBvAG4AcwBEAG8AYwBrAQAABNgAAAFbAAAAqAD////7AAAAGABjAG8AbgB0AHIAbwBsAHMARABvAGMAawEAAAY4AAABSAAAALYA////+wAAABIAcwB0AGEAdABzAEQAbwBjAGsCAAACYgAAAbgAAAK8AAAA3wAAB4AAAAMsAAAABAAAAAQAAAAIAAAACPwAAAAA +geometry=AdnQywADAAAAAAeAAAAAGwAADv8AAAQ3AAAHgQAAADYAAAu3AAADDwAAAAECAAAAB4AAAAeAAAAANgAADv8AAAQ3 +DockState=AAAA/wAAAAD9AAAABAAAAAAAAAG/AAADLPwCAAAAAfsAAAAwAEUAZABpAHQAIABTAHQAcgBlAGEAbQBfAGUAeAB0AHIAYQBCAHIAbwB3AHMAZQByAgAABWkAAAB8AAABvwAAAywAAAABAAABwQAAAyz8AgAAAAH7AAAANgBTAHQAcgBlAGEAbQAgAFAAcgBlAHYAaQBlAHcAXwBlAHgAdAByAGEAQgByAG8AdwBzAGUAcgAAAAAWAAADKgAAAAAAAAAAAAAAAgAAB4AAAABQ/AEAAAAB+wAAADAAUwB0AHIAZQBhAG0AIABDAGgAYQB0AF8AZQB4AHQAcgBhAEIAcgBvAHcAcwBlAHICAAAAWwAAAIkAAAJDAAACnQAAAAMAAAeAAAABO/wBAAAABvsAAAAUAHMAYwBlAG4AZQBzAEQAbwBjAGsBAAAAAAAAAUoAAACgAP////sAAAAWAHMAbwB1AHIAYwBlAHMARABvAGMAawEAAAFPAAABTAAAAKAA////+wAAABIAbQBpAHgAZQByAEQAbwBjAGsBAAACoAAAAjAAAADcAP////sAAAAeAHQAcgBhAG4AcwBpAHQAaQBvAG4AcwBEAG8AYwBrAQAABNUAAAFfAAAAmgD////7AAAAGABjAG8AbgB0AHIAbwBsAHMARABvAGMAawEAAAY5AAABRwAAALYA////+wAAABIAcwB0AGEAdABzAEQAbwBjAGsCAAACYgAAAbgAAALbAAAA3wAAB4AAAAKsAAAABAAAAAQAAAAIAAAACPwAAAAA ExtraBrowserDocks=[{"title": "Edit Stream", "url": "https://dashboard.twitch.tv/popout/u/ifohancroft/stream-manager/edit-stream-info"}, {"title": "Stream Chat", "url": "https://dashboard.twitch.tv/popout/u/ifohancroft/stream-manager/chat"}] PreviewEnabled=true AlwaysOnTop=false @@ -35,6 +35,7 @@ ShowListboxToolbars=true ShowContextToolbars=false ShowStatusBar=false ShowSourceIcons=true +AdvAudioVolumeType=0 [PropertiesWindow] cx=720 @@ -49,3 +50,6 @@ cy=562 [scripts-tool] prevScriptRow=-1 + +[WebsocketAPI] +AuthSetupPrompted=true diff --git a/.config/qpdfview/qpdfview.conf b/.config/qpdfview/qpdfview.conf index dc4d33c..9fdbca2 100644 --- a/.config/qpdfview/qpdfview.conf +++ b/.config/qpdfview/qpdfview.conf @@ -19,8 +19,8 @@ prefetchDistance=1 rightToLeftMode=false rotateModifiers=33554432 rotation=0 -scaleFactor=1 -scaleMode=0 +scaleFactor=2.973255389112167 +scaleMode=1 scrollModifiers=134217728 sourceEditor= thumbnailSize=150 @@ -43,7 +43,7 @@ geometry=@ByteArray(\x1\xd9\xd0\xcb\0\x3\0\0\0\0\a\x80\0\0\0\x1b\0\0\xe\xff\0\0\ instanceNameInWindowTitle=false keepRecentlyClosed=false newTabNextToCurrentTab=true -openPath=/tmp/mozilla_ifohancroft0 +openPath=/tmp recentlyClosedCount=5 recentlyUsed=@Invalid() recentlyUsedCount=10 diff --git a/.config/quicktile.cfg b/.config/quicktile.cfg deleted file mode 100644 index 842772b..0000000 --- a/.config/quicktile.cfg +++ /dev/null @@ -1,22 +0,0 @@ -[general] -cfg_schema = 1 -ColumnCount = 3 -UseWorkarea = True -ModMask = -MovementsWrap = True - -[keys] -1 = top-right -2 = right -3 = bottom-right -4 = bottom -5 = bottom-left -6 = left -7 = top-left -8 = top -9 = middle -C = move-to-center -V = vertical-maximize -M = maximize -S = monitor-switch - diff --git a/.config/smplayer/smplayer.ini b/.config/smplayer/smplayer.ini index 9e8387a..5e5f977 100644 --- a/.config/smplayer/smplayer.ini +++ b/.config/smplayer/smplayer.ini @@ -431,7 +431,7 @@ display_remaining_time=false format_info=false frame_counter=false fullscreen_toolbar1_was_visible=true -pos=@Point(1920 27) +pos=@Point(0 27) size=@Size(1920 1026) state=2 toolbars_icon_size\controlwidget=@Size(40 40) @@ -465,7 +465,7 @@ preferred_subtitle_track=0 [directories] last_dvd_directory= -latest_dir=/home/ifohancroft/Downloads +latest_dir=/home/ifohancroft/Downloads/This.Is.Englan.2006.AC3.DvDrip.XviD-RkN/CD1 save_dirs=true [drives] @@ -547,7 +547,7 @@ wheel_function_cycle=30 wheel_function_seeking_reverse=false [history] -recents=/home/ifohancroft/Downloads/20210503_050728.mp4, /home/ifohancroft/Videos/Courses/Professional Diploma in Artificial Intelligence/Module 1/7. Preprocessing and ML models.mp4, /home/ifohancroft/Videos/Courses/Professional Diploma in Artificial Intelligence/Module 1/10. What the NET.mp4, /home/ifohancroft/Videos/Courses/Professional Diploma in Artificial Intelligence/Module 1/7. Preprocessing and ML models - Need to check if there is an update.mp4, /home/ifohancroft/Videos/2021-04-02_21-38-19.mkv, /run/media/ifohancroft/C022801B22801894/Users/ifohancroft/Downloads/The.Fate.of.the.Furious.2017.BRRip.XviD.DUAL-SlzD/The.Fate.of.the.Furious.2017.BRRip.XviD.DUAL-SlzD.avi, /home/ifohancroft/Videos/Courses/Professional Diploma in Artificial Intelligence/Module 1/6. Data and preprocessing.mp4, /home/ifohancroft/Videos/Courses/Professional Diploma in Artificial Intelligence/Module 1/4. AI Explainability.mp4, /home/ifohancroft/Videos/Courses/Professional Diploma in Artificial Intelligence/Module 1/3. Neuroscience & Neural Networks.mp4, /home/ifohancroft/Videos/Courses/Professional Diploma in Artificial Intelligence/Module 1/2. Modern AI systems and Applications.mp4 +recents=/home/ifohancroft/Downloads/This.Is.Englan.2006.AC3.DvDrip.XviD-RkN/CD1/rkn-t.i.e.cd1.avi, /home/ifohancroft/Downloads/Hackers.mkv, /home/ifohancroft/Videos/2021-07-25_22-56-18.mkv, /home/ifohancroft/Videos/2021-07-20_18-30-27.mkv, /home/ifohancroft/Videos/2021-07-18_08-24-07.mkv, /home/ifohancroft/Videos/2021-07-18_08-23-27.mkv, /home/ifohancroft/Videos/2021-07-18_08-21-10.mkv, /home/ifohancroft/Videos/2021-07-18_08-19-45.mkv, /home/ifohancroft/Videos/2021-07-18_08-00-46.mkv, /home/ifohancroft/Videos/2021-07-18_07-58-14.mkv recents\max_items=10 urls=@Invalid() urls\max_items=50 @@ -602,7 +602,7 @@ use_proxy=false username= [reminder] -count=42 +count=45 [streaming] streaming\youtube\override_format= diff --git a/.config/termite/config b/.config/termite/config index d41e26b..75e14e8 100644 --- a/.config/termite/config +++ b/.config/termite/config @@ -44,7 +44,8 @@ scrollback_lines = -1 #cursor = #6400a4 #cursor_foreground = #dcdccc -foreground = #666699 +#foreground = #666699 +foreground = #EEEEEC #foreground_bold = #ffffff #background = #3f3f3f @@ -55,25 +56,25 @@ background = rgba(0, 0, 0, 0.9) #highlight = #2f2f2f # Colors from color0 to color254 can be set -color0 = #333366 -color1 = #6666cc -color2 = #0099cc -color3 = #3366cc -color4 = #006699 -color5 = #0066ff -color6 = #669999 -color7 = #99cccc -color8 = #333399 -color9 = #9999ff -color10 = #00ccff -color11 = #6699ff -color12 = #0099cc -color13 = #0099ff -color14 = #66cccc -color15 = #ccffff -color16 = #000000 -color17 = #666699 -color18 = #6400a4 +#color0 = #333366 +#color1 = #6666cc +#color2 = #0099cc +#color3 = #3366cc +#color4 = #006699 +#color5 = #0066ff +#color6 = #669999 +#color7 = #99cccc +#color8 = #333399 +#color9 = #9999ff +#color10 = #00ccff +#color11 = #6699ff +#color12 = #0099cc +#color13 = #0099ff +#color14 = #66cccc +#color15 = #ccffff +#color16 = #000000 +#color17 = #666699 +#color18 = #6400a4 [hints] #font = Monospace 12 diff --git a/.config/viewnior/viewnior.conf b/.config/viewnior/viewnior.conf index 26d2a67..db27eff 100644 --- a/.config/viewnior/viewnior.conf +++ b/.config/viewnior/viewnior.conf @@ -8,7 +8,7 @@ reload-on-save=false show-menu-bar=true show-toolbar=true show-scrollbar=true -start-maximized=false +start-maximized=true slideshow-timeout=5 auto-resize=false behavior-wheel=1 diff --git a/.config/weechat/alias.conf b/.config/weechat/alias.conf new file mode 100644 index 0000000..5e970c2 --- /dev/null +++ b/.config/weechat/alias.conf @@ -0,0 +1,50 @@ +# +# weechat -- alias.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[cmd] +AAWAY = "allserv /away" +ANICK = "allserv /nick" +BEEP = "print -beep" +BYE = "quit" +C = "buffer clear" +CHAT = "dcc chat" +CL = "buffer clear" +clear = "buffer clear" +clearall = "buffer clear -all" +CLOSE = "buffer close" +EXIT = "quit" +hop = "part;join" +IG = "ignore" +J = "join" +K = "kick" +KB = "kickban" +LEAVE = "part" +M = "msg" +MSGBUF = "command -buffer $1 * /input send $2-" +MUB = "unban *" +N = "names" +Q = "query" +REDRAW = "window refresh" +SAY = "msg *" +SIGNOFF = "quit" +T = "topic" +UB = "unban" +UMODE = "mode $nick" +V = "command core version" +W = "who" +WC = "window close" +WI = "whois" +WII = "whois $1 $1" +WM = "window merge" +WW = "whowas" + +[completion] +MSGBUF = "%(buffers_plugins_names)" diff --git a/.config/weechat/buflist.conf b/.config/weechat/buflist.conf new file mode 100644 index 0000000..3651cdd --- /dev/null +++ b/.config/weechat/buflist.conf @@ -0,0 +1,41 @@ +# +# weechat -- buflist.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +add_newline = on +auto_scroll = 50 +display_conditions = "${buffer.hidden}==0" +enabled = on +mouse_jump_visited_buffer = off +mouse_move_buffer = on +mouse_wheel = on +nick_prefix = off +nick_prefix_empty = on +signals_refresh = "" +sort = "number,-active" +use_items = 1 + +[format] +buffer = "${format_number}${indent}${format_nick_prefix}${color_hotlist}${format_name}" +buffer_current = "${color:,blue}${format_buffer}" +hotlist = " ${color:green}(${hotlist}${color:green})" +hotlist_highlight = "${color:magenta}" +hotlist_low = "${color:white}" +hotlist_message = "${color:brown}" +hotlist_none = "${color:default}" +hotlist_private = "${color:green}" +hotlist_separator = "${color:default}," +indent = " " +lag = " ${color:green}[${color:brown}${lag}${color:green}]" +name = "${name}" +nick_prefix = "${color_nick_prefix}${nick_prefix}" +number = "${color:green}${number}${if:${number_displayed}?.: }" +tls_version = " ${color:default}(${if:${tls_version}==TLS1.3?${color:green}:${if:${tls_version}==TLS1.2?${color:yellow}:${color:red}}}${translate:${tls_version}}${color:default})" diff --git a/.config/weechat/charset.conf b/.config/weechat/charset.conf new file mode 100644 index 0000000..3fed54d --- /dev/null +++ b/.config/weechat/charset.conf @@ -0,0 +1,18 @@ +# +# weechat -- charset.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[default] +decode = "iso-8859-1" +encode = "" + +[decode] + +[encode] diff --git a/.config/weechat/exec.conf b/.config/weechat/exec.conf new file mode 100644 index 0000000..b3c0ee0 --- /dev/null +++ b/.config/weechat/exec.conf @@ -0,0 +1,19 @@ +# +# weechat -- exec.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[command] +default_options = "" +purge_delay = 0 +shell = "${env:SHELL}" + +[color] +flag_finished = lightred +flag_running = lightgreen diff --git a/.config/weechat/fifo.conf b/.config/weechat/fifo.conf new file mode 100644 index 0000000..80dd530 --- /dev/null +++ b/.config/weechat/fifo.conf @@ -0,0 +1,14 @@ +# +# weechat -- fifo.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[file] +enabled = on +path = "${weechat_runtime_dir}/weechat_fifo_${info:pid}" diff --git a/.config/weechat/fset.conf b/.config/weechat/fset.conf new file mode 100644 index 0000000..3d7a814 --- /dev/null +++ b/.config/weechat/fset.conf @@ -0,0 +1,96 @@ +# +# weechat -- fset.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +auto_refresh = "*" +auto_unmark = off +condition_catch_set = "${count} >= 1" +export_help_default = on +format_number = 1 +marked_string = "*" +scroll_horizontal = 10 +show_plugins_desc = off +sort = "~name" +unmarked_string = " " +use_color_value = off +use_keys = on +use_mute = off + +[format] +export_help = "# ${description2}" +export_option = "/set ${name} ${quoted_value}" +export_option_null = "/unset ${name}" +option1 = "" +option2 = "${marked} ${name} ${type} ${value2}${newline} ${empty_name} ${_default_value}${color:darkgray} -- ${min}..${max}${newline} ${empty_name} ${description}" + +[color] +default_value = default +default_value_selected = white +description = default +description_selected = white +file = default +file_changed = brown +file_changed_selected = yellow +file_selected = white +help_default_value = white +help_description = default +help_name = white +help_quotes = darkgray +help_values = default +index = cyan +index_selected = lightcyan +line_marked_bg1 = default +line_marked_bg2 = default +line_selected_bg1 = blue +line_selected_bg2 = red +marked = brown +marked_selected = yellow +max = default +max_selected = white +min = default +min_selected = white +name = default +name_changed = brown +name_changed_selected = yellow +name_selected = white +option = default +option_changed = brown +option_changed_selected = yellow +option_selected = white +parent_name = default +parent_name_selected = white +parent_value = cyan +parent_value_selected = lightcyan +quotes = darkgray +quotes_changed = default +quotes_changed_selected = white +quotes_selected = default +section = default +section_changed = brown +section_changed_selected = yellow +section_selected = white +string_values = default +string_values_selected = white +title_count_options = cyan +title_current_option = lightcyan +title_filter = yellow +title_marked_options = lightgreen +title_sort = white +type = green +type_selected = lightgreen +unmarked = default +unmarked_selected = white +value = cyan +value_changed = brown +value_changed_selected = yellow +value_selected = lightcyan +value_undef = magenta +value_undef_selected = lightmagenta diff --git a/.config/weechat/guile.conf b/.config/weechat/guile.conf new file mode 100644 index 0000000..5d4c3a4 --- /dev/null +++ b/.config/weechat/guile.conf @@ -0,0 +1,14 @@ +# +# weechat -- guile.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +check_license = off +eval_keep_context = on diff --git a/.config/weechat/irc.conf b/.config/weechat/irc.conf new file mode 100644 index 0000000..40dd615 --- /dev/null +++ b/.config/weechat/irc.conf @@ -0,0 +1,257 @@ +# +# weechat -- irc.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +buffer_open_before_autojoin = on +buffer_open_before_join = off +buffer_switch_autojoin = on +buffer_switch_join = on +color_nicks_in_names = off +color_nicks_in_nicklist = off +color_nicks_in_server_messages = on +color_pv_nick_like_channel = on +ctcp_time_format = "%a, %d %b %Y %T %z" +display_account_message = on +display_away = local +display_ctcp_blocked = on +display_ctcp_reply = on +display_ctcp_unknown = on +display_extended_join = on +display_host_join = on +display_host_join_local = on +display_host_quit = on +display_join_message = "332,333,366" +display_old_topic = on +display_pv_away_once = on +display_pv_back = on +display_pv_warning_address = off +highlight_channel = "$nick" +highlight_pv = "$nick" +highlight_server = "$nick" +highlight_tags_restrict = "irc_privmsg,irc_notice" +item_channel_modes_hide_args = "k" +item_display_server = buffer_plugin +item_nick_modes = on +item_nick_prefix = on +join_auto_add_chantype = off +msgbuffer_fallback = current +new_channel_position = near_server +new_pv_position = near_server +nick_completion_smart = speakers +nick_mode = prefix +nick_mode_empty = off +nicks_hide_password = "nickserv" +notice_as_pv = auto +notice_welcome_redirect = on +notice_welcome_tags = "" +notify_tags_ison = "notify_message" +notify_tags_whois = "notify_message" +part_closes_buffer = off +pv_buffer = independent +pv_tags = "notify_private" +raw_messages = 256 +server_buffer = independent +smart_filter = on +smart_filter_account = on +smart_filter_chghost = on +smart_filter_delay = 5 +smart_filter_join = on +smart_filter_join_unmask = 30 +smart_filter_mode = "+" +smart_filter_nick = on +smart_filter_quit = on +temporary_servers = off +topic_strip_colors = off +typing_status_nicks = off +typing_status_self = off + +[color] +input_nick = lightcyan +item_channel_modes = default +item_lag_counting = default +item_lag_finished = yellow +item_nick_modes = default +item_tls_version_deprecated = yellow +item_tls_version_insecure = red +item_tls_version_ok = green +message_account = cyan +message_chghost = brown +message_join = green +message_kick = red +message_quit = red +mirc_remap = "1,-1:darkgray" +nick_prefixes = "y:lightred;q:lightred;a:lightcyan;o:lightgreen;h:lightmagenta;v:yellow;*:lightblue" +notice = green +reason_kick = default +reason_quit = default +topic_current = default +topic_new = white +topic_old = default + +[network] +autoreconnect_delay_growing = 2 +autoreconnect_delay_max = 600 +ban_mask_default = "*!$ident@$host" +colors_receive = on +colors_send = on +lag_check = 60 +lag_max = 1800 +lag_min_show = 500 +lag_reconnect = 300 +lag_refresh_interval = 1 +notify_check_ison = 1 +notify_check_whois = 5 +sasl_fail_unavailable = on +send_unknown_commands = off +whois_double_nick = off + +[msgbuffer] +notice = current + +[ctcp] + +[ignore] + +[server_default] +addresses = "" +anti_flood_prio_high = 2 +anti_flood_prio_low = 2 +autoconnect = off +autojoin = "" +autoreconnect = on +autoreconnect_delay = 10 +autorejoin = off +autorejoin_delay = 30 +away_check = 0 +away_check_max_nicks = 25 +capabilities = "*" +charset_message = message +command = "" +command_delay = 0 +connection_timeout = 60 +default_chantypes = "#&" +ipv6 = on +local_hostname = "" +msg_kick = "" +msg_part = "WeeChat ${info:version}" +msg_quit = "WeeChat ${info:version}" +nicks = "ifohancroft,ifo,hancroft" +nicks_alternate = on +notify = "" +password = "" +proxy = "" +realname = "IFo Hancroft" +sasl_fail = reconnect +sasl_key = "" +sasl_mechanism = plain +sasl_password = "" +sasl_timeout = 15 +sasl_username = "" +split_msg_max_length = 512 +ssl = on +ssl_cert = "" +ssl_dhkey_size = 2048 +ssl_fingerprint = "" +ssl_password = "" +ssl_priorities = "NORMAL:-VERS-SSL3.0" +ssl_verify = on +usermode = "" +username = "" + +[server] +libera.addresses = "irc.libera.chat/6697" +libera.proxy +libera.ipv6 +libera.ssl +libera.ssl_cert +libera.ssl_password +libera.ssl_priorities +libera.ssl_dhkey_size +libera.ssl_fingerprint +libera.ssl_verify +libera.password +libera.capabilities +libera.sasl_mechanism +libera.sasl_username +libera.sasl_password +libera.sasl_key +libera.sasl_timeout +libera.sasl_fail +libera.autoconnect +libera.autoreconnect +libera.autoreconnect_delay +libera.nicks +libera.nicks_alternate +libera.username +libera.realname +libera.local_hostname +libera.usermode +libera.command +libera.command_delay +libera.autojoin +libera.autorejoin +libera.autorejoin_delay +libera.connection_timeout +libera.anti_flood_prio_high +libera.anti_flood_prio_low +libera.away_check +libera.away_check_max_nicks +libera.msg_kick +libera.msg_part +libera.msg_quit +libera.notify +libera.split_msg_max_length +libera.charset_message +libera.default_chantypes +OSS.addresses = "ossnext.trueinstruments.com/1337" +OSS.proxy +OSS.ipv6 +OSS.ssl +OSS.ssl_cert +OSS.ssl_password +OSS.ssl_priorities +OSS.ssl_dhkey_size +OSS.ssl_fingerprint +OSS.ssl_verify = off +OSS.password = "${sec.data.OSS}" +OSS.capabilities = "znc.in/self-message" +OSS.sasl_mechanism +OSS.sasl_username +OSS.sasl_password +OSS.sasl_key +OSS.sasl_timeout +OSS.sasl_fail +OSS.autoconnect +OSS.autoreconnect +OSS.autoreconnect_delay +OSS.nicks +OSS.nicks_alternate +OSS.username = "ifohancroft" +OSS.realname +OSS.local_hostname +OSS.usermode +OSS.command +OSS.command_delay +OSS.autojoin +OSS.autorejoin +OSS.autorejoin_delay +OSS.connection_timeout +OSS.anti_flood_prio_high +OSS.anti_flood_prio_low +OSS.away_check +OSS.away_check_max_nicks +OSS.msg_kick +OSS.msg_part +OSS.msg_quit +OSS.notify +OSS.split_msg_max_length +OSS.charset_message +OSS.default_chantypes diff --git a/.config/weechat/logger.conf b/.config/weechat/logger.conf new file mode 100644 index 0000000..1c21d65 --- /dev/null +++ b/.config/weechat/logger.conf @@ -0,0 +1,36 @@ +# +# weechat -- logger.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +backlog = 20 +backlog_conditions = "" + +[color] +backlog_end = default +backlog_line = default + +[file] +auto_log = on +color_lines = off +flush_delay = 120 +fsync = off +info_lines = off +mask = "$plugin.$name.weechatlog" +name_lower_case = on +nick_prefix = "" +nick_suffix = "" +path = "${weechat_data_dir}/logs" +replacement_char = "_" +time_format = "%Y-%m-%d %H:%M:%S" + +[level] + +[mask] diff --git a/.config/weechat/lua.conf b/.config/weechat/lua.conf new file mode 100644 index 0000000..6b41572 --- /dev/null +++ b/.config/weechat/lua.conf @@ -0,0 +1,14 @@ +# +# weechat -- lua.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +check_license = off +eval_keep_context = on diff --git a/.config/weechat/perl.conf b/.config/weechat/perl.conf new file mode 100644 index 0000000..21ccaf8 --- /dev/null +++ b/.config/weechat/perl.conf @@ -0,0 +1,14 @@ +# +# weechat -- perl.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +check_license = off +eval_keep_context = on diff --git a/.config/weechat/plugins.conf b/.config/weechat/plugins.conf new file mode 100644 index 0000000..065ed0e --- /dev/null +++ b/.config/weechat/plugins.conf @@ -0,0 +1,68 @@ +# +# weechat -- plugins.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[var] +python.title.current_buffer_prefix = "" +python.title.current_buffer_suffix = "" +python.title.hotlist_buffer_prefix = "" +python.title.hotlist_buffer_suffix = "" +python.title.hotlist_number_prefix = "" +python.title.hotlist_number_suffix = "" +python.title.hotlist_separator = "" +python.title.short_name = "" +python.title.show_hotlist = "" +python.title.title_prefix = "[WeeChat ${info:version}] " +python.title.title_priority = "" +python.title.title_suffix = "" +python.vimode.copy_clipboard_cmd = "xclip -selection c" +python.vimode.imap_esc = "" +python.vimode.imap_esc_timeout = "1000" +python.vimode.line_number_prefix = "" +python.vimode.line_number_suffix = " " +python.vimode.mode_indicator_cmd_color = "white" +python.vimode.mode_indicator_cmd_color_bg = "cyan" +python.vimode.mode_indicator_insert_color = "white" +python.vimode.mode_indicator_insert_color_bg = "blue" +python.vimode.mode_indicator_normal_color = "white" +python.vimode.mode_indicator_normal_color_bg = "gray" +python.vimode.mode_indicator_prefix = "" +python.vimode.mode_indicator_replace_color = "white" +python.vimode.mode_indicator_replace_color_bg = "red" +python.vimode.mode_indicator_search_color = "white" +python.vimode.mode_indicator_search_color_bg = "magenta" +python.vimode.mode_indicator_suffix = "" +python.vimode.no_warn = "off" +python.vimode.paste_clipboard_cmd = "xclip -selection c -o" +python.vimode.search_vim = "on" +python.vimode.user_mappings = "" + +[desc] +python.vimode.copy_clipboard_cmd = "command used to copy to clipboard; must read input from stdin (default: "xclip -selection c")" +python.vimode.imap_esc = "use alternate mapping to enter Normal mode while in Insert mode; having it set to 'jk' is similar to `:imap jk ` in vim (default: "")" +python.vimode.imap_esc_timeout = "time in ms to wait for the imap_esc sequence to complete (default: "1000")" +python.vimode.line_number_prefix = "prefix for line numbers (default: "")" +python.vimode.line_number_suffix = "suffix for line numbers (default: " ")" +python.vimode.mode_indicator_cmd_color = "color for mode indicator in Command mode (default: "white")" +python.vimode.mode_indicator_cmd_color_bg = "background color for mode indicator in Command mode (default: "cyan")" +python.vimode.mode_indicator_insert_color = "color for mode indicator in Insert mode (default: "white")" +python.vimode.mode_indicator_insert_color_bg = "background color for mode indicator in Insert mode (default: "blue")" +python.vimode.mode_indicator_normal_color = "color for mode indicator in Normal mode (default: "white")" +python.vimode.mode_indicator_normal_color_bg = "background color for mode indicator in Normal mode (default: "gray")" +python.vimode.mode_indicator_prefix = "prefix for the bar item mode_indicator (default: "")" +python.vimode.mode_indicator_replace_color = "color for mode indicator in Replace mode (default: "white")" +python.vimode.mode_indicator_replace_color_bg = "background color for mode indicator in Replace mode (default: "red")" +python.vimode.mode_indicator_search_color = "color for mode indicator in Search mode (default: "white")" +python.vimode.mode_indicator_search_color_bg = "background color for mode indicator in Search mode (default: "magenta")" +python.vimode.mode_indicator_suffix = "suffix for the bar item mode_indicator (default: "")" +python.vimode.no_warn = "don't warn about problematic keybindings and tmux/screen (default: "off")" +python.vimode.paste_clipboard_cmd = "command used to paste clipboard; must output content to stdout (default: "xclip -selection c -o")" +python.vimode.search_vim = "allow n/N usage after searching (requires an extra to return to normal mode) (default: "off")" +python.vimode.user_mappings = "see the `:nmap` command in the README for more info; please do not modify this field manually unless you know what you're doing (default: "")" diff --git a/.config/weechat/python.conf b/.config/weechat/python.conf new file mode 100644 index 0000000..febee01 --- /dev/null +++ b/.config/weechat/python.conf @@ -0,0 +1,14 @@ +# +# weechat -- python.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +check_license = off +eval_keep_context = on diff --git a/.config/weechat/relay.conf b/.config/weechat/relay.conf new file mode 100644 index 0000000..9c632cd --- /dev/null +++ b/.config/weechat/relay.conf @@ -0,0 +1,59 @@ +# +# weechat -- relay.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +auto_open_buffer = on +raw_messages = 256 + +[color] +client = cyan +status_active = green +status_auth_failed = lightmagenta +status_connecting = white +status_disconnected = lightred +status_waiting_auth = yellow +text = default +text_bg = default +text_selected = white + +[network] +allow_empty_password = off +allowed_ips = "" +auth_timeout = 60 +bind_address = "" +clients_purge_delay = 0 +compression_level = 6 +ipv6 = on +max_clients = 5 +nonce_size = 16 +password = "" +password_hash_algo = "*" +password_hash_iterations = 100000 +ssl_cert_key = "${weechat_config_dir}/ssl/relay.pem" +ssl_priorities = "NORMAL:-VERS-SSL3.0" +totp_secret = "" +totp_window = 0 +websocket_allowed_origins = "" + +[irc] +backlog_max_minutes = 0 +backlog_max_number = 1024 +backlog_since_last_disconnect = on +backlog_since_last_message = off +backlog_tags = "irc_privmsg" +backlog_time_format = "[%H:%M] " + +[weechat] +commands = "" + +[port] + +[path] diff --git a/.config/weechat/ruby.conf b/.config/weechat/ruby.conf new file mode 100644 index 0000000..cf78cf8 --- /dev/null +++ b/.config/weechat/ruby.conf @@ -0,0 +1,14 @@ +# +# weechat -- ruby.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +check_license = off +eval_keep_context = on diff --git a/.config/weechat/script.conf b/.config/weechat/script.conf new file mode 100644 index 0000000..5d23218 --- /dev/null +++ b/.config/weechat/script.conf @@ -0,0 +1,57 @@ +# +# weechat -- script.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +columns = "%s %n %V %v %u | %d | %t" +diff_color = on +diff_command = "auto" +display_source = on +quiet_actions = on +sort = "i,p,n" +translate_description = on +use_keys = on + +[color] +status_autoloaded = cyan +status_held = white +status_installed = lightcyan +status_obsolete = lightmagenta +status_popular = yellow +status_running = lightgreen +status_unknown = lightred +text = default +text_bg = default +text_bg_selected = red +text_date = default +text_date_selected = white +text_delimiters = default +text_description = default +text_description_selected = white +text_extension = default +text_extension_selected = white +text_name = cyan +text_name_selected = lightcyan +text_selected = white +text_tags = brown +text_tags_selected = yellow +text_version = magenta +text_version_loaded = default +text_version_loaded_selected = white +text_version_selected = lightmagenta + +[scripts] +autoload = on +cache_expire = 1440 +download_enabled = on +download_timeout = 30 +hold = "" +path = "${weechat_cache_dir}/script" +url = "https://weechat.org/files/plugins.xml.gz" diff --git a/.config/weechat/spell.conf b/.config/weechat/spell.conf new file mode 100644 index 0000000..eebb2a6 --- /dev/null +++ b/.config/weechat/spell.conf @@ -0,0 +1,33 @@ +# +# weechat -- spell.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[color] +misspelled = lightred +suggestion = default +suggestion_delimiter_dict = cyan +suggestion_delimiter_word = cyan + +[check] +commands = "away,command,cycle,kick,kickban,me,msg,notice,part,query,quit,topic" +default_dict = "" +during_search = off +enabled = off +real_time = off +suggestions = -1 +word_min_length = 2 + +[dict] + +[look] +suggestion_delimiter_dict = " / " +suggestion_delimiter_word = "," + +[option] diff --git a/.config/weechat/tcl.conf b/.config/weechat/tcl.conf new file mode 100644 index 0000000..a777706 --- /dev/null +++ b/.config/weechat/tcl.conf @@ -0,0 +1,14 @@ +# +# weechat -- tcl.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +check_license = off +eval_keep_context = on diff --git a/.config/weechat/trigger.conf b/.config/weechat/trigger.conf new file mode 100644 index 0000000..0ea6e8e --- /dev/null +++ b/.config/weechat/trigger.conf @@ -0,0 +1,67 @@ +# +# weechat -- trigger.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +enabled = on +monitor_strip_colors = off + +[color] +flag_command = lightgreen +flag_conditions = yellow +flag_post_action = lightblue +flag_regex = lightcyan +flag_return_code = lightmagenta +regex = white +replace = cyan +trigger = green +trigger_disabled = red + +[trigger] +beep.arguments = "" +beep.command = "/print -beep" +beep.conditions = "${tg_displayed} && ${tg_tags} !!- ,notify_none, && (${tg_highlight} || ${tg_msg_pv})" +beep.enabled = on +beep.hook = print +beep.post_action = none +beep.regex = "" +beep.return_code = ok +cmd_pass.arguments = "5000|input_text_display;5000|history_add;5000|irc_command_auth" +cmd_pass.command = "" +cmd_pass.conditions = "" +cmd_pass.enabled = on +cmd_pass.hook = modifier +cmd_pass.post_action = none +cmd_pass.regex = "==^((/(msg|m|quote) +(-server +[^ ]+ +)?nickserv +(id|identify|set +password|ghost +[^ ]+|release +[^ ]+|regain +[^ ]+|recover +[^ ]+) +)|/oper +[^ ]+ +|/quote +pass +|/secure +(passphrase|decrypt|set +[^ ]+) +)(.*)==${re:1}${hide:*,${re:+}}" +cmd_pass.return_code = ok +cmd_pass_register.arguments = "5000|input_text_display;5000|history_add;5000|irc_command_auth" +cmd_pass_register.command = "" +cmd_pass_register.conditions = "" +cmd_pass_register.enabled = on +cmd_pass_register.hook = modifier +cmd_pass_register.post_action = none +cmd_pass_register.regex = "==^(/(msg|m|quote) +nickserv +register +)([^ ]+)(.*)==${re:1}${hide:*,${re:3}}${re:4}" +cmd_pass_register.return_code = ok +msg_auth.arguments = "5000|irc_message_auth" +msg_auth.command = "" +msg_auth.conditions = "" +msg_auth.enabled = on +msg_auth.hook = modifier +msg_auth.post_action = none +msg_auth.regex = "==^(.*(id|identify|set +password|register|ghost +[^ ]+|release +[^ ]+|regain +[^ ]+|recover +[^ ]+) +)(.*)==${re:1}${hide:*,${re:+}}" +msg_auth.return_code = ok +server_pass.arguments = "5000|input_text_display;5000|history_add" +server_pass.command = "" +server_pass.conditions = "" +server_pass.enabled = on +server_pass.hook = modifier +server_pass.post_action = none +server_pass.regex = "==^(/(server|connect) .*-(sasl_)?password=)([^ ]+)(.*)==${re:1}${hide:*,${re:4}}${re:5}" +server_pass.return_code = ok diff --git a/.config/weechat/typing.conf b/.config/weechat/typing.conf new file mode 100644 index 0000000..4236485 --- /dev/null +++ b/.config/weechat/typing.conf @@ -0,0 +1,19 @@ +# +# weechat -- typing.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +delay_purge_paused = 30 +delay_purge_typing = 6 +delay_set_paused = 10 +enabled_nicks = off +enabled_self = off +input_min_chars = 4 +item_max_length = 0 diff --git a/.config/weechat/weechat.conf b/.config/weechat/weechat.conf index 91d06ba..eaced6b 100644 --- a/.config/weechat/weechat.conf +++ b/.config/weechat/weechat.conf @@ -294,7 +294,7 @@ input.conditions = "" input.filling_left_right = vertical input.filling_top_bottom = horizontal input.hidden = off -input.items = "[input_prompt]+(away),[input_search],[input_paste],input_text" +input.items = "mode_indicator+[input_prompt]+(away),[input_search], [input_paste],input_text,[vi_buffer]" input.position = bottom input.priority = 1000 input.separator = off @@ -324,7 +324,7 @@ status.conditions = "" status.filling_left_right = vertical status.filling_top_bottom = horizontal status.hidden = off -status.items = "buffer_name+(buffer_modes)+{buffer_nicklist_count}+buffer_zoom+buffer_filter,scroll,[lag]" +status.items = "buffer_name+(buffer_modes)+{buffer_nicklist_count}+buffer_zoom+buffer_filter,scroll,[lag],completion,cmd_completion" status.position = bottom status.priority = 500 status.separator = off @@ -346,6 +346,21 @@ title.separator = off title.size = 1 title.size_max = 0 title.type = window +vi_line_numbers.color_bg = default +vi_line_numbers.color_bg_inactive = default +vi_line_numbers.color_delim = default +vi_line_numbers.color_fg = default +vi_line_numbers.conditions = "" +vi_line_numbers.filling_left_right = vertical +vi_line_numbers.filling_top_bottom = vertical +vi_line_numbers.hidden = on +vi_line_numbers.items = "line_numbers" +vi_line_numbers.position = left +vi_line_numbers.priority = 0 +vi_line_numbers.separator = off +vi_line_numbers.size = 0 +vi_line_numbers.size_max = 0 +vi_line_numbers.type = window [layout] @@ -379,6 +394,15 @@ ctrl-Sctrl-U = "/input set_unread" ctrl-T = "/input transpose_chars" ctrl-U = "/input delete_beginning_of_line" ctrl-W = "/input delete_previous_word" +ctrl-W= = "/window balance" +ctrl-Wh = "/window left" +ctrl-Wj = "/window down" +ctrl-Wk = "/window up" +ctrl-Wl = "/window right" +ctrl-Wq = "/window merge" +ctrl-Ws = "/window splith" +ctrl-Wv = "/window splitv" +ctrl-Wx = "/window swap" ctrl-X = "/input switch_active_buffer" ctrl-Y = "/input clipboard_paste" meta-ctrl-M = "/input insert \n" @@ -486,10 +510,6 @@ meta-b = "/input move_previous_word" meta-d = "/input delete_next_word" meta-f = "/input move_next_word" meta-h = "/input hotlist_clear" -meta-jmeta-f = "/buffer -" -meta-jmeta-l = "/buffer +" -meta-jmeta-r = "/server raw" -meta-jmeta-s = "/server jump" meta-j01 = "/buffer *1" meta-j02 = "/buffer *2" meta-j03 = "/buffer *3" @@ -597,18 +617,9 @@ meta-p = "/window scroll_previous_highlight" meta-r = "/input delete_line" meta-s = "/mute spell toggle" meta-u = "/window scroll_unread" -meta-wmeta-meta2-A = "/window up" -meta-wmeta-meta2-B = "/window down" -meta-wmeta-meta2-C = "/window right" -meta-wmeta-meta2-D = "/window left" -meta-wmeta2-1;3A = "/window up" -meta-wmeta2-1;3B = "/window down" -meta-wmeta2-1;3C = "/window right" -meta-wmeta2-1;3D = "/window left" -meta-wmeta-b = "/window balance" -meta-wmeta-s = "/window swap" meta-x = "/input zoom_merged_buffer" meta-z = "/window zoom" +ctrl-^ = "/input jump_last_buffer_displayed" ctrl-_ = "/input undo" [key_search] diff --git a/.config/weechat/xfer.conf b/.config/weechat/xfer.conf new file mode 100644 index 0000000..d438f70 --- /dev/null +++ b/.config/weechat/xfer.conf @@ -0,0 +1,49 @@ +# +# weechat -- xfer.conf +# +# WARNING: It is NOT recommended to edit this file by hand, +# especially if WeeChat is running. +# +# Use commands like /set or /fset to change settings in WeeChat. +# +# For more info, see: https://weechat.org/doc/quickstart +# + +[look] +auto_open_buffer = on +progress_bar_size = 20 +pv_tags = "notify_private" + +[color] +status_aborted = lightred +status_active = lightblue +status_connecting = yellow +status_done = lightgreen +status_failed = lightred +status_waiting = lightcyan +text = default +text_bg = default +text_selected = white + +[network] +blocksize = 65536 +fast_send = on +own_ip = "" +port_range = "" +send_ack = on +speed_limit_recv = 0 +speed_limit_send = 0 +timeout = 300 + +[file] +auto_accept_chats = off +auto_accept_files = off +auto_accept_nicks = "" +auto_check_crc32 = off +auto_rename = on +auto_resume = on +convert_spaces = on +download_path = "${weechat_data_dir}/xfer" +download_temporary_suffix = ".part" +upload_path = "~" +use_nick_in_filename = on diff --git a/.local/share/weechat/python/autoload/title.py b/.local/share/weechat/python/autoload/title.py new file mode 120000 index 0000000..9e8f04f --- /dev/null +++ b/.local/share/weechat/python/autoload/title.py @@ -0,0 +1 @@ +../title.py \ No newline at end of file diff --git a/.local/share/weechat/python/autoload/vimode.py b/.local/share/weechat/python/autoload/vimode.py new file mode 120000 index 0000000..c6303a5 --- /dev/null +++ b/.local/share/weechat/python/autoload/vimode.py @@ -0,0 +1 @@ +../vimode.py \ No newline at end of file diff --git a/.local/share/weechat/python/title.py b/.local/share/weechat/python/title.py new file mode 100644 index 0000000..e746c96 --- /dev/null +++ b/.local/share/weechat/python/title.py @@ -0,0 +1,123 @@ +''' Title-setter ''' +# -*- coding: utf-8 -*- +# +# Copyright (c) 2009 by xt +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# +# Set screen title +# (this script requires WeeChat 0.3.0 or newer) +# +# History: +# 2016-03-31, devkev +# version 0.9, Make hotlist optional +# 2016-05-01, Ferus +# version 0.8, Add ability to prefix and suffix the title, current +# buffer, and hotlist buffers. As well as specify hotlist separator +# 2016-02-05, ixti +# version 0.7, Add Python3 support +# 2015-06-07, t3chguy +# version 0.6, Strip Colour Codes from Title +# 2012-12-09, WakiMiko +# version 0.5, update title when switching window (for WeeChat >= 0.3.7) +# 2009-06-18, xt +# version 0.4, option to use short_name +# 2009-06-15, xt +# version 0.3, free infolist +# 2009-05-15, xt +# version 0.2: add names from hotlist to title +# 2009-05-10, xt +# version 0.1: initial release + +import weechat as w + +SCRIPT_NAME = "title" +SCRIPT_AUTHOR = "xt " +SCRIPT_VERSION = "0.9" +SCRIPT_LICENSE = "GPL3" +SCRIPT_DESC = "Set screen title to current buffer name + hotlist items with configurable priority level" + +# script options +settings = { + "title_priority" : '2', + "short_name" : 'on', + "hotlist_separator" : ':', + "title_prefix" : '[WeeChat ${info:version}] ', + "title_suffix" : '', + "hotlist_number_prefix": '', + "hotlist_number_suffix": '', + "hotlist_buffer_prefix": '', + "hotlist_buffer_suffix": '', + "current_buffer_prefix": '', + "current_buffer_suffix": '', + "show_hotlist" : 'on', +} + +hooks = ( + 'buffer_switch', + 'window_switch', + 'hotlist_*', +) + + +def update_title(data, signal, signal_data): + ''' The callback that adds title. ''' + + # prefix + title = w.config_get_plugin('title_prefix') + + # current buffer + title += w.config_get_plugin('current_buffer_prefix') + if w.config_get_plugin('short_name') == 'on': + title += w.buffer_get_string(w.current_buffer(), 'short_name') + else: + title += w.buffer_get_string(w.current_buffer(), 'name') + title += w.config_get_plugin('current_buffer_suffix') + + if w.config_get_plugin('show_hotlist') == 'on': + # hotlist buffers + hotlist = w.infolist_get('hotlist', '', '') + pnumber = w.config_get_plugin('hotlist_number_prefix') + snumber = w.config_get_plugin('hotlist_number_suffix') + pname = w.config_get_plugin('hotlist_buffer_prefix') + sname = w.config_get_plugin('hotlist_buffer_suffix') + separator = w.config_get_plugin('hotlist_separator') + while w.infolist_next(hotlist): + priority = w.infolist_integer(hotlist, 'priority') + if priority >= int(w.config_get_plugin('title_priority')): + number = w.infolist_integer(hotlist, 'buffer_number') + thebuffer = w.infolist_pointer(hotlist, 'buffer_pointer') + name = w.buffer_get_string(thebuffer, 'short_name') + title += ' {0}{1}{2}{3}{4}{5}{6}'.format(pnumber, \ + number, snumber, separator, pname, name, sname) + w.infolist_free(hotlist) + + # suffix + title += w.config_get_plugin('title_suffix') + + title = w.string_remove_color(title, '') + w.window_set_title(title) + + return w.WEECHAT_RC_OK + +if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, "", ""): + for option, default_value in settings.items(): + if not w.config_is_set_plugin(option): + w.config_set_plugin(option, default_value) + for hook in hooks: + w.hook_signal(hook, 'update_title', '') + + update_title('', '', '') diff --git a/.local/share/weechat/python/vimode.py b/.local/share/weechat/python/vimode.py new file mode 100644 index 0000000..b1e6641 --- /dev/null +++ b/.local/share/weechat/python/vimode.py @@ -0,0 +1,1884 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2013-2014 Germain Z. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# +# Add vi/vim-like modes to WeeChat. +# + + +import csv +import json +import os +import re +import subprocess +try: + from StringIO import StringIO +except ImportError: + from io import StringIO +import time + +import weechat + + +# Script info. +# ============ + +SCRIPT_NAME = "vimode" +SCRIPT_AUTHOR = "GermainZ " +SCRIPT_VERSION = "0.8.1" +SCRIPT_LICENSE = "GPL3" +SCRIPT_DESC = ("Add vi/vim-like modes and keybindings to WeeChat.") + + +# Global variables. +# ================= + +# General. +# -------- + +# Halp! Halp! Halp! +GITHUB_BASE = "https://github.com/GermainZ/weechat-vimode/blob/master/" +README_URL = GITHUB_BASE + "README.md" +FAQ_KEYBINDINGS = GITHUB_BASE + "FAQ.md#problematic-key-bindings" +FAQ_ESC = GITHUB_BASE + "FAQ.md#esc-key-not-being-detected-instantly" + +# Holds the text of the tab-completions for the command-line mode. +cmd_compl_text = "" +# Holds the original text of the command-line mode, used for completion. +cmd_text_orig = None +# Index of current suggestion, used for completion. +cmd_compl_pos = 0 +# Used for command-line mode history. +cmd_history = [] +cmd_history_index = 0 +# Used to store the content of the input line when going into COMMAND mode. +input_line_backup = {} +# Mode we're in. One of INSERT, NORMAL, REPLACE, COMMAND or SEARCH. +# SEARCH is only used if search_vim is enabled. +mode = "INSERT" +# Holds normal commands (e.g. "dd"). +vi_buffer = "" +# See `cb_key_combo_default()`. +esc_pressed = 0 +# See `cb_key_pressed()`. +last_signal_time = 0 +# See `start_catching_keys()` for more info. +catching_keys_data = {'amount': 0} +# Used for ; and , to store the last f/F/t/T motion. +last_search_motion = {'motion': None, 'data': None} +# Used for undo history. +undo_history = {} +undo_history_index = {} +# Holds mode colors (loaded from vimode_settings). +mode_colors = {} + +# Script options. +vimode_settings = { + 'no_warn': ("off", ("don't warn about problematic keybindings and " + "tmux/screen")), + 'copy_clipboard_cmd': ("xclip -selection c", + ("command used to copy to clipboard; must read " + "input from stdin")), + 'paste_clipboard_cmd': ("xclip -selection c -o", + ("command used to paste clipboard; must output " + "content to stdout")), + 'imap_esc': ("", ("use alternate mapping to enter Normal mode while in " + "Insert mode; having it set to 'jk' is similar to " + "`:imap jk ` in vim")), + 'imap_esc_timeout': ("1000", ("time in ms to wait for the imap_esc " + "sequence to complete")), + 'search_vim': ("off", ("allow n/N usage after searching (requires an extra" + " to return to normal mode)")), + 'user_mappings': ("", ("see the `:nmap` command in the README for more " + "info; please do not modify this field manually " + "unless you know what you're doing")), + 'mode_indicator_prefix': ("", "prefix for the bar item mode_indicator"), + 'mode_indicator_suffix': ("", "suffix for the bar item mode_indicator"), + 'mode_indicator_normal_color': ("white", + "color for mode indicator in Normal mode"), + 'mode_indicator_normal_color_bg': ("gray", + ("background color for mode indicator " + "in Normal mode")), + 'mode_indicator_insert_color': ("white", + "color for mode indicator in Insert mode"), + 'mode_indicator_insert_color_bg': ("blue", + ("background color for mode indicator " + "in Insert mode")), + 'mode_indicator_replace_color': ("white", + "color for mode indicator in Replace mode"), + 'mode_indicator_replace_color_bg': ("red", + ("background color for mode indicator " + "in Replace mode")), + 'mode_indicator_cmd_color': ("white", + "color for mode indicator in Command mode"), + 'mode_indicator_cmd_color_bg': ("cyan", + ("background color for mode indicator in " + "Command mode")), + 'mode_indicator_search_color': ("white", + "color for mode indicator in Search mode"), + 'mode_indicator_search_color_bg': ("magenta", + ("background color for mode indicator " + "in Search mode")), + 'line_number_prefix': ("", "prefix for line numbers"), + 'line_number_suffix': (" ", "suffix for line numbers") +} + + +# Regex patterns. +# --------------- + +WHITESPACE = re.compile(r"\s") +IS_KEYWORD = re.compile(r"[a-zA-Z0-9_@À-ÿ]") +REGEX_MOTION_LOWERCASE_W = re.compile(r"\b\S|(?<=\s)\S") +REGEX_MOTION_UPPERCASE_W = re.compile(r"(?<=\s)\S") +REGEX_MOTION_UPPERCASE_E = re.compile(r"\S(?!\S)") +REGEX_MOTION_UPPERCASE_B = REGEX_MOTION_UPPERCASE_E +REGEX_MOTION_G_UPPERCASE_E = REGEX_MOTION_UPPERCASE_W +REGEX_MOTION_CARRET = re.compile(r"\S") +REGEX_INT = r"[0-9]" +REGEX_MAP_KEYS_1 = { + re.compile("<([^>]*-)Left>", re.IGNORECASE): '<\\1\x01[[D>', + re.compile("<([^>]*-)Right>", re.IGNORECASE): '<\\1\x01[[C>', + re.compile("<([^>]*-)Up>", re.IGNORECASE): '<\\1\x01[[A>', + re.compile("<([^>]*-)Down>", re.IGNORECASE): '<\\1\x01[[B>', + re.compile("", re.IGNORECASE): '\x01[[D', + re.compile("", re.IGNORECASE): '\x01[[C', + re.compile("", re.IGNORECASE): '\x01[[A', + re.compile("", re.IGNORECASE): '\x01[[B' +} +REGEX_MAP_KEYS_2 = { + re.compile(r"]*)>", re.IGNORECASE): '\x01\\1', + re.compile(r"]*)>", re.IGNORECASE): '\x01[\\1' +} + +# Regex used to detect problematic keybindings. +# For example: meta-wmeta-s is bound by default to ``/window swap``. +# If the user pressed Esc-w, WeeChat will detect it as meta-w and will not +# send any signal to `cb_key_combo_default()` just yet, since it's the +# beginning of a known key combo. +# Instead, `cb_key_combo_default()` will receive the Esc-ws signal, which +# becomes "ws" after removing the Esc part, and won't know how to handle it. +REGEX_PROBLEMATIC_KEYBINDINGS = re.compile(r"meta-\w(meta|ctrl)") + + +# Vi commands. +# ------------ + +def cmd_nmap(args): + """Add a user-defined key mapping. + + Some (but not all) vim-like key codes are supported to simplify things for + the user: , , , , and . + + See Also: + `cmd_unmap()`. + """ + args = args.strip() + if not args: + mappings = vimode_settings['user_mappings'] + if mappings: + weechat.prnt("", "User-defined key mappings:") + for key, mapping in mappings.items(): + weechat.prnt("", "{} -> {}".format(key, mapping)) + else: + weechat.prnt("", "nmap: no mapping found.") + elif not " " in args: + weechat.prnt("", "nmap syntax -> :nmap {lhs} {rhs}") + else: + key, mapping = args.split(" ", 1) + # First pass of replacements. We perform two passes as a simple way to + # avoid incorrect replacements due to dictionaries not being + # insertion-ordered prior to Python 3.7. + for regex, repl in REGEX_MAP_KEYS_1.items(): + key = regex.sub(repl, key) + mapping = regex.sub(repl, mapping) + # Second pass of replacements. + for regex, repl in REGEX_MAP_KEYS_2.items(): + key = regex.sub(repl, key) + mapping = regex.sub(repl, mapping) + mappings = vimode_settings['user_mappings'] + mappings[key] = mapping + weechat.config_set_plugin('user_mappings', json.dumps(mappings)) + vimode_settings['user_mappings'] = mappings + +def cmd_nunmap(args): + """Remove a user-defined key mapping. + + See Also: + `cmd_map()`. + """ + args = args.strip() + if not args: + weechat.prnt("", "nunmap syntax -> :unmap {lhs}") + else: + key = args + for regex, repl in REGEX_MAP_KEYS_1.items(): + key = regex.sub(repl, key) + for regex, repl in REGEX_MAP_KEYS_2.items(): + key = regex.sub(repl, key) + mappings = vimode_settings['user_mappings'] + if key in mappings: + del mappings[key] + weechat.config_set_plugin('user_mappings', json.dumps(mappings)) + vimode_settings['user_mappings'] = mappings + else: + weechat.prnt("", "nunmap: No such mapping") + +# See Also: `cb_exec_cmd()`. +VI_COMMAND_GROUPS = {('h', 'help'): "/help", + ('qa', 'qall', 'quita', 'quitall'): "/exit", + ('q', 'quit'): "/close", + ('w', 'write'): "/save", + ('bN', 'bNext', 'bp', 'bprevious'): "/buffer -1", + ('bn', 'bnext'): "/buffer +1", + ('bd', 'bdel', 'bdelete'): "/close", + ('b#',): "/input jump_last_buffer_displayed", + ('b', 'bu', 'buf', 'buffer'): "/buffer", + ('sp', 'split'): "/window splith", + ('vs', 'vsplit'): "/window splitv", + ('nm', 'nmap'): cmd_nmap, + ('nun', 'nunmap'): cmd_nunmap} + +VI_COMMANDS = dict() +for T, v in VI_COMMAND_GROUPS.items(): + VI_COMMANDS.update(dict.fromkeys(T, v)) + + +# Vi operators. +# ------------- + +# Each operator must have a corresponding function, called "operator_X" where +# X is the operator. For example: `operator_c()`. +VI_OPERATORS = ["c", "d", "y"] + + +# Vi motions. +# ----------- + +# Vi motions. Each motion must have a corresponding function, called +# "motion_X" where X is the motion (e.g. `motion_w()`). +# See Also: `SPECIAL_CHARS`. +VI_MOTIONS = ["w", "e", "b", "^", "$", "h", "l", "W", "E", "B", "f", "F", "t", + "T", "ge", "gE", "0"] + +# Special characters for motions. The corresponding function's name is +# converted before calling. For example, "^" will call `motion_carret` instead +# of `motion_^` (which isn't allowed because of illegal characters). +SPECIAL_CHARS = {'^': "carret", + '$': "dollar"} + + +# Methods for vi operators, motions and key bindings. +# =================================================== + +# Documented base examples: +# ------------------------- + +def operator_base(buf, input_line, pos1, pos2, overwrite): + """Operator method example. + + Args: + buf (str): pointer to the current WeeChat buffer. + input_line (str): the content of the input line. + pos1 (int): the starting position of the motion. + pos2 (int): the ending position of the motion. + overwrite (bool, optional): whether the character at the cursor's new + position should be overwritten or not (for inclusive motions). + Defaults to False. + + Notes: + Should be called "operator_X", where X is the operator, and defined in + `VI_OPERATORS`. + Must perform actions (e.g. modifying the input line) on its own, + using the WeeChat API. + + See Also: + For additional examples, see `operator_d()` and + `operator_y()`. + """ + # Get start and end positions. + start = min(pos1, pos2) + end = max(pos1, pos2) + # Print the text the operator should go over. + weechat.prnt("", "Selection: %s" % input_line[start:end]) + +def motion_base(input_line, cur, count): + """Motion method example. + + Args: + input_line (str): the content of the input line. + cur (int): the position of the cursor. + count (int): the amount of times to multiply or iterate the action. + + Returns: + A tuple containing three values: + int: the new position of the cursor. + bool: True if the motion is inclusive, False otherwise. + bool: True if the motion is catching, False otherwise. + See `start_catching_keys()` for more info on catching motions. + + Notes: + Should be called "motion_X", where X is the motion, and defined in + `VI_MOTIONS`. + Must not modify the input line directly. + + See Also: + For additional examples, see `motion_w()` (normal motion) and + `motion_f()` (catching motion). + """ + # Find (relative to cur) position of next number. + pos = get_pos(input_line, REGEX_INT, cur, True, count) + # Return the new (absolute) cursor position. + # This motion is exclusive, so overwrite is False. + return cur + pos, False + +def key_base(buf, input_line, cur, count): + """Key method example. + + Args: + buf (str): pointer to the current WeeChat buffer. + input_line (str): the content of the input line. + cur (int): the position of the cursor. + count (int): the amount of times to multiply or iterate the action. + + Notes: + Should be called `key_X`, where X represents the key(s), and defined + in `VI_KEYS`. + Must perform actions on its own (using the WeeChat API). + + See Also: + For additional examples, see `key_a()` (normal key) and + `key_r()` (catching key). + """ + # Key was pressed. Go to Insert mode (similar to "i"). + set_mode("INSERT") + + +# Operators: +# ---------- + +def operator_d(buf, input_line, pos1, pos2, overwrite=False): + """Delete text from `pos1` to `pos2` from the input line. + + If `overwrite` is set to True, the character at the cursor's new position + is removed as well (the motion is inclusive). + + See Also: + `operator_base()`. + """ + start = min(pos1, pos2) + end = max(pos1, pos2) + if overwrite: + end += 1 + input_line = list(input_line) + del input_line[start:end] + input_line = "".join(input_line) + weechat.buffer_set(buf, "input", input_line) + set_cur(buf, input_line, pos1) + +def operator_c(buf, input_line, pos1, pos2, overwrite=False): + """Delete text from `pos1` to `pos2` from the input and enter Insert mode. + + If `overwrite` is set to True, the character at the cursor's new position + is removed as well (the motion is inclusive.) + + See Also: + `operator_base()`. + """ + operator_d(buf, input_line, pos1, pos2, overwrite) + set_mode("INSERT") + +def operator_y(buf, input_line, pos1, pos2, _): + """Yank text from `pos1` to `pos2` from the input line. + + See Also: + `operator_base()`. + """ + start = min(pos1, pos2) + end = max(pos1, pos2) + cmd = vimode_settings['copy_clipboard_cmd'] + proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE) + proc.communicate(input=input_line[start:end].encode()) + + +# Motions: +# -------- + +def motion_0(input_line, cur, count): + """Go to the first character of the line. + + See Also; + `motion_base()`. + """ + return 0, False, False + +def motion_w(input_line, cur, count): + """Go `count` words forward and return position. + + See Also: + `motion_base()`. + """ + pos = get_pos(input_line, REGEX_MOTION_LOWERCASE_W, cur, True, count) + if pos == -1: + return len(input_line), False, False + return cur + pos, False, False + +def motion_W(input_line, cur, count): + """Go `count` WORDS forward and return position. + + See Also: + `motion_base()`. + """ + pos = get_pos(input_line, REGEX_MOTION_UPPERCASE_W, cur, True, count) + if pos == -1: + return len(input_line), False, False + return cur + pos, False, False + +def motion_e(input_line, cur, count): + """Go to the end of `count` words and return position. + + See Also: + `motion_base()`. + """ + for _ in range(max(1, count)): + found = False + pos = cur + for pos in range(cur + 1, len(input_line) - 1): + # Whitespace, keep going. + if WHITESPACE.match(input_line[pos]): + pass + # End of sequence made from 'iskeyword' characters only, + # or end of sequence made from non 'iskeyword' characters only. + elif ((IS_KEYWORD.match(input_line[pos]) and + (not IS_KEYWORD.match(input_line[pos + 1]) or + WHITESPACE.match(input_line[pos + 1]))) or + (not IS_KEYWORD.match(input_line[pos]) and + (IS_KEYWORD.match(input_line[pos + 1]) or + WHITESPACE.match(input_line[pos + 1])))): + found = True + cur = pos + break + # We're at the character before the last and we still found nothing. + # Go to the last character. + if not found: + cur = pos + 1 + return cur, True, False + +def motion_E(input_line, cur, count): + """Go to the end of `count` WORDS and return cusor position. + + See Also: + `motion_base()`. + """ + pos = get_pos(input_line, REGEX_MOTION_UPPERCASE_E, cur, True, count) + if pos == -1: + return len(input_line), False, False + return cur + pos, True, False + +def motion_b(input_line, cur, count): + """Go `count` words backwards and return position. + + See Also: + `motion_base()`. + """ + # "b" is just "e" on inverted data (e.g. "olleH" instead of "Hello"). + pos_inv = motion_e(input_line[::-1], len(input_line) - cur - 1, count)[0] + pos = len(input_line) - pos_inv - 1 + return pos, True, False + +def motion_B(input_line, cur, count): + """Go `count` WORDS backwards and return position. + + See Also: + `motion_base()`. + """ + new_cur = len(input_line) - cur + pos = get_pos(input_line[::-1], REGEX_MOTION_UPPERCASE_B, new_cur, + count=count) + if pos == -1: + return 0, False, False + pos = len(input_line) - (pos + new_cur + 1) + return pos, True, False + +def motion_ge(input_line, cur, count): + """Go to end of `count` words backwards and return position. + + See Also: + `motion_base()`. + """ + # "ge is just "w" on inverted data (e.g. "olleH" instead of "Hello"). + pos_inv = motion_w(input_line[::-1], len(input_line) - cur - 1, count)[0] + pos = len(input_line) - pos_inv - 1 + return pos, True, False + +def motion_gE(input_line, cur, count): + """Go to end of `count` WORDS backwards and return position. + + See Also: + `motion_base()`. + """ + new_cur = len(input_line) - cur - 1 + pos = get_pos(input_line[::-1], REGEX_MOTION_G_UPPERCASE_E, new_cur, + True, count) + if pos == -1: + return 0, False, False + pos = len(input_line) - (pos + new_cur + 1) + return pos, True, False + +def motion_h(input_line, cur, count): + """Go `count` characters to the left and return position. + + See Also: + `motion_base()`. + """ + return max(0, cur - max(count, 1)), False, False + +def motion_l(input_line, cur, count): + """Go `count` characters to the right and return position. + + See Also: + `motion_base()`. + """ + return cur + max(count, 1), False, False + +def motion_carret(input_line, cur, count): + """Go to first non-blank character of line and return position. + + See Also: + `motion_base()`. + """ + pos = get_pos(input_line, REGEX_MOTION_CARRET, 0) + return pos, False, False + +def motion_dollar(input_line, cur, count): + """Go to end of line and return position. + + See Also: + `motion_base()`. + """ + pos = len(input_line) + return pos, False, False + +def motion_f(input_line, cur, count): + """Go to `count`'th occurence of character and return position. + + See Also: + `motion_base()`. + """ + return start_catching_keys(1, "cb_motion_f", input_line, cur, count) + +def cb_motion_f(update_last=True): + """Callback for `motion_f()`. + + Args: + update_last (bool, optional): should `last_search_motion` be updated? + Set to False when calling from `key_semicolon()` or `key_comma()` + so that the last search motion isn't overwritten. + Defaults to True. + + See Also: + `start_catching_keys()`. + """ + global last_search_motion + pattern = catching_keys_data['keys'] + pos = get_pos(catching_keys_data['input_line'], re.escape(pattern), + catching_keys_data['cur'], True, + catching_keys_data['count']) + catching_keys_data['new_cur'] = max(0, pos) + catching_keys_data['cur'] + if update_last: + last_search_motion = {'motion': "f", 'data': pattern} + cb_key_combo_default(None, None, "") + +def motion_F(input_line, cur, count): + """Go to `count`'th occurence of char to the right and return position. + + See Also: + `motion_base()`. + """ + return start_catching_keys(1, "cb_motion_F", input_line, cur, count) + +def cb_motion_F(update_last=True): + """Callback for `motion_F()`. + + Args: + update_last (bool, optional): should `last_search_motion` be updated? + Set to False when calling from `key_semicolon()` or `key_comma()` + so that the last search motion isn't overwritten. + Defaults to True. + + See Also: + `start_catching_keys()`. + """ + global last_search_motion + pattern = catching_keys_data['keys'] + cur = len(catching_keys_data['input_line']) - catching_keys_data['cur'] + pos = get_pos(catching_keys_data['input_line'][::-1], + re.escape(pattern), + cur, + False, + catching_keys_data['count']) + catching_keys_data['new_cur'] = catching_keys_data['cur'] - max(0, pos + 1) + if update_last: + last_search_motion = {'motion': "F", 'data': pattern} + cb_key_combo_default(None, None, "") + +def motion_t(input_line, cur, count): + """Go to `count`'th occurence of char and return position. + + The position returned is the position of the character to the left of char. + + See Also: + `motion_base()`. + """ + return start_catching_keys(1, "cb_motion_t", input_line, cur, count) + +def cb_motion_t(update_last=True): + """Callback for `motion_t()`. + + Args: + update_last (bool, optional): should `last_search_motion` be updated? + Set to False when calling from `key_semicolon()` or `key_comma()` + so that the last search motion isn't overwritten. + Defaults to True. + + See Also: + `start_catching_keys()`. + """ + global last_search_motion + pattern = catching_keys_data['keys'] + pos = get_pos(catching_keys_data['input_line'], re.escape(pattern), + catching_keys_data['cur'] + 1, + True, catching_keys_data['count']) + pos += 1 + if pos > 0: + catching_keys_data['new_cur'] = pos + catching_keys_data['cur'] - 1 + else: + catching_keys_data['new_cur'] = catching_keys_data['cur'] + if update_last: + last_search_motion = {'motion': "t", 'data': pattern} + cb_key_combo_default(None, None, "") + +def motion_T(input_line, cur, count): + """Go to `count`'th occurence of char to the left and return position. + + The position returned is the position of the character to the right of + char. + + See Also: + `motion_base()`. + """ + return start_catching_keys(1, "cb_motion_T", input_line, cur, count) + +def cb_motion_T(update_last=True): + """Callback for `motion_T()`. + + Args: + update_last (bool, optional): should `last_search_motion` be updated? + Set to False when calling from `key_semicolon()` or `key_comma()` + so that the last search motion isn't overwritten. + Defaults to True. + + See Also: + `start_catching_keys()`. + """ + global last_search_motion + pattern = catching_keys_data['keys'] + pos = get_pos(catching_keys_data['input_line'][::-1], re.escape(pattern), + (len(catching_keys_data['input_line']) - + (catching_keys_data['cur'] + 1)) + 1, + True, catching_keys_data['count']) + pos += 1 + if pos > 0: + catching_keys_data['new_cur'] = catching_keys_data['cur'] - pos + 1 + else: + catching_keys_data['new_cur'] = catching_keys_data['cur'] + if update_last: + last_search_motion = {'motion': "T", 'data': pattern} + cb_key_combo_default(None, None, "") + + +# Keys: +# ----- + +def key_cc(buf, input_line, cur, count): + """Delete line and start Insert mode. + + See Also: + `key_base()`. + """ + weechat.command("", "/input delete_line") + set_mode("INSERT") + +def key_C(buf, input_line, cur, count): + """Delete from cursor to end of line and start Insert mode. + + See Also: + `key_base()`. + """ + weechat.command("", "/input delete_end_of_line") + set_mode("INSERT") + +def key_yy(buf, input_line, cur, count): + """Yank line. + + See Also: + `key_base()`. + """ + cmd = vimode_settings['copy_clipboard_cmd'] + proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE) + proc.communicate(input=input_line.encode()) + +def key_p(buf, input_line, cur, count): + """Paste text. + + See Also: + `key_base()`. + """ + cmd = vimode_settings['paste_clipboard_cmd'] + weechat.hook_process(cmd, 10 * 1000, "cb_key_p", weechat.current_buffer()) + +def cb_key_p(data, command, return_code, output, err): + """Callback for fetching clipboard text and pasting it.""" + buf = "" + this_buffer = data + if output != "": + buf += output.strip() + if return_code == 0: + my_input = weechat.buffer_get_string(this_buffer, "input") + pos = weechat.buffer_get_integer(this_buffer, "input_pos") + my_input = my_input[:pos] + buf + my_input[pos:] + pos += len(buf) + weechat.buffer_set(this_buffer, "input", my_input) + weechat.buffer_set(this_buffer, "input_pos", str(pos)) + return weechat.WEECHAT_RC_OK + +def key_i(buf, input_line, cur, count): + """Start Insert mode. + + See Also: + `key_base()`. + """ + set_mode("INSERT") + +def key_a(buf, input_line, cur, count): + """Move cursor one character to the right and start Insert mode. + + See Also: + `key_base()`. + """ + set_cur(buf, input_line, cur + 1, False) + set_mode("INSERT") + +def key_A(buf, input_line, cur, count): + """Move cursor to end of line and start Insert mode. + + See Also: + `key_base()`. + """ + set_cur(buf, input_line, len(input_line), False) + set_mode("INSERT") + +def key_I(buf, input_line, cur, count): + """Move cursor to first non-blank character and start Insert mode. + + See Also: + `key_base()`. + """ + pos, _, _ = motion_carret(input_line, cur, 0) + set_cur(buf, input_line, pos) + set_mode("INSERT") + +def key_G(buf, input_line, cur, count): + """Scroll to specified line or bottom of buffer. + + See Also: + `key_base()`. + """ + if count > 0: + # This is necessary to prevent weird scroll jumps. + weechat.command("", "/window scroll_top") + weechat.command("", "/window scroll %s" % (count - 1)) + else: + weechat.command("", "/window scroll_bottom") + +def key_r(buf, input_line, cur, count): + """Replace `count` characters under the cursor. + + See Also: + `key_base()`. + """ + start_catching_keys(1, "cb_key_r", input_line, cur, count, buf) + +def cb_key_r(): + """Callback for `key_r()`. + + See Also: + `start_catching_keys()`. + """ + global catching_keys_data + input_line = list(catching_keys_data['input_line']) + count = max(catching_keys_data['count'], 1) + cur = catching_keys_data['cur'] + if cur + count <= len(input_line): + for _ in range(count): + input_line[cur] = catching_keys_data['keys'] + cur += 1 + input_line = "".join(input_line) + weechat.buffer_set(catching_keys_data['buf'], "input", input_line) + set_cur(catching_keys_data['buf'], input_line, cur - 1) + catching_keys_data = {'amount': 0} + +def key_R(buf, input_line, cur, count): + """Start Replace mode. + + See Also: + `key_base()`. + """ + set_mode("REPLACE") + +def key_tilda(buf, input_line, cur, count): + """Switch the case of `count` characters under the cursor. + + See Also: + `key_base()`. + """ + input_line = list(input_line) + count = max(1, count) + while count and cur < len(input_line): + input_line[cur] = input_line[cur].swapcase() + count -= 1 + cur += 1 + input_line = "".join(input_line) + weechat.buffer_set(buf, "input", input_line) + set_cur(buf, input_line, cur) + +def key_alt_j(buf, input_line, cur, count): + """Go to WeeChat buffer. + + Called to preserve WeeChat's alt-j buffer switching. + + This is only called when alt-j is pressed after pressing Esc, because + \x01\x01j is received in key_combo_default which becomes \x01j after + removing the detected Esc key. + If Esc isn't the last pressed key, \x01j is directly received in + key_combo_default. + """ + start_catching_keys(2, "cb_key_alt_j", input_line, cur, count) + +def cb_key_alt_j(): + """Callback for `key_alt_j()`. + + See Also: + `start_catching_keys()`. + """ + global catching_keys_data + weechat.command("", "/buffer " + catching_keys_data['keys']) + catching_keys_data = {'amount': 0} + +def key_semicolon(buf, input_line, cur, count, swap=False): + """Repeat last f, t, F, T `count` times. + + Args: + swap (bool, optional): if True, the last motion will be repeated in the + opposite direction (e.g. "f" instead of "F"). Defaults to False. + + See Also: + `key_base()`. + """ + global catching_keys_data, vi_buffer + catching_keys_data = ({'amount': 0, + 'input_line': input_line, + 'cur': cur, + 'keys': last_search_motion['data'], + 'count': count, + 'new_cur': 0, + 'buf': buf}) + # Swap the motion's case if called from key_comma. + if swap: + motion = last_search_motion['motion'].swapcase() + else: + motion = last_search_motion['motion'] + func = "cb_motion_%s" % motion + vi_buffer = motion + globals()[func](False) + +def key_comma(buf, input_line, cur, count): + """Repeat last f, t, F, T in opposite direction `count` times. + + See Also: + `key_base()`. + """ + key_semicolon(buf, input_line, cur, count, True) + +def key_u(buf, input_line, cur, count): + """Undo change `count` times. + + See Also: + `key_base()`. + """ + buf = weechat.current_buffer() + if buf not in undo_history: + return + for _ in range(max(count, 1)): + if undo_history_index[buf] > -len(undo_history[buf]): + undo_history_index[buf] -= 1 + input_line = undo_history[buf][undo_history_index[buf]] + weechat.buffer_set(buf, "input", input_line) + else: + break + +def key_ctrl_r(buf, input_line, cur, count): + """Redo change `count` times. + + See Also: + `key_base()`. + """ + if buf not in undo_history: + return + for _ in range(max(count, 1)): + if undo_history_index[buf] < -1: + undo_history_index[buf] += 1 + input_line = undo_history[buf][undo_history_index[buf]] + weechat.buffer_set(buf, "input", input_line) + else: + break + + +# Vi key bindings. +# ================ + +# String values will be executed as normal WeeChat commands. +# For functions, see `key_base()` for reference. +VI_KEYS = {'j': "/window scroll_down", + 'k': "/window scroll_up", + 'G': key_G, + 'gg': "/window scroll_top", + 'x': "/input delete_next_char", + 'X': "/input delete_previous_char", + 'dd': "/input delete_line", + 'D': "/input delete_end_of_line", + 'cc': key_cc, + 'C': key_C, + 'i': key_i, + 'a': key_a, + 'A': key_A, + 'I': key_I, + 'yy': key_yy, + 'p': key_p, + 'gt': "/buffer -1", + 'K': "/buffer -1", + 'gT': "/buffer +1", + 'J': "/buffer +1", + 'r': key_r, + 'R': key_R, + '~': key_tilda, + 'nt': "/bar scroll nicklist * -100%", + 'nT': "/bar scroll nicklist * +100%", + '\x01[[A': "/input history_previous", + '\x01[[B': "/input history_next", + '\x01[[C': "/input move_next_char", + '\x01[[D': "/input move_previous_char", + '\x01[[H': "/input move_beginning_of_line", + '\x01[[F': "/input move_end_of_line", + '\x01[[5~': "/window page_up", + '\x01[[6~': "/window page_down", + '\x01[[3~': "/input delete_next_char", + '\x01[[2~': key_i, + '\x01M': "/input return", + '\x01?': "/input move_previous_char", + ' ': "/input move_next_char", + '\x01[j': key_alt_j, + '\x01[1': "/buffer *1", + '\x01[2': "/buffer *2", + '\x01[3': "/buffer *3", + '\x01[4': "/buffer *4", + '\x01[5': "/buffer *5", + '\x01[6': "/buffer *6", + '\x01[7': "/buffer *7", + '\x01[8': "/buffer *8", + '\x01[9': "/buffer *9", + '\x01[0': "/buffer *10", + '\x01^': "/input jump_last_buffer_displayed", + '\x01D': "/window page_down", + '\x01U': "/window page_up", + '\x01Wh': "/window left", + '\x01Wj': "/window down", + '\x01Wk': "/window up", + '\x01Wl': "/window right", + '\x01W=': "/window balance", + '\x01Wx': "/window swap", + '\x01Ws': "/window splith", + '\x01Wv': "/window splitv", + '\x01Wq': "/window merge", + ';': key_semicolon, + ',': key_comma, + 'u': key_u, + '\x01R': key_ctrl_r} + +# Add alt-j bindings. +for i in range(10, 99): + VI_KEYS['\x01[j%s' % i] = "/buffer %s" % i + + +# Key handling. +# ============= + +def cb_key_pressed(data, signal, signal_data): + """Detect potential Esc presses. + + Alt and Esc are detected as the same key in most terminals. The difference + is that Alt signal is sent just before the other pressed key's signal. + We therefore use a timeout (50ms) to detect whether Alt or Esc was pressed. + """ + global last_signal_time + last_signal_time = time.time() + if signal_data == "\x01[": + # In 50ms, check if any other keys were pressed. If not, it's Esc! + weechat.hook_timer(50, 0, 1, "cb_check_esc", + "{:f}".format(last_signal_time)) + return weechat.WEECHAT_RC_OK + +def cb_check_esc(data, remaining_calls): + """Check if the Esc key was pressed and change the mode accordingly.""" + global esc_pressed, vi_buffer, catching_keys_data + # Not perfect, would be better to use direct comparison (==) but that only + # works for py2 and not for py3. + if abs(last_signal_time - float(data)) <= 0.000001: + esc_pressed += 1 + if mode == "SEARCH": + weechat.command("", "/input search_stop_here") + set_mode("NORMAL") + # Cancel any current partial commands. + vi_buffer = "" + catching_keys_data = {'amount': 0} + weechat.bar_item_update("vi_buffer") + return weechat.WEECHAT_RC_OK + +def cb_key_combo_default(data, signal, signal_data): + """Eat and handle key events when in Normal mode, if needed. + + The key_combo_default signal is sent when a key combo is pressed. For + example, alt-k will send the "\x01[k" signal. + + Esc is handled a bit differently to avoid delays, see `cb_key_pressed()`. + """ + global esc_pressed, vi_buffer, cmd_compl_text, cmd_text_orig, \ + cmd_compl_pos, cmd_history_index + + # If Esc was pressed, strip the Esc part from the pressed keys. + # Example: user presses Esc followed by i. This is detected as "\x01[i", + # but we only want to handle "i". + keys = signal_data + if esc_pressed or esc_pressed == -2: + if keys.startswith("\x01[" * esc_pressed): + # Multiples of 3 seem to "cancel" themselves, + # e.g. Esc-Esc-Esc-Alt-j-11 is detected as "\x01[\x01[\x01" + # followed by "\x01[j11" (two different signals). + if signal_data == "\x01[" * 3: + esc_pressed = -1 # `cb_check_esc()` will increment it to 0. + else: + esc_pressed = 0 + # This can happen if a valid combination is started but interrupted + # with Esc, such as Ctrl-W→Esc→w which would send two signals: + # "\x01W\x01[" then "\x01W\x01[w". + # In that case, we still need to handle the next signal ("\x01W\x01[w") + # so we use the special value "-2". + else: + esc_pressed = -2 + keys = keys.split("\x01[")[-1] # Remove the "Esc" part(s). + # Ctrl-Space. + elif keys == "\x01@": + set_mode("NORMAL") + return weechat.WEECHAT_RC_OK_EAT + + # Clear the undo history for this buffer on . + if keys == "\x01M": + buf = weechat.current_buffer() + clear_undo_history(buf) + + # Detect imap_esc presses if any. + if mode == "INSERT": + imap_esc = vimode_settings['imap_esc'] + if not imap_esc: + return weechat.WEECHAT_RC_OK + if (imap_esc.startswith(vi_buffer) and + imap_esc[len(vi_buffer):len(vi_buffer)+1] == keys): + vi_buffer += keys + weechat.bar_item_update("vi_buffer") + weechat.hook_timer(int(vimode_settings['imap_esc_timeout']), 0, 1, + "cb_check_imap_esc", vi_buffer) + elif (vi_buffer and imap_esc.startswith(vi_buffer) and + imap_esc[len(vi_buffer):len(vi_buffer)+1] != keys): + vi_buffer = "" + weechat.bar_item_update("vi_buffer") + # imap_esc sequence detected -- remove the sequence keys from the + # Weechat input bar and enter Normal mode. + if imap_esc == vi_buffer: + buf = weechat.current_buffer() + input_line = weechat.buffer_get_string(buf, "input") + cur = weechat.buffer_get_integer(buf, "input_pos") + input_line = (input_line[:cur-len(imap_esc)+1] + + input_line[cur:]) + weechat.buffer_set(buf, "input", input_line) + set_cur(buf, input_line, cur-len(imap_esc)+1, False) + set_mode("NORMAL") + vi_buffer = "" + weechat.bar_item_update("vi_buffer") + return weechat.WEECHAT_RC_OK_EAT + return weechat.WEECHAT_RC_OK + + # We're in Replace mode — allow "normal" key presses (e.g. "a") and + # overwrite the next character with them, but let the other key presses + # pass normally (e.g. backspace, arrow keys, etc). + if mode == "REPLACE": + if len(keys) == 1: + weechat.command("", "/input delete_next_char") + elif keys == "\x01?": + weechat.command("", "/input move_previous_char") + return weechat.WEECHAT_RC_OK_EAT + return weechat.WEECHAT_RC_OK + + # We're catching keys! Only "normal" key presses interest us (e.g. "a"), + # not complex ones (e.g. backspace). + if len(keys) == 1 and catching_keys_data['amount']: + catching_keys_data['keys'] += keys + catching_keys_data['amount'] -= 1 + # Done catching keys, execute the callback. + if catching_keys_data['amount'] == 0: + globals()[catching_keys_data['callback']]() + vi_buffer = "" + weechat.bar_item_update("vi_buffer") + return weechat.WEECHAT_RC_OK_EAT + + # We're in command-line mode. + if mode == "COMMAND": + buf = weechat.current_buffer() + cmd_text = weechat.buffer_get_string(buf, "input") + weechat.hook_timer(1, 0, 1, "cb_check_cmd_mode", "") + # Return key. + if keys == "\x01M": + weechat.hook_timer(1, 0, 1, "cb_exec_cmd", cmd_text) + if len(cmd_text) > 1 and (not cmd_history or + cmd_history[-1] != cmd_text): + cmd_history.append(cmd_text) + cmd_history_index = 0 + set_mode("NORMAL") + buf = weechat.current_buffer() + input_line = input_line_backup[buf]['input_line'] + weechat.buffer_set(buf, "input", input_line) + set_cur(buf, input_line, input_line_backup[buf]['cur'], False) + # Up arrow. + elif keys == "\x01[[A": + if cmd_history_index > -len(cmd_history): + cmd_history_index -= 1 + cmd_text = cmd_history[cmd_history_index] + weechat.buffer_set(buf, "input", cmd_text) + set_cur(buf, cmd_text, len(cmd_text), False) + # Down arrow. + elif keys == "\x01[[B": + if cmd_history_index < -1: + cmd_history_index += 1 + cmd_text = cmd_history[cmd_history_index] + else: + cmd_history_index = 0 + cmd_text = ":" + weechat.buffer_set(buf, "input", cmd_text) + set_cur(buf, cmd_text, len(cmd_text), False) + # Tab key. No completion when searching ("/"). + elif keys == "\x01I" and cmd_text[0] == ":": + if cmd_text_orig is None: + input_ = list(cmd_text) + del input_[0] + cmd_text_orig = "".join(input_) + cmd_compl_list = [] + for cmd in VI_COMMANDS.keys(): + if cmd.startswith(cmd_text_orig): + cmd_compl_list.append(cmd) + if cmd_compl_list: + curr_suggestion = cmd_compl_list[cmd_compl_pos] + cmd_text = ":%s" % curr_suggestion + cmd_compl_list[cmd_compl_pos] = weechat.string_eval_expression( + "${color:bold}%s${color:-bold}" % curr_suggestion, + {}, {}, {}) + cmd_compl_text = ", ".join(cmd_compl_list) + cmd_compl_pos = (cmd_compl_pos + 1) % len(cmd_compl_list) + weechat.buffer_set(buf, "input", cmd_text) + set_cur(buf, cmd_text, len(cmd_text), False) + # Input. + else: + cmd_compl_text = "" + cmd_text_orig = None + cmd_compl_pos = 0 + weechat.bar_item_update("cmd_completion") + if keys in ["\x01M", "\x01[[A", "\x01[[B"]: + cmd_compl_text = "" + return weechat.WEECHAT_RC_OK_EAT + else: + return weechat.WEECHAT_RC_OK + # Enter command mode. + elif keys in [":", "/"]: + if keys == "/": + weechat.command("", "/input search_text_here") + if not weechat.config_string_to_boolean( + vimode_settings['search_vim']): + return weechat.WEECHAT_RC_OK + else: + buf = weechat.current_buffer() + cur = weechat.buffer_get_integer(buf, "input_pos") + input_line = weechat.buffer_get_string(buf, "input") + input_line_backup[buf] = {'input_line': input_line, 'cur': cur} + input_line = ":" + weechat.buffer_set(buf, "input", input_line) + set_cur(buf, input_line, 1, False) + set_mode("COMMAND") + cmd_compl_text = "" + cmd_text_orig = None + cmd_compl_pos = 0 + return weechat.WEECHAT_RC_OK_EAT + + # Add key to the buffer. + vi_buffer += keys + weechat.bar_item_update("vi_buffer") + if not vi_buffer: + return weechat.WEECHAT_RC_OK + + # Check if the keys have a (partial or full) match. If so, also get the + # keys without the count. (These are the actual keys we should handle.) + # After that, `vi_buffer` is only used for display purposes — only + # `vi_keys` is checked for all the handling. + # If no matches are found, the keys buffer is cleared. + matched, vi_keys, count = get_keys_and_count(vi_buffer) + if not matched: + vi_buffer = "" + return weechat.WEECHAT_RC_OK_EAT + # Check if it's a command (user defined key mapped to a :cmd). + if vi_keys.startswith(":"): + weechat.hook_timer(1, 0, 1, "cb_exec_cmd", "{} {}".format(vi_keys, + count)) + vi_buffer = "" + return weechat.WEECHAT_RC_OK_EAT + # It's a WeeChat command (user defined key mapped to a /cmd). + if vi_keys.startswith("/"): + weechat.command("", vi_keys) + vi_buffer = "" + return weechat.WEECHAT_RC_OK_EAT + + buf = weechat.current_buffer() + input_line = weechat.buffer_get_string(buf, "input") + cur = weechat.buffer_get_integer(buf, "input_pos") + + # It's a default mapping. If the corresponding value is a string, we assume + # it's a WeeChat command. Otherwise, it's a method we'll call. + if vi_keys in VI_KEYS: + if vi_keys not in ['u', '\x01R']: + add_undo_history(buf, input_line) + if isinstance(VI_KEYS[vi_keys], str): + for _ in range(max(count, 1)): + # This is to avoid crashing WeeChat on script reloads/unloads, + # because no hooks must still be running when a script is + # reloaded or unloaded. + if (VI_KEYS[vi_keys] == "/input return" and + input_line.startswith("/script ")): + return weechat.WEECHAT_RC_OK + weechat.command("", VI_KEYS[vi_keys]) + current_cur = weechat.buffer_get_integer(buf, "input_pos") + set_cur(buf, input_line, current_cur) + else: + VI_KEYS[vi_keys](buf, input_line, cur, count) + # It's a motion (e.g. "w") — call `motion_X()` where X is the motion, then + # set the cursor's position to what that function returned. + elif vi_keys in VI_MOTIONS: + if vi_keys in SPECIAL_CHARS: + func = "motion_%s" % SPECIAL_CHARS[vi_keys] + else: + func = "motion_%s" % vi_keys + end, _, _ = globals()[func](input_line, cur, count) + set_cur(buf, input_line, end) + # It's an operator + motion (e.g. "dw") — call `motion_X()` (where X is + # the motion), then we call `operator_Y()` (where Y is the operator) + # with the position `motion_X()` returned. `operator_Y()` should then + # handle changing the input line. + elif (len(vi_keys) > 1 and + vi_keys[0] in VI_OPERATORS and + vi_keys[1:] in VI_MOTIONS): + add_undo_history(buf, input_line) + if vi_keys[1:] in SPECIAL_CHARS: + func = "motion_%s" % SPECIAL_CHARS[vi_keys[1:]] + else: + func = "motion_%s" % vi_keys[1:] + pos, overwrite, catching = globals()[func](input_line, cur, count) + # If it's a catching motion, we don't want to call the operator just + # yet -- this code will run again when the motion is complete, at which + # point we will. + if not catching: + oper = "operator_%s" % vi_keys[0] + globals()[oper](buf, input_line, cur, pos, overwrite) + # The combo isn't completed yet (e.g. just "d"). + else: + return weechat.WEECHAT_RC_OK_EAT + + # We've already handled the key combo, so clear the keys buffer. + if not catching_keys_data['amount']: + vi_buffer = "" + weechat.bar_item_update("vi_buffer") + return weechat.WEECHAT_RC_OK_EAT + +def cb_check_imap_esc(data, remaining_calls): + """Clear the imap_esc sequence after some time if nothing was pressed.""" + global vi_buffer + if vi_buffer == data: + vi_buffer = "" + weechat.bar_item_update("vi_buffer") + return weechat.WEECHAT_RC_OK + +def cb_key_combo_search(data, signal, signal_data): + """Handle keys while search mode is active (if search_vim is enabled).""" + if not weechat.config_string_to_boolean(vimode_settings['search_vim']): + return weechat.WEECHAT_RC_OK + if mode == "COMMAND": + if signal_data == "\x01M": + set_mode("SEARCH") + return weechat.WEECHAT_RC_OK_EAT + elif mode == "SEARCH": + if signal_data == "\x01M": + set_mode("NORMAL") + else: + if signal_data == "n": + weechat.command("", "/input search_next") + elif signal_data == "N": + weechat.command("", "/input search_previous") + # Start a new search. + elif signal_data == "/": + weechat.command("", "/input search_stop_here") + set_mode("NORMAL") + weechat.command("", "/input search_text_here") + return weechat.WEECHAT_RC_OK_EAT + return weechat.WEECHAT_RC_OK + +# Callbacks. +# ========== + +# Bar items. +# ---------- + +def cb_vi_buffer(data, item, window): + """Return the content of the vi buffer (pressed keys on hold).""" + return vi_buffer + +def cb_cmd_completion(data, item, window): + """Return the text of the command line.""" + return cmd_compl_text + +def cb_mode_indicator(data, item, window): + """Return the current mode (INSERT/NORMAL/REPLACE/...).""" + return "{}{}{}{}{}".format( + weechat.color(mode_colors[mode]), + vimode_settings['mode_indicator_prefix'], mode, + vimode_settings['mode_indicator_suffix'], weechat.color("reset")) + +def cb_line_numbers(data, item, window): + """Fill the line numbers bar item.""" + bar_height = weechat.window_get_integer(window, "win_chat_height") + content = "" + for i in range(1, bar_height + 1): + content += "{}{}{}\n".format(vimode_settings['line_number_prefix'], i, + vimode_settings['line_number_suffix']) + return content + +# Callbacks for the line numbers bar. +# ................................... + +def cb_update_line_numbers(data, signal, signal_data): + """Call `cb_timer_update_line_numbers()` when switching buffers. + + A timer is required because the bar item is refreshed before the new buffer + is actually displayed, so ``win_chat_height`` would refer to the old + buffer. Using a timer refreshes the item after the new buffer is displayed. + """ + weechat.hook_timer(10, 0, 1, "cb_timer_update_line_numbers", "") + return weechat.WEECHAT_RC_OK + +def cb_timer_update_line_numbers(data, remaining_calls): + """Update the line numbers bar item.""" + weechat.bar_item_update("line_numbers") + return weechat.WEECHAT_RC_OK + + +# Config. +# ------- + +def cb_config(data, option, value): + """Script option changed, update our copy.""" + option_name = option.split(".")[-1] + if option_name in vimode_settings: + vimode_settings[option_name] = value + if option_name == 'user_mappings': + load_user_mappings() + if "_color" in option_name: + load_mode_colors() + return weechat.WEECHAT_RC_OK + +def load_mode_colors(): + mode_colors.update({ + 'NORMAL': "{},{}".format( + vimode_settings['mode_indicator_normal_color'], + vimode_settings['mode_indicator_normal_color_bg']), + 'INSERT': "{},{}".format( + vimode_settings['mode_indicator_insert_color'], + vimode_settings['mode_indicator_insert_color_bg']), + 'REPLACE': "{},{}".format( + vimode_settings['mode_indicator_replace_color'], + vimode_settings['mode_indicator_replace_color_bg']), + 'COMMAND': "{},{}".format( + vimode_settings['mode_indicator_cmd_color'], + vimode_settings['mode_indicator_cmd_color_bg']), + 'SEARCH': "{},{}".format( + vimode_settings['mode_indicator_search_color'], + vimode_settings['mode_indicator_search_color_bg']) + }) + +def load_user_mappings(): + """Load user-defined mappings.""" + mappings = {} + if vimode_settings['user_mappings']: + mappings.update(json.loads(vimode_settings['user_mappings'])) + vimode_settings['user_mappings'] = mappings + + +# Command-line execution. +# ----------------------- + +def cb_exec_cmd(data, remaining_calls): + """Translate and execute our custom commands to WeeChat command.""" + # Process the entered command. + data = list(data) + del data[0] + data = "".join(data) + # s/foo/bar command. + if data.startswith("s/"): + cmd = data + parsed_cmd = next(csv.reader(StringIO(cmd), delimiter="/", + escapechar="\\")) + pattern = re.escape(parsed_cmd[1]) + repl = parsed_cmd[2] + repl = re.sub(r"([^\\])&", r"\1" + pattern, repl) + flag = None + if len(parsed_cmd) == 4: + flag = parsed_cmd[3] + count = 1 + if flag == "g": + count = 0 + buf = weechat.current_buffer() + input_line = weechat.buffer_get_string(buf, "input") + input_line = re.sub(pattern, repl, input_line, count) + weechat.buffer_set(buf, "input", input_line) + # Shell command. + elif data.startswith("!"): + weechat.command("", "/exec -buffer shell %s" % data[1:]) + # Commands like `:22`. This should start cursor mode (``/cursor``) and take + # us to the relevant line. + elif data.isdigit(): + line_number = int(data) + hdata_window = weechat.hdata_get("window") + window = weechat.current_window() + x = weechat.hdata_integer(hdata_window, window, "win_chat_x") + y = (weechat.hdata_integer(hdata_window, window, "win_chat_y") + + (line_number - 1)) + weechat.command("", "/cursor go {},{}".format(x, y)) + # Check againt defined commands. + elif data: + raw_data = data + data = data.split(" ", 1) + cmd = data[0] + args = "" + if len(data) == 2: + args = data[1] + if cmd in VI_COMMANDS: + if isinstance(VI_COMMANDS[cmd], str): + weechat.command("", "%s %s" % (VI_COMMANDS[cmd], args)) + else: + VI_COMMANDS[cmd](args) + else: + # Check for commands not sepearated by space (e.g. "b2") + for i in range(1, len(raw_data)): + tmp_cmd = raw_data[:i] + tmp_args = raw_data[i:] + if tmp_cmd in VI_COMMANDS and tmp_args.isdigit(): + weechat.command("", "%s %s" % (VI_COMMANDS[tmp_cmd], + tmp_args)) + return weechat.WEECHAT_RC_OK + # No vi commands found, run the command as WeeChat command + weechat.command("", "/{} {}".format(cmd, args)) + return weechat.WEECHAT_RC_OK + +def cb_vimode_go_to_normal(data, buf, args): + set_mode("NORMAL") + return weechat.WEECHAT_RC_OK + +# Script commands. +# ---------------- + +def cb_vimode_cmd(data, buf, args): + """Handle script commands (``/vimode ``).""" + # ``/vimode`` or ``/vimode help`` + if not args or args == "help": + weechat.prnt("", "[vimode.py] %s" % README_URL) + # ``/vimode bind_keys`` or ``/vimode bind_keys --list`` + elif args.startswith("bind_keys"): + infolist = weechat.infolist_get("key", "", "default") + weechat.infolist_reset_item_cursor(infolist) + commands = ["/key unbind ctrl-W", + "/key bind ctrl-W /input delete_previous_word", + "/key bind ctrl-^ /input jump_last_buffer_displayed", + "/key bind ctrl-Wh /window left", + "/key bind ctrl-Wj /window down", + "/key bind ctrl-Wk /window up", + "/key bind ctrl-Wl /window right", + "/key bind ctrl-W= /window balance", + "/key bind ctrl-Wx /window swap", + "/key bind ctrl-Ws /window splith", + "/key bind ctrl-Wv /window splitv", + "/key bind ctrl-Wq /window merge"] + while weechat.infolist_next(infolist): + key = weechat.infolist_string(infolist, "key") + if re.match(REGEX_PROBLEMATIC_KEYBINDINGS, key): + commands.append("/key unbind %s" % key) + weechat.infolist_free(infolist) + if args == "bind_keys": + weechat.prnt("", "Running commands:") + for command in commands: + weechat.command("", command) + weechat.prnt("", "Done.") + elif args == "bind_keys --list": + weechat.prnt("", "Listing commands we'll run:") + for command in commands: + weechat.prnt("", " %s" % command) + weechat.prnt("", "Done.") + return weechat.WEECHAT_RC_OK + + +# Helpers. +# ======== + +# Motions/keys helpers. +# --------------------- + +def get_pos(data, regex, cur, ignore_cur=False, count=0): + """Return the position of `regex` match in `data`, starting at `cur`. + + Args: + data (str): the data to search in. + regex (pattern): regex pattern to search for. + cur (int): where to start the search. + ignore_cur (bool, optional): should the first match be ignored if it's + also the character at `cur`? + Defaults to False. + count (int, optional): the index of the match to return. Defaults to 0. + + Returns: + int: position of the match. -1 if no matches are found. + """ + # List of the *positions* of the found patterns. + matches = [m.start() for m in re.finditer(regex, data[cur:])] + pos = -1 + if count: + if len(matches) > count - 1: + if ignore_cur and matches[0] == 0: + if len(matches) > count: + pos = matches[count] + else: + pos = matches[count - 1] + elif matches: + if ignore_cur and matches[0] == 0: + if len(matches) > 1: + pos = matches[1] + else: + pos = matches[0] + return pos + +def set_cur(buf, input_line, pos, cap=True): + """Set the cursor's position. + + Args: + buf (str): pointer to the current WeeChat buffer. + input_line (str): the content of the input line. + pos (int): the position to set the cursor to. + cap (bool, optional): if True, the `pos` will shortened to the length + of `input_line` if it's too long. Defaults to True. + """ + if cap: + pos = min(pos, len(input_line) - 1) + weechat.buffer_set(buf, "input_pos", str(pos)) + +def start_catching_keys(amount, callback, input_line, cur, count, buf=None): + """Start catching keys. Used for special commands (e.g. "f", "r"). + + amount (int): amount of keys to catch. + callback (str): name of method to call once all keys are caught. + input_line (str): input line's content. + cur (int): cursor's position. + count (int): count, e.g. "2" for "2fs". + buf (str, optional): pointer to the current WeeChat buffer. + Defaults to None. + + `catching_keys_data` is a dict with the above arguments, as well as: + keys (str): pressed keys will be added under this key. + new_cur (int): the new cursor's position, set in the callback. + + When catching keys is active, normal pressed keys (e.g. "a" but not arrows) + will get added to `catching_keys_data` under the key "keys", and will not + be handled any further. + Once all keys are caught, the method defined in the "callback" key is + called, and can use the data in `catching_keys_data` to perform its action. + """ + global catching_keys_data + if "new_cur" in catching_keys_data: + new_cur = catching_keys_data['new_cur'] + catching_keys_data = {'amount': 0} + return new_cur, True, False + catching_keys_data = ({'amount': amount, + 'callback': callback, + 'input_line': input_line, + 'cur': cur, + 'keys': "", + 'count': count, + 'new_cur': 0, + 'buf': buf}) + return cur, False, True + +def get_keys_and_count(combo): + """Check if `combo` is a valid combo and extract keys/counts if so. + + Args: + combo (str): pressed keys combo. + + Returns: + matched (bool): True if the combo has a (partial or full) match, False + otherwise. + combo (str): `combo` with the count removed. These are the actual keys + we should handle. User mappings are also expanded. + count (int): count for `combo`. + """ + # Look for a potential match (e.g. "d" might become "dw" or "dd" so we + # accept it, but "d9" is invalid). + matched = False + # Digits are allowed at the beginning (counts or "0"). + count = 0 + if combo.isdigit(): + matched = True + elif combo and combo[0].isdigit(): + count = "" + for char in combo: + if char.isdigit(): + count += char + else: + break + combo = combo.replace(count, "", 1) + count = int(count) + # It's a user defined key. Expand it. + if combo in vimode_settings['user_mappings']: + combo = vimode_settings['user_mappings'][combo] + # It's a WeeChat command. + if not matched and combo.startswith("/"): + matched = True + # Check against defined keys. + if not matched: + for key in VI_KEYS: + if key.startswith(combo): + matched = True + break + # Check against defined motions. + if not matched: + for motion in VI_MOTIONS: + if motion.startswith(combo): + matched = True + break + # Check against defined operators + motions. + if not matched: + for operator in VI_OPERATORS: + if combo.startswith(operator): + # Check for counts before the motion (but after the operator). + vi_keys_no_op = combo[len(operator):] + # There's no motion yet. + if vi_keys_no_op.isdigit(): + matched = True + break + # Get the motion count, then multiply the operator count by + # it, similar to vim's behavior. + elif vi_keys_no_op and vi_keys_no_op[0].isdigit(): + motion_count = "" + for char in vi_keys_no_op: + if char.isdigit(): + motion_count += char + else: + break + # Remove counts from `vi_keys_no_op`. + combo = combo.replace(motion_count, "", 1) + motion_count = int(motion_count) + count = max(count, 1) * motion_count + # Check against defined motions. + for motion in VI_MOTIONS: + if motion.startswith(combo[1:]): + matched = True + break + return matched, combo, count + + +# Other helpers. +# -------------- + +def set_mode(arg): + """Set the current mode and update the bar mode indicator.""" + global mode + buf = weechat.current_buffer() + input_line = weechat.buffer_get_string(buf, "input") + if mode == "INSERT" and arg == "NORMAL": + add_undo_history(buf, input_line) + mode = arg + # If we're going to Normal mode, the cursor must move one character to the + # left. + if mode == "NORMAL": + cur = weechat.buffer_get_integer(buf, "input_pos") + set_cur(buf, input_line, cur - 1, False) + weechat.bar_item_update("mode_indicator") + +def cb_check_cmd_mode(data, remaining_calls): + """Exit command mode if user erases the leading ':' character.""" + buf = weechat.current_buffer() + cmd_text = weechat.buffer_get_string(buf, "input") + if not cmd_text: + set_mode("NORMAL") + return weechat.WEECHAT_RC_OK + +def add_undo_history(buf, input_line): + """Add an item to the per-buffer undo history.""" + if buf in undo_history: + if not undo_history[buf] or undo_history[buf][-1] != input_line: + undo_history[buf].append(input_line) + undo_history_index[buf] = -1 + else: + undo_history[buf] = ['', input_line] + undo_history_index[buf] = -1 + +def clear_undo_history(buf): + """Clear the undo history for a given buffer.""" + undo_history[buf] = [''] + undo_history_index[buf] = -1 + +def print_warning(text): + """Print warning, in red, to the current buffer.""" + weechat.prnt("", ("%s[vimode.py] %s" % (weechat.color("red"), text))) + +def check_warnings(): + """Warn the user about problematic key bindings and tmux/screen.""" + user_warned = False + # Warn the user about problematic key bindings that may conflict with + # vimode. + # The solution is to remove these key bindings, but that's up to the user. + infolist = weechat.infolist_get("key", "", "default") + problematic_keybindings = [] + while weechat.infolist_next(infolist): + key = weechat.infolist_string(infolist, "key") + command = weechat.infolist_string(infolist, "command") + if re.match(REGEX_PROBLEMATIC_KEYBINDINGS, key): + problematic_keybindings.append("%s -> %s" % (key, command)) + weechat.infolist_free(infolist) + if problematic_keybindings: + user_warned = True + print_warning("Problematic keybindings detected:") + for keybinding in problematic_keybindings: + print_warning(" %s" % keybinding) + print_warning("These keybindings may conflict with vimode.") + print_warning("You can remove problematic key bindings and add" + " recommended ones by using /vimode bind_keys, or only" + " list them with /vimode bind_keys --list") + print_warning("For help, see: %s" % FAQ_KEYBINDINGS) + del problematic_keybindings + # Warn tmux/screen users about possible Esc detection delays. + if "STY" in os.environ or "TMUX" in os.environ: + if user_warned: + weechat.prnt("", "") + user_warned = True + print_warning("tmux/screen users, see: %s" % FAQ_ESC) + if (user_warned and not + weechat.config_string_to_boolean(vimode_settings['no_warn'])): + if user_warned: + weechat.prnt("", "") + print_warning("To force disable warnings, you can set" + " plugins.var.python.vimode.no_warn to 'on'") + + +# Main script. +# ============ + +if __name__ == "__main__": + weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, + SCRIPT_LICENSE, SCRIPT_DESC, "", "") + # Warn the user if he's using an unsupported WeeChat version. + VERSION = weechat.info_get("version_number", "") + if int(VERSION) < 0x01000000: + print_warning("Please upgrade to WeeChat ≥ 1.0.0. Previous versions" + " are not supported.") + # Set up script options. + for option, value in list(vimode_settings.items()): + if weechat.config_is_set_plugin(option): + vimode_settings[option] = weechat.config_get_plugin(option) + else: + weechat.config_set_plugin(option, value[0]) + vimode_settings[option] = value[0] + weechat.config_set_desc_plugin(option, + "%s (default: \"%s\")" % (value[1], + value[0])) + load_user_mappings() + load_mode_colors() + # Warn the user about possible problems if necessary. + if not weechat.config_string_to_boolean(vimode_settings['no_warn']): + check_warnings() + # Create bar items and setup hooks. + weechat.bar_item_new("mode_indicator", "cb_mode_indicator", "") + weechat.bar_item_new("cmd_completion", "cb_cmd_completion", "") + weechat.bar_item_new("vi_buffer", "cb_vi_buffer", "") + weechat.bar_item_new("line_numbers", "cb_line_numbers", "") + if int(VERSION) >= 0x02090000: + weechat.bar_new("vi_line_numbers", "on", "0", "window", "", "left", + "vertical", "vertical", "0", "0", "default", "default", + "default", "default", "0", "line_numbers") + else: + weechat.bar_new("vi_line_numbers", "on", "0", "window", "", "left", + "vertical", "vertical", "0", "0", "default", "default", + "default", "0", "line_numbers") + weechat.hook_config("plugins.var.python.%s.*" % SCRIPT_NAME, "cb_config", + "") + weechat.hook_signal("key_pressed", "cb_key_pressed", "") + weechat.hook_signal("key_combo_default", "cb_key_combo_default", "") + weechat.hook_signal("key_combo_search", "cb_key_combo_search", "") + weechat.hook_signal("buffer_switch", "cb_update_line_numbers", "") + weechat.hook_command("vimode", SCRIPT_DESC, "[help | bind_keys [--list]]", + " help: show help\n" + "bind_keys: unbind problematic keys, and bind" + " recommended keys to use in WeeChat\n" + " --list: only list changes", + "help || bind_keys |--list", + "cb_vimode_cmd", "") + weechat.hook_command("vimode_go_to_normal", + ("This command can be used for key bindings to go to " + "normal mode."), + "", "", "", "cb_vimode_go_to_normal", "") + # Remove obsolete bar. + vi_cmd_bar = weechat.bar_search("vi_cmd") + weechat.bar_remove(vi_cmd_bar) diff --git a/.vimrc b/.vimrc index 9ceae41..21dd399 100644 --- a/.vimrc +++ b/.vimrc @@ -13,6 +13,8 @@ syntax on " Theme set t_Co=256 colorscheme nighted +" Transparent background +hi Normal guibg=NONE ctermbg=NONE " Misc let &titlestring = "Vim " . expand("%:t") . " @ " . hostname()