int main( int argc, char *argv[]) #endif { #if defined(USE_GTK2_GEOMETRY_METHOD) && defined (GEOMETRY) g_debug("GEOMETRY_NONE = 0x%X", GEOMETRY_NONE ); g_debug("GEOMETRY_UPDATE_PAGE_NAME = 0x%X", GEOMETRY_UPDATE_PAGE_NAME); g_debug("GEOMETRY_UPDATE_PAGE_NAME_MASK = 0x%X", GEOMETRY_UPDATE_PAGE_NAME_MASK); g_debug("GEOMETRY_CHANGING_THEME = 0x%X", GEOMETRY_CHANGING_THEME); g_debug("GEOMETRY_SHOW_HIDE_SCROLL_BAR = 0x%X", GEOMETRY_SHOW_HIDE_SCROLL_BAR); g_debug("GEOMETRY_SHOW_HIDE_TAB_BAR = 0x%X", GEOMETRY_SHOW_HIDE_TAB_BAR); g_debug("GEOMETRY_CHANGING_FONT = 0x%X", GEOMETRY_CHANGING_FONT); g_debug("GEOMETRY_NEEDS_RUN_SIZE_REQUEST_MASK = 0x%X", GEOMETRY_NEEDS_RUN_SIZE_REQUEST_MASK); g_debug("GEOMETRY_NEEDS_RUN_SIZE_REQUEST_AGAIN_MASK = 0x%X", GEOMETRY_NEEDS_RUN_SIZE_REQUEST_AGAIN_MASK); g_debug("GEOMETRY_HAD_BEEN_RESIZED_ONCE_MASK = 0x%X", GEOMETRY_HAD_BEEN_RESIZED_ONCE_MASK); #endif // command_line_path = argv[0]; // g_debug ("argc = %d", argc); // print_array ("argv", argv); // i18n support. We need to support i18n under console, too. setlocale(LC_ALL, ""); bindtextdomain(BINARY, LOCALEDIR); bind_textdomain_codeset(BINARY, "UTF-8"); textdomain(BINARY); #if ! defined(SAFEMODE) && defined(DEVELOP) g_message("Running %s without SAFE MODE!", PACKAGE); #endif #ifdef OUT_OF_MEMORY # undef g_strdup_printf #endif #ifdef ENABLE_PROFILE const gchar *user_config_dir = g_get_user_config_dir(); if (user_config_dir) profile_dir = g_strdup_printf("%s/%s", user_config_dir, BINARY); #endif #ifdef OUT_OF_MEMORY #define g_strdup_printf(...) NULL #endif // in BSD system, /proc may not exist. proc_exist = check_if_default_proc_dir_exist(NULL); // g_debug ("Get proc_exist = %d, proc_file_system_path = %s", proc_exist, proc_file_system_path); shell = g_getenv("SHELL"); if (shell==NULL) shell = ""; gboolean pwd_need_be_free = FALSE; pwd = (gchar *)g_getenv("PWD"); if (pwd==NULL) { pwd_need_be_free = TRUE; pwd = g_get_current_dir(); } if (pwd==NULL) { pwd_need_be_free = FALSE; pwd = ""; } // g_debug("Got $PWD = %s", pwd); home = g_getenv("HOME"); if (home==NULL) home = ""; // g_debug("Get $HOME = %s", home); // deal the command line options command_option(argc, argv); if (wmclass_name==NULL) wmclass_name = g_getenv("RESOURCE_NAME"); if (wmclass_name==NULL) wmclass_name = ""; if (wmclass_class==NULL) wmclass_class = ""; // g_debug("Got wmclass_name = %s, wmclass_class = %s", wmclass_name, wmclass_class); // init the gtk+2 engine // GTK3: get gtk_test_widget_click() working... // gdk_disable_multidevice(); #ifndef UNIT_TEST gtk_init(&argc, &argv); #endif // FIXME: we should get the single_process from profile. Current is command-line option only. if (single_process) { gchar *socket_str = convert_socket_data_to_string(argv); if (init_gtk_socket(SOCKET_FILE, socket_str, (GSourceFunc)convert_string_to_socket_data) == UNIX_SOCKET_DATA_SENT) { g_free(profile_dir); exit (0); } g_free(socket_str); } // start LilyTerm // empty_environ = g_strsplit("", " ", -1); extern gchar **environ; // print_array("main(): environ", environ); gchar *environ_str = convert_array_to_string(environ, '\t'); // if (window_list) g_error("CHECK: window_list = %p !!", window_list); // g_debug("Got environ_str (in main.c) = %s", environ_str); selection_clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); selection_primary = gtk_clipboard_get(GDK_SELECTION_PRIMARY); system_locale_list = get_locale_list(); // g_debug("Got system_locale_list = %s", system_locale_list); init_LC_CTYPE = g_strdup(get_default_lc_data(LC_CTYPE)); // g_debug("Got init_LC_CTYPE = %s", init_LC_CTYPE); init_LANGUAGE = g_strdup(get_default_lc_data(LANGUAGE)); // g_debug("Got init_LANGUAGE = %s", init_LANGUAGE); init_LC_MESSAGES = g_strdup(get_default_lc_data(LC_MESSAGES)); // g_debug("init_LC_MESSAGES = %s", init_LC_MESSAGES); init_encoding = (gchar *)get_encoding_from_locale(NULL); if (! compare_strings(init_encoding, "ANSI_X3.4-1968", TRUE)) { g_free(init_encoding); init_encoding = g_strdup("UTF-8"); } // g_debug("init_encoding = %s", init_encoding); SYSTEM_VTE_CJK_WIDTH_STR = g_getenv("VTE_CJK_WIDTH"); // g_debug ("Got SYSTEM_VTE_CJK_WIDTH_STR = %s", SYSTEM_VTE_CJK_WIDTH_STR); // FIXME: signal(SIGCHLD, SIG_IGN); // The first window of LilyTerm // Convert the GdkColor to GdkRGBA convert_system_color_to_rgba(); // g_debug("Got original encoding = %s", get_encoding_from_locale(NULL)); //GtkNotebook *new_window(int argc, // char *argv[], // gchar *shell, // gchar *environment, // gchar *locale_list, // gchar *PWD, // gchar *HOME, // gchar *VTE_CJK_WIDTH_STR, // gboolean VTE_CJK_WIDTH_STR_overwrite_profile, // gchar *wmclass_name, // gchar *wmclass_class, // gchar *user_environ, // gchar *encoding, // gboolean encoding_overwrite_profile, // gchar *lc_messages, // struct Window *win_data_orig, // struct Page *page_data_orig) // g_debug("main(1): gtk_main_level = %d, g_list_length(window_list) = %d", gtk_main_level(), g_list_length(window_list)); if ((new_window(argc, argv, (gchar *) shell, environ_str, system_locale_list, (gchar *) pwd, (gchar *) home, SYSTEM_VTE_CJK_WIDTH_STR, FALSE, wmclass_name, wmclass_class, NULL, init_encoding, FALSE, init_LC_MESSAGES, NULL, NULL)) || g_list_length(window_list)) { // The argv of "main" LilyTerm can't be free. // Set it to NULL here to avoid double_free(). argv=NULL; #ifdef ENABLE_X_STARTUP_NOTIFICATION_ID gdk_notify_startup_complete_with_id(PACKAGE); #endif // g_debug("main(2): gtk_main_level = %d, g_list_length(window_list) = %d", gtk_main_level(), g_list_length(window_list)); if (! gtk_main_level()) gtk_main(); } #ifdef DETAIL else { // g_debug("Got window_list = %p", window_list); // GList *win_list = window_list; // gint i=0; // // while (win_list) // { // g_debug("Got %d win_data = %p", ++i, win_list->data); // win_list = win_list->next; // } g_debug("??? The creation of first window is FAIL!!!"); } #endif extern struct KeyValue system_keys[KEYS]; gint i; // g_debug("Clear function key data!!"); for (i=KEY_SWITCH_TO_TAB_1; i<=KEY_SWITCH_TO_TAB_12; i++) { g_free(system_keys[i].name); g_free(system_keys[i].topic); g_free(system_keys[i].comment); g_free(system_keys[i].translation); #ifdef UNIT_TEST system_keys[i].name = NULL; system_keys[i].topic = NULL; system_keys[i].comment = NULL; system_keys[i].translation = NULL; #endif } // g_free(pwd); // g_strfreev(empty_environ); g_free(environ_str); g_free(init_encoding); g_free(system_locale_list); g_free(profile_dir); if (pwd_need_be_free) g_free(pwd); g_free(restricted_locale_message); g_list_free(window_list); g_free(init_LC_CTYPE); g_free(init_LC_MESSAGES); #ifdef UNIT_TEST // empty_environ = NULL; environ_str = NULL; init_encoding = NULL; system_locale_list = NULL; profile_dir = NULL; restricted_locale_message = NULL; window_list = NULL; init_LC_CTYPE = NULL; init_LC_MESSAGES = NULL; #endif return 0; }
// it will return TRUE if scucceed gboolean send_socket( int argc, char *argv[], gboolean wait) { #ifdef DETAIL g_debug("! Launch send_socket() to send data to the exiting LilyTerm !"); g_debug("! send_socket() argc = %d, wait = %d", argc, wait); print_array("! send_socket() argv", argv); #endif GError *error = NULL; gsize len; extern gchar **environ; gchar *locale_list = get_locale_list(); const gchar *VTE_CJK_WIDTH_STR = g_getenv("VTE_CJK_WIDTH"); // VTE_CJK_WIDTH can't = NULL if (VTE_CJK_WIDTH_STR == NULL) VTE_CJK_WIDTH_STR = ""; // g_debug("Got LOCALE = %s in send_socket...", get_encoding_from_locale(NULL)); gchar *encoding = get_encoding_from_locale(NULL); if (! compare_strings(encoding, "ANSI_X3.4-1968", TRUE)) { g_free(encoding); encoding = g_strdup("UTF-8"); } // g_debug("Got encoding = %s in send_socket...", encoding); gchar *lc_messages = g_strdup(get_default_lc_data(LC_MESSAGES)); gchar *environ_str = convert_array_to_string(environ, '\t'); // print_array("! send_socket() environ", environ); // g_debug("environ_str = %s", environ_str); gchar *argv_str = convert_array_to_string(argv, '\x10'); #ifdef SAFEMODE gboolean need_free_argv_str = TRUE; if (argv_str==NULL) argv_str=g_strdup(""); if (argv_str==NULL) { need_free_argv_str = FALSE; argv_str = ""; } #endif // g_debug("argv_str = %s", argv_str); // g_debug("SEND DATA: SOCKET_DATA_VERSION = %s", SOCKET_DATA_VERSION); // g_debug("SEND DATA: locale_list = %s", locale_list); // g_debug("SEND DATA: encoding = %s", encoding); // g_debug("SEND DATA: PWD = %s", PWD); // g_debug("SEND DATA: VTE_CJK_WIDTH_STR = %s", VTE_CJK_WIDTH_STR); // g_debug("SEND DATA: wmclass_name = %s", wmclass_name); // g_debug("SEND DATA: wmclass_class = %s", wmclass_class); // g_debug("SEND DATA: environ_str = %s", environ_str); // g_debug("SEND DATA: argv_str = %s", argv_str); // 0 1 2 3 4 5 6 7 8 9 10 11 // send data: SOCKET_DATA_VERSION SHELL LOCALE_LIST ENCODING LC_MESSAGES PWD HOME VTE_CJK_WIDTH_STR wmclass_name wmclass_class ENVIRON ARGV // 0 1 2 3 4 5 6 7 8 9 10 11 gchar *arg_str = g_strdup_printf("%s\x10%s\x10%s\x10%s\x10%s\x10%s\x10%s\x10%s\x10%s\x10%s\x10%s\x10%s\x10", SOCKET_DATA_VERSION, shell, locale_list, encoding, lc_messages, pwd, home, VTE_CJK_WIDTH_STR, wmclass_name, wmclass_class, environ_str, argv_str); // g_debug("arg_str = %s", arg_str); g_free(locale_list); g_free(encoding); g_free(lc_messages); g_free(environ_str); #ifdef SAFEMODE if (need_free_argv_str) #endif g_free(argv_str); // write data! #ifdef SAFEMODE if (fcntl(socket_fd, F_GETFL) < 0) return FALSE; #endif GIOChannel *channel = g_io_channel_unix_new(socket_fd); // main_channel is NULL, so that we don't need to launch clear_channel() if (!channel) return socket_fault(12, NULL, NULL, FALSE); // set the channel to read binary file if (g_io_channel_set_encoding(channel, NULL, &error) == G_IO_STATUS_ERROR) return socket_fault(9, error, channel, TRUE); g_io_channel_set_buffered (channel, FALSE); #ifdef SAFEMODE if ((arg_str == NULL) || (g_io_channel_write_chars(channel, arg_str, -1, &len, &error)==G_IO_STATUS_ERROR)) #else if (g_io_channel_write_chars(channel, arg_str, -1, &len, &error)==G_IO_STATUS_ERROR) #endif // main_channel is NULL, so that we don't need to launch clear_channel() return socket_fault(11, error, channel, TRUE); // flush writing datas if (g_io_channel_flush(channel, &error) == G_IO_STATUS_ERROR) // main_channel is NULL, so that we don't need to launch clear_channel() return socket_fault(13, error, channel, TRUE); g_free(arg_str); // So far so good. shutdown and clear channel! clear_channel(channel, TRUE); // FIXME: sleep for 1 sec to wait the socket server. any better idea? if (wait) sleep(1); return TRUE; }
// it will return TRUE if scucceed gchar *convert_socket_data_to_string(char *argv[]) { #ifdef DETAIL print_array("! convert_socket_data_to_string() argv", argv); #endif extern gchar **environ; gchar *locale_list = get_locale_list(); const gchar *VTE_CJK_WIDTH_STR = g_getenv("VTE_CJK_WIDTH"); // VTE_CJK_WIDTH can't = NULL if (VTE_CJK_WIDTH_STR == NULL) VTE_CJK_WIDTH_STR = ""; // g_debug("Got LOCALE = %s in send_socket...", get_encoding_from_locale(NULL)); gchar *encoding = get_encoding_from_locale(NULL); if (! compare_strings(encoding, "ANSI_X3.4-1968", TRUE)) { g_free(encoding); encoding = g_strdup("UTF-8"); } // g_debug("Got encoding = %s in send_socket...", encoding); gchar *lc_messages = g_strdup(get_default_lc_data(LC_MESSAGES)); gchar *environ_str = convert_array_to_string(environ, '\t'); // print_array("! send_socket() environ", environ); // g_debug("environ_str = %s", environ_str); gchar *argv_str = convert_array_to_string(argv, SEPARATE_CHAR); #ifdef SAFEMODE gboolean need_free_argv_str = TRUE; if (argv_str==NULL) argv_str=g_strdup(""); if (argv_str==NULL) { need_free_argv_str = FALSE; argv_str = ""; } #endif // g_debug("argv_str = %s", argv_str); // g_debug("SEND DATA: SOCKET_DATA_VERSION = %s", SOCKET_DATA_VERSION); // g_debug("SEND DATA: locale_list = %s", locale_list); // g_debug("SEND DATA: encoding = %s", encoding); // g_debug("SEND DATA: PWD = %s", PWD); // g_debug("SEND DATA: VTE_CJK_WIDTH_STR = %s", VTE_CJK_WIDTH_STR); // g_debug("SEND DATA: wmclass_name = %s", wmclass_name); // g_debug("SEND DATA: wmclass_class = %s", wmclass_class); // g_debug("SEND DATA: environ_str = %s", environ_str); // g_debug("SEND DATA: argv_str = %s", argv_str); // 0 1 2 3 4 5 6 7 8 9 10 11 // send data: SOCKET_DATA_VERSION SHELL LOCALE_LIST ENCODING LC_MESSAGES PWD HOME VTE_CJK_WIDTH_STR wmclass_name wmclass_class ENVIRON ARGV // 0 1 2 3 4 5 6 7 8 9 10 11 gchar *arg_str = g_strdup_printf("%s%c%s%c%s%c%s%c%s%c%s%c%s%c%s%c%s%c%s%c%s%c%s", SOCKET_DATA_VERSION, SEPARATE_CHAR, shell, SEPARATE_CHAR, locale_list, SEPARATE_CHAR, encoding, SEPARATE_CHAR, lc_messages, SEPARATE_CHAR, pwd, SEPARATE_CHAR, home, SEPARATE_CHAR, VTE_CJK_WIDTH_STR, SEPARATE_CHAR, wmclass_name, SEPARATE_CHAR, wmclass_class, SEPARATE_CHAR, environ_str, SEPARATE_CHAR, argv_str); // g_debug("arg_str = %s", arg_str); g_free(locale_list); g_free(encoding); g_free(lc_messages); g_free(environ_str); #ifdef SAFEMODE if (need_free_argv_str) #endif g_free(argv_str); return arg_str; }
int main( int argc, char *argv[]) #endif { // command_line_path = argv[0]; // g_debug ("argc = %d", argc); // print_array ("argv", argv); // i18n support. We need to support i18n under console, too. setlocale(LC_ALL, ""); bindtextdomain (BINARY, LOCALEDIR); bind_textdomain_codeset (BINARY, "UTF-8"); textdomain (BINARY); const gchar *user_config_dir = g_get_user_config_dir(); #ifdef OUT_OF_MEMORY # undef g_strdup_printf #endif if (user_config_dir) profile_dir = g_strdup_printf("%s/%s", user_config_dir, BINARY); #ifdef OUT_OF_MEMORY #define g_strdup_printf(...) NULL #endif // g_debug("profile_dir = %s", profile_dir); proc_exist = g_file_test("/proc", G_FILE_TEST_EXISTS); if (proc_exist) { gboolean proc_is_exist = FALSE; GDir *dir = g_dir_open ("/proc", 0, NULL); if (dir) { const gchar *entry = g_dir_read_name(dir); if (entry) proc_is_exist = TRUE; } g_dir_close(dir); // g_debug ("Got proc_is_exist = %d", proc_is_exist); proc_exist = proc_is_exist; } shell = g_getenv("SHELL"); if (shell==NULL) shell = ""; pwd = g_getenv("PWD"); // pwd = g_get_current_dir(); #ifdef SAFEMODE if (pwd==NULL) pwd = g_strdup(""); #endif // g_debug("Got $PWD = %s", pwd); home = g_getenv("HOME"); if (home==NULL) home = ""; // g_debug("Get $HOME = %s", home); // deal the command line options command_option(argc, argv); if (wmclass_name==NULL) wmclass_name = g_getenv("RESOURCE_NAME"); if (wmclass_name==NULL) wmclass_name = ""; if (wmclass_class==NULL) wmclass_class = ""; // g_debug("Got wmclass_name = %s, wmclass_class = %s", wmclass_name, wmclass_class); // init the gtk+2 engine #ifndef UNIT_TEST gtk_init(&argc, &argv); #endif // FIXME: we should get the single_process from profile. Current is command-line option only. if (single_process) { // init socket data if (init_socket_data()) { // trying to connect to an existing LilyTerm if (query_socket()) { // success, sent the argc/argv to socket then quit // g_debug("A LilyTerm socket server is exist already. exiting..."); if (send_socket(argc, argv, TRUE)) { g_free(profile_dir); exit (0); } } // no LilyTerm exist. create a socket server // g_debug("Creating a LilyTerm socket server..."); init_socket_server(); g_atexit((GVoidFunc)shutdown_socket_server); } } // start LilyTerm // empty_environ = g_strsplit("", " ", -1); extern gchar **environ; // print_array("main(): environ", environ); gchar *environ_str = convert_array_to_string(environ, '\t'); window_list = NULL; // g_debug("Got environ_str (in main.c) = %s", environ_str); selection_clipboard = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); selection_primary = gtk_clipboard_get(GDK_SELECTION_PRIMARY); system_locale_list = get_locale_list(); // g_debug("Got system_locale_list = %s", system_locale_list); init_LC_CTYPE = g_strdup(get_default_lc_data(LC_CTYPE)); // g_debug("Got init_LC_CTYPE = %s", init_LC_CTYPE); init_LC_MESSAGES = g_strdup(get_default_lc_data(LC_MESSAGES)); // g_debug("init_LC_MESSAGES = %s", init_LC_MESSAGES); init_encoding = (gchar *)get_encoding_from_locale(NULL); if (! compare_strings(init_encoding, "ANSI_X3.4-1968", TRUE)) { g_free(init_encoding); init_encoding = g_strdup("UTF-8"); } // g_debug("init_encoding = %s", init_encoding); SYSTEM_VTE_CJK_WIDTH_STR = g_getenv("VTE_CJK_WIDTH"); // g_debug ("Got SYSTEM_VTE_CJK_WIDTH_STR = %s", SYSTEM_VTE_CJK_WIDTH_STR); // FIXME: signal(SIGCHLD, SIG_IGN); // The first window of LilyTerm // g_debug("Got original encoding = %s", get_encoding_from_locale(NULL)); //GtkNotebook *new_window(int argc, // char *argv[], // gchar *shell, // gchar *environment, // gchar *locale_list, // gchar *PWD, // gchar *HOME, // gchar *VTE_CJK_WIDTH_STR, // gboolean VTE_CJK_WIDTH_STR_overwrite_profile, // gchar *wmclass_name, // gchar *wmclass_class, // gchar *user_environ, // gchar *encoding, // gboolean encoding_overwrite_profile, // gchar *lc_messages, // struct Window *win_data_orig, // struct Page *page_data_orig) if ((new_window(argc, argv, (gchar *) shell, environ_str, system_locale_list, (gchar *) pwd, (gchar *) home, SYSTEM_VTE_CJK_WIDTH_STR, FALSE, wmclass_name, wmclass_class, NULL, init_encoding, FALSE, init_LC_MESSAGES, NULL, NULL)) || window_list) { // The argv of "main" LilyTerm can't be free. // Set it to NULL here to avoid double_free(). argv=NULL; // g_debug("gtk_main_level = %d", gtk_main_level()); if (! gtk_main_level()) gtk_main(); } #ifdef DETAIL else { // g_debug("Got window_list = %p", window_list); // GList *win_list = window_list; // gint i=0; // // while (win_list) // { // g_debug("Got %d win_data = %p", ++i, win_list->data); // win_list = win_list->next; // } g_debug("??? The creation of first window is FAIL!!!"); } #endif extern struct KeyValue system_keys[KEYS]; gint i; // g_debug("Clear function key data!!"); for (i=KEY_SWITCH_TO_TAB_1; i<=KEY_SWITCH_TO_TAB_12; i++) { g_free(system_keys[i].name); g_free(system_keys[i].topic); g_free(system_keys[i].comment); g_free(system_keys[i].translation); #ifdef UNIT_TEST system_keys[i].name = NULL; system_keys[i].topic = NULL; system_keys[i].comment = NULL; system_keys[i].translation = NULL; #endif } // g_free(pwd); // g_strfreev(empty_environ); g_free(environ_str); g_free(init_encoding); g_free(system_locale_list); g_free(profile_dir); g_free(restricted_locale_message); g_list_free(window_list); g_free(init_LC_CTYPE); g_free(init_LC_MESSAGES); #ifdef UNIT_TEST // empty_environ = NULL; environ_str = NULL; init_encoding = NULL; system_locale_list = NULL; profile_dir = NULL; restricted_locale_message = NULL; window_list = NULL; init_LC_CTYPE = NULL; init_LC_MESSAGES = NULL; #endif return 0; }