;▼---------------------AutoHotKey for Inkscape---------------------▼
;
;  Inkscapeが起動していなければ起動(あらかじめ環境変数PATHにInkscapeのパスを通しておく)
;下記の例はInkscapeは C:\Inkscapeにインストールしてあり、作業ディレクトリもC:\Inkscapeです。
;タイトルバーの文字にマッチする書き方をしているので、Inkscapeのバージョンによってはこれらが
;微妙に異なり、動作しない場合があります。
;;IfWinActive, Layers (Shift+Ctrl+L)		;<- Lang=enで起動したときのパレットタイトル
;IfWinActive, レイヤー(S) (Shift+Ctrl+L)	;<- 通常の日本語環境でのパレットタイトル
 
;  UWSCが起動したらAutoHotKeyはサスペンドモードに(監視タイミングは100ms)。
;なのでUWSCが常駐モードで起動している環境下では動作しません。
;UWSCのスクリプトが終了したら自動的にサスペンド解除します。
;※サスペンド中はすべてのキーリマップが無効になります。

;  Pauseキーでサスペンド(トグル)しますが、この書き方ではもしサスペンド中にUWSCのスクリプト
;を実行した場合、UWSCのプロセス終了時にサスペンドは解除されます。
;現在使用中のツールは判断できないため、テキストツール使用時はサスペンド必須です。

;Layersパレットがアクティブなとき、右Ctrlキーを押すとメインウィンドウがアクティブになります。
;(LayersパレットがアクティブなときCtrl+Aでrootに入ってしまうのを抑止)
;「保存するファイルを選択」表示中もサスペンドし、同ダイアログが存在しなくなればサスペンド解除。
;「XML Editor」がアクティブなときもサスペンドする。非アクティブになればサスペンド解除。



SetTitleMatchMode, 2
Process, Exist, inkscape.exe
If ErrorLevel<>0
	WinActivate, ahk_pid %ErrorLevel%
else{
	EnvSet, PATH, %PATH%
	Run, inkscape.exe, C:\Inkscape
	;Run, lang_en.bat, C:\Inkscape
	;WinWaitActive, New document 1 - Inkscape
	WinWaitActive, 新規ドキュメント 1 - Inkscape
	;WinClose, C:\WINDOWS\system32\cmd.exe
}
ErrorLevel=
Loop{
	Sleep, 100
	Process, Exist, UWSC.exe
	If ErrorLevel<>0
	{
		Suspend, On
		Process, WaitClose, UWSC.exe
		Sleep, 40
		Suspend, Off
	}
	GetKeyState, kb1, RCtrl, P
	If (kb1=="D")
	{
		;IfWinActive, Layers (Shift+Ctrl+L)
		IfWinActive, レイヤー(S) (Shift+Ctrl+L)
			WinActivate,  - Inkscape
		GetKeyState, kb1, RCtrl, P
		GetKeyState, kb2, a, P
		if ((kb1=="D") && (kb2=="D"))
		{
			SendMode Input
			Send, {F1}>^a
			Sleep, 40
		}
	}
	;IfWinActive, XML Editor (Shift+Ctrl+X)
	IfWinActive, XMLエディタ(X) (Shift+Ctrl+X)
	{
		Suspend, On
		Sleep, 1000
		;IfWinNotActive, XML Editor (Shift+Ctrl+X)
		IfWinNotActive, XMLエディタ(X) (Shift+Ctrl+X)
		Suspend, Off
	}
	;IfWinActive, Select file to save to
	IfWinActive, 保存するファイルを選択
	{
		Suspend, On
		Sleep, 1000
		;IfWinNotExist, Select file to save to
		IfWinNotExist, 保存するファイルを選択
		Suspend, Off
	}
	Process, Exist, inkscape.exe
	If ErrorLevel=0
		ExitApp		;Inkscapeが終了したらAutoHotKeyも終了する
}
Return

#IfWinActive ahk_class gdkWindowToplevel

;GTKアプリケーションがアクティブな時だけ以下のキーリマップを有効にする。
;よってテキストツール使用時やGimpがアクティブな時もこのリマップは有効になるので注意。
;※ZoomNext/ZoomPrevは .\share\keys\default.xmlの修正も必須
{
	Space::MButton			;Spaceキーをマウス中ボタン(手のひらツール)
	vk1Dsc07B & x::send, +@		;ZoomNext<shift+`>
	vk1Dsc07B & z::send, ~		;ZoomPrev<~>
	vk1Dsc07B & Space::send, {Space}	;Spaceを入力する場合、無変換キーも一緒に押す。

	;単独キーリマップは装飾キーコンビネーションにも影響する。
	;↓この場合[f]=[n ノードツール]、[c]=[b ベジェツール]
	f::n
	c::b
	
	;[f]が[n]として認識されるためCtrl+fでは[Ctrl+n]が送信され新規作成となる。
	;同じくCtrl+cでは[Ctrl+b]が送信される。
	;なので、[c]や[f]を使うショートカットをデフォルトのキーで操作したいものについては
	;同じキーでリマップする必要がある。
	;リマップキー(左辺::)の装飾キーは左右どっちなのか指定しないと期待した動作にならない。
	>^f::^f
	>^c::^c
	<+c::+c
	vk1Dsc07B & c::send, ^c		;無変換+Cでもコピーできるようにする。
	;>+>^v::+^v			;これはNG. 左辺に3つ以上のキーは指定できない。
	vk1Dsc07B & v::send, +^v	;無変換+Vでペーストできるようにする。
	vk1Dsc07B & s::send, !e{z 2}	;無変換+Sでサイズをペースト
	>^v::^!v			;右Ctrl+Vで同じ場所にペースト
	<^v::^!v			;左Ctrl+Vでスタイルをペースト
	vkF0sc03A::F12			;CapsLockキーでパレットhide/showトグル
	Numpad1::1			;NumLockがOnのときNumキーを数字キーと同じ扱いにする
	Numpad2::2			;つまり方向キーとして動作するのを抑止する
	Numpad3::3
	Numpad4::4
	Numpad6::6
	Numpad8::8
	vk1Dsc07B & p::send, !c{up 3}{right}{up 3}{enter}	;無変換+PでPerspective
	vk1Dsc07B & o::send, !c{up 5}{right}{down}{enter}	;無変換+OでExtrude(押し出し)
}
Return					;複数キーリマップする場合はReturn必須。

#IfWinActive
{
	<#q::Reload			;左ミ田+Qで無条件でスクリプトをリロード
	Pause::Suspend, Toggle		;PauseキーでサスペンドモードOn/Offトグル
					;(テキストツール使用時サスペンド必須)
}
Return					;リマップするキーが1つだけならReturnは不要。

;▲---------------------AutoHotKey ここまで---------------------▲


※XML Editorのタイトルバーの文字列は開いたファイルによって異なるため、
 SetTitleMatchMode, 2 が必要だが、これを省略して(省略時は SetTitleMatchMode, 1 = 前方一致)
 XML Editorを使うときだけSuspendした方がAutoHotKeyのパフォーマンスが上がる。
 (当然そのあとSuspend解除しなければキーリマップは有効にならない)

※バッチファイルを用意してInkscapeを起動する場合、バッチをinkscape.exeと同じ場所に置き
 記述は以下のようにする(同じくInkscapeは C:\Inkscapeにインストールされているものとする)

@ECHO OFF
set PATH=C:\Inkscape;C:\Inkscape\python;C:\Potrace
set TEMP=C:\Temp
set LANG=en
inkscape %1

※日本語環境で起動する場合はset LANG=enは不要。
 既に各アプリケーションのPATHを通してあればバッチ側でset PATHする必要はないが、
 その場合 EnvSet, PATH, %PATH% は必須。バッチ側でset PATHすればEnvSetは不要。
 ↑のバッチの記述ではGimpを使用する拡張が動作しないので必要であればそれらのパスを追加する。
    

英語環境で起動してもUIの文字が英語になるだけで、日本語フォントを扱える(認識できるフォントのみ)
LANG=enで起動すると、なにかと嵩張りがちなダイアログを一まわり小さくできる利点もある。
(そのためだけに僕は常にLANG=enで起動してます ^^;)

バッチから起動すると、Inkscapeを終了するまでコンソールウィンドウ(Dos窓)が表示されたままになるが、
Inkscapeが起動すればコンソールは手動で閉じても問題ない。
.ahkに WinClose, C:\WINDOWS\system32\cmd.exe と書いておけばinkscape起動後にコンソールは自動で
閉じられる。