From a95b8a5871e4723224313531f5422dd88f7766ff Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Sun, 19 Feb 2006 18:23:14 +0000 Subject: [PATCH] Added Net Module. -Seperating monitor module into seperate modules. -Net Module still needs some work... -TODO: Add graphing. SVN revision: 20587 --- .cvsignore | 23 +++ AUTHORS | 2 + COPYING | 28 +++ COPYING-PLAIN | 33 ++++ ChangeLog | 0 INSTALL | 11 ++ Makefile.am | 39 ++++ NEWS | 0 README | 0 VeraMono.ttf | Bin 0 -> 49204 bytes autogen.sh | 16 ++ bg.png | Bin 0 -> 251 bytes configure.in | 200 +++++++++++++++++++ e_mod_config.c | 184 ++++++++++++++++++ e_mod_config.h | 11 ++ e_mod_main.c | 506 ++++++++++++++++++++++++++++++++++++++++++++++++ e_mod_main.h | 58 ++++++ module_icon.png | Bin 0 -> 3765 bytes net.edc | 144 ++++++++++++++ over.png | Bin 0 -> 930 bytes over_res.png | Bin 0 -> 234 bytes 21 files changed, 1255 insertions(+) create mode 100644 .cvsignore create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 COPYING-PLAIN create mode 100644 ChangeLog create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100644 VeraMono.ttf create mode 100755 autogen.sh create mode 100644 bg.png create mode 100644 configure.in create mode 100644 e_mod_config.c create mode 100644 e_mod_config.h create mode 100644 e_mod_main.c create mode 100644 e_mod_main.h create mode 100644 module_icon.png create mode 100644 net.edc create mode 100644 over.png create mode 100644 over_res.png diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 0000000..4a29f0d --- /dev/null +++ b/.cvsignore @@ -0,0 +1,23 @@ +.deps +.libs +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.guess +config.h +config.h.in +config.log +config.status +config.sub +configure +depcomp +install-sh +libtool +missing +ltmain.sh +stamp-h1 +*.lo +*.la +*.spec +*.tar.gz diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..8d4affa --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Originally by Matthew Mullins. +Recoded into seperate modules by Christopher 'devilhorns' Michael diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..73dfe06 --- /dev/null +++ b/COPYING @@ -0,0 +1,28 @@ +Copyright (C) 2000 Christopher Michael and various contributors (see AUTHORS) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies of the Software and its Copyright notices. In addition publicly +documented acknowledgment must be given that this software has been used if no +source code of this software is made available publicly. This includes +acknowledgments in either Copyright notices, Manuals, Publicity and Marketing +documents or any documentation provided with any product containing this +software. This License does not apply to any software that links to the +libraries provided by this software (statically or dynamically), but only to +the software provided. + +Please see the COPYING.PLAIN for a plain-english explanation of this notice +and it's intent. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/COPYING-PLAIN b/COPYING-PLAIN new file mode 100644 index 0000000..b8e40d7 --- /dev/null +++ b/COPYING-PLAIN @@ -0,0 +1,33 @@ +Plain English Copyright Notice + +This file is not intended to be the actual License. The reason this file +exists is that we here are programmers and engineers. We aren't lawyers. We +provide licenses that we THINK say the right things, but we have our own +intentions at heart. This is a plain-english explanation of what those +intentions are, and if you follow them you will be within the "spirit" of +the license. + +The intent is for us to enjoy writing software that is useful to us (the +AUTHORS) and allow others to use it freely and also benefit from the work we +put into making it. We don't want to restrict others using it. They should +not *HAVE* to make the source code of the applications they write that +simply link to these libraries (be that statically or dynamically), or for +them to be limited as to what license they choose to use (be it open, closed +or anything else). But we would like to know you are using these libraries. +We simply would like to know that it has been useful to someone. This is why +we ask for acknowledgement of some sort. + +You can do what you want with the source of this software - it doesn't +matter. We still have it here for ourselves and it is open and free to use +and download and play with. It can't be taken away. We don't really mind what +you do with the source to your software. We would simply like to know that +you are using it - especially if it makes it to a commerical product. If you +simply e-mail all the AUTHORS (see COPYING and AUTHORS files) telling us, and +then make sure you include a paragraph or page in the manual for the product +with the copyright notice and state that you used this software, we will be +very happy. If you want to contribute back modifications and fixes you may have +made we will welcome those too with open arms (generally). If you want help +with changes needed, ports needed or features to be added, arrangements can +be easily made with some dialogue. + +Christopher Michael diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..e69de29 diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..8919fc2 --- /dev/null +++ b/INSTALL @@ -0,0 +1,11 @@ +COMPILING and INSTALLING: + +If you got a official release tar archive do: + ./autogen.sh + +Then to compile: + make + +To install: + make install + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..6bd4506 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,39 @@ +MAINTAINERCLEANFILES = Makefile.in + +EDJE_CC = @edje_cc@ +EDJE_FLAGS = -v + +# data files for the module +filesdir = $(datadir) + +files_DATA = \ +module_icon.png \ +net.edj \ +net.edc \ +VeraMono.ttf + +# the module .so file +INCLUDES = -I. \ + -I$(top_srcdir) \ + -I$(includedir) \ + @e_cflags@ + +pkgdir = $(datadir)/$(MODULE_ARCH) +pkg_LTLIBRARIES = module.la +module_la_SOURCES = e_mod_main.c \ + e_mod_main.h \ + e_mod_config.c \ + e_mod_config.h + +module_la_LIBADD = @e_libs@ -lm +module_la_LDFLAGS = -module -avoid-version +module_la_DEPENDENCIES = $(top_builddir)/config.h + +net.edj: Makefile net.edc + $(EDJE_CC) $(EDJE_FLAGS) \ + net.edc \ + net.edj + +clean-local: + rm -rf *.edj *~ + diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/README b/README new file mode 100644 index 0000000..e69de29 diff --git a/VeraMono.ttf b/VeraMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..236056c49e937c730a27f0aae898d56b657e8d6e GIT binary patch literal 49204 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 z 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 literal 0 HcmV?d00001 diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..0846992 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,16 @@ +#!/bin/sh + +rm -rf autom4te.cache +rm -f aclocal.m4 ltmain.sh + +touch README + +echo "Running aclocal..." ; aclocal $ACLOCAL_FLAGS || exit 1 +echo "Running autoheader..." ; autoheader || exit 1 +echo "Running autoconf..." ; autoconf || exit 1 +echo "Running libtoolize..." ; (libtoolize --copy --automake || glibtoolize --automake) || exit 1 +echo "Running automake..." ; automake --add-missing --copy --gnu || exit 1 + +if [ -z "$NOCONFIGURE" ]; then + ./configure "$@" +fi diff --git a/bg.png b/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b5763c3d5e2ff34e7eb6ce84ad6526d5a5bfc075 GIT binary patch literal 251 zcmeAS@N?&q;$mQ6;PUiv2?Ej%Ky1Ll1|%1H*T@4Ywj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwWnTLbXT<3}UBA}3LiEBiObAE1aYF-J0b5UwyNotBh zd1gt5LP$ocg1e`0!21-{JfOk^PZ!6KjC*fyZRBE5;Ba*;{6BX;cgCBCah}IjOV+4n z7L`h?d7e&P{fhfS=}+-P^Xiy@nuq}}?*1^h^xSOC=)&U{P}jN +#include "e_mod_main.h" +#include "e_mod_config.h" +#include "config.h" + +struct _E_Config_Dialog_Data +{ + char *device; + int check_interval; + + Ecore_List *devs; + int dev_num; +}; + +/* Protos */ +static void *_create_data (E_Config_Dialog *cfd); +static void _free_data (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static Evas_Object *_basic_create_widgets (E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); +static int _basic_apply_data (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static void _fill_data (Net *n, E_Config_Dialog_Data *cfdata); +static void _net_config_get_devices (Ecore_List *devs); + +/* Config Calls */ +void +_configure_net_module(E_Container *con, Net *n) +{ + E_Config_Dialog *cfd; + E_Config_Dialog_View *v; + + v = E_NEW(E_Config_Dialog_View, 1); + + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.apply_cfdata = _basic_apply_data; + v->basic.create_widgets = _basic_create_widgets; + v->override_auto_apply = 1; + + cfd = e_config_dialog_new(con, _("Net Configuration"), NULL, 0, v, n); + n->cfd = cfd; +} + +static void +_fill_data(Net *n, E_Config_Dialog_Data *cfdata) +{ + char *tmp; + int i; + + cfdata->check_interval = n->conf->check_interval; + + if (n->conf->device != NULL) + cfdata->device = strdup(n->conf->device); + else + cfdata->device = NULL; + + if (!cfdata->device) + return; + + cfdata->devs = ecore_list_new(); + _net_config_get_devices(cfdata->devs); + + if (!cfdata->devs) + return; + + i = 0; + ecore_list_goto_first(cfdata->devs); + while ((tmp = ecore_list_next(cfdata->devs)) != NULL) + { + if (!strcmp(cfdata->device, tmp)) + { + cfdata->dev_num = i; + break; + } + i++; + } +} + +static void * +_create_data(E_Config_Dialog *cfd) +{ + E_Config_Dialog_Data *cfdata; + Net *n; + + n = cfd->data; + cfdata = E_NEW(E_Config_Dialog_Data, 1); + _fill_data(n, cfdata); + return cfdata; +} + +static void +_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + Net *n; + + n = cfd->data; + n->cfd = NULL; + free(cfdata); +} + +static Evas_Object * +_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + Evas_Object *o, *of, *ob, *ot; + E_Radio_Group *rg; + Net *n; + char *tmp; + int i; + + n = cfd->data; + + o = e_widget_list_add(evas, 0, 0); + of = e_widget_framelist_add(evas, _("Device Settings"), 0); + ot = e_widget_table_add(evas, 0); + rg = e_widget_radio_group_new(&(cfdata->dev_num)); + + i = 0; + ecore_list_goto_first(cfdata->devs); + while ((tmp = ecore_list_next(cfdata->devs)) != NULL) + { + ob = e_widget_radio_add(evas, tmp, i, rg); + e_widget_table_object_append (ot, ob, 0, i, 1, 1, 1, 0, 1, 0); + i++; + } + i++; + ob = e_widget_label_add(evas, _("Check Interval:")); + e_widget_table_object_append(ot, ob, 0, i, 1, 1, 0, 0, 1, 0); + i++; + ob = e_widget_slider_add(evas, 1, 0, _("%1.0f seconds"), 1, 60, 1, 0, NULL, &(cfdata->check_interval), 150); + e_widget_table_object_append(ot, ob, 0, i, 1, 1, 1, 0, 1, 0); + e_widget_framelist_object_append(of, ot); + e_widget_list_object_append(o, of, 1, 1, 0.5); + + return o; +} + +static int +_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + char *tmp; + Net *n; + + n = cfd->data; + //e_border_button_bindings_ungrab_all(); + tmp = ecore_list_goto_index(cfdata->devs, cfdata->dev_num); + if (tmp != NULL) + n->conf->device = (char *)evas_stringshare_add(strdup(tmp)); + n->conf->check_interval = cfdata->check_interval; + e_config_save_queue (); + //e_border_button_bindings_grab_all (); + + if (n->face->monitor) + ecore_timer_interval_set(n->face->monitor, (double)cfdata->check_interval); + + return 1; +} + +static void +_net_config_get_devices(Ecore_List *devs) +{ + FILE *stat; + char dev[64]; + char buf[256]; + unsigned long dummy; + + stat = fopen("/proc/net/dev", "r"); + if (!stat) + return; + + while (fgets(buf, 256, stat)) + { + int i = 0; + for (; buf[i] != 0; i++) + { + if (buf[i] == ':') + buf[i] = ' '; + } + if (sscanf(buf, "%s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu " + "%lu %lu %lu %lu\n", dev, &dummy, &dummy, &dummy, + &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, &dummy, + &dummy, &dummy, &dummy, &dummy, &dummy, &dummy) < 16) + continue; + ecore_list_append(devs, strdup(dev)); + } + fclose(stat); +} diff --git a/e_mod_config.h b/e_mod_config.h new file mode 100644 index 0000000..e5e0392 --- /dev/null +++ b/e_mod_config.h @@ -0,0 +1,11 @@ +#ifdef E_TYPEDEFS +#else +#ifndef E_MOD_CONFIG_H +#define E_MOD_CONFIG_H + +#include "e_mod_main.h" + +void _configure_net_module(E_Container *con, Net *n); + +#endif +#endif diff --git a/e_mod_main.c b/e_mod_main.c new file mode 100644 index 0000000..3ec1eee --- /dev/null +++ b/e_mod_main.c @@ -0,0 +1,506 @@ +#include +#include "e_mod_main.h" +#include "e_mod_config.h" +#include "config.h" + +static Net *_net_init(E_Module *m); +static void _net_shutdown(Net *n); +static void _net_config_menu_new(Net *n); + +static int _net_face_init(Net_Face *nf); +static void _net_face_menu_new(Net_Face *nf); +static void _net_face_enable(Net_Face *nf); +static void _net_face_disable(Net_Face *nf); +static void _net_face_free(Net_Face *nf); +static void _net_face_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change); +static void _net_face_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info); +static void _net_face_cb_menu_edit(void *data, E_Menu *mn, E_Menu_Item *mi); +static void _net_face_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi); + +static int _net_face_update_values(void *data); +static void _net_face_graph_values(Net_Face *nf, int in, int out); + +static int net_count; + +EAPI E_Module_Api e_modapi = +{ + E_MODULE_API_VERSION, + "Net" +}; + +EAPI void * +e_modapi_init(E_Module *m) +{ + Net *n; + + n = _net_init(m); + if (!n) + return NULL; + + m->config_menu = n->config_menu; + return n; +} + +EAPI int +e_modapi_shutdown(E_Module *m) +{ + Net *n; + + n = m->data; + if (!n) + return 0; + + if (m->config_menu) + { + e_menu_deactivate(m->config_menu); + e_object_del(E_OBJECT(m->config_menu)); + m->config_menu = NULL; + } + if (n->cfd) + { + e_object_del(E_OBJECT(n->cfd)); + n->cfd = NULL; + } + _net_shutdown(n); + return 1; +} + +EAPI int +e_modapi_save(E_Module *m) +{ + Net *n; + + n = m->data; + if (!n) + return 0; + e_config_domain_save("module.net", n->conf_edd, n->conf); + return 1; +} + +EAPI int +e_modapi_info(E_Module *m) +{ + m->icon_file = strdup(PACKAGE_DATA_DIR"/module_icon.png"); + return 1; +} + +EAPI int +e_modapi_about(E_Module *m) +{ + e_module_dialog_show(_("Enlightenment Network Monitor Module"), + _("This module is used to monitor a network device.")); + return 1; +} + +EAPI int +e_modapi_config(E_Module *m) +{ + Net *n; + E_Container *con; + + n = m->data; + if (!n) + return 0; + if (!n->face) + return 0; + + con = e_container_current_get(e_manager_current_get()); + if (n->face->con == con) + _configure_net_module(con, n); + + return 1; +} + +static Net * +_net_init(E_Module *m) +{ + Net *n; + E_Menu_Item *mi; + Evas_List *mans, *l, *l2; + + n = E_NEW(Net, 1); + if (!n) + return NULL; + + n->conf_edd = E_CONFIG_DD_NEW("Net_Config", Config); + #undef T + #undef D + #define T Config + #define D n->conf_edd + E_CONFIG_VAL(D, T, device, STR); + E_CONFIG_VAL(D, T, check_interval, INT); + + n->conf = e_config_domain_load("module.net", n->conf_edd); + if (!n->conf) + { + n->conf = E_NEW(Config, 1); + n->conf->device = (char *)evas_stringshare_add("eth0"); + n->conf->check_interval = 30; + } + E_CONFIG_LIMIT(n->conf->check_interval, 0, 60); + + _net_config_menu_new(n); + + mans = e_manager_list(); + for (l = mans; l; l = l->next) + { + E_Manager *man; + + man = l->data; + for (l2 = man->containers; l2; l2 = l2->next) + { + E_Container *con; + Net_Face *nf; + + con = l2->data; + nf = E_NEW(Net_Face, 1); + if (nf) + { + nf->conf_face_edd = E_CONFIG_DD_NEW("Net_Face_Config", Config_Face); + #undef T + #undef D + #define T Config_Face + #define D nf->conf_face_edd + E_CONFIG_VAL(D, T, enabled, UCHAR); + + n->face = nf; + nf->net = n; + nf->con = con; + nf->evas = con->bg_evas; + + nf->conf = E_NEW(Config_Face, 1); + nf->conf->enabled = 1; + + if (!_net_face_init(nf)) + return NULL; + + _net_face_menu_new(nf); + + mi = e_menu_item_new(n->config_menu); + e_menu_item_label_set(mi, _("Configuration")); + e_menu_item_callback_set(mi, _net_face_cb_menu_configure, nf); + + mi = e_menu_item_new(n->config_menu); + e_menu_item_label_set(mi, con->name); + e_menu_item_submenu_set(mi, nf->menu); + + if (!nf->conf->enabled) + _net_face_disable(nf); + else + _net_face_enable(nf); + } + } + } + return n; +} + +static void +_net_shutdown(Net *n) +{ + _net_face_free(n->face); + + if (n->conf->device) + evas_stringshare_del(n->conf->device); + + E_FREE(n->conf); + E_CONFIG_DD_FREE(n->conf_edd); + E_FREE(n); +} + +static void +_net_config_menu_new(Net *n) +{ + E_Menu *mn; + + mn = e_menu_new(); + n->config_menu = mn; +} + +static int +_net_face_init(Net_Face *nf) +{ + Evas_Object *o; + char buf[4096]; + + evas_event_freeze(nf->evas); + + o = edje_object_add(nf->evas); + nf->net_obj = o; + + if (!e_theme_edje_object_set(o, "base/theme/modules/net", + "modules/net/main")) + { + snprintf(buf, sizeof(buf), PACKAGE_DATA_DIR"/net.edj"); + edje_object_file_set(o, buf, "modules/net/main"); + } + + evas_object_show(o); + + /* + o = evas_object_rectangle_add(nf->evas); + nf->chart_obj = o; + evas_object_layer_set(o, 2); + evas_object_repeat_events_set(o, 0); + evas_object_color_set(o, 0, 0, 0, 255); + evas_object_show(o); + */ + + o = evas_object_rectangle_add(nf->evas); + nf->event_obj = o; + evas_object_layer_set(o, 2); + evas_object_repeat_events_set(o, 1); + evas_object_color_set(o, 0, 0, 0, 0); + evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, + _net_face_cb_mouse_down, nf); + evas_object_show(o); + + nf->gmc = e_gadman_client_new(nf->con->gadman); + e_gadman_client_domain_set(nf->gmc, "module.net", net_count++); + e_gadman_client_policy_set(nf->gmc, + E_GADMAN_POLICY_ANYWHERE | + E_GADMAN_POLICY_HMOVE | + E_GADMAN_POLICY_HSIZE | + E_GADMAN_POLICY_VMOVE | + E_GADMAN_POLICY_VSIZE); + e_gadman_client_min_size_set(nf->gmc, 4, 4); + e_gadman_client_max_size_set(nf->gmc, 128, 128); + e_gadman_client_auto_size_set(nf->gmc, 40, 40); + e_gadman_client_align_set(nf->gmc, 1.0, 1.0); + e_gadman_client_aspect_set(nf->gmc, 1.0, 1.0); + e_gadman_client_resize(nf->gmc, 40, 40); + e_gadman_client_change_func_set(nf->gmc, _net_face_cb_gmc_change, nf); + e_gadman_client_load(nf->gmc); + evas_event_thaw(nf->evas); + + nf->monitor = ecore_timer_add((double)nf->net->conf->check_interval, _net_face_update_values, nf); + return 1; +} + +static void +_net_face_menu_new(Net_Face *nf) +{ + E_Menu *mn; + E_Menu_Item *mi; + + mn = e_menu_new(); + nf->menu = mn; + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Configuration")); + e_menu_item_callback_set(mi, _net_face_cb_menu_configure, nf); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Edit Mode")); + e_menu_item_callback_set(mi, _net_face_cb_menu_edit, nf); +} + +static void +_net_face_enable(Net_Face *nf) +{ + nf->conf->enabled = 1; + e_config_save_queue(); + evas_object_show(nf->net_obj); + /* evas_object_show(nf->chart_obj); */ + evas_object_show(nf->event_obj); +} + +static void +_net_face_disable(Net_Face *nf) +{ + nf->conf->enabled = 0; + e_config_save_queue(); + evas_object_hide(nf->event_obj); + /* evas_object_hide(nf->chart_obj); */ + evas_object_hide(nf->net_obj); +} + +static void +_net_face_free(Net_Face *nf) +{ + if (nf->monitor) + ecore_timer_del(nf->monitor); + if (nf->menu) + e_object_del(E_OBJECT(nf->menu)); + if (nf->event_obj) + evas_object_del(nf->event_obj); + if (nf->net_obj) + evas_object_del(nf->net_obj); + + /* + if (nf->chart_obj) + evas_object_del(nf->chart_obj); + */ + + if (nf->gmc) + { + e_gadman_client_save(nf->gmc); + e_object_del(E_OBJECT(nf->gmc)); + } + + E_FREE(nf->conf); + E_FREE(nf); + net_count--; +} + +static void +_net_face_cb_gmc_change(void *data, E_Gadman_Client *gmc, E_Gadman_Change change) +{ + Net_Face *nf; + Evas_Coord x, y, w, h; + + nf = data; + switch (change) + { + case E_GADMAN_CHANGE_MOVE_RESIZE: + e_gadman_client_geometry_get(nf->gmc, &x, &y, &w, &h); + evas_object_move(nf->net_obj, x, y); + /* evas_object_move(nf->chart_obj, x, y); */ + evas_object_move(nf->event_obj, x, y); + evas_object_resize(nf->net_obj, w, h); + /* evas_object_resize(nf->chart_obj, w, h); */ + evas_object_resize(nf->event_obj, w, h); + break; + case E_GADMAN_CHANGE_RAISE: + evas_object_raise(nf->net_obj); + /* evas_object_raise(nf->chart_obj); */ + evas_object_raise(nf->event_obj); + break; + default: + break; + } +} + +static void +_net_face_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info) +{ + Net_Face *nf; + Evas_Event_Mouse_Down *ev; + + ev = event_info; + nf = data; + if (ev->button == 3) + { + e_menu_activate_mouse(nf->menu, e_zone_current_get(nf->con), + ev->output.x, ev->output.y, 1, 1, + E_MENU_POP_DIRECTION_DOWN, ev->timestamp); + e_util_container_fake_mouse_up_all_later(nf->con); + } +} + +static void +_net_face_cb_menu_edit(void *data, E_Menu *mn, E_Menu_Item *mi) +{ + Net_Face *nf; + + nf = data; + e_gadman_mode_set(nf->gmc->gadman, E_GADMAN_MODE_EDIT); +} + +static void +_net_face_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi) +{ + Net_Face *nf; + + nf = data; + _configure_net_module(nf->con, nf->net); +} + +static int +_net_face_update_values(void *data) +{ + Net_Face *nf; + FILE *stat; + char dev[64]; + char buf[256]; + unsigned long in, out, dummy; + static unsigned long old_in, old_out; + int found; + + nf = data; + + stat = fopen("/proc/net/dev", "r"); + if (!stat) + return 1; + + found = 0; + while (fgets(buf, 256, stat)) + { + int i = 0; + for (; buf[i] != 0; i++) + { + if (buf[i] == ':') + buf[i] = ' '; + } + if (sscanf(buf, "%s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu " + "%lu %lu %lu %lu\n", dev, &in, &dummy, &dummy, + &dummy, &dummy, &dummy, &dummy, &dummy, &out, &dummy, + &dummy, &dummy, &dummy, &dummy, &dummy, &dummy) < 17) + continue; + if (!strcmp(dev, strdup(nf->net->conf->device))) + { + found = 1; + break; + } + } + fclose(stat); + + if (!found) + return 1; + + if (in != old_in) + old_in = in; + else + in = 0; + + if (out != old_out) + old_out = out; + else + out = 0; + + /* Graph values */ + /* _net_face_graph_values(nf, in, out); */ + + /* Update the modules text */ + Edje_Message_Int_Set *msg; + + msg = malloc(sizeof(Edje_Message_Int_Set) + 1 * sizeof(int)); + msg->count = 2; + msg->val[0] = in; + msg->val[1] = out; + edje_object_message_send(nf->net_obj, EDJE_MESSAGE_INT_SET, 1, msg); + free(msg); + + return 1; +} + +static void +_net_face_graph_values(Net_Face *nf, int in, int out) +{ + Evas_Object *o; + int x, y, w, h; + double factor = 0.0; + int in_val, out_val; + + if (!nf) + return; + + evas_object_geometry_get(nf->net_obj, &x, &y, &w, &h); + + /* Graph Values */ + factor = ((double)h / (double)100); + in_val = (int)((double)in * factor); + out_val = (int)((double)out * factor); + + if (in_val > 100) + in_val = 100; + if (out_val > 100) + out_val = 100; + + o = evas_object_line_add(nf->evas); + evas_object_clip_set(o, nf->chart_obj); + evas_object_layer_set(o, 2); + evas_object_line_xy_set(o, x + w, y, x + w, y + in_val); + evas_object_color_set(o, 255, 0, 0, 128); + evas_object_pass_events_set(o, 1); + evas_object_show(o); +} diff --git a/e_mod_main.h b/e_mod_main.h new file mode 100644 index 0000000..b58ef40 --- /dev/null +++ b/e_mod_main.h @@ -0,0 +1,58 @@ +#ifndef E_MOD_MAIN_H +#define E_MOD_MAIN_H + +typedef struct _Config Config; +typedef struct _Config_Face Config_Face; +typedef struct _Net Net; +typedef struct _Net_Face Net_Face; + +struct _Config +{ + char *device; + int check_interval; +}; + +struct _Config_Face +{ + unsigned char enabled; +}; + +struct _Net +{ + E_Menu *config_menu; + Net_Face *face; + Config *conf; + + E_Config_DD *conf_edd; + E_Config_Dialog *cfd; +}; + +struct _Net_Face +{ + Evas *evas; + E_Container *con; + E_Menu *menu; + Net *net; + + Config_Face *conf; + E_Config_DD *conf_face_edd; + + Evas_Object *net_obj; + Evas_Object *event_obj; + Evas_Object *chart_obj; + + Ecore_Timer *monitor; + + E_Gadman_Client *gmc; +}; + +EAPI extern E_Module_Api e_modapi; + +EAPI void *e_modapi_init (E_Module *m); +EAPI int e_modapi_shutdown (E_Module *m); +EAPI int e_modapi_save (E_Module *m); +EAPI int e_modapi_info (E_Module *m); +EAPI int e_modapi_about (E_Module *m); +EAPI int e_modapi_config (E_Module *m); + +#endif diff --git a/module_icon.png b/module_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f6cc4e3a32e9f2512b05736595a6869cc6be3b GIT binary patch literal 3765 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 1048576) { + tmp = tmp / 1048576; + snprintf(in_str, sizeof(in_str), "%i MB", tmp); + } + else if (tmp > 1024 && tmp < 1048576) { + tmp = tmp / 1024; + snprintf(in_str, sizeof(in_str), "%i KB", tmp); + } + else { + snprintf(in_str, sizeof(in_str), "%i B", tmp); + } + set_text(PART:"in-text", in_str); + + tmp = getarg(3); + if (tmp > 1048576) { + tmp = tmp / 1048576; + snprintf(out_str, sizeof(out_str), "%i MB", tmp); + } + else if (tmp > 1024 && tmp < 1048576) { + tmp = tmp / 1024; + snprintf(out_str, sizeof(out_str), "%i KB", tmp); + } + else { + snprintf(out_str, sizeof(out_str), "%i B", tmp); + } + set_text(PART:"out-text", out_str); + } + } + } + + parts{ + part { + name, "background"; + mouse_events, 1; + description { + state, "default" 0.0; + rel1 { to, "overlay"; } + rel2 { to, "overlay"; } + image { normal, "bg.png"; border, 6 6 6 6; } + fill { smooth, 0; } + } + } + + part { + name, "overlay"; + mouse_events, 0; + description { + state, "default" 0.0; + image { normal, "over.png"; + border, 13 13 13 13; + middle, 0; + } + fill { + smooth, 0; + } + } + } + + part { + name, "net"; + mouse_events, 0; + description { + state, "default" 0.0; + color, 255 255 255 128; + aspect: 1.0 1.0; + rel1{ offset, 4 4; } + rel2{ offset, -5 -5; } + image { normal, "module_icon.png"; } + fill { smooth, 0; } + } + } + + part + { + name, "out-text"; + type, TEXT; + effect, SOFT_SHADOW; + mouse_events, 0; + description { + state, "default" 0.0; + align, 1.0 0.0; + rel1 { relative, 1.0 0.0; to_x, "overlay"; offset, -2 1; } + rel2 { relative, 1.0 0.0; } + color, 0 0 0 255; + color3, 255 255 255 100; + text { + text, "out"; font, "VeraMono"; + size, 10; min, 1 1; + align, 1.0 0.0; + } + } + } + + part + { + name, "in-text"; + type, TEXT; + effect, SOFT_SHADOW; + mouse_events, 0; + description { + state, "default" 0.0; + align, 1.0 0.0; + rel1 { relative, 1.0 1.0; to_x, "overlay"; offset, -2 -10; } + rel2 { relative, 1.0 1.0; } + color, 0 0 0 255; + color3, 255 255 255 100; + text { + text, "in"; font, "VeraMono"; + size, 10; min, 1 1; + align, 1.0 0.0; + } + } + } + } + }//close group net + +} + diff --git a/over.png b/over.png new file mode 100644 index 0000000000000000000000000000000000000000..aae54be805378e3814735b5f0e478c73b1a08e08 GIT binary patch literal 930 zcmV;T16}-yP)hIZItcZAUPMY!(^aGdxI2tGi+#7;<+IPJ!cNE~)z5@>)}yLC$w z4!mKmm8RVo(k#c4Whb?hJddCEaiYG^mavPOaXtc!v}(@S+geJiEr49wMgkO&0QZ20 zKo>~myz&IJT?=3g`~bd5dts4-aW0SmkAYXfF>nNoguRJeuy7c@?dr~eo-FEH!E|1y z017++UIU+iU&7v4CfFpD9))-$*p`5&z#HJZV3|^Y7TF&Q_)}mg?U_g?_mlu5n3jQ6 z;Ab5Hk;MFwtojf*u}By@1o#jFHUTN{xzp)%Ha9o*U@*9F2~aX(1L@ZrbIW?x#fA6#@BZG|F~%c2)+1!C4&vNHBDcmC5HonIuUvj{vt$ zoMWE|z{OyUNp0t!6=Q|dmL370^>(-r0p$W_<8zq`f#?Pu_%?qKO@(+I$JZjjXEjWz zS}B$Oivqk40i{$DG66;K3NXgRK`TJM3)&C}HUvUfK=1?+tf@SCm zC_+#`6h*ZPC<9VJ60`!ELZJ14Rsn&VU=c_NTH*~yFXj{Qg*;&5Oj03* zfb9X*e`2A_~V>9lz)p_Z~&vbq)>=?yj$| zKR3qg0#AS!N~w=ctE2$k@AsFswzeK+S+-gfMHa_#1Q?}MY>d%WAJ9rE0~oEfvApAN zt$qhg6h>R<&kMjR7t5%z|@c$H#`idtkQ$-5(ej@)Wnk16ovB4 zk_?5Aj8p}8Pv3y|DXMuuh5nu{jv*T7-%d8