sample: Port all existing GtkDemo samples to the new APIs

The following samples crash because of an issue with the new Drawn
handler: ColorSelection, DrawingArea and Pixbuf.
The rest seem to work OK.
This commit is contained in:
Bertrand Lorentz 2011-06-13 18:00:08 +02:00
parent 9d7eec2eca
commit 3a2f01c534
13 changed files with 85 additions and 122 deletions

View File

@ -192,7 +192,7 @@ namespace GtkDemo
protected override bool OnWindowStateEvent (Gdk.EventWindowState evt)
{
if ((evt.ChangedMask & (Gdk.WindowState.Maximized | Gdk.WindowState.Fullscreen)) != 0)
statusbar.HasResizeGrip = (evt.NewWindowState & (Gdk.WindowState.Maximized | Gdk.WindowState.Fullscreen)) == 0;
HasResizeGrip = (evt.NewWindowState & (Gdk.WindowState.Maximized | Gdk.WindowState.Fullscreen)) == 0;
return false;
}

View File

@ -14,7 +14,7 @@ namespace GtkDemo
[Demo ("Color Selection", "DemoColorSelection.cs")]
public class DemoColorSelection : Gtk.Window
{
private Gdk.Color color;
private Gdk.RGBA color;
private Gtk.DrawingArea drawingArea;
public DemoColorSelection () : base ("Color Selection")
@ -30,19 +30,22 @@ namespace GtkDemo
vbox.PackStart (frame, true, true, 0);
drawingArea = new DrawingArea ();
drawingArea.ExposeEvent += new ExposeEventHandler (ExposeEventCallback);
drawingArea.Drawn += new DrawnHandler (DrawnCallback);
// set a minimum size
drawingArea.SetSizeRequest (200,200);
// set the color
color = new Gdk.Color (0, 0, 0xff);
drawingArea.ModifyBg (StateType.Normal, color);
color.Red = 0;
color.Green = 0;
color.Blue = 1;
color.Alpha = 1;
drawingArea.OverrideBackgroundColor (StateFlags.Normal, color);
frame.Add (drawingArea);
Alignment alignment = new Alignment (1.0f, 0.5f, 0.0f, 0.0f);
Button button = new Button ("_Change the above color");
button.Clicked += new EventHandler (ChangeColorCallback);
alignment.Add (button);
vbox.PackStart (alignment);
vbox.PackStart (alignment, false, false, 0);
ShowAll ();
}
@ -53,17 +56,15 @@ namespace GtkDemo
return true;
}
// Expose callback for the drawing area
private void ExposeEventCallback (object o, ExposeEventArgs args)
// Drawn callback for the drawing area
private void DrawnCallback (object o, DrawnArgs args)
{
EventExpose eventExpose = args.Event;
Gdk.Window window = eventExpose.Window;
Rectangle area = eventExpose.Area;
Cairo.Context cr = args.Cr;
Gdk.RGBA rgba = StyleContext.GetBackgroundColor (StateFlags.Normal);
cr.SetSourceRGBA (rgba.Red, rgba.Green, rgba.Blue, rgba.Alpha);
cr.Paint ();
window.DrawRectangle (drawingArea.Style.BackgroundGC (StateType.Normal),
true,
area.X, area.Y,
area.Width, area.Height);
args.RetVal = true;
}
@ -71,13 +72,13 @@ namespace GtkDemo
{
using (ColorSelectionDialog colorSelectionDialog = new ColorSelectionDialog ("Changing color")) {
colorSelectionDialog.TransientFor = this;
colorSelectionDialog.ColorSelection.PreviousColor = color;
colorSelectionDialog.ColorSelection.CurrentColor = color;
colorSelectionDialog.ColorSelection.SetPreviousRgba (color);
colorSelectionDialog.ColorSelection.CurrentRgba = color;
colorSelectionDialog.ColorSelection.HasPalette = true;
if (colorSelectionDialog.Run () == (int) ResponseType.Ok) {
Gdk.Color selected = colorSelectionDialog.ColorSelection.CurrentColor;
drawingArea.ModifyBg (StateType.Normal, selected);
Gdk.RGBA selected = colorSelectionDialog.ColorSelection.CurrentRgba;
drawingArea.OverrideBackgroundColor (StateFlags.Normal, selected);
}
colorSelectionDialog.Hide ();

View File

@ -94,7 +94,7 @@ namespace GtkDemo
HBox hbox = new HBox (false, 8);
hbox.BorderWidth = 8;
dialog.VBox.PackStart (hbox, false, false, 0);
dialog.ContentArea.PackStart (hbox, false, false, 0);
Image stock = new Image (Stock.DialogQuestion, IconSize.Dialog);
hbox.PackStart (stock, false, false, 0);

View File

@ -22,7 +22,7 @@ namespace GtkDemo
[Demo ("Drawing Area", "DemoDrawingArea.cs")]
public class DemoDrawingArea : Gtk.Window
{
private Pixmap pixmap = null;
private Cairo.Surface surface = null;
public DemoDrawingArea () : base ("Drawing Area")
{
@ -45,7 +45,7 @@ namespace GtkDemo
// set a minimum size
da.SetSizeRequest (100,100);
frame.Add (da);
da.ExposeEvent += new ExposeEventHandler (CheckerboardExpose);
da.Drawn += new DrawnHandler (CheckerboardDrawn);
// Create the scribble area
label = new Label ("<u>Scribble area</u>");
@ -62,7 +62,7 @@ namespace GtkDemo
frame.Add (da);
// Signals used to handle backing pixmap
da.ExposeEvent += new ExposeEventHandler (ScribbleExpose);
da.Drawn += new DrawnHandler (ScribbleDrawn);
da.ConfigureEvent += new ConfigureEventHandler (ScribbleConfigure);
// Event signals
@ -84,25 +84,21 @@ namespace GtkDemo
return true;
}
private void CheckerboardExpose (object o, ExposeEventArgs args)
private void CheckerboardDrawn (object o, DrawnArgs args)
{
const int CheckSize = 10;
const int Spacing = 2;
DrawingArea da = o as DrawingArea;
// It would be a bit more efficient to keep these
// GC's around instead of recreating on each expose, but
// this is the lazy/slow way.
Gdk.GC gc1 = new Gdk.GC (da.GdkWindow);
gc1.RgbFgColor = new Gdk.Color (117, 0, 117);
Gdk.GC gc2 = new Gdk.GC (da.GdkWindow);
gc2.RgbFgColor = new Gdk.Color (255, 255, 255);
Widget widget = o as Widget;
Cairo.Context cr = args.Cr;
int i, j, xcount, ycount;
Gdk.Rectangle alloc = da.Allocation;
// At the start of a draw handler, a clip region has been set on
// the Cairo context, and the contents have been cleared to the
// widget's background color.
Rectangle alloc = widget.Allocation;
// Start redrawing the Checkerboard
xcount = 0;
i = Spacing;
@ -110,13 +106,12 @@ namespace GtkDemo
j = Spacing;
ycount = xcount % 2; // start with even/odd depending on row
while (j < alloc.Height) {
Gdk.GC gc;
if (ycount % 2 != 0)
gc = gc1;
cr.SetSourceRGB (0.45777, 0, 0.45777);
else
gc = gc2;
da.GdkWindow.DrawRectangle (gc, true, i, j,
CheckSize, CheckSize);
cr.SetSourceRGB (1, 1, 1);
// If we're outside the clip, this will do nothing.
cr.Rectangle (i, j, CheckSize, CheckSize);
j += CheckSize + Spacing;
++ycount;
@ -130,33 +125,29 @@ namespace GtkDemo
args.RetVal = true;
}
private void ScribbleExpose (object o, ExposeEventArgs args)
private void ScribbleDrawn (object o, DrawnArgs args)
{
Widget widget = o as Widget;
Gdk.Window window = widget.GdkWindow;
Rectangle area = args.Event.Area;
// We use the "ForegroundGC" for the widget since it already exists,
// but honestly any GC would work. The only thing to worry about
// is whether the GC has an inappropriate clip region set.
window.DrawDrawable (widget.Style.ForegroundGC (StateType.Normal),
pixmap,
area.X, area.Y,
area.X, area.Y,
area.Width, area.Height);
Cairo.Context cr = args.Cr;
cr.SetSourceSurface (surface, 0, 0);
cr.Paint ();
}
// Create a new pixmap of the appropriate size to store our scribbles
// Create a new surface of the appropriate size to store our scribbles
private void ScribbleConfigure (object o, ConfigureEventArgs args)
{
Widget widget = o as Widget;
Rectangle allocation = widget.Allocation;
if (surface != null)
surface.Destroy ();
pixmap = new Pixmap (widget.GdkWindow, allocation.Width, allocation.Height, -1);
var allocation = widget.Allocation;
// Initialize the pixmap to white
pixmap.DrawRectangle (widget.Style.WhiteGC, true, 0, 0,
allocation.Width, allocation.Height);
surface = widget.Window.CreateSimilarSurface (Cairo.Content.Color, allocation.Width, allocation.Height);
var cr = new Cairo.Context (surface);
cr.Paint ();
((IDisposable)cr).Dispose ();
// We've handled the configure event, no need for further processing.
args.RetVal = true;
@ -166,7 +157,7 @@ namespace GtkDemo
{
// paranoia check, in case we haven't gotten a configure event
if (pixmap == null)
if (surface == null)
return;
// This call is very important; it requests the next motion event.
@ -192,19 +183,21 @@ namespace GtkDemo
// Draw a rectangle on the screen
private void DrawBrush (Widget widget, double x, double y)
{
Rectangle update_rect = new Rectangle ((int)x - 3, (int)y - 3, 6, 6);
var update_rect = new Gdk.Rectangle ((int)x - 3, (int)y - 3, 6, 6);
var cr = new Cairo.Context (surface);
cr.Fill ();
Gdk.CairoHelper.Rectangle (cr, update_rect);
// Paint to the pixmap, where we store our state
pixmap.DrawRectangle (widget.Style.BlackGC, true,
update_rect.X, update_rect.Y,
update_rect.Width, update_rect.Height);
widget.GdkWindow.InvalidateRect (update_rect, false);
((IDisposable)cr).Dispose ();
widget.Window.InvalidateRect (update_rect, false);
}
private void ScribbleButtonPress (object o, ButtonPressEventArgs args)
{
// paranoia check, in case we haven't gotten a configure event
if (pixmap == null)
if (surface == null)
return;
EventButton ev = args.Event;

View File

@ -18,7 +18,7 @@ namespace GtkDemo
VBox vbox = new VBox (false, 5);
vbox.BorderWidth = 5;
this.VBox.PackStart (vbox, true, true, 0);
this.ContentArea.PackStart (vbox, true, true, 0);
Label label = new Label ("Completion demo, try writing <b>total</b> or <b>gnome</b> for example.");
label.UseMarkup = true;

View File

@ -17,7 +17,7 @@ namespace GtkDemo
Resizable = false;
VBox vbox = new VBox (false, 5);
this.VBox.PackStart (vbox, true, true, 0);
this.ContentArea.PackStart (vbox, true, true, 0);
vbox.BorderWidth = 5;
vbox.PackStart (new Label ("Expander demo. Click on the triangle for details."), false, false, 0);

View File

@ -184,7 +184,7 @@ namespace GtkDemo
view.WindowToBufferCoords (TextWindowType.Widget, (int) args.Event.X, (int) args.Event.Y, out x, out y);
SetCursorIfAppropriate (view, x, y);
view.GdkWindow.GetPointer (out x, out y, out state);
view.Window.GetPointer (out x, out y, out state);
}
// Also update the cursor image if the window becomes visible

View File

@ -170,7 +170,7 @@ namespace GtkDemo
{
Gdk.Pixbuf pixbuf = pixbufLoader.Pixbuf;
pixbuf.Fill (0xaaaaaaff);
progressiveImage.FromPixbuf = pixbuf;
progressiveImage.Pixbuf = pixbuf;
}
void ProgressiveUpdatedCallback (object obj, AreaUpdatedArgs args)

View File

@ -180,8 +180,8 @@ namespace GtkDemo
scrolledWindow.Add (textView);
if (IsSource) {
FontDescription fontDescription = FontDescription.FromString ("Courier 12");
textView.ModifyFont (fontDescription);
FontDescription fontDescription = FontDescription.FromString ("monospace");
textView.OverrideFont (fontDescription);
textView.WrapMode = Gtk.WrapMode.None;
} else {
// Make it a bit nicer for text
@ -191,7 +191,7 @@ namespace GtkDemo
}
return scrolledWindow;
}
}
private TreeStore FillTree ()
{

View File

@ -71,23 +71,13 @@ namespace GtkDemo
}
// Expose callback for the drawing area
void Expose (object o, ExposeEventArgs args)
void DrawnCallback (object o, DrawnArgs args)
{
Widget widget = (Widget) o;
Gdk.Rectangle area = args.Event.Area;
byte[] pixels;
int rowstride;
Cairo.Context cr = args.Cr;
Gdk.CairoHelper.SetSourcePixbuf (cr, frame, 0, 0);
cr.Paint ();
rowstride = frame.Rowstride;
pixels = new byte[(frame.Height - area.Y) * rowstride];
IntPtr src = (IntPtr)(frame.Pixels.ToInt64 () + rowstride * area.Y + area.X * 3);
Marshal.Copy (src, pixels, 0, pixels.Length);
widget.GdkWindow.DrawRgbImageDithalign (widget.Style.BlackGC,
area.X, area.Y, area.Width, area.Height,
Gdk.RgbDither.Normal,
pixels, rowstride,
area.X, area.Y);
args.RetVal = true;
}
@ -152,7 +142,7 @@ namespace GtkDemo
frame = new Pixbuf (Colorspace.Rgb, false, 8, backWidth, backHeight);
drawingArea = new DrawingArea ();
drawingArea.ExposeEvent += new ExposeEventHandler (Expose);
drawingArea.Drawn += new DrawnHandler (DrawnCallback);
Add (drawingArea);
timeoutId = GLib.Timeout.Add (FrameDelay, new GLib.TimeoutHandler(timeout));

View File

@ -33,7 +33,7 @@ namespace GtkDemo
Resizable = false;
VBox vbox = new VBox (false, 5);
this.VBox.PackStart (vbox, true, true, 0);
this.ContentArea.PackStart (vbox, true, true, 0);
vbox.BorderWidth = 5;
sizeGroup = new SizeGroup (SizeGroupMode.Horizontal);
@ -76,7 +76,7 @@ namespace GtkDemo
// Convenience function to create a combo box holding a number of strings
private ComboBox CreateComboBox (string [] strings)
{
ComboBox combo = ComboBox.NewText ();
ComboBoxText combo = new ComboBoxText ();
foreach (string str in strings)
combo.AppendText (str);

View File

@ -71,7 +71,7 @@ namespace GtkDemo
textView.AddChildAtAnchor (button, buttonAnchor);
button.ShowAll ();
ComboBox combo = ComboBox.NewText ();
ComboBoxText combo = new ComboBoxText ();
combo.AppendText ("Option 1");
combo.AppendText ("Option 2");
combo.AppendText ("Option 3");
@ -154,20 +154,6 @@ namespace GtkDemo
tag.Background = "red";
buffer.TagTable.Add (tag);
// The C gtk-demo passes NULL for the drawable param, which isn't
// multi-head safe, so it seems bad to allow it in the C# API.
// But the Window isn't realized at this point, so we can't get
// an actual Drawable from it. So we kludge for now.
Pixmap stipple = Pixmap.CreateBitmapFromData (Gdk.Screen.Default.RootWindow, gray50_bits, gray50_width, gray50_height);
tag = new TextTag ("background_stipple");
tag.BackgroundStipple = stipple;
buffer.TagTable.Add (tag);
tag = new TextTag ("foreground_stipple");
tag.ForegroundStipple = stipple;
buffer.TagTable.Add (tag);
tag = new TextTag ("big_gap_before_line");
tag.PixelsAboveLines = 30;
buffer.TagTable.Add (tag);
@ -278,17 +264,10 @@ namespace GtkDemo
buffer.Insert (ref insertIter, " or ");
buffer.InsertWithTagsByName (ref insertIter, "a red background", "red_background");
buffer.Insert (ref insertIter, " or even ");
buffer.InsertWithTagsByName (ref insertIter, "a stippled red background",
"red_background",
"background_stipple");
buffer.Insert (ref insertIter, " or ");
buffer.InsertWithTagsByName (ref insertIter,
"a stippled blue foreground on solid red background",
"blue_foreground",
"red_background",
"foreground_stipple");
buffer.Insert (ref insertIter, " (select that to read it) can be used.\n\n");
buffer.InsertWithTagsByName (ref insertIter, "a blue foreground on red background",
"blue_foreground",
"red_background");
buffer.Insert (ref insertIter, " (select that to read it) can be used.\n\n");
buffer.InsertWithTagsByName (ref insertIter, "Underline, strikethrough, and rise. ", "heading");
@ -389,9 +368,9 @@ namespace GtkDemo
// Event box is to add a black border around each child view
EventBox eventBox = new EventBox ();
Gdk.Color color = new Gdk.Color ();
Gdk.Color.Parse ("black", ref color);
eventBox.ModifyBg (StateType.Normal, color);
Gdk.RGBA color = new Gdk.RGBA ();
color.Parse ("black");
eventBox.OverrideBackgroundColor (StateFlags.Normal, color);
Alignment align = new Alignment (0.5f, 0.5f, 1.0f, 1.0f);
align.BorderWidth = 1;

View File

@ -1,4 +1,4 @@
# SUBDIRS = GtkDemo pixmaps valtest opaquetest gio gtk-gio
SUBDIRS = GtkDemo #pixmaps valtest opaquetest gio gtk-gio
if ENABLE_DOTNET
DOTNET_TARGETS=drawing-sample.exe