📄 fe_gtk_main.c
字号:
extra_info = malloc (sizeof (struct ctree_attachment)); extra_info->file_or_site = IS_A_SITE; extra_info->info_struct = (void *) site_to_add; gtk_ctree_node_set_row_data (GTK_CTREE (the_tree), site_im_adding, (gpointer) extra_info); /* Colour it to reflect status */ /* color_site_node (GTK_CTREE_NODE (site_im_adding), site_to_add);*/ gtk_ctree_select (GTK_CTREE (the_tree), GTK_CTREE_NODE (site_im_adding)); if (GTK_TOGGLE_BUTTON (widgets->catchup_choice)->active) { catchup_selected(GNOME_YES, NULL); } else { initialize_selected(GNOME_YES, NULL); } DEBUG(DEBUG_GNOME, "Our work here is done.\n"); rcfile_saved = false; /*gtk_widget_hide (popup_win);*/ close_wizard(); return;}void select_ctree_cb (GtkCTree *ctree, GtkCTreeNode *node, gpointer data) { GtkCTreeNode *parent; struct site_t *current_site; struct site_file_t *current_file; void *data_to_get; struct ctree_attachment *actual_data; /* Make sure that any changes have been confirmed on the selected site, * before selected_site gets changed. This seems to get automatically done * by the signal handler. */ current_site = malloc (sizeof (struct site_t)); if (GTK_CTREE_ROW (node)->parent == NULL) { /* We're at the top level */ if ( (data_to_get = gtk_ctree_node_get_row_data (GTK_CTREE (ctree), GTK_CTREE_NODE (node))) == NULL) { DEBUG(DEBUG_GNOME, "\"Data get\" returned NULL. Oh dear.\n"); } actual_data = (struct ctree_attachment *) data_to_get; if (actual_data->file_or_site != IS_A_SITE) DEBUG(DEBUG_GNOME, "Somehow you've clicked on a site, but ended up with file data!\n"); current_site = (struct site_t *) actual_data->info_struct; /* Make the data shared */ selected_site = current_site; current_site_node = node; gtk_container_remove (GTK_CONTAINER (main_area_box), area_data); area_data = make_site_info_area (current_site); gtk_container_add (GTK_CONTAINER (main_area_box), area_data); } else if (GTK_CTREE_ROW (node)->parent != NULL) { parent = GTK_CTREE_ROW (node)->parent; /* Grab the file data from that row */ if ( (data_to_get = gtk_ctree_node_get_row_data (GTK_CTREE (ctree), GTK_CTREE_NODE (node))) == NULL) { DEBUG(DEBUG_GNOME, "\"Data get\" for the file returned NULL. Oh dear.\n"); } actual_data = (struct ctree_attachment *) data_to_get; if (actual_data->file_or_site != IS_A_FILE) DEBUG(DEBUG_GNOME, "Somehow you've clicked on a file, but ended up with site data!\n"); current_file = (struct site_file_t *) actual_data->info_struct; /* Grab the site data from the file's parent */ while (GTK_CTREE_ROW (parent)->parent != NULL) { parent = GTK_CTREE_ROW(parent)->parent; DEBUG(DEBUG_GNOME, "Assigned parent to node->parent.\n"); } if ( (data_to_get = gtk_ctree_node_get_row_data (GTK_CTREE (ctree), GTK_CTREE_NODE (parent))) == NULL) { DEBUG(DEBUG_GNOME, "\"Data get\" for the file's parent returned NULL. Oh dear.\n"); } actual_data = (struct ctree_attachment *) data_to_get; if (actual_data->file_or_site != IS_A_SITE) DEBUG(DEBUG_GNOME, "Somehow you've clicked on a file, but it's parent was a file too!?\n"); current_site = (struct site_t *) actual_data->info_struct; selected_site = current_site; current_site_node = parent; if (current_file == NULL) { fe_status ("Unable to access info about the selected file."); } else { gtk_container_remove (GTK_CONTAINER (main_area_box), area_data); area_data = make_file_info_area (current_file); gtk_container_add (GTK_CONTAINER (main_area_box), area_data); } } else { g_print ("If you got to here, something is really buggered, quite frankly.\n"); }}GtkWidget *create_default_main_area (void) { GtkWidget *vbox, *label; vbox = gtk_vbox_new (FALSE, 5); label = gtk_label_new ("No site is currently selected.\n\nPlease choose one from the tree view\non the left before proceeding with any more operations."); gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 10); gtk_widget_show (label); gtk_widget_show (vbox); return vbox;}GtkWidget *create_initial_main_area (void) { GtkWidget *vbox, *label; gchar *summary; gint num_that_need_updates = 0; struct site_t *tmp_site; vbox = gtk_vbox_new (FALSE, 10); /* TODO: Add some checking to see if this is the first time they've run sitecopy, * change greeting accordingly. */ label = gtk_label_new ("\nWelcome to XSitecopy!\n\n"); gtk_box_pack_start (GTK_BOX (vbox), label, TRUE, TRUE, 10); gtk_widget_show (label); for (tmp_site = all_sites; tmp_site != NULL; tmp_site = tmp_site->next) { if (tmp_site->is_different) { summary = (char *) malloc (strlen (tmp_site->name) + 32); sprintf (summary, "The site '%s' requires an update.", tmp_site->name); label = gtk_label_new (summary); gtk_widget_show (label); free (summary); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 1); num_that_need_updates++; } } if (all_sites == NULL) { label = gtk_label_new ("Click on \"New site\" to begin using the program."); gtk_widget_show (label); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); } else if (num_that_need_updates == 0) { label = gtk_label_new ("All local sites are fully synchronized with the remote sites."); gtk_widget_show (label); gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 10); } gtk_widget_show (vbox); return vbox;}void site_report (void) { gtk_container_remove (GTK_CONTAINER (main_area_box), area_data); area_data = create_initial_main_area (); gtk_container_add (GTK_CONTAINER (main_area_box), area_data);}void site_web_report (void) { gchar lee[BUFSIZ]; gchar *command_to_exec; if (selected_site == NULL) { fe_status ("For a report to be generated, a site must be selected."); return; } /* FIXME: path */ sprintf (lee, "sitecopy -ll %s | awk -f changes.awk > /tmp/xsitecopy_report.html", selected_site->name); command_to_exec = (gchar *) malloc (strlen (lee) + 1); /* Using snprintf to maybe try and add just a teeny bit of security? */ snprintf (command_to_exec, (strlen(lee) + 1), lee); system (command_to_exec); system ("gnome-moz-remote --newwin /tmp/xsitecopy_report.html");}void redraw_main_area (void) { gtk_container_remove (GTK_CONTAINER (main_area_box), area_data); area_data = make_site_info_area (selected_site); gtk_container_add (GTK_CONTAINER (main_area_box), area_data);}void clear_main_area (void) { selected_site = NULL; gtk_container_remove (GTK_CONTAINER (main_area_box), area_data); area_data = create_default_main_area(); gtk_container_add (GTK_CONTAINER (main_area_box), area_data);}void populate_site_node (GtkCTreeNode *site_node, struct site_t *current) { struct ctree_attachment *file_info_to_add; struct site_file_t *current_file; gchar *node_label[1]; GtkCTreeNode *file_im_adding; extern gboolean fancy_tree; for (current_file = current->files; current_file != NULL; current_file = current_file->next ) { file_info_to_add = malloc (sizeof (struct ctree_attachment)); file_info_to_add->file_or_site = IS_A_FILE; file_info_to_add->sorted_yet = MESSY; file_info_to_add->info_struct = (void *) current_file; node_label[0] = current_file->rel_local + 1; if (current_file->dir) { file_im_adding = gtk_ctree_insert_node (GTK_CTREE (the_tree), GTK_CTREE_NODE (site_node), NULL, node_label, 3, closed_dir, dir1_map, open_dir, dir2_map, false, false); } else { if (current_file->diff != file_unchanged) { if (current_file->diff == file_changed) { file_im_adding = gtk_ctree_insert_node (GTK_CTREE (the_tree), GTK_CTREE_NODE (site_node), NULL, node_label, 3, orange_file, orange_file_map, orange_file, orange_file_map, FALSE, FALSE); } else { file_im_adding = gtk_ctree_insert_node (GTK_CTREE (the_tree), GTK_CTREE_NODE (site_node), NULL, node_label, 3, red_file, red_file_map, red_file, red_file_map, FALSE, FALSE); } } else { file_im_adding = gtk_ctree_insert_node (GTK_CTREE (the_tree), GTK_CTREE_NODE (site_node), NULL, node_label, 3, green_file, green_file_map, green_file, green_file_map, FALSE, FALSE); } } gtk_ctree_node_set_row_data (GTK_CTREE (the_tree), file_im_adding, (gpointer) file_info_to_add); file_item = file_im_adding; if (fancy_tree) { if (current_file->dir) { gtk_ctree_post_recursive (GTK_CTREE (the_tree), site_node, GTK_CTREE_FUNC (check_dir), (gpointer) file_item); } } /* fancy_tree */ } /* for loop */} /* This is all a bit hacky, and the growth rate is god awful */int check_dir (GtkCTree *bler, GtkCTreeNode *node, gpointer data) { struct ctree_attachment *folder, *files, *info_to_add; GtkCTreeNode *tmp1, *just_moved; struct site_file_t *tmpy1, *tmpy2; char *folder_name; gchar *node_label2[1]; /*folder = malloc (sizeof (struct ctree_attachment));*/ tmp1 = GTK_CTREE_NODE (data); files = malloc (sizeof (struct ctree_attachment)); files = (struct ctree_attachment *) gtk_ctree_node_get_row_data (GTK_CTREE (the_tree), GTK_CTREE_NODE (node)); folder = (struct ctree_attachment *) gtk_ctree_node_get_row_data (GTK_CTREE (the_tree), GTK_CTREE_NODE (tmp1)); if (files == NULL) { return 0; } else { if (files->sorted_yet == ORGANIZED) return 2; if ( (tmpy1 = (struct site_file_t *) files->info_struct) == NULL) return 1; } if (folder == NULL) { return 0; } else { if ( (tmpy2 = (struct site_file_t *) folder->info_struct) == NULL) return 1; } /* ******************************** * This is just not working when a port is specified in the rcfile. * It's madness, sheer madness.... */ /* Okay, so they're directories not folders. */ folder_name = malloc (BUFSIZ); memset (folder_name, 0, BUFSIZ); if (tmpy2->rel_local == NULL) return 2; strcpy (folder_name, tmpy2->rel_local); /* The 'tree' is the directory we're testing this file against, so the name * of tmpy2 (ie tmpy2->rel_local) is in fact the folder name. */ folder_name = realloc (folder_name, strlen(folder_name) + 2); folder_name++; /* Directories have a trailing slash, file names don't, so i add one. */ strcat (folder_name, "/"); /* debugging */ DEBUG(DEBUG_GNOME, "About to compare folder name (%s) with file's directory (%s).\n", folder_name, tmpy1->directory); DEBUG(DEBUG_GNOME, "Folder's filename is: %s\n", tmpy2->rel_local); /* 'node' is the current node we're looking at from the post-recursion */ if ( (tmpy1 != NULL) && (tmpy1->directory != NULL) && (folder_name != NULL) ) { if (strcmp (tmpy1->directory, folder_name) == 0) { /* gtk_ctree_move (GTK_CTREE (the_tree), node, tmp1, NULL);*/ node_label2[0] = tmpy1->filename; gtk_ctree_remove_node (GTK_CTREE (the_tree), node); info_to_add = malloc (sizeof (struct ctree_attachment)); info_to_add->file_or_site = IS_A_FILE; info_to_add->sorted_yet = ORGANIZED; info_to_add->info_struct = (void *) tmpy1; /* I want to set a different pixmap depending on file status, * so I do a quick comparison. */ if (tmpy1->diff != file_unchanged) { if (tmpy1->diff == file_changed) { just_moved = gtk_ctree_insert_node (GTK_CTREE (the_tree), GTK_CTREE_NODE (file_item), NULL, node_label2, 3, orange_file, orange_file_map, orange_file, orange_file_map, FALSE, FALSE); } else { just_moved = gtk_ctree_insert_node (GTK_CTREE (the_tree), GTK_CTREE_NODE (file_item), NULL, node_label2, 3, red_file, red_file_map, red_file, red_file_map, FALSE, FALSE); } } else { just_moved = gtk_ctree_insert_node (GTK_CTREE (the_tree), GTK_CTREE_NODE (file_item), NULL, node_label2, 3, green_file, green_file_map, green_file, green_file_map, FALSE, FALSE); } gtk_ctree_node_set_row_data (GTK_CTREE (the_tree), GTK_CTREE_NODE (just_moved), (gpointer) info_to_add); } } folder_name--; free (folder_name); return 2;}void check_site_and_record_errors(struct site_t *current) { char *errstr; int ret = rc_verifysite( current ); if (!ret) return; errstr = (char *) malloc (BUFSIZ); switch( ret ) { /* Everything was fine */ case 0: return; case SITE_NOSERVER: sprintf(errstr, _("Server not specified in site `%s'.\n"), current->name ); break; case SITE_NOUSERNAME: sprintf(errstr, _("Username not specified in site `%s'.\n"), current->name ); break; case SITE_NOPASSWORD: sprintf(errstr, _("Password not specified in site `%s'.\n"), current->name ); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -