diff options
Diffstat (limited to 'frontends/gtk')
-rw-r--r-- | frontends/gtk/Makefile | 12 | ||||
-rw-r--r-- | frontends/gtk/bitmap.c | 274 | ||||
-rw-r--r-- | frontends/gtk/bitmap.h | 2 | ||||
-rw-r--r-- | frontends/gtk/cookies.c | 3 | ||||
-rw-r--r-- | frontends/gtk/corewindow.c | 8 | ||||
-rw-r--r-- | frontends/gtk/corewindow.h | 6 | ||||
-rw-r--r-- | frontends/gtk/download.c | 7 | ||||
-rw-r--r-- | frontends/gtk/fetch.c | 1 | ||||
-rw-r--r-- | frontends/gtk/gdk.c | 2 | ||||
-rw-r--r-- | frontends/gtk/global_history.c | 3 | ||||
-rw-r--r-- | frontends/gtk/gui.c | 18 | ||||
-rw-r--r-- | frontends/gtk/hotlist.c | 3 | ||||
-rw-r--r-- | frontends/gtk/local_history.c | 3 | ||||
-rw-r--r-- | frontends/gtk/misc.c | 2 | ||||
-rw-r--r-- | frontends/gtk/page_info.c | 4 | ||||
-rw-r--r-- | frontends/gtk/preferences.c | 58 | ||||
l--------- | frontends/gtk/res/fr/credits.html | 1 | ||||
l--------- | frontends/gtk/res/fr/licence.html | 1 | ||||
l--------- | frontends/gtk/res/fr/welcome.html | 1 | ||||
-rw-r--r-- | frontends/gtk/res/netsurf.gresource.xml | 3 | ||||
-rw-r--r-- | frontends/gtk/scaffolding.c | 13 | ||||
-rw-r--r-- | frontends/gtk/search.c | 3 | ||||
-rw-r--r-- | frontends/gtk/toolbar.c | 15 |
23 files changed, 136 insertions, 307 deletions
diff --git a/frontends/gtk/Makefile b/frontends/gtk/Makefile index 4f3fd5f52..64a0872ba 100644 --- a/frontends/gtk/Makefile +++ b/frontends/gtk/Makefile @@ -11,6 +11,8 @@ NETSURF_FEATURE_RSVG_CFLAGS := -DWITH_RSVG NETSURF_FEATURE_VIDEO_CFLAGS := -DWITH_VIDEO +# determine if the rsvg library API version +RSVG_API := $(shell $(PKG_CONFIG) --atleast-version=2.46 librsvg-2.0 && echo 246) $(eval $(call pkg_config_find_and_add_enabled,RSVG,librsvg-2.0,SVG)) $(eval $(call pkg_config_find_and_add_enabled,VIDEO,gstreamer-0.10,Video)) @@ -32,13 +34,19 @@ ifeq ($(NETSURF_GTK_MAJOR),2) GTKDEPFLAGS += -DGTK_DISABLE_DEPRECATED endif +# C library API control +ifeq ($(HOST),FreeBSD) +CAPIFLAGS := +else +CAPIFLAGS := -D_XOPEN_SOURCE=700 \ + -D_POSIX_C_SOURCE=200809L +endif GTKCFLAGS := -std=c99 -Dgtk -Dnsgtk -g \ $(GTKDEPFLAGS) \ + $(CAPIFLAGS) \ -D_BSD_SOURCE \ -D_DEFAULT_SOURCE \ - -D_XOPEN_SOURCE=700 \ - -D_POSIX_C_SOURCE=200809L \ -D_NETBSD_SOURCE \ -DGTK_RESPATH=\"$(NETSURF_GTK_RES_PATH)\" diff --git a/frontends/gtk/bitmap.c b/frontends/gtk/bitmap.c index e7b859d06..a995a9e28 100644 --- a/frontends/gtk/bitmap.c +++ b/frontends/gtk/bitmap.c @@ -45,22 +45,25 @@ * Create a bitmap. * * \param width width of image in pixels - * \param height width of image in pixels - * \param state a flag word indicating the initial state + * \param height height of image in pixels + * \param flags flags for bitmap creation * \return an opaque struct bitmap, or NULL on memory exhaustion */ -static void *bitmap_create(int width, int height, unsigned int state) +static void *bitmap_create(int width, int height, enum gui_bitmap_flags flags) { struct bitmap *gbitmap; + if (width == 0 || height == 0) { + return NULL; + } + gbitmap = calloc(1, sizeof(struct bitmap)); if (gbitmap != NULL) { - if ((state & BITMAP_OPAQUE) != 0) { - gbitmap->surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, width, height); - } else { - gbitmap->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); + if (flags & BITMAP_OPAQUE) { + gbitmap->opaque = true; } + gbitmap->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); if (cairo_surface_status(gbitmap->surface) != CAIRO_STATUS_SUCCESS) { cairo_surface_destroy(gbitmap->surface); free(gbitmap); @@ -81,76 +84,8 @@ static void *bitmap_create(int width, int height, unsigned int state) static void bitmap_set_opaque(void *vbitmap, bool opaque) { struct bitmap *gbitmap = (struct bitmap *)vbitmap; - cairo_format_t fmt; - cairo_surface_t *nsurface = NULL; - - assert(gbitmap); - - fmt = cairo_image_surface_get_format(gbitmap->surface); - if (fmt == CAIRO_FORMAT_RGB24) { - if (opaque == false) { - /* opaque to transparent */ - nsurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, - cairo_image_surface_get_width(gbitmap->surface), - cairo_image_surface_get_height(gbitmap->surface)); - - } - - } else { - if (opaque == true) { - /* transparent to opaque */ - nsurface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, - cairo_image_surface_get_width(gbitmap->surface), - cairo_image_surface_get_height(gbitmap->surface)); - - } - } - - if (nsurface != NULL) { - if (cairo_surface_status(nsurface) != CAIRO_STATUS_SUCCESS) { - cairo_surface_destroy(nsurface); - } else { - memcpy(cairo_image_surface_get_data(nsurface), - cairo_image_surface_get_data(gbitmap->surface), - cairo_image_surface_get_stride(gbitmap->surface) * cairo_image_surface_get_height(gbitmap->surface)); - cairo_surface_destroy(gbitmap->surface); - gbitmap->surface = nsurface; - - cairo_surface_mark_dirty(gbitmap->surface); - - } - } -} - - -/** - * Tests whether a bitmap has an opaque alpha channel - * - * \param vbitmap a bitmap, as returned by bitmap_create() - * \return whether the bitmap is opaque - */ -static bool bitmap_test_opaque(void *vbitmap) -{ - struct bitmap *gbitmap = (struct bitmap *)vbitmap; - unsigned char *pixels; - int pcount; - int ploop; - - assert(gbitmap); - - pixels = cairo_image_surface_get_data(gbitmap->surface); - - pcount = cairo_image_surface_get_stride(gbitmap->surface) * - cairo_image_surface_get_height(gbitmap->surface); - - for (ploop = 3; ploop < pcount; ploop += 4) { - if (pixels[ploop] != 0xff) { - return false; - } - } - - return true; + gbitmap->opaque = opaque; } @@ -162,16 +97,8 @@ static bool bitmap_test_opaque(void *vbitmap) static bool bitmap_get_opaque(void *vbitmap) { struct bitmap *gbitmap = (struct bitmap *)vbitmap; - cairo_format_t fmt; - - assert(gbitmap); - - fmt = cairo_image_surface_get_format(gbitmap->surface); - if (fmt == CAIRO_FORMAT_RGB24) { - return true; - } - return false; + return gbitmap->opaque; } @@ -187,83 +114,13 @@ static bool bitmap_get_opaque(void *vbitmap) static unsigned char *bitmap_get_buffer(void *vbitmap) { struct bitmap *gbitmap = (struct bitmap *)vbitmap; - int pixel_loop; - int pixel_count; uint8_t *pixels; - uint32_t t, r, g, b; - cairo_format_t fmt; assert(gbitmap); cairo_surface_flush(gbitmap->surface); pixels = cairo_image_surface_get_data(gbitmap->surface); - if (!gbitmap->converted) - return pixels; - - fmt = cairo_image_surface_get_format(gbitmap->surface); - pixel_count = cairo_image_surface_get_width(gbitmap->surface) * - cairo_image_surface_get_height(gbitmap->surface); - - if (fmt == CAIRO_FORMAT_RGB24) { - /* Opaque image */ - for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) { - /* Cairo surface is ARGB, written in native endian */ -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - b = pixels[4 * pixel_loop + 0]; - g = pixels[4 * pixel_loop + 1]; - r = pixels[4 * pixel_loop + 2]; - t = pixels[4 * pixel_loop + 3]; -#else - t = pixels[4 * pixel_loop + 0]; - r = pixels[4 * pixel_loop + 1]; - g = pixels[4 * pixel_loop + 2]; - b = pixels[4 * pixel_loop + 3]; -#endif - - /* Core bitmaps always have a component order of rgba, - * regardless of system endianness */ - pixels[4 * pixel_loop + 0] = r; - pixels[4 * pixel_loop + 1] = g; - pixels[4 * pixel_loop + 2] = b; - pixels[4 * pixel_loop + 3] = t; - } - } else { - /* Alpha image: de-multiply alpha */ - for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) { -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - b = pixels[4 * pixel_loop + 0]; - g = pixels[4 * pixel_loop + 1]; - r = pixels[4 * pixel_loop + 2]; - t = pixels[4 * pixel_loop + 3]; -#else - t = pixels[4 * pixel_loop + 0]; - r = pixels[4 * pixel_loop + 1]; - g = pixels[4 * pixel_loop + 2]; - b = pixels[4 * pixel_loop + 3]; -#endif - - if (t != 0) { - r = (r << 8) / t; - g = (g << 8) / t; - b = (b << 8) / t; - - r = (r > 255) ? 255 : r; - g = (g > 255) ? 255 : g; - b = (b > 255) ? 255 : b; - } else { - r = g = b = 0; - } - - pixels[4 * pixel_loop + 0] = r; - pixels[4 * pixel_loop + 1] = g; - pixels[4 * pixel_loop + 2] = b; - pixels[4 * pixel_loop + 3] = t; - } - } - - gbitmap->converted = false; - return (unsigned char *) pixels; } @@ -284,22 +141,6 @@ static size_t bitmap_get_rowstride(void *vbitmap) /** - * Find the bytes per pixel of a bitmap - * - * \param vbitmap a bitmap, as returned by bitmap_create() - * \return bytes per pixel - */ -static size_t bitmap_get_bpp(void *vbitmap) -{ - struct bitmap *gbitmap = (struct bitmap *)vbitmap; - assert(gbitmap); - - return 4; -} - - - -/** * Free a bitmap. * * \param vbitmap a bitmap, as returned by bitmap_create() @@ -320,23 +161,6 @@ static void bitmap_destroy(void *vbitmap) /** - * Save a bitmap in the platform's native format. - * - * \param vbitmap a bitmap, as returned by bitmap_create() - * \param path pathname for file - * \param flags modify the behaviour of the save - * \return true on success, false on error and error reported - */ -static bool bitmap_save(void *vbitmap, const char *path, unsigned flags) -{ - struct bitmap *gbitmap = (struct bitmap *)vbitmap; - assert(gbitmap); - - return false; -} - - -/** * The bitmap image has changed, so flush any persistant cache. * * \param vbitmap a bitmap, as returned by bitmap_create() @@ -344,81 +168,10 @@ static bool bitmap_save(void *vbitmap, const char *path, unsigned flags) static void bitmap_modified(void *vbitmap) { struct bitmap *gbitmap = (struct bitmap *)vbitmap; - int pixel_loop; - int pixel_count; - uint8_t *pixels; - uint32_t t, r, g, b; - cairo_format_t fmt; assert(gbitmap); - fmt = cairo_image_surface_get_format(gbitmap->surface); - - pixel_count = cairo_image_surface_get_width(gbitmap->surface) * - cairo_image_surface_get_height(gbitmap->surface); - pixels = cairo_image_surface_get_data(gbitmap->surface); - - if (gbitmap->converted) { - cairo_surface_mark_dirty(gbitmap->surface); - return; - } - - if (fmt == CAIRO_FORMAT_RGB24) { - /* Opaque image */ - for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) { - /* Core bitmaps always have a component order of rgba, - * regardless of system endianness */ - r = pixels[4 * pixel_loop + 0]; - g = pixels[4 * pixel_loop + 1]; - b = pixels[4 * pixel_loop + 2]; - t = pixels[4 * pixel_loop + 3]; - - /* Cairo surface is ARGB, written in native endian */ -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - pixels[4 * pixel_loop + 0] = b; - pixels[4 * pixel_loop + 1] = g; - pixels[4 * pixel_loop + 2] = r; - pixels[4 * pixel_loop + 3] = t; -#else - pixels[4 * pixel_loop + 0] = t; - pixels[4 * pixel_loop + 1] = r; - pixels[4 * pixel_loop + 2] = g; - pixels[4 * pixel_loop + 3] = b; -#endif - } - } else { - /* Alpha image: pre-multiply alpha */ - for (pixel_loop=0; pixel_loop < pixel_count; pixel_loop++) { - r = pixels[4 * pixel_loop + 0]; - g = pixels[4 * pixel_loop + 1]; - b = pixels[4 * pixel_loop + 2]; - t = pixels[4 * pixel_loop + 3]; - - if (t != 0) { - r = ((r * (t + 1)) >> 8) & 0xff; - g = ((g * (t + 1)) >> 8) & 0xff; - b = ((b * (t + 1)) >> 8) & 0xff; - } else { - r = g = b = 0; - } - -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - pixels[4 * pixel_loop + 0] = b; - pixels[4 * pixel_loop + 1] = g; - pixels[4 * pixel_loop + 2] = r; - pixels[4 * pixel_loop + 3] = t; -#else - pixels[4 * pixel_loop + 0] = t; - pixels[4 * pixel_loop + 1] = r; - pixels[4 * pixel_loop + 2] = g; - pixels[4 * pixel_loop + 3] = b; -#endif - } - } - cairo_surface_mark_dirty(gbitmap->surface); - - gbitmap->converted = true; } /* exported interface documented in gtk/bitmap.h */ @@ -530,13 +283,10 @@ static struct gui_bitmap_table bitmap_table = { .destroy = bitmap_destroy, .set_opaque = bitmap_set_opaque, .get_opaque = bitmap_get_opaque, - .test_opaque = bitmap_test_opaque, .get_buffer = bitmap_get_buffer, .get_rowstride = bitmap_get_rowstride, .get_width = nsgtk_bitmap_get_width, .get_height = nsgtk_bitmap_get_height, - .get_bpp = bitmap_get_bpp, - .save = bitmap_save, .modified = bitmap_modified, .render = bitmap_render, }; diff --git a/frontends/gtk/bitmap.h b/frontends/gtk/bitmap.h index 0f46d19a8..80a0e7a3a 100644 --- a/frontends/gtk/bitmap.h +++ b/frontends/gtk/bitmap.h @@ -26,7 +26,7 @@ extern struct gui_bitmap_table *nsgtk_bitmap_table; struct bitmap { cairo_surface_t *surface; /* original cairo surface */ cairo_surface_t *scsurface; /* scaled surface */ - bool converted; /** set if the surface data has been converted */ + bool opaque; }; int nsgtk_bitmap_get_width(void *vbitmap); diff --git a/frontends/gtk/cookies.c b/frontends/gtk/cookies.c index 0df9719cb..fef7e06d7 100644 --- a/frontends/gtk/cookies.c +++ b/frontends/gtk/cookies.c @@ -292,8 +292,7 @@ static nserror nsgtk_cookies_init(void) return res; } - res = cookie_manager_init(ncwin->core.cb_table, - (struct core_window *)ncwin); + res = cookie_manager_init((struct core_window *)ncwin); if (res != NSERROR_OK) { free(ncwin); return res; diff --git a/frontends/gtk/corewindow.c b/frontends/gtk/corewindow.c index baa4cf155..fe2ffd087 100644 --- a/frontends/gtk/corewindow.c +++ b/frontends/gtk/corewindow.c @@ -718,20 +718,20 @@ nsgtk_cw_drag_status(struct core_window *cw, core_window_drag_status ds) /** * core window callback table for nsgtk */ -static struct core_window_callback_table nsgtk_cw_cb_table = { +static struct core_window_table nsgtk_cw_cb_table = { .invalidate = nsgtk_cw_invalidate_area, - .update_size = nsgtk_cw_update_size, + .set_extent = nsgtk_cw_update_size, .set_scroll = nsgtk_cw_set_scroll, .get_scroll = nsgtk_cw_get_scroll, - .get_window_dimensions = nsgtk_cw_get_window_dimensions, + .get_dimensions = nsgtk_cw_get_window_dimensions, .drag_status = nsgtk_cw_drag_status }; +struct core_window_table *nsgtk_core_window_table = &nsgtk_cw_cb_table; /* exported function documented gtk/corewindow.h */ nserror nsgtk_corewindow_init(struct nsgtk_corewindow *nsgtk_cw) { - nsgtk_cw->cb_table = &nsgtk_cw_cb_table; nsgtk_cw->drag_status = CORE_WINDOW_DRAG_NONE; /* input method setup */ diff --git a/frontends/gtk/corewindow.h b/frontends/gtk/corewindow.h index 6100e67ae..2640e3bab 100644 --- a/frontends/gtk/corewindow.h +++ b/frontends/gtk/corewindow.h @@ -21,6 +21,8 @@ #include "netsurf/core_window.h" +extern struct core_window_table *nsgtk_core_window_table; + /** * nsgtk core window mouse state */ @@ -46,10 +48,10 @@ struct nsgtk_corewindow { /* private variables */ /** Input method */ GtkIMContext *input_method; - /** table of callbacks for core window operations */ - struct core_window_callback_table *cb_table; + /** mouse state */ struct nsgtk_corewindow_mouse mouse_state; + /** drag status set by core */ core_window_drag_status drag_status; diff --git a/frontends/gtk/download.c b/frontends/gtk/download.c index 173d2e46e..d1231634d 100644 --- a/frontends/gtk/download.c +++ b/frontends/gtk/download.c @@ -432,7 +432,7 @@ static gboolean nsgtk_download_update(gboolean force_update) switch (dl->status) { case NSGTK_DOWNLOAD_WORKING: pulse_mode = TRUE; - /* Fall through */ + fallthrough; case NSGTK_DOWNLOAD_NONE: dl->speed = dl->size_downloaded / @@ -449,12 +449,13 @@ static gboolean nsgtk_download_update(gboolean force_update) dl_ctx.num_active++; update = TRUE; - /* Fall through */ + fallthrough; case NSGTK_DOWNLOAD_COMPLETE: downloaded += dl->size_downloaded; total += dl->size_total; dls++; + fallthrough; default: ;//Do nothing @@ -1022,7 +1023,7 @@ nserror nsgtk_download_init(void) /* exported interface documented in gtk/download.h */ -void nsgtk_download_destroy () +void nsgtk_download_destroy(void) { nsgtk_download_do(nsgtk_download_store_cancel_item); } diff --git a/frontends/gtk/fetch.c b/frontends/gtk/fetch.c index 58bd0b853..d77073a63 100644 --- a/frontends/gtk/fetch.c +++ b/frontends/gtk/fetch.c @@ -75,6 +75,7 @@ void gtk_fetch_filetype_init(const char *mimefile) hash_add(mime_hash, "html", "text/html"); hash_add(mime_hash, "jpg", "image/jpeg"); hash_add(mime_hash, "jpeg", "image/jpeg"); + hash_add(mime_hash, "jxl", "image/jxl"); hash_add(mime_hash, "gif", "image/gif"); hash_add(mime_hash, "png", "image/png"); hash_add(mime_hash, "jng", "image/jng"); diff --git a/frontends/gtk/gdk.c b/frontends/gtk/gdk.c index 2912862da..fe9a0791c 100644 --- a/frontends/gtk/gdk.c +++ b/frontends/gtk/gdk.c @@ -73,7 +73,7 @@ nsgdk_pixbuf_get_from_surface(cairo_surface_t *surface, int scwidth, int scheigh memset(gdk_pixbuf_get_pixels(pixbuf), 0xff, - gdk_pixbuf_get_rowstride(pixbuf) * scheight); + gdk_pixbuf_get_rowstride(pixbuf) * (size_t)scheight); /* scale cairo surface into new surface the target size */ cairo_surface_flush(surface); /* ensure source surface is ready */ diff --git a/frontends/gtk/global_history.c b/frontends/gtk/global_history.c index 33032e567..703b9c498 100644 --- a/frontends/gtk/global_history.c +++ b/frontends/gtk/global_history.c @@ -349,8 +349,7 @@ static nserror nsgtk_global_history_init(void) return res; } - res = global_history_init(ncwin->core.cb_table, - (struct core_window *)ncwin); + res = global_history_init((struct core_window *)ncwin); if (res != NSERROR_OK) { free(ncwin); return res; diff --git a/frontends/gtk/gui.c b/frontends/gtk/gui.c index a826b053a..644237e09 100644 --- a/frontends/gtk/gui.c +++ b/frontends/gtk/gui.c @@ -44,6 +44,7 @@ #include "netsurf/browser.h" #include "netsurf/browser_window.h" #include "netsurf/netsurf.h" +#include "netsurf/bitmap.h" #include "content/fetch.h" #include "content/backing_store.h" #include "desktop/save_complete.h" @@ -64,6 +65,7 @@ #include "gtk/toolbar_items.h" #include "gtk/scaffolding.h" #include "gtk/window.h" +#include "gtk/corewindow.h" #include "gtk/schedule.h" #include "gtk/selection.h" #include "gtk/search.h" @@ -131,12 +133,16 @@ uint32_t gtk_gui_gdkkey_to_nskey(GdkEventKey *key) case GDK_KEY(BackSpace): if (key->state & GDK_SHIFT_MASK) return NS_KEY_DELETE_LINE_START; + else if (key->state & GDK_CONTROL_MASK) + return NS_KEY_DELETE_WORD_LEFT; else return NS_KEY_DELETE_LEFT; case GDK_KEY(Delete): if (key->state & GDK_SHIFT_MASK) return NS_KEY_DELETE_LINE_END; + else if (key->state & GDK_CONTROL_MASK) + return NS_KEY_DELETE_WORD_RIGHT; else return NS_KEY_DELETE_RIGHT; @@ -148,10 +154,14 @@ uint32_t gtk_gui_gdkkey_to_nskey(GdkEventKey *key) case GDK_KEY(Left): case GDK_KEY(KP_Left): + if (key->state & GDK_CONTROL_MASK) + return NS_KEY_WORD_LEFT; return NS_KEY_LEFT; case GDK_KEY(Right): case GDK_KEY(KP_Right): + if (key->state & GDK_CONTROL_MASK) + return NS_KEY_WORD_RIGHT; return NS_KEY_RIGHT; case GDK_KEY(Up): @@ -939,7 +949,7 @@ static nserror nsgtk_setup(int argc, char** argv, char **respath) resource_filename); free(resource_filename); } - search_web_select_provider(nsoption_int(search_provider)); + search_web_select_provider(nsoption_charp(search_web_provider)); /* Default favicon */ res = nsgdk_pixbuf_new_from_resname("favicon.png", &favicon_pixbuf); @@ -972,6 +982,11 @@ static nserror nsgtk_setup(int argc, char** argv, char **respath) browser_set_dpi(gdk_screen_get_resolution(gdk_screen_get_default())); NSLOG(netsurf, INFO, "Set CSS DPI to %d", browser_get_dpi()); + bitmap_set_format(&(bitmap_fmt_t) { + .layout = BITMAP_LAYOUT_ARGB8888, + .pma = true, + }); + filepath_sfinddef(respath, buf, "mime.types", "/etc/"); gtk_fetch_filetype_init(buf); @@ -1170,6 +1185,7 @@ int main(int argc, char** argv) struct netsurf_table nsgtk_table = { .misc = nsgtk_misc_table, .window = nsgtk_window_table, + .corewindow = nsgtk_core_window_table, .clipboard = nsgtk_clipboard_table, .download = nsgtk_download_table, .fetch = nsgtk_fetch_table, diff --git a/frontends/gtk/hotlist.c b/frontends/gtk/hotlist.c index b047dc65f..4524f59ba 100644 --- a/frontends/gtk/hotlist.c +++ b/frontends/gtk/hotlist.c @@ -363,8 +363,7 @@ static nserror nsgtk_hotlist_init(void) return res; } - res = hotlist_manager_init(ncwin->core.cb_table, - (struct core_window *)ncwin); + res = hotlist_manager_init((struct core_window *)ncwin); if (res != NSERROR_OK) { free(ncwin); return res; diff --git a/frontends/gtk/local_history.c b/frontends/gtk/local_history.c index 0d59c468a..9303ce459 100644 --- a/frontends/gtk/local_history.c +++ b/frontends/gtk/local_history.c @@ -199,8 +199,7 @@ nsgtk_local_history_init(struct browser_window *bw, return res; } - res = local_history_init(ncwin->core.cb_table, - (struct core_window *)ncwin, + res = local_history_init((struct core_window *)ncwin, bw, &ncwin->session); if (res != NSERROR_OK) { diff --git a/frontends/gtk/misc.c b/frontends/gtk/misc.c index bda0dd688..8ab1d914c 100644 --- a/frontends/gtk/misc.c +++ b/frontends/gtk/misc.c @@ -21,9 +21,11 @@ * Implementation of netsurf miscellaneous operations table */ +#include <string.h> #include <stdbool.h> #include <gtk/gtk.h> +#include "utils/config.h" #include "utils/errors.h" #include "utils/log.h" #include "utils/messages.h" diff --git a/frontends/gtk/page_info.c b/frontends/gtk/page_info.c index 0d76a2f71..f426f4708 100644 --- a/frontends/gtk/page_info.c +++ b/frontends/gtk/page_info.c @@ -232,9 +232,7 @@ nserror nsgtk_page_info(struct browser_window *bw) return res; } - res = page_info_create(ncwin->core.cb_table, - (struct core_window *)ncwin, - bw, &ncwin->pi); + res = page_info_create((struct core_window *)ncwin, bw, &ncwin->pi); if (res != NSERROR_OK) { g_object_unref(G_OBJECT(ncwin->dlg)); free(ncwin); diff --git a/frontends/gtk/preferences.c b/frontends/gtk/preferences.c index a44e7241e..26d32ee20 100644 --- a/frontends/gtk/preferences.c +++ b/frontends/gtk/preferences.c @@ -830,15 +830,33 @@ TOGGLEBUTTON_SIGNALS(checkUrlSearch, search_url_bar) G_MODULE_EXPORT void nsgtk_preferences_comboSearch_changed(GtkComboBox *widget, struct ppref *priv) { - int provider; + gboolean set; + GtkTreeIter iter; + GtkTreeModel* model; + gchar* provider; + const char* defprovider; - provider = gtk_combo_box_get_active(widget); + set = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget), &iter); + if (!set) { + return; + } - /* set the option */ - nsoption_set_int(search_provider, provider); + model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget)); + gtk_tree_model_get(model, &iter, 0, &provider, -1); /* set search provider */ search_web_select_provider(provider); + + /* set to default option if the default provider is selected */ + if ((search_web_iterate_providers(-1, &defprovider) != -1) && + (strcmp(provider, defprovider) == 0)) { + free(provider); + /* use default option */ + provider = NULL; + } + + /* set the option which takes owership of the provider allocation */ + nsoption_set_charp(search_web_provider, provider); } G_MODULE_EXPORT void @@ -846,20 +864,29 @@ nsgtk_preferences_comboSearch_realize(GtkWidget *widget, struct ppref *priv) { int iter; const char *name; - int provider = nsoption_int(search_provider); - - if (priv->search_providers != NULL) { - gtk_list_store_clear(priv->search_providers); - for (iter = search_web_iterate_providers(0, &name); - iter != -1; - iter = search_web_iterate_providers(iter, &name)) { - gtk_list_store_insert_with_values(priv->search_providers, - NULL, -1, - 0, name, -1); + const char *provider; + int provider_idx = 0; + + if (priv->search_providers == NULL) { + return; + } + gtk_list_store_clear(priv->search_providers); + + provider = nsoption_charp(search_web_provider); + + iter = search_web_iterate_providers(-1, &name); + while (iter != -1) { + gtk_list_store_insert_with_values(priv->search_providers, + NULL, -1, + 0, name, -1); + if ((provider != NULL) && (strcmp(name, provider) == 0)) { + provider_idx = iter; } + iter = search_web_iterate_providers(iter, &name); } - gtk_combo_box_set_active(GTK_COMBO_BOX(widget), provider); + + gtk_combo_box_set_active(GTK_COMBO_BOX(widget), provider_idx); } @@ -1003,4 +1030,3 @@ GtkWidget* nsgtk_preferences(struct browser_window *bw, GtkWindow *parent) return GTK_WIDGET(priv->dialog); } - diff --git a/frontends/gtk/res/fr/credits.html b/frontends/gtk/res/fr/credits.html new file mode 120000 index 000000000..47da488e8 --- /dev/null +++ b/frontends/gtk/res/fr/credits.html @@ -0,0 +1 @@ +../../../../resources/fr/credits.html
\ No newline at end of file diff --git a/frontends/gtk/res/fr/licence.html b/frontends/gtk/res/fr/licence.html new file mode 120000 index 000000000..2fd247ba8 --- /dev/null +++ b/frontends/gtk/res/fr/licence.html @@ -0,0 +1 @@ +../../../../resources/fr/licence.html
\ No newline at end of file diff --git a/frontends/gtk/res/fr/welcome.html b/frontends/gtk/res/fr/welcome.html new file mode 120000 index 000000000..a7a2023ea --- /dev/null +++ b/frontends/gtk/res/fr/welcome.html @@ -0,0 +1 @@ +../../../../resources/fr/welcome.html
\ No newline at end of file diff --git a/frontends/gtk/res/netsurf.gresource.xml b/frontends/gtk/res/netsurf.gresource.xml index ada2d59fc..21a2e7723 100644 --- a/frontends/gtk/res/netsurf.gresource.xml +++ b/frontends/gtk/res/netsurf.gresource.xml @@ -14,15 +14,18 @@ <file preprocess="to-pixdata">throbber/throbber7.png</file> <file preprocess="to-pixdata">throbber/throbber8.png</file> <file>credits.html</file> + <file>fr/credits.html</file> <file>it/credits.html</file> <file>nl/credits.html</file> <file>zh_CN/credits.html</file> <file>licence.html</file> + <file>fr/licence.html</file> <file>it/licence.html</file> <file>nl/licence.html</file> <file>zh_CN/licence.html</file> <file>welcome.html</file> <file>de/welcome.html</file> + <file>fr/welcome.html</file> <file>it/welcome.html</file> <file>ja/welcome.html</file> <file>nl/welcome.html</file> diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c index f08d5d0d0..f9d4f6d67 100644 --- a/frontends/gtk/scaffolding.c +++ b/frontends/gtk/scaffolding.c @@ -18,6 +18,7 @@ #include <gtk/gtk.h> #include <stdbool.h> +#include <stdlib.h> #include <string.h> #include "utils/utils.h" @@ -192,6 +193,18 @@ static void scaffolding_window_destroy(GtkWidget *widget, gpointer data) nsgtk_local_history_hide(); + /* ensure scaffolding being destroyed is not current */ + if (scaf_current == gs) { + scaf_current = NULL; + /* attempt to select nearest scaffold instead of just selecting the first */ + if (gs->prev != NULL) { + scaf_current = gs->prev; + } else if (gs->next != NULL) { + scaf_current = gs->next; + } + } + + /* remove scaffolding from list */ if (gs->prev != NULL) { gs->prev->next = gs->next; } else { diff --git a/frontends/gtk/search.c b/frontends/gtk/search.c index 068624153..f9a509f6e 100644 --- a/frontends/gtk/search.c +++ b/frontends/gtk/search.c @@ -25,6 +25,7 @@ * that generally means web search and is confusing. */ +#include <stdlib.h> #include <stdbool.h> #include <gtk/gtk.h> @@ -269,6 +270,8 @@ nserror nsgtk_search_restyle(struct gtk_search *search) case 4: /* Text icons only */ gtk_toolbar_set_style(GTK_TOOLBAR(search->bar), GTK_TOOLBAR_TEXT); + break; + default: break; } diff --git a/frontends/gtk/toolbar.c b/frontends/gtk/toolbar.c index 32adabc5b..6ec41cc1d 100644 --- a/frontends/gtk/toolbar.c +++ b/frontends/gtk/toolbar.c @@ -673,15 +673,22 @@ nsgtk_toolbar_customisation_save(struct nsgtk_toolbar *tb) for (location = BACK_BUTTON; location < PLACEHOLDER_BUTTON; location++) { + int written; itemid = itemid_from_location(tb, location); if (itemid == PLACEHOLDER_BUTTON) { /* no more filled locations */ break; } - start += snprintf(start, + written = snprintf(start, orderlen - (start - order), "%s/", tb->items[itemid].name); + if ((written < 0) || + (written >= orderlen - (start - order))) { + free(order); + return NSERROR_UNKNOWN; + } + start += written; if ((start - order) >= orderlen) { break; @@ -3066,7 +3073,7 @@ contents_button_clicked_cb(GtkWidget *widget, gpointer data) struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data; nserror res; - res = toolbar_navigate_to_url(tb, "http://www.netsurf-browser.org/documentation/"); + res = toolbar_navigate_to_url(tb, "https://www.netsurf-browser.org/documentation/"); if (res != NSERROR_OK) { nsgtk_warning(messages_get_errorcode(res), 0); } @@ -3087,7 +3094,7 @@ guide_button_clicked_cb(GtkWidget *widget, gpointer data) struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data; nserror res; - res = toolbar_navigate_to_url(tb, "http://www.netsurf-browser.org/documentation/guide"); + res = toolbar_navigate_to_url(tb, "https://www.netsurf-browser.org/documentation/guide"); if (res != NSERROR_OK) { nsgtk_warning(messages_get_errorcode(res), 0); } @@ -3109,7 +3116,7 @@ info_button_clicked_cb(GtkWidget *widget, gpointer data) struct nsgtk_toolbar *tb = (struct nsgtk_toolbar *)data; nserror res; - res = toolbar_navigate_to_url(tb, "http://www.netsurf-browser.org/documentation/info"); + res = toolbar_navigate_to_url(tb, "https://www.netsurf-browser.org/documentation/info"); if (res != NSERROR_OK) { nsgtk_warning(messages_get_errorcode(res), 0); } |