📄 mfm.c
字号:
int status, lex_result; if (debug) printf ("In mkdir_event()\n"); getpath (whichside, &path); if (whichside->drive) { shiftstring (path, 2); path[0] = whichside->drive; path[1] = ':'; } filebegin = path + strlen (path); strcpy (filebegin, "New directory"); if ( (flag = entertext ("Make directory", "Enter new name for new directory:", filebegin, 255)) == 1) { if (whichside->drive) { if (pipe (copypipe) < 0) { printf (" Error with pipe()\n"); gtk_main_quit (); } if ((childpid = fork ()) < 0) { printf (" Error with fork()\n"); exit (-1); } else if (childpid == 0) /* child */ { if (debug) printf (" in child\n"); close (copypipe[0]); if (copypipe[1] != STDERR_FILENO) { if (dup2 (copypipe[1], STDERR_FILENO) != STDERR_FILENO) { printf (" Error with dup2()\n"); gtk_main_quit (); } close (copypipe[1]); } execl (mtoolscommand, "mmd", path, NULL); printf (" error in execl()\n"); printf (" errno:%d\n", errno); _exit (-1); } else /* parent */ { if (debug) printf (" in parent\n"); close (copypipe[1]); if ((mcopyout = fdopen (copypipe[0], "r")) == NULL) { printf (" Error while opening pipe for reading\n"); gtk_main_quit (); } lex_result = er_interface (mcopyout); while (1) { while (gtk_events_pending ()) gtk_main_iteration (); if (waitpid (childpid, &status, WNOHANG) == childpid) { waitpid (childpid, &status, WUNTRACED); break; } } } } else { mkdir (path, 0777); } } free (path); refresh_event (whichside->list, whichside); if (debug) printf ("End mkdir_event()\n");}voidabout_event (GtkWidget * widget, GdkEvent * event, gpointer Data){ if (debug) printf ("In about_event()\n"); warnme ("about MToolsFM", ABOUTMFM);}voiduse_event (GtkWidget * widget, GdkEvent * event, gpointer Data){ if (debug) printf ("In use_event()\n"); warnme ("How to use MToolsFM", MFMUSE);}voidcommand_event (GtkWidget * widget, GdkEvent * event, gpointer Data){ if (debug) printf ("In command_event()\n"); warnme ("Command line options", MFMOPTIONS);}voidcombo_change (GtkWidget * widget, side * whichside){ char *string; if (debug) printf ("In combo_change()\n"); string = gtk_entry_get_text (GTK_ENTRY (widget)); if (strcmp (string, "Harddisk")) { whichside->drive = string[0]; clearpath (whichside); } else { whichside->drive = '\0'; clearpath (whichside); gethdpath (whichside); } refresh_event (whichside->list, whichside); if (debug) printf ("End combo_change()\n"); return;}gintdclick_callback (GtkWidget * widget, gint row, gint column, GdkEventButton * event, side * whichside){ long totsize = 0; GList *items; char *path, *drivepath; if (debug) printf ("In dclick_callback()\n"); items = GTK_CLIST (whichside->list)->selection; while (items) { totsize += ((dentry *) gtk_clist_get_row_data (GTK_CLIST (whichside->list), (int) (items->data)))->size; items = items->next; } whichside->totsize = totsize; getpath (whichside, &path); drivepath = malloc ((strlen (path) + 30) * sizeof (char)); sprintf (drivepath, "%li bytes selected in ", totsize); if (whichside->drive) sprintf (drivepath + strlen (drivepath), "%c:", whichside->drive); strcat (drivepath, path); gtk_statusbar_pop (GTK_STATUSBAR (whichside->status), whichside->context); gtk_statusbar_push (GTK_STATUSBAR (whichside->status), whichside->context, drivepath); free (path); free (drivepath); if (event && (event->type == GDK_2BUTTON_PRESS)) { gchar *text; if (debug) printf (" doubleclick\n"); gtk_clist_unselect_row (GTK_CLIST (widget), row, column); gtk_clist_get_text (GTK_CLIST (widget), row, 1, &text); if ( ((dentry *) gtk_clist_get_row_data (GTK_CLIST (whichside->list), row))->dir) { if (strcmp (text, "..") && (whichside->length < DIR_DEPTH - 1)) { whichside->path[whichside->length] = (gchar *) malloc ((strlen (text) + 1) * sizeof (gchar)); strcpy (whichside->path[whichside->length], text); whichside->length += 1; } else if (whichside->length) { whichside->length -= 1; free (whichside->path[whichside->length]); } refresh_event (widget, whichside); } } if (debug) printf ("End dclick_callback()\n"); return (FALSE);}gintrclick_callback (GtkWidget * widget, GdkEventButton * event, side * whichside){ if (debug) printf ("In rclick_callback()\n"); if (event && (event->type == GDK_BUTTON_PRESS) && (event->button == 3)) { gtk_menu_popup (GTK_MENU (whichside->contextmenu), NULL, NULL, NULL, NULL, event->button, event->time); return (TRUE); } else return (FALSE);}gint sort_callback (GtkWidget * widget, gint column, side * whichside){ if (debug) printf ("In sort_callback()\n"); if (column > 0) { gtk_clist_set_sort_column (GTK_CLIST (whichside->list), column); gtk_clist_sort (GTK_CLIST (whichside->list)); } return (TRUE);}void sort_now( GtkCheckMenuItem * MenuItem, side * left ){ gtk_clist_sort( GTK_CLIST(left->list) ); gtk_clist_sort( GTK_CLIST(left->other->list) );}intdatecompare (const char *text1, const char *text2){ int comp; if (!text2) return (text1 != NULL); if (!text1) return -1; if ((comp = memcmp (text1 + 6, text2 + 6, 4)) < 0) return -1; else if (comp > 0) return 1; if ((comp = memcmp (text1, text2, 2)) < 0) return -1; else if (comp > 0) return 1; if ((comp = memcmp (text1 + 3, text2 + 3, 2)) < 0) return -1; else if (comp > 0) return 1; return 0;}static gintsortnew (GtkCList * clist, gconstpointer ptr1, gconstpointer ptr2){ char *name1 = NULL; char *name2 = NULL; GtkCListRow *row1 = (GtkCListRow *) ptr1; GtkCListRow *row2 = (GtkCListRow *) ptr2; dentry *d1 = (dentry *) row1->data; dentry *d2 = (dentry *) row2->data; name1 = GTK_CELL_TEXT (row1->cell[1])->text; name2 = GTK_CELL_TEXT (row2->cell[1])->text; if(GTK_CHECK_MENU_ITEM (dirfirst)->active) { if( (d1->dir + d2->dir) & 1 ) return (d1->dir < d2->dir); } if (clist->sort_column == 2) return(d1->size < d2->size); else if ((clist->sort_column == 3) || (clist->sort_column == 4)) { char *textdate1 = NULL; char *textdate2 = NULL; char *texttime1 = NULL; char *texttime2 = NULL; int comp; textdate1 = GTK_CELL_TEXT (row1->cell[3])->text; textdate2 = GTK_CELL_TEXT (row2->cell[3])->text; texttime1 = GTK_CELL_TEXT (row1->cell[4])->text; texttime2 = GTK_CELL_TEXT (row2->cell[4])->text; if ((comp = datecompare (textdate1, textdate2))) return comp; return (strcmp (texttime1, texttime2)); } else return (*default_compare_func) (clist, ptr1, ptr2);}void resize_event(GtkWidget *widget, GdkEventConfigure *event, side *left){ side *right=left->other; int boxwidth; if (debug) printf ("In resize_event()\n"); boxwidth=(widget->allocation.width-30-middlebox->allocation.width)/2; gtk_widget_set_usize (left->box, boxwidth, 200); gtk_widget_set_usize (right->box, boxwidth, 200);}GtkWidget *create_side (side * whichside, char *copytext){ GtkItemFactoryEntry menu_items[] = { {"/_File", NULL, NULL, 0, "<Branch>"}, {"/File/Delete", NULL, NULL, 0, NULL}, {"/File/Rename", NULL, NULL, 0, NULL}, {"/File/Print", NULL, NULL, 0, NULL}, {"/File/Make directory", NULL, NULL, 0, NULL}, {"/_View", NULL, NULL, 0, "<Branch>"}, {"/View/Refresh", NULL, NULL, 0, NULL}, {"/_Select", NULL, NULL, 0, "<Branch>"}, {"/Select/All", NULL, NULL, 0, NULL}, {"/Select/None", NULL, NULL, 0, NULL} }; GtkItemFactory *item_factory; GtkWidget *popup_item; GtkWidget *box, *inbox, *menubar;#ifndef OLDGTK GtkWidget *scroll;#endif if (debug) printf ("In create_side()\n"); box = gtk_vbox_new (FALSE, 5); whichside->box=box; /* menubar, combobox for drive */ inbox = gtk_hbox_new (FALSE, 0); item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", NULL); gtk_item_factory_create_items (item_factory, sizeof (menu_items) / sizeof (menu_items[0]), menu_items, NULL); menubar = gtk_item_factory_get_widget (item_factory, "<main>"); gtk_signal_connect (GTK_OBJECT (gtk_item_factory_get_widget (item_factory, "/File/Delete")), "activate", GTK_SIGNAL_FUNC (filedelete_event), whichside); gtk_signal_connect (GTK_OBJECT (gtk_item_factory_get_widget (item_factory, "/File/Rename")), "activate", GTK_SIGNAL_FUNC (filerename_event), whichside); gtk_signal_connect (GTK_OBJECT (gtk_item_factory_get_widget (item_factory, "/File/Print")), "activate", GTK_SIGNAL_FUNC (fileprint_event), whichside); gtk_signal_connect (GTK_OBJECT (gtk_item_factory_get_widget (item_factory, "/File/Make directory")), "activate", GTK_SIGNAL_FUNC (mkdir_event), whichside); gtk_signal_connect (GTK_OBJECT (gtk_item_factory_get_widget (item_factory, "/View/Refresh")), "activate", GTK_SIGNAL_FUNC (refresh_event), whichside); gtk_signal_connect (GTK_OBJECT (gtk_item_factory_get_widget (item_factory, "/Select/All")), "activate", GTK_SIGNAL_FUNC (selectall_event), whichside); gtk_signal_connect (GTK_OBJECT (gtk_item_factory_get_widget (item_factory, "/Select/None")), "activate", GTK_SIGNAL_FUNC (selectnone_event), whichside); gtk_box_pack_start (GTK_BOX (inbox), menubar, TRUE, TRUE, 5); whichside->combo = gtk_combo_new (); whichside->comboglist = NULL;#ifndef OLDGTK gtk_widget_set_usize (whichside->combo, 80, 0);#endif gtk_entry_set_editable (GTK_ENTRY (GTK_COMBO (whichside->combo)->entry), FALSE); set_combo_entries (whichside); if (!whichside->drive) gethdpath (whichside); gtk_box_pack_end (GTK_BOX (inbox), whichside->combo, FALSE, TRUE, 5); gtk_widget_show (menubar); gtk_widget_show (whichside->combo); gtk_box_pack_start (GTK_BOX (box), inbox, FALSE, TRUE, 0); gtk_widget_show (inbox); gtk_signal_connect (GTK_OBJECT (GTK_COMBO (whichside->combo)->entry), "changed", GTK_SIGNAL_FUNC (combo_change), whichside); /* clist and scrollbars */#ifndef OLDGTK scroll = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (box), scroll, TRUE, TRUE, 0);#endif whichside->list = gtk_clist_new (5); gtk_clist_column_titles_show (GTK_CLIST (whichside->list)); gtk_clist_set_selection_mode (GTK_CLIST (whichside->list), GTK_SELECTION_EXTENDED); gtk_clist_column_titles_passive (GTK_CLIST (whichside->list));#ifndef OLDGTK gtk_container_add (GTK_CONTAINER (scroll), whichside->list);#else gtk_clist_set_policy (GTK_CLIST (whichside->list), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (box), whichside->list, TRUE, TRUE, 0);#endif gtk_clist_set_column_title (GTK_CLIST (whichside->list), 0, (gchar *) ""); gtk_clist_set_column_title (GTK_CLIST (whichside->list), 1, (gchar *) "Filename"); gtk_clist_set_column_title (GTK_CLIST (whichside->list), 2, (gchar *) "Size"); gtk_clist_set_column_title (GTK_CLIST (whichside->list), 3, (gchar *) "Date"); gtk_clist_set_column_title (GTK_CLIST (whichside->list), 4, (gchar *) "Time");#ifdef NOPIXMAPS gtk_clist_set_column_width (GTK_CLIST (whichside->list), 0, 0);#else gtk_clist_set_column_width (GTK_CLIST (whichside->list), 0, 20);#endif gtk_clist_set_column_width (GTK_CLIST (whichside->list), 1, 110); gtk_clist_set_column_width (GTK_CLIST (whichside->list), 2, 50); gtk_clist_set_column_width (GTK_CLIST (whichside->list), 3, 75); gtk_clist_set_column_width (GTK_CLIST (whichside->list), 4, 30); gtk_clist_set_column_justification (GTK_CLIST (whichside->list), 2, GTK_JUSTIFY_RIGHT); gtk_clist_set_sort_column (GTK_CLIST (whichside->list), 1); gtk_clist_set_auto_sort (GTK_CLIST (whichside->list), FALSE); gtk_signal_connect (GTK_OBJECT (whichside->list), "select_row", GTK_SIGNAL_FUNC (dclick_callback), whichside); gtk_signal_connect (GTK_OBJECT (whichside->list), "unselect_row", GTK_SIGNAL_FUNC (dclick_callback), whichside); gtk_signal_connect (GTK_OBJECT (whichside->list), "button-press-event", GTK_SIGNAL_FUNC (rclick_callback), whichside); gtk_signal_connect (GTK_OBJECT (whichside->list), "click-column", GTK_SIGNAL_FUNC (sort_callback), whichside); default_compare_func = GTK_CLIST (whichside->list)->compare; gtk_clist_set_compare_func (GTK_CLIST (whichside->list), sortnew); gtk_widget_show (whichside->list);#ifndef OLDGTK gtk_widget_show (scroll);#endif /* status bar */ whichside->status = gtk_statusbar_new (); gtk_box_pack_start (GTK_BOX (box), whichside->status, FALSE, TRUE, 0); whichside->context = gtk_statusbar_get_context_id (GTK_STATUSBAR (whichside->status), "left window"); gtk_statusbar_pop (GTK_STATUSBAR (whichside->status), whichside->context); gtk_statusbar_push (GTK_STATUSBAR (whichside->status), whichside->context, ""); gtk_widget_show (whichside->status); gtk_widget_show (box); /* context menu */ whichside->contextmenu = gtk_menu_new (); popup_item = gtk_menu_item_new_with_label ("Delete"); gtk_menu_append (GTK_MENU (whichside->contextmenu), popup_item); gtk_signal_connect (GTK_OBJECT (popup_item), "activate", GTK_SIGNAL_FUNC (filedelete_event), whichside); gtk_widget_show (popup_item); popup_item = gtk_menu_item_new_with_label ("Rename"); gtk_menu_append (GTK_MENU (whichside->contextmenu), popup_item); gtk_signal_connect (GTK_OBJECT (popup_item), "activate", GTK_SIGNAL_FUNC (filerename_event), whichside); gtk_widget_show (popup_item); popup_item = gtk_menu_item_new_with_label ("Print"); gtk_menu_append (GTK_MENU (whichside->contextmenu), popup_item); gtk_signal_connect (GTK_OBJECT (popup_item), "activate", GTK_SIGNAL_FUNC (fileprint_event), whichside); gtk_widget_show (popup_item); popup_item = gtk_menu_item_new_with_label (copytext); gtk_menu_append (GTK_MENU (whichside->contextmenu), popup_item); gtk_signal_connect (GTK_OBJECT (popup_item),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -