Gtkmm: Entry, Label, segnali, ustring

ho creato una semplice GUI con Glade.
ho creato due signal handler per i bottoni: uno esegue l’ inversione della ustring, l’ altro cancella i campi.

  • i parametri passati con il binding sono i puntatori ai widget.
    Notare anche l’ uso di ptr_fun per indicare il puntatore ad una funzione, a differenza di mem_fun che serve con i puntatori a metodi.
  • notare come viene invertita la ustring: non ho trovato di meglio che usare il metodo assign che supporta gli iteratori. Usando i reverse iterators si ottiene la stringa invertita.
  • il testo di una label di imposta/modifica con set_text e get_text.
  • per una entry il testo si trova in un buffer a cui si accede con get_buffer, i cui metodi get_text() e delete_text() consentono la manipolazione.

ecco il listato:

#include <gtkmm/application.h>
#include <gtkmm/window.h>
#include <gtkmm/button.h>
#include <gtkmm/entry.h>
#include <gtkmm/label.h>
#include <gtkmm/builder.h>
#include <iostream>


void onOK_clicked(Gtk::Entry *pE, Gtk::Label *pL)
{
	Glib::ustring rev = pE->get_buffer()->get_text();
	rev.assign(rev.rbegin(), rev.rend());
	pL->set_text(rev);
	std::cout << "OK !" << std::endl;
}

void onCancel_clicked(Gtk::Entry *pE, Gtk::Label *pL)
{
	pE->get_buffer()->delete_text(0, -1);
	pL->set_text("inserisci nuovo testo.");
	std::cout << "Cancel :-(" << std::endl;
}

int main(int argc, char** argv)
{
	Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.gtkmm.example");

	Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("src/GUI.glade");

	Gtk::Button *pOk_button, *pCancel_button;
	builder->get_widget("button_OK",pOk_button);
	builder->get_widget("button_CANCEL", pCancel_button);

	Gtk::Entry *pEntry;
	Gtk::Label *pLabel;
	builder->get_widget("entry", pEntry);
	builder->get_widget("label", pLabel);

	pOk_button->signal_clicked().connect(sigc::bind<Gtk::Entry*, Gtk::Label*>( sigc::ptr_fun(&onOK_clicked), pEntry, pLabel) );
	pCancel_button->signal_clicked().connect(sigc::bind<Gtk::Entry*, Gtk::Label*>( sigc::ptr_fun(&onCancel_clicked), pEntry, pLabel) );

	Gtk::Window *window;
	builder->get_widget("window", window);
	return app->run(*window);
}

Debian, transizione gcc5

Installazione “fresh” di debian testing “stretch”.
Il pacchetto aptitude risulta non installato.

ci sono parecchi conflitti nelle librerie e nelle dipendenze di altri pacchetti, a causa della transizione alla nuova libreria libstdc++.

Ho risolto così:

~# apt-get install libgtkmm-3.0-1v5 libsigc++-2.0-0v5 libsigc++-2.0-0c2a- gnome-system-monitor libatkmm-1.6-1v5 libatkmm-1.6-1- libglibmm-2.4-1v5 libglibmm-2.4-1c2a- libcairomm-1.0-1- libcairomm-1.0-1v5 libgtkmm-3.0-1- libgtkmm-3.0-1v5 libpangomm-1.4-1- libpangomm-1.4-1v5
Lettura elenco dei pacchetti... Fatto
Generazione albero delle dipendenze       
Lettura informazioni sullo stato... Fatto
I seguenti pacchetti saranno RIMOSSI:
  libatkmm-1.6-1 libcairomm-1.0-1 libglibmm-2.4-1c2a libgtkmm-3.0-1
  libpangomm-1.4-1 libsigc++-2.0-0c2a
I seguenti pacchetti NUOVI saranno installati:
  libatkmm-1.6-1v5 libcairomm-1.0-1v5 libglibmm-2.4-1v5 libgtkmm-3.0-1v5
  libpangomm-1.4-1v5 libsigc++-2.0-0v5
I seguenti pacchetti saranno aggiornati:
  gnome-system-monitor
1 aggiornati, 6 installati, 6 da rimuovere e 57 non aggiornati.
2 non completamente installati o rimossi.
È necessario scaricare 2.480 kB di archivi.
Dopo quest'operazione, verranno liberati 43,0 kB di spazio su disco.

Gtkmm Builder e Glade

Con Glade si possono creare interfacce grafiche in modo semplice.
Si ottiene un file *.glade che verrà usato da Gtk::Builder.

# creare un oggetto Builder
Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create();
# caricare la GUI
builder->add_from_file("src/gui.glade");

ora si presentano due possibilità: o dobbiamo accedere ad una classe “base” di Gtkmm oppure ad una classe derivata. Ci sono 2 metodi di Gtk::Builder per questi 2 casi: get_widget e get_widget_derived. Bisogna fare attenzione al caso di classi derivate: bisogna avere un costruttore che accetta 2 parametri: il puntatore all’ oggetto container, e il puntatore al builder.
Ad esempio:

# da qualche parte:
class Helloworld : public Gtk::Window
{
	public:
		Helloworld();
		Helloworld(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade);
};

# nel main:
Helloworld *hw;

builder->get_widget_derived("window", hw);
return app->run(*hw);

ATTENZIONE:
il costruttore della classe derivata DEVE chiamare il costruttore della classe base nella lista di inizializzazione:

Helloworld::Helloworld(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade) :
    Gtk::Window(cobject), builder(refGlade){

    builder->get_widget("btnOk", btnOk);
    builder->get_widget("btnCancel", btnCancel);
    builder->get_widget("lblNotice",lblNotice);

    btnOk->signal_clicked().connect(sigc::mem_fun(*this, &FrmMain::on_ok_button_clicked));
    btnCancel->signal_clicked().connect(sigc::mem_fun(*this, &FrmMain::on_cancel_button_clicked));

}

vedere anche http://milindapro.blogspot.it/2012/10/create-gui-with-gtkmm-glade-with-gtkmm.html

Risoluzione con xrandr

riprendo l’ argomento: https://fcel2008.wordpress.com/2011/12/01/impostare-risoluzione-gdm3/

se la risoluzione del terminale viene regolata passando al kernel opportuni parametri (vedere https://fcel2008.wordpress.com/2011/11/18/forzare-risoluzione-kms/)

video=VGA-1:1280x1024 video=DVI-I-1:d

in Mate per Debian “Stretch” è possibile regolare la risoluzione del lightdm greeter e del desktop tramite xrandr:
per il primo, basta modificare il parametro display-setup-script nel file /etc/lightdm/lightdm.conf:

display-setup-script=xrandr --output VGA-0 --mode 1280x1024 --rate 60

e analogamente dal terminale si regola la risoluzione del desktop con il comando:

xrandr --output VGA-0 --mode 1280x1024 --rate 60

solo che in quest’ ultimo caso, per rendere persistente l’ impostazione, bisogna modificare Xorg.conf: preferisco aspettare che risolvano il segfault di mate-display-properties.