Guida Gtk+ a puntate ( XX parte )

31 ottobre 2009 hds619 1 commento

Bene continuiamo con i menu e le gtk+, come detto l’ultima volta, in questa puntata vediamo un po’ di funzioni che ho creato tempo fa e una tecnica che uso per aggiungere un po’ di elementi ai vari menu in modo semplice.

L’header aggiuntivo probabilmente richiesto sarà:
#include

La prima che andiamo a vedere serve per inserire un menu con l’icona e il testo di una GTK_STOCK:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
GtkWidget *
menu_stock_append (GtkMenu * menu, const char *stock_id, GCallback func,
                   GtkAccelGroup * accel_group, unsigned int accel_id,
                   GdkModifierType mod_type, char *tooltip)
{
  GtkWidget *widget;
 
  widget = gtk_image_menu_item_new_from_stock (stock_id, accel_group);
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), widget);
  gtk_widget_show (widget);
 
  if (func)
    g_signal_connect (G_OBJECT (widget), "activate", func, NULL);
 
  if (accel_id && accel_group)
    gtk_widget_add_accelerator (widget, "activate", accel_group, accel_id, mod_type, GTK_ACCEL_VISIBLE);
 
  if (tooltip)
    gtk_widget_set_tooltip_text (widget, tooltip);
 
  return widget;
}

Parametri:

  1. GtkMenu *menu: il widget riguardante il menu in cui inserire l’elemento convertito in GtkMenu tramite la macro GTK_MENU
  2. const char *stock_id: la GTK_STOCK scelta da inserire nel menu
  3. GCallback func: la funzione da collegare al click sull’elemento ( oppure NULL ) convertita tramite la macro G_CALLBACK
  4. GtkAccelGroup * accel_group: il gruppo di acceleratori ( scorciatoie da tastiere ) in cui varranno inserite le scorciatoie di questo elemento ( ne riparliamo meglio dopo ) o NULL se non si vuole usare nessuna scorciatoia.
  5. unsigned int accel_id: il tasto da assegnare alla scorciatoia ( tipo la lettera R, anche di questo ne riparliamo meglio dopo )
  6. GdkModifierType mod_type: il tipo di “maschera” da associare alla lettera per la scorciatoia, ad esempio si può scegliere il CTRL come maschera e per richiamare la scorciatoia da tastiera con i due esempi sopra riportati dobbiamo premere CTRL + R
  7. char *tooltip: Il suggerimento da visualizzare nel caso il mouse si fermi più di un tot di secondi sull’elemento o NULL se non lo si vuole inserire.

Questa funzione ritorna l’elemento che la funzione ha inserito nel menu può essere usato per disabilitare\abilitare quell’elemento, se non si deve eseguire nessuna operazione la variabile ritornata può anche essere ignorata.

La funzione che segue è anch’essa molto simile a quella appena mostrata, tranne per il fatto che della GTK_STOCK passata usa solo l’immagine mentre il testo può essere deciso e impostato a piacimento.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
GtkWidget *
menu_label_with_stock_append (GtkMenu * menu, const char *label,
                              const char *stock_id, GCallback func,
                              GtkAccelGroup * accel_group,
                              unsigned int accel_id, GdkModifierType mod_type, char *tooltip)
{
  GtkWidget *widget, *image;
 
  image = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);
  gtk_widget_show (image);
 
  widget = gtk_image_menu_item_new_with_label (label);
  gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (widget), image);
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), widget);
  gtk_widget_show (widget);
 
  if (func)
    g_signal_connect (G_OBJECT (widget), "activate", func, NULL);
 
  if (accel_id && accel_group)
    gtk_widget_add_accelerator (widget, "activate", accel_group, accel_id, mod_type, GTK_ACCEL_VISIBLE);
 
  if (tooltip)
    gtk_widget_set_tooltip_text (widget, tooltip);
 
  return widget;
}

Come si può notare riceve gli stessi i parametri, ne presenta solo uno in più tra il primo e il secondo parametro della funzione precedente. Il parametro in più richiesto è proprio quello riguardante il testo da usare per l’elemento.

Terza funzione che andiamo a vedere è quella per inserire un separatore di voci ( una semplice linea ) per ad esempio suddividere gruppi di elementi che fanno azioni diverse nello stesso menu.

1
2
3
4
5
6
7
8
9
10
11
GtkWidget *
menu_separator_append (GtkMenu * menu)
{
  GtkWidget *widget;
 
  widget = gtk_separator_menu_item_new ();
  gtk_menu_shell_append (GTK_MENU_SHELL (menu), widget);
  gtk_widget_show (widget);
 
  return widget;
}

L’unico parametro che ricevere è come si può intuire il menu in cui inserire il separatore convertito con la macro GTK_MENU.

Ultima funzione è quella per aggiungere un menu alla barra dei menu.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GtkWidget *
menu_append (GtkMenuBar * bar, GtkWidget * menu, const char *name, char *tooltip)
{
  GtkWidget *widget;
 
  widget = gtk_menu_item_new_with_label (name);
  gtk_widget_show (widget);
 
  gtk_menu_item_set_submenu (GTK_MENU_ITEM (widget), menu);
  gtk_menu_shell_append (GTK_MENU_SHELL (bar), widget);
 
  if (tooltip)
    gtk_widget_set_tooltip_text (widget, tooltip);
 
  return widget;
}

Il primo parametro è la barra dei menu in cui inserirlo, il secondo è il menu, il terzo il nome da dare al menu e come ultimo, opzionale, il suggerimento da dare quando il mouse si ferma sul menu oppure NULL.

Prima di andare a vedere come utilizzare bene queste funzioni, faccio una piccola spiegazione delle scorciatoie da tastiera.

Bene, innanzitutto nel mondo Gtk+ le scorciatoie vengono chiamate acceleratori così da poterle chiamare in modo giusto. Questi acceleratori vengono inseriti in uno o più gruppi chiamati GtkAccelGroup, questi gruppi sono utili ad esempio per abilitare o disabilitare acceleratori in massa, ad esempio si può avere un gruppo di acceleratori riguardanti certe voci che vanno in contrasto con gli acceleratori di un altro gruppo e quindi effettuare le verifichè per far sì che quando uno dei due è abilitato l’altro sia disattivato.

Gli acceleratori son composti principalmente da due parti, il tasto da premere per attivarlo e la maschera da utilizzare per intercettarlo.. esempio pratico come detto più su:

  • TASTO: GDK_R
  • MASK: GDK_CONTROL_MASK
  • COMBINAZIONE PER ATTIVARE LA SCORCIATOIA: Ctrl + R

L’elenco dei nomi per le costanti che definiscono i tasti potete trovarli qui: http://www.koders.com/c/fidD9E5E78FD91FE6ABDD6D3F78DA5E4A0FADE79933.aspx ( comunque alcuni caratteri possono essere inseriti tramite il loro valore ascii, ad esempio GDK_A è uguale ad ‘A’ )

Principali maschere utilizzabili: GDK_SHIFT_MASK ( Shift), GDK_CONTROL_MASK ( Control ), GDK_MOD1_MASK ( Alt ), GDK_SUPER_MASK ( Il tastino su cui purtroppo c’è il simbolo di windows, o di una casetta sugli eeepc ). Per altre vi rimando al link del tipo GtkModifierType: http://library.gnome.org/devel/gdk/unstable/gdk-Windows.html#GdkModifierType

Bene dopo questa premessa sugli acceleratori passiamo alla tecnica per utilizzare queste funzioni in modo semplice.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include "funzioni_sopra_elencate.h"
 
/* window sarà il widget della finestra in cui inserire i menu
 * mentre container sarà il widget contenitore in cui 
 * andremo ad inserire il menu, dovrà essere passato
 * usando la macro GTK_CONTAINER
 */
void menu_new (GtkWindow *window, GtkContainer *container)
{
 GtkAccelGroup *group;
 GtkWidget *main_menu, *file_list, *edit_list;
 
 /* Creo la barra dei menu */
 main_menu = gtk_menu_bar_new ();
 
 /* Creo il gruppo di acceleratori */
 group = gtk_accel_group_new ();
 gtk_window_add_accel_group (window, group);
 
 /* Creo il menu File */
 file_list = gtk_menu_new ();
   /* -- */
 menu_stock_append (GTK_MENU (file_list), GTK_STOCK_NEW, NULL, group,
                    GDK_N, GDK_CONTROL_MASK, "Crea un nuovo file");
 menu_stock_append (GTK_MENU (file_list), GTK_STOCK_OPEN, NULL, group,
                    GDK_O, GDK_CONTROL_MASK, "Apri un file");
 menu_stock_append (GTK_MENU (file_list), GTK_STOCK_SAVE, NULL, group,
                    GDK_S, GDK_CONTROL_MASK, "Salva il file");
 
 menu_separator_append (GTK_MENU (file_list));
 
 menu_label_with_stock_append (GTK_MENU (file_list), "Stampa Documento",
                               GTK_STOCK_PRINT, NULL, group, GDK_P, 
                               GDK_CONTROL_MASK, "Stampa il file");
 
 menu_separator_append (GTK_MENU (file_list));
 
 menu_stock_append (GTK_MENU (file_list), GTK_STOCK_QUIT, NULL, group,
                    GDK_Q, GDK_CONTROL_MASK, "Esci dal programma");
   /* -- */ 
 menu_append (GTK_MENU_BAR (main_menu), file_list, "File", NULL);
 
 /* Creo il menu Modifica */
 edit_list = gtk_menu_new ();
   /* -- */
 menu_stock_append (GTK_MENU (edit_list), GTK_STOCK_COPY, NULL, group,
                    GDK_C, GDK_CONTROL_MASK, "Copia testo");
 menu_stock_append (GTK_MENU (edit_list), GTK_STOCK_CUT, NULL, group,
                    GDK_X, GDK_CONTROL_MASK, "Taglia testo");
 menu_stock_append (GTK_MENU (edit_list), GTK_STOCK_PASTE, NULL, group,
                    GDK_V, GDK_CONTROL_MASK, "Incolla testo");
   /* -- */
 menu_append (GTK_MENU_BAR (main_menu), edit_list, "Modifica", NULL);
 
 /* Inseriamo la barra comprensiva di menu all'interno del contenitore passato */
 gtk_container_add (container, main_menu);
}
 
/* Così è molto più immediato creare menu di grosse dimensioni anche
 * se nei casi più specifici si può migliorare ancora il codice e la sua
 * gestione 
 */

Fine Ventesima Puntata
Abbiam quasi finito con i menu, c’è ancora qualche funzione da descrivere ma siamo già a buon punto. Questa puntata è importante in quanto ho finalmente affrontato anche l’argomento degli acceleratori. Alla prossima, spero non tardi.
Ciauz ;)

Categorie:Guide veloci Tag:

Addio fauna africana

31 ottobre 2009 hds619 Nessun commento

Avevo installato karmic koala in una partizione dedicata per provarla già dall’alpha 5.. nessun problema oltre alla resa dei caratteri del sistema peggiorata e l’audio che funzionava a random.
L’altro giorno speranzoso ho fatto l’aggiornamento dal sistema che uso quotidianamente ( ubuntu 9.04 )… la resa dei caratteri ancora più brutta, l’audio non riconosce manco una delle due schede audio che ho, l’ultimo kernel non riesce ad avviarsi e nemmeno a caricare i driver nvidia ( rimango in un terminale virtuale a veder sfarfallare il testo ), il disco appena entro nel mio account vedo che lavora in maniera assurda i primi 5 secondi, l’avvio rispetto a prima è molto ma molto più lento.. non aggiungo commenti.

Quindi, dopo questa brutta esperienza, dopo l’impressione negativa che ho descritto in un altro post che mi ha dato la linea che seguirà ubuntu, * censured *, ho deciso di fare una cosa che avrei dovuto fare molto tempo fa..
Devo dire che mi dispiace un po’, perchè utilizzo ubuntu dalla 6.06, però ormai è diventato necessario. Passo a debian. L’avevo lasciata un annetto fa perchè non aveva le librerie e il software aggiornato che mi serviva e non avevo voglia di ricompilarmi tutto a manina o passare a sid\experimental tanto valeva andare su ubuntu che aveva un buon rapporto stabilità\software aggiornato, ora però che lenny è stata rilasciata e ci ritotroviamo da un po’ di tempo con squeeze ho visto che anche lì son passati a software più aggiornato o almeno quanto basta per me così da poter programmare in pace.

Utilizzatori di ubuntu non me ne vogliate :)
Utilizzatori di windows non spaventatevi :)

Categorie:News Tag: , ,

Linux Day 2009 – Ferrara

24 ottobre 2009 hds619 Nessun commento

Di ritorno dal linux day 2009 tenuto a ferrara, quasi 4 ore di conferenze varie ( quelle del pomeriggio ho preferito saltarle dato che non mi interessavano ) devo dire che sono stato piacevolmente sorpreso dal numero di persone che hanno partecipato e dalla rete wireless dell’università in cui si è tenuto XD.
tuxGli interventi più interessanti son stati quelli sul software libero e sul cloud computing. L’intervento sul video editing con kdenlive e cinelerra è stato invece noiosissimo, soprattutto perchè cinelerra è un programma che odio che infatti ha dimostrato la sua (in)stabilità crashando a metà conferenza, per fortuna il lavoro che stavano facendo per mostrare il suo utilizzo è stato recuperato senza problemi in qualche minuto.
Non posso fare giudizi generali e confronti per il fatto che è stato il primo Linux Day a cui andavo, devo dire che è stato carino meglio di quanto mi aspettavo a causa di come me ne avevano parlato alcuni miei contatti.

Bye :)

Categorie:News, Recensioni Tag: ,

Dettagli…

15 ottobre 2009 hds619 1 commento

Tutti sono eguali dinanzi alla legge e hanno diritto, senza alcuna discriminazione, ad una eguale tutela da parte della legge. Tutti hanno diritto ad una eguale tutela contro ogni discriminazione che violi la presente Dichiarazione come contro qualsiasi incitamento a tale discriminazione. (Art. 7)

Nessun individuo potrà essere arbitrariamente arrestato, detenuto o esiliato. (Art. 9)

Ogni individuo ha diritto, in posizione di piena uguaglianza, ad una equa e pubblica udienza davanti ad un tribunale indipendente e imparziale, al fine della determinazione dei suoi diritti e dei suoi doveri, nonché della fondatezza di ogni accusa penale che gli venga rivolta. (Art. 10)

Ogni individuo accusato di un reato è presunto innocente sino a che la sua colpevolezza non sia stata provata legalmente in un pubblico processo nel quale egli abbia avuto tutte le garanzie necessarie per la sua difesa.
Nessun individuo sarà condannato per un comportamento commissivo od omissivo che, al momento in cui sia stato perpetrato, non costituisse reato secondo il diritto interno o secondo il diritto internazionale. Non potrà del pari essere inflitta alcuna pena superiore a quella applicabile al momento in cui il reato sia stato commesso. (Art. 11)

Ogni individuo ha diritto alla libertà di movimento e di residenza entro i confini di ogni Stato.
Ogni individuo ha diritto di lasciare qualsiasi paese, incluso il proprio, e di ritornare nel proprio paese. (Art. 13)

Ogni individuo ha diritto ad una cittadinanza.
Nessun individuo potrà essere arbitrariamente privato della sua cittadinanza, né del diritto di mutare cittadinanza. (Art. 15)

Ogni individuo ha diritto alla libertà di pensiero, di coscienza e di religione; tale diritto include la libertà di cambiare di religione o di credo, e la libertà di manifestare, isolatamente o in comune, e sia in pubblico che in privato, la propria religione o il proprio credo nell’insegnamento, nelle pratiche, nel culto e nell’osservanza dei riti. (Art. 18)

Ogni individuo ha diritto al lavoro, alla libera scelta dell’impiego, a giuste e soddisfacenti condizioni di lavoro ed alla protezione contro la disoccupazione.
Ogni individuo, senza discriminazione, ha diritto ad eguale retribuzione per eguale lavoro.
Ogni individuo che lavora ha diritto ad una remunerazione equa e soddisfacente che assicuri a lui stesso e alla sua famiglia una esistenza conforme alla dignità umana ed integrata, se necessario, da altri mezzi di protezione sociale.
Ogni individuo ha diritto di fondare dei sindacati e di aderirvi per la difesa dei propri interessi. (Art. 23)

Ma alla fine cosa vuoi che importi? ..

Categorie:Momenti Pensierosi Tag:

Imel Feature and Bug Tracking

8 ottobre 2009 hds619 Nessun commento

Nato un sistema per il tracciamento di bug o feature richieste in Imel.

Ogni utente una volta registrato potrà aggiungere e segnalare una feature o un bug, votare altri task, commentare e proporre soluzioni o altro ai bug.

Il tutto viene gestito dal software flyspray. Il sistema di tracciamente può essere trovato qui: http://www.hds619.net/bug-tracker

Bye ;)

Categorie:News Tag: , ,

Aggiornamento HImages

7 ottobre 2009 hds619 Nessun commento

Il programma che crea le anteprime e applica i vari effetti che è alla base di himages è stato aggiornato con la nuova versione di imel. Ora supporta pienamente le png con la trasparenza.

Good hosting ;)

Categorie:News Tag: ,

Imel 0.2.3 è qui!

7 ottobre 2009 hds619 Nessun commento

Non scrivo da tempo sul blog, ultimamente ( specialmente le persone con cui chatto di solito ) avrete notato che son sparito dalla circolazione. Oltre ad avere poco tempo ( lo so è una scusa stupida ) avevo voglia di staccare un po’ la spina, ed è quello che ho fatto. Nelle ultime settimane ho utilizzato il computer solo per programmare qualcosina, rispondere a qualche e-mail e per ascoltare musica.

Comunque programmando poco per volta è nata sotto le mie mani la nuova versione di Imel, tra le novità principali un supporto alla trasparenza migliorato generalmente e anche il suo supporto alle immagini png che ora vengono lette e salvate anche con la trasparenza. Altra novità importante è la riscrittura della funzione per disegnare una linea che non si basa più su quella per disegnare una curva ma utilizza un suo algoritmo molto più snello, semplice e veloce. Altre novità le potete leggere nel ChangeLog.

Link al pacchetto - Link Documentazione

Mi inizio a vergognare di usare ubuntu…

15 settembre 2009 hds619 11 commenti

Dopo aver visto qualche giorno fa questo articolo su TuxJournal, dapprima la mia esclamazione fu “che schifo”.. ma ci ho ripensato in questi giorni, e devo dire che l’esclamazione più giusta è “che schifo, dove andremo a finire?”.

Per carità, sono il primo che è felice quando escono programmi con interfaccia grafica che ti evitano di usare il terminale, non sono un patito della tastiera ( a meno che non si tratta di programmazione ) e ben vengano click in più che aiutano i tendini della mia mano ad andare in crisi tra qualche anno. Ma ad un certo punto poi si esagera.

Soprattutto se devo ritrovarmi installazioni del genere che fanno tanto “Windows eXPerience”, della serie “Da oggi più sicuro, veloce e facile da usare!”.. Frasi che si commentano da sole e che sanno tanto da presa per il culo. Per il momento ho deciso che me ne sbatterò e farò l’upgrade alla prossima versione, ma se deve continuare così quest’utontontimento di ubuntu penso che ritornerò allegramente a Debian testing\sid.

E che cazz!

P.s.: Sembra una sfogo solo riguardante l’interfaccia grafica, ma in realtà questa è solo la punta dell’iceberg di tante piccole cose che si sono andate accumulando in questi anni.

Categorie:Recensioni Tag:

Odio profondamente…

11 settembre 2009 hds619 2 commenti

…chi non legge mai un README di un programma e si lamenta se non si installa

…chi inquina e spamma sul web per fare domande su programmi o servizi la cui domanda si trova nelle prime 10 domande delle FAQ

…chi non prova nemmeno a cercare 2 secondi da solo la soluzione al proprio problema prima di chiedere

…chi chiede aiuto e dopo 10 minuti riesce a risolvere da solo

…chi chiede aiuto e non ascolta le risposte

…chi bolla un programma come “inutile” o “non funzionante” solo perchè deve fare un click in più per fare ciò che vuole

…chiunque sminuisca il lavoro degli altri, importante o inutile che sia

…chi non aiuta, non pensando che forse senza coloro che aiutano non saprebbe ciò che sa adesso

…i gruppi che si autocompiacciono del proprio lavoro e etichettano come incapace chiunque gli dia consigli per migliorarlo

…chi non dà soddisfazioni

…chi si lamenta se qualcosa in una comunità va male, ma è il primo a non fare nulla per migliorare la situazione

…chi fornisce la così detta “pappa pronta” togliendo ogni gusto di sperimentare

…chi si rassegna

…chi odia e forse odio anche me stesso, ma solamente odiando e incazzandosi contro qualcosa si riesce veramente a creare qualcosa di nuovo, a sconvolgere il normale equilibrio della vita quotidiana trasformato in monotonia e arrendevolezza.
Ammiro chi sa di combattere per una causa persa in partenza o in una battaglia senza fine ma sa anche che combattendola giorno per giorno forse, alla fin fine riesce veramente a migliorare le cose.

Aggiornamento versione Wordpress

10 settembre 2009 hds619 Nessun commento

Salve a tutti, scrivo questo post per informare che ho aggiornato la versione di wordpress utilizzata da questo blog alla versione 2.8.4 oltre a ciò ho disabilitato il plugin che permetteva di rispondere ai commenti e visualizzare i commenti a cascata in quanto li inseriva sballati rispetto al layout del blog, per questo motivo i commenti ora saranno tutti sullo stesso livello uno sotto l’altro, dal meno recente al più recente ed eventuali commenti inseriti nei vecchi articoli col vecchio sistema a cascata sono stati automaticamente riordinati quindi potreste trovare qualche piccola difficolta a leggere i commenti di 3/4 puntate delle gtk+.

Per il resto non penso ci siano altre “controindicazioni”.

Ciauz ;)

P.s.:  Applicato anche un nuovo tema, purtroppo a larghezza fissa ma molto più riposante per gli occhi.

Categorie:News Tag: