{"id":211,"date":"2009-12-07T15:50:00","date_gmt":"2009-12-07T15:50:00","guid":{"rendered":"http:\/\/e-ware.org\/blog\/?p=211"},"modified":"2009-12-07T15:50:00","modified_gmt":"2009-12-07T15:50:00","slug":"didattica-c-primi-passi-con-le-gtk","status":"publish","type":"post","link":"http:\/\/e-ware.org\/blog\/didattica-c-primi-passi-con-le-gtk\/","title":{"rendered":"Didattica C: Primi passi con le gtk"},"content":{"rendered":"<div><span>Arriva un momento nella vita di un uomo in cui si abbandona l&#8217;essenziale per abbracciare il sofisticato ed il frivolo. Questo \u00e8 anche ci\u00f2 che accade nella vita di un programmatore: arriva il giorno in cui si abbandona la riga di comando per iniziare ad usare le finestre tanto amate dall&#8217;utente comune!<\/p>\n<p>Bene! Dopo questo preambolo in stile zen possiamo iniziare il cammino per studiare come dare vita al nostro codice C grazie alle gtk.<\/p>\n<p>E&#8217; doveroso, prima di cominciare, spiegare cosa sono le gtk.<\/p>\n<p><span>GTK+<\/span> (acronimo di <span>GIMP ToolKit<\/span>) \u00e8 il nome di un insieme di strumenti grafici, basati sulla libreria <span>libgtk<\/span>, che permette di programmare e creare interfacce grafiche con lo steso stile di quelle che normalmente vediamo in ambiente Gnome. Qualora vorreste iniziare a programmare con tali librerie bisogna prima soddisfare le dipendenze installando <span>libgtk2.0-dev<\/span> presente nei repository di tutte le distro.<\/p>\n<p>Ora possiamo iniziare a vedere un semplicissimo codice che genera una finestra standard 200&#215;200 pixel.<\/p>\n<pre><br>#include <gtk><br><br>int main (int argc, char *argv[])<br>{<br>    GtkWidget *window;<br><br>    gtk_init(&argc, &argv);<br><br>    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);<br>    gtk_widget_show(window);<br><br>    gtk_main();<br><br>    return 0;<br>}<\/gtk><\/pre>\n<p>Iniziamo con l&#8217;analizzare riga per riga il codice appena scritto.<\/p>\n<p>Per prima cosa bisogna importare mediante <span>#include<\/span> il file contenente le funzioni e le strutture su cui si basano le gtk+; il file <span>gtk\/gtk.h<\/span>, infatti, deve essere presente in ogni software che basa la propria interfaccia su questa libreria.<\/p>\n<p>Mediante la dichiarazione di <span>gtkWidget<\/span> si ottiene un elemento di tipo finestra (window appunto) che potr\u00e0 essere successivamente manipolato attraverso i suoi metodi.<\/p>\n<p>Con <span>gtk_init(&#038;argc, &#038;argv)<\/span> si inizializzano tutti i parametri mediante alcuni argomenti da riga di comando che sono noti a tutti i programmi gtk. E&#8217; possibile, infatti, passare da terminale alcuni parametri che si potrebbero definire standard e che sono uguali per qualsiasi software che sfrutti queste librerie. Essi sono: &#8211;display, &#8211;debug-level, &#8211;no-xshm, &#8211;sync, &#8211;show-events e &#8211;no-show-event.<br \/>Il nostro programma al suo avvio andr\u00e0 alla ricerca di questi parametri e qualora ne incontri qualcuno, lo legge, lo usa, lo elimina dall&#8217;array argv[] e  decrementa argc. In questo modo alla fine di questo processo sar\u00e0 possibile analizzare gli argomenti eventualmente passati dall&#8217;utente come si faceva prima di usare le gtk.<\/p>\n<p>La riga <span>window = gtk_window_new(GTK_WINDOW_TOPLEVEL)<\/span> crea la finestra sfruttando una inizializzazione simile a quella presente in linguaggi come il C++.<\/p>\n<p><span>Gtk_widget_show(window)<\/span> si limita a mostrare la finestra appena creata.<\/p>\n<p>Dopo le inizializzazioni dei nostri elementi, si incontra la chiamata a <span>gtk_main()<\/span>. Tale funzione non fa altro che dirci che il codice a finito di creare l&#8217;interfaccia e che \u00e8 in attesa che in X accada qualche evento da gestire (ad esempio la pressione di un tasto della tastiera o un doppio click del mouse).<\/p>\n<p>Infine si pone un <span>return 0<\/span> come si era abbituati per restiuire l&#8217;intero dichiarato all&#8217;inizio del nostro main se l&#8217;applicazione si chiude senza problemi.<\/p>\n<p>Questo \u00e8 solo un semplice esempio. Per quanto stupido possa essere esso contiene le basi per capire il funzionamento iniziale di queste librerie. Si vdr\u00e0 pi\u00f9 avanti qualche esempio pi\u00f9 &#8220;corposo&#8221;.<\/p>\n<p>Alla prossima \ud83d\ude42<br \/><\/span><\/div>\n<p><span><\/span><code><\/code><code><\/code><code><\/code><code><\/code><code><\/code><code><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Arriva un momento nella vita di un uomo in cui si abbandona l&#8217;essenziale per abbracciare il sofisticato ed il frivolo. Questo \u00e8 anche ci\u00f2 che accade nella vita di un programmatore: arriva il giorno in cui si abbandona la riga di comando per iniziare ad usare le finestre tanto amate dall&#8217;utente comune! Bene! Dopo questo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[54,52,2,4],"tags":[],"class_list":["post-211","post","type-post","status-publish","format-standard","hentry","category-c","category-didattica","category-gnulinux","category-opencode"],"views":1719,"_links":{"self":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/comments?post=211"}],"version-history":[{"count":0,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/posts\/211\/revisions"}],"wp:attachment":[{"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/media?parent=211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/categories?post=211"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/e-ware.org\/blog\/wp-json\/wp\/v2\/tags?post=211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}