const PlumaEncoding * pluma_encoding_get_current (void) { static gboolean initialized = FALSE; static const PlumaEncoding *locale_encoding = NULL; const gchar *locale_charset; pluma_encoding_lazy_init (); if (initialized != FALSE) return locale_encoding; if (g_get_charset (&locale_charset) == FALSE) { g_return_val_if_fail (locale_charset != NULL, &utf8_encoding); locale_encoding = pluma_encoding_get_from_charset (locale_charset); } else { locale_encoding = &utf8_encoding; } if (locale_encoding == NULL) { locale_encoding = &unknown_encoding; } g_return_val_if_fail (locale_encoding != NULL, NULL); initialized = TRUE; return locale_encoding; }
static void pluma_get_command_line_data (void) { if (remaining_args) { gint i; for (i = 0; remaining_args[i]; i++) { if (*remaining_args[i] == '+') { if (*(remaining_args[i] + 1) == '\0') /* goto the last line of the document */ line_position = G_MAXINT; else line_position = atoi (remaining_args[i] + 1); } else { GFile *file; file = g_file_new_for_commandline_arg (remaining_args[i]); file_list = g_slist_prepend (file_list, file); } } file_list = g_slist_reverse (file_list); } if (encoding_charset && (pluma_encoding_get_from_charset (encoding_charset) == NULL)) { g_print (_("%s: invalid encoding.\n"), encoding_charset); } }
int main (int argc, char *argv[]) { GOptionContext *context; PlumaPluginsEngine *engine; PlumaWindow *window; PlumaApp *app; gboolean restored = FALSE; GError *error = NULL; gchar *dir; gchar *icon_dir; /* Setup debugging */ pluma_debug_init (); pluma_debug_message (DEBUG_APP, "Startup"); setlocale (LC_ALL, ""); dir = pluma_dirs_get_pluma_locale_dir (); bindtextdomain (GETTEXT_PACKAGE, dir); g_free (dir); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); startup_timestamp = get_startup_timestamp(); /* Setup command line options */ context = g_option_context_new (_("- Edit text files")); g_option_context_add_main_entries (context, options, GETTEXT_PACKAGE); g_option_context_add_group (context, gtk_get_option_group (FALSE)); g_option_context_add_group (context, egg_sm_client_get_option_group ()); gtk_init (&argc, &argv); if (!g_option_context_parse (context, &argc, &argv, &error)) { g_print(_("%s\nRun '%s --help' to see a full list of available command line options.\n"), error->message, argv[0]); g_error_free (error); g_option_context_free (context); return 1; } g_option_context_free (context); pluma_debug_message (DEBUG_APP, "Create bacon connection"); connection = bacon_message_connection_new ("pluma"); if (connection != NULL) { if (!bacon_message_connection_get_is_server (connection)) { pluma_debug_message (DEBUG_APP, "I'm a client"); pluma_get_command_line_data (); send_bacon_message (); free_command_line_data (); /* we never popup a window... tell startup-notification * that we are done. */ gdk_notify_startup_complete (); bacon_message_connection_free (connection); exit (0); } else { pluma_debug_message (DEBUG_APP, "I'm a server"); bacon_message_connection_set_callback (connection, on_message_received, NULL); } } else { g_warning ("Cannot create the 'pluma' connection."); } pluma_debug_message (DEBUG_APP, "Set icon"); dir = pluma_dirs_get_pluma_data_dir (); icon_dir = g_build_filename (dir, "icons", NULL); g_free (dir); gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (), icon_dir); g_free (icon_dir); /* Set the associated .desktop file */ egg_set_desktop_file (DATADIR "/applications/pluma.desktop"); /* Load user preferences */ pluma_debug_message (DEBUG_APP, "Init prefs manager"); pluma_prefs_manager_app_init (); /* Init plugins engine */ pluma_debug_message (DEBUG_APP, "Init plugins"); engine = pluma_plugins_engine_get_default (); /* Initialize session management */ pluma_debug_message (DEBUG_APP, "Init session manager"); pluma_session_init (); if (pluma_session_is_restored ()) restored = pluma_session_load (); if (!restored) { pluma_debug_message (DEBUG_APP, "Analyze command line data"); pluma_get_command_line_data (); pluma_debug_message (DEBUG_APP, "Get default app"); app = pluma_app_get_default (); pluma_debug_message (DEBUG_APP, "Create main window"); window = pluma_app_create_window (app, NULL); if (file_list != NULL) { const PlumaEncoding *encoding = NULL; if (encoding_charset) encoding = pluma_encoding_get_from_charset (encoding_charset); pluma_debug_message (DEBUG_APP, "Load files"); _pluma_cmd_load_files_from_prompt (window, file_list, encoding, line_position); } else { pluma_debug_message (DEBUG_APP, "Create tab"); pluma_window_create_tab (window, TRUE); } pluma_debug_message (DEBUG_APP, "Show window"); gtk_widget_show (GTK_WIDGET (window)); free_command_line_data (); } pluma_debug_message (DEBUG_APP, "Start gtk-main"); gtk_main(); bacon_message_connection_free (connection); /* We kept the original engine reference here. So let's unref it to * finalize it properly. */ g_object_unref (engine); pluma_prefs_manager_app_shutdown (); #ifndef ENABLE_GVFS_METADATA pluma_metadata_manager_shutdown (); #endif return 0; }
/* serverside */ static void on_message_received (const char *message, gpointer data) { const PlumaEncoding *encoding = NULL; gchar **commands; gchar **params; gint workspace; gint viewport_x; gint viewport_y; gchar *display_name; gint screen_number; gint i; PlumaApp *app; PlumaWindow *window; GdkDisplay *display; GdkScreen *screen; g_return_if_fail (message != NULL); pluma_debug_message (DEBUG_APP, "Received message:\n%s\n", message); commands = g_strsplit (message, "\v", -1); /* header */ params = g_strsplit (commands[0], "\t", 6); startup_timestamp = atoi (params[0]); display_name = params[1]; screen_number = atoi (params[2]); workspace = atoi (params[3]); viewport_x = atoi (params[4]); viewport_y = atoi (params[5]); display = display_open_if_needed (display_name); if (display == NULL) { g_warning ("Could not open display %s\n", display_name); g_strfreev (params); goto out; } screen = gdk_display_get_screen (display, screen_number); g_strfreev (params); /* body */ for (i = 1; commands[i] != NULL; i++) { params = g_strsplit (commands[i], "\t", -1); if (strcmp (params[0], "NEW-WINDOW") == 0) { new_window_option = TRUE; } else if (strcmp (params[0], "NEW-DOCUMENT") == 0) { new_document_option = TRUE; } else if (strcmp (params[0], "OPEN-URIS") == 0) { gint n_uris, j; gchar **uris; line_position = atoi (params[1]); if (params[2] != '\0') encoding = pluma_encoding_get_from_charset (params[2]); n_uris = atoi (params[3]); uris = g_strsplit (params[4], " ", n_uris); for (j = 0; j < n_uris; j++) { GFile *file; file = g_file_new_for_uri (uris[j]); file_list = g_slist_prepend (file_list, file); } file_list = g_slist_reverse (file_list); /* the list takes ownerhip of the strings, * only free the array */ g_free (uris); } else { g_warning ("Unexpected bacon command"); } g_strfreev (params); } /* execute the commands */ app = pluma_app_get_default (); if (new_window_option) { window = pluma_app_create_window (app, screen); } else { /* get a window in the current workspace (if exists) and raise it */ window = _pluma_app_get_window_in_viewport (app, screen, workspace, viewport_x, viewport_y); } if (file_list != NULL) { _pluma_cmd_load_files_from_prompt (window, file_list, encoding, line_position); if (new_document_option) pluma_window_create_tab (window, TRUE); } else { PlumaDocument *doc; doc = pluma_window_get_active_document (window); if (doc == NULL || !pluma_document_is_untouched (doc) || new_document_option) pluma_window_create_tab (window, TRUE); } /* set the proper interaction time on the window. * Fall back to roundtripping to the X server when we * don't have the timestamp, e.g. when launched from * terminal. We also need to make sure that the window * has been realized otherwise it will not work. lame. */ if (!gtk_widget_get_realized (GTK_WIDGET (window))) gtk_widget_realize (GTK_WIDGET (window)); if (startup_timestamp <= 0) startup_timestamp = gdk_x11_get_server_time (gtk_widget_get_window (GTK_WIDGET (window))); gdk_x11_window_set_user_time (gtk_widget_get_window (GTK_WIDGET (window)), startup_timestamp); gtk_window_present (GTK_WINDOW (window)); out: g_strfreev (commands); free_command_line_data (); }