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

📄 support.c

📁 linux的多线程下载工具。基于gtk界面。
💻 C
字号:
/* * THIS FILE IS NOT generated by Glade. * (Though many codes are hacked from the auto-generated Glade project) * * DONOT USE GLADE TO MODIFY IT!!!!!!!!!!!!!!!! *//* support.c * * Copyright (C) 2004-2004 Wang Xiaoguang (Chice) <chice_wxg@hotmail.com> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * * Authors: Wang Xiaoguang (Chice) <chice_wxg@hotmail.com> *//* * DO NOT EDIT THIS FILE - it is generated by Glade. */#ifdef HAVE_CONFIG_H#  include <config.h>#endif#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>#include <string.h>#include <stdio.h>#include "../os.h"#include "../dld_language.h"#include <gtk/gtk.h>#include "support.h"#include <X11/Xlib.h>#include "interface.h"GtkWidget*lookup_widget                          (GtkWidget       *widget,                                        const gchar     *widget_name){  GtkWidget *parent, *found_widget;  for (;;)    {      if (GTK_IS_MENU (widget))        parent = gtk_menu_get_attach_widget (GTK_MENU (widget));      else        parent = widget->parent;      if (!parent)        parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey");      if (parent == NULL)        break;      widget = parent;    }  found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget),                                                 widget_name);  if (!found_widget)    g_warning ("Widget not found: %s", widget_name);  return found_widget;}static GList *pixmaps_directories = NULL;/* Use this function to set the directory containing installed pixmaps. */voidadd_pixmap_directory                   (const gchar     *directory){  pixmaps_directories = g_list_prepend (pixmaps_directories,                                        g_strdup (directory));}/* This is an internally used function to find pixmap files. */static gchar*find_pixmap_file                       (const gchar     *filename){  GList *elem;  /* We step through each of the pixmaps directory to find it. */  elem = pixmaps_directories;  while (elem)    {      gchar *pathname = g_strdup_printf ("%s%s%s", (gchar*)elem->data,                                         G_DIR_SEPARATOR_S, filename);      if (g_file_test (pathname, G_FILE_TEST_EXISTS))        return pathname;      g_free (pathname);      elem = elem->next;    }  return NULL;}/* This is an internally used function to create pixmaps. */GtkWidget*create_pixmap                          (GtkWidget       *widget,                                        const gchar     *filename){  gchar *pathname = NULL;  GtkWidget *pixmap;  if (!filename || !filename[0])      return gtk_image_new ();  pathname = find_pixmap_file (filename);  if (!pathname)    {      g_warning ("Couldn't find pixmap file: %s", filename);      return gtk_image_new ();    }  pixmap = gtk_image_new_from_file (pathname);  g_free (pathname);  return pixmap;}/* This is an internally used function to create pixmaps. */GdkPixbuf*create_pixbuf                          (const gchar     *filename){  gchar *pathname = NULL;  GdkPixbuf *pixbuf;  GError *error = NULL;  if (!filename || !filename[0])      return NULL;  pathname = find_pixmap_file (filename);  if (!pathname)    {      g_warning ("Couldn't find pixmap file: %s", filename);      return NULL;    }  pixbuf = gdk_pixbuf_new_from_file (pathname, &error);  if (!pixbuf)    {      fprintf (stderr, "Failed to load pixbuf file: %s: %s\n",               pathname, error->message);      g_error_free (error);    }  g_free (pathname);  return pixbuf;}/* This is used to set ATK action descriptions. */voidglade_set_atk_action_description       (AtkAction       *action,                                        const gchar     *action_name,                                        const gchar     *description){  gint n_actions, i;  n_actions = atk_action_get_n_actions (action);  for (i = 0; i < n_actions; i++)    {      if (!strcmp (atk_action_get_name (action, i), action_name))        atk_action_set_description (action, i, description);    }}extern GtkWidget *window_main;void quick_message(GtkWidget *parent, gchar *message) {	GtkWidget *dlg;	dlg = gtk_message_dialog_new(GTK_WINDOW(parent),			GTK_DIALOG_MODAL, GTK_MESSAGE_INFO,			GTK_BUTTONS_NONE,			message);				gtk_dialog_add_buttons(GTK_DIALOG(dlg),			GTK_STOCK_OK, GTK_RESPONSE_YES,			NULL);	gtk_dialog_set_default_response(GTK_DIALOG(dlg), GTK_RESPONSE_YES);	gtk_dialog_run(GTK_DIALOG(dlg));	gtk_widget_destroy(dlg);  }//GTK_RESPONSE_YES//GTK_RESPONSE_NOgint quick_question(GtkWidget *parent, gchar *message){	GtkWidget *dlg;	int ret;		dlg = gtk_message_dialog_new(GTK_WINDOW(parent),			GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION,			GTK_BUTTONS_YES_NO,			message);		gtk_dialog_set_default_response(GTK_DIALOG(dlg), GTK_RESPONSE_YES);	ret = gtk_dialog_run(GTK_DIALOG(dlg));	/*switch (ret) {		case GTK_RESPONSE_NO:			ret = TRUE;			break;		case GTK_RESPONSE_YES: 			break;		case GTK_RESPONSE_CANCEL:		default:			ret = FALSE;			break;	}	*/	gtk_widget_destroy(dlg);	return ret;}static int async_system_thread(gpointer *params){	// params[0] cmd	// params[1] showresult	// params[2] ready		STRING *cmd = string_assign(NULL, (char *)params[0]);	BOOL showresult = (BOOL)params[1];	BOOL *ready = (BOOL *)params[2];	CHAR msg[1000];/*		CHAR buf[4096 + 1];	STRING *resultstr=NULL;	BOOL hasoutput = FALSE;*/		*ready = TRUE;			/*	FILE *pp;	pp = popen(cmd->str, "r");			if(pp)	{		resultstr = string_new("");		snprintf(msg, sizeof(msg), _"Finished executing '%s'. The result is:\n\n"), cmd->str);		resultstr = string_append(resultstr, msg);				while(!feof(pp))		{			fgets(buf, sizeof(buf) - 1, pp);			dprintf("OUTPUT BUF = %s\n", buf);						resultstr = string_append(resultstr, buf);			if(strlen(buf)!=0)				hasoutput = TRUE;						os_sleep(100);		}				pclose(pp);				if(showresult || hasoutput)		{			dprintf("showresult || hasoutput\n");			if(!hasoutput)			{				resultstr = string_append(resultstr, _"The program has no output. Usually, it finished successfully.\n"));			}			quick_message(NULL, resultstr->str);		}				resultstr = string_free(resultstr);	}*/	if(system(cmd->str) != -1)	{		snprintf(msg, sizeof(msg), _("Finished executing '%s'.\n\n"), cmd->str);		if(showresult) quick_message(NULL, msg);	}	else	{		snprintf(msg, sizeof(msg), _("Can't execute command: %s"), cmd->str);		quick_message(NULL, msg);	}	cmd = string_free(cmd);	return 0;}static gboolean cancel_busy(gpointer data){	gdk_window_set_cursor (window_main->window, NULL);	return FALSE;}void async_system(char *cmd, BOOL showresult){	BOOL ready = FALSE;	pthread_t threadid;	static GdkCursor *cursor = NULL;		gpointer params[3];	params[0] = (gpointer)cmd;	params[1] = (gpointer)showresult;	params[2] = &ready;		if(!cursor)		cursor = gdk_cursor_new(GDK_WATCH);		gdk_window_set_cursor (window_main->window, cursor);	g_timeout_add(2000, (GSourceFunc)cancel_busy, NULL);		pthread_create(&threadid, NULL, (THREADPROC)async_system_thread, params);	while(!ready)		os_sleep(20);}static gboolean destroy_toptip(GtkWidget *toptip){	gtk_widget_destroy(toptip);	return FALSE;}void quick_toptip(char *msg){	g_timeout_add(5000, (GSourceFunc)destroy_toptip, create_toptip(msg));}gint quick_choice(char *msg, GList *choices){	GtkWidget *w;	gint ret;	gchar *text;		w = create_dialog_choice();		gtk_label_set_label(GTK_LABEL(lookup_widget(w, "label_msg")), msg);	gtk_combo_set_popdown_strings(GTK_COMBO (lookup_widget(w, "combo_choice")), choices);		gtk_dialog_run(GTK_DIALOG(w));	text = (gchar *)gtk_entry_get_text(GTK_ENTRY(lookup_widget(w, "combo_choice_text")));			dprintf("[CHOICE]%s\n", text);		ret = g_list_index(choices, g_list_find_custom(choices, text, (GCompareFunc)strcmp)->data);	gtk_widget_destroy(w);		return ret;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -