const Desklet = imports.ui.desklet; const Settings = imports.ui.settings; const Mainloop = imports.mainloop; const Lang = imports.lang; const Clutter = imports.gi.Clutter; const Cinnamon = imports.gi.Cinnamon; const Gio = imports.gi.Gio; const Cairo = imports.cairo; const St = imports.gi.St; const Util = imports.misc.util; const UUID = "system-monitor-graph@rcassani"; const DESKLET_PATH = imports.ui.deskletManager.deskletMeta[UUID].path; const GB_TO_KB = 1048576; // 1 GB = 1,048,576 kB function MyDesklet(metadata, desklet_id) { this._init(metadata, desklet_id); } function main(metadata, desklet_id) { return new MyDesklet(metadata, desklet_id); } MyDesklet.prototype = { __proto__: Desklet.Desklet.prototype, _init: function(metadata, desklet_id) { Desklet.Desklet.prototype._init.call(this, metadata, desklet_id); // initialize settings this.settings = new Settings.DeskletSettings(this, this.metadata["uuid"], desklet_id); this.settings.bindProperty(Settings.BindingDirection.IN, "type", "type", this.on_setting_changed); this.settings.bindProperty(Settings.BindingDirection.IN, "filesystem", "filesystem", this.on_setting_changed); this.settings.bindProperty(Settings.BindingDirection.IN, "refresh-interval", "refresh_interval", this.on_setting_changed); this.settings.bindProperty(Settings.BindingDirection.IN, "duration", "duration", this.on_setting_changed); this.settings.bindProperty(Settings.BindingDirection.IN, "background-color", "background_color", this.on_setting_changed); this.settings.bindProperty(Settings.BindingDirection.IN, "h-midlines", "h_midlines", this.on_setting_changed); this.settings.bindProperty(Settings.BindingDirection.IN, "v-midlines", "v_midlines", this.on_setting_changed); this.settings.bindProperty(Settings.BindingDirection.IN, "scale-size", "scale_size", this.on_setting_changed); this.settings.bindProperty(Settings.BindingDirection.IN, "midline-color", "midline_color", this.on_setting_changed); this.settings.bindProperty(Settings.BindingDirection.IN, "text-color", "text_color", this.on_setting_changed); this.settings.bindProperty(Settings.BindingDirection.IN, "line-color-cpu", "line_color_cpu", this.on_setting_changed); this.settings.bindProperty(Settings.BindingDirection.IN, "line-color-ram", "line_color_ram", this.on_setting_changed); this.settings.bindProperty(Settings.BindingDirection.IN, "line-color-hdd", "line_color_hdd", this.on_setting_changed); // initialize desklet GUI this.setupUI(); }, setupUI: function(){ // initialize this.canvas this.canvas = new Clutter.Actor(); this.canvas.remove_all_children(); this.text1 = new St.Label(); this.text2 = new St.Label(); this.text3 = new St.Label(); this.canvas.add_actor(this.text1); this.canvas.add_actor(this.text2); this.canvas.add_actor(this.text3); this.setContent(this.canvas); // flag to indicate the first loop of the Desklet this.first_run = true; // update loop for Desklet this.update(); }, update: function() { // monitors a given variable and plot its graph this.update_draw(); // call this.update() every in refresh_interval seconds this.timeout = Mainloop.timeout_add_seconds(this.refresh_interval, Lang.bind(this, this.update)); }, update_draw: function() { // values needed in first run if (this.first_run){ this.n_values = Math.floor(this.duration / this.refresh_interval) + 1; this.values = new Array(this.n_values).fill(0.0); this.cpu_cpu_tot = 0; this.cpu_cpu_idl = 0; this.hdd_cpu_tot = 0; this.hdd_hdd_tot = 0; // set colors switch (this.type) { case "cpu": this.line_color = this.line_color_cpu; break; case "ram": this.line_color = this.line_color_ram; break; case "hdd": this.line_color = this.line_color_hdd; } this.first_run = false; } // Desklet proportions let unit_size = 15 * this.scale_size; // pixels var line_width = unit_size / 15; var margin_up = 3 * unit_size; var graph_w = 20 * unit_size; var graph_h = 4 * unit_size; let desklet_w = graph_w + (2 * unit_size); let desklet_h = graph_h + (4 * unit_size); var h_midlines = this.h_midlines; var v_midlines = this.v_midlines; let text1_size = 4 * unit_size / 3; let text2_size = 4 * unit_size / 3; let text3_size = 3 * unit_size / 3; var radius = 2 * unit_size / 3;; var degrees = Math.PI / 180.0; let n_values = this.n_values; let values = this.values; let graph_step = graph_w / (n_values -1); var value = 0.0; var text1 = ''; var text2 = ''; var text3 = ''; var line_colors = this.parse_rgba_seetings(this.line_color); // current values switch (this.type) { case "cpu": let cpu_use = this.get_cpu_use(); value = cpu_use / 100; text1 = "CPU"; text2 = Math.round(cpu_use).toString() + "%"; break; case "ram": let ram_values = this.get_ram_values(); let ram_use = 100 * ram_values[1] / ram_values[0]; value = ram_use / 100; text1 = "RAM"; text2 = Math.round(ram_use).toString() + "%" text3 = ram_values[1].toFixed(1) + " / " + ram_values[0].toFixed(1) + " GB"; break; case "hdd": let dir_path = decodeURIComponent(this.filesystem.replace("file://", "").trim()); if(dir_path == null || dir_path == "") dir_path = "/"; let hdd_values = this.get_hdd_values(dir_path); let hdd_use = Math.min(hdd_values[1], 100); //already in % value = hdd_use / 100; text1 = hdd_values[0]; text2 = Math.round(hdd_use).toString() + "%" text3 = hdd_values[3].toFixed(0) + " GB free of " + hdd_values[2].toFixed(0) + " GB"; break; } // concatenate new value values.push(value); values.shift(); this.values = values; var background_colors = this.parse_rgba_seetings(this.background_color); var midline_colors = this.parse_rgba_seetings(this.midline_color); // draws graph let canvas = new Clutter.Canvas(); canvas.set_size(desklet_w, desklet_h); canvas.connect('draw', function (canvas, ctx, desklet_w, desklet_h) { ctx.save(); ctx.setOperator(Cairo.Operator.CLEAR); ctx.paint(); ctx.restore(); ctx.setOperator(Cairo.Operator.OVER); ctx.setLineWidth(2 * line_width); // desklet background ctx.setSourceRGBA(background_colors[0], background_colors[1], background_colors[2], background_colors[3]); ctx.newSubPath(); ctx.arc(desklet_w - radius, radius, radius, -90 * degrees, 0 * degrees); ctx.arc(desklet_w - radius, desklet_h - radius, radius, 0 * degrees, 90 * degrees); ctx.arc(radius, desklet_h - radius, radius, 90 * degrees, 180 * degrees); ctx.arc(radius, radius, radius, 180 * degrees, 270 * degrees); ctx.closePath(); ctx.fill(); // graph border ctx.setSourceRGBA(line_colors[0], line_colors[1], line_colors[2], 1); ctx.rectangle(unit_size, margin_up, graph_w, graph_h); ctx.stroke(); // graph V and H midlines ctx.setSourceRGBA(midline_colors[0], midline_colors[1], midline_colors[2], 1); ctx.setLineWidth(line_width); for (let i = 1; i 3) a = colors[3]; return [r, g, b, a]; } };