davemds pushed a commit to branch master. http://git.enlightenment.org/enlightenment/modules/edgar.git/commit/?id=7cdd484427f44dd43239a4fd1e47c27ef53b37bc
commit 7cdd484427f44dd43239a4fd1e47c27ef53b37bc Author: Dave Andreoli <d...@gurumeditation.it> Date: Sun Sep 13 16:23:14 2015 +0200 Cpu gadget: add a popup with the list of running processes --- GADGETS/cpu/__init__.py | 98 +++++++++++++++++++++++++++++++++++++++++++++---- GADGETS/cpu/cpu.edc | 11 +----- 2 files changed, 92 insertions(+), 17 deletions(-) diff --git a/GADGETS/cpu/__init__.py b/GADGETS/cpu/__init__.py index 53d0f7c..2cc6ca3 100644 --- a/GADGETS/cpu/__init__.py +++ b/GADGETS/cpu/__init__.py @@ -1,5 +1,6 @@ # This python file use the following encoding: utf-8 +from operator import itemgetter import psutil import e @@ -8,6 +9,8 @@ from efl import ecore from efl import evas from efl import edje from efl.evas import EXPAND_BOTH, FILL_BOTH +from efl.elementary import Box, Label, Entry, Icon, Genlist, GenlistItemClass, \ + ELM_OBJECT_SELECT_MODE_NONE, ELM_LIST_COMPRESS __gadget_name__ = 'CPU Monitor' @@ -19,7 +22,6 @@ __gadget_vapi__ = 1 __gadget_opts__ = { 'popup_on_desktop': False } - class Gadget(e.Gadget): def __init__(self): @@ -27,7 +29,11 @@ class Gadget(e.Gadget): self.num_cores = len(psutil.cpu_percent(interval=0, percpu=True)) self.aspect = None - self.poller = None + self.main_poller = None + self.popups_poller = None + self.popups_itc = GenlistItemClass(item_style='default', + text_get_func=self.gl_text_get, + content_get_func=self.gl_content_get) def instance_created(self, obj, site): super().instance_created(obj, site) @@ -48,17 +54,17 @@ class Gadget(e.Gadget): obj.size_hint_aspect = (evas.EVAS_ASPECT_CONTROL_BOTH, self.aspect[0] * self.num_cores, self.aspect[1]) - if self.poller is None: - self.poller = ecore.Poller(8, self.poller_cb, ecore.ECORE_POLLER_CORE) + if self.main_poller is None: + self.main_poller = ecore.Poller(8, self.main_poller_cb) def instance_destroyed(self, obj): super().instance_destroyed(obj) - if len(self._instances) < 1 and self.poller is not None: - self.poller.delete() - self.poller = None + if len(self._instances) < 1 and self.main_poller is not None: + self.main_poller.delete() + self.main_poller = None - def poller_cb(self): + def main_poller_cb(self): percents = psutil.cpu_percent(interval=0, percpu=True) for obj in self._instances: @@ -66,3 +72,79 @@ class Gadget(e.Gadget): bar.message_send(0, percents[i]) return ecore.ECORE_CALLBACK_RENEW + + def popup_created(self, popup): + super().popup_created(popup) + + box = Box(popup) + popup.part_swallow('main.swallow', box) + box.show() + + en = Entry(popup, single_line=True, editable=False) + en.text_style_user_push("DEFAULT='font_weight=Bold'") + box.pack_end(en) + en.show() + popup.data['head'] = en + + li = Genlist(popup, homogeneous=True, mode=ELM_LIST_COMPRESS, + select_mode=ELM_OBJECT_SELECT_MODE_NONE, + size_hint_expand=EXPAND_BOTH, size_hint_fill=FILL_BOTH) + box.pack_end(li) + li.show() + popup.data['list'] = li + + self.popups_poller_cb() + if self.popups_poller is None: + self.popups_poller = ecore.Poller(16, self.popups_poller_cb) + + def popup_destroyed(self, popup): + super().popup_destroyed(popup) + + if len(self._popups) < 1 and self.popups_poller is not None: + self.popups_poller.delete() + self.popups_poller = None + + def popups_poller_cb(self): + # build an orderd list of all running procs (pid, name, cpu_perc, mun_t) + self.top_procs = [ (p.pid, p.name(), + p.cpu_percent(interval=0) / self.num_cores, + p.num_threads()) + for p in psutil.process_iter() ] + self.top_procs.sort(key=itemgetter(2), reverse=True) + + # update all the visible genlists + for popup in self._popups: + li = popup.data['list'] + + # adjust the size (items count) of the genlist + items_count = li.items_count() + procs_count = len(self.top_procs) + if procs_count > items_count: + for idx in range(items_count, procs_count): + li.item_append(self.popups_itc, idx) + elif procs_count < items_count: + for idx in range(procs_count, items_count): + li.last_item.delete() + + # update visible list items and the header text + li.realized_items_update() + popup.data['head'].text = '{} Running processes'.format(procs_count) + + return ecore.ECORE_CALLBACK_RENEW + + def gl_text_get(self, gl, part, idx): + pid, name, cpu, num_t = self.top_procs[idx] + if num_t > 1: + return '[{}] {} ({} threads)'.format(pid, name, num_t) + else: + return '[{}] {}'.format(pid, name) + + def gl_content_get(self, gl, part, idx): + pid, name, cpu, num_t = self.top_procs[idx] + if part == 'elm.swallow.end': + return Label(gl, text='{0:.1f} %'.format(cpu)) + if part == 'elm.swallow.icon': + try: + return Icon(gl, standard=name) + except RuntimeWarning: # icon not found + return None diff --git a/GADGETS/cpu/cpu.edc b/GADGETS/cpu/cpu.edc index 6867cc4..ecc3f0e 100644 --- a/GADGETS/cpu/cpu.edc +++ b/GADGETS/cpu/cpu.edc @@ -149,20 +149,13 @@ collections { /** * API [e/gadget/popup] This is the group that will be placed inside popups */ -/* group { name: "e/gadgets/cpu/popup"; - min: 310 0; + min: 300 300; parts { - box { "popup.box"; + swallow { "main.swallow"; desc { "default"; - box { - layout: "vertical"; - padding: 0 6; - min: 1 1; - } } } } } -*/ } --