void set_VTE_CJK_WIDTH_environ(gint VTE_CJK_WIDTH) { #ifdef DETAIL g_debug("! Launch set_VTE_CJK_WIDTH_environ() with VTE_CJK_WIDTH = %d", VTE_CJK_WIDTH); #endif // Set the VTE_CJK_WIDTH environment switch (VTE_CJK_WIDTH) { case 0: // Don't touch VTE_CJK_WIDTH break; //case 1: // // The VTE_CJK_WIDTH will be setted depend on the LC environ in newer libvte version. // unsetenv("VTE_CJK_WIDTH"); // break; case 1: // VTE_CJK_WIDTH=narrow only work for vte >= 0.16.14 setenv("VTE_CJK_WIDTH", "narrow", TRUE); break; case 2: setenv("VTE_CJK_WIDTH", "wide", TRUE); break; default: #ifdef FATAL print_switch_out_of_range_error_dialog("set_VTE_CJK_WIDTH_environ", "VTE_CJK_WIDTH", VTE_CJK_WIDTH); #endif break; } }
// get default locale from environ // The returned string CAN NOT be free()! gchar *get_default_LC_DATA(gint LC_TYPE) { #ifdef DETAIL g_debug("! Launch get_default_LC_DATA() with LC_TYPE= %d", LC_TYPE); #endif char *LC_DATA; switch (LC_TYPE) { case LC_CTYPE: LC_DATA = (char*)g_getenv("LC_CTYPE"); break; case LC_MESSAGES: LC_DATA = (char*)g_getenv("LC_MESSAGES"); break; default: #ifdef FATAL print_switch_out_of_range_error_dialog("get_default_LC_DATA", "LC_TYPE", LC_TYPE); #endif return ""; } char *LC_ALL = (char*)g_getenv("LC_ALL"); char *LANG = (char*)g_getenv("LANG"); if ( (!LC_DATA) && LANG) LC_DATA = LANG; if (LC_ALL) LC_DATA = LC_ALL; // g_debug("Get LC_DATA = %s", LC_DATA); if (LC_DATA) return LC_DATA; else return ""; }
gchar *get_VTE_CJK_WIDTH_str(gint VTE_CJK_WIDTH) { #ifdef DETAIL g_debug("! Launch get_VTE_CJK_WIDTH_str() with VTE_CJK_WIDTH = %d", VTE_CJK_WIDTH); #endif switch (VTE_CJK_WIDTH) { case 0: return NULL; case 1: return "narrow"; case 2: return "wide"; default: #ifdef FATAL print_switch_out_of_range_error_dialog("get_VTE_CJK_WIDTH_str", "VTE_CJK_WIDTH", VTE_CJK_WIDTH); #endif break; } return NULL; }
// get default locale from environ // The returned string CAN NOT be free()! const gchar *get_default_lc_data(gint lc_type) { #ifdef DETAIL g_debug("! Launch get_default_lc_data() with lc_type= %d", lc_type); #endif const char *lc_data; switch (lc_type) { case LC_CTYPE: lc_data = g_getenv("LC_CTYPE"); break; case LC_MESSAGES: lc_data = g_getenv("LC_MESSAGES"); break; case LANGUAGE: return g_getenv("LANGUAGE"); default: #ifdef FATAL print_switch_out_of_range_error_dialog("get_default_lc_data", "lc_type", lc_type); #endif return ""; } const char *lc_all = g_getenv("LC_ALL"); const char *lang = g_getenv("LANG"); if ( (!lc_data) && lang) lc_data = lang; if (lc_all) lc_data = lc_all; // g_debug("Get lc_data = %s", lc_data); if (lc_data) return lc_data; else return ""; }
void reset_vte_size(GtkWidget *vte, gchar *new_font_name, Font_Reset_Type type) { #ifdef DETAIL g_debug("! Launch reset_vte_size() with vte = %p, new_font_name = %s, type = %d", vte, new_font_name, type); #endif #ifdef SAFEMODE if ((vte==NULL) || (new_font_name==NULL)) return; #endif // type 0, RESET_CURRENT_TAB_FONT: change current page's font // type 1, RESET_ALL_TO_CURRENT_TAB: apply current column & row to every vte // type 2, RESET_ALL_TO_DEFAULT: apply default column & row to every vte // type 3, RESET_ALL_TO_SYSTEM: apply system column & row to every vte struct Page *page_data = (struct Page *)g_object_get_data(G_OBJECT(vte), "Page_Data"); #ifdef SAFEMODE if (page_data==NULL) return; #endif struct Window *win_data = (struct Window *)g_object_get_data(G_OBJECT(page_data->window), "Win_Data"); #ifdef SAFEMODE if (win_data==NULL) return; #endif // g_debug("Get win_data = %d when reset vte size!", win_data); switch (type) { case RESET_CURRENT_TAB_FONT: // We need to apply a new font to a single vte. // so that we should insure that this won't change the size of window. // g_debug("Trying to apply font %s to vte", current_font_name); vte_terminal_set_font_from_string_full( VTE_TERMINAL(vte), new_font_name, win_data->font_anti_alias); // g_debug("reset_vte_size(): call window_resizable() with run_once = %d", win_data->update_hints); // g_debug("reset_vte_size(): launch update_window_hint()!"); update_window_hint(win_data, page_data); break; case RESET_ALL_TO_CURRENT_TAB: // increase/decrease window size & font size for every vte // g_debug("Trying to apply font %s to every vte", current_font_name); // struct Page *page_data = (struct Page *)g_object_get_data(G_OBJECT(current_vte), "Page_Data"); apply_font_to_every_vte( page_data->window, new_font_name, vte_terminal_get_column_count(VTE_TERMINAL(win_data->current_vte)), vte_terminal_get_row_count(VTE_TERMINAL(win_data->current_vte))); break; case RESET_ALL_TO_DEFAULT: // reset window size & font size for every vte // g_debug("Trying to apply font %s to every vte", current_font_name); apply_font_to_every_vte(page_data->window, new_font_name, win_data->default_column, win_data->default_row); break; case RESET_ALL_TO_SYSTEM: // reset window size & font size for every vte // g_debug("Trying to apply font %s to every vte", current_font_name); apply_font_to_every_vte(page_data->window, new_font_name, SYSTEM_COLUMN, SYSTEM_ROW); break; default: #ifdef FATAL print_switch_out_of_range_error_dialog("reset_vte_size", "type", type); #endif break; } }
void set_vte_font(GtkWidget *widget, Font_Set_Type type) { #ifdef DETAIL g_debug("! Launch set_vte_font() with type = %d", type); #endif #ifdef SAFEMODE if (menu_active_window==NULL) return; #endif // GtkWidget *vte = current_vte; struct Window *win_data = (struct Window *)g_object_get_data(G_OBJECT(menu_active_window), "Win_Data"); #ifdef SAFEMODE if (win_data==NULL) return; #endif GtkWidget *vte = win_data->current_vte; gchar *new_font_name = NULL; // type 0, FONT_RESET: reset current page's font size // type 1, FONT_INCREASE: increase current page's font size // type 2, FONT_DECREASE: decrease current page's font size // type 3, FONT_ZOOM_OUT: increase window size & font size for every vte // type 4, FONT_ZOOM_IN: decrease window size & font size for every vte // type 5, FONT_RESET_DEFAULT: reset window size & font size to default for every vte // type 6, FONT_RESET_SYSTEM: reset window size & font size to system for every vte // type 7, FONT_SET_TO_SELECTED: change every vte to the selected font name switch (type) { case FONT_RESET: // 0 // reset current page's font size new_font_name = get_resize_font(vte, FONT_NAME_RESTORE); reset_vte_size(vte, new_font_name, RESET_CURRENT_TAB_FONT); break; case FONT_INCREASE: // 1 // increase current page's font size new_font_name = get_resize_font(vte, FONT_NAME_INCREASE); reset_vte_size(vte, new_font_name, RESET_CURRENT_TAB_FONT); break; case FONT_DECREASE: // 2 // decrease current page's font size new_font_name = get_resize_font(vte, FONT_NAME_DECREASE); reset_vte_size(vte, new_font_name, RESET_CURRENT_TAB_FONT); break; case FONT_ZOOM_OUT: // 3 // increase window size & font size for every vte new_font_name = get_resize_font(vte, FONT_NAME_ZOOM_OUT); reset_vte_size(vte, new_font_name, RESET_ALL_TO_CURRENT_TAB); break; case FONT_ZOOM_IN: // 4 // decrease window size & font size for every vte new_font_name = get_resize_font(vte, FONT_NAME_ZOOM_IN); reset_vte_size(vte, new_font_name, RESET_ALL_TO_CURRENT_TAB); break; case FONT_RESET_DEFAULT: // 5 // reset window size & font size to default for every vte new_font_name = get_resize_font(vte, FONT_NAME_DEFAULT); reset_vte_size(vte, new_font_name, RESET_ALL_TO_DEFAULT); break; case FONT_RESET_SYSTEM: // 6 // reset window size & font size to system for every vte new_font_name = get_resize_font(vte, FONT_NAME_SYSTEM); reset_vte_size(vte, new_font_name, RESET_ALL_TO_SYSTEM); break; case FONT_SET_TO_SELECTED: // 7 // change every vte to the selected font name new_font_name = get_resize_font(vte, FONT_NAME_UPDATE); reset_vte_size(vte, new_font_name, RESET_ALL_TO_CURRENT_TAB); break; default: #ifdef FATAL print_switch_out_of_range_error_dialog("set_vte_font", "type", type); #endif break; } g_free(new_font_name); }
// it will update the new_font_name and page_data->font_name gchar *get_resize_font(GtkWidget *vte, Font_Name_Type type) { #ifdef DETAIL g_debug("! Launch get_resize_font() for vte %p with type %d", vte, type); #endif #ifdef SAFEMODE if (vte==NULL) return NULL; #endif // we must insure that vte!=NULL struct Page *page_data = (struct Page *)g_object_get_data(G_OBJECT(vte), "Page_Data"); #ifdef SAFEMODE if (page_data==NULL) return NULL; #endif struct Window *win_data = (struct Window *)g_object_get_data(G_OBJECT(page_data->window), "Win_Data"); #ifdef SAFEMODE if (win_data==NULL) return NULL; #endif // g_debug("Get win_data = %d when get resize font!", win_data); // type 0, FONT_NAME_DEFAULT: restore font to default_font_name // type 1, FONT_NAME_SYSTEM: restore font to system_font_name // type 2, FONT_NAME_RESTORE: restore font to restore_font_name // type 3, FONT_NAME_UPDATE: do nothing but only update new_font_name // type 4, FONT_NAME_ZOOM_OUT: increase window by *1.1 or +1 // type 5, FONT_NAME_ZOOM_IN: decrease window by /1.1 or -1 // type 6, FONT_NAME_INCREASE: increase font by *1.1 or +1 // type 7, FONT_NAME_DECREASE: decrease font by /1.1 or -1 if (win_data->restore_font_name == NULL) { // win_data->restore_font_name = g_strdup(page_data->font_name); win_data->restore_font_name = g_strdup(win_data->default_font_name); // g_debug("Restore the font to %s!", win_data->restore_font_name); if (type==FONT_NAME_RESTORE) return g_strdup(page_data->font_name); } switch (type) { case FONT_NAME_DEFAULT: case FONT_NAME_SYSTEM: case FONT_NAME_RESTORE: g_free(page_data->font_name); break; default: break; } // we use font_size to save current font size // font_size = (the size in font_name) * PANGO_SCALE // if font_size == 0 -> use the data in font_name switch (type) { case FONT_NAME_DEFAULT: // restore font to default_font_name page_data->font_name = g_strdup(win_data->default_font_name); page_data->font_size = 0; break; case FONT_NAME_SYSTEM: // restore font to default_font_name page_data->font_name = g_strdup(SYSTEM_FONT_NAME); page_data->font_size = 0; break; case FONT_NAME_RESTORE: // restore font to default_font_name page_data->font_name = g_strdup(win_data->restore_font_name); page_data->font_size = 0; break; case FONT_NAME_UPDATE: break; case FONT_NAME_ZOOM_OUT: case FONT_NAME_ZOOM_IN: case FONT_NAME_INCREASE: case FONT_NAME_DECREASE: { #ifdef SAFEMODE if (page_data->font_name==NULL) break; #endif gint oldfontsize=0, fontsize=0; // g_debug("old font name: %s", page_data->font_name); PangoFontDescription *font_desc = pango_font_description_from_string( page_data->font_name); // increase/decrease font oldfontsize = (pango_font_description_get_size(font_desc)/PANGO_SCALE); if (page_data->font_size==0) page_data->font_size = pango_font_description_get_size(font_desc); switch (type) { // g_debug("window_resize_ratio = %f", win_data->window_resize_ratio); case FONT_NAME_ZOOM_OUT: if (win_data->window_resize_ratio) page_data->font_size = page_data->font_size * win_data->window_resize_ratio + 0.5; else page_data->font_size = page_data->font_size + PANGO_SCALE; break; case FONT_NAME_ZOOM_IN: if (win_data->window_resize_ratio) page_data->font_size = page_data->font_size / win_data->window_resize_ratio + 0.5; else page_data->font_size = page_data->font_size - PANGO_SCALE; break; case FONT_NAME_INCREASE: if (win_data->font_resize_ratio) page_data->font_size = page_data->font_size * win_data->font_resize_ratio + 0.5; else page_data->font_size = page_data->font_size + PANGO_SCALE; break; case FONT_NAME_DECREASE: if (win_data->font_resize_ratio) page_data->font_size = page_data->font_size / win_data->font_resize_ratio + 0.5; else page_data->font_size = page_data->font_size - PANGO_SCALE; break; default: break; } // g_debug("font_size = %d", page_data->font_size); fontsize = (page_data->font_size)/PANGO_SCALE; // to avoid the fontsize is unchanged or = 0 switch (type) { case FONT_NAME_ZOOM_OUT: case FONT_NAME_INCREASE: if (oldfontsize==fontsize) fontsize++; break; case FONT_NAME_ZOOM_IN: case FONT_NAME_DECREASE: if (oldfontsize==fontsize) fontsize--; if (fontsize<1) fontsize=1; break; default: break; } // g_debug("Trying to change the font size to %d.", fontsize); pango_font_description_set_size(font_desc, fontsize*PANGO_SCALE); g_free(page_data->font_name); page_data->font_name = pango_font_description_to_string(font_desc); pango_font_description_free(font_desc); break; default: #ifdef FATAL print_switch_out_of_range_error_dialog("get_resize_font", "type", type); #endif return NULL; } } // g_debug("new font name: %s", page_data->font_name); switch (type) { case FONT_NAME_DEFAULT: case FONT_NAME_SYSTEM: case FONT_NAME_UPDATE: case FONT_NAME_ZOOM_OUT: case FONT_NAME_ZOOM_IN: // if not using <Ctrl><+ - enter> to change the font size. g_free(win_data->restore_font_name); win_data->restore_font_name = g_strdup(page_data->font_name); break; case FONT_NAME_INCREASE: case FONT_NAME_DECREASE: // Check if we can specify page_data->font_size = 0 if ( ! compare_strings(page_data->font_name, win_data->restore_font_name, TRUE)) { page_data->font_size = 0; // g_debug("The font is restored to win_data->restore_font_name"); } break; default: break; } return g_strdup(page_data->font_name); }
// it will always return FALSE gboolean socket_fault(int type, GError *error, GIOChannel *channel, gboolean unref) { #ifdef DETAIL g_debug("! Launch socket_fault() to show the error message !"); #endif #ifdef UNIT_TEST # define G_WARNING g_message #else # define G_WARNING g_warning #endif switch (type) { case 1: G_WARNING("Error when create %s socket(%s): %s", PACKAGE, address.sun_path, g_strerror (errno)); break; case 2: g_message("Can NOT connect to a existing %s socket!", PACKAGE); break; case 3: G_WARNING("Can NOT bind on the socket!"); break; case 4: G_WARNING("Can NOT listen on the socket!"); break; case 5: G_WARNING("Can not watch on the socket!"); break; case 6: G_WARNING("Error when accepting client request via socket!"); break; case 7: G_WARNING("Error when reading the data client sent via socket!"); break; case 8: G_WARNING("Error when running fcntl command on socket!"); break; case 9: #ifdef SAFEMODE if (error) #endif G_WARNING("Error when setting the encoding of channel: %s", error->message); break; case 10: #ifdef SAFEMODE if (error) #endif G_WARNING("Error when shutdowning a channel: %s", error->message); break; case 11: #ifdef SAFEMODE if (error) #endif G_WARNING("Error when writing data to the channel: %s", error->message); break; case 12: G_WARNING("Can NOT create a channel for this socket"); break; case 13: #ifdef SAFEMODE if (error) #endif G_WARNING("Error when flushing the write buffer for the channel: %s", error->message); break; case 14: G_WARNING("Got a NULL string from the socket!"); break; default: #ifdef FATAL print_switch_out_of_range_error_dialog("socket_fault", "type", type); #endif break; } if (error) g_clear_error (&error); clear_channel(channel, unref); #ifdef UNIT_TEST # undef G_WARNING #endif return FALSE; }
// it will update the text in label ,page_name, and the title of window // return FALSE if update the label (and page_name) fault. // updating the title of window will never fault. gboolean get_and_update_page_name(struct Page *page_data, gboolean lost_focus) { #ifdef DETAIL g_debug("! Launch get_and_update_page_name() with page_data = %p, lost_focus = %d", page_data, lost_focus); #endif #ifdef DEFENSIVE if ((page_data==NULL) || (page_data->window==NULL)) return FALSE; #endif struct Window *win_data = (struct Window *)g_object_get_data(G_OBJECT(page_data->window), "Win_Data"); // g_debug("Get win_data = %p (page_data->window = %p) when update tab name!", win_data, page_data->window); #ifdef DEFENSIVE if (win_data==NULL) return FALSE; #endif // page_color should not be free(). gchar *page_name = NULL, *page_color = NULL; // g_debug("Get pid=%d, tpgid=%d", page_data->pid, page_data->current_tpgid); // g_debug("win_data->page_shows_window_title = %d", win_data->page_shows_window_title); // g_debug("page_data->window_title_updated = %d", page_data->window_title_updated); // g_debug("lost_focus = %d", lost_focus); // g_debug("page_data->page_update_method = %d", page_data->page_update_method); switch (page_data->page_update_method) { case PAGE_METHOD_AUTOMATIC: case PAGE_METHOD_REFRESH: break; case PAGE_METHOD_WINDOW_TITLE: update_page_name_wintitle(&page_name, &page_color, win_data, page_data); break; case PAGE_METHOD_CMDLINE: update_page_name_cmdline(&page_name, &page_color, win_data, page_data); break; case PAGE_METHOD_PWD: update_page_name_pwd(&page_name, &page_color, win_data, page_data, lost_focus); break; case PAGE_METHOD_NORMAL: update_page_name_normal(&page_name, &page_color, win_data, page_data); break; default: #ifdef FATAL print_switch_out_of_range_error_dialog("get_and_update_page_name", "page_data->page_update_method", page_data->page_update_method); #endif return FALSE; } if (page_name==NULL) { update_page_name_wintitle(&page_name, &page_color, win_data, page_data); update_page_name_cmdline(&page_name, &page_color, win_data, page_data); update_page_name_pwd(&page_name, &page_color, win_data, page_data, lost_focus); update_page_name_normal(&page_name, &page_color, win_data, page_data); } #ifdef DEFENSIVE // if we can NOT got any page_name... it should not happen! if (page_name==NULL) return FALSE; #endif if (page_data->is_root) page_color = win_data->user_page_color[4]; // even though custom_page_name is setted, we still need to set the page_name for it. // therefore if we disable custom_page_name sometime, we still have the page_name for use. if (page_data->custom_page_name!=NULL) { page_color = win_data->user_page_color[3]; // g_debug("page_shows_custom_dir : page_name = %s, color = %s", page_name, page_color); } // g_debug("Final : page_name = %s, color = %s", page_name, page_color); if (win_data->use_color_page) page_data->tab_color = page_color; else // we Must clean the value for page_color here. for drag&drop tabs. page_data->tab_color = NULL; g_free(page_data->page_name); gchar *local_page_name = convert_str_to_utf8(page_name, page_data->encoding_str); #ifdef DEFENSIVE if (local_page_name == NULL) page_data->page_name = page_name; else { #endif g_free(page_name); page_data->page_name = local_page_name; #ifdef DEFENSIVE } #endif gboolean return_value = FALSE; // g_debug ("Launch update_page_name() in get_and_update_page_name()!!!"); if (update_page_name(page_data->window, page_data->vte, page_data->page_name, page_data->label_text, page_data->page_no+1, page_data->custom_page_name, page_color, page_data->is_root, page_data->is_bold, compare_strings(win_data->runtime_encoding, page_data->encoding_str, FALSE), page_data->encoding_str, page_data->custom_window_title, lost_focus)) { // g_debug("Update page_data->displayed_tpgid (%d) = page_data->current_tpgid (%d)", // page_data->displayed_tpgid, page_data->current_tpgid); if (! lost_focus) { page_data->displayed_tpgid = page_data->current_tpgid; g_free(page_data->window_title_pwd); page_data->window_title_pwd = g_strdup(page_data->pwd); } return_value = TRUE; } else { // update_page_name() is failed, but the pagename datas is updated already. // We set page_data->displayed_tpgid = -1 here to mark that the update_page_name() is failed. page_data->displayed_tpgid = -1; if (page_data->page_update_method == PAGE_METHOD_WINDOW_TITLE) page_data->window_title_updated = PAGE_METHOD_CMDLINE; } // update page_data->pwd or page_data->window_title_pwd, if it was not updated if (page_data->page_update_method == PAGE_METHOD_WINDOW_TITLE) { if (win_data->page_shows_current_cmdline) page_data->displayed_tpgid = page_data->current_tpgid; if (win_data->page_shows_current_dir) { g_free(page_data->pwd); page_data->pwd = get_tab_name_with_current_dir(page_data->current_tpgid); } } win_data->window_title_tpgid = page_data->current_tpgid; // g_debug("Final: page_data->displayed_tpgid = %d", page_data->displayed_tpgid); // g_debug("Final: page_data->window_title_tpgid = %d", *(page_data->window_title_tpgid)); // g_debug("(get_and_update_page_name): return_value = %d", return_value); return return_value; }