最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

gtk - How to get the color from GtkAda? - Stack Overflow

programmeradmin1浏览0评论

the attached code compile & runs.

$ ./xml_code Loading of XML is OK

(xml_code:31196): Gtk-CRITICAL **: 22:24:59.048: gtk_color_chooser_get_rgba: assertion 'GTK_IS_COLOR_CHOOSER (chooser)' failed Red : 0.00000000000000E+00 Green : 6.64864036484338E-310 Blue : 6.95298171953014E-310 Alpha : 6.64864036156160E-310

(xml_code:31196): Gtk-CRITICAL **: 22:25:02.163: gtk_color_chooser_get_rgba: assertion 'GTK_IS_COLOR_CHOOSER (chooser)' failed Red : 0.00000000000000E+00 Green : 6.64864036484338E-310 Blue : 6.95298171953014E-310 Alpha : 6.64864036156160E-310 ^C $

But i'm unable to retrieve the colors my user entered. In fact, I don't know how to load the value of the "Self" variable in the procedure "procedure On_Color1_Color_Set" in the window_callbacks.adb file. I don't find the correct method to load the variable. Perhaps is it an issue coming from GtkAda because the C code runs correctly, i don't know? Thank you Mark

--=- xml_code.adb -=-    
-- units from Gtk
with Gtk.Main;
with Glib.Error;     use Glib.Error;
with Gtk.Widget;     use Gtk.Widget;
with Gtk.Builder;    use Gtk.Builder;
with Gtkada.Builder; use Gtkada.Builder;

-- Ada predefined units
with Ada.Text_IO;    use Ada.Text_IO;
with Ada.Exceptions;

-- Application specific units
with Window_Callbacks; use Window_Callbacks;

procedure XML_Code is

  Builder         : Gtkada_Builder;
  Error           : aliased Glib.Error.GError;

  -- xml / Glade
  Mon_Interface   : Constant String := "<?xml version=""1.0"" encoding=""UTF-8""?>"
& "<!-- Generated with glade 3.40.0 -->"
& "<interface>"
& "  <requires lib=""gtk+"" version=""3.24""/>"
& "  <object class=""GtkAdjustment"" id=""adjustment1"">"
& "    <property name=""upper"">100</property>"
& "    <property name=""step-increment"">1</property>"
& "    <property name=""page-increment"">10</property>"
& " </object>"
& " <object class=""GtkListStore"" id=""liststore1"">"
& "    <columns>"
& "      <!-- column-name Col_1 -->"
& "      <column type=""gchararray""/>"
& "    </columns>"
& "    <data>"
& "      <row>"
& "        <col id=""0"">Ligne-1</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">bbb</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">dddd</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">eeeeeeee</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">ligne-5</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">ligne-6</col>"
& "      </row>"
& "    </data>"
& "  </object>"
& "  <object class=""GtkWindow"" id=""window"">"
& "    <property name=""name"">window</property>"
& "    <property name=""width-request"">89</property>"
& "    <property name=""height-request"">3</property>"
& "    <property name=""can-focus"">False</property>"
& "    <property name=""hexpand"">True</property>"
& "    <property name=""vexpand"">True</property>"
& "    <property name=""border-width"">0</property>"
& "    <property name=""window-position"">center</property>"
& "    <property name=""gravity"">center</property>"
& "    <child>"
& "      <object class=""GtkFixed"" id=""fixed1"">"
& "        <property name=""name"">fixed1</property>"
& "        <property name=""visible"">True</property>"
& "        <property name=""can-focus"">False</property>"
& "        <child>"
& "          <object class=""GtkColorButton"" id=""color1"">"
& "            <property name=""width-request"">100</property>"
& "            <property name=""height-request"">33</property>"
& "            <property name=""visible"">True</property>"
& "            <property name=""can-focus"">True</property>"
& "            <property name=""receives-default"">True</property>"
& "            <signal name=""color-set"" handler=""on_color1_color_set"" swapped=""no""/>"
& "          </object>"
& "          <packing>"
& "            <property name=""x"">298</property>"
& "            <property name=""y"">303</property>"
& "          </packing>"
& "        </child>"
& "      </object>"
& "    </child>"
& "  </object>"
& "</interface>";

  use type Glib.Guint;
     
  begin

    Gtk.Main.Init;

    Gtk_New (Builder);
    if Add_From_String (Gtk_Builder(Builder), Mon_Interface, Error'Access) = 0 then
      Put_Line ("Error : " & Get_Message (Error));
      Error_Free (Error);
      return;
    end if;
    Put_Line ("Loading of XML is OK ");

    Register_Handler (Builder, "on_window1_delete_event", On_Window1_Delete_Event'Access);

    Register_Handler (Builder, "on_color1_color_set",     On_Color1_Color_Set'Access);

    Do_Connect (Builder);

    Show_All (Gtk_Widget (Get_Object (GTK_Builder (Builder), "window")));

    Gtk.Main.Main;

    Unref (Builder);

  end XML_Code;
 

--=- window_callbacks.ads -=-
with Gtkada.Builder; use Gtkada.Builder;

package Window_Callbacks is

  function On_Window1_Delete_Event (Builder : access Gtkada_Builder_Record'Class) return Boolean;  --Ajout
  Procedure On_Color1_Color_Set    (Builder : access Gtkada_Builder_Record'Class);

end Window_Callbacks;


--=- window_callbacks.adb --=--    
-- units from GtkAda
with Gtk.Main;

with Gtk.Color_Chooser;           use Gtk.Color_Chooser;
with Gdk.RGBA;                    use Gdk.RGBA;

-- units from Glib
with Glib;              use Glib;

-- Ada predefined units
with Ada.Text_IO;       use Ada.Text_IO;


package body Window_Callbacks  is

  -----------------------------------------------
  -- On_Window1_Delete_Event
  -----------------------------------------------
  function On_Window1_Delete_Event 
                 (Builder : access Gtkada_Builder_Record'Class) return Boolean is
    pragma Unreferenced (Builder); -- C'est sciemment que Builder n'est pas utilisé dans la fonction
    begin
      Gtk.Main.Main_Quit;
      return False;
    end On_Window1_Delete_Event;

  ---------------------------------
  -- On_Color1_Color_Set  --
  ---------------------------------
  procedure On_Color1_Color_Set (Builder : access Gtkada_Builder_Record'Class) is
    pragma Unreferenced (Builder);

    Self  : Gtk_Color_Chooser;
    Color : Gdk_RGBA;
    begin
    
      Gtk.Color_Chooser.Get_RGBA (Self, Color);
    
      put_line ("Red : "   &  Gdouble'Image (Color.Red));
      put_line ("Green : " &  Gdouble'Image (Color.Green));     
      put_line ("Blue : "  &  Gdouble'Image (Color.Blue));    
      put_line ("Alpha : " &  Gdouble'Image (Color.Alpha));
    
    end On_Color1_Color_Set;

end Window_Callbacks;

the attached code compile & runs.

$ ./xml_code Loading of XML is OK

(xml_code:31196): Gtk-CRITICAL **: 22:24:59.048: gtk_color_chooser_get_rgba: assertion 'GTK_IS_COLOR_CHOOSER (chooser)' failed Red : 0.00000000000000E+00 Green : 6.64864036484338E-310 Blue : 6.95298171953014E-310 Alpha : 6.64864036156160E-310

(xml_code:31196): Gtk-CRITICAL **: 22:25:02.163: gtk_color_chooser_get_rgba: assertion 'GTK_IS_COLOR_CHOOSER (chooser)' failed Red : 0.00000000000000E+00 Green : 6.64864036484338E-310 Blue : 6.95298171953014E-310 Alpha : 6.64864036156160E-310 ^C $

But i'm unable to retrieve the colors my user entered. In fact, I don't know how to load the value of the "Self" variable in the procedure "procedure On_Color1_Color_Set" in the window_callbacks.adb file. I don't find the correct method to load the variable. Perhaps is it an issue coming from GtkAda because the C code runs correctly, i don't know? Thank you Mark

--=- xml_code.adb -=-    
-- units from Gtk
with Gtk.Main;
with Glib.Error;     use Glib.Error;
with Gtk.Widget;     use Gtk.Widget;
with Gtk.Builder;    use Gtk.Builder;
with Gtkada.Builder; use Gtkada.Builder;

-- Ada predefined units
with Ada.Text_IO;    use Ada.Text_IO;
with Ada.Exceptions;

-- Application specific units
with Window_Callbacks; use Window_Callbacks;

procedure XML_Code is

  Builder         : Gtkada_Builder;
  Error           : aliased Glib.Error.GError;

  -- xml / Glade
  Mon_Interface   : Constant String := "<?xml version=""1.0"" encoding=""UTF-8""?>"
& "<!-- Generated with glade 3.40.0 -->"
& "<interface>"
& "  <requires lib=""gtk+"" version=""3.24""/>"
& "  <object class=""GtkAdjustment"" id=""adjustment1"">"
& "    <property name=""upper"">100</property>"
& "    <property name=""step-increment"">1</property>"
& "    <property name=""page-increment"">10</property>"
& " </object>"
& " <object class=""GtkListStore"" id=""liststore1"">"
& "    <columns>"
& "      <!-- column-name Col_1 -->"
& "      <column type=""gchararray""/>"
& "    </columns>"
& "    <data>"
& "      <row>"
& "        <col id=""0"">Ligne-1</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">bbb</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">dddd</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">eeeeeeee</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">ligne-5</col>"
& "      </row>"
& "      <row>"
& "        <col id=""0"">ligne-6</col>"
& "      </row>"
& "    </data>"
& "  </object>"
& "  <object class=""GtkWindow"" id=""window"">"
& "    <property name=""name"">window</property>"
& "    <property name=""width-request"">89</property>"
& "    <property name=""height-request"">3</property>"
& "    <property name=""can-focus"">False</property>"
& "    <property name=""hexpand"">True</property>"
& "    <property name=""vexpand"">True</property>"
& "    <property name=""border-width"">0</property>"
& "    <property name=""window-position"">center</property>"
& "    <property name=""gravity"">center</property>"
& "    <child>"
& "      <object class=""GtkFixed"" id=""fixed1"">"
& "        <property name=""name"">fixed1</property>"
& "        <property name=""visible"">True</property>"
& "        <property name=""can-focus"">False</property>"
& "        <child>"
& "          <object class=""GtkColorButton"" id=""color1"">"
& "            <property name=""width-request"">100</property>"
& "            <property name=""height-request"">33</property>"
& "            <property name=""visible"">True</property>"
& "            <property name=""can-focus"">True</property>"
& "            <property name=""receives-default"">True</property>"
& "            <signal name=""color-set"" handler=""on_color1_color_set"" swapped=""no""/>"
& "          </object>"
& "          <packing>"
& "            <property name=""x"">298</property>"
& "            <property name=""y"">303</property>"
& "          </packing>"
& "        </child>"
& "      </object>"
& "    </child>"
& "  </object>"
& "</interface>";

  use type Glib.Guint;
     
  begin

    Gtk.Main.Init;

    Gtk_New (Builder);
    if Add_From_String (Gtk_Builder(Builder), Mon_Interface, Error'Access) = 0 then
      Put_Line ("Error : " & Get_Message (Error));
      Error_Free (Error);
      return;
    end if;
    Put_Line ("Loading of XML is OK ");

    Register_Handler (Builder, "on_window1_delete_event", On_Window1_Delete_Event'Access);

    Register_Handler (Builder, "on_color1_color_set",     On_Color1_Color_Set'Access);

    Do_Connect (Builder);

    Show_All (Gtk_Widget (Get_Object (GTK_Builder (Builder), "window")));

    Gtk.Main.Main;

    Unref (Builder);

  end XML_Code;
 

--=- window_callbacks.ads -=-
with Gtkada.Builder; use Gtkada.Builder;

package Window_Callbacks is

  function On_Window1_Delete_Event (Builder : access Gtkada_Builder_Record'Class) return Boolean;  --Ajout
  Procedure On_Color1_Color_Set    (Builder : access Gtkada_Builder_Record'Class);

end Window_Callbacks;


--=- window_callbacks.adb --=--    
-- units from GtkAda
with Gtk.Main;

with Gtk.Color_Chooser;           use Gtk.Color_Chooser;
with Gdk.RGBA;                    use Gdk.RGBA;

-- units from Glib
with Glib;              use Glib;

-- Ada predefined units
with Ada.Text_IO;       use Ada.Text_IO;


package body Window_Callbacks  is

  -----------------------------------------------
  -- On_Window1_Delete_Event
  -----------------------------------------------
  function On_Window1_Delete_Event 
                 (Builder : access Gtkada_Builder_Record'Class) return Boolean is
    pragma Unreferenced (Builder); -- C'est sciemment que Builder n'est pas utilisé dans la fonction
    begin
      Gtk.Main.Main_Quit;
      return False;
    end On_Window1_Delete_Event;

  ---------------------------------
  -- On_Color1_Color_Set  --
  ---------------------------------
  procedure On_Color1_Color_Set (Builder : access Gtkada_Builder_Record'Class) is
    pragma Unreferenced (Builder);

    Self  : Gtk_Color_Chooser;
    Color : Gdk_RGBA;
    begin
    
      Gtk.Color_Chooser.Get_RGBA (Self, Color);
    
      put_line ("Red : "   &  Gdouble'Image (Color.Red));
      put_line ("Green : " &  Gdouble'Image (Color.Green));     
      put_line ("Blue : "  &  Gdouble'Image (Color.Blue));    
      put_line ("Alpha : " &  Gdouble'Image (Color.Alpha));
    
    end On_Color1_Color_Set;

end Window_Callbacks;
Share Improve this question asked Nov 16, 2024 at 21:41 MarkMark 696 bronze badges 0
Add a comment  | 

1 Answer 1

Reset to default 0

The problem is that in On_Color1_Color_Set, self is just a null value. The Gtk_Color_Chooser has already been closed so there is no way of accessing it. The only thing you can play with is the button Color1.

First, add the declaration of Color_Button to the with statements

with Gtk.Color_Button; use Gtk.Color_Button;

The Gtk.Color_Chooser can be removed. In the callback

procedure On_Color1_Color_Set(builder: access Gtkada_Builder_Record'Class) is
   self: Gtk_Color_Button;
   rgba: Gdk_RGBA;
begin
   -- Get the color button
   self := Gtk_Color_Button(builder.Get_Object("color1"));
   -- Get the RGBA value from the button
   Gtk.Color_Button.Get_RGBA(self, rgba);

   -- Convert RGBA to a string
   declare
       color: constant String := To_String(rgba);
   begin
       Put_Line(color);

       -- RGB values in floating point format
       Put_Line("Red   " & rgba.red'image);
       Put_Line("Green " & rgba.green'image);
       Put_Line("Blue  " & rgba.blue'image);
       Put_Line("Alpha " & rgba.alpha'image);
   end;
end On_Color1_Color_Set;

Choosing one of the colors, you get

Loading of XML is OK 
rgb(129,61,156)
Red    5.05882352941176E-01
Green  2.39215686274510E-01
Blue   6.11764705882353E-01
Alpha  1.00000000000000E+00

I find the integers easier to use than the floats.

发布评论

评论列表(0)

  1. 暂无评论