diff options
-rw-r--r-- | backend/epub/epub-document.c | 135 | ||||
-rw-r--r-- | libdocument/ev-document.c | 14 | ||||
-rw-r--r-- | libdocument/ev-document.h | 5 | ||||
-rw-r--r-- | libview/ev-document-model.c | 16 | ||||
-rw-r--r-- | libview/ev-web-view.c | 47 | ||||
-rw-r--r-- | shell/ev-sidebar-thumbnails.c | 2 |
6 files changed, 179 insertions, 40 deletions
diff --git a/backend/epub/epub-document.c b/backend/epub/epub-document.c index d0dce118..9caa8432 100644 --- a/backend/epub/epub-document.c +++ b/backend/epub/epub-document.c @@ -1267,6 +1267,139 @@ epub_document_get_page(EvDocument *document, return page ; } +static void +change_to_night_sheet(contentListNode *nodedata,gpointer user_data) +{ + gchar *filename = g_filename_from_uri(nodedata->value,NULL,NULL); + open_xml_document(filename); + set_xml_root_node(NULL); + xmlNodePtr head =xml_get_pointer_to_node((xmlChar*)"head",NULL,NULL); + + xmlretval = NULL; + xml_parse_children_of_node(head,(xmlChar*)"link",(xmlChar*)"rel",(xmlChar*)"stylesheet"); + + xmlNodePtr day = xmlretval; + xmlSetProp(day,(xmlChar*)"rel",(xmlChar*)"alternate stylesheet"); + + xmlretval = NULL; + xml_parse_children_of_node(head,(xmlChar*)"link",(xmlChar*)"class",(xmlChar*)"night"); + xmlSetProp(xmlretval,(xmlChar*)"rel",(xmlChar*)"stylesheet"); + xmlSaveFormatFile (filename, xmldocument, 0); + xml_free_doc(); + g_free(filename); +} + +static void +change_to_day_sheet(contentListNode *nodedata,gpointer user_data) +{ + gchar *filename = g_filename_from_uri(nodedata->value,NULL,NULL); + open_xml_document(filename); + set_xml_root_node(NULL); + xmlNodePtr head =xml_get_pointer_to_node((xmlChar*)"head",NULL,NULL); + + xmlretval = NULL; + xml_parse_children_of_node(head,(xmlChar*)"link",(xmlChar*)"rel",(xmlChar*)"stylesheet"); + + xmlNodePtr day = xmlretval; + xmlSetProp(day,(xmlChar*)"rel",(xmlChar*)"alternate stylesheet"); + + xmlretval = NULL; + xml_parse_children_of_node(head,(xmlChar*)"link",(xmlChar*)"class",(xmlChar*)"day"); + xmlSetProp(xmlretval,(xmlChar*)"rel",(xmlChar*)"stylesheet"); + xmlSaveFormatFile (filename, xmldocument, 0); + xml_free_doc(); + g_free(filename); +} + +static gchar* +epub_document_get_alternate_stylesheet(gchar *docuri) +{ + gchar *filename = g_filename_from_uri(docuri,NULL,NULL); + open_xml_document(filename); + + set_xml_root_node(NULL); + + xmlNodePtr head= xml_get_pointer_to_node((xmlChar*)"head",NULL,NULL); + + xmlretval = NULL; + + xml_parse_children_of_node(head,(xmlChar*)"link",(xmlChar*)"class",(xmlChar*)"night"); + + if (xmlretval != NULL) { + return (gchar*)xml_get_data_from_node(xmlretval,XML_ATTRIBUTE,(xmlChar*)"href"); + } + g_free(filename); + xml_free_doc(); + return NULL; +} + +static void +add_night_sheet(contentListNode *listdata,gchar *sheet) +{ + gchar *sheeturi = g_filename_to_uri(sheet,NULL,NULL); + open_xml_document(listdata->value); + + set_xml_root_node(NULL); + xmlNodePtr head = xml_get_pointer_to_node((xmlChar*)"head",NULL,NULL); + + xmlNodePtr link = xmlNewTextChild(head,NULL,(xmlChar*)"link",NULL); + xmlAttrPtr href = xmlNewProp(link,(xmlChar*)"href",(xmlChar*)sheeturi); + xmlAttrPtr rel = xmlNewProp(link,(xmlChar*)"rel",(xmlChar*)"alternate stylesheet"); + xmlAttrPtr class = xmlNewProp(link,(xmlChar*)"class",(xmlChar*)"night"); + + xmlSaveFormatFile (listdata->value, xmldocument, 0); + xml_free_doc(); + g_free(sheeturi); +} + +static void +epub_document_check_add_night_sheet(EvDocument *document) +{ + EpubDocument *epub_document = EPUB_DOCUMENT(document); + + g_return_if_fail(EPUB_IS_DOCUMENT(epub_document)); + + /* + * We'll only check the first page for a supplied night mode stylesheet. + * Odds are, if this one has it, all others have it too. + */ + contentListNode *node = epub_document->contentList->data; + gchar* stylesheetfilename = epub_document_get_alternate_stylesheet((gchar*)node->value) ; + + if (stylesheetfilename == NULL) { + gchar *style = "body {color:rgb(255,255,255);background-color:rgb(0,0,0);text-align:justify;line-spacing:1.8; margin-top:0px;margin-bottom:4px;margin-right:50px;\ + margin-left:50px;text-indent:3em;"; + + gchar *csspath = g_strdup_printf("%s/atrilnightstyle.css",epub_document->documentdir); + + + GFile *styles = g_file_new_for_path (csspath); + GOutputStream *outstream = (GOutputStream*)g_file_create(styles,G_FILE_CREATE_PRIVATE,NULL,NULL); + if ( g_output_stream_write((GOutputStream*)outstream,style,strlen(style),NULL,NULL) == -1 ) + { + return ; + } + g_output_stream_close((GOutputStream*)outstream,NULL,NULL); + g_object_unref(styles) ; + g_object_unref(outstream) ; + //add this stylesheet to each document, for later. + g_list_foreach(epub_document->contentList,(GFunc)add_night_sheet,csspath); + g_free(csspath); + } + g_free(stylesheetfilename); +} + +static void +epub_document_toggle_night_mode(EvDocument *document,gboolean night) +{ + EpubDocument *epub_document = EPUB_DOCUMENT(document); + + g_return_if_fail(EPUB_IS_DOCUMENT(epub_document)); + if (night) + g_list_foreach(epub_document->contentList,(GFunc)change_to_night_sheet,NULL); + else + g_list_foreach(epub_document->contentList,(GFunc)change_to_day_sheet,NULL); +} static gboolean epub_document_load (EvDocument* document, @@ -1388,4 +1521,6 @@ epub_document_class_init (EpubDocumentClass *klass) ev_document_class->get_n_pages = epub_document_get_n_pages; ev_document_class->get_info = epub_document_get_info; ev_document_class->get_page = epub_document_get_page; + ev_document_class->toggle_night_mode = epub_document_toggle_night_mode; + ev_document_class->check_add_night_sheet = epub_document_check_add_night_sheet; }
\ No newline at end of file diff --git a/libdocument/ev-document.c b/libdocument/ev-document.c index a242bdf6..667f89f1 100644 --- a/libdocument/ev-document.c +++ b/libdocument/ev-document.c @@ -910,3 +910,17 @@ ev_rect_cmp (EvRectangle *a, (ABS (a->x2 - b->x2) < EPSILON) && (ABS (a->y2 - b->y2) < EPSILON)); } + +void +ev_document_toggle_night_mode(EvDocument *document,gboolean night) +{ + EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS(document); + return klass->toggle_night_mode(document,night) ; +} + +void +ev_document_check_add_night_sheet(EvDocument *document) +{ + EvDocumentClass *klass = EV_DOCUMENT_GET_CLASS(document); + return klass->check_add_night_sheet(document) ; +}
\ No newline at end of file diff --git a/libdocument/ev-document.h b/libdocument/ev-document.h index 24e31912..46a0971c 100644 --- a/libdocument/ev-document.h +++ b/libdocument/ev-document.h @@ -118,6 +118,9 @@ struct _EvDocumentClass gboolean (* get_backend_info)(EvDocument *document, EvDocumentBackendInfo *info); gboolean (* support_synctex) (EvDocument *document); + + void (* toggle_night_mode) (EvDocument *document,gboolean night); + void (*check_add_night_sheet)(EvDocument *document); }; GType ev_document_get_type (void) G_GNUC_CONST; @@ -184,6 +187,8 @@ EvMapping *ev_document_synctex_forward_search gint ev_rect_cmp (EvRectangle *a, EvRectangle *b); +void ev_document_toggle_night_mode (EvDocument *document,gboolean night); +void ev_document_check_add_night_sheet (EvDocument *document); #define EV_TYPE_RECTANGLE (ev_rectangle_get_type ()) struct _EvRectangle diff --git a/libview/ev-document-model.c b/libview/ev-document-model.c index dbf0477f..403df466 100644 --- a/libview/ev-document-model.c +++ b/libview/ev-document-model.c @@ -109,12 +109,7 @@ ev_document_model_set_property (GObject *object, ev_document_model_set_rotation (model, g_value_get_int (value)); break; case PROP_INVERTED_COLORS: - if ( model->document->iswebdocument == TRUE ) { - atril_web_document_set_inverted_colors(model,g_value_get_boolean(value)); - } - else { - ev_document_model_set_inverted_colors (model, g_value_get_boolean (value)); - } + ev_document_model_set_inverted_colors (model, g_value_get_boolean (value)); break; case PROP_SCALE: ev_document_model_set_scale (model, g_value_get_double (value)); @@ -495,15 +490,6 @@ ev_document_model_set_inverted_colors (EvDocumentModel *model, g_object_notify (G_OBJECT (model), "inverted-colors"); } -void -atril_web_document_set_inverted_colors (EvDocumentModel *model, - gboolean inverted_colors) -{ - //TODO - model->inverted_colors = FALSE; - g_object_notify (G_OBJECT (model), "inverted-colors"); -} - gboolean ev_document_model_get_inverted_colors (EvDocumentModel *model) { diff --git a/libview/ev-web-view.c b/libview/ev-web-view.c index b1fe3b08..5d1f5034 100644 --- a/libview/ev-web-view.c +++ b/libview/ev-web-view.c @@ -58,7 +58,7 @@ struct _EvWebView EvDocument *document; EvDocumentModel *model; gint current_page; - gboolean inverted_colors ; + gboolean inverted_stylesheet ; gboolean fullscreen; SearchParams *search; #if GTK_CHECK_VERSION (3, 0, 0) @@ -157,7 +157,7 @@ ev_web_view_init (EvWebView *webview) webview->search->search_jump = TRUE ; webview->fullscreen = FALSE; - + webview->inverted_stylesheet = FALSE; webview->hlink = NULL; } @@ -262,29 +262,28 @@ ev_web_view_inverted_colors_changed_cb (EvDocumentModel *model, GParamSpec *pspec, EvWebView *webview) { - guint inverted_colors = ev_document_model_get_inverted_colors (model); - inverted_colors = !inverted_colors; - /*TODO*/ + EvDocument *document = ev_document_model_get_document(model); + + if (ev_document_model_get_inverted_colors(model) == TRUE) { + if (document == NULL) { + ev_document_model_set_inverted_colors(model,FALSE); + return; + } + if (webview->inverted_stylesheet == FALSE) { + ev_document_check_add_night_sheet(document); + webview->inverted_stylesheet = TRUE; + } + ev_document_toggle_night_mode(document,TRUE); + webkit_web_view_reload(WEBKIT_WEB_VIEW(webview)); + } + else { + if (document != NULL) { + ev_document_toggle_night_mode(document,FALSE); + webkit_web_view_reload(WEBKIT_WEB_VIEW(webview)); + } + } } -static void -ev_web_view_fullscreen_changed_cb (EvDocumentModel *model, - GParamSpec *pspec, - EvWebView *webview) -{ - gboolean fullscreen = ev_document_model_get_fullscreen (model); - - webview->fullscreen = fullscreen; -#if GTK_CHECK_VERSION (3, 0, 0) - WebKitWindowProperties *window_properties = - webkit_web_view_get_window_properties (WEBKIT_WEB_VIEW(webview)); - - webkit_window_properties_get_fullscreen(window_properties); - /*TODO*/ -#else - webkit_web_view_set_view_mode(WEBKIT_WEB_VIEW(webview), WEBKIT_WEB_VIEW_VIEW_MODE_FULLSCREEN); -#endif -} void ev_web_view_set_model (EvWebView *webview, EvDocumentModel *model) @@ -309,7 +308,7 @@ ev_web_view_set_model (EvWebView *webview, /* Initialize webview from model */ webview->fullscreen = ev_document_model_get_fullscreen (webview->model); webview->document = ev_document_model_get_document(webview->model); - webview->inverted_colors = ev_document_model_get_inverted_colors(webview->model); + ev_web_view_document_changed_cb (webview->model, NULL, webview); g_signal_connect (webview->model, "notify::document", diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c index a6102355..5fb951ac 100644 --- a/shell/ev-sidebar-thumbnails.c +++ b/shell/ev-sidebar-thumbnails.c @@ -870,7 +870,7 @@ thumbnail_job_completed_callback (EvJobThumbnail *job, GtkTreeIter *iter; iter = (GtkTreeIter *) g_object_get_data (G_OBJECT (job), "tree_iter"); - if (priv->inverted_colors) + if (priv->inverted_colors && priv->document->iswebdocument == FALSE) ev_document_misc_invert_pixbuf (job->thumbnail); gtk_list_store_set (priv->list_store, iter, |