📄 support.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 + -