📄 fs.c
字号:
{ fs->label_is_data = TRUE; fs->restore_label = FALSE; fs->mouse_entered = TRUE; gkrellm_config_modified(); } x_fs_motion = ev->x; draw_fs_text_decal(fs, 1); gkrellm_draw_panel_layers(fs->panel); fs_in_motion = fs; x_moved = 0; gkrellm_hide_button(fs->drawer_button); return TRUE; }static gintcb_panel_motion(GtkWidget *widget, GdkEventButton *ev) { GdkModifierType state; GList *list; FSmon *fs; GkrellmDecal *d; PangoFontDescription *font_desc; gchar buf[128]; gint w, x_delta = 0; state = ev->state; if ( !fs_in_motion || !(state & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK)) || !fs_in_motion->label_is_data ) { fs_in_motion = NULL; return FALSE; } font_desc = gkrellm_meter_alt_textstyle(style_id)->font; d = fs_in_motion->text_decal; format_fs_data(fs_in_motion, data_format_locale, buf, sizeof(buf)); gkrellm_decal_scroll_text_get_size(d, &w, NULL); if (w > d->w) { x_delta = ev->x - x_fs_motion; x_fs_motion = ev->x; d->x_off += x_delta; if (d->x_off < -w) d->x_off = -w; if (d->x_off > d->w) d->x_off = d->w; x_scroll = d->w / 3 - d->x_off; for (list = fs_mon_list; list; list = list->next) { fs = (FSmon *) list->data; if (fs->label_is_data) { draw_fs_text_decal(fs, 1); gkrellm_draw_panel_layers(fs->panel); } } if (x_moved > 0) fs_in_motion->restore_label = FALSE; } if (x_moved == 0) force_fs_check = FORCE_REDRAW; /* Move krells out of the way */ x_moved += (x_delta > 0) ? x_delta : -x_delta; return FALSE; }static voidcb_fs_mount_button(GkrellmDecalbutton *button) { if (button) mount_command((FSmon *) button->data); }static voidcb_fs_eject_button(GkrellmDecalbutton *button, FSmon *fs) { if (button) eject_tray(fs); }static voidcb_fs_close_tray(GkrellmDecalbutton *button, FSmon *fs) { if (button) close_tray(fs); }static voidcreate_fs_monitor(GtkWidget *vbox, FSmon *fs, gint index, gint first_create) { GkrellmStyle *style; GkrellmMargin *m; GkrellmPanel *p; gint h, label_x_position, label_y_off; if (first_create) fs->panel = gkrellm_panel_new0(); p = fs->panel; fs->idx = index; ++n_fs_monitors; fs->krell_factor = 1; style = gkrellm_meter_style(style_id); gkrellm_panel_label_get_position(style, &label_x_position, &label_y_off); m = gkrellm_get_style_margins(style); fs->text_decal = gkrellm_create_decal_text(p, "Afp0", gkrellm_meter_textstyle(style_id), style, -1, (label_y_off > 0) ? label_y_off : -1, -1); fs->mount_decal = gkrellm_create_decal_pixmap(p, gkrellm_decal_misc_pixmap(), gkrellm_decal_misc_mask(), N_MISC_DECALS, style, -1, -1); fs->mount_decal->x = gkrellm_chart_width() - fs->mount_decal->w - m->right; if (fs->ejectable) { fs->eject_decal = gkrellm_create_decal_pixmap(p, gkrellm_decal_misc_pixmap(), gkrellm_decal_misc_mask(), N_MISC_DECALS, style, -1, -1); if (mounting_supported) { x_eject_button_closed = fs->mount_decal->x; x_eject_button_open = fs->mount_decal->x - fs->eject_decal->w + 1; } else { x_eject_button_closed = gkrellm_chart_width() - 2; x_eject_button_open = x_eject_button_closed - fs->eject_decal->w; } fs->x_eject_button_target = x_eject_button_closed; fs->eject_decal->x = x_eject_button_closed; } /* Usable width to determine various scrolling parameters. */ text_decal_width = fs->mount_decal->x - fs->text_decal->x; fs->krell = gkrellm_create_krell(p, gkrellm_krell_meter_piximage(style_id), style); gkrellm_monotonic_krell_values(fs->krell, FALSE); gkrellm_panel_configure(p, NULL, style); gkrellm_panel_create(vbox, mon_fs, p); fs->md_button = gkrellm_make_decal_button(p, fs->mount_decal, cb_fs_mount_button, fs, D_MISC_FS_UMOUNTED, D_MISC_FS_PRESSED); if (index == 0 && have_secondary_panels) { if ((h = p->h / 2) > 7) h = 7; fs->drawer_button = gkrellm_make_scaled_button(p, NULL, cb_drawer_button, fs, TRUE, TRUE, 0, 0, 0, /* NULL image => builtin depth & indices */ (gkrellm_chart_width() - 20) / 2, 0, 20, h); /* Make it appear under the label decal */ gkrellm_remove_decal(p, fs->drawer_button->decal); gkrellm_insert_decal_nth(p, fs->drawer_button->decal, 0); } if (fs->eject_decal) { fs->eject_button = gkrellm_make_decal_button(p, fs->eject_decal, cb_fs_eject_button, fs, D_MISC_BUTTON_OUT, D_MISC_BUTTON_IN); gkrellm_hide_button(fs->eject_button); if (close_cdrom_command || close_cdrom_func) gkrellm_decal_button_right_connect(fs->eject_button, cb_fs_close_tray, fs); } if (first_create) { g_signal_connect(G_OBJECT(p->drawing_area), "expose_event", G_CALLBACK(fs_expose_event), NULL); g_signal_connect(G_OBJECT(p->drawing_area),"button_press_event", G_CALLBACK(cb_panel_press), fs); g_signal_connect(G_OBJECT(p->drawing_area),"button_release_event", G_CALLBACK(cb_panel_release), fs); g_signal_connect(G_OBJECT(p->drawing_area),"scroll_event", G_CALLBACK(cb_panel_scroll), fs); g_signal_connect(G_OBJECT(p->drawing_area),"motion_notify_event", G_CALLBACK(cb_panel_motion), NULL); g_signal_connect(G_OBJECT(p->drawing_area), "enter_notify_event", G_CALLBACK(cb_panel_enter), fs); g_signal_connect(G_OBJECT(p->drawing_area), "leave_notify_event", G_CALLBACK(cb_panel_leave), fs); if ( !secondary_monitors_shown && fs->secondary && (!fs_is_mounted(fs) || !fs->show_if_mounted)) gkrellm_panel_hide(fs->panel); } draw_fs_text_decal(fs, 0); force_fs_check = FORCE_UPDATE; if (fs->launch_mount.command == NULL) fs->launch_mount.command = g_strdup(""); if (fs->launch_umount.command == NULL) fs->launch_umount.command = g_strdup(""); }static voidfree_fsmon_strings(FSmon *fs) { g_free(fs->label); g_free(fs->label_shadow); g_free(fs->mount.directory); g_free(fs->eject_device); g_free(fs->launch_mount.command); g_free(fs->launch_umount.command); }static voiddestroy_fs_monitor(FSmon *fs) { gkrellm_reset_alert(fs->alert); free_fsmon_strings(fs); gkrellm_panel_destroy(fs->panel); g_free(fs); --n_fs_monitors; }static voidcreate_fs(GtkWidget *vbox, gint first_create) { GList *list; FSmon *fs; gint i; if (fs_main_vbox == NULL) { fs_main_vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), fs_main_vbox, FALSE, FALSE, 0); gtk_widget_show(fs_main_vbox); fs_secondary_vbox = gtk_vbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), fs_secondary_vbox, FALSE, FALSE, 0); gtk_widget_show(fs_secondary_vbox); secondary_monitors_shown = FALSE; } n_fs_monitors = 0; for (i = 0, list = fs_mon_list; list; ++i, list = list->next) { fs = (FSmon *)list->data; create_fs_monitor(fs->secondary ? fs_secondary_vbox : fs_main_vbox,fs, i, first_create); } if (g_list_length(fs_mon_list) == 0) gkrellm_spacers_hide(mon_fs); }#define FS_CONFIG_KEYWORD "fs"static voidcb_alert_trigger(GkrellmAlert *alert, FSmon *fs) { /* Full panel alert, default decal. */ alert->panel = fs->panel; }static voidcreate_alert(FSmon *fs) { fs->alert = gkrellm_alert_create(NULL, fs->label, _("Percent Usage"), TRUE, FALSE, TRUE, 100, 10, 1, 10, 0); gkrellm_alert_trigger_connect(fs->alert, cb_alert_trigger, fs); gkrellm_alert_config_connect(fs->alert, cb_alert_config, fs); gkrellm_alert_command_process_connect(fs->alert, cb_command_process, fs); }static voidsave_fs_config(FILE *f) { GList *list; FSmon *fs; gchar quoted_label[64]; for (list = fs_mon_list; list; list = list->next) { fs = (FSmon *) list->data; snprintf(quoted_label, sizeof(quoted_label), "\"%s\"", fs->label); fprintf(f, "%s %s %s %d %d %d %d %d\n", FS_CONFIG_KEYWORD, quoted_label, fs->mount.directory, fs->fstab_mounting, fs->secondary, fs->show_if_mounted, fs->label_is_data, fs->ejectable); if (*(fs->launch_mount.command)) fprintf(f, "%s mount_command %s\n", FS_CONFIG_KEYWORD, fs->launch_mount.command); if (*(fs->launch_umount.command)) fprintf(f, "%s umount_command %s\n", FS_CONFIG_KEYWORD, fs->launch_umount.command); if (*(fs->eject_device)) fprintf(f, "%s eject_device %s\n", FS_CONFIG_KEYWORD, fs->eject_device); if (fs->alert) gkrellm_save_alertconfig(f, fs->alert, FS_CONFIG_KEYWORD, quoted_label); } if (!_GK.client_mode) { fprintf(f, "%s fs_check_timeout %d\n", FS_CONFIG_KEYWORD, fs_check_timeout); fprintf(f, "%s nfs_check_timeout %d\n", FS_CONFIG_KEYWORD, nfs_check_timeout); fprintf(f, "%s auto_eject %d\n", FS_CONFIG_KEYWORD, cdrom_auto_eject); } fprintf(f, "%s binary_units %d\n", FS_CONFIG_KEYWORD, binary_units); fprintf(f, "%s data_format %s\n", FS_CONFIG_KEYWORD, data_format); }static gbooleanfstab_user_permission(Mount *m) { struct stat my_stat; stat(m->device, &my_stat); if ( strstr(m->options, "user") || (strstr(m->options, "owner") && my_stat.st_uid == uid) ) return TRUE; return FALSE; }static gintfix_fstab_mountable_changed(FSmon *fs) { Mount *m; if (!mounting_supported) return FALSE; m = in_fstab_list(fs->mount.directory); if ( (!m || (!fstab_user_permission(m) && uid != 0)) && fs->fstab_mounting ) { fs->fstab_mounting = FALSE; return TRUE; } return FALSE; }static FSmon *lookup_fs(gchar *name) { GList *list; FSmon *fs; if (!name) return NULL; for (list = fs_mon_list; list; list = list->next) { fs = (FSmon *) list->data; if (!strcmp(fs->label, name)) return fs; } return NULL; }static voidload_fs_config(gchar *arg) { static FSmon *fs_prev; FSmon *fs; gchar *label; gchar config[32], item[CFG_BUFSIZE], dir[CFG_BUFSIZE]; gchar name[64], item1[CFG_BUFSIZE]; gint n; if ((n = sscanf(arg, "%31s %[^\n]", config, item)) != 2) return; if (!strcmp(config, "fs_check_timeout")) { sscanf(item, "%d", &fs_check_timeout); if (fs_check_timeout < 2) fs_check_timeout = 2; } else if (!strcmp(config, "nfs_check_timeout")) { sscanf(item, "%d", &nfs_check_timeout); if (nfs_check_timeout < 5) nfs_check_timeout = 5; } else if (!strcmp(config, "auto_eject")) sscanf(item, "%d", &cdrom_auto_eject); else if (!strcmp(config, "binary_units")) sscanf(item, "%d", &binary_units); else if (!strcmp(config, "data_format")) gkrellm_locale_dup_string(&data_format, item, &data_format_locale); else if (fs_prev && !strcmp(config, "mount_command")) gkrellm_dup_string(&fs_prev->launch_mount.command, item); else if (fs_prev && !strcmp(config, "umount_command")) gkrellm_dup_string(&fs_prev->launch_umount.command, item); else if (fs_prev && !strcmp(config, "eject_device")) { if (fs_prev->ejectable) gkrellm_dup_string(&fs_prev->eject_device, item); } else if (!strcmp(config, GKRELLM_ALERTCONFIG_KEYWORD)) { if ( sscanf(item, "\"%63[^\"]\" %[^\n]", name, item1) == 2 && (fs = lookup_fs(name)) != NULL ) { if (!fs->alert) create_alert(fs); gkrellm_load_alertconfig(&fs->alert, item1); } } else { if ((label = gkrellm_cut_quoted_string(arg, &arg)) != NULL) { fs = g_new0(FSmon, 1); gkrellm_locale_dup_string(&fs->label, label, &fs->label_shadow); dir[0] = '\0'; sscanf(arg, "%s %d %d %d %d %d", dir, &fs->fstab_mounting, &fs->secondary, &fs->show_if_mounted, &fs->label_is_data, &fs->ejectable); if (fs->fstab_mounting > 1) /* pre 2.0.0 config fix */ fs->fstab_mounting = FALSE; if (!ejecting_supported) fs->ejectable = FALSE; if (!mounting_supported) fs->fstab_mounting = fs->show_if_mounted = FALSE; if (fs->secondary) have_secondary_panels = TRUE; fs->mount.directory = g_strdup(dir); fs->restore_label = fs->label_is_data; fix_fstab_mountable_changed(fs); fs->krell_factor = 1; fs->launch_mount.command = g_strdup(""); fs->launch_umount.command = g_strdup(""); fs->eject_device = g_strdup(""); fs_mon_list = g_list_append(fs_mon_list, fs); fs_prev = fs; /* XXX */ } } }/* --------------------------------------------------------------------- */enum { NAME_COLUMN, MOUNT_POINT_COLUMN, SHOW_COLUMN, FSTAB_COLUMN, MOUNT_COMMAND_COLUMN, UMOUNT_COMMAND_COLUMN, EJECTABLE_COLUMN, DEVICE_COLUMN, FSMON_COLUMN, ALERT_COLUMN, SHOW_DATA_COLUMN, VISIBLE_COLUMN, IMAGE_COLUMN, N_COLUMNS };static GtkTreeView *treeview;static GtkTreeRowReference *row_reference;static GtkTreeSelection *selection;static GtkWidget *label_entry, *dir_combo, *mount_entry, *umount_entry, *mounting_button, *ejectable_button, *device_entry, *secondary_button, *show_button, *delete_button, *new_apply_button;static GtkWidget *alert_button;static GtkWidget *data_format_combo;static gboolean (*original_row_drop_possible)();static void
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -