netsurf/gtk/gtk_gui.c
John Mark Bell 745deb7a9d [project @ 2006-01-08 01:51:33 by jmb]
Make data file locations user-configurable (no UI for this as yet)
Reduce intrusiveness of ncos modifications
Fix GTK build
Remove Cookies file details from Messages (this data never belonged in there anyway)
Make gui_init more robust against memory exhaustion.

svn path=/import/netsurf/; revision=2014
2006-01-08 01:51:33 +00:00

261 lines
5.8 KiB
C

/*
* This file is part of NetSurf, http://netsurf.sourceforge.net/
* Licensed under the GNU General Public License,
* http://www.opensource.org/licenses/gpl-license
* Copyright 2005 James Bursa <bursa@users.sourceforge.net>
*/
#define _GNU_SOURCE /* for strndup */
#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#include "netsurf/content/content.h"
#include "netsurf/content/fetch.h"
#include "netsurf/content/url_store.h"
#include "netsurf/desktop/401login.h"
#include "netsurf/desktop/browser.h"
#include "netsurf/desktop/gui.h"
#include "netsurf/desktop/netsurf.h"
#include "netsurf/desktop/options.h"
#include "netsurf/gtk/gtk_gui.h"
#include "netsurf/render/box.h"
#include "netsurf/render/form.h"
#include "netsurf/render/html.h"
#include "netsurf/utils/log.h"
#include "netsurf/utils/messages.h"
#include "netsurf/utils/utf8.h"
#include "netsurf/utils/utils.h"
bool gui_in_multitask = false;
char *default_stylesheet_url;
char *adblock_stylesheet_url;
struct gui_window *search_current_window = 0;
void gui_init(int argc, char** argv)
{
char *home;
char buf[1024];
/* All our resources are stored in ~/.netsurf/ */
home = getenv("HOME");
if (!home)
die("Couldn't find HOME");
gtk_init(&argc, &argv);
snprintf(buf, sizeof buf, "%s/.netsurf/Choices", home);
options_read(buf);
if (!option_cookie_file) {
snprintf(buf, sizeof buf, "%s/.netsurf/Cookies");
option_cookie_file = strdup(buf);
}
if (!option_cookie_jar) {
snprintf(buf, sizeof buf, "%s/.netsurf/Cookies");
option_cookie_jar = strdup(buf);
}
if (!option_cookie_file || !option_cookie_jar)
die("Failed initialising cookie options");
snprintf(buf, sizeof buf, "%s/.netsurf/messages", home);
messages_load(buf);
/* set up stylesheet urls */
snprintf(buf, sizeof buf, "file:///%s/.netsurf/Default.css", home);
default_stylesheet_url = strdup(buf);
snprintf(buf, sizeof buf, "file:///%s/.netsurf/AdBlock.css", home);
adblock_stylesheet_url = strdup(buf);
if (!default_stylesheet_url || !adblock_stylesheet_url)
die("Failed duplicating stylesheet strings");
}
void gui_init2(int argc, char** argv)
{
browser_window_create("http://netsurf.sourceforge.net/", 0, 0);
}
void gui_poll(bool active)
{
CURLMcode code;
fd_set read_fd_set, write_fd_set, exc_fd_set;
int max_fd;
GPollFD *fd_list[1000];
unsigned int fd_count = 0;
if (active) {
fetch_poll();
FD_ZERO(&read_fd_set);
FD_ZERO(&write_fd_set);
FD_ZERO(&exc_fd_set);
code = curl_multi_fdset(fetch_curl_multi,
&read_fd_set,
&write_fd_set,
&exc_fd_set,
&max_fd);
assert(code == CURLM_OK);
for (int i = 0; i <= max_fd; i++) {
if (FD_ISSET(i, &read_fd_set)) {
GPollFD *fd = malloc(sizeof *fd);
fd->fd = i;
fd->events = G_IO_IN | G_IO_HUP | G_IO_ERR;
g_main_context_add_poll(0, fd, 0);
fd_list[fd_count++] = fd;
}
if (FD_ISSET(i, &write_fd_set)) {
GPollFD *fd = malloc(sizeof *fd);
fd->fd = i;
fd->events = G_IO_OUT | G_IO_ERR;
g_main_context_add_poll(0, fd, 0);
fd_list[fd_count++] = fd;
}
if (FD_ISSET(i, &exc_fd_set)) {
GPollFD *fd = malloc(sizeof *fd);
fd->fd = i;
fd->events = G_IO_ERR;
g_main_context_add_poll(0, fd, 0);
fd_list[fd_count++] = fd;
}
}
}
gtk_main_iteration_do(true);
for (unsigned int i = 0; i != fd_count; i++) {
g_main_context_remove_poll(0, fd_list[i]);
free(fd_list[i]);
}
}
void gui_multitask(void)
{
gui_in_multitask = true;
while (gtk_events_pending())
gtk_main_iteration();
gui_in_multitask = false;
}
void gui_quit(void)
{
free(default_stylesheet_url);
free(adblock_stylesheet_url);
}
struct gui_download_window *gui_download_window_create(const char *url,
const char *mime_type, struct fetch *fetch,
unsigned int total_size)
{
return 0;
}
void gui_download_window_data(struct gui_download_window *dw, const char *data,
unsigned int size)
{
}
void gui_download_window_error(struct gui_download_window *dw,
const char *error_msg)
{
}
void gui_download_window_done(struct gui_download_window *dw)
{
}
void gui_create_form_select_menu(struct browser_window *bw,
struct form_control *control)
{
}
void gui_launch_url(const char *url)
{
}
bool gui_search_term_highlighted(struct gui_window *g, struct box *box,
unsigned *start_idx, unsigned *end_idx)
{
return false;
}
void warn_user(const char *warning, const char *detail)
{
}
void die(const char * const error)
{
fprintf(stderr, error);
exit(EXIT_FAILURE);
}
void hotlist_visited(struct content *content)
{
}
struct history *history_create(void) { return 0; }
void history_add(struct history *history, struct content *content,
char *frag_id) {}
void history_update(struct history *history, struct content *content) {}
void history_destroy(struct history *history) {}
void history_back(struct browser_window *bw, struct history *history) {}
void history_forward(struct browser_window *bw, struct history *history) {}
void gui_401login_open(struct browser_window *bw, struct content *c,
char *realm) {}
void schedule(int t, void (*callback)(void *p), void *p) {}
void schedule_remove(void (*callback)(void *p), void *p) {}
void schedule_run(void) {}
void global_history_add(struct url_content *data) {}
utf8_convert_ret utf8_to_local_encoding(const char *string, size_t len,
char **result)
{
assert(string && result);
if (len == 0)
len = strlen(string);
*result = strndup(string, len);
if (!(*result))
return UTF8_CONVERT_NOMEM;
return UTF8_CONVERT_OK;
}
utf8_convert_ret utf8_from_local_encoding(const char *string, size_t len,
char **result)
{
assert(string && result);
if (len == 0)
len = strlen(string);
*result = strndup(string, len);
if (!(*result))
return UTF8_CONVERT_NOMEM;
return UTF8_CONVERT_OK;
}