File: file-monitor-glib.c

package info (click to toggle)
zathura 0.4.7-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 1,616 kB
  • sloc: ansic: 13,668; python: 49; xml: 48; perl: 41; makefile: 8
file content (107 lines) | stat: -rw-r--r-- 2,819 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/* SPDX-License-Identifier: Zlib */

#include "file-monitor-glib.h"
#include "macros.h"

#include <girara/utils.h>
#include <gio/gio.h>

struct zathura_glibfilemonitor_s
{
  ZathuraFileMonitor parent;
  GFileMonitor*      monitor; /**< File monitor */
  GFile*             file;    /**< File for file monitor */
};

G_DEFINE_TYPE(ZathuraGLibFileMonitor, zathura_glibfilemonitor,
              ZATHURA_TYPE_FILEMONITOR)

static void
file_changed(GFileMonitor* UNUSED(monitor), GFile* file,
             GFile* UNUSED(other_file), GFileMonitorEvent event,
             ZathuraGLibFileMonitor* file_monitor)
{
  switch (event) {
    case G_FILE_MONITOR_EVENT_CHANGES_DONE_HINT:
    case G_FILE_MONITOR_EVENT_CREATED: {
      char* uri = g_file_get_uri(file);
      girara_debug("received file-monitor event for %s", uri);
      g_free(uri);

      g_signal_emit_by_name(file_monitor, "reload-file");
      break;
    }
    default:
      return;
  }
}

static void
start(ZathuraFileMonitor* file_monitor)
{
  ZathuraGLibFileMonitor* glib_file_monitor =
    ZATHURA_GLIBFILEMONITOR(file_monitor);

  const char* file_path =
    zathura_filemonitor_get_filepath(file_monitor);

  /* install file monitor */
  glib_file_monitor->file = g_file_new_for_path(file_path);
  if (glib_file_monitor->file == NULL) {
    return;
  }

  glib_file_monitor->monitor = g_file_monitor_file(
    glib_file_monitor->file, G_FILE_MONITOR_NONE, NULL, NULL);
  if (glib_file_monitor->monitor != NULL) {
    g_signal_connect_object(G_OBJECT(glib_file_monitor->monitor), "changed",
                            G_CALLBACK(file_changed), glib_file_monitor, 0);
  }
}

static void
stop(ZathuraFileMonitor* file_monitor)
{
  ZathuraGLibFileMonitor* glib_file_monitor =
    ZATHURA_GLIBFILEMONITOR(file_monitor);

  if (glib_file_monitor->monitor != NULL) {
    g_file_monitor_cancel(glib_file_monitor->monitor);
  }

  g_clear_object(&glib_file_monitor->monitor);
  g_clear_object(&glib_file_monitor->file);
}

static void
dispose(GObject* object)
{
  stop(ZATHURA_FILEMONITOR(object));

  G_OBJECT_CLASS(zathura_glibfilemonitor_parent_class)->dispose(object);
}

static void
finalize(GObject* object)
{
  G_OBJECT_CLASS(zathura_glibfilemonitor_parent_class)->finalize(object);
}

static void
zathura_glibfilemonitor_class_init(ZathuraGLibFileMonitorClass* class)
{
  ZathuraFileMonitorClass* filemonitor_class = ZATHURA_FILEMONITOR_CLASS(class);
  filemonitor_class->start                   = start;
  filemonitor_class->stop                    = stop;

  GObjectClass* object_class = G_OBJECT_CLASS(class);
  object_class->dispose      = dispose;
  object_class->finalize     = finalize;
}

static void
zathura_glibfilemonitor_init(ZathuraGLibFileMonitor* glibfilemonitor)
{
  glibfilemonitor->monitor = NULL;
  glibfilemonitor->file    = NULL;
}