⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fs.c

📁 系统任务管理器
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -