From 67297a0108ba18a69972c98ee1771c3dad41d55b Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Tue, 02 May 2006 19:02:46 +0000 Subject: Rework links system, it adds support for remote links now and it makes 2006-05-02 Carlos Garcia Campos * backend/Makefile.am: * backend/ev-document-links.[ch]: * backend/ev-document.[ch]: * backend/ev-link-action.[ch]: * backend/ev-link-dest.[ch]: * backend/ev-link.[ch]: * pdf/ev-poppler.cc: (pdf_document_find_link_dest), (ev_link_dest_from_dest), (ev_link_from_action), (build_tree): * shell/ev-page-action.c: (build_new_tree_cb): * shell/ev-sidebar-links.c: (get_page_from_dest), (print_section_cb), (links_page_num_func), (update_page_callback): * shell/ev-view.[ch]: (ev_view_goto_dest), (ev_view_handle_link), (tip_from_link): * shell/ev-jobs.c: * shell/ev-window.[ch]: (ev_window_open_uri), (sidebar_links_link_activated_cb), (ev_view_popup_cmd_open_link): * shell/ev-application.[ch]: (ev_application_open_window), (ev_application_open_uri): Rework links system, it adds support for remote links now and it makes easier to add new kinds of actions and destinations. Fixes bug #317292 --- (limited to 'backend/ev-link.c') diff --git a/backend/ev-link.c b/backend/ev-link.c index a325c35..8561914 100644 --- a/backend/ev-link.c +++ b/backend/ev-link.c @@ -18,28 +18,14 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - #include "ev-link.h" enum { PROP_0, PROP_TITLE, - PROP_TYPE, - PROP_PAGE, - PROP_URI, - PROP_LEFT, - PROP_TOP, - PROP_BOTTOM, - PROP_RIGHT, - PROP_ZOOM, - PROP_FILENAME, - PROP_PARAMS + PROP_ACTION }; - struct _EvLink { GObject base_instance; EvLinkPrivate *priv; @@ -50,17 +36,8 @@ struct _EvLinkClass { }; struct _EvLinkPrivate { - char *title; - char *uri; - char *filename; - char *params; - EvLinkType type; - int page; - double top; - double left; - double bottom; - double right; - double zoom; + gchar *title; + EvLinkAction *action; }; G_DEFINE_TYPE (EvLink, ev_link, G_TYPE_OBJECT) @@ -68,32 +45,7 @@ G_DEFINE_TYPE (EvLink, ev_link, G_TYPE_OBJECT) #define EV_LINK_GET_PRIVATE(object) \ (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_LINK, EvLinkPrivate)) -GType -ev_link_type_get_type (void) -{ - static GType type = 0; - - if (G_UNLIKELY (type == 0)) { - static const GEnumValue values[] = { - { EV_LINK_TYPE_TITLE, "EV_LINK_TYPE_TITLE", "title" }, - { EV_LINK_TYPE_PAGE, "EV_LINK_TYPE_PAGE", "page" }, - { EV_LINK_TYPE_PAGE_XYZ, "EV_LINK_TYPE_PAGE_XYZ", "page-xyz" }, - { EV_LINK_TYPE_PAGE_FIT, "EV_LINK_TYPE_PAGE_FIT", "page-fit" }, - { EV_LINK_TYPE_PAGE_FITH, "EV_LINK_TYPE_PAGE_FITH", "page-fith" }, - { EV_LINK_TYPE_PAGE_FITV, "EV_LINK_TYPE_PAGE_FITV", "page-fitv" }, - { EV_LINK_TYPE_PAGE_FITR, "EV_LINK_TYPE_PAGE_FITR", "page-fitr" }, - { EV_LINK_TYPE_EXTERNAL_URI, "EV_LINK_TYPE_EXTERNAL_URI", "external" }, - { EV_LINK_TYPE_LAUNCH, "EV_LINK_TYPE_LAUNCH", "launch" }, - { 0, NULL, NULL } - }; - - type = g_enum_register_static ("EvLinkType", values); - } - - return type; -} - -const char * +const gchar * ev_link_get_title (EvLink *self) { g_return_val_if_fail (EV_IS_LINK (self), NULL); @@ -101,88 +53,18 @@ ev_link_get_title (EvLink *self) return self->priv->title; } -const char * -ev_link_get_uri (EvLink *self) +EvLinkAction * +ev_link_get_action (EvLink *self) { g_return_val_if_fail (EV_IS_LINK (self), NULL); - return self->priv->uri; -} - -EvLinkType -ev_link_get_link_type (EvLink *self) -{ - g_return_val_if_fail (EV_IS_LINK (self), 0); - - return self->priv->type; -} - -int -ev_link_get_page (EvLink *self) -{ - g_return_val_if_fail (EV_IS_LINK (self), -1); - - return self->priv->page; -} - -double -ev_link_get_top (EvLink *self) -{ - g_return_val_if_fail (EV_IS_LINK (self), 0); - - return self->priv->top; -} - -double -ev_link_get_left (EvLink *self) -{ - g_return_val_if_fail (EV_IS_LINK (self), 0); - - return self->priv->left; -} - -double -ev_link_get_bottom (EvLink *self) -{ - g_return_val_if_fail (EV_IS_LINK (self), 0); - - return self->priv->bottom; -} - -double -ev_link_get_right (EvLink *self) -{ - g_return_val_if_fail (EV_IS_LINK (self), 0); - - return self->priv->right; -} - -const char * -ev_link_get_filename (EvLink *link) -{ - g_return_val_if_fail (EV_IS_LINK (link), NULL); - - return link->priv->filename; -} - -const char * -ev_link_get_params (EvLink *link) -{ - g_return_val_if_fail (EV_IS_LINK (link), NULL); - - return link->priv->params; -} - -double -ev_link_get_zoom (EvLink *self) -{ - g_return_val_if_fail (EV_IS_LINK (self), 0); - - return self->priv->zoom; + return self->priv->action; } static void -ev_link_get_property (GObject *object, guint prop_id, GValue *value, +ev_link_get_property (GObject *object, + guint prop_id, + GValue *value, GParamSpec *param_spec) { EvLink *self; @@ -190,103 +72,48 @@ ev_link_get_property (GObject *object, guint prop_id, GValue *value, self = EV_LINK (object); switch (prop_id) { - case PROP_TITLE: - g_value_set_string (value, self->priv->title); - break; - case PROP_URI: - g_value_set_string (value, self->priv->uri); - break; - case PROP_TYPE: - g_value_set_enum (value, self->priv->type); - break; - case PROP_PAGE: - g_value_set_int (value, self->priv->page); - break; - case PROP_TOP: - g_value_set_double (value, self->priv->top); - break; - case PROP_LEFT: - g_value_set_double (value, self->priv->left); - break; - case PROP_BOTTOM: - g_value_set_double (value, self->priv->bottom); - break; - case PROP_RIGHT: - g_value_set_double (value, self->priv->left); - break; - case PROP_ZOOM: - g_value_set_double (value, self->priv->zoom); - break; - case PROP_FILENAME: - g_value_set_string (value, self->priv->filename); - case PROP_PARAMS: - g_value_set_string (value, self->priv->params); - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, - prop_id, - param_spec); - break; + case PROP_TITLE: + g_value_set_string (value, self->priv->title); + break; + case PROP_ACTION: + g_value_set_pointer (value, self->priv->action); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, + prop_id, + param_spec); + break; } } static void -ev_link_set_property (GObject *object, guint prop_id, const GValue *value, - GParamSpec *param_spec) +ev_link_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *param_spec) { - EvLink *link = EV_LINK (object); + EvLink *self = EV_LINK (object); switch (prop_id) { - case PROP_TITLE: - link->priv->title = g_strdup (g_value_get_string (value)); - break; - case PROP_URI: - link->priv->uri = g_strdup (g_value_get_string (value)); - break; - case PROP_TYPE: - link->priv->type = g_value_get_enum (value); - break; - case PROP_PAGE: - link->priv->page = g_value_get_int (value); - break; - case PROP_TOP: - link->priv->top = g_value_get_double (value); - break; - case PROP_LEFT: - link->priv->left = g_value_get_double (value); - break; - case PROP_BOTTOM: - link->priv->bottom = g_value_get_double (value); - break; - case PROP_RIGHT: - link->priv->right = g_value_get_double (value); - break; - case PROP_ZOOM: - link->priv->zoom = g_value_get_double (value); - break; - case PROP_FILENAME: - g_free (link->priv->filename); - link->priv->filename = g_strdup (g_value_get_string (value)); - break; - case PROP_PARAMS: - g_free (link->priv->params); - link->priv->params = g_strdup (g_value_get_string (value)); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, - prop_id, - param_spec); - break; + case PROP_TITLE: + self->priv->title = g_value_dup_string (value); + break; + case PROP_ACTION: + self->priv->action = g_value_get_pointer (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, + prop_id, + param_spec); + break; } } static void -ev_window_dispose (GObject *object) +ev_link_finalize (GObject *object) { EvLinkPrivate *priv; - g_return_if_fail (EV_IS_LINK (object)); - priv = EV_LINK (object)->priv; if (priv->title) { @@ -294,30 +121,21 @@ ev_window_dispose (GObject *object) priv->title = NULL; } - if (priv->uri) { - g_free (priv->uri); - priv->uri = NULL; - } - - if (priv->filename) { - g_free (priv->filename); - priv->filename = NULL; - } - - if (priv->params) { - g_free (priv->params); - priv->params = NULL; + if (priv->action) { + g_object_unref (priv->action); + priv->action = NULL; } - G_OBJECT_CLASS (ev_link_parent_class)->dispose (object); + G_OBJECT_CLASS (ev_link_parent_class)->finalize (object); } static void ev_link_init (EvLink *ev_link) { ev_link->priv = EV_LINK_GET_PRIVATE (ev_link); - ev_link->priv->page = -1; - ev_link->priv->type = EV_LINK_TYPE_TITLE; + + ev_link->priv->title = NULL; + ev_link->priv->action = NULL; } static void @@ -326,10 +144,12 @@ ev_link_class_init (EvLinkClass *ev_window_class) GObjectClass *g_object_class; g_object_class = G_OBJECT_CLASS (ev_window_class); - g_object_class->dispose = ev_window_dispose; + g_object_class->set_property = ev_link_set_property; g_object_class->get_property = ev_link_get_property; + g_object_class->finalize = ev_link_finalize; + g_type_class_add_private (g_object_class, sizeof (EvLinkPrivate)); g_object_class_install_property (g_object_class, @@ -341,216 +161,25 @@ ev_link_class_init (EvLinkClass *ev_window_class) G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (g_object_class, - PROP_URI, - g_param_spec_string ("uri", - "Link URI", - "The link URI", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (g_object_class, - PROP_FILENAME, - g_param_spec_string ("filename", - "Filename", - "The link filename", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (g_object_class, - PROP_PARAMS, - g_param_spec_string ("params", - "Params", - "The link params", - NULL, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (g_object_class, - PROP_TYPE, - g_param_spec_enum ("type", - "Link Type", - "The link type", - EV_TYPE_LINK_TYPE, - EV_LINK_TYPE_TITLE, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (g_object_class, - PROP_PAGE, - g_param_spec_int ("page", - "Link Page", - "The link page", - -1, - G_MAXINT, - 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (g_object_class, - PROP_LEFT, - g_param_spec_double ("left", - "Left coordinate", - "The left coordinate", - -G_MAXDOUBLE, - G_MAXDOUBLE, - 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (g_object_class, - PROP_TOP, - g_param_spec_double ("top", - "Top coordinate", - "The top coordinate", - -G_MAXDOUBLE, - G_MAXDOUBLE, - 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (g_object_class, - PROP_BOTTOM, - g_param_spec_double ("bottom", - "Bottom coordinate", - "The bottom coordinate", - -G_MAXDOUBLE, - G_MAXDOUBLE, - 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (g_object_class, - PROP_RIGHT, - g_param_spec_double ("right", - "Right coordinate", - "The right coordinate", - -G_MAXDOUBLE, - G_MAXDOUBLE, - 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); - - g_object_class_install_property (g_object_class, - PROP_ZOOM, - g_param_spec_double ("zoom", - "Zoom", - "Zoom", - 0, - G_MAXDOUBLE, - 0, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); -} - -EvLink * -ev_link_new_title (const char *title) -{ - return EV_LINK (g_object_new (EV_TYPE_LINK, - "title", title, - "type", EV_LINK_TYPE_TITLE, - NULL)); -} - -EvLink * -ev_link_new_page (const char *title, int page) -{ - return EV_LINK (g_object_new (EV_TYPE_LINK, - "title", title, - "page", page, - "type", EV_LINK_TYPE_PAGE, - NULL)); -} - -EvLink * -ev_link_new_page_xyz (const char *title, - int page, - double left, - double top, - double zoom) -{ - return EV_LINK (g_object_new (EV_TYPE_LINK, - "title", title, - "page", page, - "type", EV_LINK_TYPE_PAGE_XYZ, - "left", left, - "top", top, - "zoom", zoom, - NULL)); -} - -EvLink * -ev_link_new_page_fit (const char *title, - int page) -{ - return EV_LINK (g_object_new (EV_TYPE_LINK, - "title", title, - "page", page, - "type", EV_LINK_TYPE_PAGE_FIT, - NULL)); -} - -EvLink * -ev_link_new_page_fith (const char *title, - int page, - double top) -{ - return EV_LINK (g_object_new (EV_TYPE_LINK, - "title", title, - "page", page, - "type", EV_LINK_TYPE_PAGE_FITH, - "top", top, - NULL)); -} - -EvLink * -ev_link_new_page_fitv (const char *title, - int page, - double left) -{ - return EV_LINK (g_object_new (EV_TYPE_LINK, - "title", title, - "page", page, - "type", EV_LINK_TYPE_PAGE_FITV, - "left", left, - NULL)); -} - -EvLink * -ev_link_new_page_fitr (const char *title, - int page, - double left, - double bottom, - double right, - double top) -{ - return EV_LINK (g_object_new (EV_TYPE_LINK, - "title", title, - "page", page, - "type", EV_LINK_TYPE_PAGE_FITR, - "left", left, - "bottom", bottom, - "right", right, - "top", top, - NULL)); + PROP_ACTION, + g_param_spec_pointer ("action", + "Link Action", + "The link action", + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY)); } EvLink * -ev_link_new_external (const char *title, const char *uri) +ev_link_new (const char *title, + EvLinkAction *action) { return EV_LINK (g_object_new (EV_TYPE_LINK, "title", title, - "uri", uri, - "type", EV_LINK_TYPE_EXTERNAL_URI, - NULL)); -} - -EvLink * -ev_link_new_launch (const char *title, - const char *filename, - const char *params) -{ - return EV_LINK (g_object_new (EV_TYPE_LINK, - "title", title, - "filename", filename, - "params", params, - "type", EV_LINK_TYPE_LAUNCH, + "action", action, NULL)); } +/* Link Mapping stuff */ static void ev_link_mapping_free_foreach (EvLinkMapping *mapping) { @@ -568,7 +197,6 @@ ev_link_mapping_free (GList *link_mapping) g_list_free (link_mapping); } - EvLink * ev_link_mapping_find (GList *link_mapping, gdouble x, -- cgit v0.9.1