====== 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 .