_ [debian] sylpheed 2.1.999+2.2.0beta6-0vd1

作成。

_ [comp] .NET vs Mono 1.1.13.1

とある .NET アプリが Mono ではクラッシュしてしまうのでいろいろ調べてみる。その .NET アプリはソースがないので、そのアプリ自体のバグのせいでクラッシュしているとしても、Mono 側に手を入れてインチキすることにした。 まずウィンドウ自体が開かずにクラッシュ。

Unhandled Exception: System.Exception: Value '-91' must be greater than or equal to 0.
in <0x000a0> System.Windows.Forms.ScrollBar:set_LargeChange (Int32 value)

とりあえず mono-1.1.13.1/mcs/class/Managed.Windows.Forms/System.Windows.Forms/ScrollBar.cs の LargeChange で、value が 0 未満なら例外を投げるのではなく value を既定値の 10 にセットすることにした(.NET Framework クラス ライブラリ ScrollBar.LargeChange プロパティ)。これを潰してもまだウィンドウ自体が開かずにクラッシュ。

Unhandled Exception: System.Exception: Value '-9' must be greater than or equal to 0.
in <0x0009e> System.Windows.Forms.ScrollBar:set_SmallChange (Int32 value)

同様に value に既定値の 1 をセット(.NET Framework クラス ライブラリ ScrollBar.SmallChange プロパティ)。 ひとまずウィンドウは開くようになったけど、今度はファイルダイアログを開こうとするとクラッシュ。

Unhandled Exception: System.ArgumentNullException: Argument cannot be null.
Parameter name: path
in <0x0006b> System.IO.FileSystemInfo:CheckPath (System.String path)
in <0x00025> System.IO.DirectoryInfo:.ctor (System.String path)
in (wrapper remoting-invoke-with-check) System.IO.DirectoryInfo:.ctor (string)
in <0x00035> System.Windows.Forms.DirComboBox:CheckChildOf ()
in <0x001ae> System.Windows.Forms.DirComboBox:CreateComboList ()
in <0x00020> System.Windows.Forms.DirComboBox:set_CurrentPath (System.String value)
in (wrapper remoting-invoke-with-check) System.Windows.Forms.DirComboBox:set_CurrentPath (string)
in <0x0002e> System.Windows.Forms.FileDialog+FileDialogPanel:ChangeDirectory (System.Object sender, System.String path_or_special_case)
in (wrapper remoting-invoke-with-check) FileDialogPanel:ChangeDirectory (object,string)
in <0x00021> System.Windows.Forms.FileDialog:set_InitialDirectory (System.String value)
in (wrapper remoting-invoke-with-check) System.Windows.Forms.FileDialog:set_InitialDirectory (string)

mono-1.1.13.1/mcs/class/Managed.Windows.Forms/System.Windows.Forms/FileDialog.cs の InitialDirectory で、value が null ならば value に “.” (カレントディレクトリ) をセットするようにした。 ファイルダイアログは開けるようになったけど、開いた直後にクラッシュすることがある。ウィンドウにフォーカスを当てていると駄目なようだ。

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object
in <0x00009> System.Windows.Forms.Document+Marker:op_LessThan (Marker lhs, Marker rhs)
in <0x001af> System.Windows.Forms.Document:SetSelectionToCaret (Boolean start)
in <0x000a7> System.Windows.Forms.TextBoxBase:TextBoxBase_MouseUp (System.Object sender, System.Windows.Forms.MouseEventArgs e)

mono-1.1.13.1/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextBoxBase.cs の TextBoxBase_MouseUp から mono-1.1.13.1/mcs/class/Managed.Windows.Forms/System.Windows.Forms/TextControl.cs の SetSelectionToCaret は false つきで呼ばれている。selection_anchor.line が null ならば selection_anchor.line に caret.line をセットするようにした。 ファイルダイアログからファイルを保存しようとすると、ファイル名をつけられない。例えばファイルタイプ「.txt」の状態でファイル名に「hoge」または「hoge.txt」とつけて保存しようとしても、「.txt」というファイルに保存されてしまう。ファイル一覧から選んで上書きするには問題ないが、エントリに入力したファイル名は取得されていないようだ。なんかよくわからないので、保存する前に手動で touch してそれに上書きするようにした。

_ [debian] mono 1.1.13.1-1vd1

上記 workaround patch の vd_mono-1.1.13.1_dirty-workaround.patch を当てて作成。

_ [debian] rxvt-unicode 7.3a-0vd1

×問題対策インチキパッチ vd_rxvt-unicode_latin1-supplement-partly_double-width_encoding-jp.patch を当てて作成。