.NET wrapper for Gtk and other related libraries
Go to file
Sebastian Dröge 89cfd16c10 Ensure to sink floating references passed unowned to GetObject() and to not increase their reference count
The API contract between GObject-Introspection and bindings is that
functions returning transfer-none floating references pass a reference
to the bindings that should be taken ownership of by sinking it. Not
doing so is wrong and will lead to memory leaks or double frees.

Previously we would not distinguish this case and simply increment the
reference count. In addition we would then sink the floating reference
when the Object.Raw field is set later for InitiallyUnowned subclasses.

Remove that last part and instead check directly in Object.Raw.set if we
get a floating reference and if so simply sink it here and take
ownership of it. The general assumption of Object.Raw.set is that it
gets passed a reference that it should take ownership of.

So in summary:
1) GetObject() would only increase the reference count of unowned,
   non-floating references so that we own it. For unowned, floating
   references it assumes ownership of the reference.
2) Raw.set assumes ownership of the reference passed to it and if it
   happens to be a floating reference then it will first sink it.

Also warn if we get a floating, owned reference passed to GetObject() as
that case is not allowed by GObject-Introspection and would cause the
reference to be leaked.

This fixes a memory leak with functions returning unowned, floating
references and with functions returning owned, non-floating references
of InitiallyUnowned subclasses. And at the same time keeps constructors
for InitiallyUnowned subclasses working correctly without leaks.

See https://gitlab.freedesktop.org/gstreamer/gstreamer-sharp/issues/31
2021-01-24 19:55:17 +01:00
.vscode Setup Samples base 2018-01-20 20:09:27 +01:00
CakeScripts Rename SourceView > GtkSourceSharp 2020-07-22 19:32:38 +02:00
Source Ensure to sink floating references passed unowned to GetObject() and to not increase their reference count 2021-01-24 19:55:17 +01:00
tools Bump CAKE version 2020-02-18 00:19:57 +01:00
.gitattributes WIP CAKE + .Net Core 2017-10-23 01:25:13 +02:00
.gitignore Finish up MonoDevelop addin 2018-03-01 14:41:53 +01:00
AUTHORS Fix file permissions, how did this happen? 2018-02-26 23:03:31 +01:00
azure-pipelines.yml Remove MyGet feed from the builds file 2019-08-10 17:23:06 +02:00
build.cake Support cake global tool (#97) 2019-08-14 15:09:28 +02:00
build.ps1 Fix file permissions, how did this happen? 2018-02-26 23:03:31 +01:00
build.sh WIP CAKE + .Net Core 2017-10-23 01:25:13 +02:00
LICENSE Fix file permissions, how did this happen? 2018-02-26 23:03:31 +01:00
README.md [README] Add GtkSourceSharp 2020-08-03 21:41:02 +02:00

GtkSharp

Build Status

GtkSharp is a C# wrapper for Gtk and its related components. The component list includes the following libraries: glib, gio, cairo, pango, atk, gdk. This is a fork of https://github.com/mono/gtk-sharp and is maintained completly separatly from that project.

Differences can be seen with the following table:

Target framework Target Gtk Version Extra notes
GtkSharp .NET Standard 2.0 Gtk 3.22 Does not need glue libraries.
mono/gtksharp .NET Framework 4.5 Gtk 2 (also Gtk 3.0 but never officially released)

Building from source

Pre requirements for building from source are that you have .Net Core and msbuild installed on the system.

To build the repository, first clone it:

git clone https://github.com/GtkSharp/GtkSharp.git
cd GtkSharp

and then simply run either .\build.ps1 or ./build.sh depending your operating system. If you have Cake installed as a .NET global tool just run dotnet-cake.

If you wish to generate the nuget packages simply add the --BuildTarget=PackageNuGet as an argument when calling the build script.

A breakdown on how the source is structured:

  • Tools that are needed to generate wrapper code are found in Tools folder
  • The actual wrappers code is found in Libs folder
  • Templates are located in Templates folder
  • Build script is separated between build.cake and CakeScripts folder

Using the library

On macOS, you'll need to manually install Gtk, see Installing Gtk on Mac wiki page for more details on how to do it.

Available NuGet packages:

To create a new gtk app project, simply use dotnet new templating engine:

  • install: dotnet new --install GtkSharp.Template.CSharp
  • uninstall: dotnet new --uninstall GtkSharp.Template.CSharp
  • generate project: dotnet new gtkapp

License

GtkSharp and its related components are licensed under LGPL v2.0 license, while Samples are licenced under The Unlicense.