<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Gtk3 on Touhami&#39;s Space</title>
    <link>https://touha.me/tags/gtk3/index.xml</link>
    <description>Recent content in Gtk3 on Touhami&#39;s Space</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-US</language>
    <copyright>All rights reserved - 2017</copyright>
    <atom:link href="https://touha.me/tags/gtk3/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>[Python] Utiliser GtkSourceView avec un fichier Glade</title>
      <link>https://touha.me/post/python-utiliser-gtksourceview-avec-fichier-glade/</link>
      <pubDate>Mon, 08 Jul 2013 13:48:49 +0000</pubDate>
      
      <guid>https://touha.me/post/python-utiliser-gtksourceview-avec-fichier-glade/</guid>
      <description>

&lt;p&gt;Il y a trop peu de documentation sur l&amp;rsquo;utilisation de &lt;strong&gt;GtkSourceView3&lt;/strong&gt; et
encore moins avec &lt;strong&gt;Glade&lt;/strong&gt;. Donc voici un petit tutoriel simpliste pour
démarrer.&lt;/p&gt;

&lt;h2 id=&#34;installation-du-paquet-de-developpement-gtksourceview&#34;&gt;Installation du paquet de developpement GtkSourceView&lt;/h2&gt;

&lt;p&gt;Il vous faut installer le paquet &lt;code&gt;gtksourceview3-devel&lt;/code&gt; sur Fedora :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# yum install gtksourceview3-devel
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ou &lt;code&gt;libgtksourceview-3.0-dev&lt;/code&gt; sur Debian :&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# apt-get install libgtksourceview-3.0-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ceci ajoute le catalogue (support) de GtkSourceView dans Glade.&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://touha.me/images/glade-gtksourceview/glade-gtksourceview.png&#34; alt=&#34;Catalogue GtkSourceView dans Glade&#34; /&gt;&lt;/p&gt;

&lt;p&gt;Catalogue GtkSourceView dans Glade&lt;/p&gt;

&lt;h2 id=&#34;exemple-d-utilisation&#34;&gt;Exemple d&amp;rsquo;utilisation&lt;/h2&gt;

&lt;pre&gt;&lt;code class=&#34;language-python&#34;&gt;from gi.repository import Gtk, GtkSource, GObject

class MyApp(object): def __init__(self):
    self.builder = Gtk.Builder()
    GObject.type_register(GtkSource.View)
    self.builder.add_from_file(&amp;quot;ui.glade&amp;quot;)

if __name__ == &#39;__main__&#39;:
    gui = MyApp()
    Gtk.main()
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&#34;remarque&#34;&gt;Remarque&lt;/h4&gt;

&lt;p&gt;Il est important d’enregistrer le type &lt;code&gt;GtkSource.View&lt;/code&gt; comme dans la 6éme
ligne. Sinon, ça ne marchera pas.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>GTK&#43;3 et style CSS</title>
      <link>https://touha.me/post/gtk3-style-css/</link>
      <pubDate>Sat, 08 Dec 2012 22:05:00 +0000</pubDate>
      
      <guid>https://touha.me/post/gtk3-style-css/</guid>
      <description>

&lt;p&gt;GTK+3 donne la possibilité de donner du style aux applications et les widgets
via une description CSS-like très naturelle. Les designeurs familiers au CSS
pourront donc créer facilement de fabuleuses interfaces au design totalement
personnalisable.&lt;/p&gt;

&lt;p&gt;Il est à noter qu&amp;rsquo;en Qt, il est possible d&amp;rsquo;appliquer du CSS directement via
l’éditeur visuel de fenêtres. Mais pour GTK+, il vas falloir le faire
programmatiquement, (On peut désormé appliquer des classe de style depuis Glade)
mais ce n&amp;rsquo;est pas si compliqué. C&amp;rsquo;est d&amp;rsquo;une facilité déconcertante.&lt;/p&gt;

&lt;p&gt;Je vais dans cet article vous montrer comment appliquer du CSS à une interface
GTK+ en Python (PyGobject).&lt;/p&gt;

&lt;h2 id=&#34;de-la-théorie&#34;&gt;De la théorie&lt;/h2&gt;

&lt;p&gt;Pour utiliser ce fichu CSS, on va devoir nous servir de l&amp;rsquo;objet
&lt;strong&gt;Gtk.CssProvider&lt;/strong&gt;. On indique à ce CssProvider notre feuille de style qu&amp;rsquo;on
charge soit depuis un fichier .css soit d&amp;rsquo;une variable string. Il ne reste plus
qu&amp;rsquo;à appliquer ce CSS. En d&amp;rsquo;autres termes, on charge du CSS dans un provider,
qu&amp;rsquo;on ajoute au contexte &lt;em&gt;stylistique&lt;/em&gt; d&amp;rsquo;un widget ou de toute l&amp;rsquo;application.&lt;/p&gt;

&lt;p&gt;Dans la suite, ce qui appliquera réellement du style CSS est la ligne :
&lt;code&gt;widget.get_style_context().add_provider(css, 600)&lt;/code&gt; Le &lt;strong&gt;600&lt;/strong&gt; de la fin indique
l&amp;rsquo;indice de priorité d’exécution du style. Plus cet indice est bas, plutôt le
style sera appliqué et plus il aura de chance de se faire écraser. Je crois que
cette ligne parle d&amp;rsquo;elle même et n&amp;rsquo;as pas besoin de plus d’explications. Mais si
vous avez des questions, n&amp;rsquo;hésitez surtout pas à ne pas les poser, en
commentaire ;).&lt;/p&gt;

&lt;h2 id=&#34;appliquer-le-css-sur-l-ensemble-de-l-application&#34;&gt;Appliquer le CSS sur l’ensemble de l&amp;rsquo;application&lt;/h2&gt;

&lt;pre&gt;&lt;code class=&#34;language-python&#34;&gt;from gi.repository import Gtk, Gdk

css = Gtk.CssProvider()

# css.load_from_file(file)
css.load_from_data(&#39;&#39;&#39;
GtkEntry {
    color: #900185;
}&#39;&#39;&#39;)

Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),
       css, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;appliquer-le-css-sur-un-seul-widget&#34;&gt;Appliquer le CSS sur un seul widget&lt;/h2&gt;

&lt;pre&gt;&lt;code class=&#34;language-python&#34;&gt;entry = Gtk.Entry()

css = Gtk.CssProvider()

# css.load_from_file(file)
css.load_from_data(&#39;&#39;&#39;
GtkEntry {
    color: #900185;
}
&#39;&#39;&#39;)

entry.get_style_context().add_provider(css, 600)
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;selecteurs&#34;&gt;Selecteurs&lt;/h2&gt;

&lt;p&gt;On peut utiliser les sélecteurs CSS et de la même façon. Toutefois, il est plus
commode de faire quelques rappels par ici.  Il faut indiquer le nom de la class
du widget comme qui dirait en C à la place des noms des éléments. On doit donc
préfixer le nom du widget par un &lt;strong&gt;Gtk&lt;/strong&gt;. Par exemple &lt;em&gt;GtkEntry&lt;/em&gt;, et pas juste
un Entry. Les noms des widgets (ceux que vous leurs donner) jouent le rôle des
IDs.&lt;/p&gt;

&lt;p&gt;Voici quelques exemples de ce qu&amp;rsquo;on peut faire. Ce sont les exemples de la
documentation officielle. J&amp;rsquo;ai simplement traduit les commentaires.&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-css&#34;&gt;/* Donne du style aux labels qui descendent d&#39;une fenêtre */
GtkWindow GtkLabel {
    background-color: #898989
}

/* Donne du style aux notebooks et tout ce qui se trouve
 à l’intérieur */
GtkNotebook {
    background-color: #a939f0
}

/* Donne du style aux combo boxes, et les entries qui
 descendent directement de notebook */
GtkComboBox,
GtkNotebook &amp;gt; GtkEntry {
    color: @fg_color;
    background-color: #1209a2
}

/* Donne du style à n&#39;importe quel widget à
 l&#39;intérieur d&#39;un GtkBin */
GtkBin * {
    font: Sans 20
}

/* Donne du style à un label nommé title-label */
GtkLabel#title-label {
    font: Sans 15
}

/* Donne du style à tout widget nommé main-entry */
#main-entry {
    background-color: #f0a810
}

/* Donne du style à tous les widget définissants la class entry */
.entry {
    color: #39f1f9;
}

/* Donne du style seulement aux entries des spinbuttons */
GtkSpinButton.entry {
    color: #900185
}
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
    <item>
      <title>Toolbar GTK&#43; 3</title>
      <link>https://touha.me/post/toolbar-gtk3/</link>
      <pubDate>Tue, 25 Sep 2012 17:18:53 +0000</pubDate>
      
      <guid>https://touha.me/post/toolbar-gtk3/</guid>
      <description>

&lt;p&gt;Si vous créez des toolbars avec GTK+ 3 elle ne suivra pas le style des autres
applications et ne s&amp;rsquo;affichera pas avec le fond cool peu plus sombre que le
reste de la fenêtre, mais vous aurez une simple toolbar que l&amp;rsquo;on confond avec le
reste de la fenêtre.&lt;/p&gt;

&lt;p&gt;[gallery columns=&amp;ldquo;2&amp;rdquo; ids=&amp;ldquo;232,233&amp;rdquo;]&lt;/p&gt;

&lt;p&gt;La solution consiste à indiquer au programme la toolbar principale et il GTK+ 3
s&amp;rsquo;occupera de tout.&lt;/p&gt;

&lt;p&gt;Je n&amp;rsquo;es pas réussi a trouver de paramètres dans Glade pour se faire, mais vous
pouvez ajouter ces trois lignes dans la description de la toolbar directement
dans le fichiers .glade dans le noeud &lt;code&gt;&amp;lt;object class=&amp;quot;GtkToolbar&amp;quot;/&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;class name=&amp;quot;primary-toolbar&amp;quot;/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; : Il est désormais possible d’indiquer la class &lt;strong&gt;primary-toolbar&lt;/strong&gt;
depuis Glade.&lt;/p&gt;

&lt;p&gt;C&amp;rsquo;est universel est sa marche partout, &lt;strike&gt;mais il n&amp;rsquo;y a pas d&amp;rsquo;options pour
le faire via l&amp;rsquo;interface de Glade pour le moment, enfin, à ce que je
sache&lt;/strike&gt;.  Il y a aussi la class &amp;ldquo;inline-toolbar&amp;rdquo; qui est utile si vous
voulez mettre votre toolbar au milieux de la fenêtre. Le rendu est presque le
même, mais le bord sont de façon a ce qu&amp;rsquo;il ne touche pas les bord de la
fenêtre.&lt;/p&gt;

&lt;p&gt;Dans ce qui suit, on va faire la même chose, mais programmatiquement.&lt;/p&gt;

&lt;h3 id=&#34;python&#34;&gt;Python&lt;/h3&gt;

&lt;p&gt;Voici le code magique :&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-python&#34;&gt;toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Exemple :&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-python&#34;&gt;from gi.repository import Gtk

class CoolToolbar:
	def __init__(self):
		self.win = Gtk.Builder()
		self.win.add_from_file(&amp;quot;toolbar.glade&amp;quot;)
		self.toolbar = self.win.get_object(&amp;quot;toolbar&amp;quot;)
		self.toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR)
		self.win.connect_signals(self)

	def quit(self, widget):
		Gtk.main_quit()

if __name__ == &amp;quot;__main__&amp;quot;:
	CoolToolbar()
	Gtk.main()
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;c&#34;&gt;C++&lt;/h3&gt;

&lt;p&gt;En C++, il faut d&amp;rsquo;abord ajouter le header &lt;em&gt;gtkmm/stylecontext.h&lt;/em&gt; et se servir du
code magique. Notez que si vous utilisez le header &lt;em&gt;gtkmm.h&lt;/em&gt; vous pouvez omettre
d&amp;rsquo;utiliser &lt;em&gt;gtkmm/stylecontext.h&lt;/em&gt; comme dans l&amp;rsquo;exemple.
&lt;code&gt;m_toolbar-&amp;gt;get_style_context()-&amp;gt;add_class(GTK_STYLE_CLASS_PRIMARY_TOOLBAR);&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemple :&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-cpp&#34;&gt;#include &amp;lt;gtkmm.h&amp;gt;
//Il est déconseillé de travailler en GTK+ de cette manière là, mais je veux faire minimaliste.
int main (int argc, char *argv[])
{
	Glib::RefPtr&amp;lt;gtk::application&amp;gt; app = Gtk::Application::create(argc, argv, &amp;quot;org.gtkmm.toolbar&amp;quot;);
	Gtk::Window main;
	Gtk::Toolbar* m_toolbar;

	Glib::RefPtr&amp;lt;gtk::builder&amp;gt; builder = Gtk::Builder::create_from_file(&amp;quot;toolbar.glade&amp;quot;);
	builder-&amp;gt;get_widget(&amp;quot;toolbar&amp;quot;, m_toolbar);
	m_toolbar-&amp;gt;get_style_context()-&amp;gt;add_class(GTK_STYLE_CLASS_PRIMARY_TOOLBAR);

	return app-&amp;gt;run(main);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Le fichier toolbar.glade que j&amp;rsquo;utilise dans tous les exemples :&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-xml&#34;&gt;&amp;lt;pre class=&amp;quot;precode&amp;quot;&amp;gt;&amp;lt;code lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;interface&amp;gt;
  &amp;lt;!-- interface-requires gtk+ 3.0 --&amp;gt;
  &amp;lt;object class=&amp;quot;GtkWindow&amp;quot; id=&amp;quot;window&amp;quot;&amp;gt;
    &amp;lt;property name=&amp;quot;width_request&amp;quot;&amp;gt;500&amp;lt;/property&amp;gt;
    &amp;lt;property name=&amp;quot;height_request&amp;quot;&amp;gt;100&amp;lt;/property&amp;gt;
    &amp;lt;property name=&amp;quot;visible&amp;quot;&amp;gt;True&amp;lt;/property&amp;gt;
    &amp;lt;property name=&amp;quot;can_focus&amp;quot;&amp;gt;False&amp;lt;/property&amp;gt;
    &amp;lt;property name=&amp;quot;title&amp;quot; translatable=&amp;quot;yes&amp;quot;&amp;gt;GTK+3 Toolbar&amp;lt;/property&amp;gt;
    &amp;lt;property name=&amp;quot;window_position&amp;quot;&amp;gt;center&amp;lt;/property&amp;gt;
    &amp;lt;signal name=&amp;quot;destroy&amp;quot; handler=&amp;quot;quit&amp;quot; swapped=&amp;quot;no&amp;quot;/&amp;gt;
    &amp;lt;child&amp;gt;
      &amp;lt;object class=&amp;quot;GtkBox&amp;quot; id=&amp;quot;box1&amp;quot;&amp;gt;
        &amp;lt;property name=&amp;quot;visible&amp;quot;&amp;gt;True&amp;lt;/property&amp;gt;
        &amp;lt;property name=&amp;quot;can_focus&amp;quot;&amp;gt;False&amp;lt;/property&amp;gt;
        &amp;lt;property name=&amp;quot;orientation&amp;quot;&amp;gt;vertical&amp;lt;/property&amp;gt;
        &amp;lt;child&amp;gt;
          &amp;lt;object class=&amp;quot;GtkToolbar&amp;quot; id=&amp;quot;toolbar&amp;quot;&amp;gt;
            &amp;lt;property name=&amp;quot;visible&amp;quot;&amp;gt;True&amp;lt;/property&amp;gt;
            &amp;lt;property name=&amp;quot;can_focus&amp;quot;&amp;gt;False&amp;lt;/property&amp;gt;
            &amp;lt;child&amp;gt;
              &amp;lt;object class=&amp;quot;GtkToolItem&amp;quot; id=&amp;quot;toolbutton5&amp;quot;&amp;gt;
                &amp;lt;property name=&amp;quot;use_action_appearance&amp;quot;&amp;gt;False&amp;lt;/property&amp;gt;
                &amp;lt;property name=&amp;quot;visible&amp;quot;&amp;gt;True&amp;lt;/property&amp;gt;
                &amp;lt;property name=&amp;quot;can_focus&amp;quot;&amp;gt;False&amp;lt;/property&amp;gt;
                &amp;lt;property name=&amp;quot;use_action_appearance&amp;quot;&amp;gt;False&amp;lt;/property&amp;gt;
                &amp;lt;child&amp;gt;
                  &amp;lt;object class=&amp;quot;GtkEntry&amp;quot; id=&amp;quot;entry1&amp;quot;&amp;gt;
                    &amp;lt;property name=&amp;quot;width_request&amp;quot;&amp;gt;200&amp;lt;/property&amp;gt;
                    &amp;lt;property name=&amp;quot;visible&amp;quot;&amp;gt;True&amp;lt;/property&amp;gt;
                    &amp;lt;property name=&amp;quot;can_focus&amp;quot;&amp;gt;True&amp;lt;/property&amp;gt;
                    &amp;lt;property name=&amp;quot;invisible_char&amp;quot;&amp;gt;●&amp;lt;/property&amp;gt;
                    &amp;lt;property name=&amp;quot;primary_icon_stock&amp;quot;&amp;gt;gtk-find&amp;lt;/property&amp;gt;
                  &amp;lt;/object&amp;gt;
                &amp;lt;/child&amp;gt;
              &amp;lt;/object&amp;gt;
              &amp;lt;packing&amp;gt;
                &amp;lt;property name=&amp;quot;expand&amp;quot;&amp;gt;False&amp;lt;/property&amp;gt;
                &amp;lt;property name=&amp;quot;homogeneous&amp;quot;&amp;gt;True&amp;lt;/property&amp;gt;
              &amp;lt;/packing&amp;gt;
            &amp;lt;/child&amp;gt;
          &amp;lt;/object&amp;gt;
          &amp;lt;packing&amp;gt;
            &amp;lt;property name=&amp;quot;expand&amp;quot;&amp;gt;False&amp;lt;/property&amp;gt;
            &amp;lt;property name=&amp;quot;fill&amp;quot;&amp;gt;True&amp;lt;/property&amp;gt;
            &amp;lt;property name=&amp;quot;position&amp;quot;&amp;gt;0&amp;lt;/property&amp;gt;
          &amp;lt;/packing&amp;gt;
        &amp;lt;/child&amp;gt;
        &amp;lt;child&amp;gt;
          &amp;lt;object class=&amp;quot;GtkLabel&amp;quot; id=&amp;quot;label1&amp;quot;&amp;gt;
            &amp;lt;property name=&amp;quot;visible&amp;quot;&amp;gt;True&amp;lt;/property&amp;gt;
            &amp;lt;property name=&amp;quot;can_focus&amp;quot;&amp;gt;False&amp;lt;/property&amp;gt;
            &amp;lt;property name=&amp;quot;vexpand&amp;quot;&amp;gt;True&amp;lt;/property&amp;gt;
          &amp;lt;/object&amp;gt;
          &amp;lt;packing&amp;gt;
            &amp;lt;property name=&amp;quot;expand&amp;quot;&amp;gt;False&amp;lt;/property&amp;gt;
            &amp;lt;property name=&amp;quot;fill&amp;quot;&amp;gt;True&amp;lt;/property&amp;gt;
            &amp;lt;property name=&amp;quot;position&amp;quot;&amp;gt;1&amp;lt;/property&amp;gt;
          &amp;lt;/packing&amp;gt;
        &amp;lt;/child&amp;gt;
      &amp;lt;/object&amp;gt;
    &amp;lt;/child&amp;gt;
  &amp;lt;/object&amp;gt;
&amp;lt;/interface&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
  </channel>
</rss>