Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GTK# Image Buttons not showing Images when Running

Im trying to use Image Buttons in GTK# (Xamarin Studio).I set the Image to the button and in the UI Builder the Image is coming up.

enter image description here

But when i run the program there is no image in the button

enter image description here

I tried this in Different versions of the IDE and on different platforms(Mac and Windows)

Please help

Update: MainWindow.cs

using System;
using Gtk;

public partial class MainWindow: Gtk.Window
{
    public MainWindow () : base (Gtk.WindowType.Toplevel)
    {
        Build ();
    }

    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Application.Quit ();
        a.RetVal = true;
    }
}

Within gtk-gui folder i can find these files

generated.cs

// This file has been generated by the GUI designer. Do not modify.
namespace Stetic
{
    internal class Gui
    {
        private static bool initialized;

        internal static void Initialize (Gtk.Widget iconRenderer)
        {
            if ((Stetic.Gui.initialized == false)) {
                Stetic.Gui.initialized = true;
            }
        }
    }

    internal class IconLoader
    {
        public static Gdk.Pixbuf LoadIcon (Gtk.Widget widget, string name, Gtk.IconSize size)
        {
            Gdk.Pixbuf res = widget.RenderIcon (name, size, null);
            if ((res != null)) {
                return res;
            } else {
                int sz;
                int sy;
                global::Gtk.Icon.SizeLookup (size, out  sz, out  sy);
                try {
                    return Gtk.IconTheme.Default.LoadIcon (name, sz, 0);
                } catch (System.Exception) {
                    if ((name != "gtk-missing-image")) {
                        return Stetic.IconLoader.LoadIcon (widget, "gtk-missing-image", size);
                    } else {
                        Gdk.Pixmap pmap = new Gdk.Pixmap (Gdk.Screen.Default.RootWindow, sz, sz);
                        Gdk.GC gc = new Gdk.GC (pmap);
                        gc.RgbFgColor = new Gdk.Color (255, 255, 255);
                        pmap.DrawRectangle (gc, true, 0, 0, sz, sz);
                        gc.RgbFgColor = new Gdk.Color (0, 0, 0);
                        pmap.DrawRectangle (gc, false, 0, 0, (sz - 1), (sz - 1));
                        gc.SetLineAttributes (3, Gdk.LineStyle.Solid, Gdk.CapStyle.Round, Gdk.JoinStyle.Round);
                        gc.RgbFgColor = new Gdk.Color (255, 0, 0);
                        pmap.DrawLine (gc, (sz / 4), (sz / 4), ((sz - 1) - (sz / 4)), ((sz - 1) - (sz / 4)));
                        pmap.DrawLine (gc, ((sz - 1) - (sz / 4)), (sz / 4), (sz / 4), ((sz - 1) - (sz / 4)));
                        return Gdk.Pixbuf.FromDrawable (pmap, pmap.Colormap, 0, 0, 0, 0, sz, sz);
                    }
                }
            }
        }
    }

    internal class ActionGroups
    {
        public static Gtk.ActionGroup GetActionGroup (System.Type type)
        {
            return Stetic.ActionGroups.GetActionGroup (type.FullName);
        }

        public static Gtk.ActionGroup GetActionGroup (string name)
        {
            return null;
        }
    }
}

Mainwindow.cs

// This file has been generated by the GUI designer. Do not modify.

public partial class MainWindow
{
    private global::Gtk.Fixed fixed1;

    private global::Gtk.Button button1;

    protected virtual void Build ()
    {
        global::Stetic.Gui.Initialize (this);
        // Widget MainWindow
        this.Name = "MainWindow";
        this.Title = global::Mono.Unix.Catalog.GetString ("MainWindow");
        this.WindowPosition = ((global::Gtk.WindowPosition)(4));
        // Container child MainWindow.Gtk.Container+ContainerChild
        this.fixed1 = new global::Gtk.Fixed ();
        this.fixed1.Name = "fixed1";
        this.fixed1.HasWindow = false;
        // Container child fixed1.Gtk.Fixed+FixedChild
        this.button1 = new global::Gtk.Button ();
        this.button1.CanFocus = true;
        this.button1.Name = "button1";
        this.button1.UseUnderline = true;
        this.button1.Label = global::Mono.Unix.Catalog.GetString ("GtkButton");
        global::Gtk.Image w1 = new global::Gtk.Image ();
        w1.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-delete", global::Gtk.IconSize.Menu);
        this.button1.Image = w1;
        this.fixed1.Add (this.button1);
        global::Gtk.Fixed.FixedChild w2 = ((global::Gtk.Fixed.FixedChild)(this.fixed1 [this.button1]));
        w2.X = 153;
        w2.Y = 137;
        this.Add (this.fixed1);
        if ((this.Child != null)) {
            this.Child.ShowAll ();
        }
        this.DefaultWidth = 400;
        this.DefaultHeight = 300;
        this.Show ();
        this.DeleteEvent += new global::Gtk.DeleteEventHandler (this.OnDeleteEvent);
    }
}
like image 273
techno Avatar asked Jun 05 '15 10:06

techno


People also ask

What is GTK full form?

The Full form of GTK is good to know, or GTK stands for good to know, or the full name of given abbreviation is good to know.

Is GTK a programming language?

GTK is written using the C programming language, but its also available to various programming languages through language bindings, which allow writing GTK applications in the style of those languages. Language bindings are relatively easy to create because GTK is designed with them in mind.

What is GTK in Java?

It is part of the official GNOME language bindings suite and provides a set of libraries allowing developers to write computer programs for GNOME using the Java programming language and the GTK cross-platform widget toolkit. Java-gnome. Initial release. 0.99 / January 20, 1999.

What does GTK stand for Linux?

GTK is commonly and incorrectly thought to stand for "GNOME ToolKit", but is actually stands for "GIMP ToolKit" because it was first created to design an user interface for GIMP. GTK is an object-oriented toolkit written in C (GTK itself is not a language).


2 Answers

As far as I know, there's nothing wrong with the code. This is related to how Gtk theming.

Depending on how your themes are set, you might see the icon or not. By the way, the theme used by Xamarin is different from the one used by default, so running your application from within Xamarin Studio (F5) or from the command line might give different results.

If I remember well, under windows, there's a default Gtk theme and a Windows Theme. There's a tool to switch themes, but unfortunately, I can get my hands on it.

EDIT :

Here's how to get the themes running :

Here is a little software that will let you select a theme: http://sourceforge.net/projects/tumagcc/files/gtk2_prefs.exe/download

You'll also have to download a Gtk theme somewhere on the web (the first one I tried turned out to be ugly and unusable on windows, so you'll probably have to experiment a little bit here). Extract the theme (usually a tar.gz file) to your Gtk installation under share/themes. Make sure the directory structure, once the theme extracted is like :

{Gtk}/share/themes/MyFantasticTheme/Gtk-2.0

Then launch the little software as Administrator, select your theme in the list and click OK. Now run your app from outside Xamarin Studio.

EDIT #2:

After some fiddling I found out a way that displays icons and labels within buttons:

Application.Init ();
Gtk.Settings.Default.ThemeName = "Theme/gtk-2.0/gtkrc";
Gtk.Rc.Parse ("./Theme/gtk-2.0/gtkrc");

My theme consists of a single line inside Theme/gtk-2.0/gtkrc (documentation about the gtkrc file can be easily found, since it's not Gtk# specific):

gtk-button-images = 1

What I think happens is that a default theme is somehow set when your application starts, and this default theme can't be overriden. Why is it so? Maybe because the default theme runs with a specific Gtk engine for windows that doesn't allow icons in buttons. By overriding the default theme, I believe that you switch Gtk to the default engine.

like image 143
Kristof Avatar answered Sep 23 '22 13:09

Kristof


You can achieve the same effect by putting the following after you initialize Gtk.

//Application.Init(); - insert after this line
Gtk.Settings.Default.SetLongProperty ("gtk-button-images", 1, "");
like image 43
Paul Avatar answered Sep 24 '22 13:09

Paul