Indice

Includere la funzione fullscreen in Sakura

Autore: Fabio Di Matteo
Ultima revisione: 25/05/2008

Sakura è un ottimo emulatore di terminale per il server grafico X, assomiglia molto Sakuraa 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: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 .