]> www.fi.muni.cz Git - evince.git/blobdiff - libdocument/ev-link-dest.c
[dualscreen] fix crash on ctrl+w and fix control window closing
[evince.git] / libdocument / ev-link-dest.c
index 09f840afb2079d1f98a3d4ddeb5d6b77e86cbfad..9d5d8608f0c92cd962b3ea8d81c3f6a0f196e66d 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  */
 
+#include <config.h>
+
 #include "ev-link-dest.h"
+#include "ev-document-type-builtins.h"
 
 enum {
        PROP_0,
@@ -29,10 +32,17 @@ enum {
        PROP_BOTTOM,
        PROP_RIGHT,
        PROP_ZOOM,
+       PROP_CHANGE,
        PROP_NAMED,
        PROP_PAGE_LABEL
 };
 
+typedef enum {
+       EV_DEST_CHANGE_TOP    = 1 << 0,
+       EV_DEST_CHANGE_LEFT   = 1 << 1,
+       EV_DEST_CHANGE_ZOOM   = 1 << 2
+} EvDestChange;
+
 struct _EvLinkDest {
        GObject base_instance;
        
@@ -51,6 +61,7 @@ struct _EvLinkDestPrivate {
        double         bottom;
        double         right;
        double         zoom;
+       EvDestChange   change;
        gchar         *named;
        gchar         *page_label;
 };
@@ -60,31 +71,6 @@ G_DEFINE_TYPE (EvLinkDest, ev_link_dest, G_TYPE_OBJECT)
 #define EV_LINK_DEST_GET_PRIVATE(object) \
         (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_LINK_DEST, EvLinkDestPrivate))
 
-GType
-ev_link_dest_type_get_type (void)
-{
-       static GType type = 0;
-
-       if (G_UNLIKELY (type == 0)) {
-               static const GEnumValue values[] = {
-                       { EV_LINK_DEST_TYPE_PAGE, "EV_LINK_DEST_TYPE_PAGE", "page" },
-                       { EV_LINK_DEST_TYPE_XYZ, "EV_LINK_DEST_TYPE_XYZ", "xyz" },
-                       { EV_LINK_DEST_TYPE_FIT, "EV_LINK_DEST_TYPE_FIT", "fit" },
-                       { EV_LINK_DEST_TYPE_FITH, "EV_LINK_DEST_TYPE_FITH", "fith" },
-                       { EV_LINK_DEST_TYPE_FITV, "EV_LINK_DEST_TYPE_FITV", "fitv" },
-                       { EV_LINK_DEST_TYPE_FITR, "EV_LINK_DEST_TYPE_FITR", "fitr" },
-                       { EV_LINK_DEST_TYPE_NAMED, "EV_LINK_DEST_TYPE_NAMED", "named" },
-                       { EV_LINK_DEST_TYPE_PAGE_LABEL, "EV_LINK_DEST_TYPE_PAGE_LABEL", "page_label" },
-                       { EV_LINK_DEST_TYPE_UNKNOWN, "EV_LINK_DEST_TYPE_UNKNOWN", "unknown" },
-                       { 0, NULL, NULL }
-               };
-
-               type = g_enum_register_static ("EvLinkDestType", values);
-       }
-
-       return type;
-}
-
 EvLinkDestType
 ev_link_dest_get_dest_type (EvLinkDest *self)
 {
@@ -102,18 +88,26 @@ ev_link_dest_get_page (EvLinkDest *self)
 }
 
 gdouble
-ev_link_dest_get_top (EvLinkDest *self)
+ev_link_dest_get_top (EvLinkDest *self,
+                     gboolean   *change_top)
 {
        g_return_val_if_fail (EV_IS_LINK_DEST (self), 0);
 
+       if (change_top)
+               *change_top = (self->priv->change & EV_DEST_CHANGE_TOP);
+       
        return self->priv->top;
 }
 
 gdouble
-ev_link_dest_get_left (EvLinkDest *self)
+ev_link_dest_get_left (EvLinkDest *self,
+                      gboolean   *change_left)
 {
        g_return_val_if_fail (EV_IS_LINK_DEST (self), 0);
 
+       if (change_left)
+               *change_left = (self->priv->change & EV_DEST_CHANGE_LEFT);
+
        return self->priv->left;
 }
 
@@ -134,10 +128,14 @@ ev_link_dest_get_right (EvLinkDest *self)
 }
 
 gdouble
-ev_link_dest_get_zoom (EvLinkDest *self)
+ev_link_dest_get_zoom (EvLinkDest *self,
+                      gboolean   *change_zoom)
 {
        g_return_val_if_fail (EV_IS_LINK_DEST (self), 0);
 
+       if (change_zoom)
+               *change_zoom = (self->priv->change & EV_DEST_CHANGE_ZOOM);
+
        return self->priv->zoom;
 }
 
@@ -189,6 +187,9 @@ ev_link_dest_get_property (GObject    *object,
                case PROP_ZOOM:
                        g_value_set_double (value, self->priv->zoom);
                        break;
+               case PROP_CHANGE:
+                       g_value_set_uint (value, self->priv->change);
+                       break;
                case PROP_NAMED:
                        g_value_set_string (value, self->priv->named);
                        break;
@@ -233,6 +234,9 @@ ev_link_dest_set_property (GObject      *object,
                case PROP_ZOOM:
                        self->priv->zoom = g_value_get_double (value);
                        break;
+               case PROP_CHANGE:
+                       self->priv->change = g_value_get_uint (value);
+                       break;
                case PROP_NAMED:
                        self->priv->named = g_value_dup_string (value);
                        break;
@@ -358,6 +362,16 @@ ev_link_dest_class_init (EvLinkDestClass *ev_link_dest_class)
                                                              0,
                                                              G_PARAM_READWRITE |
                                                              G_PARAM_CONSTRUCT_ONLY));
+       g_object_class_install_property (g_object_class,
+                                        PROP_CHANGE,
+                                        g_param_spec_uint ("change",
+                                                           "Change",
+                                                           "Wether top, left, and zoom should be changed",
+                                                           0,
+                                                           G_MAXUINT,
+                                                           0,
+                                                           G_PARAM_READWRITE |
+                                                           G_PARAM_CONSTRUCT_ONLY));
        g_object_class_install_property (g_object_class,
                                         PROP_NAMED,
                                         g_param_spec_string ("named",
@@ -386,17 +400,30 @@ ev_link_dest_new_page (gint page)
 }
 
 EvLinkDest *
-ev_link_dest_new_xyz (gint    page,
-                     gdouble left,
-                     gdouble top,
-                     gdouble zoom)
+ev_link_dest_new_xyz (gint     page,
+                     gdouble  left,
+                     gdouble  top,
+                     gdouble  zoom,
+                     gboolean change_left,
+                     gboolean change_top,
+                     gboolean change_zoom)
 {
+       EvDestChange change = 0;
+
+       if (change_left)
+               change |= EV_DEST_CHANGE_LEFT;
+       if (change_top)
+               change |= EV_DEST_CHANGE_TOP;
+       if (change_zoom)
+               change |= EV_DEST_CHANGE_ZOOM;
+       
        return EV_LINK_DEST (g_object_new (EV_TYPE_LINK_DEST,
                                           "page", page,
                                           "type", EV_LINK_DEST_TYPE_XYZ,
                                           "left", left,
                                           "top", top,
                                           "zoom", zoom,
+                                          "change", change,
                                           NULL));
 }
 
@@ -410,24 +437,38 @@ ev_link_dest_new_fit (gint page)
 }
 
 EvLinkDest *
-ev_link_dest_new_fith (gint    page,
-                      gdouble top)
+ev_link_dest_new_fith (gint     page,
+                      gdouble  top,
+                      gboolean change_top)
 {
+       EvDestChange change = 0;
+
+       if (change_top)
+               change |= EV_DEST_CHANGE_TOP;
+       
        return EV_LINK_DEST (g_object_new (EV_TYPE_LINK_DEST,
                                           "page", page,
                                           "type", EV_LINK_DEST_TYPE_FITH,
                                           "top", top,
+                                          "change", change,
                                           NULL));
 }
 
 EvLinkDest *
-ev_link_dest_new_fitv (gint    page,
-                      gdouble left)
+ev_link_dest_new_fitv (gint     page,
+                      gdouble  left,
+                      gboolean change_left)
 {
+       EvDestChange change = 0;
+
+       if (change_left)
+               change |= EV_DEST_CHANGE_LEFT;
+
        return EV_LINK_DEST (g_object_new (EV_TYPE_LINK_DEST,
                                           "page", page,
                                           "type", EV_LINK_DEST_TYPE_FITV,
                                           "left", left,
+                                          "change", change,
                                           NULL));
 }
 
@@ -438,6 +479,8 @@ ev_link_dest_new_fitr (gint    page,
                       gdouble right,
                       gdouble top)
 {
+       EvDestChange change = EV_DEST_CHANGE_TOP | EV_DEST_CHANGE_LEFT;
+       
        return EV_LINK_DEST (g_object_new (EV_TYPE_LINK_DEST,
                                           "page", page,
                                           "type", EV_LINK_DEST_TYPE_FITR,
@@ -445,6 +488,7 @@ ev_link_dest_new_fitr (gint    page,
                                           "bottom", bottom,
                                           "right", right,
                                           "top", top,
+                                          "change", change,
                                           NULL));
 }