📄 menus.c
字号:
/* menus.c 27.3.99 tn*/#include <stdio.h>#include <sys/stat.h>#include <unistd.h>#include <string.h>#include <dirent.h>#include <fcntl.h>#include <sys/types.h>#include <errno.h>#include <ctype.h>#include <gtk/gtk.h>#include <gdk/gdk.h>#include <gdk_imlib.h>#include "xcdroast.h"#include "main.h"#include "xpms/treefolderopen.xpm"#include "xpms/treefolderclosed.xpm"#include "xpms/filesmall.xpm"extern gint debug;extern GtkWidget *toplevel;extern GtkWidget *splitspace;extern GtkWidget *sidespace;extern GtkWidget *workspace;extern GtkWidget *actionspace;extern scsi_devices_t **scsidevices;extern writer_driver_t **blankmodes;extern setup_data_t setupdata;extern cd_info_t cdinfo;extern track_info_t **trackinfo;extern GList *imagelist;extern current_set_t curset;extern track_read_set_t trackreadset;extern gint read_done;extern GList *tocfiles;extern gint read_abort_mark;extern gchar sharedir[MAXLINE];GtkWidget *ctree_window;GtkWidget *ctree_entry;GtkWidget *ctree_okbutton;gint ctree_showfiles;GtkCTreeNode *parent_node;GtkCTree *ctree_base;gchar *ctree_basedir;GtkWidget *cddb_info_label;GtkWidget *cddb_info_okbutton;GtkWidget *cddb_window;GtkCList *cddb_clist;GtkWidget *readtrack_info_label, *readtrack_textview, *readtrack_button;GtkWidget *readtrack_pbar1, *readtrack_pbar2, *readtrack_savebutton;GtkWidget *readtrack_pbar3;GtkWidget *readtrack_small_info, *readtrack_small_info2, *readtrack_info_tbl;GtkWidget *readtrack_info_frame;GdkPixmap *pixmap1, *pixmap2, *pixmap3;GdkBitmap *mask1, *mask2, *mask3;GtkWidget *viewmode_scrolled;GtkWidget *viewmode_dialog;GtkWidget *blank_infolabel;GtkWidget *blank_text_window;gint dialog_done, dialog_done2, dialog_done3;gint misc_timer;gint dialog_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) { dialog_done = -1; return(TRUE);}gint dialog_delete_event2(GtkWidget *widget, GdkEvent *event, gpointer data) { dialog_done2 = -1; return(TRUE);}gint dialog_delete_event3(GtkWidget *widget, GdkEvent *event, gpointer data) { dialog_done3 = -1; return(TRUE);}void dialog_btn_press(GtkWidget *widget, gpointer data) { dialog_done = GPOINTER_TO_INT(data);}/* popup a modal window, set cursor to watch, return button pressed or -1 when delete_event found. Up to three buttons. Set unused buttons to NULL Centers automatically above the toplevel-widow if no toplevel window available center on display*//* gint show_dialog(gchar **icon_xpm, gchar *ttext, gchar *btn1, gchar *btn2, gchar *btn3, gint defbutton) { */gint show_dialog(gchar *icon_file, gchar *ttext, gchar *btn1, gchar *btn2, gchar *btn3, gint defbutton) {GtkWidget *dialog;GtkWidget *button1;GtkWidget *button2;GtkWidget *button3;GtkWidget *box1,*box2;GtkWidget *b1_t,*b1_sep,*pix,*lab;gint xpos, ypos;gint xsize, ysize;GdkCursor *cursor,*normal_cursor;GdkPixmap *pixmap;GdkBitmap *mask;/* GtkStyle *style; */GtkRequisition rq;GdkWindowAttr *win_attr;gint w,h;GdkImlibImage *im;gchar tmp[MAXLINE]; /* if another dialog is running, ignore */ if (dialog_done == 999) { return -1; } dodebug(8, "displaying show_dialog: %s\n", ttext); /* mark our dialog as running */ dialog_done = 999; /* create new window and position it relative to the main window */ dialog = gtk_window_new(GTK_WINDOW_DIALOG); gtk_window_set_title(GTK_WINDOW(dialog),text(2));dodebug(9, "created new window\n"); /* make sure our window is always on top */ gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(toplevel));dodebug(9, "set transient\n"); gtk_signal_connect (GTK_OBJECT (dialog), "delete_event", GTK_SIGNAL_FUNC (dialog_delete_event), (gpointer) dialog);dodebug(9, "connect delete event\n"); /* create layout for dialog */ box1 = gtk_vbox_new(FALSE,0); gtk_container_add(GTK_CONTAINER(dialog),box1); b1_t = gtk_table_new(1,10, TRUE); gtk_container_border_width(GTK_CONTAINER(b1_t),10); gtk_box_pack_start(GTK_BOX(box1),b1_t,FALSE,TRUE,10);dodebug(9, "creating vbox in table \n"); /* realize table to be able to put a pixmap in it */ gtk_widget_realize(b1_t);dodebug(9, "realize table \n");/* style = gtk_widget_get_style(b1_t); pixmap = gdk_pixmap_create_from_xpm_d(b1_t->window, &mask, &style->bg[GTK_STATE_NORMAL],(gchar **)icon_xpm);*/ g_snprintf(tmp,MAXLINE,"%s/%s", sharedir,icon_file);dodebug(9, "trying to load %s\n", tmp); im=gdk_imlib_load_image(tmp); if (im) {dodebug(9, "load successful\n"); w=im->rgb_width; h=im->rgb_height; gdk_imlib_render(im,w,h);dodebug(9, "render successful\n"); pixmap = gdk_imlib_move_image(im); mask = gdk_imlib_move_mask(im); pix = gtk_pixmap_new(pixmap,mask); gtk_table_attach_defaults(GTK_TABLE(b1_t), pix, 0,2,0,1);dodebug(9, "attach pixmap\n"); } lab = gtk_label_new(ttext); gtk_table_attach_defaults(GTK_TABLE(b1_t), lab, 2,10,0,1);dodebug(9, "attach label\n"); b1_sep = gtk_hseparator_new(); gtk_box_pack_start(GTK_BOX(box1),b1_sep,FALSE,TRUE,0); box2 = gtk_hbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(box1),box2,FALSE,TRUE,10); if (btn1 != NULL) { button1 = gtk_button_new_with_label (btn1); gtk_box_pack_start(GTK_BOX(box2),button1,TRUE,TRUE,10); gtk_widget_show(button1); gtk_signal_connect(GTK_OBJECT(button1),"clicked", GTK_SIGNAL_FUNC(dialog_btn_press), GINT_TO_POINTER(0)); GTK_WIDGET_SET_FLAGS (button1, GTK_CAN_DEFAULT); if (defbutton == 0) gtk_widget_grab_default (button1); } if (btn2 != NULL) { button2 = gtk_button_new_with_label (btn2); gtk_box_pack_start(GTK_BOX(box2),button2,TRUE,TRUE,10); gtk_widget_show(button2); gtk_signal_connect(GTK_OBJECT(button2),"clicked", GTK_SIGNAL_FUNC(dialog_btn_press), GINT_TO_POINTER(1)); GTK_WIDGET_SET_FLAGS (button2, GTK_CAN_DEFAULT); if (defbutton == 1) gtk_widget_grab_default (button2); } if (btn3 != NULL) { button3 = gtk_button_new_with_label (btn3); gtk_box_pack_start(GTK_BOX(box2),button3,TRUE,TRUE,10); gtk_widget_show(button3); gtk_signal_connect(GTK_OBJECT(button3),"clicked", GTK_SIGNAL_FUNC(dialog_btn_press), GINT_TO_POINTER(2)); GTK_WIDGET_SET_FLAGS (button3, GTK_CAN_DEFAULT); if (defbutton == 2) gtk_widget_grab_default (button3); }dodebug(9, "created buttonbox\n"); gtk_widget_show(box2); gtk_widget_show(b1_sep); gtk_widget_show(pix); gtk_widget_show(lab); gtk_widget_show(b1_t); gtk_widget_show(box1);dodebug(9, "showing elements\n"); /* grab cursor and change to watch */ if (GTK_WIDGET_MAPPED(toplevel)) { gtk_grab_add(dialog); gdk_window_get_user_data(GTK_WIDGET(toplevel)->window, (gpointer) &win_attr); normal_cursor = win_attr->cursor; cursor = gdk_cursor_new(GDK_WATCH); gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,cursor);dodebug(9, "setting cursor to watch\n"); } /* only center window when toplevel visible */ if ( GTK_WIDGET_VISIBLE(toplevel)) { gtk_window_position(GTK_WINDOW(dialog),GTK_WIN_POS_NONE); gdk_window_get_origin(GTK_WIDGET(toplevel)->window,&xpos,&ypos); gdk_window_get_size(GTK_WIDGET(toplevel)->window,&xsize,&ysize); gtk_widget_size_request(dialog,&rq); gtk_widget_set_uposition(GTK_WIDGET(dialog),xpos+xsize/2-rq.width/2,ypos+ysize/2-rq.height/2);dodebug(9, "center window in toplevel\n"); } else { /* otherwise center in screen */ gtk_window_position(GTK_WINDOW(dialog),GTK_WIN_POS_NONE); xsize = gdk_screen_width(); ysize = gdk_screen_height(); gtk_widget_size_request(dialog,&rq); gtk_widget_set_uposition(GTK_WIDGET(dialog),xsize/2-rq.width/2,ysize/2-rq.height/2);dodebug(9, "center window onscreen\n"); } gtk_widget_show(dialog);dodebug(9, "showing dialog\n"); /* if this is a warning sound bell (if requested in setup) */ if (strcmp(icon_file, ICO_WARN) == 0) { dobeep(2); }dodebug(9, "start wait for input\n"); /* now wait until button is pressed */ while (dialog_done == 999) { wait_and_process_events(); }dodebug(9, "done waiting\n"); if (GTK_WIDGET_MAPPED(toplevel)) { gtk_grab_remove(GTK_WIDGET(dialog)); normal_cursor = gdk_cursor_new (GDK_TOP_LEFT_ARROW); gdk_window_set_cursor(GTK_WIDGET(toplevel)->window,normal_cursor);dodebug(9, "restored cursor\n"); } /* remove dialog window */ gtk_widget_destroy(dialog);dodebug(9, "destroying dialog\n"); return dialog_done; }/* clears the left sidebar */void clear_sidespace() { gtk_widget_destroy(sidespace); sidespace = gtk_vbox_new(FALSE,0); gtk_paned_add1(GTK_PANED(splitspace), sidespace); set_sidebar_width();}/* clears the right workspace */void clear_workspace() { gtk_widget_destroy(workspace); workspace = gtk_vbox_new(FALSE,0); gtk_paned_add2(GTK_PANED(splitspace), workspace);}/* clears the actionspace subwindow */void clear_actionspace() { gtk_widget_destroy(actionspace); actionspace = gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(workspace), actionspace,TRUE,TRUE,10); /* strange, why we need that...*/ while (gtk_events_pending()) gtk_main_iteration();}/* add subdirectory nodes to an existing ctree */void ctree_add_dir_nodes(gchar *path, GtkCTree *ctree, GtkCTreeNode *parent, gint showfiles) {struct dirent *ent;DIR *dir; gchar *text[1];gchar tmp[MAXLINE];GtkCTreeNode *sibling;gchar *textdata;GList *dir_list;GList *file_list; dir_list = NULL; file_list = NULL; dir = opendir(path); /* invalid directory */ if (dir == NULL) return; /* read entries */ while ( (ent = readdir(dir)) ) { if (strcmp(ent->d_name,".") == 0 || strcmp(ent->d_name,"..") == 0) continue; strcpy(tmp,path); /* add slash when not there */ if (tmp[strlen(tmp)-1] != '/') strcat(tmp,"/"); strcat(tmp,ent->d_name); /* add only directories */ if (is_directory(tmp) == 1) { dir_list = g_list_append(dir_list, g_strdup(ent->d_name)); } else { if (showfiles) file_list = g_list_append(file_list, g_strdup(ent->d_name)); } } closedir(dir); /* sort the directory-list */ if (dir_list == NULL && showfiles == 0) return; sort_glist(dir_list); /* sort the file-list */ if (file_list != NULL && showfiles) { sort_glist(file_list); } /* draw entries */ while (dir_list) { /* allocate directory names */ text[0] = dir_list->data; strcpy(tmp,path); /* add slash when not there */ if (tmp[strlen(tmp)-1] != '/') strcat(tmp,"/"); if ((strlen(tmp) + strlen(dir_list->data)) > MAXLINE-1) { /* getting to long..writing dummy*/ strcat(tmp,"+"); } else { strcat(tmp,dir_list->data); } textdata = g_strdup(tmp); /* now check if there are subdirs in that dir */ if (is_subdirs(tmp)) { sibling = gtk_ctree_insert_node (ctree,parent, NULL,text,3,pixmap1,mask1, pixmap2,mask2,FALSE,FALSE); /* create dummy node */ gtk_ctree_insert_node (ctree,sibling, NULL,text,3,NULL,NULL,NULL,NULL,TRUE,FALSE); } else { /* no subdirs */ if (!showfiles || !is_subfiles(tmp)) { /* if do not show files, dont allow changing into empty directory */ sibling = gtk_ctree_insert_node (ctree,parent, NULL,text,3,pixmap1,mask1, pixmap2,mask2,TRUE,FALSE); } else { /* let user browse directory */ sibling = gtk_ctree_insert_node (ctree,parent, NULL,text,3,pixmap1,mask1, pixmap2,mask2,FALSE,FALSE); gtk_ctree_insert_node (ctree,sibling, NULL,text,3,NULL,NULL,NULL,NULL,TRUE,FALSE); } } /* save the full path name in the node-data */ gtk_ctree_node_set_row_data(ctree,sibling,textdata); dir_list = dir_list->next; } /* add files */ while (file_list) { text[0] = file_list->data; strcpy(tmp,path); /* add slash when not there */ if (tmp[strlen(tmp)-1] != '/') strcat(tmp,"/"); if ((strlen(tmp) + strlen(file_list->data)) > MAXLINE-1) { /* getting to long..writing dummy*/ strcat(tmp,"+"); } else { strcat(tmp,file_list->data); } textdata = g_strdup(tmp); sibling = gtk_ctree_insert_node (ctree,parent, NULL,text,3,pixmap3,mask3, pixmap3,mask3,TRUE,FALSE); /* save the full path name in the node-data */ gtk_ctree_node_set_row_data(ctree,sibling,textdata); file_list = file_list->next; } /* free list */ free_glist(&dir_list); free_glist(&file_list);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -