static int autodetect_object_types(const char *object, int *types_out) { int ret; int is_btrfs_object; int types = 0; struct stat st; is_btrfs_object = check_btrfs_object(object); ret = lstat(object, &st); if (ret < 0) { ret = -errno; goto out; } if (is_btrfs_object) { types |= prop_object_inode; if (st.st_ino == BTRFS_FIRST_FREE_OBJECTID) types |= prop_object_subvol; ret = check_is_root(object); if (ret < 0) goto out; if (!ret) types |= prop_object_root; } if (S_ISBLK(st.st_mode)) types |= prop_object_dev; ret = 0; *types_out = types; out: return ret; }
gboolean monitor_cmdline(struct Page *page_data) { #ifdef FULL g_debug("! Launch monitor_cmdline() with page_data = %p", page_data); #endif #ifdef DEFENSIVE if ((page_data==NULL) || (page_data->lost_focus==NULL) || (page_data->keep_vte_size==NULL) || (page_data->current_vte==NULL) || (page_data->window_title_tpgid==NULL)) return FALSE; #endif if (page_data->pid<1) return FALSE; gboolean lost_focus = *(page_data->lost_focus); // g_debug("Get page_data->keep_vte_size = %d in monitor_cmdline()", *(page_data->keep_vte_size)); // g_debug ("\nvte_terminal_get_status_line = %s," // "vte_terminal_get_icon_title = %s,\n" // "vte_terminal_get_window_title = %s\n", // vte_terminal_get_status_line(VTE_TERMINAL(page_data->vte)), // vte_terminal_get_icon_title(VTE_TERMINAL(page_data->vte)), // vte_terminal_get_window_title(VTE_TERMINAL(page_data->vte))); // The pagename won't be updated if LilyTerm is not on focus or when resizing. // But it will still update the window title. // 0xfe = 11,111,110 if ((*(page_data->keep_vte_size)&0xfffc) || (lost_focus && (*(page_data->current_vte) != (page_data->vte))) || page_data->custom_page_name || dialog_activated) return TRUE; // if we should call get_and_update_page_name or not gboolean page_name_changed = FALSE; // backup page_data datas gint page_update_method = page_data->page_update_method; page_data->page_update_method = PAGE_METHOD_AUTOMATIC; // g_debug("INIT: lost_focus = %d", lost_focus); // g_debug("INIT: page_data->window_title_updated = %d", page_data->window_title_updated); if (lost_focus) page_name_changed = check_cmdline(page_data, *(page_data->window_title_tpgid)); else { page_name_changed = check_cmdline(page_data, page_data->displayed_tpgid); if ((page_name_changed) && page_data->check_root_privileges) page_data->is_root = check_is_root(page_data->current_tpgid); } // g_debug("lost_focus = %d", lost_focus); // g_debug("page_data->window_title_updated = %d", page_data->window_title_updated); if (check_window_title(page_data, lost_focus)) page_name_changed = TRUE; gchar *old_pwd; if (lost_focus) old_pwd = page_data->window_title_pwd; else old_pwd = page_data->pwd; gchar *new_pwd = get_tab_name_with_current_dir(page_data->current_tpgid); if (check_pwd(page_data, old_pwd, new_pwd, page_update_method)) { page_name_changed = TRUE; if (lost_focus) page_data->window_title_pwd = new_pwd; else page_data->pwd = new_pwd; new_pwd = old_pwd; } // g_debug("check_tpgid = %d, and current_tpgid = %d", *check_tpgid, page_data->current_tpgid); // only update the page name when tpgid is updated. // g_debug("Final: page_data->page_update_method = %d", page_data->page_update_method); if (page_name_changed) { // g_debug("!!! Update the page name for page_no %d", page_data->page_no); page_data->is_bold = page_data->bold_action_page_name; page_data->should_be_bold = TRUE; // g_debug("page_data->is_bold = %d for page_data %p", page_data->is_bold, page_data); // g_debug("Launch get_and_update_page_name() in monitor_cmdline()"); if (( ! get_and_update_page_name(page_data, *(page_data->lost_focus))) && (! lost_focus)) { // if update "tab title" fault. upate window title will never fault. // g_debug("!! Tab name is NOT changed to '%s'", page_data->pwd); // exchange old_pwd and new_pwd again! new_pwd = page_data->pwd; page_data->pwd = old_pwd; // g_debug("Restore page_data->pwd to %s", page_data->pwd); } } else { page_data->page_update_method = page_update_method; // g_debug("Restore page_data->page_update_method to %d!!!", page_data->page_update_method); } g_free(new_pwd); return TRUE; }
void apply_new_win_data_to_page (struct Window *win_data_orig, struct Window *win_data, struct Page *page_data) { #ifdef DETAIL g_debug("! Launch apply_new_win_data_to_page() with win_data_orig = %p, win_data = %p, page_data = %p", win_data_orig, win_data, page_data); #endif #ifdef SAFEMODE if ((win_data_orig==NULL) || (win_data==NULL) || (page_data==NULL) || (page_data->vte==NULL)) return; #endif // if (win_data_orig->use_rgba != win_data->use_rgba) // init_rgba(win_data); #ifdef ENABLE_RGBA set_window_opacity (NULL, 0, win_data->window_opacity, win_data); #endif init_monitor_cmdline_datas(win_data, page_data); if (win_data_orig->enable_hyperlink != win_data->enable_hyperlink) set_hyprelink(win_data, page_data); // ---- the color used in vte ---- // gboolean update_color = FALSE; if (compare_color(&(win_data_orig->cursor_color), &(win_data->cursor_color)) || (win_data_orig->have_custom_color != win_data->have_custom_color) || (win_data_orig->use_custom_theme != win_data->use_custom_theme) || (win_data_orig->color_brightness != win_data->color_brightness)) update_color = TRUE; gint i; if (! update_color && (win_data->use_custom_theme)) { for (i=0; i<COLOR; i++) if (compare_color(&(win_data_orig->color[i]), &(win_data->color[i]))) update_color = TRUE; } if (update_color) set_vte_color(page_data->vte, use_default_vte_theme(win_data), win_data->cursor_color, win_data->color, FALSE); // ---- tabs on notebook ---- // if (win_data_orig->tabs_bar_position != win_data->tabs_bar_position) { if (win_data->tabs_bar_position) gtk_notebook_set_tab_pos(GTK_NOTEBOOK(win_data->notebook), GTK_POS_BOTTOM); else gtk_notebook_set_tab_pos(GTK_NOTEBOOK(win_data->notebook), GTK_POS_TOP); } // the fill_tabs_bar may not always work, so we should call set_fill_tabs_bar() every time. // if (win_data_orig->fill_tabs_bar != win_data->fill_tabs_bar) set_fill_tabs_bar(GTK_NOTEBOOK(win_data->notebook), win_data->fill_tabs_bar, page_data); if (win_data_orig->page_width != win_data->page_width) set_page_width(win_data, page_data); // g_debug("ORI: %d", win_data_orig->page_shows_current_cmdline || // win_data_orig->page_shows_current_dir || // win_data_orig->page_shows_window_title); // g_debug("NEW: %d", win_data->page_shows_current_cmdline || // win_data->page_shows_current_dir || // win_data->page_shows_window_title); if ((proc_exist) && ((page_data->page_update_method != PAGE_METHOD_NORMAL) || (win_data->page_shows_current_cmdline || win_data->page_shows_current_dir || win_data->page_shows_window_title))) { // FIXME: Is it necessary? if (page_data->page_update_method == PAGE_METHOD_WINDOW_TITLE) page_data->window_title_updated = 1; page_data->page_update_method = PAGE_METHOD_REFRESH; } // g_debug("page_data->page_update_method = %d", page_data->page_update_method); if (win_data->page_shows_window_title != win_data_orig->page_shows_window_title) add_remove_window_title_changed_signal(page_data); if (win_data->check_root_privileges != win_data_orig->check_root_privileges) { if (win_data->check_root_privileges) page_data->is_root = check_is_root(page_data->displayed_tpgid); else page_data->is_root = FALSE; // g_debug("apply_new_win_data_to_page(): page_data->is_root = %d", page_data->is_root); } if (page_data->is_bold) { if (page_data->vte == win_data->current_vte) { if (win_data->bold_current_page_name == FALSE) { page_data->is_bold = page_data->should_be_bold; if (win_data->bold_action_page_name == FALSE) page_data->is_bold = FALSE; } } else { if (win_data->bold_action_page_name == FALSE) page_data->is_bold = FALSE; } } else { if (page_data->vte == win_data->current_vte) page_data->is_bold = win_data->bold_current_page_name; else if (win_data->bold_action_page_name == TRUE) page_data->is_bold = page_data->should_be_bold; } if ((win_data_orig->window_title_shows_current_page != win_data->window_title_shows_current_page) || (win_data_orig->window_title_append_package_name != win_data->window_title_append_package_name)) { check_and_update_window_title(win_data, page_data->custom_window_title, page_data->page_no+1, page_data->custom_page_name, page_data->page_name); // g_debug("FINAL: New window title = %s", gtk_window_get_title(GTK_WINDOW(win_data->window))); } get_and_update_page_name(page_data, FALSE); if ((win_data_orig->show_close_button_on_tab != win_data->show_close_button_on_tab) || (win_data_orig->show_close_button_on_all_tabs != win_data->show_close_button_on_all_tabs)) show_close_button_on_tab(win_data, page_data); // ---- font ---- // if (win_data_orig->font_anti_alias != win_data->font_anti_alias) vte_terminal_set_font_from_string_full (VTE_TERMINAL(page_data->vte), page_data->font_name, win_data->font_anti_alias); // ---- other settings for init a vte ---- // if (compare_strings(win_data_orig->word_chars, win_data->word_chars, TRUE)) vte_terminal_set_word_chars(VTE_TERMINAL(page_data->vte), win_data->word_chars); if (win_data_orig->show_scroll_bar != win_data->show_scroll_bar) // hide_scroll_bar(win_data, page_data); show_and_hide_scroll_bar(page_data, check_show_or_hide_scroll_bar(win_data)); if (win_data_orig->scroll_bar_position != win_data->scroll_bar_position) { g_object_ref(page_data->vte); gtk_container_remove (GTK_CONTAINER(page_data->hbox), page_data->vte); g_object_ref(page_data->scroll_bar); gtk_container_remove (GTK_CONTAINER(page_data->hbox), page_data->scroll_bar); pack_vte_and_scroll_bar_to_hbox(win_data, page_data); g_object_unref(page_data->vte); g_object_unref(page_data->scroll_bar); } if (compare_color(&(win_data_orig->color[0]), &(win_data->color[0])) || (win_data_orig->transparent_background != win_data->transparent_background) || (win_data_orig->background_saturation != win_data->background_saturation) || (win_data_orig->scroll_background != win_data->scroll_background) || compare_strings (win_data_orig->background_image, win_data->background_image, TRUE)) set_background_saturation (NULL, 0, win_data->background_saturation, page_data->vte); if (win_data_orig->scrollback_lines != win_data->scrollback_lines) vte_terminal_set_scrollback_lines (VTE_TERMINAL(page_data->vte), win_data->scrollback_lines); if (win_data_orig->cursor_blinks != win_data->cursor_blinks) set_cursor_blink(win_data, page_data); if (win_data_orig->allow_bold_text != win_data->allow_bold_text) vte_terminal_set_allow_bold(VTE_TERMINAL(page_data->vte), win_data->allow_bold_text); if (win_data_orig->audible_bell != win_data->audible_bell) vte_terminal_set_audible_bell (VTE_TERMINAL(page_data->vte), win_data->audible_bell); if (win_data_orig->visible_bell != win_data->visible_bell) vte_terminal_set_visible_bell (VTE_TERMINAL(page_data->vte), win_data->visible_bell); #ifdef ENABLE_BEEP_SINGAL if (win_data_orig->urgent_bell != win_data->urgent_bell) set_vte_urgent_bell(win_data, page_data); #endif if (win_data_orig->erase_binding != win_data->erase_binding) vte_terminal_set_backspace_binding (VTE_TERMINAL(page_data->vte), win_data->erase_binding); #ifdef ENABLE_CURSOR_SHAPE if (win_data_orig->cursor_shape != win_data->cursor_shape) vte_terminal_set_cursor_shape(VTE_TERMINAL(page_data->vte), win_data->cursor_shape); #endif if (compare_strings(win_data_orig->emulate_term, win_data->emulate_term, TRUE)) vte_terminal_set_emulation (VTE_TERMINAL(page_data->vte), win_data->emulate_term); }