Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problem with Python introspection and MatePanelApplet.set_size_hints #727

Closed
robint99 opened this issue Feb 3, 2018 · 5 comments · Fixed by #730
Closed

Problem with Python introspection and MatePanelApplet.set_size_hints #727

robint99 opened this issue Feb 3, 2018 · 5 comments · Fixed by #730

Comments

@robint99
Copy link

robint99 commented Feb 3, 2018

I'm not sure if this is the right place or not to report this, but I'm having a problem with MatePanelApplet python introspection. I'm trying to call MatePanelApplet.set_size_hints() but keep getting "TypeError: Must be number, not list" exceptions.

I've looked at the code in applets/wncklet/window_list.c and it seems that I'm passing the right parameters in the right order. I've even tried changing them around but no joy - I get the same TypeError no matter what I do.

This happens on both mate-panel 1.18.4 (Ubuntu Mate 17.10) and mate-panel 1.18.7 (Arch), but seems to have been around at least a year or so. I found this while googling for a solution.

To reproduce the error, I've adapted the the Mate University python applet and attached the code

university-python-applet.tar.gz

@info-cppsp
Copy link
Contributor

info-cppsp commented Feb 3, 2018

Congrats on finding Mate University!

>>> MatePanelApplet.Applet.set_size_hints.__doc__
'set_size_hints(self, size_hints:int, n_elements:int, base_size:int)'

How about using just one number at a time?

I'll look more into it later...

I though first that gi.repository has the class MatePanelApplet. But that is not really true. It is added by the gir1.2-mate-panel package, if I'm correct.
That is generated here:

# Introspection generation

quick way to test python applet:
find dbus service file
/usr/share/dbus-1/services/org.mate.panel.applet.UniversityPythonAppletFactory.service
check execute location
Exec=/usr/libexec/university-python-applet
open / write that file instead of remake-ing the whole mate-university.

use /var/log/syslog to see the problems / exceptions


https://stackoverflow.com/questions/4145775/how-do-i-convert-a-python-list-into-a-c-array-by-using-ctypes
doesn't work...


https://wiki.gnome.org/action/show/Projects/GObjectIntrospection?action=show&redirect=GObjectIntrospection
https://blogs.gnome.org/johan/2008/06/01/introduction-to-gobject-introspection/

@info-cppsp
Copy link
Contributor

info-cppsp commented Feb 5, 2018

I took /usr/lib/x86_64-linux-gnu/girepository-1.0/MatePanelApplet-4.0.typelib.
(From my main system, mint 18.3...)
I ran it through g-ir-generate, which essentially reverses the typelib generation.
AFAIK the typelib contains the API to which other languages can 'connect'.

Here is the output:

<?xml version="1.0"?>
<repository version="1.0"
            xmlns="http://www.gtk.org/introspection/core/1.0"
            xmlns:c="http://www.gtk.org/introspection/c/1.0"
            xmlns:glib="http://www.gtk.org/introspection/glib/1.0">
  <include name="Gtk" version="3.0"/>
  <include name="Gio" version="2.0"/>
  <include name="GObject" version="2.0"/>
  <namespace name="MatePanelApplet" version="4.0" shared-library="libmate-panel-applet-4.so.1" c:prefix="MatePanel">
    <constant name="APPLET_FLAGS_ALL" value="0">
      <type name="gint32"/>
    </constant>
    <class name="Applet" parent="Gtk.EventBox" glib:type-struct="AppletClass" glib:type-name="MatePanelApplet" glib:get-type="mate_panel_applet_get_type">
      <implements name="Atk.ImplementorIface"/>
      <implements name="Gtk.Buildable"/>
      <field name="event_box">
        <type name="Gtk.EventBox"/>
      </field>
      <field name="priv">
        <type name="AppletPrivate"/>
      </field>
      <constructor name="new" c:identifier="mate_panel_applet_new">
        <return-value transfer-ownership="none">
          <type name="Gtk.Widget"/>
        </return-value>
      </constructor>
      <function name="factory_main" c:identifier="mate_panel_applet_factory_main">
        <return-value transfer-ownership="none">
          <type name="gint32"/>
        </return-value>
        <parameters>
          <parameter name="factory_id" transfer-ownership="none">
            <type name="utf8"/>
          </parameter>
          <parameter name="out_process" transfer-ownership="none">
            <type name="gboolean"/>
          </parameter>
          <parameter name="applet_type" transfer-ownership="none">
            <type name="GType"/>
          </parameter>
          <parameter name="callback" transfer-ownership="none" scope="call" closure="4">
            <type name="AppletFactoryCallback"/>
          </parameter>
          <parameter name="data" transfer-ownership="none">
            <type name="any"/>
          </parameter>
        </parameters>
      </function>
      <method name="get_background" c:identifier="mate_panel_applet_get_background">
        <return-value transfer-ownership="none">
          <type name="AppletBackgroundType"/>
        </return-value>
        <parameters>
          <parameter name="color" transfer-ownership="none">
            <type name="Gdk.RGBA"/>
          </parameter>
          <parameter name="pattern" transfer-ownership="none">
            <type name="cairo.Pattern"/>
          </parameter>
        </parameters>
      </method>
      <method name="get_flags" c:identifier="mate_panel_applet_get_flags">
        <return-value transfer-ownership="none">
          <type name="AppletFlags"/>
        </return-value>
      </method>
      <method name="get_locked_down" c:identifier="mate_panel_applet_get_locked_down">
        <return-value transfer-ownership="none">
          <type name="gboolean"/>
        </return-value>
      </method>
      <method name="get_orient" c:identifier="mate_panel_applet_get_orient">
        <return-value transfer-ownership="none">
          <type name="AppletOrient"/>
        </return-value>
      </method>
      <method name="get_preferences_path" c:identifier="mate_panel_applet_get_preferences_path">
        <return-value transfer-ownership="full">
          <type name="utf8"/>
        </return-value>
      </method>
      <method name="get_size" c:identifier="mate_panel_applet_get_size">
        <return-value transfer-ownership="none">
          <type name="guint32"/>
        </return-value>
      </method>
      <method name="request_focus" c:identifier="mate_panel_applet_request_focus">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="timestamp" transfer-ownership="none">
            <type name="guint32"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_background_widget" c:identifier="mate_panel_applet_set_background_widget" deprecated="1">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="widget" transfer-ownership="none">
            <type name="Gtk.Widget"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_flags" c:identifier="mate_panel_applet_set_flags">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="flags" transfer-ownership="none">
            <type name="AppletFlags"/>
          </parameter>
        </parameters>
      </method>
      <method name="set_size_hints" c:identifier="mate_panel_applet_set_size_hints">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="size_hints" transfer-ownership="none">
            <type name="gint32"/>
          </parameter>
          <parameter name="n_elements" transfer-ownership="none">
            <type name="gint32"/>
          </parameter>
          <parameter name="base_size" transfer-ownership="none">
            <type name="gint32"/>
          </parameter>
        </parameters>
      </method>
      <method name="setup_menu" c:identifier="mate_panel_applet_setup_menu">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="xml" transfer-ownership="none">
            <type name="utf8"/>
          </parameter>
          <parameter name="action_group" transfer-ownership="none">
            <type name="Gtk.ActionGroup"/>
          </parameter>
        </parameters>
      </method>
      <method name="setup_menu_from_file" c:identifier="mate_panel_applet_setup_menu_from_file">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="filename" transfer-ownership="none">
            <type name="utf8"/>
          </parameter>
          <parameter name="action_group" transfer-ownership="none">
            <type name="Gtk.ActionGroup"/>
          </parameter>
        </parameters>
      </method>
      <property name="background" writable="1" transfer-ownership="none">
        <type name="utf8"/>
      </property>
      <property name="closure" writable="1" construct-only="1" transfer-ownership="none">
        <type name="any"/>
      </property>
      <property name="connection" writable="1" construct-only="1" transfer-ownership="none">
        <type name="Gio.DBusConnection"/>
      </property>
      <property name="flags" writable="1" transfer-ownership="none">
        <type name="guint32"/>
      </property>
      <property name="id" writable="1" construct-only="1" transfer-ownership="none">
        <type name="utf8"/>
      </property>
      <property name="locked" writable="1" transfer-ownership="none">
        <type name="gboolean"/>
      </property>
      <property name="locked-down" writable="1" transfer-ownership="none">
        <type name="gboolean"/>
      </property>
      <property name="orient" writable="1" transfer-ownership="none">
        <type name="guint32"/>
      </property>
      <property name="prefs-path" writable="1" transfer-ownership="none">
        <type name="utf8"/>
      </property>
      <property name="size" writable="1" transfer-ownership="none">
        <type name="guint32"/>
      </property>
      <property name="size-hints" writable="1" transfer-ownership="none">
        <type name="any"/>
      </property>
      <glib:signal name="change-background" when="LAST">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="AppletBackgroundType"/>
          </parameter>
          <parameter name="p0" transfer-ownership="none">
            <type name="Gdk.RGBA"/>
          </parameter>
          <parameter name="p1" transfer-ownership="none">
            <type name="cairo.Pattern"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="change-orient" when="LAST">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="guint32"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="change-size" when="LAST">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="gint32"/>
          </parameter>
        </parameters>
      </glib:signal>
      <glib:signal name="move-focus-out-of-applet" when="LAST" action="1">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="object" transfer-ownership="none">
            <type name="Gtk.DirectionType"/>
          </parameter>
        </parameters>
      </glib:signal>
      <virtual-method name="change_background" offset="65535">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="type" transfer-ownership="none">
            <type name="AppletBackgroundType"/>
          </parameter>
          <parameter name="color" transfer-ownership="none">
            <type name="Gdk.RGBA"/>
          </parameter>
          <parameter name="pattern" transfer-ownership="none">
            <type name="cairo.Pattern"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="change_orient" offset="65535">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="orient" transfer-ownership="none">
            <type name="AppletOrient"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="change_size" offset="65535">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="size" transfer-ownership="none">
            <type name="guint32"/>
          </parameter>
        </parameters>
      </virtual-method>
      <virtual-method name="move_focus_out_of_applet" offset="65535">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="direction" transfer-ownership="none">
            <type name="Gtk.DirectionType"/>
          </parameter>
        </parameters>
      </virtual-method>
    </class>
    <enumeration name="AppletBackgroundType" glib:type-name="MatePanelAppletBackgroundType" glib:get-type="mate_panel_applet_background_type_get_type">
      <member name="no_background" value="0">
        <attribute name="c:identifier" value="PANEL_NO_BACKGROUND"/>
      </member>
      <member name="color_background" value="1">
        <attribute name="c:identifier" value="PANEL_COLOR_BACKGROUND"/>
      </member>
      <member name="pixmap_background" value="2">
        <attribute name="c:identifier" value="PANEL_PIXMAP_BACKGROUND"/>
      </member>
    </enumeration>
    <record name="AppletClass" glib:is-gtype-struct="1">
      <field name="event_box_class">
        <type name="Gtk.EventBoxClass"/>
      </field>
      <field name="change_orient">
        <callback name="change_orient">
          <return-value transfer-ownership="none">
            <type name="none"/>
          </return-value>
          <parameters>
            <parameter name="applet" transfer-ownership="none">
              <type name="Applet"/>
            </parameter>
            <parameter name="orient" transfer-ownership="none">
              <type name="AppletOrient"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="change_size">
        <callback name="change_size">
          <return-value transfer-ownership="none">
            <type name="none"/>
          </return-value>
          <parameters>
            <parameter name="applet" transfer-ownership="none">
              <type name="Applet"/>
            </parameter>
            <parameter name="size" transfer-ownership="none">
              <type name="guint32"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="change_background">
        <callback name="change_background">
          <return-value transfer-ownership="none">
            <type name="none"/>
          </return-value>
          <parameters>
            <parameter name="applet" transfer-ownership="none">
              <type name="Applet"/>
            </parameter>
            <parameter name="type" transfer-ownership="none">
              <type name="AppletBackgroundType"/>
            </parameter>
            <parameter name="color" transfer-ownership="none">
              <type name="Gdk.RGBA"/>
            </parameter>
            <parameter name="pattern" transfer-ownership="none">
              <type name="cairo.Pattern"/>
            </parameter>
          </parameters>
        </callback>
      </field>
      <field name="move_focus_out_of_applet">
        <callback name="move_focus_out_of_applet">
          <return-value transfer-ownership="none">
            <type name="none"/>
          </return-value>
          <parameters>
            <parameter name="frame" transfer-ownership="none">
              <type name="Applet"/>
            </parameter>
            <parameter name="direction" transfer-ownership="none">
              <type name="Gtk.DirectionType"/>
            </parameter>
          </parameters>
        </callback>
      </field>
    </record>
    <callback name="AppletFactoryCallback">
      <return-value transfer-ownership="none">
        <type name="gboolean"/>
      </return-value>
      <parameters>
        <parameter name="applet" transfer-ownership="none">
          <type name="Applet"/>
        </parameter>
        <parameter name="iid" transfer-ownership="none">
          <type name="utf8"/>
        </parameter>
        <parameter name="user_data" transfer-ownership="none" closure="2">
          <type name="any"/>
        </parameter>
      </parameters>
    </callback>
    <bitfield name="AppletFlags" glib:type-name="MatePanelAppletFlags" glib:get-type="mate_panel_applet_flags_get_type">
      <member name="flags_none" value="0">
        <attribute name="c:identifier" value="MATE_PANEL_APPLET_FLAGS_NONE"/>
      </member>
      <member name="expand_major" value="1">
        <attribute name="c:identifier" value="MATE_PANEL_APPLET_EXPAND_MAJOR"/>
      </member>
      <member name="expand_minor" value="2">
        <attribute name="c:identifier" value="MATE_PANEL_APPLET_EXPAND_MINOR"/>
      </member>
      <member name="has_handle" value="4">
        <attribute name="c:identifier" value="MATE_PANEL_APPLET_HAS_HANDLE"/>
      </member>
    </bitfield>
    <enumeration name="AppletOrient" glib:type-name="MatePanelAppletOrient" glib:get-type="mate_panel_applet_orient_get_type">
      <member name="up" value="0">
        <attribute name="c:identifier" value="MATE_PANEL_APPLET_ORIENT_UP"/>
      </member>
      <member name="down" value="1">
        <attribute name="c:identifier" value="MATE_PANEL_APPLET_ORIENT_DOWN"/>
      </member>
      <member name="left" value="2">
        <attribute name="c:identifier" value="MATE_PANEL_APPLET_ORIENT_LEFT"/>
      </member>
      <member name="right" value="3">
        <attribute name="c:identifier" value="MATE_PANEL_APPLET_ORIENT_RIGHT"/>
      </member>
    </enumeration>
    <record name="AppletPrivate"/>
  </namespace>
</repository>

The interesting part:

      <method name="set_size_hints" c:identifier="mate_panel_applet_set_size_hints">
        <return-value transfer-ownership="none">
          <type name="none"/>
        </return-value>
        <parameters>
          <parameter name="size_hints" transfer-ownership="none">
            <type name="gint32"/>
          </parameter>
          <parameter name="n_elements" transfer-ownership="none">
            <type name="gint32"/>
          </parameter>
          <parameter name="base_size" transfer-ownership="none">
            <type name="gint32"/>
          </parameter>
        </parameters>
      </method>

As you can see, the size_hints parameter is a gint32, which is obviously wrong.
Now let me read about how to correct the .xml generation from the source code...


https://wiki.gnome.org/Projects/GObjectIntrospection/Architecture


Note to self: the marshal stuff in mate-panel/libmate-panel-applet is for signals

in mate-panel-applet.c

	g_object_class_install_property (gobject_class,
					 PROP_SIZE_HINTS,
					 /* FIXME: value_array? */
					 g_param_spec_pointer ("size-hints",
							       "SizeHints",
							       "Panel Applet Size Hints",
							       G_PARAM_READWRITE));

https://wiki.gnome.org/Projects/GObjectIntrospection/Annotations/

@info-cppsp
Copy link
Contributor

OOOkaaayyy
So after a lot of research I have found that I can manipulate the generated API with annotations.
https://wiki.gnome.org/Projects/GObjectIntrospection/Annotations/
I have tried doing that and now the modded mu applet works on my dev system.
Added new PR.

@robint99
Copy link
Author

robint99 commented Feb 6, 2018 via email

@info-cppsp
Copy link
Contributor

No worries, mate!

Forgot sg very important:
If you are building mate-panel yourself, you are going to have to have the libgirepository1.0-dev (or equivalent) package, so that the make command generates the GObject Introspection files.
(The autogen.sh summary shows if you have it or not.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants