From c4d1ece421b3c7fb5f0b13c042d124671734afe2 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Sun, 3 Aug 2014 10:12:18 +0100 Subject: extend viewdata to files and use it for box tree dump --- gtk/scaffolding.c | 54 +++++++---------- gtk/viewdata.c | 177 ++++++++++++++++++++++++++++++++++++++++++++++-------- gtk/viewdata.h | 12 ++++ 3 files changed, 186 insertions(+), 57 deletions(-) diff --git a/gtk/scaffolding.c b/gtk/scaffolding.c index 0e6e8bccd..aed323e45 100644 --- a/gtk/scaffolding.c +++ b/gtk/scaffolding.c @@ -72,6 +72,7 @@ #include "gtk/scaffolding.h" #include "gtk/tabs.h" #include "gtk/schedule.h" +#include "gtk/viewdata.h" /** Macro to define a handler for menu, button and activate events. */ #define MULTIHANDLER(q)\ @@ -1295,44 +1296,35 @@ MULTIHANDLER(toggledebugging) MULTIHANDLER(debugboxtree) { - GtkWidget *save_dialog; - - save_dialog = gtk_file_chooser_dialog_new("Save File", g->window, - GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, - NULL); - - gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(save_dialog), - getenv("HOME") ? getenv("HOME") : "/"); - - gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(save_dialog), - "boxtree.txt"); + gchar *fname; + gint handle; + FILE *f; + struct browser_window *bw; - if (gtk_dialog_run(GTK_DIALOG(save_dialog)) == GTK_RESPONSE_ACCEPT) { - gchar *filename = gtk_file_chooser_get_filename( - GTK_FILE_CHOOSER(save_dialog)); - FILE *fh; + handle = g_file_open_tmp("nsgtkboxtreeXXXXXX", &fname, NULL); + if ((handle == -1) || (fname == NULL)) { + return TRUE; + } + close(handle); /* in case it was binary mode */ - LOG(("Saving box tree dump to %s...\n", filename)); + /* save data to temporary file */ + f = fopen(fname, "w"); + if (f == NULL) { + warn_user("Error saving box tree dump.", + "Unable to open file for writing."); + unlink(fname); + return TRUE; + } - fh = fopen((const char *) filename, "w"); - if (fh == NULL) { - warn_user("Error saving box tree dump.", - "Unable to open file for writing."); - } else { - struct browser_window *bw; - bw = nsgtk_get_browser_window(g->top_level); + bw = nsgtk_get_browser_window(g->top_level); - browser_window_debug_dump(bw, fh); + browser_window_debug_dump(bw, f); - fclose(fh); - } + fclose(f); - g_free(filename); - } + nsgtk_viewfile("Box Tree Debug", "boxtree", fname); - gtk_widget_destroy(save_dialog); + g_free(fname); return TRUE; } diff --git a/gtk/viewdata.c b/gtk/viewdata.c index cb6e7c8de..1eb78ccf1 100644 --- a/gtk/viewdata.c +++ b/gtk/viewdata.c @@ -447,27 +447,95 @@ window_init(const char *title, } /** - * create a new tab with page source + * open a window to dispaly an existing file. + */ +static nserror +window_init_fname(const char *title, + const char *leafname, + const char *filename) +{ + nserror ret; + FILE *f; + char *ndata; + size_t ndata_len; + + f = fopen(filename, "r"); + if (f == NULL) { + return NSERROR_NOT_FOUND; + } + if (fseek(f, 0, SEEK_END) != 0) { + fclose(f); + return NSERROR_BAD_SIZE; + } + + ndata_len = ftell(f); + + if (fseek(f, 0, SEEK_SET) != 0) { + fclose(f); + return NSERROR_BAD_SIZE; + } + + ndata = malloc(ndata_len); + + fread(ndata, 1, ndata_len, f); + + fclose(f); + + ret = window_init(title, leafname, ndata, ndata_len); + + free(ndata); + + return ret; +} + +/** + * open a new tab from an existing file. + */ +static nserror +tab_init_fname(const char *title, + const char *leafname, + const char *fname) +{ + nsurl *url; + nserror ret; + + /* Open tab on temporary file */ + ret = netsurf_path_to_nsurl(fname, &url); + if (ret != NSERROR_OK) { + return ret; + } + + /* open tab on temportary file */ + ret = browser_window_create(BW_CREATE_TAB | BW_CREATE_HISTORY, url, NULL, NULL, NULL); + nsurl_unref(url); + if (ret != NSERROR_OK) { + return ret; + } + + return NSERROR_OK; +} + +/** + * create a new tab from data. */ static nserror tab_init(const char *title, - const char *filename, + const char *leafname, char *ndata, size_t ndata_len) { - nsurl *url; nserror ret; gchar *fname; gint handle; FILE *f; - handle = g_file_open_tmp("nsgtksourceXXXXXX", &fname, NULL); + handle = g_file_open_tmp("nsgtkdataXXXXXX", &fname, NULL); if ((handle == -1) || (fname == NULL)) { return NSERROR_SAVE_FAILED; } close(handle); /* in case it was binary mode */ - /* save data to temportary file */ + /* save data to temporary file */ f = fopen(fname, "w"); if (f == NULL) { warn_user(messages_get("gtkSourceTabError"), 0); @@ -477,33 +545,23 @@ tab_init(const char *title, fprintf(f, "%s", ndata); fclose(f); - /* Open tab on temporary file */ - ret = netsurf_path_to_nsurl(fname, &url); - g_free(fname); - if (ret != NSERROR_OK) { - return ret; - } - - /* open tab on temportary file */ - ret = browser_window_create(BW_CREATE_TAB | BW_CREATE_HISTORY, url, NULL, NULL, NULL); - nsurl_unref(url); - if (ret != NSERROR_OK) { - return ret; + ret = tab_init_fname(title, leafname, fname); + if (ret == NSERROR_OK) { + free(ndata); } - free(ndata); + g_free(fname); - return NSERROR_OK; + return ret; } /** - * create a new tab with page source + * open an editor from an existing file. */ static nserror -editor_init(const char *title, - const char *filename, - char *ndata, - size_t ndata_len) +editor_init_fname(const char *title, + const char *leafname, + const char *fname) { /* find user configured app for opening text/plain */ @@ -527,10 +585,48 @@ editor_init(const char *title, * * execute target app on saved data */ + return NSERROR_OK; +} - free(ndata); +/** + * create a new tab with page source + */ +static nserror +editor_init(const char *title, + const char *leafname, + char *ndata, + size_t ndata_len) +{ - return NSERROR_OK; + nserror ret; + gchar *fname; + gint handle; + FILE *f; + + handle = g_file_open_tmp("nsgtkdataXXXXXX", &fname, NULL); + if ((handle == -1) || (fname == NULL)) { + return NSERROR_SAVE_FAILED; + } + close(handle); /* in case it was binary mode */ + + /* save data to temporary file */ + f = fopen(fname, "w"); + if (f == NULL) { + warn_user(messages_get("gtkSourceTabError"), 0); + g_free(fname); + return NSERROR_SAVE_FAILED; + } + fprintf(f, "%s", ndata); + fclose(f); + + ret = editor_init_fname(title, leafname, fname); + if (ret == NSERROR_OK) { + free(ndata); + } + + g_free(fname); + + return ret; } /* exported interface documented in gtk/viewdata.h */ @@ -565,5 +661,34 @@ nsgtk_viewdata(const char *title, } + return ret; +} + +/* exported interface documented in gtk/viewdata.h */ +nserror +nsgtk_viewfile(const char *title, + const char *leafname, + const char *filename) +{ + nserror ret; + + switch (nsoption_int(developer_view)) { + case 0: + ret = window_init_fname(title, leafname, filename); + break; + + case 1: + ret = tab_init_fname(title, leafname, filename); + break; + + case 2: + ret = editor_init_fname(title, leafname, filename); + break; + + default: + ret = NSERROR_BAD_PARAMETER; + break; + } + return ret; } diff --git a/gtk/viewdata.h b/gtk/viewdata.h index 020603d6c..1767b4821 100644 --- a/gtk/viewdata.h +++ b/gtk/viewdata.h @@ -33,4 +33,16 @@ */ nserror nsgtk_viewdata(const char *title, const char *filename, char *data, size_t data_size); +/** + * Display file to a user. + * + * The file is interpreted as utf-8 encoded text and will be presented + * in a window, a tab or an editor as per the user configuration. + * + * \param title The title of the data being displayed. + * \param leafname The suggested leafname to be used. + * \param filename The filename of the data to be viewed. + */ +nserror nsgtk_viewfile(const char *title, const char *leafname, const char *filename); + #endif -- cgit v1.2.3