= Prefazione =
Questa guida è stata scritta da Andrea Azzarone, su forum arlecchino92. Una discussione relativa a questa guida si trova a questo indirizzo http://forum.ubuntu-it.org/viewtopic.php?t=449834
La guida sarà pubblicata a puntate ogni volta che ne sarà disponibile una nuova.
= Introduzione =
== Prerequisiti e linguaggi di programmazione ==
Sicuramente non è una guida rivolta a tutti gli utenti di Ubuntu, ma non sono richieste capacità eccezionali nell' arte della programmazione!
Prima di tutto Unity è scritto per la maggior parte in C++, sebbene alcune parti siano scritte in C o in Vala. Sottolineare che questa guida si riferisce alla versione in sviluppo di Ubuntu Natty Narwhal 11.04.
Unity utilizza inoltre il toolkit grafico nux e le librerie gnome.
== Bug e bitsize ==
La lista dei bug di Unity è disponibile qui: https://bugs.launchpad.net/unity
Ma c'è un piccolo problema con questi ultimi! La maggior parte sono abbastanza ostici da risolvere e richiedono già maggiore esperienza.
Niente paura, il team di Unity ha già pensato a questo. È stata creata una lista di bug minori, che richiedono minori competenze, e che attutirà l'impatto con il codice di Unity.
La lista dei bug minori (bitsize) è disponibile [[https://bugs.launchpad.net/unity/+bugs?field.searchtext=&orderby=-importance&field.status%3Alist=NEW&field.status%3Alist=INCOMPLETE_WITH_RESPONSE&field.status%3Alist=INCOMPLETE_WITHOUT_RESPONSE&field.status%3Alist=CONFIRMED&field.status%3Alist=TRIAGED&assignee_option=any&field.assignee=&field.bug_reporter=&field.bug_supervisor=&field.bug_commenter=&field.subscriber=&field.tag=bitesize&field.tags_combinator=ALL&field.has_cve.used=&field.omit_dupes.used=&field.omit_dupes=on&field.affects_me.used=&field.has_patch.used=&field.has_branches.used=&field.has_branches=on&field.has_no_branches.used=&field.has_no_branches=on&search=Search|qui]].
Per voi ho scelto di realizzare qualcosa di abbastanza interessante: cercheremo di aggiungere alla quicklist dei vari dispositivi la voce "Unmount".
== Compilare e installare unity da codice sorgente ==
Ricordo ancora una volta che è necessario utilizzare Ubuntu Natty!
Cominciamo installando un po' di roba che ci servirà in seguito. Da terminale:
{{{
sudo apt-get install bzr cmake compiz-dev gnome-common libbamf-dev libboost-dev libboost-serialization-dev libcairo2-dev libdbusmenu-glib-dev libdee-dev libgconf2-dev libgdk-pixbuf2.0-dev libglew1.5-dev
libglewmx1.5-dev libglib2.0-dev libindicator-dev libpango1.0-dev libpcre3-dev libsigc++-2.0-dev libunity-misc-dev libutouch-geis-dev}}}
Come già detto in precedenza Unity utilizza il toolkit grafico nux, che è ancora in sviluppo. È possibile installarlo direttamente da repository ma se davvero volete cominciare a "modificare e implementare nuove funzioni in Unity" dovremo prima di tutto compilare nux da sorgenti! Quindi da terminale:
{{{
bzr branch lp:nux
cd nux
./autogen.sh --disable-documentation --prefix=/opt/unity
make -j4
sudo make install
}}}
e successivamente:
{{{
export PKG_CONFIG_PATH=/opt/unity/lib/pkgconfig:${PKG_CONFIG_PATH}
export LD_LIBRARY_PATH=/opt/unity/lib:${LD_LIBRARY_PATH}
export LD_RUN_PATH=/opt/unity/lib:${LD_RUN_PATH}
}}}
che installerà Unity in /opt/unity. Procediamo adesso alla compilazione e installazione vera e propria di Unity:
{{{
bzr branch lp:unity
cd unity
mkdir build; cd build
cmake .. -DCMAKE_BUILD_TYPE=Debug -DCOMPIZ_PLUGIN_INSTALL_TYPE=local -DCMAKE_INSTALL_PREFIX=/opt/unity
make -j4
sudo make install
sudo mkdir /opt/unity/share/unity/places
sudo cp /usr/share/unity/places/* /opt/unity/share/unity/places/
}}}
Il codice si commenta da solo Maggiori info sono comunque disponibili [[http://forum.ubuntu-it.org/viewtopic.php?t=449834|qui]]. E ancora:
{{{
unset PKG_CONFIG_PATH
unset LD_LIBRARY_PATH
unset LD_RUN_PATH
}}}
Editiamo adesso il file ~/.bashrc:
{{{
gedit ~/.bashrc
}}}
aggiungendo le seguenti 4 righe alla fine del file:
{{{
function compiz-unity-setup-env
{
export PATH=/opt/unity/bin:${PATH}
}
}}
Adesso non ci resta che effettuare il log out e il log in, e lanciare da terminale i seguenti comandi:
{{{
compiz-unity-setup-env
compiz --replace
}}}
La guida originale alla compilazione è stata scritta da '''Stefano Candori''' e la si può trovare [[http://askubuntu.com/questions/28470/how-do-i-build-unity-from-source|qui]]
== Una prima occhiata al codice ==
Se avete seguito correttamente le istruzioni nella vostra home avrete i sorgenti di Unity. Diamo un'occhiata alla struttura generale:
{{{
AUTHORS COPYING.LGPL src
build doc tests
ChangeLog INSTALL tools
cmake plugin-unityshell.png unity-private
CMakeLists.txt po unityshell.xml.in
com.canonical.Unity.gschema.xml README utouch
config.h.cmake resources vapi
COPYING services
}}}
Per il momento analizziamo tre voci:
{{{
src
unityshell.xml.in
com.canonical.Unity.gschema.xml
}}}
Come forse avrete già intuito src sta per "source" ovverso "codice sorgente". Vediamo cosa contiene al momento (in futuro potrebbe cambiare qualcosa):
{{{
BamfLauncherIcon.cpp PlaceLauncherIcon.h
BamfLauncherIcon.h PlaceLauncherSection.cpp
DebugDBusInterface.cpp PlaceLauncherSection.h
DebugDBusInterface.h PlaceRemote.cpp
DeviceLauncherIcon.cpp PlaceRemote.h
DeviceLauncherIcon.h PlacesController.cpp
DeviceLauncherSection.cpp PlacesController.h
DeviceLauncherSection.h PlacesGroupController.cpp
DevicesSettings.cpp PlacesGroupController.h
DevicesSettings.h PlacesGroup.cpp
FavoriteStore.cpp PlacesGroup.h
FavoriteStoreGSettings.cpp PlacesHomeView.cpp
FavoriteStoreGSettings.h PlacesHomeView.h
FavoriteStore.h PlacesResultsController.cpp
GeisAdapter.cpp PlacesResultsController.h
GeisAdapter.h PlacesResultsView.cpp
GestureEngine.cpp PlacesResultsView.h
GestureEngine.h PlacesSearchBar.cpp
IconLoader.cpp PlacesSearchBar.h
IconLoader.h PlacesSettings.cpp
IconTexture.cpp PlacesSettings.h
IconTexture.h PlacesSimpleTile.cpp
IndicatorObjectEntryProxy.h PlacesSimpleTile.h
IndicatorObjectEntryProxyRemote.cpp PlacesStyle.cpp
IndicatorObjectEntryProxyRemote.h PlacesStyle.h
IndicatorObjectFactory.h PlacesTile.cpp
IndicatorObjectFactoryRemote.cpp PlacesTile.h
IndicatorObjectFactoryRemote.h PlacesView.cpp
IndicatorObjectProxy.h PlacesView.h
IndicatorObjectProxyRemote.cpp PluginAdapter.cpp
IndicatorObjectProxyRemote.h PluginAdapter.h
Introspectable.cpp QuicklistManager.cpp
Introspectable.h QuicklistManager.h
LauncherController.cpp QuicklistMenuItemCheckmark.cpp
LauncherController.h QuicklistMenuItemCheckmark.h
Launcher.cpp QuicklistMenuItem.cpp
LauncherDragWindow.cpp QuicklistMenuItem.h
LauncherDragWindow.h QuicklistMenuItemLabel.cpp
LauncherEntryRemote.cpp QuicklistMenuItemLabel.h
LauncherEntryRemote.h QuicklistMenuItemRadio.cpp
LauncherEntryRemoteModel.cpp QuicklistMenuItemRadio.h
LauncherEntryRemoteModel.h QuicklistMenuItemSeparator.cpp
Launcher.h QuicklistMenuItemSeparator.h
LauncherIcon.cpp QuicklistView.cpp
LauncherIcon.h QuicklistView.h
LauncherModel.cpp SimpleLauncherIcon.cpp
LauncherModel.h SimpleLauncherIcon.h
nux-area-accessible.cpp SpacerLauncherIcon.cpp
nux-area-accessible.h SpacerLauncherIcon.h
nux-base-window-accessible.cpp StartupNotifyService.cpp
nux-base-window-accessible.h StartupNotifyService.h
nux-layout-accessible.cpp StaticCairoText.cpp
nux-layout-accessible.h StaticCairoText.h
nux-object-accessible.cpp TextureCache.cpp
nux-object-accessible.h TextureCache.h
nux-view-accessible.cpp TimeMe.cpp
nux-view-accessible.h TimeMe.h
PanelHomeButton.cpp Tooltip.cpp
PanelHomeButton.h Tooltip.h
PanelIndicatorObjectEntryView.cpp TrashLauncherIcon.cpp
PanelIndicatorObjectEntryView.h TrashLauncherIcon.h
PanelIndicatorObjectView.cpp UBusMessages.h
PanelIndicatorObjectView.h ubus-server.cpp
PanelMenuView.cpp ubus-server.h
PanelMenuView.h unitya11y.cpp
PanelStyle.cpp unitya11y.h
PanelStyle.h unitya11ytests.cpp
PanelTitlebarGrabAreaView.cpp unitya11ytests.h
PanelTitlebarGrabAreaView.h unity-launcher-accessible.cpp
PanelTray.cpp unity-launcher-accessible.h
PanelTray.h unity-launcher-icon-accessible.cpp
PanelView.cpp unity-launcher-icon-accessible.h
PanelView.h unity-panel-home-button-accessible.cpp
perf-logger-utility.h unity-panel-home-button-accessible.h
perf-logger.vala unity-panel-view-accessible.cpp
PlaceEntry.h unity-panel-view-accessible.h
PlaceEntryHome.cpp unity-root-accessible.cpp
PlaceEntryHome.h unity-root-accessible.h
PlaceEntryRemote.cpp unityshell.cpp
PlaceEntryRemote.h unityshell.h
PlaceFactory.cpp unity-util-accessible.cpp
PlaceFactoryFile.cpp unity-util-accessible.h
PlaceFactoryFile.h WindowButtons.cpp
PlaceFactory.h WindowButtons.h
Place.h WindowManager.cpp
PlaceLauncherIcon.cpp WindowManager.h
}}}
Non vi spaventate, in realtà tranne per la parte puramente grafica (che sfrutta le librerie nux e quindi le opengl) il codice è abbastanza pulito e di facile comprensione. Ad sempio poichè andremo ad aggiungere la voce "Unmount" alla quicklist delle icone dei dispositivi/partizioni sul launcher per intuito probabilmente dovremo operare sul file DeviceLauncherIcon.cpp e il suo header DeviceLauncherIcon.h.
Se l'intuito non basta può aiutarci il terminale... Sappiamo che nella quicklist di un dispositivo rimovibile (ad es. una pendrive usb) è prensete la voce "Safely Remove".
Da terminale diamo:
{{{
grep "Safely Remove" ~//unity/src/*
}}}
e per magia:
{{{
/home/andrea/unity/src/DeviceLauncherIcon.cpp: dbusmenu_menuitem_property_set (menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Safely Remove"));
Non esiste un metodo universale per individuare in quale parte del codice andare ad operare (per il momento sorvoliamo di risolvere i crash per i quali gdb è di immenso aiuto), ma un buon intuito e l'utilizzo del terminale dovrebbero bastare
Passiamo alla seconda voce che volevo farvi notare, ovvero unityshell.xml.in. Uno sguardo al file e probabilmente capirete prima che ve lo dica esplicitamente:
{{{
<_short>Ubuntu Unity Plugin
<_long>Plugin to draw the Unity Shell
Desktopbailerdetectioncompositeopenglmousepollmoveresizedecorcompiztoolboxplacesessionanimationregexcuberotatecubeaddongnomecompatvpswitchfadestaticswitcherscaleexpoezoomwallopenglwall
<_short>Behaviour
<_short>Experimental
}}}
Beh se non ci siete arrivati, questo è in linea di massima il file utilizzato dal ccsm per inserire le varie opzioni di configurazione (sebbene serva anche ad altro!). Non mi stancherò mai di ripeterlo: Unity è un plugin di compiz! Ad esempio quando qualche giorno ho voluto aggiungere l'opzione per scegliere quali dispositivi visualizziare ho aggiunto questa sezione al file:
{{{
}}}
L'ultimo file che andremo ad analizzare è com.canonical.Unity.gschema.xml. I lettori più attenti probabilmente avranno capito che si tratta del file in cui sono dichiarate le varie chiavi gsettings (maggiori info [[http://library.gnome.org/devel/gio/2.25/gsettings.html|qui]]).
Per il momento può bastare la prima occhiata al codice!
== Cominciamo a modificare il codice... ==
Se ben ricordate avevamo già individuato qualche giorno fa quali file modificare: '''DeviceLauncherIcon.cpp''' e naturalmente il suo file '''headerDeviceLauncherIcon.h'''
La prima cosa da fare è dare un'occhiata generale al codice cercando di capire a cosa servono le funzioni... in questa prima fase non sarà necessario entrare nel dettaglio. Questa fase ci viene facilitata dagli stessi autori di Unity che generalmente utilizzando nomi di funzioni abbastanza esplicativi.
Non bisogna essere chissa chi per capire che la funzione '''OnMouseClick''' è la funzione associata al click del mouse sull'icona...
Diamo un'occhiata alla funzione che più ci riguarda:
{{{
std::list
DeviceLauncherIcon::GetMenus ()
{
std::list result;
DbusmenuMenuitem *menu_item;
GDrive *drive;
menu_item = dbusmenu_menuitem_new ();
dbusmenu_menuitem_property_set (menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Open"));
dbusmenu_menuitem_property_set_bool (menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);
dbusmenu_menuitem_property_set_bool (menu_item, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
g_signal_connect (menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
G_CALLBACK (&DeviceLauncherIcon::OnOpen), this);
result.push_back (menu_item);
if (g_volume_can_eject (_volume))
{
menu_item = dbusmenu_menuitem_new ();
dbusmenu_menuitem_property_set (menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Eject"));
dbusmenu_menuitem_property_set_bool (menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);
dbusmenu_menuitem_property_set_bool (menu_item, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
g_signal_connect (menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
G_CALLBACK (&DeviceLauncherIcon::OnEject), this);
result.push_back (menu_item);
}
drive = g_volume_get_drive (_volume);
if (drive && g_drive_can_stop (drive))
{
menu_item = dbusmenu_menuitem_new ();
dbusmenu_menuitem_property_set (menu_item, DBUSMENU_MENUITEM_PROP_LABEL, _("Safely Remove"));
dbusmenu_menuitem_property_set_bool (menu_item, DBUSMENU_MENUITEM_PROP_ENABLED, true);
dbusmenu_menuitem_property_set_bool (menu_item, DBUSMENU_MENUITEM_PROP_VISIBLE, true);
g_signal_connect (menu_item, DBUSMENU_MENUITEM_SIGNAL_ITEM_ACTIVATED,
G_CALLBACK (&DeviceLauncherIcon::OnDriveStop), this);
result.push_back (menu_item);
g_object_unref (drive);
}
return result;
}
}}}
----
CategoryHomepage