Autore: Fabio Di Matteo
Ultima revisione: 25/05/2008
Sakura è un ottimo emulatore di terminale per il server grafico X, assomiglia molto 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.
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
.
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 .
Ecco come compilare Sakura:
$ cmake . $ make $ su -c 'make install'
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
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); } }
Compiliamo Sakura con un bel make
e se tutto è andato bene saremo in grado di eseguire il file src/sakura
.
make install
installerà Sakura .