2013-09-08 11:39:44 +00:00
# include <glib/gi18n.h>
2014-07-10 21:20:23 +00:00
# include <webkit2/webkit2.h>
2013-09-08 11:39:44 +00:00
# include "ag-app.h"
2013-09-08 21:02:05 +00:00
# include "ag-window.h"
2013-09-17 20:24:26 +00:00
# include "ag-chart.h"
2013-09-21 19:54:35 +00:00
# include "ag-preferences.h"
2013-09-08 11:39:44 +00:00
# include "config.h"
2013-09-17 12:46:09 +00:00
# include "astrognome.h"
2013-09-08 11:39:44 +00:00
2014-07-10 21:20:23 +00:00
typedef struct _AgAppPrivate {
WebKitWebViewGroup * web_view_group ;
} AgAppPrivate ;
G_DEFINE_TYPE_WITH_PRIVATE ( AgApp , ag_app , GTK_TYPE_APPLICATION ) ;
2013-09-08 11:39:44 +00:00
GtkWindow *
2013-09-17 09:41:34 +00:00
ag_app_peek_first_window ( AgApp * app )
2013-09-08 11:39:44 +00:00
{
GList * l ;
2013-09-17 09:41:34 +00:00
for ( l = gtk_application_get_windows ( GTK_APPLICATION ( app ) ) ; l ; l = g_list_next ( l ) ) {
2013-09-08 11:39:44 +00:00
if ( GTK_IS_WINDOW ( l - > data ) ) {
2013-09-21 16:37:27 +00:00
return GTK_WINDOW ( l - > data ) ;
2013-09-08 11:39:44 +00:00
}
}
2013-09-17 09:41:34 +00:00
ag_app_new_window ( app ) ;
2013-09-08 11:39:44 +00:00
2013-09-17 09:41:34 +00:00
return ag_app_peek_first_window ( app ) ;
2013-09-08 11:39:44 +00:00
}
void
2013-09-17 09:41:34 +00:00
ag_app_new_window ( AgApp * app )
2013-09-08 11:39:44 +00:00
{
2013-09-17 09:41:34 +00:00
g_action_group_activate_action ( G_ACTION_GROUP ( app ) , " new-window " , NULL ) ;
2013-09-08 11:39:44 +00:00
}
void
2013-09-17 09:41:34 +00:00
ag_app_quit ( AgApp * app )
2013-09-08 11:39:44 +00:00
{
2013-09-17 09:41:34 +00:00
g_action_group_activate_action ( G_ACTION_GROUP ( app ) , " quit " , NULL ) ;
2013-09-08 11:39:44 +00:00
}
void
2013-09-17 09:41:34 +00:00
ag_app_raise ( AgApp * app )
2013-09-08 11:39:44 +00:00
{
2013-09-17 09:41:34 +00:00
g_action_group_activate_action ( G_ACTION_GROUP ( app ) , " raise " , NULL ) ;
2013-09-08 11:39:44 +00:00
}
2013-09-17 11:26:16 +00:00
static GtkWidget *
ag_app_create_window ( AgApp * app )
2013-09-08 11:39:44 +00:00
{
GtkWidget * window ;
2013-09-17 09:41:34 +00:00
window = ag_window_new ( app ) ;
gtk_application_add_window ( GTK_APPLICATION ( app ) , GTK_WINDOW ( window ) ) ;
2013-09-08 11:39:44 +00:00
gtk_widget_show_all ( window ) ;
2013-09-17 11:26:16 +00:00
return window ;
}
static void
new_window_cb ( GSimpleAction * action , GVariant * parameter , gpointer user_data )
{
ag_app_create_window ( AG_APP ( user_data ) ) ;
2013-09-08 11:39:44 +00:00
}
static void
preferences_cb ( GSimpleAction * action , GVariant * parameter , gpointer user_data )
{
2014-06-30 20:51:15 +00:00
AgApp * app = AG_APP ( user_data ) ;
GtkWindow * window ;
window = ag_app_peek_first_window ( app ) ;
ag_preferences_show_dialog ( window ) ;
2013-09-08 11:39:44 +00:00
}
static void
about_cb ( GSimpleAction * action , GVariant * parameter , gpointer user_data )
{
const gchar * authors [ ] = {
" Gergely Polonkai <gergely@polonkai.eu> " ,
" Jean-André Santoni <jean.andre.santoni@gmail.com> " ,
NULL
} ;
2013-09-21 16:37:27 +00:00
const gchar * * documentors = NULL ;
2013-09-08 11:39:44 +00:00
const gchar * translator_credits = _ ( " translator_credits " ) ;
/* i18n: Please don't translate "Astrognome" (it's marked as translatable for transliteration only */
gtk_show_about_dialog ( NULL ,
2013-09-21 16:37:27 +00:00
" name " , _ ( " Astrognome " ) ,
" version " , PACKAGE_VERSION ,
" comments " , _ ( " Astrologers' software for GNOME " ) ,
" authors " , authors ,
" documentors " , documentors ,
" translator_credits " , ( ( strcmp ( translator_credits , " translator_credits " ) ! = 0 ) ? translator_credits : NULL ) ,
" website " , PACKAGE_URL ,
" website-label " , _ ( " Astrognome Website " ) ,
" logo-icon-name " , PACKAGE_TARNAME ,
NULL ) ;
2013-09-08 11:39:44 +00:00
}
static void
quit_cb ( GSimpleAction * action , GVariant * parameter , gpointer user_data )
{
GList * l ;
2013-09-17 09:41:34 +00:00
while ( ( l = gtk_application_get_windows ( GTK_APPLICATION ( user_data ) ) ) ) {
gtk_application_remove_window ( GTK_APPLICATION ( user_data ) , GTK_WINDOW ( l - > data ) ) ;
2013-09-08 11:39:44 +00:00
}
}
2013-09-17 12:52:12 +00:00
static void
ag_app_open_chart ( AgApp * app , GFile * file )
{
2013-09-17 20:24:26 +00:00
GtkWidget * window ;
2013-09-21 16:37:27 +00:00
AgChart * chart ;
GError * err = NULL ;
gchar * uri ;
2013-09-17 20:24:26 +00:00
2013-10-03 22:16:55 +00:00
if ( ( chart = ag_chart_load_from_file ( file , & err ) ) = = NULL ) {
g_print ( " Error: '%s' \n " , err - > message ) ;
return ;
}
2013-09-17 20:24:26 +00:00
window = ag_app_create_window ( app ) ;
ag_window_set_chart ( AG_WINDOW ( window ) , chart ) ;
ag_window_update_from_chart ( AG_WINDOW ( window ) ) ;
2013-09-18 08:40:17 +00:00
uri = g_file_get_uri ( file ) ;
ag_window_set_uri ( AG_WINDOW ( window ) , uri ) ;
g_free ( uri ) ;
2014-07-03 12:08:51 +00:00
ag_window_change_tab ( AG_WINDOW ( window ) , " chart " ) ;
2013-09-17 12:52:12 +00:00
}
2013-09-17 11:58:49 +00:00
static void
open_cb ( GSimpleAction * action , GVariant * parameter , gpointer user_data )
{
2013-09-21 16:37:27 +00:00
gint response ;
2013-09-17 12:46:09 +00:00
GtkWidget * fs ;
2013-09-21 16:37:27 +00:00
GSList * filenames = NULL ;
2013-09-17 12:46:09 +00:00
fs = gtk_file_chooser_dialog_new ( _ ( " Select charts " ) ,
2013-09-21 16:37:27 +00:00
NULL ,
GTK_FILE_CHOOSER_ACTION_OPEN ,
2014-03-30 07:47:21 +00:00
_ ( " _Cancel " ) , GTK_RESPONSE_CANCEL ,
_ ( " _Open " ) , GTK_RESPONSE_ACCEPT ,
2013-09-21 16:37:27 +00:00
NULL ) ;
2013-09-17 12:46:09 +00:00
gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER ( fs ) , filter_all ) ;
gtk_file_chooser_add_filter ( GTK_FILE_CHOOSER ( fs ) , filter_chart ) ;
gtk_file_chooser_set_filter ( GTK_FILE_CHOOSER ( fs ) , filter_chart ) ;
gtk_dialog_set_default_response ( GTK_DIALOG ( fs ) , GTK_RESPONSE_ACCEPT ) ;
gtk_file_chooser_set_select_multiple ( GTK_FILE_CHOOSER ( fs ) , TRUE ) ;
gtk_file_chooser_set_local_only ( GTK_FILE_CHOOSER ( fs ) , FALSE ) ;
response = gtk_dialog_run ( GTK_DIALOG ( fs ) ) ;
if ( response = = GTK_RESPONSE_ACCEPT ) {
filenames = gtk_file_chooser_get_uris ( GTK_FILE_CHOOSER ( fs ) ) ;
}
if ( filenames ! = NULL ) {
GSList * l ;
for ( l = filenames ; l ; l = g_slist_next ( l ) ) {
GFile * file ;
2013-09-21 16:37:27 +00:00
char * data = l - > data ;
2013-09-17 12:46:09 +00:00
if ( data = = NULL ) {
continue ;
}
file = g_file_new_for_commandline_arg ( data ) ;
2013-09-17 12:52:12 +00:00
ag_app_open_chart ( AG_APP ( user_data ) , file ) ;
2013-09-17 12:46:09 +00:00
}
}
gtk_widget_destroy ( fs ) ;
2013-09-17 11:58:49 +00:00
}
2013-09-08 11:39:44 +00:00
static void
raise_cb ( GSimpleAction * action , GVariant * parameter , gpointer user_data )
{
2013-09-21 16:37:27 +00:00
AgApp * app = AG_APP ( user_data ) ;
2013-09-08 11:39:44 +00:00
GtkWindow * window ;
2013-09-17 09:41:34 +00:00
window = ag_app_peek_first_window ( app ) ;
2013-09-08 11:39:44 +00:00
gtk_window_present ( window ) ;
}
2013-09-22 11:51:21 +00:00
static void
show_help ( const gchar * topic , GtkWindow * parent )
{
gchar * uri ;
GdkScreen * screen ;
GError * err = NULL ;
if ( topic ) {
uri = g_strdup_printf ( " help:astrognome/%s " , topic ) ;
} else {
uri = g_strdup ( " help:astrognome " ) ;
}
if ( parent ) {
screen = gtk_widget_get_screen ( GTK_WIDGET ( parent ) ) ;
} else {
screen = gdk_screen_get_default ( ) ;
}
if ( ! gtk_show_uri ( screen , uri , gtk_get_current_event_time ( ) , & err ) ) {
2014-03-30 15:52:57 +00:00
GtkWidget * dialog ;
dialog = gtk_message_dialog_new ( parent , GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT , GTK_MESSAGE_WARNING , GTK_BUTTONS_OK , " Unable to display help: %s " , err - > message ) ;
gtk_dialog_run ( GTK_DIALOG ( dialog ) ) ;
gtk_widget_destroy ( dialog ) ;
2013-09-22 11:51:21 +00:00
}
g_free ( uri ) ;
}
static void
help_cb ( GSimpleAction * action , GVariant * parameter , gpointer user_data )
{
show_help ( NULL , NULL ) ;
}
2013-09-08 11:39:44 +00:00
static GActionEntry app_entries [ ] = {
{ " new-window " , new_window_cb , NULL , NULL , NULL } ,
{ " preferences " , preferences_cb , NULL , NULL , NULL } ,
{ " about " , about_cb , NULL , NULL , NULL } ,
{ " quit " , quit_cb , NULL , NULL , NULL } ,
{ " raise " , raise_cb , NULL , NULL , NULL } ,
2013-09-17 11:58:49 +00:00
{ " open " , open_cb , NULL , NULL , NULL } ,
2013-09-22 11:51:21 +00:00
{ " help " , help_cb , NULL , NULL , NULL } ,
2013-09-08 11:39:44 +00:00
} ;
static void
2013-09-17 09:41:34 +00:00
setup_actions ( AgApp * app )
2013-09-08 11:39:44 +00:00
{
2013-09-17 09:41:34 +00:00
g_action_map_add_action_entries ( G_ACTION_MAP ( app ) , app_entries , G_N_ELEMENTS ( app_entries ) , app ) ;
2013-09-08 11:39:44 +00:00
}
static void
2013-09-17 09:41:34 +00:00
setup_accelerators ( AgApp * app )
2013-09-08 11:39:44 +00:00
{
2013-09-20 08:58:12 +00:00
gtk_application_add_accelerator ( GTK_APPLICATION ( app ) , " <Primary>w " , " win.close " , NULL ) ;
gtk_application_add_accelerator ( GTK_APPLICATION ( app ) , " <Primary>s " , " win.save " , NULL ) ;
gtk_application_add_accelerator ( GTK_APPLICATION ( app ) , " <Primary><Shift>s " , " win.save-as " , NULL ) ;
gtk_application_add_accelerator ( GTK_APPLICATION ( app ) , " F10 " , " win.gear-menu " , NULL ) ;
2013-09-22 11:51:21 +00:00
gtk_application_add_accelerator ( GTK_APPLICATION ( app ) , " F1 " , " app.help " , NULL ) ;
2013-09-20 10:41:21 +00:00
gtk_application_add_accelerator ( GTK_APPLICATION ( app ) , " F5 " , " win.change-tab " , g_variant_new_string ( " chart " ) ) ;
gtk_application_add_accelerator ( GTK_APPLICATION ( app ) , " F9 " , " win.change-tab " , g_variant_new_string ( " aspects " ) ) ;
2013-09-08 11:39:44 +00:00
}
static void
2013-09-17 09:41:34 +00:00
setup_menu ( AgApp * app )
2013-09-08 11:39:44 +00:00
{
GtkBuilder * builder ;
GMenuModel * model ;
2013-09-21 16:37:27 +00:00
GError * err = NULL ;
2013-09-08 11:39:44 +00:00
builder = gtk_builder_new ( ) ;
2014-07-03 21:13:52 +00:00
if ( ! gtk_builder_add_from_resource ( builder , " /eu/polonkai/gergely/Astrognome/ui/astrognome.ui " , & err ) ) {
2013-09-08 11:39:44 +00:00
g_error ( " %s " , ( err ) ? err - > message : " unknown error " ) ;
}
model = G_MENU_MODEL ( gtk_builder_get_object ( builder , " app-menu " ) ) ;
2013-09-17 09:41:34 +00:00
gtk_application_set_app_menu ( GTK_APPLICATION ( app ) , model ) ;
2013-09-08 11:39:44 +00:00
g_object_unref ( builder ) ;
}
static void
2013-09-17 09:41:34 +00:00
startup ( GApplication * gapp )
2013-09-08 11:39:44 +00:00
{
2013-09-17 09:41:34 +00:00
AgApp * app = AG_APP ( gapp ) ;
2013-09-08 11:39:44 +00:00
2013-09-17 09:41:34 +00:00
G_APPLICATION_CLASS ( ag_app_parent_class ) - > startup ( gapp ) ;
2013-09-08 11:39:44 +00:00
2013-09-17 09:41:34 +00:00
setup_actions ( app ) ;
setup_menu ( app ) ;
setup_accelerators ( app ) ;
2013-09-08 11:39:44 +00:00
}
2013-09-17 11:28:07 +00:00
static void
ag_app_open ( GApplication * gapp , GFile * * files , gint n_files , const gchar * hint )
{
gint i ;
for ( i = 0 ; i < n_files ; i + + ) {
2013-09-17 12:52:12 +00:00
ag_app_open_chart ( AG_APP ( gapp ) , files [ i ] ) ;
2013-09-17 11:28:07 +00:00
}
}
2013-09-20 08:23:02 +00:00
void
ag_app_run_action ( AgApp * app , gboolean is_remote , const AstrognomeOptions * options )
{
if ( options & & options - > new_window ) {
if ( is_remote ) {
ag_app_new_window ( app ) ;
}
} else if ( options & & options - > quit ) {
ag_app_quit ( app ) ;
} else if ( is_remote ) { // Keep this option the last one!
ag_app_raise ( app ) ;
}
}
static void
application_activate_cb ( AgApp * app , gpointer user_data )
{
ag_app_new_window ( app ) ;
ag_app_run_action ( app , FALSE , NULL ) ;
}
2013-09-08 11:39:44 +00:00
AgApp *
ag_app_new ( void )
{
AgApp * app ;
/* i18n: Please don't translate "Astrognome" (it's marked as translatable for transliteration only */
g_set_application_name ( _ ( " Astrognome " ) ) ;
app = g_object_new ( AG_TYPE_APP ,
2013-09-21 16:37:27 +00:00
" application-id " , " eu.polonkai.gergely.Astrognome " ,
" flags " , G_APPLICATION_HANDLES_OPEN ,
" register-session " , TRUE ,
NULL ) ;
2013-09-20 08:23:02 +00:00
g_signal_connect ( app , " activate " , G_CALLBACK ( application_activate_cb ) , NULL ) ;
2013-09-08 11:39:44 +00:00
return app ;
}
static void
2013-09-17 09:41:34 +00:00
ag_app_init ( AgApp * app )
2013-09-08 11:39:44 +00:00
{
2014-07-10 21:24:33 +00:00
AgAppPrivate * priv ;
GBytes * css_data ;
const gchar * css_source ;
gsize css_length ;
priv = ag_app_get_instance_private ( app ) ;
priv - > web_view_group = webkit_web_view_group_new ( NULL ) ;
css_data = g_resources_lookup_data (
" /eu/polonkai/gergely/Astrognome/ui/chart-default.css " ,
G_RESOURCE_LOOKUP_FLAGS_NONE ,
NULL
) ;
if ( ( css_source = g_bytes_get_data ( css_data , & css_length ) ) ! = NULL ) {
webkit_web_view_group_add_user_style_sheet (
priv - > web_view_group ,
css_source ,
NULL ,
NULL ,
NULL ,
WEBKIT_INJECTED_CONTENT_FRAMES_TOP_ONLY
) ;
}
g_bytes_unref ( css_data ) ;
2013-09-08 11:39:44 +00:00
}
static void
ag_app_class_init ( AgAppClass * klass )
{
GApplicationClass * application_class = G_APPLICATION_CLASS ( klass ) ;
application_class - > startup = startup ;
2013-09-21 16:37:27 +00:00
application_class - > open = ag_app_open ;
2013-09-08 11:39:44 +00:00
}
2014-07-04 20:31:59 +00:00
void
ag_app_message_dialog ( GtkWidget * window , GtkMessageType message_type , gchar * fmt , . . . )
{
gchar * msg ;
va_list args ;
GtkWidget * dialog ;
va_start ( args , fmt ) ;
msg = g_strdup_vprintf ( fmt , args ) ;
va_end ( args ) ;
dialog = gtk_message_dialog_new ( GTK_WINDOW ( window ) , GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT , message_type , GTK_BUTTONS_OK , " %s " , msg ) ;
g_free ( msg ) ;
gtk_dialog_run ( GTK_DIALOG ( dialog ) ) ;
gtk_widget_destroy ( dialog ) ;
}