Gitweb links:
...log
http://git.netsurf-browser.org/netsurf.git/shortlog/35d9baa14e40bbf65d6c947561033b05adfd2c1a
...commit
http://git.netsurf-browser.org/netsurf.git/commit/35d9baa14e40bbf65d6c947561033b05adfd2c1a
...tree
http://git.netsurf-browser.org/netsurf.git/tree/35d9baa14e40bbf65d6c947561033b05adfd2c1a
The branch, master has been updated
via 35d9baa14e40bbf65d6c947561033b05adfd2c1a (commit)
via 8547452232e1cc7664fe3af7cbcfc4cead9d7d92 (commit)
via 597d167b9d06d417872db81c8d328318e1b0d85a (commit)
from 124d3fe9f05f0c80dc75bcfec2b23302c8a1974a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commitdiff
http://git.netsurf-browser.org/netsurf.git/commit/?id=35d9baa14e40bbf65d6c947561033b05adfd2c1a
commit 35d9baa14e40bbf65d6c947561033b05adfd2c1a
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>
remove unused GTK treeview code completely repalced with core window API
diff --git a/frontends/gtk/Makefile b/frontends/gtk/Makefile
index 71dec1e..f9273f1 100644
--- a/frontends/gtk/Makefile
+++ b/frontends/gtk/Makefile
@@ -159,7 +159,7 @@ endif
# S_FRONTEND are sources purely for the GTK frontend
S_FRONTEND := gui.c schedule.c layout_pango.c bitmap.c plotters.c \
- treeview.c scaffolding.c gdk.c completion.c login.c throbber.c \
+ scaffolding.c gdk.c completion.c login.c throbber.c \
selection.c global_history.c window.c fetch.c download.c menu.c \
print.c search.c tabs.c toolbar.c gettext.c \
compat.c cookies.c hotlist.c viewdata.c viewsource.c \
diff --git a/frontends/gtk/gui.c b/frontends/gtk/gui.c
index 61560dd..d128dc2 100644
--- a/frontends/gtk/gui.c
+++ b/frontends/gtk/gui.c
@@ -49,7 +49,6 @@
#include "desktop/save_complete.h"
#include "desktop/save_pdf.h"
#include "desktop/searchweb.h"
-#include "desktop/tree.h"
#include "gtk/compat.h"
#include "gtk/warn.h"
@@ -61,7 +60,6 @@
#include "gtk/global_history.h"
#include "gtk/hotlist.h"
#include "gtk/throbber.h"
-#include "gtk/treeview.h"
#include "gtk/scaffolding.h"
#include "gtk/window.h"
#include "gtk/schedule.h"
diff --git a/frontends/gtk/treeview.c b/frontends/gtk/treeview.c
deleted file mode 100644
index e2b1c42..0000000
--- a/frontends/gtk/treeview.c
+++ /dev/null
@@ -1,631 +0,0 @@
-/*
- * Copyright 2004 Richard Wilson <[email protected]>
- * Copyright 2009 Paul Blokus <[email protected]>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/** \file
- * Generic tree handling (implementation).
- */
-
-#include <stdlib.h>
-#include <assert.h>
-#include <stdio.h>
-#include <limits.h>
-#include <string.h>
-#include <math.h>
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-
-#include "utils/log.h"
-#include "utils/utf8.h"
-#include "desktop/tree.h"
-#include "netsurf/plotters.h"
-
-#include "gtk/warn.h"
-#include "gtk/compat.h"
-#include "gtk/gui.h"
-#include "gtk/plotters.h"
-#include "gtk/treeview.h"
-
-struct nsgtk_treeview {
- GtkWindow *window;
- GtkScrolledWindow *scrolled;
- GtkDrawingArea *drawing_area;
- GtkIMContext *input_method;
- bool mouse_pressed;
- int mouse_pressed_x;
- int mouse_pressed_y;
- int last_x, last_y;
- browser_mouse_state mouse_state;
- struct tree *tree;
- unsigned int tree_flags; /* flags used with tree creation */
- struct sslcert_session_data *ssl_data; /**< SSL data when tree_flags
are TREE_SSLCERT */
-};
-
-void nsgtk_treeview_destroy(struct nsgtk_treeview *tv)
-{
- if (tv->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tv->ssl_data;
- }
-
- tree_delete(tv->tree);
- g_object_unref(tv->input_method);
- gtk_widget_destroy(GTK_WIDGET(tv->window));
- free(tv);
-}
-
-struct tree *nsgtk_treeview_get_tree(struct nsgtk_treeview *tv)
-{
- return tv->tree;
-}
-
-static void nsgtk_tree_redraw_request(int x, int y, int width, int height,
void *data)
-{
- struct nsgtk_treeview *tw = data;
-
- gtk_widget_queue_draw_area(GTK_WIDGET(tw->drawing_area),
- x, y, width, height);
-}
-
-
-/**
- * Updates the tree owner following a tree resize
- *
- * \param tree the tree to update the owner of
- * \param width The width to resize to.
- * \param height The height to resize to.
- * \param data The treeview resize.
- */
-static void nsgtk_tree_resized(struct tree *tree, int width, int height, void
*data)
-{
- struct nsgtk_treeview *tw = data;
-
- gtk_widget_set_size_request(GTK_WIDGET(tw->drawing_area),
- width, height);
- return;
-}
-
-/**
- * Scrolls the tree to make an element visible
- *
- * \param y Y coordinate of the element
- * \param height height of the element
- * \param data user data assigned to the tree on tree creation
- */
-static void nsgtk_tree_scroll_visible(int y, int height, void *data)
-{
- int y0, y1;
- gdouble page;
- struct nsgtk_treeview *tw = data;
- GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(tw->scrolled);
-
- assert(vadj);
-
- g_object_get(vadj, "page-size", &page, NULL);
-
- y0 = (int)(gtk_adjustment_get_value(vadj));
- y1 = y0 + page;
-
- if ((y >= y0) && (y + height <= y1))
- return;
- if (y + height > y1)
- y0 = y0 + (y + height - y1);
- if (y < y0)
- y0 = y;
- gtk_adjustment_set_value(vadj, y0);
-}
-
-
-/**
- * Retrieves the dimensions of the window with the tree
- *
- * \param data user data assigned to the tree on tree creation
- * \param width will be updated to window width if not NULL
- * \param height will be updated to window height if not NULL
- */
-static void nsgtk_tree_get_window_dimensions(int *width, int *height, void
*data)
-{
- struct nsgtk_treeview *tw = data;
- GtkAdjustment *vadj;
- GtkAdjustment *hadj;
- gdouble page;
-
- if (width != NULL) {
- hadj = gtk_scrolled_window_get_hadjustment(tw->scrolled);
- g_object_get(hadj, "page-size", &page, NULL);
- *width = page;
- }
-
- if (height != NULL) {
- vadj = gtk_scrolled_window_get_vadjustment(tw->scrolled);
- g_object_get(vadj, "page-size", &page, NULL);
- *height = page;
- }
-}
-
-#if GTK_CHECK_VERSION(3,0,0)
-
-static gboolean
-nsgtk_tree_window_draw_event(GtkWidget *widget, cairo_t *cr, gpointer data)
-{
- struct nsgtk_treeview *tv = (struct nsgtk_treeview *)data;
- struct redraw_context ctx = {
- .interactive = true,
- .background_images = true,
- .plot = &nsgtk_plotters
- };
- double x1;
- double y1;
- double x2;
- double y2;
-
- current_widget = widget;
- current_cr = cr;
-
- cairo_clip_extents(cr, &x1, &y1, &x2, &y2);
-
- if (tv->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tv->ssl_data;
- }
-
- tree_draw(tv->tree, 0, 0, x1, y1, x2 - x1, y2 - y1, &ctx);
-
- current_widget = NULL;
-
- return FALSE;
-}
-
-#else
-
-/* signal handler functions for a tree window */
-static gboolean
-nsgtk_tree_window_draw_event(GtkWidget *widget,
- GdkEventExpose *event,
- gpointer g)
-{
- struct nsgtk_treeview *tv = (struct nsgtk_treeview *)g;
- struct redraw_context ctx = {
- .interactive = true,
- .background_images = true,
- .plot = &nsgtk_plotters
- };
- int x, y, width, height;
-
- x = event->area.x;
- y = event->area.y;
- width = event->area.width;
- height = event->area.height;
-
- current_widget = widget;
- current_cr = gdk_cairo_create(nsgtk_widget_get_window(widget));
-
- if (tv->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tv->ssl_data;
- }
-
- tree_draw(tv->tree, 0, 0, x, y, width, height, &ctx);
-
- current_widget = NULL;
- cairo_destroy(current_cr);
-
- return FALSE;
-}
-
-#endif
-
-void nsgtk_tree_window_hide(GtkWidget *widget, gpointer g)
-{
-}
-
-static gboolean
-nsgtk_tree_window_button_press_event(GtkWidget *widget,
- GdkEventButton *event, gpointer g)
-{
- struct nsgtk_treeview *tw = g;
-
- gtk_im_context_reset(tw->input_method);
- gtk_widget_grab_focus(GTK_WIDGET(tw->drawing_area));
-
- tw->mouse_pressed = true;
- tw->mouse_pressed_x = event->x;
- tw->mouse_pressed_y = event->y;
-
- if (event->type == GDK_2BUTTON_PRESS) {
- tw->mouse_state = BROWSER_MOUSE_DOUBLE_CLICK;
- }
-
- switch (event->button) {
- case 1: tw->mouse_state |= BROWSER_MOUSE_PRESS_1; break;
- case 2: tw->mouse_state |= BROWSER_MOUSE_PRESS_2; break;
- }
- /* Handle the modifiers too */
- if (event->state & GDK_SHIFT_MASK)
- tw->mouse_state |= BROWSER_MOUSE_MOD_1;
- if (event->state & GDK_CONTROL_MASK)
- tw->mouse_state |= BROWSER_MOUSE_MOD_2;
- if (event->state & GDK_MOD1_MASK)
- tw->mouse_state |= BROWSER_MOUSE_MOD_3;
-
- /* Record where we pressed, for use when determining whether to start
- * a drag in motion notify events. */
- tw->last_x = event->x;
- tw->last_y = event->y;
-
- if (tw->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tw->ssl_data;
- }
-
- tree_mouse_action(tw->tree, tw->mouse_state, event->x, event->y);
-
- return TRUE;
-}
-
-static gboolean
-nsgtk_tree_window_button_release_event(GtkWidget *widget,
- GdkEventButton *event, gpointer g)
-{
- bool shift = event->state & GDK_SHIFT_MASK;
- bool ctrl = event->state & GDK_CONTROL_MASK;
- bool alt = event->state & GDK_MOD1_MASK;
- struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g;
- struct tree *tree = tw->tree;
-
- /* We consider only button 1 clicks as double clicks.
- * If the mouse state is PRESS then we are waiting for a release to emit
- * a click event, otherwise just reset the state to nothing*/
- if (tw->mouse_state & BROWSER_MOUSE_DOUBLE_CLICK) {
-
- if (tw->mouse_state & BROWSER_MOUSE_PRESS_1)
- tw->mouse_state ^= BROWSER_MOUSE_PRESS_1 |
- BROWSER_MOUSE_CLICK_1;
- else if (tw->mouse_state & BROWSER_MOUSE_PRESS_2)
- tw->mouse_state ^= (BROWSER_MOUSE_PRESS_2 |
- BROWSER_MOUSE_CLICK_2 |
- BROWSER_MOUSE_DOUBLE_CLICK);
-
- } else if (tw->mouse_state & BROWSER_MOUSE_PRESS_1) {
- tw->mouse_state ^= (BROWSER_MOUSE_PRESS_1 |
- BROWSER_MOUSE_CLICK_1);
- } else if (tw->mouse_state & BROWSER_MOUSE_PRESS_2) {
- tw->mouse_state ^= (BROWSER_MOUSE_PRESS_2 |
- BROWSER_MOUSE_CLICK_2);
- } else if (tw->mouse_state & BROWSER_MOUSE_HOLDING_1) {
- tw->mouse_state ^= (BROWSER_MOUSE_HOLDING_1 |
- BROWSER_MOUSE_DRAG_ON);
- } else if (tw->mouse_state & BROWSER_MOUSE_HOLDING_2) {
- tw->mouse_state ^= (BROWSER_MOUSE_HOLDING_2 |
- BROWSER_MOUSE_DRAG_ON);
- }
-
- /* Handle modifiers being removed */
- if (tw->mouse_state & BROWSER_MOUSE_MOD_1 && !shift)
- tw->mouse_state ^= BROWSER_MOUSE_MOD_1;
- if (tw->mouse_state & BROWSER_MOUSE_MOD_2 && !ctrl)
- tw->mouse_state ^= BROWSER_MOUSE_MOD_2;
- if (tw->mouse_state & BROWSER_MOUSE_MOD_3 && !alt)
- tw->mouse_state ^= BROWSER_MOUSE_MOD_3;
-
- if (tw->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tw->ssl_data;
- }
-
- if (tw->mouse_state &
- ~(BROWSER_MOUSE_MOD_1 |
- BROWSER_MOUSE_MOD_2 |
- BROWSER_MOUSE_MOD_3)) {
- tree_mouse_action(tree, tw->mouse_state,
- event->x, event->y);
- } else {
- tree_drag_end(tree, tw->mouse_state,
- tw->mouse_pressed_x,
- tw->mouse_pressed_y,
- event->x, event->y);
- }
-
- tw->mouse_state = 0;
- tw->mouse_pressed = false;
-
- return TRUE;
-}
-
-static gboolean
-nsgtk_tree_window_motion_notify_event(GtkWidget *widget,
- GdkEventMotion *event, gpointer g)
-{
- bool shift = event->state & GDK_SHIFT_MASK;
- bool ctrl = event->state & GDK_CONTROL_MASK;
- bool alt = event->state & GDK_MOD1_MASK;
- struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g;
- struct tree *tree = tw->tree;
-
- if (tw->mouse_pressed == false)
- return TRUE;
-
- if ((fabs(event->x - tw->last_x) < 5.0) &&
- (fabs(event->y - tw->last_y) < 5.0)) {
- /* Mouse hasn't moved far enough from press coordinate
- * for this to be considered a drag.
- */
- return FALSE;
- } else {
- /* This is a drag, ensure it's always treated as such,
- * even if we drag back over the press location.
- */
- tw->last_x = INT_MIN;
- tw->last_y = INT_MIN;
- }
-
- if (tw->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tw->ssl_data;
- }
-
- if (tw->mouse_state & BROWSER_MOUSE_PRESS_1) {
- /* Start button 1 drag */
- tree_mouse_action(tree, BROWSER_MOUSE_DRAG_1,
- tw->mouse_pressed_x, tw->mouse_pressed_y);
- /* Replace PRESS with HOLDING and declare drag in progress */
- tw->mouse_state ^= (BROWSER_MOUSE_PRESS_1 |
- BROWSER_MOUSE_HOLDING_1);
- tw->mouse_state |= BROWSER_MOUSE_DRAG_ON;
- return TRUE;
- }
- else if (tw->mouse_state & BROWSER_MOUSE_PRESS_2){
- /* Start button 2s drag */
- tree_mouse_action(tree, BROWSER_MOUSE_DRAG_2,
- tw->mouse_pressed_x, tw->mouse_pressed_y);
- /* Replace PRESS with HOLDING and declare drag in progress */
- tw->mouse_state ^= (BROWSER_MOUSE_PRESS_2 |
- BROWSER_MOUSE_HOLDING_2);
- tw->mouse_state |= BROWSER_MOUSE_DRAG_ON;
- return TRUE;
- }
-
- /* Handle modifiers being removed */
- if (tw->mouse_state & BROWSER_MOUSE_MOD_1 && !shift)
- tw->mouse_state ^= BROWSER_MOUSE_MOD_1;
- if (tw->mouse_state & BROWSER_MOUSE_MOD_2 && !ctrl)
- tw->mouse_state ^= BROWSER_MOUSE_MOD_2;
- if (tw->mouse_state & BROWSER_MOUSE_MOD_3 && !alt)
- tw->mouse_state ^= BROWSER_MOUSE_MOD_3;
-
- if (tw->mouse_state & (BROWSER_MOUSE_HOLDING_1 |
- BROWSER_MOUSE_HOLDING_2))
- tree_mouse_action(tree, tw->mouse_state, event->x,
- event->y);
-
- return TRUE;
-}
-
-
-static gboolean
-nsgtk_tree_window_keypress_event(GtkWidget *widget, GdkEventKey *event,
- gpointer g)
-{
- struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g;
- struct tree *tree = tw->tree;
- uint32_t nskey;
- double value;
- GtkAdjustment *vscroll;
- GtkAdjustment *hscroll;
- GtkAdjustment *scroll = NULL;
- gdouble hpage, vpage;
-
- if (gtk_im_context_filter_keypress(tw->input_method, event))
- return TRUE;
-
- nskey = gtk_gui_gdkkey_to_nskey(event);
-
- if (tw->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tw->ssl_data;
- }
-
- if (tree_keypress(tree, nskey) == true) {
- return TRUE;
- }
-
- vscroll = gtk_scrolled_window_get_vadjustment(tw->scrolled);
- hscroll = gtk_scrolled_window_get_hadjustment(tw->scrolled);
- g_object_get(vscroll, "page-size", &vpage, NULL);
- g_object_get(hscroll, "page-size", &hpage, NULL);
-
- switch (event->keyval) {
- case GDK_KEY(Home):
- case GDK_KEY(KP_Home):
- scroll = vscroll;
- value = nsgtk_adjustment_get_lower(scroll);
- break;
-
- case GDK_KEY(End):
- case GDK_KEY(KP_End):
- scroll = vscroll;
- value = nsgtk_adjustment_get_upper(scroll) - vpage;
- if (value < nsgtk_adjustment_get_lower(scroll))
- value = nsgtk_adjustment_get_lower(scroll);
- break;
-
- case GDK_KEY(Left):
- case GDK_KEY(KP_Left):
- scroll = hscroll;
- value = gtk_adjustment_get_value(scroll) -
- nsgtk_adjustment_get_step_increment(scroll);
- if (value < nsgtk_adjustment_get_lower(scroll))
- value = nsgtk_adjustment_get_lower(scroll);
- break;
-
- case GDK_KEY(Up):
- case GDK_KEY(KP_Up):
- scroll = vscroll;
- value = gtk_adjustment_get_value(scroll) -
- nsgtk_adjustment_get_step_increment(scroll);
- if (value < nsgtk_adjustment_get_lower(scroll))
- value = nsgtk_adjustment_get_lower(scroll);
- break;
-
- case GDK_KEY(Right):
- case GDK_KEY(KP_Right):
- scroll = hscroll;
- value = gtk_adjustment_get_value(scroll) +
- nsgtk_adjustment_get_step_increment(scroll);
- if (value > nsgtk_adjustment_get_upper(scroll) - hpage)
- value = nsgtk_adjustment_get_upper(scroll) -
hpage;
- break;
-
- case GDK_KEY(Down):
- case GDK_KEY(KP_Down):
- scroll = vscroll;
- value = gtk_adjustment_get_value(scroll) +
- nsgtk_adjustment_get_step_increment(scroll);
- if (value > nsgtk_adjustment_get_upper(scroll) - vpage)
- value = nsgtk_adjustment_get_upper(scroll) -
vpage;
- break;
-
- case GDK_KEY(Page_Up):
- case GDK_KEY(KP_Page_Up):
- scroll = vscroll;
- value = gtk_adjustment_get_value(scroll) -
- nsgtk_adjustment_get_page_increment(scroll);
-
- if (value < nsgtk_adjustment_get_lower(scroll))
- value = nsgtk_adjustment_get_lower(scroll);
-
- break;
-
- case GDK_KEY(Page_Down):
- case GDK_KEY(KP_Page_Down):
- scroll = vscroll;
- value = gtk_adjustment_get_value(scroll) +
- nsgtk_adjustment_get_page_increment(scroll);
-
- if (value > nsgtk_adjustment_get_upper(scroll) - vpage)
- value = nsgtk_adjustment_get_upper(scroll) -
vpage;
- break;
-
- default:
- break;
- }
-
- if (scroll != NULL)
- gtk_adjustment_set_value(scroll, value);
-
- return TRUE;
-}
-
-static gboolean
-nsgtk_tree_window_keyrelease_event(GtkWidget *widget, GdkEventKey *event,
- gpointer g)
-{
- struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g;
-
- return gtk_im_context_filter_keypress(tw->input_method, event);
-}
-
-static void
-nsgtk_tree_window_input_method_commit(GtkIMContext *ctx,
- const gchar *str, gpointer data)
-{
- struct nsgtk_treeview *tw = (struct nsgtk_treeview *) data;
- size_t len = strlen(str), offset = 0;
-
- if (tw->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tw->ssl_data;
- }
-
- while (offset < len) {
- uint32_t nskey = utf8_to_ucs4(str + offset, len - offset);
-
- tree_keypress(tw->tree, nskey);
-
- offset = utf8_next(str, len, offset);
- }
-}
-
-
-static const struct treeview_table nsgtk_tree_callbacks = {
- .redraw_request = nsgtk_tree_redraw_request,
- .resized = nsgtk_tree_resized,
- .scroll_visible = nsgtk_tree_scroll_visible,
- .get_window_dimensions = nsgtk_tree_get_window_dimensions
-};
-
-struct nsgtk_treeview *
-nsgtk_treeview_create(unsigned int flags,
- GtkWindow *window,
- GtkScrolledWindow *scrolled,
- GtkDrawingArea *drawing_area,
- struct sslcert_session_data *ssl_data)
-{
- struct nsgtk_treeview *tv;
-
- assert(drawing_area != NULL);
-
- tv = malloc(sizeof(struct nsgtk_treeview));
- if (tv == NULL) {
- LOG("malloc failed");
- nsgtk_warning("NoMemory", 0);
- return NULL;
- }
-
- tv->tree_flags = flags;
- if (tv->tree_flags == TREE_SSLCERT) {
- tv->ssl_data = ssl_data;
- ssl_current_session = tv->ssl_data;
- }
-
- tv->window = window;
- tv->scrolled = scrolled;
- tv->drawing_area = drawing_area;
- tv->input_method = gtk_im_multicontext_new();
- tv->tree = tree_create(flags, &nsgtk_tree_callbacks, tv);
- tv->mouse_state = 0;
- tv->mouse_pressed = false;
-
- nsgtk_widget_override_background_color(GTK_WIDGET(drawing_area),
- GTK_STATE_NORMAL,
- 0, 0xffff, 0xffff, 0xffff);
-
- nsgtk_connect_draw_event(GTK_WIDGET(drawing_area),
G_CALLBACK(nsgtk_tree_window_draw_event), tv);
-
-#define CONNECT(obj, sig, callback, ptr) \
- g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
- CONNECT(drawing_area, "button-press-event",
- nsgtk_tree_window_button_press_event,
- tv);
- CONNECT(drawing_area, "button-release-event",
- nsgtk_tree_window_button_release_event,
- tv);
- CONNECT(drawing_area, "motion-notify-event",
- nsgtk_tree_window_motion_notify_event,
- tv);
- CONNECT(drawing_area, "key-press-event",
- nsgtk_tree_window_keypress_event,
- tv);
- CONNECT(drawing_area, "key-release-event",
- nsgtk_tree_window_keyrelease_event,
- tv);
-
-
- /* input method */
- gtk_im_context_set_client_window(tv->input_method,
- nsgtk_widget_get_window(GTK_WIDGET(tv->window)));
- gtk_im_context_set_use_preedit(tv->input_method, FALSE);
- /* input method signals */
- CONNECT(tv->input_method, "commit",
- nsgtk_tree_window_input_method_commit,
- tv);
-
- return tv;
-}
diff --git a/frontends/gtk/treeview.h b/frontends/gtk/treeview.h
deleted file mode 100644
index 70f2c53..0000000
--- a/frontends/gtk/treeview.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2004 Richard Wilson <[email protected]>
- * Copyright 2009 Paul Blokus <[email protected]>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/** \file
- * Generic tree handling.
- */
-
-#ifndef __NSGTK_TREEVIEW_H__
-#define __NSGTK_TREEVIEW_H__
-
-struct nsgtk_treeview;
-struct sslcert_session_data;
-
-/**
- * Create a treeview within a gtk widget.
- *
- * \param flags type of treeview.
- */
-struct nsgtk_treeview *nsgtk_treeview_create(unsigned int flags, GtkWindow
*window, GtkScrolledWindow *scrolled, GtkDrawingArea *drawing_area, struct
sslcert_session_data *ssl_data);
-
-void nsgtk_treeview_destroy(struct nsgtk_treeview *tv);
-
-struct tree *nsgtk_treeview_get_tree(struct nsgtk_treeview *tv);
-
-void nsgtk_tree_window_hide(GtkWidget *widget, gpointer g);
-
-#endif /*__NSGTK_TREEVIEW_H__*/
commitdiff
http://git.netsurf-browser.org/netsurf.git/commit/?id=8547452232e1cc7664fe3af7cbcfc4cead9d7d92
commit 8547452232e1cc7664fe3af7cbcfc4cead9d7d92
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>
convert GTK hotlist to use GTK core window
diff --git a/frontends/gtk/global_history.c b/frontends/gtk/global_history.c
index df6fe06..b41d06e 100644
--- a/frontends/gtk/global_history.c
+++ b/frontends/gtk/global_history.c
@@ -1,6 +1,6 @@
/*
- * Copyright 2006 Rob Kendrick <[email protected]>
- * Copyright 2009 Paul Blokus <[email protected]>
+ * Copyright 2010 John Mark Bell <[email protected]>
+ * Copyright 2016 Vincent Sanders <[email protected]>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
diff --git a/frontends/gtk/gui.c b/frontends/gtk/gui.c
index 8d0bb75..61560dd 100644
--- a/frontends/gtk/gui.c
+++ b/frontends/gtk/gui.c
@@ -307,12 +307,6 @@ static nserror nsgtk_init(int argc, char** argv, char
**respath)
return error;
}
- error = nsgtk_hotlist_init();
- if (error != NSERROR_OK) {
- LOG("Unable to initialise hotlist window.");
- return error;
- }
-
/* If there is a url specified on the command line use it */
if (argc > 1) {
struct stat fs;
@@ -449,7 +443,11 @@ static void gui_quit(void)
messages_get_errorcode(res));
}
- nsgtk_hotlist_destroy();
+ res = nsgtk_hotlist_destroy();
+ if (res != NSERROR_OK) {
+ LOG("Error finalising hotlist viewer: %s",
+ messages_get_errorcode(res));
+ }
free(nsgtk_config_home);
diff --git a/frontends/gtk/hotlist.c b/frontends/gtk/hotlist.c
index fdc5be3..2d0641f 100644
--- a/frontends/gtk/hotlist.c
+++ b/frontends/gtk/hotlist.c
@@ -1,5 +1,6 @@
/*
- * Copyright 2009 Paul Blokus <[email protected]>
+ * Copyright 2010 John Mark Bell <[email protected]>
+ * Copyright 2016 Vincent Sanders <[email protected]>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -16,25 +17,40 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/**
+ * \file
+ * Implementation of GTK bookmark (hotlist) manager.
+ */
+
+#include <stdint.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include "utils/log.h"
#include "utils/nsoption.h"
#include "netsurf/keypress.h"
+#include "netsurf/plotters.h"
#include "desktop/hotlist.h"
-#include "desktop/tree.h"
+#include "desktop/treeview.h"
-#include "gtk/plotters.h"
-#include "gtk/scaffolding.h"
-#include "gtk/treeview.h"
#include "gtk/compat.h"
+#include "gtk/plotters.h"
#include "gtk/resources.h"
+#include "gtk/corewindow.h"
#include "gtk/hotlist.h"
+struct nsgtk_hotlist_window {
+ struct nsgtk_corewindow core;
+ GtkBuilder *builder;
+ GtkWindow *wnd;
+ const char *path; /**< path to users bookmarks */
+};
+
+static struct nsgtk_hotlist_window *hotlist_window = NULL;
+
#define MENUPROTO(x) static gboolean nsgtk_on_##x##_activate( \
GtkMenuItem *widget, gpointer g)
-#define MENUEVENT(x) { #x, G_CALLBACK(nsgtk_on_##x##_activate) }
+#define MENUEVENT(x) { #x, G_CALLBACK(nsgtk_on_##x##_activate) }
#define MENUHANDLER(x) gboolean nsgtk_on_##x##_activate(GtkMenuItem *widget, \
gpointer g)
@@ -58,7 +74,7 @@ MENUPROTO(clear_selection);
/* view menu*/
MENUPROTO(expand_all);
MENUPROTO(expand_directories);
-MENUPROTO(expand_addresses);
+MENUPROTO(expand_addresses);
MENUPROTO(collapse_all);
MENUPROTO(collapse_directories);
MENUPROTO(collapse_addresses);
@@ -66,135 +82,61 @@ MENUPROTO(collapse_addresses);
MENUPROTO(launch);
static struct menu_events menu_events[] = {
-
+
/* file menu*/
MENUEVENT(export),
MENUEVENT(new_folder),
MENUEVENT(new_entry),
-
+
/* edit menu */
MENUEVENT(edit_selected),
MENUEVENT(delete_selected),
MENUEVENT(select_all),
MENUEVENT(clear_selection),
-
+
/* view menu*/
MENUEVENT(expand_all),
MENUEVENT(expand_directories),
- MENUEVENT(expand_addresses),
+ MENUEVENT(expand_addresses),
MENUEVENT(collapse_all),
MENUEVENT(collapse_directories),
MENUEVENT(collapse_addresses),
-
- MENUEVENT(launch),
- {NULL, NULL}
-};
-
-static struct nsgtk_treeview *hotlist_treeview;
-static GtkBuilder *hotlist_builder;
-GtkWindow *wndHotlist;
-
-/**
- * Connects menu events in the hotlist window.
- */
-static void nsgtk_hotlist_init_menu(void)
-{
- struct menu_events *event = menu_events;
- GtkWidget *w;
-
- while (event->widget != NULL) {
- w = GTK_WIDGET(gtk_builder_get_object(hotlist_builder,
event->widget));
- if (w == NULL) {
- LOG("Unable to connect menu widget ""%s""",
event->widget); } else {
- g_signal_connect(G_OBJECT(w), "activate",
event->handler, hotlist_treeview);
- }
- event++;
- }
-}
-
-/* exported interface docuemnted in gtk/hotlist.h */
-nserror nsgtk_hotlist_init(void)
-{
- GtkWindow *window;
- GtkScrolledWindow *scrolled;
- GtkDrawingArea *drawing_area;
- nserror res;
-
- res = nsgtk_builder_new_from_resname("hotlist", &hotlist_builder);
- if (res != NSERROR_OK) {
- LOG("Cookie UI builder init failed");
- return res;
- }
-
- gtk_builder_connect_signals(hotlist_builder, NULL);
-
- wndHotlist = GTK_WINDOW(gtk_builder_get_object(hotlist_builder,
"wndHotlist"));
- window = wndHotlist;
-
- scrolled = GTK_SCROLLED_WINDOW(gtk_builder_get_object(hotlist_builder,
- "hotlistScrolled"));
-
- drawing_area = GTK_DRAWING_AREA(gtk_builder_get_object(hotlist_builder,
- "hotlistDrawingArea"));
-
-
- tree_hotlist_path = nsoption_charp(hotlist_path);
- hotlist_treeview = nsgtk_treeview_create(TREE_HOTLIST, window,
- scrolled, drawing_area, NULL);
-
- if (hotlist_treeview == NULL) {
- return NSERROR_INIT_FAILED;
- }
-
-#define CONNECT(obj, sig, callback, ptr) \
- g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
-
- CONNECT(window, "delete_event", gtk_widget_hide_on_delete, NULL);
- CONNECT(window, "hide", nsgtk_tree_window_hide, hotlist_treeview);
-
- nsgtk_hotlist_init_menu();
-
- return NSERROR_OK;
-}
-
-
+ MENUEVENT(launch),
-/**
- * Destroys the hotlist window and performs any other necessary cleanup
actions.
- */
-void nsgtk_hotlist_destroy(void)
-{
- /** \todo what about hotlist_builder? */
- nsgtk_treeview_destroy(hotlist_treeview);
-}
+ {NULL, NULL}
+};
/* file menu*/
MENUHANDLER(export)
{
+ struct nsgtk_hotlist_window *hlwin;
GtkWidget *save_dialog;
+
+ hlwin = (struct nsgtk_hotlist_window *)g;
+
save_dialog = gtk_file_chooser_dialog_new("Save File",
- wndHotlist,
+ hlwin->wnd,
GTK_FILE_CHOOSER_ACTION_SAVE,
NSGTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
NSGTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
NULL);
-
+
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(save_dialog),
getenv("HOME") ? getenv("HOME") : "/");
-
+
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(save_dialog),
"hotlist.html");
-
+
if (gtk_dialog_run(GTK_DIALOG(save_dialog)) == GTK_RESPONSE_ACCEPT) {
gchar *filename = gtk_file_chooser_get_filename(
GTK_FILE_CHOOSER(save_dialog));
-
- hotlist_export(filename, NULL);
+
+ hotlist_export(filename, NULL);
g_free(filename);
}
-
+
gtk_widget_destroy(save_dialog);
return TRUE;
@@ -279,3 +221,198 @@ MENUHANDLER(launch)
hotlist_keypress(NS_KEY_CR);
return TRUE;
}
+
+
+/**
+ * Connects menu events in the hotlist window.
+ */
+static void nsgtk_hotlist_init_menu(struct nsgtk_hotlist_window *hlwin)
+{
+ struct menu_events *event = menu_events;
+ GtkWidget *w;
+
+ while (event->widget != NULL) {
+ w = GTK_WIDGET(gtk_builder_get_object(hlwin->builder,
+ event->widget));
+ if (w == NULL) {
+ LOG("Unable to connect menu widget ""%s""",
+ event->widget);
+ } else {
+ g_signal_connect(G_OBJECT(w),
+ "activate",
+ event->handler,
+ hlwin);
+ }
+ event++;
+ }
+}
+
+
+/**
+ * callback for mouse action on hotlist window
+ *
+ * \param nsgtk_cw The nsgtk core window structure.
+ * \param mouse_state netsurf mouse state on event
+ * \param x location of event
+ * \param y location of event
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+nsgtk_hotlist_mouse(struct nsgtk_corewindow *nsgtk_cw,
+ browser_mouse_state mouse_state,
+ int x, int y)
+{
+ hotlist_mouse_action(mouse_state, x, y);
+
+ return NSERROR_OK;
+}
+
+/**
+ * callback for keypress on hotlist window
+ *
+ * \param nsgtk_cw The nsgtk core window structure.
+ * \param nskey The netsurf key code
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+nsgtk_hotlist_key(struct nsgtk_corewindow *nsgtk_cw, uint32_t nskey)
+{
+ if (hotlist_keypress(nskey)) {
+ return NSERROR_OK;
+ }
+ return NSERROR_NOT_IMPLEMENTED;
+}
+
+/**
+ * callback on draw event for hotlist window
+ *
+ * \param nsgtk_cw The nsgtk core window structure.
+ * \param r The rectangle of the window that needs updating.
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+nsgtk_hotlist_draw(struct nsgtk_corewindow *nsgtk_cw, struct rect *r)
+{
+ struct redraw_context ctx = {
+ .interactive = true,
+ .background_images = true,
+ .plot = &nsgtk_plotters
+ };
+
+ hotlist_redraw(0, 0, r, &ctx);
+
+ return NSERROR_OK;
+}
+
+/**
+ * Creates the window for the hotlist tree.
+ *
+ * \return NSERROR_OK on success else appropriate error code on faliure.
+ */
+static nserror nsgtk_hotlist_init(void)
+{
+ struct nsgtk_hotlist_window *ncwin;
+ nserror res;
+
+ if (hotlist_window != NULL) {
+ return NSERROR_OK;
+ }
+
+ res = treeview_init(0);
+ if (res != NSERROR_OK) {
+ return res;
+ }
+
+ ncwin = malloc(sizeof(struct nsgtk_hotlist_window));
+ if (ncwin == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ res = nsgtk_builder_new_from_resname("hotlist", &ncwin->builder);
+ if (res != NSERROR_OK) {
+ LOG("Hotlist UI builder init failed");
+ free(ncwin);
+ return res;
+ }
+
+ gtk_builder_connect_signals(ncwin->builder, NULL);
+
+ ncwin->wnd = GTK_WINDOW(gtk_builder_get_object(ncwin->builder,
+ "wndHotlist"));
+
+ ncwin->core.scrolled = GTK_SCROLLED_WINDOW(
+ gtk_builder_get_object(ncwin->builder, "hotlistScrolled"));
+
+ ncwin->core.drawing_area = GTK_DRAWING_AREA(
+ gtk_builder_get_object(ncwin->builder, "hotlistDrawingArea"));
+
+ /* make the delete event hide the window */
+ g_signal_connect(G_OBJECT(ncwin->wnd),
+ "delete_event",
+ G_CALLBACK(gtk_widget_hide_on_delete),
+ NULL);
+
+ nsgtk_hotlist_init_menu(ncwin);
+
+ ncwin->core.draw = nsgtk_hotlist_draw;
+ ncwin->core.key = nsgtk_hotlist_key;
+ ncwin->core.mouse = nsgtk_hotlist_mouse;
+
+ res = nsgtk_corewindow_init(&ncwin->core);
+ if (res != NSERROR_OK) {
+ free(ncwin);
+ return res;
+ }
+
+ ncwin->path = nsoption_charp(hotlist_path);
+
+ res = hotlist_init(ncwin->core.cb_table,
+ (struct core_window *)ncwin,
+ ncwin->path);
+ if (res != NSERROR_OK) {
+ free(ncwin);
+ return res;
+ }
+
+ /* memoise window so it can be represented when necessary
+ * instead of recreating every time.
+ */
+ hotlist_window = ncwin;
+
+ return NSERROR_OK;
+}
+
+
+/* exported function documented gtk/hotlist.h */
+nserror nsgtk_hotlist_present(void)
+{
+ nserror res;
+
+ res = nsgtk_hotlist_init();
+ if (res == NSERROR_OK) {
+ gtk_window_present(hotlist_window->wnd);
+ }
+ return res;
+}
+
+
+/* exported function documented gtk/hotlist.h */
+nserror nsgtk_hotlist_destroy(void)
+{
+ nserror res;
+
+ if (hotlist_window == NULL) {
+ return NSERROR_OK;
+ }
+
+ res = hotlist_fini(hotlist_window->path);
+ if (res == NSERROR_OK) {
+ res = nsgtk_corewindow_fini(&hotlist_window->core);
+ gtk_widget_destroy(GTK_WIDGET(hotlist_window->wnd));
+ g_object_unref(G_OBJECT(hotlist_window->builder));
+ free(hotlist_window);
+ hotlist_window = NULL;
+ }
+
+ return res;
+}
diff --git a/frontends/gtk/hotlist.h b/frontends/gtk/hotlist.h
index 01e5a86..3170027 100644
--- a/frontends/gtk/hotlist.h
+++ b/frontends/gtk/hotlist.h
@@ -16,25 +16,26 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/** \file
- * GTK hotlist (interface).
+/**
+ * \file
+ * Interface to GTK bookmarks (hotlist).
*/
#ifndef __NSGTK_HOTLIST_H__
#define __NSGTK_HOTLIST_H__
-#include <gtk/gtk.h>
-
-extern GtkWindow *wndHotlist;
-
/**
- * Initialise the gtk specific hotlist (bookmarks) display.
+ * make the hotlist window visible.
*
* \return NSERROR_OK on success else appropriate error code on faliure.
*/
-nserror nsgtk_hotlist_init(void);
-
+nserror nsgtk_hotlist_present(void);
-void nsgtk_hotlist_destroy(void);
+/**
+ * Free any resources allocated for the hotlist window.
+ *
+ * \return NSERROR_OK on success else appropriate error code on faliure.
+ */
+nserror nsgtk_hotlist_destroy(void);
#endif /* __NSGTK_HOTLIST_H__ */
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index cdf238b..bbc568e 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -1516,10 +1516,11 @@ MULTIHANDLER(addbookmarks)
MULTIHANDLER(showbookmarks)
{
- gtk_widget_show(GTK_WIDGET(wndHotlist));
- gdk_window_raise(nsgtk_widget_get_window(GTK_WIDGET(wndHotlist)));
- gtk_window_set_focus(wndHotlist, NULL);
-
+ nserror res;
+ res = nsgtk_hotlist_present();
+ if (res != NSERROR_OK) {
+ LOG("Unable to initialise bookmark window.");
+ }
return TRUE;
}
commitdiff
http://git.netsurf-browser.org/netsurf.git/commit/?id=597d167b9d06d417872db81c8d328318e1b0d85a
commit 597d167b9d06d417872db81c8d328318e1b0d85a
Author: Vincent Sanders <[email protected]>
Commit: Vincent Sanders <[email protected]>
fix hotlist keypress consumption return
diff --git a/desktop/hotlist.c b/desktop/hotlist.c
index de26ff6..cce69be 100644
--- a/desktop/hotlist.c
+++ b/desktop/hotlist.c
@@ -1572,9 +1572,9 @@ void hotlist_mouse_action(browser_mouse_state mouse, int
x, int y)
/* Exported interface, documented in hotlist.h */
-void hotlist_keypress(uint32_t key)
+bool hotlist_keypress(uint32_t key)
{
- treeview_keypress(hl_ctx.tree, key);
+ return treeview_keypress(hl_ctx.tree, key);
}
diff --git a/desktop/hotlist.h b/desktop/hotlist.h
index c0f4dec..31aa030 100644
--- a/desktop/hotlist.h
+++ b/desktop/hotlist.h
@@ -189,10 +189,10 @@ void hotlist_mouse_action(enum browser_mouse_state mouse,
int x, int y);
/**
* Key press handling.
*
- * \param key The ucs4 character codepoint
+ * \param key The ucs4 character codepoint
* \return true if the keypress is dealt with, false otherwise.
*/
-void hotlist_keypress(uint32_t key);
+bool hotlist_keypress(uint32_t key);
/**
* Determine whether there is a selection
-----------------------------------------------------------------------
Summary of changes:
desktop/hotlist.c | 4 +-
desktop/hotlist.h | 4 +-
frontends/gtk/Makefile | 2 +-
frontends/gtk/global_history.c | 4 +-
frontends/gtk/gui.c | 14 +-
frontends/gtk/hotlist.c | 335 ++++++++++++++-------
frontends/gtk/hotlist.h | 21 +-
frontends/gtk/scaffolding.c | 9 +-
frontends/gtk/treeview.c | 631 ----------------------------------------
frontends/gtk/treeview.h | 43 ---
10 files changed, 264 insertions(+), 803 deletions(-)
delete mode 100644 frontends/gtk/treeview.c
delete mode 100644 frontends/gtk/treeview.h
diff --git a/desktop/hotlist.c b/desktop/hotlist.c
index de26ff6..cce69be 100644
--- a/desktop/hotlist.c
+++ b/desktop/hotlist.c
@@ -1572,9 +1572,9 @@ void hotlist_mouse_action(browser_mouse_state mouse, int
x, int y)
/* Exported interface, documented in hotlist.h */
-void hotlist_keypress(uint32_t key)
+bool hotlist_keypress(uint32_t key)
{
- treeview_keypress(hl_ctx.tree, key);
+ return treeview_keypress(hl_ctx.tree, key);
}
diff --git a/desktop/hotlist.h b/desktop/hotlist.h
index c0f4dec..31aa030 100644
--- a/desktop/hotlist.h
+++ b/desktop/hotlist.h
@@ -189,10 +189,10 @@ void hotlist_mouse_action(enum browser_mouse_state mouse,
int x, int y);
/**
* Key press handling.
*
- * \param key The ucs4 character codepoint
+ * \param key The ucs4 character codepoint
* \return true if the keypress is dealt with, false otherwise.
*/
-void hotlist_keypress(uint32_t key);
+bool hotlist_keypress(uint32_t key);
/**
* Determine whether there is a selection
diff --git a/frontends/gtk/Makefile b/frontends/gtk/Makefile
index 71dec1e..f9273f1 100644
--- a/frontends/gtk/Makefile
+++ b/frontends/gtk/Makefile
@@ -159,7 +159,7 @@ endif
# S_FRONTEND are sources purely for the GTK frontend
S_FRONTEND := gui.c schedule.c layout_pango.c bitmap.c plotters.c \
- treeview.c scaffolding.c gdk.c completion.c login.c throbber.c \
+ scaffolding.c gdk.c completion.c login.c throbber.c \
selection.c global_history.c window.c fetch.c download.c menu.c \
print.c search.c tabs.c toolbar.c gettext.c \
compat.c cookies.c hotlist.c viewdata.c viewsource.c \
diff --git a/frontends/gtk/global_history.c b/frontends/gtk/global_history.c
index df6fe06..b41d06e 100644
--- a/frontends/gtk/global_history.c
+++ b/frontends/gtk/global_history.c
@@ -1,6 +1,6 @@
/*
- * Copyright 2006 Rob Kendrick <[email protected]>
- * Copyright 2009 Paul Blokus <[email protected]>
+ * Copyright 2010 John Mark Bell <[email protected]>
+ * Copyright 2016 Vincent Sanders <[email protected]>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
diff --git a/frontends/gtk/gui.c b/frontends/gtk/gui.c
index 8d0bb75..d128dc2 100644
--- a/frontends/gtk/gui.c
+++ b/frontends/gtk/gui.c
@@ -49,7 +49,6 @@
#include "desktop/save_complete.h"
#include "desktop/save_pdf.h"
#include "desktop/searchweb.h"
-#include "desktop/tree.h"
#include "gtk/compat.h"
#include "gtk/warn.h"
@@ -61,7 +60,6 @@
#include "gtk/global_history.h"
#include "gtk/hotlist.h"
#include "gtk/throbber.h"
-#include "gtk/treeview.h"
#include "gtk/scaffolding.h"
#include "gtk/window.h"
#include "gtk/schedule.h"
@@ -307,12 +305,6 @@ static nserror nsgtk_init(int argc, char** argv, char
**respath)
return error;
}
- error = nsgtk_hotlist_init();
- if (error != NSERROR_OK) {
- LOG("Unable to initialise hotlist window.");
- return error;
- }
-
/* If there is a url specified on the command line use it */
if (argc > 1) {
struct stat fs;
@@ -449,7 +441,11 @@ static void gui_quit(void)
messages_get_errorcode(res));
}
- nsgtk_hotlist_destroy();
+ res = nsgtk_hotlist_destroy();
+ if (res != NSERROR_OK) {
+ LOG("Error finalising hotlist viewer: %s",
+ messages_get_errorcode(res));
+ }
free(nsgtk_config_home);
diff --git a/frontends/gtk/hotlist.c b/frontends/gtk/hotlist.c
index fdc5be3..2d0641f 100644
--- a/frontends/gtk/hotlist.c
+++ b/frontends/gtk/hotlist.c
@@ -1,5 +1,6 @@
/*
- * Copyright 2009 Paul Blokus <[email protected]>
+ * Copyright 2010 John Mark Bell <[email protected]>
+ * Copyright 2016 Vincent Sanders <[email protected]>
*
* This file is part of NetSurf, http://www.netsurf-browser.org/
*
@@ -16,25 +17,40 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+/**
+ * \file
+ * Implementation of GTK bookmark (hotlist) manager.
+ */
+
+#include <stdint.h>
#include <stdlib.h>
#include <gtk/gtk.h>
#include "utils/log.h"
#include "utils/nsoption.h"
#include "netsurf/keypress.h"
+#include "netsurf/plotters.h"
#include "desktop/hotlist.h"
-#include "desktop/tree.h"
+#include "desktop/treeview.h"
-#include "gtk/plotters.h"
-#include "gtk/scaffolding.h"
-#include "gtk/treeview.h"
#include "gtk/compat.h"
+#include "gtk/plotters.h"
#include "gtk/resources.h"
+#include "gtk/corewindow.h"
#include "gtk/hotlist.h"
+struct nsgtk_hotlist_window {
+ struct nsgtk_corewindow core;
+ GtkBuilder *builder;
+ GtkWindow *wnd;
+ const char *path; /**< path to users bookmarks */
+};
+
+static struct nsgtk_hotlist_window *hotlist_window = NULL;
+
#define MENUPROTO(x) static gboolean nsgtk_on_##x##_activate( \
GtkMenuItem *widget, gpointer g)
-#define MENUEVENT(x) { #x, G_CALLBACK(nsgtk_on_##x##_activate) }
+#define MENUEVENT(x) { #x, G_CALLBACK(nsgtk_on_##x##_activate) }
#define MENUHANDLER(x) gboolean nsgtk_on_##x##_activate(GtkMenuItem *widget, \
gpointer g)
@@ -58,7 +74,7 @@ MENUPROTO(clear_selection);
/* view menu*/
MENUPROTO(expand_all);
MENUPROTO(expand_directories);
-MENUPROTO(expand_addresses);
+MENUPROTO(expand_addresses);
MENUPROTO(collapse_all);
MENUPROTO(collapse_directories);
MENUPROTO(collapse_addresses);
@@ -66,135 +82,61 @@ MENUPROTO(collapse_addresses);
MENUPROTO(launch);
static struct menu_events menu_events[] = {
-
+
/* file menu*/
MENUEVENT(export),
MENUEVENT(new_folder),
MENUEVENT(new_entry),
-
+
/* edit menu */
MENUEVENT(edit_selected),
MENUEVENT(delete_selected),
MENUEVENT(select_all),
MENUEVENT(clear_selection),
-
+
/* view menu*/
MENUEVENT(expand_all),
MENUEVENT(expand_directories),
- MENUEVENT(expand_addresses),
+ MENUEVENT(expand_addresses),
MENUEVENT(collapse_all),
MENUEVENT(collapse_directories),
MENUEVENT(collapse_addresses),
-
- MENUEVENT(launch),
- {NULL, NULL}
-};
-
-static struct nsgtk_treeview *hotlist_treeview;
-static GtkBuilder *hotlist_builder;
-GtkWindow *wndHotlist;
-
-/**
- * Connects menu events in the hotlist window.
- */
-static void nsgtk_hotlist_init_menu(void)
-{
- struct menu_events *event = menu_events;
- GtkWidget *w;
-
- while (event->widget != NULL) {
- w = GTK_WIDGET(gtk_builder_get_object(hotlist_builder,
event->widget));
- if (w == NULL) {
- LOG("Unable to connect menu widget ""%s""",
event->widget); } else {
- g_signal_connect(G_OBJECT(w), "activate",
event->handler, hotlist_treeview);
- }
- event++;
- }
-}
-
-/* exported interface docuemnted in gtk/hotlist.h */
-nserror nsgtk_hotlist_init(void)
-{
- GtkWindow *window;
- GtkScrolledWindow *scrolled;
- GtkDrawingArea *drawing_area;
- nserror res;
-
- res = nsgtk_builder_new_from_resname("hotlist", &hotlist_builder);
- if (res != NSERROR_OK) {
- LOG("Cookie UI builder init failed");
- return res;
- }
-
- gtk_builder_connect_signals(hotlist_builder, NULL);
-
- wndHotlist = GTK_WINDOW(gtk_builder_get_object(hotlist_builder,
"wndHotlist"));
- window = wndHotlist;
-
- scrolled = GTK_SCROLLED_WINDOW(gtk_builder_get_object(hotlist_builder,
- "hotlistScrolled"));
-
- drawing_area = GTK_DRAWING_AREA(gtk_builder_get_object(hotlist_builder,
- "hotlistDrawingArea"));
-
-
- tree_hotlist_path = nsoption_charp(hotlist_path);
- hotlist_treeview = nsgtk_treeview_create(TREE_HOTLIST, window,
- scrolled, drawing_area, NULL);
-
- if (hotlist_treeview == NULL) {
- return NSERROR_INIT_FAILED;
- }
-
-#define CONNECT(obj, sig, callback, ptr) \
- g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
-
- CONNECT(window, "delete_event", gtk_widget_hide_on_delete, NULL);
- CONNECT(window, "hide", nsgtk_tree_window_hide, hotlist_treeview);
-
- nsgtk_hotlist_init_menu();
-
- return NSERROR_OK;
-}
-
-
+ MENUEVENT(launch),
-/**
- * Destroys the hotlist window and performs any other necessary cleanup
actions.
- */
-void nsgtk_hotlist_destroy(void)
-{
- /** \todo what about hotlist_builder? */
- nsgtk_treeview_destroy(hotlist_treeview);
-}
+ {NULL, NULL}
+};
/* file menu*/
MENUHANDLER(export)
{
+ struct nsgtk_hotlist_window *hlwin;
GtkWidget *save_dialog;
+
+ hlwin = (struct nsgtk_hotlist_window *)g;
+
save_dialog = gtk_file_chooser_dialog_new("Save File",
- wndHotlist,
+ hlwin->wnd,
GTK_FILE_CHOOSER_ACTION_SAVE,
NSGTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
NSGTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
NULL);
-
+
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(save_dialog),
getenv("HOME") ? getenv("HOME") : "/");
-
+
gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(save_dialog),
"hotlist.html");
-
+
if (gtk_dialog_run(GTK_DIALOG(save_dialog)) == GTK_RESPONSE_ACCEPT) {
gchar *filename = gtk_file_chooser_get_filename(
GTK_FILE_CHOOSER(save_dialog));
-
- hotlist_export(filename, NULL);
+
+ hotlist_export(filename, NULL);
g_free(filename);
}
-
+
gtk_widget_destroy(save_dialog);
return TRUE;
@@ -279,3 +221,198 @@ MENUHANDLER(launch)
hotlist_keypress(NS_KEY_CR);
return TRUE;
}
+
+
+/**
+ * Connects menu events in the hotlist window.
+ */
+static void nsgtk_hotlist_init_menu(struct nsgtk_hotlist_window *hlwin)
+{
+ struct menu_events *event = menu_events;
+ GtkWidget *w;
+
+ while (event->widget != NULL) {
+ w = GTK_WIDGET(gtk_builder_get_object(hlwin->builder,
+ event->widget));
+ if (w == NULL) {
+ LOG("Unable to connect menu widget ""%s""",
+ event->widget);
+ } else {
+ g_signal_connect(G_OBJECT(w),
+ "activate",
+ event->handler,
+ hlwin);
+ }
+ event++;
+ }
+}
+
+
+/**
+ * callback for mouse action on hotlist window
+ *
+ * \param nsgtk_cw The nsgtk core window structure.
+ * \param mouse_state netsurf mouse state on event
+ * \param x location of event
+ * \param y location of event
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+nsgtk_hotlist_mouse(struct nsgtk_corewindow *nsgtk_cw,
+ browser_mouse_state mouse_state,
+ int x, int y)
+{
+ hotlist_mouse_action(mouse_state, x, y);
+
+ return NSERROR_OK;
+}
+
+/**
+ * callback for keypress on hotlist window
+ *
+ * \param nsgtk_cw The nsgtk core window structure.
+ * \param nskey The netsurf key code
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+nsgtk_hotlist_key(struct nsgtk_corewindow *nsgtk_cw, uint32_t nskey)
+{
+ if (hotlist_keypress(nskey)) {
+ return NSERROR_OK;
+ }
+ return NSERROR_NOT_IMPLEMENTED;
+}
+
+/**
+ * callback on draw event for hotlist window
+ *
+ * \param nsgtk_cw The nsgtk core window structure.
+ * \param r The rectangle of the window that needs updating.
+ * \return NSERROR_OK on success otherwise apropriate error code
+ */
+static nserror
+nsgtk_hotlist_draw(struct nsgtk_corewindow *nsgtk_cw, struct rect *r)
+{
+ struct redraw_context ctx = {
+ .interactive = true,
+ .background_images = true,
+ .plot = &nsgtk_plotters
+ };
+
+ hotlist_redraw(0, 0, r, &ctx);
+
+ return NSERROR_OK;
+}
+
+/**
+ * Creates the window for the hotlist tree.
+ *
+ * \return NSERROR_OK on success else appropriate error code on faliure.
+ */
+static nserror nsgtk_hotlist_init(void)
+{
+ struct nsgtk_hotlist_window *ncwin;
+ nserror res;
+
+ if (hotlist_window != NULL) {
+ return NSERROR_OK;
+ }
+
+ res = treeview_init(0);
+ if (res != NSERROR_OK) {
+ return res;
+ }
+
+ ncwin = malloc(sizeof(struct nsgtk_hotlist_window));
+ if (ncwin == NULL) {
+ return NSERROR_NOMEM;
+ }
+
+ res = nsgtk_builder_new_from_resname("hotlist", &ncwin->builder);
+ if (res != NSERROR_OK) {
+ LOG("Hotlist UI builder init failed");
+ free(ncwin);
+ return res;
+ }
+
+ gtk_builder_connect_signals(ncwin->builder, NULL);
+
+ ncwin->wnd = GTK_WINDOW(gtk_builder_get_object(ncwin->builder,
+ "wndHotlist"));
+
+ ncwin->core.scrolled = GTK_SCROLLED_WINDOW(
+ gtk_builder_get_object(ncwin->builder, "hotlistScrolled"));
+
+ ncwin->core.drawing_area = GTK_DRAWING_AREA(
+ gtk_builder_get_object(ncwin->builder, "hotlistDrawingArea"));
+
+ /* make the delete event hide the window */
+ g_signal_connect(G_OBJECT(ncwin->wnd),
+ "delete_event",
+ G_CALLBACK(gtk_widget_hide_on_delete),
+ NULL);
+
+ nsgtk_hotlist_init_menu(ncwin);
+
+ ncwin->core.draw = nsgtk_hotlist_draw;
+ ncwin->core.key = nsgtk_hotlist_key;
+ ncwin->core.mouse = nsgtk_hotlist_mouse;
+
+ res = nsgtk_corewindow_init(&ncwin->core);
+ if (res != NSERROR_OK) {
+ free(ncwin);
+ return res;
+ }
+
+ ncwin->path = nsoption_charp(hotlist_path);
+
+ res = hotlist_init(ncwin->core.cb_table,
+ (struct core_window *)ncwin,
+ ncwin->path);
+ if (res != NSERROR_OK) {
+ free(ncwin);
+ return res;
+ }
+
+ /* memoise window so it can be represented when necessary
+ * instead of recreating every time.
+ */
+ hotlist_window = ncwin;
+
+ return NSERROR_OK;
+}
+
+
+/* exported function documented gtk/hotlist.h */
+nserror nsgtk_hotlist_present(void)
+{
+ nserror res;
+
+ res = nsgtk_hotlist_init();
+ if (res == NSERROR_OK) {
+ gtk_window_present(hotlist_window->wnd);
+ }
+ return res;
+}
+
+
+/* exported function documented gtk/hotlist.h */
+nserror nsgtk_hotlist_destroy(void)
+{
+ nserror res;
+
+ if (hotlist_window == NULL) {
+ return NSERROR_OK;
+ }
+
+ res = hotlist_fini(hotlist_window->path);
+ if (res == NSERROR_OK) {
+ res = nsgtk_corewindow_fini(&hotlist_window->core);
+ gtk_widget_destroy(GTK_WIDGET(hotlist_window->wnd));
+ g_object_unref(G_OBJECT(hotlist_window->builder));
+ free(hotlist_window);
+ hotlist_window = NULL;
+ }
+
+ return res;
+}
diff --git a/frontends/gtk/hotlist.h b/frontends/gtk/hotlist.h
index 01e5a86..3170027 100644
--- a/frontends/gtk/hotlist.h
+++ b/frontends/gtk/hotlist.h
@@ -16,25 +16,26 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/** \file
- * GTK hotlist (interface).
+/**
+ * \file
+ * Interface to GTK bookmarks (hotlist).
*/
#ifndef __NSGTK_HOTLIST_H__
#define __NSGTK_HOTLIST_H__
-#include <gtk/gtk.h>
-
-extern GtkWindow *wndHotlist;
-
/**
- * Initialise the gtk specific hotlist (bookmarks) display.
+ * make the hotlist window visible.
*
* \return NSERROR_OK on success else appropriate error code on faliure.
*/
-nserror nsgtk_hotlist_init(void);
-
+nserror nsgtk_hotlist_present(void);
-void nsgtk_hotlist_destroy(void);
+/**
+ * Free any resources allocated for the hotlist window.
+ *
+ * \return NSERROR_OK on success else appropriate error code on faliure.
+ */
+nserror nsgtk_hotlist_destroy(void);
#endif /* __NSGTK_HOTLIST_H__ */
diff --git a/frontends/gtk/scaffolding.c b/frontends/gtk/scaffolding.c
index cdf238b..bbc568e 100644
--- a/frontends/gtk/scaffolding.c
+++ b/frontends/gtk/scaffolding.c
@@ -1516,10 +1516,11 @@ MULTIHANDLER(addbookmarks)
MULTIHANDLER(showbookmarks)
{
- gtk_widget_show(GTK_WIDGET(wndHotlist));
- gdk_window_raise(nsgtk_widget_get_window(GTK_WIDGET(wndHotlist)));
- gtk_window_set_focus(wndHotlist, NULL);
-
+ nserror res;
+ res = nsgtk_hotlist_present();
+ if (res != NSERROR_OK) {
+ LOG("Unable to initialise bookmark window.");
+ }
return TRUE;
}
diff --git a/frontends/gtk/treeview.c b/frontends/gtk/treeview.c
deleted file mode 100644
index e2b1c42..0000000
--- a/frontends/gtk/treeview.c
+++ /dev/null
@@ -1,631 +0,0 @@
-/*
- * Copyright 2004 Richard Wilson <[email protected]>
- * Copyright 2009 Paul Blokus <[email protected]>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/** \file
- * Generic tree handling (implementation).
- */
-
-#include <stdlib.h>
-#include <assert.h>
-#include <stdio.h>
-#include <limits.h>
-#include <string.h>
-#include <math.h>
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-
-#include "utils/log.h"
-#include "utils/utf8.h"
-#include "desktop/tree.h"
-#include "netsurf/plotters.h"
-
-#include "gtk/warn.h"
-#include "gtk/compat.h"
-#include "gtk/gui.h"
-#include "gtk/plotters.h"
-#include "gtk/treeview.h"
-
-struct nsgtk_treeview {
- GtkWindow *window;
- GtkScrolledWindow *scrolled;
- GtkDrawingArea *drawing_area;
- GtkIMContext *input_method;
- bool mouse_pressed;
- int mouse_pressed_x;
- int mouse_pressed_y;
- int last_x, last_y;
- browser_mouse_state mouse_state;
- struct tree *tree;
- unsigned int tree_flags; /* flags used with tree creation */
- struct sslcert_session_data *ssl_data; /**< SSL data when tree_flags
are TREE_SSLCERT */
-};
-
-void nsgtk_treeview_destroy(struct nsgtk_treeview *tv)
-{
- if (tv->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tv->ssl_data;
- }
-
- tree_delete(tv->tree);
- g_object_unref(tv->input_method);
- gtk_widget_destroy(GTK_WIDGET(tv->window));
- free(tv);
-}
-
-struct tree *nsgtk_treeview_get_tree(struct nsgtk_treeview *tv)
-{
- return tv->tree;
-}
-
-static void nsgtk_tree_redraw_request(int x, int y, int width, int height,
void *data)
-{
- struct nsgtk_treeview *tw = data;
-
- gtk_widget_queue_draw_area(GTK_WIDGET(tw->drawing_area),
- x, y, width, height);
-}
-
-
-/**
- * Updates the tree owner following a tree resize
- *
- * \param tree the tree to update the owner of
- * \param width The width to resize to.
- * \param height The height to resize to.
- * \param data The treeview resize.
- */
-static void nsgtk_tree_resized(struct tree *tree, int width, int height, void
*data)
-{
- struct nsgtk_treeview *tw = data;
-
- gtk_widget_set_size_request(GTK_WIDGET(tw->drawing_area),
- width, height);
- return;
-}
-
-/**
- * Scrolls the tree to make an element visible
- *
- * \param y Y coordinate of the element
- * \param height height of the element
- * \param data user data assigned to the tree on tree creation
- */
-static void nsgtk_tree_scroll_visible(int y, int height, void *data)
-{
- int y0, y1;
- gdouble page;
- struct nsgtk_treeview *tw = data;
- GtkAdjustment *vadj = gtk_scrolled_window_get_vadjustment(tw->scrolled);
-
- assert(vadj);
-
- g_object_get(vadj, "page-size", &page, NULL);
-
- y0 = (int)(gtk_adjustment_get_value(vadj));
- y1 = y0 + page;
-
- if ((y >= y0) && (y + height <= y1))
- return;
- if (y + height > y1)
- y0 = y0 + (y + height - y1);
- if (y < y0)
- y0 = y;
- gtk_adjustment_set_value(vadj, y0);
-}
-
-
-/**
- * Retrieves the dimensions of the window with the tree
- *
- * \param data user data assigned to the tree on tree creation
- * \param width will be updated to window width if not NULL
- * \param height will be updated to window height if not NULL
- */
-static void nsgtk_tree_get_window_dimensions(int *width, int *height, void
*data)
-{
- struct nsgtk_treeview *tw = data;
- GtkAdjustment *vadj;
- GtkAdjustment *hadj;
- gdouble page;
-
- if (width != NULL) {
- hadj = gtk_scrolled_window_get_hadjustment(tw->scrolled);
- g_object_get(hadj, "page-size", &page, NULL);
- *width = page;
- }
-
- if (height != NULL) {
- vadj = gtk_scrolled_window_get_vadjustment(tw->scrolled);
- g_object_get(vadj, "page-size", &page, NULL);
- *height = page;
- }
-}
-
-#if GTK_CHECK_VERSION(3,0,0)
-
-static gboolean
-nsgtk_tree_window_draw_event(GtkWidget *widget, cairo_t *cr, gpointer data)
-{
- struct nsgtk_treeview *tv = (struct nsgtk_treeview *)data;
- struct redraw_context ctx = {
- .interactive = true,
- .background_images = true,
- .plot = &nsgtk_plotters
- };
- double x1;
- double y1;
- double x2;
- double y2;
-
- current_widget = widget;
- current_cr = cr;
-
- cairo_clip_extents(cr, &x1, &y1, &x2, &y2);
-
- if (tv->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tv->ssl_data;
- }
-
- tree_draw(tv->tree, 0, 0, x1, y1, x2 - x1, y2 - y1, &ctx);
-
- current_widget = NULL;
-
- return FALSE;
-}
-
-#else
-
-/* signal handler functions for a tree window */
-static gboolean
-nsgtk_tree_window_draw_event(GtkWidget *widget,
- GdkEventExpose *event,
- gpointer g)
-{
- struct nsgtk_treeview *tv = (struct nsgtk_treeview *)g;
- struct redraw_context ctx = {
- .interactive = true,
- .background_images = true,
- .plot = &nsgtk_plotters
- };
- int x, y, width, height;
-
- x = event->area.x;
- y = event->area.y;
- width = event->area.width;
- height = event->area.height;
-
- current_widget = widget;
- current_cr = gdk_cairo_create(nsgtk_widget_get_window(widget));
-
- if (tv->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tv->ssl_data;
- }
-
- tree_draw(tv->tree, 0, 0, x, y, width, height, &ctx);
-
- current_widget = NULL;
- cairo_destroy(current_cr);
-
- return FALSE;
-}
-
-#endif
-
-void nsgtk_tree_window_hide(GtkWidget *widget, gpointer g)
-{
-}
-
-static gboolean
-nsgtk_tree_window_button_press_event(GtkWidget *widget,
- GdkEventButton *event, gpointer g)
-{
- struct nsgtk_treeview *tw = g;
-
- gtk_im_context_reset(tw->input_method);
- gtk_widget_grab_focus(GTK_WIDGET(tw->drawing_area));
-
- tw->mouse_pressed = true;
- tw->mouse_pressed_x = event->x;
- tw->mouse_pressed_y = event->y;
-
- if (event->type == GDK_2BUTTON_PRESS) {
- tw->mouse_state = BROWSER_MOUSE_DOUBLE_CLICK;
- }
-
- switch (event->button) {
- case 1: tw->mouse_state |= BROWSER_MOUSE_PRESS_1; break;
- case 2: tw->mouse_state |= BROWSER_MOUSE_PRESS_2; break;
- }
- /* Handle the modifiers too */
- if (event->state & GDK_SHIFT_MASK)
- tw->mouse_state |= BROWSER_MOUSE_MOD_1;
- if (event->state & GDK_CONTROL_MASK)
- tw->mouse_state |= BROWSER_MOUSE_MOD_2;
- if (event->state & GDK_MOD1_MASK)
- tw->mouse_state |= BROWSER_MOUSE_MOD_3;
-
- /* Record where we pressed, for use when determining whether to start
- * a drag in motion notify events. */
- tw->last_x = event->x;
- tw->last_y = event->y;
-
- if (tw->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tw->ssl_data;
- }
-
- tree_mouse_action(tw->tree, tw->mouse_state, event->x, event->y);
-
- return TRUE;
-}
-
-static gboolean
-nsgtk_tree_window_button_release_event(GtkWidget *widget,
- GdkEventButton *event, gpointer g)
-{
- bool shift = event->state & GDK_SHIFT_MASK;
- bool ctrl = event->state & GDK_CONTROL_MASK;
- bool alt = event->state & GDK_MOD1_MASK;
- struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g;
- struct tree *tree = tw->tree;
-
- /* We consider only button 1 clicks as double clicks.
- * If the mouse state is PRESS then we are waiting for a release to emit
- * a click event, otherwise just reset the state to nothing*/
- if (tw->mouse_state & BROWSER_MOUSE_DOUBLE_CLICK) {
-
- if (tw->mouse_state & BROWSER_MOUSE_PRESS_1)
- tw->mouse_state ^= BROWSER_MOUSE_PRESS_1 |
- BROWSER_MOUSE_CLICK_1;
- else if (tw->mouse_state & BROWSER_MOUSE_PRESS_2)
- tw->mouse_state ^= (BROWSER_MOUSE_PRESS_2 |
- BROWSER_MOUSE_CLICK_2 |
- BROWSER_MOUSE_DOUBLE_CLICK);
-
- } else if (tw->mouse_state & BROWSER_MOUSE_PRESS_1) {
- tw->mouse_state ^= (BROWSER_MOUSE_PRESS_1 |
- BROWSER_MOUSE_CLICK_1);
- } else if (tw->mouse_state & BROWSER_MOUSE_PRESS_2) {
- tw->mouse_state ^= (BROWSER_MOUSE_PRESS_2 |
- BROWSER_MOUSE_CLICK_2);
- } else if (tw->mouse_state & BROWSER_MOUSE_HOLDING_1) {
- tw->mouse_state ^= (BROWSER_MOUSE_HOLDING_1 |
- BROWSER_MOUSE_DRAG_ON);
- } else if (tw->mouse_state & BROWSER_MOUSE_HOLDING_2) {
- tw->mouse_state ^= (BROWSER_MOUSE_HOLDING_2 |
- BROWSER_MOUSE_DRAG_ON);
- }
-
- /* Handle modifiers being removed */
- if (tw->mouse_state & BROWSER_MOUSE_MOD_1 && !shift)
- tw->mouse_state ^= BROWSER_MOUSE_MOD_1;
- if (tw->mouse_state & BROWSER_MOUSE_MOD_2 && !ctrl)
- tw->mouse_state ^= BROWSER_MOUSE_MOD_2;
- if (tw->mouse_state & BROWSER_MOUSE_MOD_3 && !alt)
- tw->mouse_state ^= BROWSER_MOUSE_MOD_3;
-
- if (tw->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tw->ssl_data;
- }
-
- if (tw->mouse_state &
- ~(BROWSER_MOUSE_MOD_1 |
- BROWSER_MOUSE_MOD_2 |
- BROWSER_MOUSE_MOD_3)) {
- tree_mouse_action(tree, tw->mouse_state,
- event->x, event->y);
- } else {
- tree_drag_end(tree, tw->mouse_state,
- tw->mouse_pressed_x,
- tw->mouse_pressed_y,
- event->x, event->y);
- }
-
- tw->mouse_state = 0;
- tw->mouse_pressed = false;
-
- return TRUE;
-}
-
-static gboolean
-nsgtk_tree_window_motion_notify_event(GtkWidget *widget,
- GdkEventMotion *event, gpointer g)
-{
- bool shift = event->state & GDK_SHIFT_MASK;
- bool ctrl = event->state & GDK_CONTROL_MASK;
- bool alt = event->state & GDK_MOD1_MASK;
- struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g;
- struct tree *tree = tw->tree;
-
- if (tw->mouse_pressed == false)
- return TRUE;
-
- if ((fabs(event->x - tw->last_x) < 5.0) &&
- (fabs(event->y - tw->last_y) < 5.0)) {
- /* Mouse hasn't moved far enough from press coordinate
- * for this to be considered a drag.
- */
- return FALSE;
- } else {
- /* This is a drag, ensure it's always treated as such,
- * even if we drag back over the press location.
- */
- tw->last_x = INT_MIN;
- tw->last_y = INT_MIN;
- }
-
- if (tw->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tw->ssl_data;
- }
-
- if (tw->mouse_state & BROWSER_MOUSE_PRESS_1) {
- /* Start button 1 drag */
- tree_mouse_action(tree, BROWSER_MOUSE_DRAG_1,
- tw->mouse_pressed_x, tw->mouse_pressed_y);
- /* Replace PRESS with HOLDING and declare drag in progress */
- tw->mouse_state ^= (BROWSER_MOUSE_PRESS_1 |
- BROWSER_MOUSE_HOLDING_1);
- tw->mouse_state |= BROWSER_MOUSE_DRAG_ON;
- return TRUE;
- }
- else if (tw->mouse_state & BROWSER_MOUSE_PRESS_2){
- /* Start button 2s drag */
- tree_mouse_action(tree, BROWSER_MOUSE_DRAG_2,
- tw->mouse_pressed_x, tw->mouse_pressed_y);
- /* Replace PRESS with HOLDING and declare drag in progress */
- tw->mouse_state ^= (BROWSER_MOUSE_PRESS_2 |
- BROWSER_MOUSE_HOLDING_2);
- tw->mouse_state |= BROWSER_MOUSE_DRAG_ON;
- return TRUE;
- }
-
- /* Handle modifiers being removed */
- if (tw->mouse_state & BROWSER_MOUSE_MOD_1 && !shift)
- tw->mouse_state ^= BROWSER_MOUSE_MOD_1;
- if (tw->mouse_state & BROWSER_MOUSE_MOD_2 && !ctrl)
- tw->mouse_state ^= BROWSER_MOUSE_MOD_2;
- if (tw->mouse_state & BROWSER_MOUSE_MOD_3 && !alt)
- tw->mouse_state ^= BROWSER_MOUSE_MOD_3;
-
- if (tw->mouse_state & (BROWSER_MOUSE_HOLDING_1 |
- BROWSER_MOUSE_HOLDING_2))
- tree_mouse_action(tree, tw->mouse_state, event->x,
- event->y);
-
- return TRUE;
-}
-
-
-static gboolean
-nsgtk_tree_window_keypress_event(GtkWidget *widget, GdkEventKey *event,
- gpointer g)
-{
- struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g;
- struct tree *tree = tw->tree;
- uint32_t nskey;
- double value;
- GtkAdjustment *vscroll;
- GtkAdjustment *hscroll;
- GtkAdjustment *scroll = NULL;
- gdouble hpage, vpage;
-
- if (gtk_im_context_filter_keypress(tw->input_method, event))
- return TRUE;
-
- nskey = gtk_gui_gdkkey_to_nskey(event);
-
- if (tw->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tw->ssl_data;
- }
-
- if (tree_keypress(tree, nskey) == true) {
- return TRUE;
- }
-
- vscroll = gtk_scrolled_window_get_vadjustment(tw->scrolled);
- hscroll = gtk_scrolled_window_get_hadjustment(tw->scrolled);
- g_object_get(vscroll, "page-size", &vpage, NULL);
- g_object_get(hscroll, "page-size", &hpage, NULL);
-
- switch (event->keyval) {
- case GDK_KEY(Home):
- case GDK_KEY(KP_Home):
- scroll = vscroll;
- value = nsgtk_adjustment_get_lower(scroll);
- break;
-
- case GDK_KEY(End):
- case GDK_KEY(KP_End):
- scroll = vscroll;
- value = nsgtk_adjustment_get_upper(scroll) - vpage;
- if (value < nsgtk_adjustment_get_lower(scroll))
- value = nsgtk_adjustment_get_lower(scroll);
- break;
-
- case GDK_KEY(Left):
- case GDK_KEY(KP_Left):
- scroll = hscroll;
- value = gtk_adjustment_get_value(scroll) -
- nsgtk_adjustment_get_step_increment(scroll);
- if (value < nsgtk_adjustment_get_lower(scroll))
- value = nsgtk_adjustment_get_lower(scroll);
- break;
-
- case GDK_KEY(Up):
- case GDK_KEY(KP_Up):
- scroll = vscroll;
- value = gtk_adjustment_get_value(scroll) -
- nsgtk_adjustment_get_step_increment(scroll);
- if (value < nsgtk_adjustment_get_lower(scroll))
- value = nsgtk_adjustment_get_lower(scroll);
- break;
-
- case GDK_KEY(Right):
- case GDK_KEY(KP_Right):
- scroll = hscroll;
- value = gtk_adjustment_get_value(scroll) +
- nsgtk_adjustment_get_step_increment(scroll);
- if (value > nsgtk_adjustment_get_upper(scroll) - hpage)
- value = nsgtk_adjustment_get_upper(scroll) -
hpage;
- break;
-
- case GDK_KEY(Down):
- case GDK_KEY(KP_Down):
- scroll = vscroll;
- value = gtk_adjustment_get_value(scroll) +
- nsgtk_adjustment_get_step_increment(scroll);
- if (value > nsgtk_adjustment_get_upper(scroll) - vpage)
- value = nsgtk_adjustment_get_upper(scroll) -
vpage;
- break;
-
- case GDK_KEY(Page_Up):
- case GDK_KEY(KP_Page_Up):
- scroll = vscroll;
- value = gtk_adjustment_get_value(scroll) -
- nsgtk_adjustment_get_page_increment(scroll);
-
- if (value < nsgtk_adjustment_get_lower(scroll))
- value = nsgtk_adjustment_get_lower(scroll);
-
- break;
-
- case GDK_KEY(Page_Down):
- case GDK_KEY(KP_Page_Down):
- scroll = vscroll;
- value = gtk_adjustment_get_value(scroll) +
- nsgtk_adjustment_get_page_increment(scroll);
-
- if (value > nsgtk_adjustment_get_upper(scroll) - vpage)
- value = nsgtk_adjustment_get_upper(scroll) -
vpage;
- break;
-
- default:
- break;
- }
-
- if (scroll != NULL)
- gtk_adjustment_set_value(scroll, value);
-
- return TRUE;
-}
-
-static gboolean
-nsgtk_tree_window_keyrelease_event(GtkWidget *widget, GdkEventKey *event,
- gpointer g)
-{
- struct nsgtk_treeview *tw = (struct nsgtk_treeview *) g;
-
- return gtk_im_context_filter_keypress(tw->input_method, event);
-}
-
-static void
-nsgtk_tree_window_input_method_commit(GtkIMContext *ctx,
- const gchar *str, gpointer data)
-{
- struct nsgtk_treeview *tw = (struct nsgtk_treeview *) data;
- size_t len = strlen(str), offset = 0;
-
- if (tw->tree_flags == TREE_SSLCERT) {
- ssl_current_session = tw->ssl_data;
- }
-
- while (offset < len) {
- uint32_t nskey = utf8_to_ucs4(str + offset, len - offset);
-
- tree_keypress(tw->tree, nskey);
-
- offset = utf8_next(str, len, offset);
- }
-}
-
-
-static const struct treeview_table nsgtk_tree_callbacks = {
- .redraw_request = nsgtk_tree_redraw_request,
- .resized = nsgtk_tree_resized,
- .scroll_visible = nsgtk_tree_scroll_visible,
- .get_window_dimensions = nsgtk_tree_get_window_dimensions
-};
-
-struct nsgtk_treeview *
-nsgtk_treeview_create(unsigned int flags,
- GtkWindow *window,
- GtkScrolledWindow *scrolled,
- GtkDrawingArea *drawing_area,
- struct sslcert_session_data *ssl_data)
-{
- struct nsgtk_treeview *tv;
-
- assert(drawing_area != NULL);
-
- tv = malloc(sizeof(struct nsgtk_treeview));
- if (tv == NULL) {
- LOG("malloc failed");
- nsgtk_warning("NoMemory", 0);
- return NULL;
- }
-
- tv->tree_flags = flags;
- if (tv->tree_flags == TREE_SSLCERT) {
- tv->ssl_data = ssl_data;
- ssl_current_session = tv->ssl_data;
- }
-
- tv->window = window;
- tv->scrolled = scrolled;
- tv->drawing_area = drawing_area;
- tv->input_method = gtk_im_multicontext_new();
- tv->tree = tree_create(flags, &nsgtk_tree_callbacks, tv);
- tv->mouse_state = 0;
- tv->mouse_pressed = false;
-
- nsgtk_widget_override_background_color(GTK_WIDGET(drawing_area),
- GTK_STATE_NORMAL,
- 0, 0xffff, 0xffff, 0xffff);
-
- nsgtk_connect_draw_event(GTK_WIDGET(drawing_area),
G_CALLBACK(nsgtk_tree_window_draw_event), tv);
-
-#define CONNECT(obj, sig, callback, ptr) \
- g_signal_connect(G_OBJECT(obj), (sig), G_CALLBACK(callback), (ptr))
- CONNECT(drawing_area, "button-press-event",
- nsgtk_tree_window_button_press_event,
- tv);
- CONNECT(drawing_area, "button-release-event",
- nsgtk_tree_window_button_release_event,
- tv);
- CONNECT(drawing_area, "motion-notify-event",
- nsgtk_tree_window_motion_notify_event,
- tv);
- CONNECT(drawing_area, "key-press-event",
- nsgtk_tree_window_keypress_event,
- tv);
- CONNECT(drawing_area, "key-release-event",
- nsgtk_tree_window_keyrelease_event,
- tv);
-
-
- /* input method */
- gtk_im_context_set_client_window(tv->input_method,
- nsgtk_widget_get_window(GTK_WIDGET(tv->window)));
- gtk_im_context_set_use_preedit(tv->input_method, FALSE);
- /* input method signals */
- CONNECT(tv->input_method, "commit",
- nsgtk_tree_window_input_method_commit,
- tv);
-
- return tv;
-}
diff --git a/frontends/gtk/treeview.h b/frontends/gtk/treeview.h
deleted file mode 100644
index 70f2c53..0000000
--- a/frontends/gtk/treeview.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright 2004 Richard Wilson <[email protected]>
- * Copyright 2009 Paul Blokus <[email protected]>
- *
- * This file is part of NetSurf, http://www.netsurf-browser.org/
- *
- * NetSurf is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
- *
- * NetSurf is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/** \file
- * Generic tree handling.
- */
-
-#ifndef __NSGTK_TREEVIEW_H__
-#define __NSGTK_TREEVIEW_H__
-
-struct nsgtk_treeview;
-struct sslcert_session_data;
-
-/**
- * Create a treeview within a gtk widget.
- *
- * \param flags type of treeview.
- */
-struct nsgtk_treeview *nsgtk_treeview_create(unsigned int flags, GtkWindow
*window, GtkScrolledWindow *scrolled, GtkDrawingArea *drawing_area, struct
sslcert_session_data *ssl_data);
-
-void nsgtk_treeview_destroy(struct nsgtk_treeview *tv);
-
-struct tree *nsgtk_treeview_get_tree(struct nsgtk_treeview *tv);
-
-void nsgtk_tree_window_hide(GtkWidget *widget, gpointer g);
-
-#endif /*__NSGTK_TREEVIEW_H__*/
--
NetSurf Browser
_______________________________________________
netsurf-commits mailing list
[email protected]
http://listmaster.pepperfish.net/cgi-bin/mailman/listinfo/netsurf-commits-netsurf-browser.org