[Mono-winforms-list] Introduction, patching, canonization, roadmap.

Yrjana Rankka ghard@openlinksw.com
21 Mar 2003 13:01:06 +0100


--=-+/vxZMv541PT+uC3Y/WM
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 8bit

Hello!

Our company is willing to contribute code to the SWF project. 
We hope to be able to draw in support from other commercial entities. 
Initially we have assigned one developer, Vladimir Kaluzhny
(vkaluzhny@openlinksw.co.uk ), more or less full-time for this. He has
extensive experience in working with native Win32 API as well as other
GUI toolkits. My bosses have tasked me to act as a liaison between
our developer team and this project.

To make patching a bit less laborious process, I'd like to discuss
things regarding encoding in files stored in the CVS.

Right now I see mixed use of DOS-style CR/LF linefeeds and Unix-style.
Do you think it possible to switch to using one of these exclusively?

Another thing that we've discussed with Miguel is about establishing
some kind of roadmap, prioritizing chunks of functionality with app
development requirements in mind. Each milestone producing a test
application with a specified set of controls.

We'll be going for Application and ApplicationContext classes first.

I attach a diff with some fixes done by Vlad. His notes:

Button.cs
CreateParams property
1. Removed  the variable name duplication
2. Commented the part of code, which still is not working.
3. Removed the creation of instance of  ControlNativeWindow class .
 
Control.cs
CreateParams property
1. Designate  the ClassName field  with right value. (not constant)
2. Commented  the part of code which is incorrect
3. Commented the part of code, which still is not working.
 
Form.cs
CreateHandle()
1. Added the class registration code
 
NativeWindow.cs
CreateHandle()
1. Removed class registration code as it is only required of windows.
 
ScrollableControl.cs
CreateParams property
1. Removed the class registration code
2.  Designate  the createParams.Caption and  createParams.ClassName
    fields  with right value. (not constant)
 
TextBox.cs
CreateParams property
1. Removed the creation of instance of  ControlNativeWindow class .


Best regards,

Yrjänä


-- 
Yrjana Rankka                      //  ghard@openlinksw.com
Developer                          //  http://www.openlinksw.com
OpenLink Software Ltd              //
ODBC, XML & E-Business Infrastructure Technology Providers

--=-+/vxZMv541PT+uC3Y/WM
Content-Disposition: attachment; filename=winforms.diff
Content-Type: text/x-patch; name=winforms.diff; charset=ISO-8859-15
Content-Transfer-Encoding: quoted-printable

Index: Button.cs
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mono/mcs/class/System.Windows.Forms/System.Windows.Forms/Button.=
cs,v
retrieving revision 1.15
diff -u -r1.15 Button.cs
--- Button.cs	10 Mar 2003 21:06:34 -0000	1.15
+++ Button.cs	21 Mar 2003 10:43:43 -0000
@@ -38,11 +38,8 @@
 			get {
 				// This is a child control, so it must have a parent for creation
 				if( Parent !=3D null) {
-					CreateParams createParams =3D new CreateParams ();
-					// CHECKME: here we must not overwrite window
-					if( window =3D=3D null) {
-						window =3D new ControlNativeWindow (this);
-					}
+					/* there was  variable name duplication - we have it as member of par=
ent class. vkaluzhny@openlinksw.co.uk */
+					createParams =3D new CreateParams ();
=20
 					createParams.Caption =3D Text;
 					createParams.ClassName =3D "BUTTON";
@@ -58,10 +55,11 @@
 						WindowStyles.WS_CHILD |=20
 						WindowStyles.WS_VISIBLE |
 						WindowStyles.WS_CLIPSIBLINGS );
-					if(FlatStyle !=3D FlatStyle.System) {
-						createParams.Style |=3D (int) ButtonStyles.BS_OWNERDRAW;
-					}
-					createParams.Style |=3D (int)Win32.ContentAlignment2SystemButtonStyle=
(TextAlign);
+					//if(FlatStyle !=3D FlatStyle.System) {
+					//	createParams.Style |=3D (int) ButtonStyles.BS_OWNERDRAW;
+					//}
+					//createParams.Style |=3D (int)Win32.ContentAlignment2SystemButtonSty=
le(TextAlign);
+
 					// CHECKME : this call is commented because (IMHO) Control.CreateHand=
le suppose to do this
 					// and this function is CreateParams, not CreateHandle
 					// window.CreateHandle (createParams);
@@ -278,8 +276,7 @@
 					DRAWITEMSTRUCT dis =3D new DRAWITEMSTRUCT();
 					dis =3D (DRAWITEMSTRUCT)Marshal.PtrToStructure(m.LParam, dis.GetType(=
));
 					Rectangle	rect =3D new Rectangle(dis.rcItem.left, dis.rcItem.top, dis=
.rcItem.right - dis.rcItem.left, dis.rcItem.bottom - dis.rcItem.top);
-					DrawItemEventArgs args =3D new DrawItemEventArgs(Graphics.FromHdc(dis=
.hDC), Font,
-						rect, dis.itemID, (DrawItemState)dis.itemState);
+					DrawItemEventArgs args =3D new DrawItemEventArgs(Graphics.FromHdc(dis=
.hDC), Font,=0D	rect, dis.itemID, (DrawItemState)dis.itemState);
 					OnDrawItem( args);
 					//Marshal.StructureToPtr(dis, m.LParam, false);
 					m.Result =3D (IntPtr)1;
Index: ComboBox.cs
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mono/mcs/class/System.Windows.Forms/System.Windows.Forms/ComboBo=
x.cs,v
retrieving revision 1.21
diff -u -r1.21 ComboBox.cs
--- ComboBox.cs	1 Mar 2003 21:20:31 -0000	1.21
+++ ComboBox.cs	21 Mar 2003 10:43:44 -0000
@@ -707,9 +707,10 @@
 					DRAWITEMSTRUCT dis =3D new DRAWITEMSTRUCT();
 					dis =3D (DRAWITEMSTRUCT)Marshal.PtrToStructure(m.LParam, dis.GetType(=
));
 					Rectangle	rect =3D new Rectangle(dis.rcItem.left, dis.rcItem.top, dis=
.rcItem.right - dis.rcItem.left, dis.rcItem.bottom - dis.rcItem.top);
-					DrawItemEventArgs args =3D new DrawItemEventArgs(Graphics.FromHdc(dis=
.hDC), Font,
-						rect, dis.itemID, (DrawItemState)dis.itemState);
-					OnDrawItem( args);
+				=09
+					DrawItemEventArgs args =3D new DrawItemEventArgs (Graphics.FromHdc (d=
is.hDC), Font, rect, dis.itemID, (DrawItemState) dis.itemState);
+					OnDrawItem (args);
+				=09
 					//Marshal.StructureToPtr(dis, m.LParam, false);
 					m.Result =3D (IntPtr)1;
 				}
Index: Control.cs
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mono/mcs/class/System.Windows.Forms/System.Windows.Forms/Control=
.cs,v
retrieving revision 1.30
diff -u -r1.30 Control.cs
--- Control.cs	20 Mar 2003 23:05:15 -0000	1.30
+++ Control.cs	21 Mar 2003 10:43:47 -0000
@@ -527,7 +527,7 @@
     			get {
   					CreateParams createParams =3D new CreateParams ();
   					createParams.Caption =3D Text;
-  					createParams.ClassName =3D "CONTROL";
+  					createParams.ClassName =3D Name;
   					createParams.X =3D Left;
   					createParams.Y =3D Top;
   					createParams.Width =3D Width;
@@ -1186,10 +1186,10 @@
 							controlsCollection.Add(Handle, this);
 						}
 						SubclassWindow();
-
-						CreatorThreadId_ =3D Win32.GetCurrentThreadId();
-
+						/* vkaluzhny@openlinksw.co.uk =3D FIXME!!!!
+						CreatorThreadId_ =3D Win32.GetCurrentThreadId(); */
 						OnHandleCreated (new EventArgs());
+
 					}
 				}
     		}
@@ -1546,8 +1546,8 @@
 				//if( font !=3D null) {
 				//	Win32.SendMessage( Handle, Msg.WM_SETFONT, font.ToHfont().ToInt32()=
, 0);
 				//}
-				Win32.SendMessage( Handle, Msg.WM_SETFONT, Font.ToHfont().ToInt32(), 0=
);
-				Win32.SetWindowText( Handle, text);
+				//Win32.SendMessage( Handle, Msg.WM_SETFONT, Font.ToHfont().ToInt32(),=
 0);
+				//Win32.SetWindowText( Handle, text);
=20
     			if (HandleCreated !=3D null)
     				HandleCreated (this, e);
Index: ControlPaint.cs
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mono/mcs/class/System.Windows.Forms/System.Windows.Forms/Control=
Paint.cs,v
retrieving revision 1.15
diff -u -r1.15 ControlPaint.cs
--- ControlPaint.cs	1 Mar 2003 21:20:31 -0000	1.15
+++ ControlPaint.cs	21 Mar 2003 10:43:47 -0000
@@ -209,6 +209,7 @@
 	=09
 		[MonoTODO]
 		public static void DrawBorder3D( Graphics graphics, Rectangle rectangle,=
 Border3DStyle Style, Border3DSide Sides) {
+		   =20
 			RECT rc =3D new RECT();
 			rc.left =3D rectangle.Left;
 			rc.top =3D rectangle.Top;
@@ -217,6 +218,7 @@
 			IntPtr hdc =3D graphics.GetHdc();
 			int res =3D Win32.DrawEdge( hdc, ref rc, Style, Sides);
 			graphics.ReleaseHdc(hdc);
+		=09
 		}
=20
 		[MonoTODO]
@@ -302,6 +304,7 @@
 			g.Dispose();
 			graphics.DrawImage(bmp, rectangle.X, rectangle.Y, rectangle.Width, rect=
angle.Height);
 			bmp.Dispose();
+		=09
 		}
 	=09
 		[MonoTODO]
Index: Form.cs
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mono/mcs/class/System.Windows.Forms/System.Windows.Forms/Form.cs=
,v
retrieving revision 1.31
diff -u -r1.31 Form.cs
--- Form.cs	20 Mar 2003 23:05:15 -0000	1.31
+++ Form.cs	21 Mar 2003 10:43:48 -0000
@@ -621,14 +621,26 @@
     			return base.CreateControlsInstance ();
     		}
    =20
-    		protected override void CreateHandle ()
-    		{
+    		protected override void CreateHandle () {
+
+                WNDCLASS wndClass =3D new WNDCLASS();
+
+                wndClass.style =3D CreateParams.ClassStyle;
+                wndClass.lpfnWndProc =3D NativeWindow.GetWindowProc();
+                wndClass.cbClsExtra =3D 0;
+                wndClass.cbWndExtra =3D CreateParams.ExStyle;
+                wndClass.hInstance =3D (IntPtr)0;
+                wndClass.hIcon =3D (IntPtr)0;
+                wndClass.hCursor =3D Win32.LoadCursor( (IntPtr)0, LC_.IDC_=
ARROW);
+                wndClass.hbrBackground =3D (IntPtr)((int)GetSysColorIndex.=
COLOR_BTNFACE + 1);
+                wndClass.lpszMenuName =3D "";
+                wndClass.lpszClassName =3D Name;
+
+                if (Win32.RegisterClass(ref wndClass) !=3D 0)
     			base.CreateHandle ();
-/*
- *	This is called in base class   =20
-    			if (IsHandleCreated)
-    				OnHandleCreated (new EventArgs());
-*/				=09
+                else
+                    throw new Exception("Cannot register class");
+
     		}
    =20
     		protected override void DefWndProc (ref Message m)
Index: ListBox.cs
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mono/mcs/class/System.Windows.Forms/System.Windows.Forms/ListBox=
.cs,v
retrieving revision 1.22
diff -u -r1.22 ListBox.cs
--- ListBox.cs	1 Mar 2003 21:20:31 -0000	1.22
+++ ListBox.cs	21 Mar 2003 10:43:49 -0000
@@ -530,9 +530,10 @@
 					DRAWITEMSTRUCT dis =3D new DRAWITEMSTRUCT();
 					dis =3D (DRAWITEMSTRUCT)Marshal.PtrToStructure(m.LParam, dis.GetType(=
));
 					Rectangle	rect =3D new Rectangle(dis.rcItem.left, dis.rcItem.top, dis=
.rcItem.right - dis.rcItem.left, dis.rcItem.bottom - dis.rcItem.top);
-					DrawItemEventArgs args =3D new DrawItemEventArgs(Graphics.FromHdc(dis=
.hDC), Font,
-						rect, dis.itemID, (DrawItemState)dis.itemState);
+				=09
+					DrawItemEventArgs args =3D new DrawItemEventArgs(Graphics.FromHdc(dis=
.hDC), Font,	rect, dis.itemID, (DrawItemState)dis.itemState);
 					OnDrawItem( args);
+				=09
 					//Marshal.StructureToPtr(dis, m.LParam, false);
 					m.Result =3D (IntPtr)1;
 					}
Index: NativeWindow.cs
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mono/mcs/class/System.Windows.Forms/System.Windows.Forms/NativeW=
indow.cs,v
retrieving revision 1.21
diff -u -r1.21 NativeWindow.cs
--- NativeWindow.cs	1 Mar 2003 21:20:31 -0000	1.21
+++ NativeWindow.cs	21 Mar 2003 10:43:50 -0000
@@ -24,7 +24,8 @@
 		// the window's HWND
 		private IntPtr windowHandle;
 		static private Hashtable windowCollection =3D new Hashtable ();
-		static bool registeredClass =3D false;
+		/* static bool registeredClass =3D false; vkaluzhny@openlinksw.co.uk */
+		private bool registeredClass =3D false;
 	=09
 		// Important!  If this variable was initialized and supplied to Windows =
API,
 		// we cannot *free* (GC) a delegate until all our windows destroyed, or =
better=20
@@ -67,36 +68,11 @@
 			windowCollection.Add (windowHandle, this);
 			OnHandleChange ();
 		}
-
 		public virtual void CreateHandle (CreateParams cp)=20
 		{
 			if( cp !=3D null ) {
 				IntPtr createdHWnd =3D (IntPtr) 0;
 				Object lpParam =3D new Object();
-
-				if (!registeredClass) {
-					WNDCLASS wndClass =3D new WNDCLASS();
-
-					wndClass.style =3D (int) (CS_.CS_OWNDC |
-						CS_.CS_VREDRAW |
-						CS_.CS_HREDRAW);
-					wndClass.lpfnWndProc =3D GetWindowProc();
-					wndClass.cbClsExtra =3D 0;
-					wndClass.cbWndExtra =3D 0;
-					wndClass.hInstance =3D (IntPtr)0;
-					wndClass.hIcon =3D (IntPtr)0;
-					wndClass.hCursor =3D Win32.LoadCursor( (IntPtr)0, LC_.IDC_ARROW);
-					wndClass.hbrBackground =3D (IntPtr)((int)GetSysColorIndex.COLOR_BTNFA=
CE + 1);
-					wndClass.lpszMenuName =3D "";
-					wndClass.lpszClassName =3D "mono_native_window";
-
-					if (Win32.RegisterClass(ref wndClass) !=3D 0) {
-						registeredClass =3D true;
-					} else {
-						windowHandle =3D (IntPtr)0;
-						return;
-					}
-				}
=20
 				windowHandle =3D Win32.CreateWindowEx (
 					(uint) cp.ExStyle, cp.ClassName,
Index: ScrollableControl.cs
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mono/mcs/class/System.Windows.Forms/System.Windows.Forms/Scrolla=
bleControl.cs,v
retrieving revision 1.16
diff -u -r1.16 ScrollableControl.cs
--- ScrollableControl.cs	1 Mar 2003 21:20:31 -0000	1.16
+++ ScrollableControl.cs	21 Mar 2003 10:43:50 -0000
@@ -90,38 +90,21 @@
=20
 		protected override CreateParams CreateParams {
 			get {
-				if (!classRegistered) {
-					WNDCLASS wndClass =3D new WNDCLASS();
-=20
-					wndClass.style =3D (int) (CS_.CS_OWNDC | CS_.CS_VREDRAW | CS_.CS_HRED=
RAW);
-					wndClass.lpfnWndProc =3D NativeWindow.GetWindowProc();
-					wndClass.cbClsExtra =3D 0;
-					wndClass.cbWndExtra =3D 0;
-					wndClass.hInstance =3D (IntPtr)0;
-					wndClass.hIcon =3D (IntPtr)0;
-					wndClass.hCursor =3D Win32.LoadCursor( (IntPtr)0, LC_.IDC_ARROW);
-					wndClass.hbrBackground =3D (IntPtr)((int)GetSysColorIndex.COLOR_BTNFA=
CE + 1);
-					wndClass.lpszMenuName =3D "";
-					wndClass.lpszClassName =3D "mono_scrollable_control";
-   =20
-					if (Win32.RegisterClass(ref wndClass) !=3D 0)=20
-						classRegistered =3D true;=20
-				}	=09
=20
 				CreateParams createParams =3D new CreateParams ();
-				createParams.Caption =3D "Hello World";
-				createParams.ClassName =3D "mono_scrollable_control";
+				createParams.Caption =3D Text;
+				createParams.ClassName =3D Name;
 				createParams.X =3D Left;
 				createParams.Y =3D Top;
 				createParams.Width =3D Width;
 				createParams.Height =3D Height;
-				createParams.ClassStyle =3D 0;
+				createParams.ClassStyle =3D  (int) (CS_.CS_OWNDC | CS_.CS_VREDRAW | CS=
_.CS_HREDRAW);
 				createParams.ExStyle =3D 0;
 				createParams.Param =3D 0;
   			=09
-				//if (parent !=3D null)
-				//	createParams.Parent =3D parent.Handle;
-				//else=20
+				if (parent !=3D null)
+					createParams.Parent =3D parent.Handle;
+				else
 				createParams.Parent =3D (IntPtr) 0;
 	 =20
 				createParams.Style =3D (int) (WindowStyles.WS_OVERLAPPEDWINDOW);
Index: TextBox.cs
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mono/mcs/class/System.Windows.Forms/System.Windows.Forms/TextBox=
.cs,v
retrieving revision 1.11
diff -u -r1.11 TextBox.cs
--- TextBox.cs	6 Feb 2003 03:45:10 -0000	1.11
+++ TextBox.cs	21 Mar 2003 10:43:50 -0000
@@ -96,9 +96,6 @@
 			get {
 				if( Parent !=3D null) {
 					CreateParams createParams =3D new CreateParams ();
-					if (window =3D=3D null) {
-						window =3D new ControlNativeWindow (this);
-					}
=20
 					createParams.Caption =3D Text;
 					createParams.ClassName =3D "EDIT";
@@ -113,6 +110,7 @@
 					createParams.Style =3D (int) (
 						WindowStyles.WS_CHILD |=20
 						WindowStyles.WS_VISIBLE);
+				=09
 					return createParams;
 				}
 				return null;
Index: makefile
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /mono/mcs/class/System.Windows.Forms/System.Windows.Forms/makefil=
e,v
retrieving revision 1.22
diff -u -r1.22 makefile
--- makefile	18 Mar 2003 22:03:38 -0000	1.22
+++ makefile	21 Mar 2003 10:43:51 -0000
@@ -2,7 +2,7 @@
 X11R6_INCLUDE=3D/usr/X11R6/include
 WINE_INCLUDE=3D/usr/include/wine
 WINDOWS_INCLUDE=3D/usr/local/include/wine/windows
-WINE_LIB=3D/usr/lib/wine
+WINE_LIB=3D/usr/local/lib/wine
 GLIB20_CFLAGS=3D`pkg-config --cflags glib-2.0` `pkg-config --cflags gmodul=
e-2.0`
 GLIB20_LIBS=3D`pkg-config --libs glib-2.0` `pkg-config --libs gmodule-2.0`
 MONO_CFLAGS=3D`pkg-config --cflags mono`

--=-+/vxZMv541PT+uC3Y/WM--