📄 fs.c
字号:
g_spawn_command_line_async(buf, NULL /* GError */); } else if (close_cdrom_func && !cdrom_thread_busy) { if (!*close_target && (m = in_fstab_list(fs->mount.directory)) != NULL) close_target = m->device; if (*close_target) { cdrom_thread_busy = TRUE; g_thread_create(close_cdrom_thread, close_target, FALSE, NULL); } } }static gpointereject_cdrom_thread(void *device) { (*eject_cdrom_func)((gchar *) device); cdrom_thread_busy = FALSE; return NULL; }static voideject_tray(FSmon *fs) { Mount *m; static gchar *eject_target; gchar buf[512]; eject_target = fs->eject_device; if (eject_cdrom_command) { snprintf(buf, sizeof(buf), eject_cdrom_command, *eject_target ? eject_target : fs->mount.directory); g_spawn_command_line_async(buf, NULL /* GError */); } else if (eject_cdrom_func && !cdrom_thread_busy) { if (!*eject_target && (m = in_fstab_list(fs->mount.directory)) != NULL) eject_target = m->device; if (*eject_target) { cdrom_thread_busy = TRUE; g_thread_create(eject_cdrom_thread, eject_target, FALSE, NULL); } } }static voidaccumulate_pipe_gstring(FSmon *fs) { gchar buf[512]; gint n; n = fread(buf, 1, sizeof(buf) - 1, fs->launch_mount.pipe); buf[n] = '\0'; if (n > 0) { if (fs->pipe_gstring) g_string_append(fs->pipe_gstring, buf); else fs->pipe_gstring = g_string_new(buf); } if (feof(fs->launch_mount.pipe)) { pclose(fs->launch_mount.pipe); fs->launch_mount.pipe = NULL; } }static voidpipe_command(FSmon *fs, gchar *command) { gchar buf[512]; if (fs->launch_mount.pipe) /* Still running? */ return; snprintf(buf, sizeof(buf), "%s 2>&1", command); if ((fs->launch_mount.pipe = popen(buf, "r")) == NULL) return; fcntl(fileno(fs->launch_mount.pipe), F_SETFL, O_NONBLOCK); }static voidmount_command(FSmon *fs) { gchar cmd[CFG_BUFSIZE]; if (! FS_MOUNTING_ENABLED(fs)) return; if (fs->is_mounted) { if (fs->fstab_mounting) snprintf(cmd, sizeof(cmd), "umount %s", fs->mount.directory); else snprintf(cmd, sizeof(cmd), "%s", fs->launch_umount.command); fs->label_is_data = FALSE; draw_fs_text_decal(fs, 0); pipe_command(fs, cmd); if (cdrom_auto_eject) fs->eject_pending = GK.timer_ticks + 5; /* at least 1/2 sec delay*/ } else { if (fs->ejectable) close_tray(fs); if (fs->fstab_mounting) snprintf(cmd, sizeof(cmd), "mount %s", fs->mount.directory); else snprintf(cmd, sizeof(cmd), "%s", fs->launch_mount.command); fs->blocks = fs->bfree = fs->bavail = fs->bsize = 0; pipe_command(fs, cmd); } force_fs_check = FORCE_REDRAW; /* An update triggers when pipe closes */ }static voidhide_secondary_monitors(void) { FSmon *fs; GList *list; if (!secondary_monitors_shown) return; secondary_monitors_shown = FALSE; gkrellm_freeze_side_frame_packing(); for (list = fs_mon_list; list; list = list->next) { fs = (FSmon *) list->data; if (fs->secondary && (!fs_is_mounted(fs) || !fs->show_if_mounted)) gkrellm_panel_hide(fs->panel); } gkrellm_thaw_side_frame_packing(); }static voidshow_secondary_monitors(void) { FSmon *fs; GList *list; if (secondary_monitors_shown) return; secondary_monitors_shown = TRUE; gkrellm_freeze_side_frame_packing(); for (list = fs_mon_list; list; list = list->next) { fs = (FSmon *) list->data; if (fs->secondary) gkrellm_panel_show(fs->panel); } gkrellm_thaw_side_frame_packing(); }static gpointerget_fsusage_thread(void *data) { FSmon *fs = (FSmon *) data; (*get_fsusage)(fs, fs->mount.directory); fs->busy = FALSE; return NULL; }static gbooleananimate_eject_button(FSmon *fs, gboolean force_close) { gint dx, target; if (force_close) target = x_eject_button_closed; else target = fs->x_eject_button_target; dx = target - fs->eject_decal->x; if (dx > 0) gkrellm_move_decal(fs->panel, fs->eject_decal, fs->eject_decal->x + 1 + dx / 4, fs->eject_decal->y); else if (dx < 0) gkrellm_move_decal(fs->panel, fs->eject_decal, fs->eject_decal->x - 1 + dx / 4, fs->eject_decal->y); if (fs->eject_decal->x < x_eject_button_closed) gkrellm_show_button(fs->eject_button); else gkrellm_hide_button(fs->eject_button); if (fs->eject_decal->x != target) return TRUE; return FALSE; }static voidupdate_fs(void) { FSmon *fs; GkrellmPanel *p; GkrellmKrell *k; GList *list; glong used, avail; gint full_scale, index, w_scroll, w; gboolean fs_check, nfs_check, force_check, force_draw, mounting_enabled; if (!fs_mon_list) return; w = w_scroll = 0; for (list = fs_mon_list; list; list = list->next) { fs = (FSmon *) list->data; if (fs->label_is_data && !fs_in_motion) { w = draw_fs_text_decal(fs, 1); if (w > w_scroll) w_scroll = w; gkrellm_draw_panel_layers(fs->panel); } } if (!fs_in_motion) { if (w_scroll > text_decal_width) x_scroll = (x_scroll + ((gkrellm_update_HZ() < 7) ? 2 : 1)) % (w_scroll - text_decal_width / 3); else x_scroll = 0; } if (GK.second_tick) ++check_tick; fs_check = (check_tick % fs_check_timeout) ? FALSE : TRUE; if (_GK.client_mode) nfs_check = fs_check; else nfs_check = (check_tick % nfs_check_timeout) ? FALSE : TRUE; if (!force_fs_check && (!GK.second_tick || (!fs_check && !nfs_check))) return;#if 0printf("fs update %d nfs %d force %d\n", fs_check, nfs_check, force_fs_check);#endif refresh_mounts_list(); force_check = force_draw = FALSE; for (list = fs_mon_list; list; list = list->next) { fs = (FSmon *) list->data; p = fs->panel; k = fs->krell; mounting_enabled = FS_MOUNTING_ENABLED(fs); if (fs_is_mounted(fs)) { if (mounting_enabled) { /* Blink it while busy or pipe is open. */ if ( (fs->launch_mount.pipe || fs->busy) && fs->md_button->cur_index == D_MISC_FS_MOUNTED ) index = D_MISC_FS_UMOUNTED; else index = D_MISC_FS_MOUNTED; gkrellm_set_decal_button_index(fs->md_button, index); } else { if (fs->busy && fs->md_button->cur_index == D_MISC_LED1) index = D_MISC_LED0; else index = mounting_supported ? D_MISC_LED1 : D_MISC_BLANK; gkrellm_set_decal_button_index(fs->md_button, index); } if ( force_fs_check == FORCE_UPDATE || (fs_check && !fs->is_nfs_fs) || (nfs_check && fs->is_nfs_fs) ) { if (!fs->is_nfs_fs || _GK.client_mode) (*get_fsusage)(fs, fs->mount.directory); else if (!fs->busy) { fs->busy = TRUE; g_thread_create(get_fsusage_thread, fs, FALSE, NULL); } fs->krell_factor = fs->blocks > 2097152 ? 1024 : 1; } avail = fs->bavail >= 0 ? fs->bavail : 0; used = fs->blocks - fs->bfree; full_scale = (gint) (used + avail) / fs->krell_factor; used /= fs->krell_factor; gkrellm_set_krell_full_scale(k, full_scale, 1); if (!fs->busy) { if ( (fs_in_motion && fs->label_is_data && x_moved) || fs->mouse_entered ) gkrellm_update_krell(p, k, 0); else gkrellm_update_krell(p, k, used); if (full_scale > 0) gkrellm_check_alert(fs->alert, 100.0 * (gfloat) used / (gfloat) full_scale); } else force_draw = TRUE; if (fs->secondary && fs->show_if_mounted) gkrellm_panel_show(fs->panel); if (fs->eject_decal) force_draw |= animate_eject_button(fs, mounting_supported); } else /* not mounted */ { gkrellm_reset_alert(fs->alert); if (mounting_enabled) { /* Blink it while pipe is open. */ if ( fs->launch_mount.pipe && fs->md_button->cur_index == D_MISC_FS_UMOUNTED ) index = D_MISC_FS_MOUNTED; else index = D_MISC_FS_UMOUNTED; gkrellm_set_decal_button_index(fs->md_button, index); } else gkrellm_set_decal_button_index(fs->md_button, D_MISC_LED0); gkrellm_set_krell_full_scale(k, 100, 1); /* Arbitrary > 0 */ gkrellm_update_krell(p, k, 0); if (!secondary_monitors_shown && fs->secondary) gkrellm_panel_hide(fs->panel); if (fs->eject_decal) force_draw |= animate_eject_button(fs, FALSE); } gkrellm_set_button_sensitive(fs->md_button, mounting_enabled); if (!fs->label_is_data && fs != fs_in_motion) draw_fs_text_decal(fs, 0); if (_GK.client_mode) { if (fs->blocks == 0) gkrellm_remove_krell(p, k); else gkrellm_insert_krell(p, k, FALSE); } gkrellm_draw_panel_layers(p); if ( fs->ejectable && fs->eject_pending && fs->eject_pending < GK.timer_ticks ) { eject_tray(fs); fs->eject_pending = 0; } if (fs->launch_mount.pipe) { accumulate_pipe_gstring(fs); if (fs->launch_mount.pipe == NULL) /* Command is done */ { if (fs->pipe_gstring) { gkrellm_message_dialog(_("GKrellM Mount Error"), fs->pipe_gstring->str); g_string_free(fs->pipe_gstring, 1); fs->pipe_gstring = NULL; } force_check = TRUE; } else force_draw = TRUE; /* Keep it going */ } } force_fs_check = force_check ? FORCE_UPDATE : force_draw; }static gintfs_expose_event(GtkWidget *widget, GdkEventExpose *ev) { FSmon *fs; GList *list; for (list = fs_mon_list; list; list = list->next) { fs = (FSmon *) list->data; if (widget == fs->panel->drawing_area) { gdk_draw_drawable(widget->window, gkrellm_draw_GC(1), fs->panel->pixmap, ev->area.x, ev->area.y, ev->area.x, ev->area.y, ev->area.width, ev->area.height); break; } } return FALSE; }static gintcb_panel_enter(GtkWidget *w, GdkEventButton *ev, FSmon *fs) { if (fs->label_is_data) { fs->mouse_entered = TRUE; force_fs_check = FORCE_REDRAW; } if (fs->ejectable) { fs->x_eject_button_target = x_eject_button_open; force_fs_check = FORCE_REDRAW; } if (fs != fs_in_motion) gkrellm_show_button(fs->drawer_button); return FALSE; }static gintcb_panel_leave(GtkWidget *w, GdkEventButton *ev, FSmon *fs) { if (fs->mouse_entered) force_fs_check = FORCE_REDRAW; fs->mouse_entered = FALSE; if (fs->ejectable) { fs->x_eject_button_target = x_eject_button_closed; force_fs_check = FORCE_REDRAW; } return FALSE; }static voidcb_drawer_button(GkrellmDecalbutton *button, FSmon *fs) { if (secondary_monitors_shown) hide_secondary_monitors(); else show_secondary_monitors(); }static gintcb_panel_scroll(GtkWidget *widget, GdkEventScroll *ev) { if (ev->direction == GDK_SCROLL_UP) hide_secondary_monitors(); if (ev->direction == GDK_SCROLL_DOWN) show_secondary_monitors(); return FALSE; }static gintcb_panel_release(GtkWidget *widget, GdkEventButton *ev, FSmon *fs) { if (ev->button == 3) return TRUE; if (fs_in_motion) { if (fs_in_motion->restore_label) { if (fs_in_motion->label_is_data) gkrellm_config_modified(); fs_in_motion->label_is_data = FALSE; draw_fs_text_decal(fs_in_motion, 0); gkrellm_show_button(fs_in_motion->drawer_button); gkrellm_draw_panel_layers(fs_in_motion->panel); } fs_in_motion->restore_label = TRUE; } force_fs_check = FORCE_REDRAW; /* Move krells back */ fs_in_motion = NULL; x_moved = 0; return FALSE; }static gintcb_panel_press(GtkWidget *widget, GdkEventButton *ev, FSmon *fs) { GkrellmDecal *d; d = fs->eject_decal ? fs->eject_decal : fs->mount_decal; if (ev->button == 3 && ev->x < d->x) { gkrellm_open_config_window(mon_fs); return TRUE; }#if 0 if ( ev->button == 1 && ( (fs->drawer_button && gkrellm_in_decal(fs->drawer_button->decal, ev)) || ev->x >= d->x ) ) return FALSE;#endif if (!fs->label_is_data)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -