use MOONLIGHT symbol
[mcs.git] / class / Managed.Windows.Forms / System.Windows.Forms.VisualStyles / GtkPlus.cs
blob878a700ed4f232adf058134f6af2afa2ec099442
1 //
2 // GtkPlus.cs: Wraps GTK+, exposing its control painting features to code
3 // that uses System.Drawing types (such as IDeviceContext, Rectangle).
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining
6 // a copy of this software and associated documentation files (the
7 // "Software"), to deal in the Software without restriction, including
8 // without limitation the rights to use, copy, modify, merge, publish,
9 // distribute, sublicense, and/or sell copies of the Software, and to
10 // permit persons to whom the Software is furnished to do so, subject to
11 // the following conditions:
12 //
13 // The above copyright notice and this permission notice shall be
14 // included in all copies or substantial portions of the Software.
15 //
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 // Copyright (c) 2008 George Giolfan
26 // Authors:
27 // George Giolfan (georgegiolfan@yahoo.com)
30 using gpointer = System.IntPtr;
31 using gboolean = System.Boolean;
32 using gint = System.Int32;
33 using guint = System.UInt32;
34 using guint8 = System.Byte;
35 using guint16 = System.UInt16;
36 using guint32 = System.UInt32;
37 using gfloat = System.Single;
38 using gdouble = System.Double;
40 using PangoFontDescriptionPointer = System.IntPtr;
42 using GDataPointer = System.IntPtr;
43 using GObjectPointer = System.IntPtr;
44 using GSListPointer = System.IntPtr;
45 using GType = System.IntPtr;
46 using GTypeClassPointer = System.IntPtr;
47 using GTypeInstancePointer = System.IntPtr;
49 using GdkColormapPointer = System.IntPtr;
50 using GdkDrawablePointer = System.IntPtr;
51 using GdkGCPointer = System.IntPtr;
52 using GdkNativeWindowPointer = System.IntPtr;
53 using GdkPixbufPointer = System.IntPtr;
54 using GdkPixmapPointer = System.IntPtr;
55 using GdkWindowPointer = System.IntPtr;
57 using GtkAdjustmentPointer = System.IntPtr;
58 using GtkBinPointer = System.IntPtr;
59 using GtkContainerPointer = System.IntPtr;
60 using GtkObjectPointer = System.IntPtr;
61 using GtkStylePointer = System.IntPtr;
62 using GtkToolbarPointer = System.IntPtr;
63 using GtkToolItemPointer = System.IntPtr;
64 using GtkTreeViewPointer = System.IntPtr;
65 using GtkTreeViewColumnPointer = System.IntPtr;
66 using GtkWidgetPointer = System.IntPtr;
67 using GtkWindowPointer = System.IntPtr;
69 using GtkAllocation = System.Windows.Forms.VisualStyles.GtkPlus.GdkRectangle;
70 using GInitiallyUnowned = System.Windows.Forms.VisualStyles.GtkPlus.GObject;
72 using System.Collections;
73 using System.Drawing;
74 using System.Drawing.Imaging;
75 using System.Reflection;
76 using System.Reflection.Emit;
77 using System.Runtime.CompilerServices;
78 using System.Runtime.InteropServices;
80 namespace System.Windows.Forms.VisualStyles
82 /// <summary>
83 /// </summary>
84 /// <remarks>
85 /// Inspired by ThemeGtk and QGtkStyle (http://labs.trolltech.com/page/Projects/Styles/GtkStyle). Tries to use the exact GTK+ logic in order to be compatible with all its themes.
86 /// </remarks>
87 class GtkPlus
89 #region Instance
90 static GtkPlus instance;
91 public static GtkPlus Instance {
92 get { return instance; }
94 #endregion
95 #region GTK+ initialization
96 public static bool Initialize ()
98 try {
99 if (gtk_check_version (2, 10, 0) != IntPtr.Zero)
100 return false;
101 //TODO: If we need to pass the actual arguments, duplicate the required code from GTK#.
102 int argc = 0;
103 string [] argv = new string [1];
104 bool result = gtk_init_check (ref argc, ref argv);
105 if (result)
106 instance = new GtkPlus ();
107 return result;
108 } catch (DllNotFoundException) {
109 return false;
112 #endregion
114 #region Fields
115 readonly int WidgetTypeCount = Enum.GetNames (typeof (WidgetType)).Length;
116 readonly GtkWidgetPointer [] widgets;
117 readonly GtkWidgetPointer window;
118 readonly GtkWidgetPointer @fixed;
119 readonly GtkStylePointer [] styles;
120 #region ComboBox
121 #if NET_2_0
122 readonly GtkWidgetPointer combo_box_drop_down_toggle_button;
123 readonly GtkWidgetPointer combo_box_drop_down_arrow;
124 GtkStylePointer combo_box_drop_down_toggle_button_style;
125 GtkStylePointer combo_box_drop_down_arrow_style;
126 #endif
127 #endregion
128 #region ToolBar
129 readonly GtkWidgetPointer tool_bar_button;
130 readonly GtkWidgetPointer tool_bar_toggle_button;
131 GtkStylePointer tool_bar_button_style;
132 GtkStylePointer tool_bar_toggle_button_style;
133 #endregion
134 #region TreeView
135 readonly GtkTreeViewColumnPointer tree_view_column;
136 readonly GtkWidgetPointer tree_view_column_button;
137 GtkStylePointer tree_view_column_button_style;
138 #endregion
139 #region Painters
140 readonly ButtonPainter button_painter = new ButtonPainter ();
141 readonly CheckBoxPainter check_box_painter = new CheckBoxPainter ();
142 readonly RadioButtonPainter radio_button_painter = new RadioButtonPainter ();
143 #region ComboBox
144 #if NET_2_0
145 readonly ComboBoxDropDownButtonPainter combo_box_drop_down_button_painter = new ComboBoxDropDownButtonPainter ();
146 readonly ComboBoxBorderPainter combo_box_border_painter = new ComboBoxBorderPainter ();
147 #endif
148 #endregion
149 #region GroupBox
150 readonly GroupBoxPainter group_box_painter = new GroupBoxPainter ();
151 #endregion
152 #region Header
153 readonly HeaderPainter header_painter = new HeaderPainter ();
154 #endregion
155 #region ProgressBar
156 readonly ProgressBarBarPainter progress_bar_bar_painter = new ProgressBarBarPainter ();
157 readonly ProgressBarChunkPainter progress_bar_chunk_painter = new ProgressBarChunkPainter ();
158 #endregion
159 #region ScrollBar
160 readonly ScrollBarArrowButtonPainter scroll_bar_arrow_button_painter = new ScrollBarArrowButtonPainter ();
161 readonly ScrollBarThumbButtonPainter scroll_bar_thumb_button_painter = new ScrollBarThumbButtonPainter ();
162 readonly ScrollBarTrackPainter scroll_bar_track_painter = new ScrollBarTrackPainter ();
163 #endregion
164 #region StatusBar
165 readonly StatusBarGripperPainter status_bar_gripper_painter = new StatusBarGripperPainter ();
166 #endregion
167 #region TabControl
168 readonly TabControlPanePainter tab_control_pane_painter = new TabControlPanePainter ();
169 readonly TabControlTabItemPainter tab_control_tab_item_painter = new TabControlTabItemPainter ();
170 #endregion
171 readonly TextBoxPainter text_box_painter = new TextBoxPainter ();
172 #region ToolBar
173 readonly ToolBarPainter tool_bar_painter = new ToolBarPainter ();
174 readonly ToolBarButtonPainter tool_bar_button_painter = new ToolBarButtonPainter ();
175 readonly ToolBarCheckedButtonPainter tool_bar_checked_button_painter = new ToolBarCheckedButtonPainter ();
176 #endregion
177 #region TrackBar
178 readonly TrackBarTrackPainter track_bar_track_painter = new TrackBarTrackPainter ();
179 readonly TrackBarThumbPainter track_bar_thumb_painter = new TrackBarThumbPainter ();
180 #endregion
181 readonly TreeViewGlyphPainter tree_view_glyph_painter = new TreeViewGlyphPainter ();
182 readonly UpDownPainter up_down_painter = new UpDownPainter ();
183 #endregion
184 #endregion
185 #region Constructor and finalizer
186 protected GtkPlus ()
188 widgets = new GtkWidgetPointer [WidgetTypeCount];
189 styles = new GtkStylePointer [WidgetTypeCount];
190 window = gtk_window_new (GtkWindowType.GTK_WINDOW_TOPLEVEL);
191 @fixed = gtk_fixed_new ();
192 gtk_container_add (window, @fixed);
193 #region Widget types
194 #region Button
195 gtk_container_add (@fixed, widgets [(int)WidgetType.Button] = gtk_button_new ());
196 GTK_WIDGET_SET_FLAGS (widgets [(int)WidgetType.Button], GtkWidgetFlags.GTK_CAN_DEFAULT);
197 #endregion
198 #region CheckBox
199 gtk_container_add (@fixed, widgets [(int)WidgetType.CheckBox] = gtk_check_button_new ());
200 #endregion
201 #region ComboBox
202 #if NET_2_0
203 gtk_container_add (@fixed, widgets [(int)WidgetType.ComboBox] = gtk_combo_box_entry_new ());
204 gtk_widget_realize (widgets [(int)WidgetType.ComboBox]);
205 combo_box_drop_down_toggle_button = GetFirstChildWidgetOfType.Get (widgets [(int)WidgetType.ComboBox], gtk_toggle_button_get_type ());
206 gtk_widget_realize (combo_box_drop_down_toggle_button);
207 combo_box_drop_down_arrow = GetFirstChildWidgetOfType.Get (combo_box_drop_down_toggle_button, gtk_arrow_get_type ());
208 g_object_ref (combo_box_drop_down_toggle_button_style = GetWidgetStyle (combo_box_drop_down_toggle_button));
209 g_object_ref (combo_box_drop_down_arrow_style = GetWidgetStyle (combo_box_drop_down_arrow));
210 #endif
211 #endregion
212 #region GroupBox
213 gtk_container_add (@fixed, widgets [(int)WidgetType.GroupBox] = gtk_frame_new (null));
214 #endregion
215 #region ProgressBar
216 gtk_container_add (@fixed, widgets [(int)WidgetType.ProgressBar] = gtk_progress_bar_new ());
217 #endregion
218 #region RadioButton
219 gtk_container_add (@fixed, widgets [(int)WidgetType.RadioButton] = gtk_radio_button_new (IntPtr.Zero));
220 #endregion
221 #region ScrollBar
222 gtk_container_add (@fixed, widgets [(int)WidgetType.HScrollBar] = gtk_hscrollbar_new (IntPtr.Zero));
223 gtk_container_add (@fixed, widgets [(int)WidgetType.VScrollBar] = gtk_vscrollbar_new (IntPtr.Zero));
224 #endregion
225 #region StatusBar
226 gtk_container_add (@fixed, widgets [(int)WidgetType.StatusBar] = gtk_statusbar_new ());
227 #endregion
228 #region TabControl
229 gtk_container_add (@fixed, widgets [(int)WidgetType.TabControl] = gtk_notebook_new ());
230 #endregion
231 #region TextBox
232 gtk_container_add (@fixed, widgets [(int)WidgetType.TextBox] = gtk_entry_new ());
233 #endregion
234 #region ToolBar
235 gtk_container_add (@fixed, widgets [(int)WidgetType.ToolBar] = gtk_toolbar_new ());
237 GtkToolItemPointer tool_button = gtk_tool_button_new (IntPtr.Zero, null);
238 gtk_toolbar_insert (widgets [(int)WidgetType.ToolBar], tool_button, -1);
239 tool_bar_button = gtk_bin_get_child (tool_button);
240 g_object_ref (tool_bar_button_style = GetWidgetStyle (tool_bar_button));
242 GtkToolItemPointer toggle_tool_button = gtk_toggle_tool_button_new ();
243 gtk_toolbar_insert (widgets [(int)WidgetType.ToolBar], toggle_tool_button, -1);
244 tool_bar_toggle_button = gtk_bin_get_child (toggle_tool_button);
245 g_object_ref (tool_bar_toggle_button_style = GetWidgetStyle (tool_bar_toggle_button));
246 #endregion
247 #region TrackBar
248 gtk_container_add (@fixed, widgets [(int)WidgetType.HorizontalTrackBar] = gtk_hscale_new_with_range (0, 1, 1));
249 gtk_container_add (@fixed, widgets [(int)WidgetType.VerticalTrackBar] = gtk_vscale_new_with_range (0, 1, 1));
250 #endregion
251 #region TreeView
252 gtk_container_add (@fixed, widgets [(int)WidgetType.TreeView] = gtk_tree_view_new ());
253 tree_view_column = gtk_tree_view_column_new ();
254 gtk_tree_view_insert_column (widgets [(int)WidgetType.TreeView], tree_view_column, -1);
255 GtkTreeViewColumn column_structure = (GtkTreeViewColumn)Marshal.PtrToStructure (tree_view_column, typeof (GtkTreeViewColumn));
256 tree_view_column_button = column_structure.button;
257 g_object_ref (tree_view_column_button_style = GetWidgetStyle (tree_view_column_button));
258 #endregion
259 #region UpDown
260 GtkAdjustmentPointer adjustment = gtk_adjustment_new (0, 0, 0, 0, 0, 0);
261 gtk_container_add (@fixed, widgets [(int)WidgetType.UpDown] = gtk_spin_button_new (adjustment, 0, 0));
262 #endregion
263 #endregion
264 for (int widget_index = 0; widget_index < WidgetTypeCount; widget_index++)
265 g_object_ref (styles [widget_index] = GetWidgetStyle (widgets [widget_index]));
267 ~GtkPlus ()
269 gtk_object_destroy (window);
270 for (int widget_index = 0; widget_index < WidgetTypeCount; widget_index++)
271 g_object_unref (styles [widget_index]);
272 #region ComboBox
273 #if NET_2_0
274 g_object_unref (combo_box_drop_down_toggle_button_style);
275 g_object_unref (combo_box_drop_down_arrow_style);
276 #endif
277 #endregion
278 #region ToolBar
279 g_object_unref (tool_bar_button_style);
280 g_object_unref (tool_bar_toggle_button_style);
281 #endregion
282 #region TreeView
283 g_object_unref (tree_view_column_button_style);
284 #endregion
286 #endregion
287 #region Controls
288 #region Button
289 public void ButtonPaint (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, bool @default, GtkPlusState state)
291 button_painter.Configure (@default, state);
292 Paint (WidgetType.Button, bounds, dc, clippingArea, button_painter);
294 #endregion
295 #region CheckBox
296 public void CheckBoxPaint (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, GtkPlusState state, GtkPlusToggleButtonValue value)
298 check_box_painter.Configure (state, value);
299 Paint (WidgetType.CheckBox, bounds, dc, clippingArea, check_box_painter);
301 Size GetGtkCheckButtonIndicatorSize (WidgetType widgetType)
303 int indicator_size = GetWidgetStyleInteger (widgets [(int)widgetType], "indicator-size");
304 return new Size (indicator_size, indicator_size);
306 public Size CheckBoxGetSize ()
308 return GetGtkCheckButtonIndicatorSize (WidgetType.CheckBox);
310 #endregion
311 #region ComboBox
312 #if NET_2_0
313 public void ComboBoxPaintDropDownButton (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, GtkPlusState state)
315 combo_box_drop_down_button_painter.Configure (state);
316 Paint (WidgetType.ComboBox, bounds, dc, clippingArea, combo_box_drop_down_button_painter);
318 public void ComboBoxPaintBorder (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea)
320 Paint (WidgetType.ComboBox, bounds, dc, clippingArea, combo_box_border_painter);
322 #endif
323 #endregion
324 #region GroupBox
325 public void GroupBoxPaint (IDeviceContext dc, Rectangle bounds, Rectangle excludedArea, GtkPlusState state)
327 group_box_painter.Configure (state);
328 PaintExcludingArea (WidgetType.GroupBox, bounds, dc, excludedArea, group_box_painter);
330 #endregion
331 #region Header
332 public void HeaderPaint (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, GtkPlusState state)
334 header_painter.Configure (state);
335 Paint (WidgetType.TreeView, bounds, dc, clippingArea, header_painter);
337 #endregion
338 #region ProgressBar
339 public void ProgressBarPaintBar (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea)
341 Paint (WidgetType.ProgressBar, bounds, dc, clippingArea, progress_bar_bar_painter);
343 public void ProgressBarPaintChunk (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea)
345 Paint (WidgetType.ProgressBar, bounds, dc, clippingArea, progress_bar_chunk_painter);
347 public Rectangle ProgressBarGetBackgroundContentRectagle (Rectangle bounds)
349 GtkStyle style = (GtkStyle)Marshal.PtrToStructure (gtk_widget_get_style (widgets [(int)WidgetType.ProgressBar]), typeof(GtkStyle));
350 bounds.Inflate (-style.xthickness, -style.ythickness);
351 return bounds;
353 #endregion
354 #region RadioButton
355 public void RadioButtonPaint (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, GtkPlusState state, GtkPlusToggleButtonValue value)
357 radio_button_painter.Configure (state, value);
358 Paint (WidgetType.RadioButton, bounds, dc, clippingArea, radio_button_painter);
360 public Size RadioButtonGetSize ()
362 return GetGtkCheckButtonIndicatorSize (WidgetType.RadioButton);
364 #endregion
365 #region ScrollBar
366 public void ScrollBarPaintArrowButton (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, GtkPlusState state, bool horizontal, bool upOrLeft)
368 scroll_bar_arrow_button_painter.Configure (state, horizontal, upOrLeft);
369 Paint (horizontal ? WidgetType.HScrollBar : WidgetType.VScrollBar, bounds, dc, clippingArea, scroll_bar_arrow_button_painter);
371 public void ScrollBarPaintThumbButton (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, GtkPlusState state, bool horizontal)
373 scroll_bar_thumb_button_painter.Configure (state, horizontal);
374 Paint (horizontal ? WidgetType.HScrollBar : WidgetType.VScrollBar, bounds, dc, clippingArea, scroll_bar_thumb_button_painter);
376 public void ScrollBarPaintTrack (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, GtkPlusState state, bool horizontal, bool upOrLeft)
378 scroll_bar_track_painter.Configure (state, upOrLeft);
379 Paint (horizontal ? WidgetType.HScrollBar : WidgetType.VScrollBar, bounds, dc, clippingArea, scroll_bar_track_painter);
381 #endregion
382 #region StatusBar
383 public void StatusBarPaintGripper (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea)
385 Paint (WidgetType.StatusBar, bounds, dc, clippingArea, status_bar_gripper_painter);
387 #endregion
388 #region TabControl
389 public void TabControlPaintPane (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea)
391 Paint (WidgetType.TabControl, bounds, dc, clippingArea, tab_control_pane_painter);
393 public void TabControlPaintTabItem (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, GtkPlusState state)
395 tab_control_tab_item_painter.Configure (state);
396 Paint (WidgetType.TabControl, bounds, dc, clippingArea, tab_control_tab_item_painter);
398 #endregion
399 #region TextBox
400 public void TextBoxPaint (IDeviceContext dc, Rectangle bounds, Rectangle excludedArea, GtkPlusState state)
402 text_box_painter.Configure (state);
403 PaintExcludingArea (WidgetType.TextBox, bounds, dc, excludedArea, text_box_painter);
405 #endregion
406 #region ToolBar
407 public void ToolBarPaint (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea)
409 Paint (WidgetType.ToolBar, bounds, dc, clippingArea, tool_bar_painter);
411 public void ToolBarPaintButton (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, GtkPlusState state)
413 tool_bar_button_painter.Configure (state);
414 Paint (WidgetTypeNotNeeded, bounds, dc, clippingArea, tool_bar_button_painter);
416 public void ToolBarPaintCheckedButton (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea)
418 Paint (WidgetTypeNotNeeded, bounds, dc, clippingArea, tool_bar_checked_button_painter);
420 #endregion
421 #region TrackBar
422 public void TrackBarPaintTrack (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, bool horizontal)
424 Paint (horizontal ? WidgetType.HorizontalTrackBar : WidgetType.VerticalTrackBar, bounds, dc, clippingArea, track_bar_track_painter);
426 public void TrackBarPaintThumb (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, GtkPlusState state, bool horizontal)
428 track_bar_thumb_painter.Configure (state, horizontal);
429 Paint (horizontal ? WidgetType.HorizontalTrackBar : WidgetType.VerticalTrackBar, bounds, dc, clippingArea, track_bar_thumb_painter);
431 #endregion
432 #region TreeView
433 public void TreeViewPaintGlyph (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, bool closed)
435 tree_view_glyph_painter.Configure (closed);
436 Paint (WidgetType.TreeView, bounds, dc, clippingArea, tree_view_glyph_painter);
438 #endregion
439 #region UpDown
440 public void UpDownPaint (IDeviceContext dc, Rectangle bounds, Rectangle clippingArea, bool up, GtkPlusState state)
442 up_down_painter.Configure (up, state);
443 Paint (WidgetType.UpDown, bounds, dc, clippingArea, up_down_painter);
445 #endregion
446 #endregion
447 #region Painting
448 void Paint (WidgetType widgetType, Rectangle bounds, IDeviceContext dc, Rectangle clippingArea, Painter painter)
450 Paint (widgetType, bounds, dc, TransparencyType.Alpha, Color.Black, DeviceContextType.Native, clippingArea, painter, Rectangle.Empty);
452 void PaintExcludingArea (WidgetType widgetType, Rectangle bounds, IDeviceContext dc, Rectangle excludedArea, Painter painter)
454 Paint (widgetType, bounds, dc, TransparencyType.Alpha, Color.Black, DeviceContextType.Native, bounds, painter, excludedArea);
456 void Paint (WidgetType widgetType, Rectangle bounds, IDeviceContext dc, TransparencyType transparencyType, Color background, DeviceContextType deviceContextType, Rectangle clippingArea, Painter painter, Rectangle excludedArea)
458 Rectangle painted_area = Rectangle.Intersect (bounds, clippingArea);
459 if (painted_area.Width == 0 || painted_area.Height == 0)
460 return;
461 painted_area.Offset (-bounds.X, -bounds.Y);
462 excludedArea.Offset (-bounds.X, -bounds.Y);
463 GdkDrawablePointer drawable = gdk_pixmap_new (IntPtr.Zero, bounds.Width, bounds.Height, 24);
464 painter.AttachStyle (widgetType, drawable, this);
465 GdkPixbufPointer pixbuf;
466 IntPtr pixel_data;
467 int rowstride;
468 GdkGCPointer gc = gdk_gc_new (drawable);
469 GdkColor color = new GdkColor (background);
470 gdk_gc_set_rgb_fg_color (gc, ref color);
471 Paint (drawable, gc, bounds, widgetType, out pixbuf, out pixel_data, out rowstride, painted_area, painter, excludedArea);
472 GdkPixbufPointer white_pixbuf = IntPtr.Zero;
473 IntPtr white_pixel_data = IntPtr.Zero;
474 int white_rowstride = 0;
475 GdkColor white_color = new GdkColor();
476 if (transparencyType == TransparencyType.Alpha) {
477 white_color.red = guint16.MaxValue;
478 white_color.green = guint16.MaxValue;
479 white_color.blue = guint16.MaxValue;
480 gdk_gc_set_rgb_fg_color (gc, ref white_color);
481 Paint (drawable, gc, bounds, widgetType, out white_pixbuf, out white_pixel_data, out white_rowstride, painted_area, painter, excludedArea);
483 g_object_unref (gc);
484 unsafe {
485 byte* row = (byte*)pixel_data;
486 byte* pixel;
487 byte* white_row = (byte*)white_pixel_data;
488 byte* white_pixel;
490 for (int row_index = 0; row_index < painted_area.Height; row_index++) {
491 pixel = row;
492 white_pixel = white_row;
493 for (int pixel_index = 0; pixel_index < painted_area.Width; pixel_index++) {
494 const int GdkRedOffset = 0;
495 const int GdkGreenOffset = 1;
496 const int GdkBlueOffset = 2;
497 const int BitmapAlphaOffset = 3;
498 const int BitmapRedOffset = 2;
499 const int BitmapBlueOffset = 0;
500 switch (transparencyType) {
501 case TransparencyType.Alpha:
502 pixel [BitmapAlphaOffset] = (byte)(pixel [GdkRedOffset] - white_pixel [GdkRedOffset] + byte.MaxValue);
503 break;
504 case TransparencyType.Color:
505 if (
506 pixel [GdkRedOffset] == background.R &&
507 pixel [GdkGreenOffset] == background.G &&
508 pixel [GdkBlueOffset] == background.B) {
509 const int AlphaFullyTransparent = 0;
510 pixel [BitmapAlphaOffset] = AlphaFullyTransparent;
512 break;
515 byte temporary = pixel [GdkRedOffset];
516 pixel [BitmapBlueOffset] = pixel [GdkBlueOffset];
517 pixel [BitmapRedOffset] = temporary;
519 const int PixelSize = 4;
520 pixel += PixelSize;
521 white_pixel += PixelSize;
523 row += rowstride;
524 white_row += white_rowstride;
527 if (transparencyType == TransparencyType.Alpha)
528 g_object_unref (white_pixbuf);
529 g_object_unref (drawable);
530 Bitmap bitmap = new Bitmap (painted_area.Width, painted_area.Height, rowstride, PixelFormat.Format32bppPArgb, pixel_data);
531 Graphics g;
532 #if NET_2_0
533 bool graphics_is_from_hdc = false;
534 #endif
535 switch (deviceContextType) {
536 case DeviceContextType.Graphics:
537 g = (Graphics)dc;
538 break;
539 case DeviceContextType.Native:
540 g = Graphics.FromHdc (dc.GetHdc ());
541 break;
542 default:
543 #if NET_2_0
544 g = dc as Graphics;
545 if (g == null) {
546 graphics_is_from_hdc = true;
547 g = Graphics.FromHdc (dc.GetHdc ());
548 } else
549 graphics_is_from_hdc = false;
550 #else
551 g = (Graphics)dc;
552 #endif
553 break;
555 painted_area.Offset (bounds.X, bounds.Y);
556 g.DrawImage (bitmap, painted_area.Location);
557 switch (deviceContextType) {
558 case DeviceContextType.Graphics:
559 break;
560 case DeviceContextType.Native:
561 g.Dispose ();
562 dc.ReleaseHdc ();
563 break;
564 default:
565 #if NET_2_0
566 if (graphics_is_from_hdc) {
567 g.Dispose ();
568 dc.ReleaseHdc ();
570 #endif
571 break;
573 bitmap.Dispose ();
574 g_object_unref (pixbuf);
576 void Paint (GdkDrawablePointer drawable, GdkGCPointer gc, Rectangle rectangle, WidgetType widgetType, out GdkPixbufPointer pixbuf, out IntPtr pixelData, out int rowstride, Rectangle clippingArea, Painter painter, Rectangle excludedArea)
578 gdk_draw_rectangle (drawable, gc, true, clippingArea.X, clippingArea.Y, clippingArea.Width, clippingArea.Height);
579 painter.Paint (styles [(int)widgetType], drawable, new GdkRectangle(clippingArea), widgets [(int)widgetType], 0, 0, rectangle.Width, rectangle.Height, this);
580 if (excludedArea.Width != 0)
581 gdk_draw_rectangle (drawable, gc, true, excludedArea.X, excludedArea.Y, excludedArea.Width, excludedArea.Height);
582 if (
583 (pixbuf = gdk_pixbuf_new (GdkColorspace.GDK_COLORSPACE_RGB, true, 8, clippingArea.Width, clippingArea.Height)) == IntPtr.Zero ||
584 gdk_pixbuf_get_from_drawable (pixbuf, drawable, IntPtr.Zero, clippingArea.X, clippingArea.Y, 0, 0, clippingArea.Width, clippingArea.Height) == IntPtr.Zero)
585 throw new OutOfMemoryException ();
586 pixelData = gdk_pixbuf_get_pixels (pixbuf);
587 rowstride = gdk_pixbuf_get_rowstride (pixbuf);
589 abstract class Painter
591 public virtual void AttachStyle (WidgetType widgetType, GdkDrawablePointer drawable, GtkPlus gtkPlus)
593 gtkPlus.styles [(int)widgetType] = gtk_style_attach (gtkPlus.styles [(int)widgetType], drawable);
595 public abstract void Paint (GtkStylePointer style, GdkWindowPointer window, GdkRectangle area, GtkWidgetPointer widget, gint x, gint y, gint width, gint height, GtkPlus gtkPlus);
597 enum TransparencyType
599 None,
600 Color,
601 Alpha
603 enum DeviceContextType
605 Unknown,
606 Graphics,
607 Native
609 #endregion
610 #region Painters
611 #region Button
612 class ButtonPainter : Painter
614 bool @default;
615 GtkPlusState state;
616 public void Configure (bool @default, GtkPlusState state) {
617 this.@default = @default;
618 this.state = state;
620 public override void Paint (GtkStylePointer style, GdkWindowPointer window, GdkRectangle area, GtkWidgetPointer widget, gint x, gint y, gint width, gint height, GtkPlus gtkPlus)
622 if (@default) {
623 gtk_window_set_default (gtkPlus.window, widget);
624 gtk_paint_box (
625 style,
626 window,
627 GtkStateType.GTK_STATE_NORMAL,
628 GtkShadowType.GTK_SHADOW_IN,
629 ref area,
630 widget,
631 "buttondefault",
632 x, y, width, height);
633 gtk_window_set_default (gtkPlus.window, IntPtr.Zero);
634 } else
635 gtk_paint_box (
636 style,
637 window,
638 (GtkStateType)state,
639 state == GtkPlusState.Pressed ? GtkShadowType.GTK_SHADOW_IN : GtkShadowType.GTK_SHADOW_OUT,
640 ref area,
641 widget,
642 "button",
643 x, y, width, height);
646 #endregion
647 #region CheckBox, RadioButton
648 abstract class ToggleButtonPainter : Painter
650 GtkPlusState state;
651 GtkPlusToggleButtonValue value;
652 public void Configure (GtkPlusState state, GtkPlusToggleButtonValue value)
654 this.state = state;
655 this.value = value;
657 public override void Paint (GtkStylePointer style, GdkWindowPointer window, GdkRectangle area, GtkWidgetPointer widget, gint x, gint y, gint width, gint height, GtkPlus gtkPlus)
659 PaintFunction (
660 style,
661 window,
662 (GtkStateType)state,
663 (GtkShadowType)value,
664 ref area,
665 widget,
666 Detail,
667 x, y, width,height);
669 protected abstract string Detail { get; }
670 protected abstract ToggleButtonPaintFunction PaintFunction { get; }
672 delegate void ToggleButtonPaintFunction (GtkStylePointer style, GdkWindowPointer window, GtkStateType state_type, GtkShadowType shadow_type, ref GdkRectangle area, GtkWidgetPointer widget, string detail, gint x, gint y, gint width, gint height);
673 class CheckBoxPainter : ToggleButtonPainter
675 protected override string Detail {
676 get {
677 return "checkbutton";
680 protected override ToggleButtonPaintFunction PaintFunction {
681 get {
682 return gtk_paint_check;
686 class RadioButtonPainter : ToggleButtonPainter
688 protected override string Detail {
689 get {
690 return "radiobutton";
693 protected override ToggleButtonPaintFunction PaintFunction {
694 get {
695 return gtk_paint_option;
699 #endregion
700 #region ComboBox
701 #if NET_2_0
702 class ComboBoxDropDownButtonPainter : Painter
704 GtkPlusState state;
705 public void Configure (GtkPlusState state)
707 this.state = state;
709 public override void AttachStyle (WidgetType widgetType, IntPtr drawable, GtkPlus gtkPlus)
711 gtkPlus.combo_box_drop_down_toggle_button_style = gtk_style_attach (gtkPlus.combo_box_drop_down_toggle_button_style, drawable);
712 gtkPlus.combo_box_drop_down_arrow_style = gtk_style_attach (gtkPlus.combo_box_drop_down_arrow_style, drawable);
714 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
716 GtkShadowType shadow_type;
717 switch (state) {
718 case GtkPlusState.Disabled:
719 shadow_type = GtkShadowType.GTK_SHADOW_ETCHED_IN;
720 break;
721 case GtkPlusState.Pressed:
722 shadow_type = GtkShadowType.GTK_SHADOW_IN;
723 break;
724 default:
725 shadow_type = GtkShadowType.GTK_SHADOW_OUT;
726 break;
728 gtk_paint_box (
729 gtkPlus.combo_box_drop_down_toggle_button_style,
730 window,
731 (GtkStateType)state,
732 shadow_type,
733 ref area,
734 gtkPlus.combo_box_drop_down_toggle_button,
735 "button",
736 x, y, width, height);
737 GtkMisc misc = (GtkMisc)Marshal.PtrToStructure (gtkPlus.combo_box_drop_down_arrow, typeof (GtkMisc));
738 int extent = (int)(Math.Min (width - misc.xpad * 2, height - misc.ypad * 2) * GetWidgetStyleSingle (gtkPlus.combo_box_drop_down_arrow, "arrow-scaling"));
739 gtk_paint_arrow (
740 gtkPlus.combo_box_drop_down_arrow_style,
741 window,
742 (GtkStateType)state,
743 GtkShadowType.GTK_SHADOW_NONE,
744 ref area,
745 gtkPlus.combo_box_drop_down_arrow,
746 "arrow",
747 GtkArrowType.GTK_ARROW_DOWN,
748 true,
749 (int)Math.Floor (x + misc.xpad + (width - extent) * misc.xalign),
750 (int)Math.Floor (y + misc.ypad + (height - extent) * misc.yalign),
751 extent, extent);
754 class ComboBoxBorderPainter : Painter
756 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
758 gtk_paint_shadow (
759 style,
760 window,
761 GtkStateType.GTK_STATE_NORMAL,
762 GtkShadowType.GTK_SHADOW_IN,
763 ref area,
764 widget,
765 "combobox",
766 x, y, width, height);
769 #endif
770 #endregion
771 #region GroupBox
772 class GroupBoxPainter : Painter
774 GtkPlusState state;
775 public void Configure (GtkPlusState state)
777 this.state = state;
779 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
781 gtk_paint_shadow (
782 style,
783 window,
784 (GtkStateType)state,
785 GtkShadowType.GTK_SHADOW_ETCHED_IN,
786 ref area,
787 widget,
788 "frame",
789 x, y, width, height);
793 #endregion
794 #region Header
795 class HeaderPainter : Painter
797 GtkPlusState state;
798 public void Configure (GtkPlusState state)
800 this.state = state;
802 public override void AttachStyle (WidgetType widgetType, IntPtr drawable, GtkPlus gtkPlus)
804 gtkPlus.tree_view_column_button_style = gtk_style_attach (gtkPlus.tree_view_column_button_style, drawable);
806 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
808 gtk_paint_box (
809 gtkPlus.tree_view_column_button_style,
810 window,
811 (GtkStateType)state,
812 state == GtkPlusState.Pressed ? GtkShadowType.GTK_SHADOW_IN : GtkShadowType.GTK_SHADOW_OUT,
813 ref area,
814 gtkPlus.tree_view_column_button,
815 "button",
816 x, y, width, height);
819 #endregion
820 #region ProgressBar
821 class ProgressBarBarPainter : Painter
823 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
825 gtk_paint_box (
826 style,
827 window,
828 GtkStateType.GTK_STATE_NORMAL,
829 GtkShadowType.GTK_SHADOW_IN,
830 ref area,
831 widget,
832 "trough",
833 x, y, width, height);
836 class ProgressBarChunkPainter : Painter
838 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
840 gtk_paint_box (
841 style,
842 window,
843 GtkStateType.GTK_STATE_PRELIGHT,
844 GtkShadowType.GTK_SHADOW_OUT,
845 ref area,
846 widget,
847 "bar",
848 x, y, width, height);
851 #endregion
852 #region ScrollBar
853 class ScrollBarArrowButtonPainter : Painter
855 GtkPlusState state;
856 bool horizontal;
857 bool up_or_left;
858 public void Configure (GtkPlusState state, bool horizontal, bool upOrLeft)
860 this.state = state;
861 this.horizontal = horizontal;
862 up_or_left = upOrLeft;
864 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
866 gboolean can_focus;
867 g_object_get (widget, "can-focus", out can_focus, IntPtr.Zero);
868 if (can_focus) {
869 int focus_line_width;
870 int focus_padding;
871 gtk_widget_style_get (widget,
872 "focus-line-width", out focus_line_width,
873 "focus-padding", out focus_padding,
874 IntPtr.Zero);
875 int focus_width = focus_line_width + focus_padding;
876 if (horizontal) {
877 y -= focus_width;
878 height -= 2 * focus_width;
879 } else {
880 x -= focus_width;
881 width -= 2 * focus_width;
884 GtkShadowType shadow_type = state == GtkPlusState.Pressed ? GtkShadowType.GTK_SHADOW_IN : GtkShadowType.GTK_SHADOW_OUT;
885 string detail = horizontal ? "hscrollbar" : "vscrollbar";
886 gtk_paint_box (
887 style,
888 window,
889 (GtkStateType)state,
890 shadow_type,
891 ref area,
892 widget,
893 detail,
894 x, y, width, height);
895 width /= 2;
896 height /= 2;
897 x += width / 2;
898 y += height / 2;
899 if (state == GtkPlusState.Pressed) {
900 int arrow_displacement_x;
901 int arrow_displacement_y;
902 gtk_widget_style_get (widget,
903 "arrow-displacement-x", out arrow_displacement_x,
904 "arrow-displacement-y", out arrow_displacement_y,
905 IntPtr.Zero);
906 x += arrow_displacement_x;
907 y += arrow_displacement_y;
909 gtk_paint_arrow (
910 style,
911 window,
912 (GtkStateType)state,
913 shadow_type,
914 ref area,
915 widget,
916 detail,
917 horizontal ? up_or_left ? GtkArrowType.GTK_ARROW_LEFT : GtkArrowType.GTK_ARROW_RIGHT : up_or_left ? GtkArrowType.GTK_ARROW_UP : GtkArrowType.GTK_ARROW_DOWN,
918 true,
919 x, y, width, height);
922 abstract class RangeThumbButtonPainter : Painter
924 GtkPlusState state;
925 bool horizontal;
926 protected bool Horizontal {
927 get { return horizontal; }
929 public void Configure (GtkPlusState state, bool horizontal)
931 this.state = state;
932 this.horizontal = horizontal;
934 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
936 gtk_paint_slider (
937 style,
938 window,
939 (GtkStateType)state,
940 state == GtkPlusState.Pressed && GetWidgetStyleBoolean (widget, "activate-slider") ? GtkShadowType.GTK_SHADOW_IN : GtkShadowType.GTK_SHADOW_OUT,
941 ref area,
942 widget,
943 Detail,
944 x, y, width, height,
945 horizontal ? GtkOrientation.GTK_ORIENTATION_HORIZONTAL : GtkOrientation.GTK_ORIENTATION_VERTICAL);
947 protected abstract string Detail { get; }
949 class ScrollBarThumbButtonPainter : RangeThumbButtonPainter
951 protected override string Detail {
952 get {
953 return "slider";
957 class ScrollBarTrackPainter : Painter
959 GtkPlusState state;
960 bool up_or_left;
961 public void Configure (GtkPlusState state, bool upOrLeft)
963 this.state = state;
964 up_or_left = upOrLeft;
966 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
968 gtk_paint_box (
969 style,
970 window,
971 state == GtkPlusState.Pressed ? GtkStateType.GTK_STATE_ACTIVE : GtkStateType.GTK_STATE_INSENSITIVE,
972 GtkShadowType.GTK_SHADOW_IN,
973 ref area,
974 widget,
975 GetWidgetStyleBoolean (widget, "trough-side-details") ?
976 up_or_left ? "trough-upper" : "trough-lower" :
977 "trough",
978 x, y, width, height);
981 #endregion
982 #region StatusBar
983 class StatusBarGripperPainter : Painter
985 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
987 gtk_paint_resize_grip (
988 style,
989 window,
990 GtkStateType.GTK_STATE_NORMAL,
991 ref area,
992 widget,
993 "statusbar",
994 GdkWindowEdge.GDK_WINDOW_EDGE_SOUTH_EAST,
995 x, y, width, height);
998 #endregion
999 #region TabControl
1000 class TabControlPanePainter : Painter
1002 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
1004 gtk_paint_box_gap (
1005 style,
1006 window,
1007 GtkStateType.GTK_STATE_NORMAL,
1008 GtkShadowType.GTK_SHADOW_OUT,
1009 ref area,
1010 widget,
1011 "notebook",
1012 x, y, width, height,
1013 GtkPositionType.GTK_POS_TOP,
1018 class TabControlTabItemPainter : Painter
1020 GtkPlusState state;
1021 public void Configure (GtkPlusState state)
1023 this.state = state;
1025 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
1027 gtk_paint_extension (
1028 style,
1029 window,
1030 (GtkStateType)state,
1031 GtkShadowType.GTK_SHADOW_OUT,
1032 ref area,
1033 widget,
1034 "tab",
1035 x, y, width, height,
1036 GtkPositionType.GTK_POS_BOTTOM);
1039 #endregion
1040 #region TextBox
1041 class TextBoxPainter : Painter
1043 GtkPlusState state;
1044 public void Configure (GtkPlusState state)
1046 this.state = state;
1048 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
1050 gtk_paint_shadow (
1051 style,
1052 window,
1053 GtkStateType.GTK_STATE_NORMAL,
1054 GtkShadowType.GTK_SHADOW_IN,
1055 ref area,
1056 widget,
1057 "entry",
1058 x, y, width, height);
1059 GtkStyle style_structure = (GtkStyle)Marshal.PtrToStructure (style, typeof (GtkStyle));
1060 x += style_structure.xthickness;
1061 y += style_structure.ythickness;
1062 width -= 2 * style_structure.xthickness;
1063 height -= 2 * style_structure.ythickness;
1064 gtk_paint_flat_box (
1065 style,
1066 window,
1067 (GtkStateType)state,
1068 GtkShadowType.GTK_SHADOW_NONE,
1069 ref area,
1070 widget,
1071 "entry_bg",
1072 x, y, width, height);
1075 #endregion
1076 #region ToolBar
1077 class ToolBarPainter : Painter
1079 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
1081 gtk_paint_box (
1082 style,
1083 window,
1084 GtkStateType.GTK_STATE_NORMAL,
1085 GetWidgetStyleShadowType (widget),
1086 ref area,
1087 widget,
1088 "toolbar",
1089 x, y, width, height);
1092 class ToolBarButtonPainter : Painter
1094 GtkPlusState state;
1095 public void Configure (GtkPlusState state) {
1096 this.state = state;
1098 public override void AttachStyle (WidgetType widgetType, IntPtr drawable, GtkPlus gtkPlus)
1100 gtkPlus.tool_bar_button_style = gtk_style_attach (gtkPlus.tool_bar_button_style, drawable);
1102 public override void Paint (GtkStylePointer style, GdkWindowPointer window, GdkRectangle area, GtkWidgetPointer widget, gint x, gint y, gint width, gint height, GtkPlus gtkPlus)
1104 gtk_paint_box (
1105 gtkPlus.tool_bar_button_style,
1106 window,
1107 (GtkStateType)state,
1108 state == GtkPlusState.Pressed ? GtkShadowType.GTK_SHADOW_IN : GtkShadowType.GTK_SHADOW_OUT,
1109 ref area,
1110 gtkPlus.tool_bar_button,
1111 "button",
1112 x, y, width, height);
1115 class ToolBarCheckedButtonPainter : Painter
1117 public override void AttachStyle (WidgetType widgetType, IntPtr drawable, GtkPlus gtkPlus)
1119 gtkPlus.tool_bar_toggle_button_style = gtk_style_attach (gtkPlus.tool_bar_toggle_button_style, drawable);
1121 public override void Paint (GtkStylePointer style, GdkWindowPointer window, GdkRectangle area, GtkWidgetPointer widget, gint x, gint y, gint width, gint height, GtkPlus gtkPlus)
1123 gtk_paint_box (
1124 gtkPlus.tool_bar_toggle_button_style,
1125 window,
1126 GtkStateType.GTK_STATE_ACTIVE,
1127 GtkShadowType.GTK_SHADOW_IN,
1128 ref area,
1129 gtkPlus.tool_bar_toggle_button,
1130 "button",
1131 x, y, width, height);
1134 #endregion
1135 #region TrackBar
1136 class TrackBarTrackPainter : Painter
1138 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
1140 gtk_paint_box (
1141 style,
1142 window,
1143 GtkStateType.GTK_STATE_ACTIVE,
1144 GtkShadowType.GTK_SHADOW_IN,
1145 ref area,
1146 widget,
1147 "trough",
1148 x, y, width, height);
1151 class TrackBarThumbPainter : RangeThumbButtonPainter
1153 protected override string Detail {
1154 get {
1155 return Horizontal ? "hscale" : "vscale";
1159 #endregion
1160 #region TreeView
1161 class TreeViewGlyphPainter : Painter
1163 bool closed;
1164 public void Configure (bool closed)
1166 this.closed = closed;
1168 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
1170 gtk_paint_expander (
1171 style,
1172 window,
1173 GtkStateType.GTK_STATE_NORMAL,
1174 ref area,
1175 widget,
1176 "treeview",
1177 x + width / 2,
1178 y + height / 2,
1179 closed ? GtkExpanderStyle.GTK_EXPANDER_COLLAPSED : GtkExpanderStyle.GTK_EXPANDER_EXPANDED);
1182 #endregion
1183 #region UpDown
1184 class UpDownPainter : Painter
1186 bool up;
1187 GtkPlusState state;
1188 public void Configure (bool up, GtkPlusState state)
1190 this.up = up;
1191 this.state = state;
1193 public override void Paint (IntPtr style, IntPtr window, GdkRectangle area, IntPtr widget, int x, int y, int width, int height, GtkPlus gtkPlus)
1195 GtkShadowType shadow_type = GetWidgetStyleShadowType (widget);
1196 if (shadow_type != GtkShadowType.GTK_SHADOW_NONE)
1197 gtk_paint_box (
1198 style,
1199 window,
1200 GtkStateType.GTK_STATE_NORMAL,
1201 shadow_type,
1202 ref area,
1203 widget,
1204 "spinbutton",
1205 x, y - (up ? 0 : height), width, height * 2);
1206 shadow_type = state == GtkPlusState.Pressed ? GtkShadowType.GTK_SHADOW_IN : GtkShadowType.GTK_SHADOW_OUT;
1207 gtk_paint_box (
1208 style,
1209 window,
1210 (GtkStateType)state,
1211 shadow_type,
1212 ref area,
1213 widget,
1214 up ? "spinbutton_up" : "spinbutton_down",
1215 x, y, width, height);
1216 if (up)
1217 y += 2;
1218 height -= 2;
1219 width -= 3;
1220 x += 1;
1221 int w = width / 2;
1222 w -= w % 2 - 1;
1223 int h = (w + 1) / 2;
1224 x += (width - w) / 2;
1225 y += (height - h) / 2;
1226 height = h;
1227 width = w;
1228 gtk_paint_arrow (
1229 style,
1230 window,
1231 (GtkStateType)state,
1232 shadow_type,
1233 ref area,
1234 widget,
1235 "spinbutton",
1236 up ? GtkArrowType.GTK_ARROW_UP : GtkArrowType.GTK_ARROW_DOWN,
1237 true,
1238 x, y, width, height);
1241 #endregion
1242 #endregion
1243 #region Widget types
1244 const WidgetType WidgetTypeNotNeeded = (WidgetType)0;
1245 enum WidgetType
1247 Button,
1248 CheckBox,
1249 #if NET_2_0
1250 ComboBox,
1251 #endif
1252 GroupBox,
1253 ProgressBar,
1254 RadioButton,
1255 #region ScrollBar
1256 HScrollBar,
1257 VScrollBar,
1258 #endregion
1259 StatusBar,
1260 TabControl,
1261 TextBox,
1262 ToolBar,
1263 #region TrackBar
1264 HorizontalTrackBar,
1265 VerticalTrackBar,
1266 #endregion
1267 TreeView,
1268 UpDown,
1270 #endregion
1271 #region GTK+ utility methods
1272 static GtkShadowType GetWidgetStyleShadowType (GtkWidgetPointer widget)
1274 GtkShadowType result;
1275 gtk_widget_style_get (widget, "shadow-type", out result, IntPtr.Zero);
1276 return result;
1278 static int GetWidgetStyleInteger (GtkWidgetPointer widget, string propertyName)
1280 gint result;
1281 gtk_widget_style_get (widget, propertyName, out result, IntPtr.Zero);
1282 return result;
1284 #if NET_2_0
1285 static float GetWidgetStyleSingle (GtkWidgetPointer widget, string propertyName)
1287 gfloat result;
1288 gtk_widget_style_get (widget, propertyName, out result, IntPtr.Zero);
1289 return result;
1291 #endif
1292 static bool GetWidgetStyleBoolean (GtkWidgetPointer widget, string propertyName)
1294 gboolean result;
1295 gtk_widget_style_get (widget, propertyName, out result, IntPtr.Zero);
1296 return result;
1298 #region GetFirstChildWidgetOfType
1299 #if NET_2_0
1300 static class GetFirstChildWidgetOfType
1302 public static GtkWidgetPointer Get (GtkContainerPointer parent, GType childType)
1304 Type = childType;
1305 Result = GtkWidgetPointer.Zero;
1306 ContainersToSearch = new ArrayList ();
1307 ContainersToSearch.Add (parent);
1308 while (true) {
1309 ArrayList containers_to_search = ContainersToSearch;
1310 ContainersToSearch = new ArrayList ();
1311 foreach (GtkContainerPointer container in containers_to_search) {
1312 gtk_widget_realize (container);
1313 gtk_container_forall (container, Callback, gpointer.Zero);
1314 if (Result != GtkWidgetPointer.Zero)
1315 return Result;
1317 if (ContainersToSearch.Count == 0)
1318 return GtkWidgetPointer.Zero;
1321 static void Callback (GtkWidgetPointer widget, gpointer data)
1323 if (Result != IntPtr.Zero)
1324 return;
1325 if (g_type_check_instance_is_a (widget, Type))
1326 Result = widget;
1327 else if (g_type_check_instance_is_a (widget, gtk_container_get_type ()))
1328 ContainersToSearch.Add (widget);
1330 static GType Type;
1331 static GtkWidgetPointer Result;
1332 static ArrayList ContainersToSearch;
1334 #endif
1335 #endregion
1336 static GtkStylePointer GetWidgetStyle (GtkWidgetPointer widget)
1338 return gtk_rc_get_style (widget);
1340 #endregion
1341 #region Platform Invoke
1342 #region Library names
1343 #if VISUAL_STYLES_USE_GTKPLUS_ON_WINDOWS
1344 const string GobjectLibraryName = "libgobject-2.0-0.dll";
1345 const string GdkLibraryName = "libgdk-win32-2.0-0.dll";
1346 const string GdkPixbufLibraryName = "libgdk_pixbuf-2.0-0.dll";
1347 const string GtkLibraryName = "libgtk-win32-2.0-0.dll";
1348 #else
1349 const string GobjectLibraryName = "libgobject-2.0.so";
1350 const string GdkLibraryName = "libgdk-x11-2.0.so";
1351 const string GdkPixbufLibraryName = "libgdk_pixbuf-2.0.so";
1352 const string GtkLibraryName = "libgtk-x11-2.0.so";
1353 #endif
1354 #endregion
1355 #region GDK
1356 [DllImport (GdkLibraryName)]
1357 static extern void gdk_draw_rectangle (GdkDrawablePointer drawable, GdkGCPointer gc, gboolean filled, gint x, gint y, gint width, gint height);
1358 [DllImport (GdkLibraryName)]
1359 static extern GdkGCPointer gdk_gc_new (GdkDrawablePointer drawable);
1360 [DllImport (GdkLibraryName)]
1361 static extern void gdk_gc_set_rgb_fg_color (GdkGCPointer gc, ref GdkColor color);
1362 [DllImport (GdkLibraryName)]
1363 static extern GdkPixbufPointer gdk_pixbuf_get_from_drawable (GdkPixbufPointer dest, GdkDrawablePointer src, GdkColormapPointer cmap, int src_x, int src_y, int dest_x, int dest_y, int width, int height);
1364 [DllImport (GdkLibraryName)]
1365 static extern GdkPixmapPointer gdk_pixmap_new (GdkDrawablePointer drawable, gint width, gint height, gint depth);
1366 struct GdkColor{
1367 public guint32 pixel;
1368 public guint16 red;
1369 public guint16 green;
1370 public guint16 blue;
1371 public GdkColor (Color value)
1373 pixel = 0;
1374 red = (guint16)(value.R << 8);
1375 green = (guint16)(value.G << 8);
1376 blue = (guint16)(value.B << 8);
1379 internal struct GdkRectangle {
1380 public gint x;
1381 public gint y;
1382 public gint width;
1383 public gint height;
1384 public GdkRectangle (Rectangle value)
1386 x = value.X;
1387 y = value.Y;
1388 width = value.Width;
1389 height = value.Height;
1392 #endregion
1393 #region GdkPixbuf
1394 [DllImport (GdkPixbufLibraryName)]
1395 static extern IntPtr gdk_pixbuf_get_pixels (GdkPixbufPointer pixbuf);
1396 [DllImport (GdkPixbufLibraryName)]
1397 static extern int gdk_pixbuf_get_rowstride (GdkPixbufPointer pixbuf);
1398 [DllImport (GdkPixbufLibraryName)]
1399 static extern GdkPixbufPointer gdk_pixbuf_new (GdkColorspace colorspace, gboolean has_alpha, int bits_per_sample, int width, int height);
1400 enum GdkColorspace
1402 GDK_COLORSPACE_RGB
1404 #endregion
1405 #region GTK
1406 #region Functions
1407 [DllImport (GtkLibraryName)]
1408 static extern gboolean gtk_init_check (ref int argc, ref string[] argv);
1409 [DllImport (GtkLibraryName)]
1410 static extern IntPtr gtk_check_version (guint required_major, guint required_minor, guint required_micro);
1411 [DllImport (GtkLibraryName)]
1412 static extern void gtk_container_add (GtkContainerPointer container, GtkWidgetPointer widget);
1413 #if NET_2_0
1414 [DllImport (GtkLibraryName)]
1415 static extern void gtk_container_forall (GtkContainerPointer container, GtkCallback callback, gpointer callback_data);
1416 [UnmanagedFunctionPointer (CallingConvention.Cdecl)]
1417 delegate void GtkCallback (GtkWidgetPointer widget, gpointer data);
1418 #endif
1419 [DllImport (GtkLibraryName)]
1420 static extern void gtk_object_destroy (GtkObjectPointer @object);
1421 [DllImport (GtkLibraryName)]
1422 static extern GtkStylePointer gtk_rc_get_style (GtkWidgetPointer widget);
1423 [DllImport (GtkLibraryName)]
1424 static extern GtkStylePointer gtk_style_attach (GtkStylePointer style, GdkWindowPointer window);
1425 #if NET_2_0
1426 [DllImport (GtkLibraryName)]
1427 static extern void gtk_widget_realize (GtkWidgetPointer widget);
1428 #endif
1429 [DllImport (GtkLibraryName)]
1430 static extern void gtk_widget_style_get (GtkWidgetPointer widget, string property, out gint value, IntPtr nullTerminator);
1431 #if NET_2_0
1432 [DllImport (GtkLibraryName)]
1433 static extern void gtk_widget_style_get (GtkWidgetPointer widget, string property, out gfloat value, IntPtr nullTerminator);
1434 #endif
1435 [DllImport (GtkLibraryName)]
1436 static extern void gtk_widget_style_get (GtkWidgetPointer widget, string property1, out gint value1, string property2, out gint value2, IntPtr nullTerminator);
1437 [DllImport (GtkLibraryName)]
1438 static extern void gtk_widget_style_get (GtkWidgetPointer widget, string property, out GtkShadowType value, IntPtr nullTerminator);
1439 [DllImport (GtkLibraryName)]
1440 static extern void gtk_widget_style_get (GtkWidgetPointer widget, string property, out gboolean value, IntPtr nullTerminator);
1441 [DllImport (GtkLibraryName)]
1442 static extern GtkWidgetPointer gtk_window_new (GtkWindowType type);
1443 [DllImport (GtkLibraryName)]
1444 static extern void gtk_window_set_default (GtkWindowPointer window, GtkWidgetPointer default_widget);
1445 [DllImport (GtkLibraryName)]
1446 static extern GtkObjectPointer gtk_adjustment_new (gdouble value, gdouble lower, gdouble upper, gdouble step_increment, gdouble page_increment, gdouble page_size);
1447 [DllImport (GtkLibraryName)]
1448 static extern GtkStylePointer gtk_widget_get_style (GtkWidgetPointer widget);
1449 [DllImport (GtkLibraryName)]
1450 static extern GtkTreeViewColumnPointer gtk_tree_view_column_new ();
1451 [DllImport (GtkLibraryName)]
1452 static extern gint gtk_tree_view_insert_column (
1453 GtkTreeViewPointer tree_view,
1454 GtkTreeViewColumnPointer column,
1455 gint position);
1456 [DllImport (GtkLibraryName)]
1457 static extern void gtk_toolbar_insert (
1458 GtkToolbarPointer toolbar,
1459 GtkToolItemPointer item,
1460 gint pos);
1461 [DllImport (GtkLibraryName)]
1462 static extern GtkWidgetPointer gtk_bin_get_child (GtkBinPointer bin);
1463 #region Widget type
1464 #if NET_2_0
1465 [DllImport (GtkLibraryName)]
1466 static extern GType gtk_arrow_get_type ();
1467 [DllImport (GtkLibraryName)]
1468 static extern GType gtk_container_get_type ();
1469 [DllImport (GtkLibraryName)]
1470 static extern GType gtk_toggle_button_get_type ();
1471 #endif
1472 #endregion
1473 #region Widget creation
1474 [DllImport (GtkLibraryName)]
1475 static extern GtkWidgetPointer gtk_button_new ();
1476 [DllImport (GtkLibraryName)]
1477 static extern GtkWidgetPointer gtk_check_button_new ();
1478 #if NET_2_0
1479 [DllImport (GtkLibraryName)]
1480 static extern GtkWidgetPointer gtk_combo_box_entry_new ();
1481 #endif
1482 [DllImport (GtkLibraryName)]
1483 static extern GtkWidgetPointer gtk_entry_new ();
1484 [DllImport (GtkLibraryName)]
1485 static extern GtkWidgetPointer gtk_fixed_new ();
1486 [DllImport (GtkLibraryName)]
1487 static extern GtkWidgetPointer gtk_frame_new (string label);
1488 [DllImport (GtkLibraryName)]
1489 static extern GtkWidgetPointer gtk_hscale_new_with_range (gdouble min, gdouble max, gdouble step);
1490 [DllImport (GtkLibraryName)]
1491 static extern GtkWidgetPointer gtk_hscrollbar_new (GtkAdjustmentPointer adjustment);
1492 [DllImport (GtkLibraryName)]
1493 static extern GtkWidgetPointer gtk_notebook_new ();
1494 [DllImport (GtkLibraryName)]
1495 static extern GtkWidgetPointer gtk_progress_bar_new ();
1496 [DllImport (GtkLibraryName)]
1497 static extern GtkWidgetPointer gtk_radio_button_new (GSListPointer group);
1498 [DllImport (GtkLibraryName)]
1499 static extern GtkWidgetPointer gtk_spin_button_new (GtkAdjustmentPointer adjustment, gdouble climb_rate, guint digits);
1500 [DllImport (GtkLibraryName)]
1501 static extern GtkWidgetPointer gtk_statusbar_new ();
1502 [DllImport (GtkLibraryName)]
1503 static extern GtkToolItemPointer gtk_toggle_tool_button_new ();
1504 [DllImport (GtkLibraryName)]
1505 static extern GtkWidgetPointer gtk_toolbar_new ();
1506 [DllImport (GtkLibraryName)]
1507 static extern GtkToolItemPointer gtk_tool_button_new (
1508 GtkWidgetPointer icon_widget,
1509 string label);
1510 [DllImport (GtkLibraryName)]
1511 static extern GtkWidgetPointer gtk_tree_view_new ();
1512 [DllImport (GtkLibraryName)]
1513 static extern GtkWidgetPointer gtk_vscale_new_with_range (gdouble min, gdouble max, gdouble step);
1514 [DllImport (GtkLibraryName)]
1515 static extern GtkWidgetPointer gtk_vscrollbar_new (GtkAdjustmentPointer adjustment);
1516 #endregion
1517 #region Painting
1518 [DllImport (GtkLibraryName)]
1519 static extern void gtk_paint_arrow (GtkStylePointer style, GdkWindowPointer window, GtkStateType state_type, GtkShadowType shadow_type, ref GdkRectangle area, GtkWidgetPointer widget, string detail, GtkArrowType arrow_type, gboolean fill, gint x, gint y, gint width, gint height);
1520 [DllImport (GtkLibraryName)]
1521 static extern void gtk_paint_box (GtkStylePointer style, GdkWindowPointer window, GtkStateType state_type, GtkShadowType shadow_type, ref GdkRectangle area, GtkWidgetPointer widget, string detail, gint x, gint y, gint width, gint height);
1522 [DllImport (GtkLibraryName)]
1523 static extern void gtk_paint_box_gap (
1524 GtkStylePointer style,
1525 GdkWindowPointer window,
1526 GtkStateType state_type,
1527 GtkShadowType shadow_type,
1528 ref GdkRectangle area,
1529 GtkWidgetPointer widget,
1530 string detail,
1531 gint x,
1532 gint y,
1533 gint width,
1534 gint height,
1535 GtkPositionType gap_side,
1536 gint gap_x,
1537 gint gap_width);
1538 [DllImport (GtkLibraryName)]
1539 static extern void gtk_paint_check (GtkStylePointer style, GdkWindowPointer window, GtkStateType state_type, GtkShadowType shadow_type, ref GdkRectangle area, GtkWidgetPointer widget, string detail, gint x, gint y, gint width, gint height);
1540 [DllImport (GtkLibraryName)]
1541 static extern void gtk_paint_expander (
1542 GtkStylePointer style,
1543 GdkWindowPointer window,
1544 GtkStateType state_type,
1545 ref GdkRectangle area,
1546 GtkWidgetPointer widget,
1547 string detail,
1548 gint x,
1549 gint y,
1550 GtkExpanderStyle expander_style);
1551 [DllImport (GtkLibraryName)]
1552 static extern void gtk_paint_extension (
1553 GtkStylePointer style,
1554 GdkWindowPointer window,
1555 GtkStateType state_type,
1556 GtkShadowType shadow_type,
1557 ref GdkRectangle area,
1558 GtkWidgetPointer widget,
1559 string detail,
1560 gint x,
1561 gint y,
1562 gint width,
1563 gint height,
1564 GtkPositionType gap_side);
1565 [DllImport (GtkLibraryName)]
1566 static extern void gtk_paint_flat_box (
1567 GtkStylePointer style,
1568 GdkWindowPointer window,
1569 GtkStateType state_type,
1570 GtkShadowType shadow_type,
1571 ref GdkRectangle area,
1572 GtkWidgetPointer widget,
1573 string detail,
1574 gint x,
1575 gint y,
1576 gint width,
1577 gint height);
1578 [DllImport (GtkLibraryName)]
1579 static extern void gtk_paint_option (GtkStylePointer style, GdkWindowPointer window, GtkStateType state_type, GtkShadowType shadow_type, ref GdkRectangle area, GtkWidgetPointer widget, string detail, gint x, gint y, gint width, gint height);
1580 [DllImport (GtkLibraryName)]
1581 static extern void gtk_paint_resize_grip (
1582 GtkStylePointer style,
1583 GdkWindowPointer window,
1584 GtkStateType state_type,
1585 ref GdkRectangle area,
1586 GtkWidgetPointer widget,
1587 string detail,
1588 GdkWindowEdge edge,
1589 gint x,
1590 gint y,
1591 gint width,
1592 gint height);
1593 [DllImport (GtkLibraryName)]
1594 static extern void gtk_paint_shadow (GtkStylePointer style, GdkWindowPointer window, GtkStateType state_type, GtkShadowType shadow_type, ref GdkRectangle area, GtkWidgetPointer widget, string detail, gint x, gint y, gint width, gint height);
1595 [DllImport (GtkLibraryName)]
1596 static extern void gtk_paint_slider (
1597 GtkStylePointer style,
1598 GdkWindowPointer window,
1599 GtkStateType state_type,
1600 GtkShadowType shadow_type,
1601 ref GdkRectangle area,
1602 GtkWidgetPointer widget,
1603 string detail,
1604 gint x,
1605 gint y,
1606 gint width,
1607 gint height,
1608 GtkOrientation orientation);
1609 #endregion
1610 #endregion
1611 #region Enumerations
1612 internal enum GtkShadowType
1614 GTK_SHADOW_NONE,
1615 GTK_SHADOW_IN,
1616 GTK_SHADOW_OUT,
1617 GTK_SHADOW_ETCHED_IN,
1618 GTK_SHADOW_ETCHED_OUT
1620 enum GtkStateType
1622 GTK_STATE_NORMAL,
1623 GTK_STATE_ACTIVE,
1624 GTK_STATE_PRELIGHT,
1625 GTK_STATE_SELECTED,
1626 GTK_STATE_INSENSITIVE
1628 enum GtkWindowType
1630 GTK_WINDOW_TOPLEVEL,
1631 GTK_WINDOW_POPUP
1633 enum GtkArrowType
1635 GTK_ARROW_UP,
1636 GTK_ARROW_DOWN,
1637 GTK_ARROW_LEFT,
1638 GTK_ARROW_RIGHT,
1639 GTK_ARROW_NONE
1641 enum GtkOrientation
1643 GTK_ORIENTATION_HORIZONTAL,
1644 GTK_ORIENTATION_VERTICAL
1646 enum GtkExpanderStyle
1648 GTK_EXPANDER_COLLAPSED,
1649 GTK_EXPANDER_SEMI_COLLAPSED,
1650 GTK_EXPANDER_SEMI_EXPANDED,
1651 GTK_EXPANDER_EXPANDED
1653 enum GtkPositionType
1655 GTK_POS_LEFT,
1656 GTK_POS_RIGHT,
1657 GTK_POS_TOP,
1658 GTK_POS_BOTTOM
1660 enum GtkWidgetFlags : uint
1662 GTK_CAN_DEFAULT = 1 << 13,
1664 enum GdkWindowEdge
1666 GDK_WINDOW_EDGE_NORTH_WEST,
1667 GDK_WINDOW_EDGE_NORTH,
1668 GDK_WINDOW_EDGE_NORTH_EAST,
1669 GDK_WINDOW_EDGE_WEST,
1670 GDK_WINDOW_EDGE_EAST,
1671 GDK_WINDOW_EDGE_SOUTH_WEST,
1672 GDK_WINDOW_EDGE_SOUTH,
1673 GDK_WINDOW_EDGE_SOUTH_EAST
1675 #endregion
1676 #region Structures
1677 struct GtkStyle
1679 #pragma warning disable 169
1680 GObject parent_instance;
1681 [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
1682 GdkColor[] fg;
1683 [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
1684 GdkColor[] bg;
1685 [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
1686 GdkColor[] light;
1687 [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
1688 GdkColor[] dark;
1689 [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
1690 GdkColor[] mid;
1691 [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
1692 GdkColor[] text;
1693 [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
1694 GdkColor[] @base;
1695 [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
1696 GdkColor[] text_aa;
1697 GdkColor black;
1698 GdkColor white;
1699 PangoFontDescriptionPointer font_desc;
1700 #pragma warning restore 169
1701 public gint xthickness;
1702 public gint ythickness;
1704 struct GtkWidget
1706 #pragma warning disable 169
1707 GtkObject @object;
1708 guint16 private_flags;
1709 guint8 state;
1710 guint8 saved_state;
1711 string name;
1712 GtkStylePointer style;
1713 GtkRequisition requisition;
1714 #pragma warning restore 169
1715 public GtkAllocation allocation;
1716 #pragma warning disable 169
1717 GdkWindowPointer window;
1718 GtkWidgetPointer parent;
1719 #pragma warning restore 169
1721 struct GtkObject
1723 #pragma warning disable 169
1724 GInitiallyUnowned parent_instance;
1725 #pragma warning restore 169
1726 public guint32 flags;
1728 struct GtkRequisition
1730 #pragma warning disable 169
1731 gint width;
1732 gint height;
1733 #pragma warning restore 169
1735 struct GtkMisc
1737 #pragma warning disable 169
1738 GtkWidget widget;
1739 #pragma warning restore 169
1740 public gfloat xalign;
1741 public gfloat yalign;
1742 public guint16 xpad;
1743 public guint16 ypad;
1745 struct GtkTreeViewColumn
1747 #pragma warning disable 169
1748 GtkObject parent;
1749 GtkWidgetPointer tree_view;
1750 #pragma warning restore 169
1751 public GtkWidgetPointer button;
1753 #endregion
1754 #region Macros
1755 static void GTK_WIDGET_SET_FLAGS (GtkWidgetPointer wid, GtkWidgetFlags flag)
1757 GtkObject @object = (GtkObject)Marshal.PtrToStructure (wid, typeof (GtkObject));
1758 @object.flags |= (guint32)flag;
1759 Marshal.StructureToPtr (@object, wid, false);
1761 #endregion
1762 #endregion
1763 #region GObject
1764 [DllImport (GobjectLibraryName)]
1765 static extern gpointer g_object_ref (gpointer @object);
1766 [DllImport (GobjectLibraryName)]
1767 static extern void g_object_unref (gpointer @object);
1768 #if NET_2_0
1769 [DllImport (GobjectLibraryName)]
1770 static extern gboolean g_type_check_instance_is_a (GTypeInstancePointer type_instance, GType iface_type);
1771 #endif
1772 [DllImport (GobjectLibraryName)]
1773 static extern void g_object_get (gpointer @object, string property_name, out gboolean value, IntPtr nullTerminator);
1774 const int G_TYPE_FUNDAMENTAL_SHIFT = 2;
1775 enum G_TYPE
1778 struct GTypeInstance
1780 #pragma warning disable 169
1781 GTypeClassPointer g_class;
1782 #pragma warning restore 169
1784 internal struct GObject
1786 #pragma warning disable 169
1787 GTypeInstance g_type_instance;
1788 guint ref_count;
1789 GDataPointer qdata;
1790 #pragma warning restore 169
1792 #endregion
1793 #endregion
1795 #region Exposed constants
1796 enum GtkPlusToggleButtonValue
1798 Unchecked = GtkPlus.GtkShadowType.GTK_SHADOW_OUT,
1799 Mixed = GtkPlus.GtkShadowType.GTK_SHADOW_ETCHED_IN,
1800 Checked = GtkPlus.GtkShadowType.GTK_SHADOW_IN
1802 enum GtkPlusState
1804 Normal,
1805 Pressed,
1806 Hot,
1807 Selected,
1808 Disabled
1810 #endregion