This is an automated email from the git hooks/post-receive script.

git pushed a commit to branch master
in repository evisum.

View the commit online.

commit 5ea23273a9b876aa71400043cf4a40138056b321
Author: Alastair Poole <[email protected]>
AuthorDate: Tue Apr 28 22:58:36 2026 +0100

    engine: add API to check for available snapshot.
    
    Cheaply check for available data at timestamp.
    
    Indicate to the user a timestamp has no snapshot.
---
 src/bin/engine/evisum_engine.c      | 23 ++++++++++++++
 src/bin/engine/evisum_engine.h      |  1 +
 src/bin/ui/evisum_ui_process_list.c | 61 ++++++++++++++++++++++++++++---------
 3 files changed, 71 insertions(+), 14 deletions(-)

diff --git a/src/bin/engine/evisum_engine.c b/src/bin/engine/evisum_engine.c
index 284a597..8fc3046 100644
--- a/src/bin/engine/evisum_engine.c
+++ b/src/bin/engine/evisum_engine.c
@@ -704,6 +704,29 @@ evisum_engine_history_bounds_get(uint32_t *start_time, uint32_t *end_time)
     return evisum_engine_history_bounds_since_get(0, start_time, end_time);
 }
 
+Eina_Bool
+evisum_engine_history_time_available_get(uint32_t time)
+{
+    Eina_List *logs, *l;
+    Evisum_Engine_History_Log *log;
+    Eina_Bool available = EINA_FALSE;
+
+    if (!time) return EINA_FALSE;
+    if (!evisum_engine_ensure_started()) return EINA_FALSE;
+
+    logs = _engine_history_logs_get(EINA_FALSE, 0);
+    EINA_LIST_FOREACH(logs, l, log) {
+        if ((time >= log->start_time) && (time <= log->end_time)) {
+            available = EINA_TRUE;
+            break;
+        }
+    }
+
+    _engine_history_logs_free(logs);
+
+    return available;
+}
+
 Eina_Bool
 evisum_engine_history_time_set(uint32_t time)
 {
diff --git a/src/bin/engine/evisum_engine.h b/src/bin/engine/evisum_engine.h
index 38ec3a6..d159b57 100644
--- a/src/bin/engine/evisum_engine.h
+++ b/src/bin/engine/evisum_engine.h
@@ -32,6 +32,7 @@ pid_t evisum_engine_daemon_pid_get(void);
 Eina_Bool evisum_engine_history_bounds_get(uint32_t *start_time, uint32_t *end_time);
 Eina_Bool evisum_engine_history_bounds_since_get(uint32_t since, uint32_t *start_time, uint32_t *end_time);
 Eina_Bool evisum_engine_history_contiguous_bounds_since_get(uint32_t since, uint32_t *start_time, uint32_t *end_time);
+Eina_Bool evisum_engine_history_time_available_get(uint32_t time);
 Eina_Bool evisum_engine_history_time_set(uint32_t time);
 void evisum_engine_history_live_set(void);
 Eina_Bool evisum_engine_history_live_get(void);
diff --git a/src/bin/ui/evisum_ui_process_list.c b/src/bin/ui/evisum_ui_process_list.c
index 14dd38f..92ec6cd 100644
--- a/src/bin/ui/evisum_ui_process_list.c
+++ b/src/bin/ui/evisum_ui_process_list.c
@@ -86,6 +86,8 @@ typedef struct {
         uint32_t start_time;
         uint32_t end_time;
         uint32_t requested_time;
+        uint32_t tooltip_time;
+        Eina_Bool tooltip_available;
     } history;
 
     Elm_Layout *indicator;
@@ -689,11 +691,20 @@ static void
 _evisum_ui_process_list_history_tooltip_set(Evisum_Ui_Process_List_View *view, uint32_t t) {
     char time_buf[32];
     char tip[128];
+    Eina_Bool available;
 
     if (!view->summary.history_slider) return;
 
+    if (view->history.tooltip_time == t) available = view->history.tooltip_available;
+    else {
+        available = evisum_engine_history_time_available_get(t);
+        view->history.tooltip_time = t;
+        view->history.tooltip_available = available;
+    }
+
     _evisum_ui_process_list_history_time_format(t, time_buf, sizeof(time_buf));
-    snprintf(tip, sizeof(tip), _("Process history: %s"), time_buf);
+    if (available) snprintf(tip, sizeof(tip), _("Process history: %s"), time_buf);
+    else snprintf(tip, sizeof(tip), _("Process history: %s (no snapshot)"), time_buf);
     elm_object_tooltip_text_set(view->summary.history_slider, tip);
 }
 
@@ -810,9 +821,14 @@ _evisum_ui_process_list_history_apply_timer_cb(void *data) {
     return EINA_FALSE;
 }
 
-static void
+static Eina_Bool
 _evisum_ui_process_list_history_request_deferred(Evisum_Ui_Process_List_View *view, uint32_t t) {
-    if (!view->history.lock_init) return;
+    if (!view->history.lock_init) return EINA_FALSE;
+    if (!evisum_engine_history_time_available_get(t)) {
+        _evisum_ui_process_list_history_tooltip_set(view, t);
+        _evisum_ui_process_list_history_tooltip_pinned_set(view, EINA_TRUE);
+        return EINA_FALSE;
+    }
 
     if (view->history.apply_timer) {
         ecore_timer_del(view->history.apply_timer);
@@ -829,6 +845,8 @@ _evisum_ui_process_list_history_request_deferred(Evisum_Ui_Process_List_View *vi
     /* Coalesce slider/key repeats so dragging or holding an arrow key loads the
      * final requested timestamp instead of every intermediate second. */
     view->history.apply_timer = ecore_timer_add(0.5, _evisum_ui_process_list_history_apply_timer_cb, view);
+
+    return EINA_TRUE;
 }
 
 static void
@@ -1043,8 +1061,11 @@ _evisum_ui_process_list_history_slider_mouse_move_cb(void *data, Evas *e EINA_UN
     if (!ev) return;
 
     t = _evisum_ui_process_list_history_time_at_x_get(view, ev->cur.canvas.x);
-    if (view->history.sliding) _evisum_ui_process_list_history_preview_set(view, t);
-    else _evisum_ui_process_list_history_tooltip_set(view, t);
+    if (view->history.sliding) {
+        if (evisum_engine_history_time_available_get(t)) _evisum_ui_process_list_history_preview_set(view, t);
+        else _evisum_ui_process_list_history_tooltip_set(view, t);
+    } else
+        _evisum_ui_process_list_history_tooltip_set(view, t);
 }
 
 static void
@@ -1064,20 +1085,23 @@ _evisum_ui_process_list_history_slider_mouse_down_cb(void *data, Evas *e EINA_UN
                                                      void *event_info) {
     Evisum_Ui_Process_List_View *view = data;
     Evas_Event_Mouse_Down *ev = event_info;
+    uint32_t t;
 
     if (!ev || ev->button != 1) return;
 
     if (!view->history.lock_init) return;
 
+    t = _evisum_ui_process_list_history_time_at_x_get(view, ev->canvas.x);
+    if (!evisum_engine_history_time_available_get(t)) {
+        _evisum_ui_process_list_history_tooltip_set(view, t);
+        _evisum_ui_process_list_history_tooltip_pinned_set(view, EINA_TRUE);
+        return;
+    }
+
     view->history.sliding = EINA_TRUE;
 
     /* While the mouse is down, only preview the selected time.  The actual
      * snapshot load is queued on mouse-up so dragging stays responsive. */
-    eina_lock_take(&view->history.lock);
-    view->history.live = EINA_FALSE;
-    view->history.pending = EINA_FALSE;
-    view->history.requested_time = 0;
-    eina_lock_release(&view->history.lock);
     _evisum_ui_process_list_history_tooltip_pinned_set(view, EINA_TRUE);
 
     if (view->history.apply_timer) {
@@ -1085,8 +1109,7 @@ _evisum_ui_process_list_history_slider_mouse_down_cb(void *data, Evas *e EINA_UN
         view->history.apply_timer = NULL;
     }
 
-    _evisum_ui_process_list_history_preview_set(
-        view, _evisum_ui_process_list_history_time_at_x_get(view, ev->canvas.x));
+    _evisum_ui_process_list_history_preview_set(view, t);
 }
 
 static void
@@ -1102,6 +1125,11 @@ _evisum_ui_process_list_history_slider_mouse_up_cb(void *data, Evas *e EINA_UNUS
 
     view->history.sliding = EINA_FALSE;
     t = _evisum_ui_process_list_history_time_at_x_get(view, ev->canvas.x);
+    if (!evisum_engine_history_time_available_get(t)) {
+        _evisum_ui_process_list_history_tooltip_set(view, t);
+        _evisum_ui_process_list_history_tooltip_pinned_set(view, EINA_TRUE);
+        return;
+    }
     _evisum_ui_process_list_history_preview_set(view, t);
     _evisum_ui_process_list_history_request_deferred(view, t);
 }
@@ -2131,9 +2159,14 @@ _evisum_ui_process_list_history_key_step(Evisum_Ui_Process_List_View *view, Evas
         else t++;
     }
 
+    if (!evisum_engine_history_time_available_get(t)) {
+        _evisum_ui_process_list_history_tooltip_set(view, t);
+        _evisum_ui_process_list_history_tooltip_pinned_set(view, EINA_TRUE);
+        return EINA_TRUE;
+    }
+
     _evisum_ui_process_list_history_preview_set(view, t);
-    _evisum_ui_process_list_history_request_deferred(view, t);
-    view->skip_wait = 1;
+    if (_evisum_ui_process_list_history_request_deferred(view, t)) view->skip_wait = 1;
     return EINA_TRUE;
 }
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.

Reply via email to