mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-11-22 06:21:45 +03:00
Add basic cookie viewer, make trees use textarea components for UTF8 editing, trim headers, fix tree redraw issues.
svn path=/trunk/netsurf/; revision=2739
This commit is contained in:
parent
d4331fa64f
commit
a836591435
117
content/urldb.c
117
content/urldb.c
@ -82,6 +82,7 @@
|
||||
|
||||
#include "netsurf/image/bitmap.h"
|
||||
#include "netsurf/content/urldb.h"
|
||||
#include "netsurf/desktop/cookies.h"
|
||||
#include "netsurf/desktop/options.h"
|
||||
#ifdef riscos
|
||||
/** \todo lose this */
|
||||
@ -91,7 +92,7 @@
|
||||
#include "netsurf/utils/url.h"
|
||||
#include "netsurf/utils/utils.h"
|
||||
|
||||
struct cookie {
|
||||
struct cookie_internal_data {
|
||||
char *name; /**< Cookie name */
|
||||
char *value; /**< Cookie value */
|
||||
char *comment; /**< Cookie comment */
|
||||
@ -102,15 +103,12 @@ struct cookie {
|
||||
time_t expires; /**< Expiry timestamp, or 1 for session */
|
||||
time_t last_used; /**< Last used time */
|
||||
bool secure; /**< Only send for HTTPS requests */
|
||||
enum { COOKIE_NETSCAPE = 0,
|
||||
COOKIE_RFC2109 = 1,
|
||||
COOKIE_RFC2965 = 2
|
||||
} version; /**< Specification compliance */
|
||||
cookie_version version; /**< Specification compliance */
|
||||
bool no_destroy; /**< Never destroy this cookie,
|
||||
* unless it's expired */
|
||||
|
||||
struct cookie *prev; /**< Previous in list */
|
||||
struct cookie *next; /**< Next in list */
|
||||
struct cookie_internal_data *prev; /**< Previous in list */
|
||||
struct cookie_internal_data *next; /**< Next in list */
|
||||
};
|
||||
|
||||
struct auth_data {
|
||||
@ -138,7 +136,7 @@ struct path_data {
|
||||
struct bitmap *thumb; /**< Thumbnail image of resource */
|
||||
struct url_internal_data urld; /**< URL data for resource */
|
||||
struct auth_data auth; /**< Authentication data for resource */
|
||||
struct cookie *cookies; /**< Cookies associated with resource */
|
||||
struct cookie_internal_data *cookies; /**< Cookies associated with resource */
|
||||
|
||||
struct path_data *next; /**< Next sibling */
|
||||
struct path_data *prev; /**< Previous sibling */
|
||||
@ -189,11 +187,11 @@ static bool urldb_iterate_partial_path(const struct path_data *parent,
|
||||
const char *prefix, bool (*callback)(const char *url,
|
||||
const struct url_data *data));
|
||||
static bool urldb_iterate_entries_host(struct search_node *parent,
|
||||
bool (*callback)(const char *url,
|
||||
const struct url_data *data));
|
||||
bool (*url_callback)(const char *url, const struct url_data *data),
|
||||
bool (*cookie_callback)(const struct cookie_data *data));
|
||||
static bool urldb_iterate_entries_path(const struct path_data *parent,
|
||||
bool (*callback)(const char *url,
|
||||
const struct url_data *data));
|
||||
bool (*url_callback)(const char *url, const struct url_data *data),
|
||||
bool (*cookie_callback)(const struct cookie_data *data));
|
||||
|
||||
/* Insertion */
|
||||
static struct host_part *urldb_add_host_node(const char *part,
|
||||
@ -239,13 +237,13 @@ static int urldb_search_match_prefix(const struct host_part *a,
|
||||
const char *b);
|
||||
|
||||
/* Cookies */
|
||||
static struct cookie *urldb_parse_cookie(const char *url,
|
||||
static struct cookie_internal_data *urldb_parse_cookie(const char *url,
|
||||
const char **cookie);
|
||||
static bool urldb_parse_avpair(struct cookie *c, char *n, char *v);
|
||||
static bool urldb_insert_cookie(struct cookie *c, const char *scheme,
|
||||
static bool urldb_parse_avpair(struct cookie_internal_data *c, char *n, char *v);
|
||||
static bool urldb_insert_cookie(struct cookie_internal_data *c, const char *scheme,
|
||||
const char *url);
|
||||
static void urldb_free_cookie(struct cookie *c);
|
||||
static bool urldb_concat_cookie(struct cookie *c, int *used,
|
||||
static void urldb_free_cookie(struct cookie_internal_data *c);
|
||||
static bool urldb_concat_cookie(struct cookie_internal_data *c, int *used,
|
||||
int *alloc, char **buf);
|
||||
static void urldb_save_cookie_hosts(FILE *fp, struct host_part *parent);
|
||||
static void urldb_save_cookie_paths(FILE *fp, struct path_data *parent);
|
||||
@ -1225,7 +1223,7 @@ bool urldb_iterate_partial_host(struct search_node *root, const char *prefix,
|
||||
if (root->data->paths.children) {
|
||||
/* and extract all paths attached to this host */
|
||||
if (!urldb_iterate_entries_path(&root->data->paths,
|
||||
callback)) {
|
||||
callback, NULL)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -1274,7 +1272,7 @@ bool urldb_iterate_partial_path(const struct path_data *parent,
|
||||
if (slash == end) {
|
||||
/* we've run out of prefix, so all
|
||||
* paths below this one match */
|
||||
if (!urldb_iterate_entries_path(p, callback))
|
||||
if (!urldb_iterate_entries_path(p, callback, NULL))
|
||||
return false;
|
||||
} else {
|
||||
/* more prefix to go => recurse */
|
||||
@ -1301,7 +1299,25 @@ void urldb_iterate_entries(bool (*callback)(const char *url,
|
||||
|
||||
for (i = 0; i < NUM_SEARCH_TREES; i++) {
|
||||
if (!urldb_iterate_entries_host(search_trees[i],
|
||||
callback))
|
||||
callback, NULL))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Iterate over all cookies in database
|
||||
*
|
||||
* \param callback Function to callback for each entry
|
||||
*/
|
||||
void urldb_iterate_cookies(bool (*callback)(const struct cookie_data *data))
|
||||
{
|
||||
int i;
|
||||
|
||||
assert(callback);
|
||||
|
||||
for (i = 0; i < NUM_SEARCH_TREES; i++) {
|
||||
if (!urldb_iterate_entries_host(search_trees[i],
|
||||
NULL, callback))
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1310,28 +1326,29 @@ void urldb_iterate_entries(bool (*callback)(const char *url,
|
||||
* Host data iterator (internal)
|
||||
*
|
||||
* \param parent Root of subtree to iterate over
|
||||
* \param callback Callback function
|
||||
* \param url_callback Callback function
|
||||
* \param cookie_callback Callback function
|
||||
* \return true to continue, false otherwise
|
||||
*/
|
||||
bool urldb_iterate_entries_host(struct search_node *parent,
|
||||
bool (*callback)(const char *url,
|
||||
const struct url_data *data))
|
||||
bool (*url_callback)(const char *url, const struct url_data *data),
|
||||
bool (*cookie_callback)(const struct cookie_data *data))
|
||||
{
|
||||
if (parent == &empty)
|
||||
return true;
|
||||
|
||||
if (!urldb_iterate_entries_host(parent->left, callback))
|
||||
if (!urldb_iterate_entries_host(parent->left, url_callback, cookie_callback))
|
||||
return false;
|
||||
|
||||
if (parent->data->paths.children) {
|
||||
/* We have paths, so iterate them */
|
||||
if ((parent->data->paths.children) || ((cookie_callback) && (parent->data->paths.cookies))) {
|
||||
/* We have paths (or domain cookies), so iterate them */
|
||||
if (!urldb_iterate_entries_path(&parent->data->paths,
|
||||
callback)) {
|
||||
url_callback, cookie_callback)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!urldb_iterate_entries_host(parent->right, callback))
|
||||
if (!urldb_iterate_entries_host(parent->right, url_callback, cookie_callback))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@ -1341,33 +1358,36 @@ bool urldb_iterate_entries_host(struct search_node *parent,
|
||||
* Path data iterator (internal)
|
||||
*
|
||||
* \param parent Root of subtree to iterate over
|
||||
* \param callback Callback function to call
|
||||
* \param url_callback Callback function
|
||||
* \param cookie_callback Callback function
|
||||
* \return true to continue, false otherwise
|
||||
*/
|
||||
bool urldb_iterate_entries_path(const struct path_data *parent,
|
||||
bool (*callback)(const char *url,
|
||||
const struct url_data *data))
|
||||
bool (*url_callback)(const char *url, const struct url_data *data),
|
||||
bool (*cookie_callback)(const struct cookie_data *data))
|
||||
{
|
||||
const struct path_data *p;
|
||||
|
||||
if (!parent->children) {
|
||||
/* leaf node */
|
||||
|
||||
/* All leaf nodes in the path tree should have an URL
|
||||
/* All leaf nodes in the path tree should have an URL or cookies
|
||||
* attached to them. If this is not the case, it indicates
|
||||
* that there's a bug in the file loader/URL insertion code.
|
||||
* Therefore, assert this here. */
|
||||
assert(parent->url);
|
||||
assert(parent->url || parent->cookies);
|
||||
|
||||
/** \todo handle fragments? */
|
||||
|
||||
if (!callback(parent->url,
|
||||
if (url_callback && parent->url && !url_callback(parent->url,
|
||||
(const struct url_data *) &parent->urld))
|
||||
return false;
|
||||
if (cookie_callback && parent->cookies && !cookie_callback(
|
||||
(const struct cookie_data *) parent->cookies))
|
||||
return false;
|
||||
}
|
||||
|
||||
for (p = parent->children; p; p = p->next) {
|
||||
if (!urldb_iterate_entries_path(p, callback))
|
||||
if (!urldb_iterate_entries_path(p, url_callback, cookie_callback))
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -2278,7 +2298,7 @@ char *urldb_get_cookie(const char *url, const char *referer)
|
||||
{
|
||||
const struct path_data *p, *q;
|
||||
const struct host_part *h;
|
||||
struct cookie *c;
|
||||
struct cookie_internal_data *c;
|
||||
int count = 0, version = COOKIE_RFC2965;
|
||||
int ret_alloc = 4096, ret_used = 1;
|
||||
char *path;
|
||||
@ -2519,7 +2539,7 @@ bool urldb_set_cookie(const char *header, const char *url)
|
||||
end = cur + strlen(cur) - 2 /* Trailing CRLF */;
|
||||
|
||||
do {
|
||||
struct cookie *c;
|
||||
struct cookie_internal_data *c;
|
||||
char *dot;
|
||||
|
||||
c = urldb_parse_cookie(url, &cur);
|
||||
@ -2595,6 +2615,7 @@ bool urldb_set_cookie(const char *header, const char *url)
|
||||
/* Now insert into database */
|
||||
if (!urldb_insert_cookie(c, scheme, urlt))
|
||||
goto error;
|
||||
cookies_update((struct cookie_data *)c);
|
||||
} while (cur < end);
|
||||
|
||||
free(host);
|
||||
@ -2620,9 +2641,9 @@ error:
|
||||
* \param cookie Pointer to cookie string (updated on exit)
|
||||
* \return Pointer to cookie structure (on heap, caller frees) or NULL
|
||||
*/
|
||||
struct cookie *urldb_parse_cookie(const char *url, const char **cookie)
|
||||
struct cookie_internal_data *urldb_parse_cookie(const char *url, const char **cookie)
|
||||
{
|
||||
struct cookie *c;
|
||||
struct cookie_internal_data *c;
|
||||
const char *cur;
|
||||
char name[1024], value[4096];
|
||||
char *n = name, *v = value;
|
||||
@ -2632,7 +2653,7 @@ struct cookie *urldb_parse_cookie(const char *url, const char **cookie)
|
||||
|
||||
assert(url && cookie && *cookie);
|
||||
|
||||
c = calloc(1, sizeof(struct cookie));
|
||||
c = calloc(1, sizeof(struct cookie_internal_data));
|
||||
if (!c)
|
||||
return NULL;
|
||||
|
||||
@ -2779,7 +2800,7 @@ struct cookie *urldb_parse_cookie(const char *url, const char **cookie)
|
||||
* \param v Value component
|
||||
* \return true on success, false on memory exhaustion
|
||||
*/
|
||||
bool urldb_parse_avpair(struct cookie *c, char *n, char *v)
|
||||
bool urldb_parse_avpair(struct cookie_internal_data *c, char *n, char *v)
|
||||
{
|
||||
int vlen;
|
||||
|
||||
@ -2881,10 +2902,10 @@ bool urldb_parse_avpair(struct cookie *c, char *n, char *v)
|
||||
* \param url URL (sans fragment) associated with cookie
|
||||
* \return true on success, false on memory exhaustion (c will be freed)
|
||||
*/
|
||||
bool urldb_insert_cookie(struct cookie *c, const char *scheme,
|
||||
bool urldb_insert_cookie(struct cookie_internal_data *c, const char *scheme,
|
||||
const char *url)
|
||||
{
|
||||
struct cookie *d;
|
||||
struct cookie_internal_data *d;
|
||||
const struct host_part *h;
|
||||
struct path_data *p;
|
||||
|
||||
@ -2977,7 +2998,7 @@ bool urldb_insert_cookie(struct cookie *c, const char *scheme,
|
||||
*
|
||||
* \param c The cookie to free
|
||||
*/
|
||||
void urldb_free_cookie(struct cookie *c)
|
||||
void urldb_free_cookie(struct cookie_internal_data *c)
|
||||
{
|
||||
assert(c);
|
||||
|
||||
@ -2998,7 +3019,7 @@ void urldb_free_cookie(struct cookie *c)
|
||||
* \param buf Pointer to Pointer to buffer (updated)
|
||||
* \return true on success, false on memory exhaustion
|
||||
*/
|
||||
bool urldb_concat_cookie(struct cookie *c, int *used, int *alloc, char **buf)
|
||||
bool urldb_concat_cookie(struct cookie_internal_data *c, int *used, int *alloc, char **buf)
|
||||
{
|
||||
int clen;
|
||||
|
||||
@ -3128,7 +3149,7 @@ void urldb_load_cookies(const char *filename)
|
||||
assert(p <= end);
|
||||
|
||||
/* Now create cookie */
|
||||
struct cookie *c = malloc(sizeof(struct cookie));
|
||||
struct cookie_internal_data *c = malloc(sizeof(struct cookie_internal_data));
|
||||
if (!c)
|
||||
break;
|
||||
|
||||
@ -3228,7 +3249,7 @@ void urldb_save_cookie_paths(FILE *fp, struct path_data *parent)
|
||||
assert(fp && parent);
|
||||
|
||||
if (parent->cookies) {
|
||||
for (struct cookie *c = parent->cookies; c; c = c->next) {
|
||||
for (struct cookie_internal_data *c = parent->cookies; c; c = c->next) {
|
||||
|
||||
if (c->expires < now)
|
||||
/* Skip expired cookies */
|
||||
|
@ -16,6 +16,12 @@
|
||||
#include <time.h>
|
||||
#include "netsurf/content/content_type.h"
|
||||
|
||||
typedef enum {
|
||||
COOKIE_NETSCAPE = 0,
|
||||
COOKIE_RFC2109 = 1,
|
||||
COOKIE_RFC2965 = 2
|
||||
} cookie_version;
|
||||
|
||||
struct url_data {
|
||||
const char *title; /**< Resource title */
|
||||
unsigned int visits; /**< Visit count */
|
||||
@ -23,6 +29,25 @@ struct url_data {
|
||||
content_type type; /**< Type of resource */
|
||||
};
|
||||
|
||||
struct cookie_data {
|
||||
const char *name; /**< Cookie name */
|
||||
const char *value; /**< Cookie value */
|
||||
const char *comment; /**< Cookie comment */
|
||||
const bool domain_from_set; /**< Domain came from Set-Cookie: header */
|
||||
const char *domain; /**< Domain */
|
||||
const bool path_from_set; /**< Path came from Set-Cookie: header */
|
||||
const char *path; /**< Path */
|
||||
const time_t expires; /**< Expiry timestamp, or 1 for session */
|
||||
const time_t last_used; /**< Last used time */
|
||||
const bool secure; /**< Only send for HTTPS requests */
|
||||
cookie_version version; /**< Specification compliance */
|
||||
const bool no_destroy; /**< Never destroy this cookie,
|
||||
* unless it's expired */
|
||||
|
||||
const struct cookie_data *prev; /**< Previous in list */
|
||||
const struct cookie_data *next; /**< Next in list */
|
||||
};
|
||||
|
||||
struct bitmap;
|
||||
|
||||
/* Persistence support */
|
||||
@ -62,6 +87,7 @@ void urldb_iterate_partial(const char *prefix,
|
||||
/* Iteration */
|
||||
void urldb_iterate_entries(bool (*callback)(const char *url,
|
||||
const struct url_data *data));
|
||||
void urldb_iterate_cookies(bool (*callback)(const struct cookie_data *cookie));
|
||||
|
||||
/* Debug */
|
||||
void urldb_dump(void);
|
||||
|
21
desktop/cookies.h
Normal file
21
desktop/cookies.h
Normal file
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* 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 2006 Richard Wilson <info@tinct.net>
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* Cookies (interface).
|
||||
*/
|
||||
|
||||
#ifndef _NETSURF_DESKTOP_COOKIES_H_
|
||||
#define _NETSURF_DESKTOP_COOKIES_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
struct cookie_data;
|
||||
|
||||
bool cookies_update(const struct cookie_data *data);
|
||||
|
||||
#endif
|
@ -24,7 +24,7 @@
|
||||
#ifndef _NETSURF_DESKTOP_OPTIONS_H_
|
||||
#define _NETSURF_DESKTOP_OPTIONS_H_
|
||||
|
||||
#include "netsurf/desktop/tree.h"
|
||||
struct tree;
|
||||
|
||||
enum { OPTION_HTTP_PROXY_AUTH_NONE = 0, OPTION_HTTP_PROXY_AUTH_BASIC = 1,
|
||||
OPTION_HTTP_PROXY_AUTH_NTLM = 2 };
|
||||
|
145
desktop/tree.c
145
desktop/tree.c
@ -18,6 +18,7 @@
|
||||
#include "netsurf/desktop/tree.h"
|
||||
#include "netsurf/desktop/options.h"
|
||||
#include "netsurf/utils/log.h"
|
||||
#include "netsurf/utils/messages.h"
|
||||
#include "netsurf/utils/utils.h"
|
||||
|
||||
static void tree_draw_node(struct tree *tree, struct node *node, int clip_x,
|
||||
@ -33,6 +34,8 @@ static void tree_selected_to_processing(struct node *node);
|
||||
void tree_clear_processing(struct node *node);
|
||||
struct node *tree_move_processing_node(struct node *node, struct node *link,
|
||||
bool before, bool first);
|
||||
struct node *tree_create_leaf_node(struct node *parent, const char *title);
|
||||
struct node *tree_create_leaf_node_shared(struct node *parent, const char *title);
|
||||
|
||||
static int tree_initialising = 0;
|
||||
|
||||
@ -726,6 +729,12 @@ void tree_draw_node(struct tree *tree, struct node *node, int clip_x, int clip_y
|
||||
tree_draw_line(node->box.x + (NODE_INSTEP / 2),
|
||||
node->data.box.y + node->data.box.height, 0,
|
||||
(40 / 2));
|
||||
if ((node->parent) && (node->parent != tree->root) &&
|
||||
(node->parent->child == node))
|
||||
tree_draw_line(node->parent->box.x + (NODE_INSTEP / 2),
|
||||
node->parent->data.box.y +
|
||||
node->parent->data.box.height, 0,
|
||||
(40 / 2));
|
||||
tree_draw_line(node->box.x - (NODE_INSTEP / 2),
|
||||
node->data.box.y +
|
||||
node->data.box.height - (40 / 2),
|
||||
@ -895,13 +904,18 @@ void tree_delete_node(struct tree *tree, struct node *node, bool siblings) {
|
||||
|
||||
if (e->text) {
|
||||
/* we don't free non-editable titles or URLs */
|
||||
if (node->editable)
|
||||
if ((node->editable) || (node->folder))
|
||||
free(e->text);
|
||||
else {
|
||||
if (e->data == TREE_ELEMENT_URL) {
|
||||
/* reset URL characteristics */
|
||||
urldb_reset_url_visit_data(e->text);
|
||||
}
|
||||
|
||||
/* if not already 'deleted' then delete cookie */
|
||||
if (!node->deleted) {
|
||||
/* todo: delete cookie data */
|
||||
}
|
||||
|
||||
if (e->data != TREE_ELEMENT_TITLE &&
|
||||
e->data != TREE_ELEMENT_URL)
|
||||
@ -974,6 +988,33 @@ struct node *tree_create_leaf_node(struct node *parent, const char *title) {
|
||||
node->data.type = NODE_ELEMENT_TEXT;
|
||||
node->data.text = squash_whitespace(title);
|
||||
node->data.data = TREE_ELEMENT_TITLE;
|
||||
node->editable = true;
|
||||
if (parent)
|
||||
tree_link_node(parent, node, false);
|
||||
return node;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a leaf node with the specified title, and links it into the tree.
|
||||
*
|
||||
* \param parent the parent node, or NULL not to link
|
||||
* \param title the node title
|
||||
* \return the newly created node.
|
||||
*/
|
||||
struct node *tree_create_leaf_node_shared(struct node *parent, const char *title) {
|
||||
struct node *node;
|
||||
|
||||
assert(title);
|
||||
|
||||
node = calloc(sizeof(struct node), 1);
|
||||
if (!node) return NULL;
|
||||
node->folder = false;
|
||||
node->data.parent = node;
|
||||
node->data.type = NODE_ELEMENT_TEXT;
|
||||
node->data.text = title;
|
||||
node->data.data = TREE_ELEMENT_TITLE;
|
||||
node->editable = false;
|
||||
if (parent)
|
||||
tree_link_node(parent, node, false);
|
||||
return node;
|
||||
@ -1009,7 +1050,6 @@ struct node *tree_create_URL_node(struct node *parent,
|
||||
node = tree_create_leaf_node(parent, title);
|
||||
if (!node)
|
||||
return NULL;
|
||||
node->editable = true;
|
||||
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_THUMBNAIL);
|
||||
if (element)
|
||||
@ -1050,12 +1090,9 @@ struct node *tree_create_URL_node_shared(struct node *parent,
|
||||
title = data->title;
|
||||
else
|
||||
title = url;
|
||||
node = tree_create_leaf_node(parent, title);
|
||||
node = tree_create_leaf_node_shared(parent, title);
|
||||
if (!node)
|
||||
return NULL;
|
||||
free(node->data.text);
|
||||
node->data.text = title;
|
||||
node->editable = false;
|
||||
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_THUMBNAIL);
|
||||
if (element)
|
||||
@ -1073,6 +1110,102 @@ struct node *tree_create_URL_node_shared(struct node *parent,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates a tree entry for a cookie, and links it into the tree.
|
||||
*
|
||||
* All information is used directly from the url_data, and as such cannot be
|
||||
* edited and should never be freed.
|
||||
*
|
||||
* \param parent the node to link to
|
||||
* \param url the URL
|
||||
* \param data the cookie data to use
|
||||
* \return the node created, or NULL for failure
|
||||
*/
|
||||
struct node *tree_create_cookie_node(struct node *parent,
|
||||
const struct cookie_data *data) {
|
||||
struct node *node;
|
||||
struct node_element *element;
|
||||
char buffer[256];
|
||||
char buffer2[16];
|
||||
|
||||
node = tree_create_leaf_node(parent, data->name);
|
||||
if (!node)
|
||||
return NULL;
|
||||
node->data.data = TREE_ELEMENT_NAME;
|
||||
node->editable = false;
|
||||
|
||||
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_PERSISTENT);
|
||||
if (element) {
|
||||
snprintf(buffer, 256, messages_get("TreePersistent"),
|
||||
data->no_destroy ? messages_get("Yes") : messages_get("No"));
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_VERSION);
|
||||
if (element) {
|
||||
snprintf(buffer2, 16, "TreeVersion%i", data->version);
|
||||
snprintf(buffer, 256, messages_get("TreeVersion"), messages_get(buffer2));
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_SECURE);
|
||||
if (element) {
|
||||
snprintf(buffer, 256, messages_get("TreeSecure"),
|
||||
data->secure ? messages_get("Yes") : messages_get("No"));
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_LAST_USED);
|
||||
if (element) {
|
||||
snprintf(buffer, 256, messages_get("TreeLastUsed"),
|
||||
(data->last_used > 0) ?
|
||||
ctime(&data->last_used) : messages_get("TreeUnknown"));
|
||||
if (data->last_used > 0)
|
||||
buffer[strlen(buffer) - 1] = '\0';
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_EXPIRES);
|
||||
if (element) {
|
||||
snprintf(buffer, 256, messages_get("TreeExpires"),
|
||||
(data->expires > 0) ?
|
||||
ctime(&data->expires) : messages_get("TreeUnknown"));
|
||||
if (data->expires > 0)
|
||||
buffer[strlen(buffer) - 1] = '\0';
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_PATH);
|
||||
if (element) {
|
||||
snprintf(buffer, 256, messages_get("TreePath"), data->path,
|
||||
data->path_from_set ? messages_get("TreeHeaders") : "");
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_DOMAIN);
|
||||
if (element) {
|
||||
snprintf(buffer, 256, messages_get("TreeDomain"), data->domain,
|
||||
data->domain_from_set ? messages_get("TreeHeaders") : "");
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
if ((data->comment) && (strcmp(data->comment, ""))) {
|
||||
LOG(("Comment: '%s'", data->comment));
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_COMMENT);
|
||||
if (element) {
|
||||
snprintf(buffer, 256, messages_get("TreeComment"), data->comment);
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
}
|
||||
element = tree_create_node_element(node, TREE_ELEMENT_VALUE);
|
||||
if (element) {
|
||||
snprintf(buffer, 256, messages_get("TreeValue"),
|
||||
data->value ? data->value : messages_get("TreeUnused"));
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
|
||||
/* add version, last_used, expires,
|
||||
* path, domain, comment, value */
|
||||
tree_set_node_sprite(node, "small_xxx", "small_xxx");
|
||||
tree_recalculate_node(node, false);
|
||||
return node;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Creates an empty text node element and links it to a node.
|
||||
*
|
||||
|
@ -13,8 +13,10 @@
|
||||
#define _NETSURF_DESKTOP_TREE_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
struct url_data;
|
||||
struct cookie_data;
|
||||
|
||||
typedef enum {
|
||||
TREE_ELEMENT_URL,
|
||||
@ -23,7 +25,17 @@ typedef enum {
|
||||
TREE_ELEMENT_VISITS,
|
||||
TREE_ELEMENT_VISITED,
|
||||
TREE_ELEMENT_THUMBNAIL,
|
||||
TREE_ELEMENT_TITLE
|
||||
TREE_ELEMENT_TITLE,
|
||||
TREE_ELEMENT_NAME,
|
||||
TREE_ELEMENT_VALUE,
|
||||
TREE_ELEMENT_COMMENT,
|
||||
TREE_ELEMENT_DOMAIN,
|
||||
TREE_ELEMENT_PATH,
|
||||
TREE_ELEMENT_EXPIRES,
|
||||
TREE_ELEMENT_LAST_USED,
|
||||
TREE_ELEMENT_SECURE,
|
||||
TREE_ELEMENT_VERSION,
|
||||
TREE_ELEMENT_PERSISTENT
|
||||
} node_element_data;
|
||||
|
||||
#define NODE_INSTEP 40
|
||||
@ -85,9 +97,9 @@ struct tree {
|
||||
int window_width; /* <-- Tree window width */
|
||||
int window_height; /* <-- Tree window height */
|
||||
int edit_handle; /* <-- Handle for editing information */
|
||||
uintptr_t textarea_handle; /* <-- Handle for UTF-8 textarea */
|
||||
bool movable; /* <-- Whether nodes can be moved */
|
||||
struct node_element *editing; /* <-- Node element being edited */
|
||||
char edit_buffer[256]; /* <-- Editing buffer */
|
||||
struct node *temp_selection; /* <-- Temporarily selected node */
|
||||
struct toolbar *toolbar; /* <-- Tree toolbar */
|
||||
};
|
||||
@ -114,7 +126,6 @@ void tree_draw(struct tree *tree, int clip_x, int clip_y, int clip_width,
|
||||
void tree_link_node(struct node *link, struct node *node, bool before);
|
||||
void tree_delink_node(struct node *node);
|
||||
struct node *tree_create_folder_node(struct node *parent, const char *title);
|
||||
struct node *tree_create_leaf_node(struct node *parent, const char *title);
|
||||
void tree_set_node_sprite(struct node *node, const char *sprite,
|
||||
const char *expanded);
|
||||
struct node *tree_create_URL_node(struct node *parent,
|
||||
@ -122,6 +133,8 @@ struct node *tree_create_URL_node(struct node *parent,
|
||||
const char *title);
|
||||
struct node *tree_create_URL_node_shared(struct node *parent,
|
||||
const char *url, const struct url_data *data);
|
||||
struct node *tree_create_cookie_node(struct node *parent,
|
||||
const struct cookie_data *data);
|
||||
void tree_set_node_expanded(struct node *node, bool expanded);
|
||||
void tree_set_node_selected(struct tree *tree, struct node *node,
|
||||
bool selected);
|
||||
|
@ -326,3 +326,7 @@ char *url_to_path(const char *url)
|
||||
return strdup(url + 5);
|
||||
}
|
||||
|
||||
bool cookies_update(const char *domain, const struct cookie_data *data)
|
||||
{
|
||||
retutn true;
|
||||
}
|
||||
|
2
makefile
2
makefile
@ -33,7 +33,7 @@ OBJECTS_RISCOS = $(OBJECTS_COMMON) $(OBJECTS_IMAGE)
|
||||
OBJECTS_RISCOS += browser.o history_core.o netsurf.o selection.o \
|
||||
textinput.o version.o gesture_core.o # desktop/
|
||||
OBJECTS_RISCOS += 401login.o artworks.o assert.o awrender.o bitmap.o \
|
||||
buffer.o configure.o debugwin.o \
|
||||
buffer.o cookies.o configure.o debugwin.o \
|
||||
dialog.o download.o draw.o filetype.o font.o \
|
||||
global_history.o gui.o help.o history.o hotlist.o image.o \
|
||||
menus.o message.o palettes.o plotters.o plugin.o print.o \
|
||||
|
201
riscos/cookies.c
Normal file
201
riscos/cookies.c
Normal file
@ -0,0 +1,201 @@
|
||||
/*
|
||||
* 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 2006 Richard Wilson <info@tinct.net>
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* Cookies (implementation).
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include "oslib/wimp.h"
|
||||
#include "oslib/wimpspriteop.h"
|
||||
#include "netsurf/content/urldb.h"
|
||||
#include "netsurf/desktop/cookies.h"
|
||||
#include "netsurf/desktop/tree.h"
|
||||
#include "netsurf/riscos/cookies.h"
|
||||
#include "netsurf/riscos/dialog.h"
|
||||
#include "netsurf/riscos/menus.h"
|
||||
#include "netsurf/riscos/options.h"
|
||||
#include "netsurf/riscos/theme.h"
|
||||
#include "netsurf/riscos/treeview.h"
|
||||
#include "netsurf/riscos/wimp.h"
|
||||
#include "netsurf/riscos/wimp_event.h"
|
||||
#include "netsurf/utils/messages.h"
|
||||
#include "netsurf/utils/log.h"
|
||||
#include "netsurf/utils/url.h"
|
||||
#include "netsurf/utils/utils.h"
|
||||
|
||||
static bool ro_gui_cookies_click(wimp_pointer *pointer);
|
||||
static struct node *ro_gui_cookies_find(const char *url);
|
||||
|
||||
/* The history window, toolbar and plot origins */
|
||||
static wimp_w cookies_window;
|
||||
struct tree *cookies_tree;
|
||||
static bool cookies_init;
|
||||
|
||||
/**
|
||||
* Initialise cookies tree
|
||||
*/
|
||||
void ro_gui_cookies_initialise(void)
|
||||
{
|
||||
/* create our window */
|
||||
cookies_window = ro_gui_dialog_create("tree");
|
||||
ro_gui_set_window_title(cookies_window,
|
||||
messages_get("Cookies"));
|
||||
ro_gui_wimp_event_register_redraw_window(cookies_window,
|
||||
ro_gui_tree_redraw);
|
||||
ro_gui_wimp_event_register_open_window(cookies_window,
|
||||
ro_gui_tree_open);
|
||||
ro_gui_wimp_event_register_mouse_click(cookies_window,
|
||||
ro_gui_cookies_click);
|
||||
|
||||
/* Create an empty tree */
|
||||
cookies_tree = calloc(sizeof(struct tree), 1);
|
||||
if (!cookies_tree) {
|
||||
warn_user("NoMemory", 0);
|
||||
return;
|
||||
}
|
||||
cookies_tree->root = tree_create_folder_node(NULL, "Root");
|
||||
if (!cookies_tree->root) {
|
||||
warn_user("NoMemory", 0);
|
||||
free(cookies_tree);
|
||||
cookies_tree = NULL;
|
||||
}
|
||||
cookies_tree->root->expanded = true;
|
||||
cookies_tree->handle = (int)cookies_window;
|
||||
cookies_tree->movable = false;
|
||||
ro_gui_wimp_event_set_user_data(cookies_window,
|
||||
cookies_tree);
|
||||
ro_gui_wimp_event_register_keypress(cookies_window,
|
||||
ro_gui_tree_keypress);
|
||||
|
||||
/* Create our toolbar */
|
||||
cookies_tree->toolbar = ro_gui_theme_create_toolbar(NULL,
|
||||
THEME_COOKIES_TOOLBAR);
|
||||
if (cookies_tree->toolbar)
|
||||
ro_gui_theme_attach_toolbar(cookies_tree->toolbar,
|
||||
cookies_window);
|
||||
|
||||
cookies_init = true;
|
||||
urldb_iterate_cookies(cookies_update);
|
||||
cookies_init = false;
|
||||
tree_initialise(cookies_tree);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Respond to a mouse click
|
||||
*
|
||||
* \param pointer the pointer state
|
||||
* \return true to indicate click handled
|
||||
*/
|
||||
bool ro_gui_cookies_click(wimp_pointer *pointer)
|
||||
{
|
||||
ro_gui_tree_click(pointer, cookies_tree);
|
||||
if (pointer->buttons == wimp_CLICK_MENU)
|
||||
ro_gui_menu_create(cookies_menu, pointer->pos.x,
|
||||
pointer->pos.y, pointer->w);
|
||||
else
|
||||
ro_gui_menu_prepare_action(pointer->w, TREE_SELECTION, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Attempts to process an interactive help message request
|
||||
*
|
||||
* \param x the x co-ordinate to give help for
|
||||
* \param y the x co-ordinate to give help for
|
||||
* \return the message code index
|
||||
*/
|
||||
int ro_gui_cookies_help(int x, int y)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Perform cookie addition
|
||||
*
|
||||
* \param data Cookie data for a domain
|
||||
* \return true (for urldb_iterate_entries)
|
||||
*/
|
||||
bool cookies_update(const struct cookie_data *data)
|
||||
{
|
||||
struct node *parent;
|
||||
struct node *node = NULL;
|
||||
struct node *child;
|
||||
const struct cookie_data *cookie;
|
||||
|
||||
assert(data);
|
||||
|
||||
/* check if we're a domain, and add get the first cookie */
|
||||
for (cookie = data; cookie->prev; cookie = cookie->prev);
|
||||
|
||||
if (!cookies_init) {
|
||||
node = ro_gui_cookies_find(data->domain);
|
||||
if (node) {
|
||||
/* mark as deleted so we don't remove the cookies */
|
||||
for (child = node->child; child; child = child->next)
|
||||
child->deleted = true;
|
||||
if (node->child)
|
||||
tree_delete_node(cookies_tree, node->child,
|
||||
true);
|
||||
}
|
||||
}
|
||||
|
||||
if (!node) {
|
||||
for (parent = cookies_tree->root->child; parent;
|
||||
parent = parent->next) {
|
||||
if (strcmp(cookie->domain, parent->data.text) < 0)
|
||||
break;
|
||||
}
|
||||
if (!parent) {
|
||||
node = tree_create_folder_node(cookies_tree->root,
|
||||
cookie->domain);
|
||||
} else {
|
||||
node = tree_create_folder_node(NULL, data->domain);
|
||||
if (node)
|
||||
tree_link_node(parent, node, true);
|
||||
}
|
||||
}
|
||||
if (!node)
|
||||
return true;
|
||||
node->editable = false;
|
||||
|
||||
for (; cookie; cookie = cookie->next)
|
||||
tree_create_cookie_node(node, cookie);
|
||||
if (!cookies_init) {
|
||||
tree_handle_node_changed(cookies_tree, node,
|
||||
true, false);
|
||||
tree_redraw_area(cookies_tree,
|
||||
node->box.x - NODE_INSTEP,
|
||||
0, NODE_INSTEP, 16384);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Find an entry in the cookie tree
|
||||
*
|
||||
* \param url The URL to find
|
||||
* \return Pointer to node, or NULL if not found
|
||||
*/
|
||||
struct node *ro_gui_cookies_find(const char *url)
|
||||
{
|
||||
struct node *node;
|
||||
|
||||
for (node = cookies_tree->root->child; node; node = node->next) {
|
||||
if (!strcmp(url, node->data.text))
|
||||
return node;
|
||||
}
|
||||
return NULL;
|
||||
}
|
19
riscos/cookies.h
Normal file
19
riscos/cookies.h
Normal file
@ -0,0 +1,19 @@
|
||||
/*
|
||||
* 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 2006 Richard Wilson <info@tinct.net>
|
||||
*/
|
||||
|
||||
/** \file
|
||||
* Cookies (interface).
|
||||
*/
|
||||
|
||||
#ifndef _NETSURF_RISCOS_COOKIES_H_
|
||||
#define _NETSURF_RISCOS_COOKIES_H_
|
||||
|
||||
void ro_gui_cookies_initialise(void);
|
||||
int ro_gui_cookies_help(int x, int y);
|
||||
|
||||
|
||||
#endif
|
@ -12,6 +12,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include "oslib/wimp.h"
|
||||
#include "netsurf/content/content.h"
|
||||
#include "netsurf/riscos/dialog.h"
|
||||
#include "netsurf/riscos/wimp_event.h"
|
||||
#include "netsurf/utils/log.h"
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "netsurf/desktop/netsurf.h"
|
||||
#include "netsurf/render/font.h"
|
||||
#include "netsurf/riscos/configure.h"
|
||||
#include "netsurf/riscos/cookies.h"
|
||||
#include "netsurf/riscos/dialog.h"
|
||||
#include "netsurf/riscos/global_history.h"
|
||||
#include "netsurf/riscos/gui.h"
|
||||
@ -102,6 +103,9 @@ void ro_gui_dialog_init(void)
|
||||
/* global history window */
|
||||
ro_gui_global_history_initialise();
|
||||
|
||||
/* cookies window */
|
||||
ro_gui_cookies_initialise();
|
||||
|
||||
/* theme installation */
|
||||
dialog_theme_install = ro_gui_dialog_create("theme_inst");
|
||||
ro_gui_wimp_event_register_cancel(dialog_theme_install,
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "oslib/wimpspriteop.h"
|
||||
#include "netsurf/content/fetch.h"
|
||||
#include "netsurf/desktop/gui.h"
|
||||
#include "netsurf/desktop/netsurf.h"
|
||||
#include "netsurf/riscos/dialog.h"
|
||||
#include "netsurf/riscos/options.h"
|
||||
#include "netsurf/riscos/save.h"
|
||||
|
@ -90,7 +90,6 @@ void ro_gui_global_history_initialise(void)
|
||||
}
|
||||
global_history_tree->root->expanded = true;
|
||||
ro_gui_global_history_initialise_nodes();
|
||||
tree_initialise(global_history_tree);
|
||||
global_history_tree->handle = (int)global_history_window;
|
||||
global_history_tree->movable = false;
|
||||
ro_gui_wimp_event_set_user_data(global_history_window,
|
||||
@ -122,6 +121,7 @@ void ro_gui_global_history_initialise(void)
|
||||
global_history_init = true;
|
||||
urldb_iterate_entries(global_history_add_internal);
|
||||
global_history_init = false;
|
||||
tree_initialise(global_history_tree);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -321,9 +321,11 @@ void gui_init(int argc, char** argv)
|
||||
if (!option_toolbar_browser)
|
||||
option_toolbar_browser = strdup("0123|58|9");
|
||||
if (!option_toolbar_hotlist)
|
||||
option_toolbar_hotlist = strdup("401|23");
|
||||
option_toolbar_hotlist = strdup("40|12|3");
|
||||
if (!option_toolbar_history)
|
||||
option_toolbar_history = strdup("01|23");
|
||||
option_toolbar_history = strdup("0|12|3");
|
||||
if (!option_toolbar_cookies)
|
||||
option_toolbar_cookies = strdup("0|12");
|
||||
if (!option_ca_bundle)
|
||||
option_ca_bundle = strdup("NetSurf:Resources.ca-bundle");
|
||||
if (!option_cookie_file)
|
||||
|
14
riscos/gui.h
14
riscos/gui.h
@ -15,12 +15,9 @@
|
||||
#include <oslib/osspriteop.h>
|
||||
#include <oslib/wimp.h>
|
||||
#include <rufl.h>
|
||||
#include "netsurf/utils/config.h"
|
||||
#include "netsurf/desktop/browser.h"
|
||||
#include "netsurf/desktop/netsurf.h"
|
||||
#include "netsurf/desktop/gui.h"
|
||||
#include "netsurf/desktop/options.h"
|
||||
#include "netsurf/desktop/tree.h"
|
||||
#include "netsurf/content/content_type.h"
|
||||
#include "netsurf/utils/config.h"
|
||||
|
||||
#define RISCOS5 0xAA
|
||||
|
||||
@ -33,6 +30,11 @@ extern const char * NETSURF_DIR;
|
||||
|
||||
struct toolbar;
|
||||
struct plotter_table;
|
||||
struct gui_window;
|
||||
struct tree;
|
||||
struct node;
|
||||
struct history;
|
||||
struct css_style;
|
||||
|
||||
extern wimp_t task_handle; /**< RISC OS wimp task handle. */
|
||||
|
||||
@ -51,7 +53,7 @@ extern bool gui_redraw_debug;
|
||||
extern osspriteop_area *gui_sprites;
|
||||
extern bool dialog_folder_add, dialog_entry_add, hotlist_insert;
|
||||
extern bool print_active, print_text_black;
|
||||
extern struct tree *hotlist_tree, *global_history_tree;
|
||||
extern struct tree *hotlist_tree, *global_history_tree, *cookies_tree;
|
||||
|
||||
typedef enum { GUI_DRAG_NONE, GUI_DRAG_SELECTION, GUI_DRAG_DOWNLOAD_SAVE,
|
||||
GUI_DRAG_SAVE, GUI_DRAG_SCROLL, GUI_DRAG_STATUS_RESIZE,
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "oslib/taskmanager.h"
|
||||
#include "oslib/wimp.h"
|
||||
#include "netsurf/desktop/tree.h"
|
||||
#include "netsurf/riscos/cookies.h"
|
||||
#include "netsurf/riscos/global_history.h"
|
||||
#include "netsurf/riscos/gui.h"
|
||||
#include "netsurf/riscos/help.h"
|
||||
@ -35,15 +36,17 @@
|
||||
Help keys should be registered using the wimp_event system to be
|
||||
recognised. The only special case help values are:
|
||||
|
||||
HelpIconbar Iconbar (no icon suffix is used)
|
||||
HelpHotlist Hotlist window [*]
|
||||
HelpGHistory Global history window [*]
|
||||
HelpBrowser Browser window [*]
|
||||
HelpIconbar Iconbar (no icon suffix is used)
|
||||
HelpBrowser Browser window [*]
|
||||
HelpHotlist Hotlist window [*]
|
||||
HelpGHistory Global history window [*]
|
||||
HelpCookies Cookies window [*]
|
||||
|
||||
HelpIconMenu Iconbar menu
|
||||
HelpBrowserMenu Browser window menu
|
||||
HelpHotlistMenu Hotlist window menu
|
||||
HelpGHistoryMenu Global history window menu
|
||||
HelpIconMenu Iconbar menu
|
||||
HelpBrowserMenu Browser window menu
|
||||
HelpHotlistMenu Hotlist window menu
|
||||
HelpGHistoryMenu Global history window menu
|
||||
HelpCookiesMenu Cookie window menu
|
||||
|
||||
The prefixes are followed by either the icon number (eg 'HelpToolbar7'),
|
||||
or a series of numbers representing the menu structure (eg
|
||||
@ -114,6 +117,11 @@ void ro_gui_interactive_help_request(wimp_message *message) {
|
||||
sprintf(message_token, "HelpGHistory%i",
|
||||
ro_gui_global_history_help(message_data->pos.x,
|
||||
message_data->pos.y));
|
||||
else if ((cookies_tree) &&
|
||||
(window == (wimp_w)cookies_tree->handle))
|
||||
sprintf(message_token, "HelpGHistory%i",
|
||||
ro_gui_cookies_help(message_data->pos.x,
|
||||
message_data->pos.y));
|
||||
else if ((g = ro_gui_window_lookup(window)) != NULL)
|
||||
sprintf(message_token, "HelpBrowser%i", (int)icon);
|
||||
|
||||
@ -153,6 +161,8 @@ void ro_gui_interactive_help_request(wimp_message *message) {
|
||||
sprintf(message_token, "HelpHotlistMenu");
|
||||
else if (current_menu == global_history_menu)
|
||||
sprintf(message_token, "HelpGHistoryMenu");
|
||||
else if (current_menu == cookies_menu)
|
||||
sprintf(message_token, "HelpCookiesMenu");
|
||||
else
|
||||
return;
|
||||
|
||||
|
@ -71,6 +71,8 @@ void ro_gui_history_open(struct browser_window *bw,
|
||||
os_box box = {0, 0, 0, 0};
|
||||
wimp_window_state state;
|
||||
os_error *error;
|
||||
|
||||
assert(history);
|
||||
|
||||
history_current = history;
|
||||
history_bw = bw;
|
||||
@ -164,7 +166,7 @@ void ro_gui_history_mouse_at(wimp_pointer *pointer)
|
||||
wimp_icon_state ic;
|
||||
os_box box = {0, 0, 0, 0};
|
||||
os_error *error;
|
||||
|
||||
|
||||
/* If the mouse hasn't moved, or if we don't want tooltips, exit */
|
||||
if ((mouse_x == pointer->pos.x && mouse_y == pointer->pos.y) ||
|
||||
!option_history_tooltip)
|
||||
|
@ -23,10 +23,12 @@
|
||||
#include "netsurf/content/urldb.h"
|
||||
#include "netsurf/desktop/gui.h"
|
||||
#include "netsurf/desktop/history_core.h"
|
||||
#include "netsurf/desktop/netsurf.h"
|
||||
#include "netsurf/render/box.h"
|
||||
#include "netsurf/riscos/dialog.h"
|
||||
#include "netsurf/render/form.h"
|
||||
#include "netsurf/riscos/configure.h"
|
||||
#include "netsurf/riscos/cookies.h"
|
||||
#include "netsurf/riscos/gui.h"
|
||||
#include "netsurf/riscos/global_history.h"
|
||||
#include "netsurf/riscos/help.h"
|
||||
@ -129,7 +131,7 @@ static wimp_i current_menu_icon;
|
||||
/** The height of the iconbar menu */
|
||||
int iconbar_menu_height = 5 * 44;
|
||||
/** The available menus */
|
||||
wimp_menu *iconbar_menu, *browser_menu, *hotlist_menu, *global_history_menu,
|
||||
wimp_menu *iconbar_menu, *browser_menu, *hotlist_menu, *global_history_menu, *cookies_menu,
|
||||
*image_quality_menu, *browser_toolbar_menu,
|
||||
*tree_toolbar_menu, *proxy_type_menu, *languages_menu;
|
||||
/** URL suggestion menu */
|
||||
@ -148,7 +150,7 @@ wimp_menu *url_suggest_menu = (wimp_menu *)&url_suggest;
|
||||
void ro_gui_menu_init(void)
|
||||
{
|
||||
/* iconbar menu */
|
||||
NS_MENU(9) iconbar_definition = {
|
||||
NS_MENU(10) iconbar_definition = {
|
||||
"NetSurf", {
|
||||
{ "Info", NO_ACTION, dialog_info },
|
||||
{ "AppHelp", HELP_OPEN_CONTENTS, 0 },
|
||||
@ -156,6 +158,7 @@ void ro_gui_menu_init(void)
|
||||
{ "Open.OpenURL", BROWSER_NAVIGATE_URL, dialog_openurl },
|
||||
{ "Open.HotlistShow", HOTLIST_SHOW, 0 },
|
||||
{ "Open.HistGlobal", HISTORY_SHOW_GLOBAL, 0 },
|
||||
{ "Open.ShowCookies", COOKIES_SHOW, 0 },
|
||||
{ "Choices", CHOICES_SHOW, 0 },
|
||||
{ "Quit", APPLICATION_QUIT, 0 },
|
||||
{NULL, 0, 0}
|
||||
@ -165,7 +168,7 @@ void ro_gui_menu_init(void)
|
||||
(struct ns_menu *)&iconbar_definition);
|
||||
|
||||
/* browser menu */
|
||||
NS_MENU(66) browser_definition = {
|
||||
NS_MENU(68) browser_definition = {
|
||||
"NetSurf", {
|
||||
{ "Page", BROWSER_PAGE, 0 },
|
||||
{ "Page.PageInfo",BROWSER_PAGE_INFO, dialog_pageinfo },
|
||||
@ -220,6 +223,8 @@ void ro_gui_menu_init(void)
|
||||
{ "Utilities.History", HISTORY_SHOW_GLOBAL, 0 },
|
||||
{ "Utilities.History.HistLocal", HISTORY_SHOW_LOCAL, 0 },
|
||||
{ "Utilities.History.HistGlobal", HISTORY_SHOW_GLOBAL, 0 },
|
||||
{ "Utilities.Cookies", COOKIES_SHOW, 0 },
|
||||
{ "Utilities.Cookies.ShowCookies", COOKIES_SHOW, 0 },
|
||||
{ "Utilities.FindText", BROWSER_FIND_TEXT, dialog_search },
|
||||
{ "Utilities.Window", NO_ACTION, 0 },
|
||||
{ "Utilities.Window.WindowSave", BROWSER_WINDOW_DEFAULT, 0 },
|
||||
@ -296,6 +301,30 @@ void ro_gui_menu_init(void)
|
||||
global_history_menu = ro_gui_menu_define_menu(
|
||||
(struct ns_menu *)&global_history_definition);
|
||||
|
||||
/* history menu */
|
||||
NS_MENU(17) cookies_definition = {
|
||||
"Cookies", {
|
||||
{ "Cookies", NO_ACTION, 0 },
|
||||
{ "Cookies.Expand", TREE_EXPAND_ALL, 0 },
|
||||
{ "Cookies.Expand.All", TREE_EXPAND_ALL, 0 },
|
||||
{ "Cookies.Expand.Folders", TREE_EXPAND_FOLDERS, 0 },
|
||||
{ "Cookies.Expand.Links", TREE_EXPAND_LINKS, 0 },
|
||||
{ "Cookies.Collapse", TREE_COLLAPSE_ALL, 0 },
|
||||
{ "Cookies.Collapse.All", TREE_COLLAPSE_ALL, 0 },
|
||||
{ "Cookies.Collapse.Folders", TREE_COLLAPSE_FOLDERS, 0 },
|
||||
{ "Cookies.Collapse.Links", TREE_COLLAPSE_LINKS, 0 },
|
||||
{ "Cookies.Toolbars", NO_ACTION, 0 },
|
||||
{ "_Cookies.Toolbars.ToolButtons", TOOLBAR_BUTTONS, 0 },
|
||||
{ "Cookies.Toolbars.EditToolbar",TOOLBAR_EDIT, 0 },
|
||||
{ "Selection", TREE_SELECTION, 0 },
|
||||
{ "Selection.Delete", TREE_SELECTION_DELETE, 0 },
|
||||
{ "SelectAll", TREE_SELECT_ALL, 0 },
|
||||
{ "Clear", TREE_CLEAR_SELECTION, 0 },
|
||||
{NULL, 0, 0}
|
||||
}
|
||||
};
|
||||
cookies_menu = ro_gui_menu_define_menu(
|
||||
(struct ns_menu *)&cookies_definition);
|
||||
/* image quality menu */
|
||||
NS_MENU(5) images_definition = {
|
||||
"Display", {
|
||||
@ -1321,14 +1350,20 @@ menu_action ro_gui_menu_find_action(wimp_menu *menu, wimp_menu_entry *menu_entry
|
||||
*/
|
||||
void ro_gui_menu_set_entry_shaded(wimp_menu *menu, menu_action action,
|
||||
bool shaded) {
|
||||
struct menu_definition_entry *entry =
|
||||
ro_gui_menu_find_entry(menu, action);
|
||||
if (entry) {
|
||||
if (shaded)
|
||||
entry->menu_entry->icon_flags |= wimp_ICON_SHADED;
|
||||
else
|
||||
entry->menu_entry->icon_flags &= ~wimp_ICON_SHADED;
|
||||
}
|
||||
struct menu_definition_entry *entry;
|
||||
struct menu_definition *definition = ro_gui_menu_find_menu(menu);
|
||||
|
||||
if (!definition)
|
||||
return;
|
||||
|
||||
/* we can't use find_entry as multiple actions may appear in one menu */
|
||||
for (entry = definition->entries; entry; entry = entry->next)
|
||||
if (entry->action == action) {
|
||||
if (shaded)
|
||||
entry->menu_entry->icon_flags |= wimp_ICON_SHADED;
|
||||
else
|
||||
entry->menu_entry->icon_flags &= ~wimp_ICON_SHADED;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1430,6 +1465,11 @@ bool ro_gui_menu_handle_action(wimp_w owner, menu_action action,
|
||||
ro_gui_tree_show(hotlist_tree);
|
||||
return true;
|
||||
|
||||
/* cookies actions */
|
||||
case COOKIES_SHOW:
|
||||
ro_gui_tree_show(cookies_tree);
|
||||
return true;
|
||||
|
||||
/* page actions */
|
||||
case BROWSER_PAGE_INFO:
|
||||
if (!c)
|
||||
@ -1787,6 +1827,12 @@ void ro_gui_menu_prepare_action(wimp_w owner, menu_action action,
|
||||
!hotlist_tree);
|
||||
break;
|
||||
|
||||
/* cookies actions */
|
||||
case COOKIES_SHOW:
|
||||
ro_gui_menu_set_entry_shaded(current_menu, action,
|
||||
!cookies_tree);
|
||||
break;
|
||||
|
||||
/* page actions */
|
||||
case BROWSER_PAGE_INFO:
|
||||
ro_gui_menu_set_entry_shaded(current_menu,
|
||||
@ -2072,6 +2118,15 @@ void ro_gui_menu_prepare_action(wimp_w owner, menu_action action,
|
||||
if ((tree) && (tree->root))
|
||||
ro_gui_menu_set_entry_shaded(current_menu,
|
||||
action, !tree->root->child);
|
||||
if ((t) && (!t->editor) &&
|
||||
(t->type != THEME_BROWSER_TOOLBAR)) {
|
||||
ro_gui_set_icon_shaded_state(
|
||||
t->toolbar_handle,
|
||||
ICON_TOOLBAR_EXPAND, !tree->root->child);
|
||||
ro_gui_set_icon_shaded_state(
|
||||
t->toolbar_handle,
|
||||
ICON_TOOLBAR_OPEN, !tree->root->child);
|
||||
}
|
||||
break;
|
||||
case TREE_SELECTION:
|
||||
if ((!tree) || (!tree->root))
|
||||
@ -2196,6 +2251,8 @@ void ro_gui_menu_get_window_details(wimp_w w, struct gui_window **g,
|
||||
else if ((global_history_tree) &&
|
||||
(w == (wimp_w)global_history_tree->handle))
|
||||
*tree = global_history_tree;
|
||||
else if ((cookies_tree) && (w == (wimp_w)cookies_tree->handle))
|
||||
*tree = cookies_tree;
|
||||
else
|
||||
*tree = NULL;
|
||||
if (*tree)
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include "oslib/wimp.h"
|
||||
#include "netsurf/riscos/gui.h"
|
||||
|
||||
extern wimp_menu *iconbar_menu, *browser_menu, *hotlist_menu,
|
||||
extern wimp_menu *iconbar_menu, *browser_menu, *hotlist_menu, *cookies_menu,
|
||||
*global_history_menu, *image_quality_menu,
|
||||
*browser_toolbar_menu, *tree_toolbar_menu, *proxy_type_menu;
|
||||
extern wimp_menu *languages_menu, *url_suggest_menu;
|
||||
@ -40,6 +40,9 @@ typedef enum {
|
||||
HOTLIST_ADD_URL,
|
||||
HOTLIST_SHOW,
|
||||
|
||||
/* cookie actions */
|
||||
COOKIES_SHOW,
|
||||
|
||||
/* page actions */
|
||||
BROWSER_PAGE,
|
||||
BROWSER_PAGE_INFO,
|
||||
|
@ -32,6 +32,7 @@ extern bool option_toolbar_show_throbber;
|
||||
extern char *option_toolbar_browser;
|
||||
extern char *option_toolbar_hotlist;
|
||||
extern char *option_toolbar_history;
|
||||
extern char *option_toolbar_cookies;
|
||||
extern int option_window_x;
|
||||
extern int option_window_y;
|
||||
extern int option_window_width;
|
||||
@ -78,6 +79,7 @@ bool option_toolbar_show_throbber = true; \
|
||||
char *option_toolbar_browser = 0; \
|
||||
char *option_toolbar_hotlist = 0; \
|
||||
char *option_toolbar_history = 0; \
|
||||
char *option_toolbar_cookies = 0; \
|
||||
int option_window_x = 0; \
|
||||
int option_window_y = 0; \
|
||||
int option_window_width = 0; \
|
||||
@ -124,6 +126,7 @@ bool option_thumbnail_iconise = true;
|
||||
{ "toolbar_browser", OPTION_STRING, &option_toolbar_browser }, \
|
||||
{ "toolbar_hotlist", OPTION_STRING, &option_toolbar_hotlist }, \
|
||||
{ "toolbar_history", OPTION_STRING, &option_toolbar_history }, \
|
||||
{ "toolbar_cookies", OPTION_STRING, &option_toolbar_cookies }, \
|
||||
{ "window_x", OPTION_INTEGER, &option_window_x }, \
|
||||
{ "window_y", OPTION_INTEGER, &option_window_y }, \
|
||||
{ "window_width", OPTION_INTEGER, &option_window_width }, \
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "oslib/osspriteop.h"
|
||||
#include "oslib/wimp.h"
|
||||
#include "oslib/wimpspriteop.h"
|
||||
#include "netsurf/desktop/netsurf.h"
|
||||
#include "netsurf/desktop/save_text.h"
|
||||
#include "netsurf/desktop/selection.h"
|
||||
#include "netsurf/image/bitmap.h"
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "oslib/wimp.h"
|
||||
#include "oslib/wimpextend.h"
|
||||
#include "oslib/wimpspriteop.h"
|
||||
#include "netsurf/desktop/gui.h"
|
||||
#include "netsurf/riscos/dialog.h"
|
||||
#include "netsurf/riscos/gui.h"
|
||||
#include "netsurf/riscos/menus.h"
|
||||
@ -54,6 +55,8 @@ static const char * theme_hotlist_icons[] = {"delete", "expand", "open",
|
||||
"launch", "create", NULL};
|
||||
static const char * theme_history_icons[] = {"delete", "expand", "open",
|
||||
"launch", NULL};
|
||||
static const char * theme_cookies_icons[] = {"delete", "expand", "open",
|
||||
NULL};
|
||||
|
||||
static bool ro_gui_theme_add_descriptor(const char *folder, const char *leafname);
|
||||
static void ro_gui_theme_redraw(wimp_draw *redraw);
|
||||
@ -779,6 +782,11 @@ struct toolbar *ro_gui_theme_create_toolbar(struct theme_descriptor *descriptor,
|
||||
theme_history_icons,
|
||||
option_toolbar_history);
|
||||
break;
|
||||
case THEME_COOKIES_TOOLBAR:
|
||||
ro_gui_theme_add_toolbar_icons(toolbar,
|
||||
theme_cookies_icons,
|
||||
option_toolbar_cookies);
|
||||
break;
|
||||
case THEME_BROWSER_EDIT_TOOLBAR:
|
||||
ro_gui_theme_add_toolbar_icons(toolbar,
|
||||
theme_browser_icons,
|
||||
@ -794,6 +802,11 @@ struct toolbar *ro_gui_theme_create_toolbar(struct theme_descriptor *descriptor,
|
||||
theme_history_icons,
|
||||
"0123|");
|
||||
break;
|
||||
case THEME_COOKIES_EDIT_TOOLBAR:
|
||||
ro_gui_theme_add_toolbar_icons(toolbar,
|
||||
theme_cookies_icons,
|
||||
"012|");
|
||||
break;
|
||||
}
|
||||
|
||||
/* Claim the memory for our Wimp indirection
|
||||
@ -877,7 +890,8 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor,
|
||||
if ((toolbar->editor) ||
|
||||
(toolbar->type == THEME_HOTLIST_EDIT_TOOLBAR) ||
|
||||
(toolbar->type == THEME_HISTORY_EDIT_TOOLBAR) ||
|
||||
(toolbar->type == THEME_BROWSER_EDIT_TOOLBAR))
|
||||
(toolbar->type == THEME_BROWSER_EDIT_TOOLBAR) ||
|
||||
(toolbar->type == THEME_COOKIES_EDIT_TOOLBAR))
|
||||
theme_toolbar_window.work_flags |= (wimp_BUTTON_CLICK_DRAG <<
|
||||
wimp_ICON_BUTTON_TYPE_SHIFT);
|
||||
theme_toolbar_window.flags &= ~wimp_WINDOW_AUTO_REDRAW;
|
||||
@ -916,6 +930,8 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor,
|
||||
case THEME_HOTLIST_EDIT_TOOLBAR:
|
||||
case THEME_HISTORY_TOOLBAR:
|
||||
case THEME_HISTORY_EDIT_TOOLBAR:
|
||||
case THEME_COOKIES_TOOLBAR:
|
||||
case THEME_COOKIES_EDIT_TOOLBAR:
|
||||
ro_gui_wimp_event_register_mouse_click(toolbar->toolbar_handle,
|
||||
ro_gui_tree_toolbar_click);
|
||||
break;
|
||||
@ -929,6 +945,9 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor,
|
||||
else if ((toolbar->type == THEME_HISTORY_TOOLBAR) ||
|
||||
(toolbar->type == THEME_HISTORY_EDIT_TOOLBAR))
|
||||
max_icon = ICON_TOOLBAR_HISTORY_LAST;
|
||||
else if ((toolbar->type == THEME_COOKIES_TOOLBAR) ||
|
||||
(toolbar->type == THEME_COOKIES_EDIT_TOOLBAR))
|
||||
max_icon = ICON_TOOLBAR_COOKIES_LAST;
|
||||
else
|
||||
max_icon = ICON_TOOLBAR_LAST;
|
||||
new_icon.w = toolbar->toolbar_handle;
|
||||
@ -939,6 +958,7 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor,
|
||||
if ((toolbar->editor) ||
|
||||
(toolbar->type == THEME_HOTLIST_EDIT_TOOLBAR) ||
|
||||
(toolbar->type == THEME_HISTORY_EDIT_TOOLBAR) ||
|
||||
(toolbar->type == THEME_COOKIES_EDIT_TOOLBAR) ||
|
||||
(toolbar->type == THEME_BROWSER_EDIT_TOOLBAR))
|
||||
new_icon.icon.flags |= (wimp_BUTTON_CLICK_DRAG <<
|
||||
wimp_ICON_BUTTON_TYPE_SHIFT);
|
||||
@ -1174,8 +1194,11 @@ bool ro_gui_theme_update_toolbar(struct theme_descriptor *descriptor,
|
||||
break;
|
||||
case THEME_HOTLIST_TOOLBAR:
|
||||
case THEME_HISTORY_TOOLBAR:
|
||||
case THEME_COOKIES_TOOLBAR:
|
||||
ro_gui_menu_prepare_action(toolbar->parent_handle,
|
||||
TREE_SELECTION, false);
|
||||
ro_gui_menu_prepare_action(toolbar->parent_handle,
|
||||
TREE_EXPAND_ALL, false);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@ -1822,6 +1845,10 @@ void ro_gui_theme_toggle_edit(struct toolbar *toolbar) {
|
||||
free(option_toolbar_history);
|
||||
option_toolbar_history = option;
|
||||
break;
|
||||
case THEME_COOKIES_TOOLBAR:
|
||||
free(option_toolbar_cookies);
|
||||
option_toolbar_cookies = option;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -1862,6 +1889,11 @@ void ro_gui_theme_toggle_edit(struct toolbar *toolbar) {
|
||||
toolbar->descriptor,
|
||||
THEME_HISTORY_EDIT_TOOLBAR);
|
||||
break;
|
||||
case THEME_COOKIES_TOOLBAR:
|
||||
toolbar->editor = ro_gui_theme_create_toolbar(
|
||||
toolbar->descriptor,
|
||||
THEME_COOKIES_EDIT_TOOLBAR);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
@ -2385,9 +2417,14 @@ void ro_gui_theme_set_help_prefix(struct toolbar *toolbar) {
|
||||
ro_gui_wimp_event_set_help_prefix(toolbar->toolbar_handle,
|
||||
"HelpGHistToolbar");
|
||||
break;
|
||||
case THEME_COOKIES_TOOLBAR:
|
||||
ro_gui_wimp_event_set_help_prefix(toolbar->toolbar_handle,
|
||||
"HelpCookiesToolbar");
|
||||
break;
|
||||
case THEME_BROWSER_EDIT_TOOLBAR:
|
||||
case THEME_HOTLIST_EDIT_TOOLBAR:
|
||||
case THEME_HISTORY_EDIT_TOOLBAR:
|
||||
case THEME_COOKIES_EDIT_TOOLBAR:
|
||||
ro_gui_wimp_event_set_help_prefix(toolbar->toolbar_handle,
|
||||
"HelpEditToolbar");
|
||||
break;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* This file is part of NetSurf, http://netsurf.sourceforge.net/
|
||||
* Licensed under the GNU General Public License,
|
||||
* http://www.opensource.org/licenses/gpl-license
|
||||
* http://www.opensource.org/licenses/gpl-license
|
||||
* Copyright 2005 Richard Wilson <info@tinct.net>
|
||||
*/
|
||||
|
||||
@ -38,6 +38,7 @@
|
||||
#define ICON_TOOLBAR_DELETE 0
|
||||
#define ICON_TOOLBAR_EXPAND 1
|
||||
#define ICON_TOOLBAR_OPEN 2
|
||||
#define ICON_TOOLBAR_COOKIES_LAST 4
|
||||
#define ICON_TOOLBAR_LAUNCH 3
|
||||
#define ICON_TOOLBAR_HISTORY_LAST 4
|
||||
#define ICON_TOOLBAR_CREATE 4 // must be after last history icon
|
||||
@ -47,14 +48,17 @@
|
||||
#define ICON_TOOLBAR_SEPARATOR_BROWSER 11
|
||||
#define ICON_TOOLBAR_SEPARATOR_HOTLIST 5
|
||||
#define ICON_TOOLBAR_SEPARATOR_HISTORY 4
|
||||
#define ICON_TOOLBAR_SEPARATOR_COOKIES 3
|
||||
|
||||
typedef enum {
|
||||
THEME_BROWSER_TOOLBAR,
|
||||
THEME_HOTLIST_TOOLBAR,
|
||||
THEME_HISTORY_TOOLBAR,
|
||||
THEME_BROWSER_EDIT_TOOLBAR,
|
||||
THEME_HOTLIST_EDIT_TOOLBAR,
|
||||
THEME_HISTORY_EDIT_TOOLBAR
|
||||
THEME_BROWSER_TOOLBAR,
|
||||
THEME_HOTLIST_TOOLBAR,
|
||||
THEME_HISTORY_TOOLBAR,
|
||||
THEME_COOKIES_TOOLBAR,
|
||||
THEME_BROWSER_EDIT_TOOLBAR,
|
||||
THEME_HOTLIST_EDIT_TOOLBAR,
|
||||
THEME_HISTORY_EDIT_TOOLBAR,
|
||||
THEME_COOKIES_EDIT_TOOLBAR
|
||||
} toolbar_type;
|
||||
|
||||
struct theme_file_header {
|
||||
@ -113,13 +117,13 @@ struct toolbar {
|
||||
char *status_buffer; /**< buffer for status text (read only) */
|
||||
struct toolbar_icon *icon; /**< first toolbar icon (read only) */
|
||||
struct toolbar_icon *suggest; /**< suggestion toolbar icon (read only) */
|
||||
struct theme_descriptor *descriptor; /**< theme descriptor (read only) */
|
||||
struct theme_descriptor *descriptor; /**< theme descriptor (read only) */
|
||||
toolbar_type type; /**< toolbar type (read only) */
|
||||
struct toolbar *editor; /**< toolbar editor */
|
||||
};
|
||||
|
||||
struct theme_descriptor {
|
||||
char *leafname; /**< theme leafname */
|
||||
char *leafname; /**< theme leafname */
|
||||
char *filename; /**< theme filename */
|
||||
char name[32]; /**< theme name */
|
||||
char author[64]; /**< theme author */
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <swis.h>
|
||||
@ -31,6 +32,7 @@
|
||||
#include "netsurf/riscos/menus.h"
|
||||
#include "netsurf/riscos/theme.h"
|
||||
#include "netsurf/riscos/tinct.h"
|
||||
#include "netsurf/riscos/textarea.h"
|
||||
#include "netsurf/riscos/treeview.h"
|
||||
#include "netsurf/riscos/wimp.h"
|
||||
#include "netsurf/riscos/wimp_event.h"
|
||||
@ -561,14 +563,12 @@ void tree_update_URL_node(struct node *node,
|
||||
|
||||
element = tree_find_element(node, TREE_ELEMENT_LAST_VISIT);
|
||||
if (element) {
|
||||
if (data->last_visit > 0) {
|
||||
snprintf(buffer, 256, messages_get("TreeLast"),
|
||||
ctime((time_t *)&data->last_visit));
|
||||
buffer[strlen(buffer) - 1] = '\0';
|
||||
} else {
|
||||
snprintf(buffer, 256, messages_get("TreeLast"),
|
||||
snprintf(buffer, 256, messages_get("TreeLast"),
|
||||
(data->last_visit > 0) ?
|
||||
ctime((time_t *)&data->last_visit) :
|
||||
messages_get("TreeUnknown"));
|
||||
}
|
||||
if (data->last_visit > 0)
|
||||
buffer[strlen(buffer) - 1] = '\0';
|
||||
free(element->text);
|
||||
element->text = strdup(buffer);
|
||||
}
|
||||
@ -916,6 +916,7 @@ void ro_gui_tree_menu_closed(struct tree *tree) {
|
||||
tree_handle_node_element_changed(tree, &tree->temp_selection->data);
|
||||
tree->temp_selection = NULL;
|
||||
ro_gui_menu_prepare_action((wimp_w)tree->handle, TREE_SELECTION, false);
|
||||
ro_gui_menu_prepare_action((wimp_w)tree->handle, TREE_EXPAND_ALL, false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -990,10 +991,8 @@ bool ro_gui_tree_toolbar_click(wimp_pointer* pointer) {
|
||||
void ro_gui_tree_start_edit(struct tree *tree, struct node_element *element,
|
||||
wimp_pointer *pointer) {
|
||||
os_error *error;
|
||||
wimp_window_state state;
|
||||
struct node *parent;
|
||||
int toolbar_height = 0;
|
||||
int caret_x, caret_height, caret_index;
|
||||
|
||||
assert(tree);
|
||||
assert(element);
|
||||
@ -1014,8 +1013,6 @@ void ro_gui_tree_start_edit(struct tree *tree, struct node_element *element,
|
||||
}
|
||||
|
||||
tree->editing = element;
|
||||
snprintf(tree->edit_buffer, 256, element->text);
|
||||
tree->edit_buffer[255] = '\0';
|
||||
ro_gui_tree_edit_icon.w = (wimp_w)tree->handle;
|
||||
ro_gui_tree_edit_icon.icon.extent.x0 = tree->offset_x + element->box.x - 2;
|
||||
ro_gui_tree_edit_icon.icon.extent.x1 = tree->offset_x +
|
||||
@ -1026,32 +1023,26 @@ void ro_gui_tree_start_edit(struct tree *tree, struct node_element *element,
|
||||
element->box.y - element->box.height;
|
||||
if (element->type == NODE_ELEMENT_TEXT_PLUS_SPRITE)
|
||||
ro_gui_tree_edit_icon.icon.extent.x0 += NODE_INSTEP;
|
||||
ro_gui_tree_edit_icon.icon.data.indirected_text.text = tree->edit_buffer;
|
||||
ro_gui_tree_edit_icon.icon.data.indirected_text.text = element->text;
|
||||
error = xwimp_create_icon(&ro_gui_tree_edit_icon,
|
||||
(wimp_i *)&tree->edit_handle);
|
||||
if (error)
|
||||
LOG(("xwimp_create_icon: 0x%x: %s",
|
||||
error->errnum, error->errmess));
|
||||
if (pointer) {
|
||||
state.w = (wimp_w)tree->handle;
|
||||
error = xwimp_get_window_state(&state);
|
||||
if (error)
|
||||
LOG(("xwimp_get_window_state: 0x%x: %s",
|
||||
error->errnum, error->errmess));
|
||||
caret_x = pointer->pos.x - state.visible.x0;
|
||||
caret_height = element->box.height;
|
||||
caret_index = -1;
|
||||
} else {
|
||||
caret_x = 0;
|
||||
caret_height = -1;
|
||||
caret_index = strlen(tree->edit_buffer);
|
||||
|
||||
tree->textarea_handle = textarea_create((wimp_w)tree->handle,
|
||||
(wimp_i)tree->edit_handle, 0, "Homerton", 192);
|
||||
if (!tree->textarea_handle) {
|
||||
ro_gui_tree_stop_edit(tree);
|
||||
return;
|
||||
}
|
||||
error = xwimp_set_caret_position((wimp_w)tree->handle,
|
||||
(wimp_i)tree->edit_handle,
|
||||
caret_x, 0, caret_height, caret_index);
|
||||
if (error)
|
||||
LOG(("xwimp_set_caret_position: 0x%x: %s",
|
||||
error->errnum, error->errmess));
|
||||
textarea_set_text(tree->textarea_handle, element->text);
|
||||
if (pointer)
|
||||
textarea_set_caret_xy(tree->textarea_handle,
|
||||
pointer->pos.x, pointer->pos.y);
|
||||
else
|
||||
textarea_set_caret(tree->textarea_handle, strlen(element->text));
|
||||
|
||||
tree_handle_node_element_changed(tree, element);
|
||||
ro_gui_tree_scroll_visible(tree, element);
|
||||
}
|
||||
@ -1069,6 +1060,10 @@ void ro_gui_tree_stop_edit(struct tree *tree) {
|
||||
|
||||
if (!tree->editing) return;
|
||||
|
||||
if (tree->textarea_handle) {
|
||||
textarea_destroy(tree->textarea_handle);
|
||||
tree->textarea_handle = 0;
|
||||
}
|
||||
error = xwimp_delete_icon((wimp_w)tree->handle, (wimp_i)tree->edit_handle);
|
||||
if (error)
|
||||
LOG(("xwimp_delete_icon: 0x%x: %s",
|
||||
@ -1200,6 +1195,7 @@ void ro_gui_tree_open(wimp_open *open) {
|
||||
if (tree->toolbar)
|
||||
ro_gui_theme_process_toolbar(tree->toolbar, -1);
|
||||
ro_gui_menu_prepare_action((wimp_w)tree->handle, TREE_SELECTION, false);
|
||||
ro_gui_menu_prepare_action((wimp_w)tree->handle, TREE_EXPAND_ALL, false);
|
||||
}
|
||||
|
||||
|
||||
@ -1213,6 +1209,7 @@ void ro_gui_tree_open(wimp_open *open) {
|
||||
bool ro_gui_tree_keypress(wimp_key *key) {
|
||||
char *new_string;
|
||||
struct tree *tree;
|
||||
int strlen;
|
||||
|
||||
tree = (struct tree *)ro_gui_wimp_event_get_user_data(key->w);
|
||||
if (!tree)
|
||||
@ -1234,15 +1231,24 @@ bool ro_gui_tree_keypress(wimp_key *key) {
|
||||
TREE_CLEAR_SELECTION, false);
|
||||
return true;
|
||||
case wimp_KEY_RETURN:
|
||||
if (tree->editing) {
|
||||
new_string = strdup(tree->edit_buffer);
|
||||
if (new_string) {
|
||||
if (tree->editing->text) {
|
||||
free(tree->editing->text);
|
||||
tree->editing->text = NULL;
|
||||
}
|
||||
tree->editing->text = new_string;
|
||||
}
|
||||
if ((tree->editing) && (tree->textarea_handle)) {
|
||||
strlen = textarea_get_text(tree->textarea_handle,
|
||||
NULL, 0);
|
||||
if (strlen == -1) {
|
||||
ro_gui_tree_stop_edit(tree);
|
||||
return true;
|
||||
}
|
||||
new_string = malloc(strlen);
|
||||
if (!new_string) {
|
||||
ro_gui_tree_stop_edit(tree);
|
||||
LOG(("No memory for malloc()"));
|
||||
warn_user("NoMemory", 0);
|
||||
return true;
|
||||
}
|
||||
textarea_get_text(tree->textarea_handle,
|
||||
new_string, strlen);
|
||||
free(tree->editing->text);
|
||||
tree->editing->text = new_string;
|
||||
ro_gui_tree_stop_edit(tree);
|
||||
tree_recalculate_size(tree);
|
||||
} else {
|
||||
@ -1304,6 +1310,8 @@ void ro_gui_tree_selection_drag_end(wimp_dragged *drag) {
|
||||
(ro_gui_tree_current_drag_buttons == (wimp_CLICK_ADJUST << 4)));
|
||||
ro_gui_menu_prepare_action((wimp_w)ro_gui_tree_current_drag_tree->handle,
|
||||
TREE_SELECTION, false);
|
||||
ro_gui_menu_prepare_action((wimp_w)ro_gui_tree_current_drag_tree->handle,
|
||||
TREE_EXPAND_ALL, false);
|
||||
}
|
||||
|
||||
|
||||
|
@ -13,7 +13,9 @@
|
||||
#define _NETSURF_RISCOS_URLCOMPLETE_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "netsurf/riscos/gui.h"
|
||||
#include "oslib/wimp.h"
|
||||
|
||||
struct gui_window;
|
||||
|
||||
void ro_gui_url_complete_start(struct gui_window *g);
|
||||
bool ro_gui_url_complete_keypress(struct gui_window *g, int key);
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "netsurf/desktop/knockout.h"
|
||||
#include "netsurf/desktop/plotters.h"
|
||||
#include "netsurf/desktop/textinput.h"
|
||||
#include "netsurf/desktop/tree.h"
|
||||
#include "netsurf/desktop/gui.h"
|
||||
#include "netsurf/render/box.h"
|
||||
#include "netsurf/render/form.h"
|
||||
|
Loading…
Reference in New Issue
Block a user