summaryrefslogtreecommitdiff
path: root/libview/ev-jobs.c
diff options
context:
space:
mode:
authorrootavish <[email protected]>2014-07-19 22:18:40 +0530
committerrootavish <[email protected]>2014-07-19 22:18:40 +0530
commite0535b0e61cc56ec62d32518c03a42836f5256e6 (patch)
treeb3e64eb8c4d3043f291ff32974f7a12c6139c81a /libview/ev-jobs.c
parent46fce038996fa84784df775d0b2e941228388b66 (diff)
downloadatril-e0535b0e61cc56ec62d32518c03a42836f5256e6.tar.bz2
atril-e0535b0e61cc56ec62d32518c03a42836f5256e6.tar.xz
Moving all webkit tasks to main loop jobs
Diffstat (limited to 'libview/ev-jobs.c')
-rw-r--r--libview/ev-jobs.c74
1 files changed, 48 insertions, 26 deletions
diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c
index 4f938a89..4596b58a 100644
--- a/libview/ev-jobs.c
+++ b/libview/ev-jobs.c
@@ -801,7 +801,6 @@ ev_job_thumbnail_run (EvJob *job)
EvJobThumbnail *job_thumb = EV_JOB_THUMBNAIL (job);
EvRenderContext *rc;
EvPage *page;
- GtkWidget *webview;
ev_debug_message (DEBUG_JOBS, "%d (%p)", job_thumb->page, job);
ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
@@ -817,20 +816,24 @@ ev_job_thumbnail_run (EvJob *job)
g_object_unref (page);
if (job->document->iswebdocument == TRUE) {
- webview = ev_document_thumbnails_get_webview_with_rendered_document(EV_DOCUMENT_THUMBNAILS(job->document),(gchar*)rc->page->backend_page);
gboolean completed = FALSE;
-
+ GtkWidget *webview = webkit_web_view_new();
+
EvJobWebThumbnail *web_thumb_job =
- EV_JOB_WEB_THUMBNAIL(ev_job_web_thumbnail_new(job->document, webview, &completed));
+ EV_JOB_WEB_THUMBNAIL(ev_job_web_thumbnail_new(job->document, &completed, webview, (gchar*)rc->page->backend_page));
ev_job_scheduler_push_job (EV_JOB (web_thumb_job), EV_JOB_PRIORITY_HIGH);
+
+ WebKitLoadStatus status ;
- while (completed == FALSE) {
+ while ((status = webkit_web_view_get_load_status (WEBKIT_WEB_VIEW(webview))) != WEBKIT_LOAD_FINISHED &&
+ status != WEBKIT_LOAD_FAILED) {
/*Let the job complete before we proceed.
*This fix SHOULD solve all problems.
*/
}
-
+
+ web_thumb_job->surface = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(webview));
/* For the purpose of thumbnails only, we make the page a cairo surface, instead of the uri's we are passing around*/
EvPage *screenshotpage;
screenshotpage = ev_page_new(rc->page->index);
@@ -838,11 +841,15 @@ ev_job_thumbnail_run (EvJob *job)
screenshotpage->backend_destroy_func = (EvBackendPageDestroyFunc)cairo_surface_destroy ;
ev_render_context_set_page(rc,screenshotpage);
+ job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document),
+ rc, TRUE);
+
g_object_unref(web_thumb_job);
}
-
- job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document),
- rc, TRUE);
+ else {
+ job_thumb->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (job->document),
+ rc, TRUE);
+ }
g_object_unref (rc);
ev_document_doc_mutex_unlock ();
@@ -897,21 +904,25 @@ ev_job_web_thumbnail_dispose (GObject *object)
job = EV_JOB_WEB_THUMBNAIL (object);
ev_debug_message (DEBUG_JOBS, "%d (%p)", job->page, job);
-
- if(job->webview) {
- g_object_unref(job->webview);
- job->webview = NULL;
- }
if(job->offscreenwindow) {
gtk_widget_destroy(job->offscreenwindow);
job->offscreenwindow = NULL;
}
-
+
+ if(job->webview) {
+ job->webview = NULL;
+ }
+
if(job->surface) {
cairo_surface_destroy (job->surface);
job->surface = NULL;
}
+
+ if(job->page) {
+ g_free(job->page);
+ job->page = NULL;
+ }
(* G_OBJECT_CLASS (ev_job_web_thumbnail_parent_class)->dispose) (object);
}
@@ -919,19 +930,23 @@ static gboolean
ev_job_web_thumbnail_run (EvJob *job)
{
EvJobWebThumbnail *web_thumb_job = EV_JOB_WEB_THUMBNAIL(job);
+
+ ev_debug_message (DEBUG_JOBS, "%s (%p)", web_thumb_job->page, job);
+
+#ifdef EV_ENABLE_DEBUG
+ /* We use the #ifdef in this case because of the if */
+ if (web_thumb_job->surface == NULL)
+ ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
+#endif
+
gtk_window_set_default_size (GTK_WINDOW(web_thumb_job->offscreenwindow),800,1080);
- gtk_container_add(GTK_CONTAINER(web_thumb_job->offscreenwindow),GTK_WIDGET(web_thumb_job->webview));
+
+ webkit_web_view_load_uri(WEBKIT_WEB_VIEW(web_thumb_job->webview),web_thumb_job->page);
+
gtk_widget_show_all(web_thumb_job->offscreenwindow);
- web_thumb_job->surface = webkit_web_view_get_snapshot (WEBKIT_WEB_VIEW(web_thumb_job->webview));
+ ev_job_succeeded (EV_JOB(job));
- while (!web_thumb_job->surface) {
- /* Wait for a surface */
- }
- *(web_thumb_job->completed) = TRUE ;
-
- ev_job_succeeded (job);
-
return FALSE;
}
@@ -947,8 +962,9 @@ ev_job_web_thumbnail_class_init (EvJobWebThumbnailClass *class)
EvJob *
ev_job_web_thumbnail_new (EvDocument *document,
+ gboolean *completed,
GtkWidget *webview,
- gboolean *completed)
+ gchar *webpage)
{
EvJobWebThumbnail *job;
@@ -957,10 +973,16 @@ ev_job_web_thumbnail_new (EvDocument *document,
job = g_object_new (EV_TYPE_JOB_WEB_THUMBNAIL, NULL);
EV_JOB (job)->document = g_object_ref (document);
- job->webview = g_object_ref(webview);
+
+ job->webview = webview;
job->completed = completed;
job->offscreenwindow = gtk_offscreen_window_new();
+
+ gtk_container_add(GTK_CONTAINER(job->offscreenwindow),GTK_WIDGET(job->webview));
+
job->surface = NULL;
+ job->page = g_strdup(webpage);
+
return EV_JOB (job);
}