====== Includere la funzione fullscreen in Sakura ======
Autore: **//Fabio Di Matteo//** \\ Ultima revisione: **//25/05/2008//** \\ \\
[[http://www.pleyades.net/david/sakura.php|Sakura]] è un ottimo emulatore di terminale per il server grafico X, assomiglia molto {{http://www.pleyades.net/david/sakura_scr.png|Sakura}}a ''gnome-terminal'' ma ha bisogno di molte meno dipendenze (solo Gtk+2 e Vte) e quindi è adatto ad essere incluso in soluzioni personalizzate per il desktop.
===== Cosa manca attualmente in Sakura =====
In Sakura tuttavia manca la funzione fullscreen e poi vengono visualizzate le "brutte" barre di scorrimento anche quando **non** viene avviato con il parametro ''-sb'' .
===== Rimediamo alle mancaze =====
Tutto il codice di Sakura è racchiuso in un unico file dentro la directory ''src/'', per compilarlo oltre ad avere i pacchetti di sviluppo di **gtk+2** e **vte-dev** bisogna installare il tool **gmake** .
==== Come compilare ====
Ecco come compilare Sakura:
$ cmake .
$ make
$ su -c 'make install'
==== Le nostre modifiche ====
**E' consigliabile scaricare questo pacchetto che contiene tutti i bugfix aggiornati alla versione attuale di sakura.**
La versione da noi modificata:{{progetti:sakura-fdm:sakura-2.1.1-fdm.tar.gz|}}
==== Le correzioni da me apportate ====
Innanzi tutto disabilito la visualizzazione delle barre di scorrimento, in quanto si devono visualizzare solo se si lancia sakura con l'opzione ''-sb''
...
//Fabio DM
static gboolean option_show_scrollbar=FALSE;
...
Se si preme ''F11'' si passa alla modalità fullscreen, il codice sottostante va inserito nella funzione static
''gboolean sakura_key_press (GtkWidget *widget, GdkEventKey *event, gpointer user_data)'' giusto prima dell'ultimo valore di ritorno alla fine della funzione:
...
//Fabio DM
if (event->keyval==GDK_F11){
static int fs;
if (fs!=1) {
gtk_window_fullscreen(GTK_WINDOW (sakura.main_window));
fs=1;
}else{
gtk_window_unfullscreen(GTK_WINDOW (sakura.main_window));
fs=0;
}
return TRUE;
}
...
La callback responsabile della modalità Fullscreen :
//Fabio DM
static void
sakura_full_screen (GtkWidget *widget, void *data)
{
static int fs;
if (fs!=1) {
gtk_window_fullscreen(GTK_WINDOW (sakura.main_window));
fs=1;
}else{
gtk_window_unfullscreen(GTK_WINDOW (sakura.main_window));
fs=0;
}
}
**P.S.** si sarebbe potuto usare questa callback anche nel codice riguardante la scorciatoia da tastiera ''F11'' .\\ \\
Non appena si preme il tasto destro del mouse si apre il menù popup con tutte le funzioni di Sakura, in questo menù deve comparire anche la voce relativa alla modalità Fullscreen.\\
Il funzione ''static void sakura_init_popup() '' si occupa di disegnare il menu popup e di collegare le voci del menu alle relative callback. \\
La funzione ''static void sakura_init_popup() '' :
static void
sakura_init_popup()
{
GtkWidget *item_new_tab, *item_set_name, *item_close_tab, *item_copy,
*item_paste, *item_select_font, *item_select_colors,
*item_select_background, *item_set_title;
GtkWidget *item_options, *item_input_methods, *item_opacity_menu, *item_show_first_tab;
GtkAction *action_open_link, *action_copy_link, *action_new_tab, *action_set_name, *action_close_tab,
*action_copy, *action_paste, *action_select_font, *action_select_colors,
*action_select_background, *action_clear_background, *action_opacity, *action_set_title;
GtkWidget *separator, *separator2, *separator3, *separator4, *separator5;
GtkWidget *options_menu;
//Fabio DM
GtkWidget *item_full_screen;
GtkAction *action_full_screen;
/* Define actions */
action_open_link=gtk_action_new("open_link", _("Open link..."), NULL, NULL);
action_copy_link=gtk_action_new("copy_link", _("Copy link..."), NULL, NULL);
action_new_tab=gtk_action_new("new_tab", _("New tab"), NULL, GTK_STOCK_NEW);
action_set_name=gtk_action_new("set_name", _("Set name..."), NULL, NULL);
action_close_tab=gtk_action_new("close_tab", _("Close tab"), NULL, GTK_STOCK_CLOSE);
//Fabio DM
action_full_screen=gtk_action_new("full_screen", _("Full screen"), NULL, GTK_STOCK_FULLSCREEN);
action_copy=gtk_action_new("copy", _("Copy"), NULL, GTK_STOCK_COPY);
action_paste=gtk_action_new("paste", _("Paste"), NULL, GTK_STOCK_PASTE);
action_select_font=gtk_action_new("select_font", _("Select font..."), NULL, GTK_STOCK_SELECT_FONT);
action_select_colors=gtk_action_new("select_colors", _("Select colors..."), NULL, GTK_STOCK_SELECT_COLOR);
action_select_background=gtk_action_new("select_background", _("Select background..."), NULL, NULL);
action_clear_background=gtk_action_new("clear_background", _("Clear background"), NULL, NULL);
action_opacity=gtk_action_new("set_opacity", _("Set opacity level..."), NULL, NULL);
action_set_title=gtk_action_new("set_title", _("Set window title..."), NULL, NULL);
/* Create menuitems */
sakura.item_open_link=gtk_action_create_menu_item(action_open_link);
sakura.item_copy_link=gtk_action_create_menu_item(action_copy_link);
item_new_tab=gtk_action_create_menu_item(action_new_tab);
item_set_name=gtk_action_create_menu_item(action_set_name);
item_close_tab=gtk_action_create_menu_item(action_close_tab);
//Fabio DM
item_full_screen=gtk_action_create_menu_item(action_full_screen);
item_copy=gtk_action_create_menu_item(action_copy);
item_paste=gtk_action_create_menu_item(action_paste);
item_select_font=gtk_action_create_menu_item(action_select_font);
item_select_colors=gtk_action_create_menu_item(action_select_colors);
item_select_background=gtk_action_create_menu_item(action_select_background);
sakura.item_clear_background=gtk_action_create_menu_item(action_clear_background);
item_opacity_menu=gtk_action_create_menu_item(action_opacity);
item_set_title=gtk_action_create_menu_item(action_set_title);
item_show_first_tab=gtk_check_menu_item_new_with_label(_("Show always first tab"));
item_input_methods=gtk_menu_item_new_with_label(_("Input methods"));
item_options=gtk_menu_item_new_with_label(_("Options"));
/* Show defaults in menu items */
gchar *cfgtmp = g_key_file_get_value(sakura.cfg, cfg_group, "show_always_first_tab", NULL);
if (strcmp(cfgtmp, "Yes")==0) {
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item_show_first_tab), TRUE);
} else {
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item_show_first_tab), FALSE);
}
g_free(cfgtmp);
sakura.open_link_separator=gtk_separator_menu_item_new();
separator=gtk_separator_menu_item_new();
separator2=gtk_separator_menu_item_new();
separator3=gtk_separator_menu_item_new();
separator4=gtk_separator_menu_item_new();
separator5=gtk_separator_menu_item_new();
/* Add items to popup menu */
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), sakura.item_open_link);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), sakura.item_copy_link);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), sakura.open_link_separator);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), item_new_tab);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), item_set_name);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), separator);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), item_close_tab);
//Fabio DM
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), item_full_screen);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), separator2);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), item_copy);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), item_paste);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), separator3);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), item_select_colors);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), item_select_font);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), item_select_background);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), sakura.item_clear_background);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), separator4);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), item_options);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), separator5);
gtk_menu_shell_append(GTK_MENU_SHELL(sakura.menu), item_input_methods);
sakura.im_menu=gtk_menu_new();
options_menu=gtk_menu_new();
gtk_menu_shell_append(GTK_MENU_SHELL(options_menu), item_show_first_tab);
gtk_menu_shell_append(GTK_MENU_SHELL(options_menu), item_opacity_menu);
gtk_menu_shell_append(GTK_MENU_SHELL(options_menu), item_set_title);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_input_methods), sakura.im_menu);
gtk_menu_item_set_submenu(GTK_MENU_ITEM(item_options), options_menu);
/* ... and finally assign callbacks to menuitems */
g_signal_connect(G_OBJECT(action_new_tab), "activate", G_CALLBACK(sakura_new_tab), NULL);
g_signal_connect(G_OBJECT(action_set_name), "activate", G_CALLBACK(sakura_set_name_dialog), NULL);
g_signal_connect(G_OBJECT(action_close_tab), "activate", G_CALLBACK(sakura_close_tab), NULL);
g_signal_connect(G_OBJECT(action_select_font), "activate", G_CALLBACK(sakura_font_dialog), NULL);
g_signal_connect(G_OBJECT(action_select_background), "activate",
G_CALLBACK(sakura_background_selection), NULL);
g_signal_connect(G_OBJECT(action_copy), "activate", G_CALLBACK(sakura_copy), NULL);
g_signal_connect(G_OBJECT(action_paste), "activate", G_CALLBACK(sakura_paste), NULL);
g_signal_connect(G_OBJECT(action_select_colors), "activate", G_CALLBACK(sakura_color_dialog), NULL);
g_signal_connect(G_OBJECT(item_show_first_tab), "activate", G_CALLBACK(sakura_show_first_tab), NULL);
g_signal_connect(G_OBJECT(action_open_link), "activate", G_CALLBACK(sakura_open_url), NULL);
g_signal_connect(G_OBJECT(action_copy_link), "activate", G_CALLBACK(sakura_copy_url), NULL);
g_signal_connect(G_OBJECT(action_clear_background), "activate", G_CALLBACK(sakura_clear), NULL);
g_signal_connect(G_OBJECT(action_opacity), "activate", G_CALLBACK(sakura_set_opacity), NULL);
g_signal_connect(G_OBJECT(action_set_title), "activate", G_CALLBACK(sakura_set_title_dialog), NULL);
//Fabio DM
g_signal_connect(G_OBJECT(action_full_screen), "activate", G_CALLBACK(sakura_full_screen), NULL);
gtk_widget_show_all(sakura.menu);
/* We don't want to see this if there's no background image */
if (!sakura.background) {
gtk_widget_hide(sakura.item_clear_background);
}
}
===== Ricompiliamo tutto e speriamo bene =====
Compiliamo Sakura con un bel ''make'' e se tutto è andato bene saremo in grado di eseguire il file ''src/sakura'' . \\
''make install'' installerà Sakura .