From ab2dd491cbdafbfa88314b4d027b0279a5ca2966 Mon Sep 17 00:00:00 2001 From: Miculcy Brian Date: Mon, 13 Oct 2008 23:23:28 +0000 Subject: [PATCH] New module 'diskio': Visualize disk activity, green = read, red = write SVN revision: 36642 --- .cvsignore | 29 +++ AUTHORS | 2 + COPYING | 28 ++ COPYING-PLAIN | 33 +++ ChangeLog | 0 INSTALL | 237 +++++++++++++++++ Makefile.am | 28 ++ NEWS | 0 README | 0 ac_attribute.m4 | 14 + autogen.sh | 16 ++ configure.in | 53 ++++ e-module-diskio.edc | 169 ++++++++++++ fonts/.cvsignore | 28 ++ fonts/VeraBd.ttf | Bin 0 -> 58675 bytes images/.cvsignore | 28 ++ images/module_icon.png | Bin 0 -> 13655 bytes images/module_icon_r.png | Bin 0 -> 5280 bytes images/module_icon_w.png | Bin 0 -> 5047 bytes m4/.cvsignore | 28 ++ m4/ac_attribute.m4 | 14 + module.desktop.in | 5 + src/.cvsignore | 28 ++ src/Makefile.am | 19 ++ src/Makefile.in | 490 +++++++++++++++++++++++++++++++++++ src/e_mod_config.c | 138 ++++++++++ src/e_mod_main.c | 544 +++++++++++++++++++++++++++++++++++++++ src/e_mod_main.h | 59 +++++ 28 files changed, 1990 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 ac_attribute.m4 create mode 100755 autogen.sh create mode 100644 configure.in create mode 100644 e-module-diskio.edc create mode 100644 fonts/.cvsignore create mode 100644 fonts/VeraBd.ttf create mode 100644 images/.cvsignore create mode 100644 images/module_icon.png create mode 100644 images/module_icon_r.png create mode 100644 images/module_icon_w.png create mode 100644 m4/.cvsignore create mode 100644 m4/ac_attribute.m4 create mode 100644 module.desktop.in create mode 100644 src/.cvsignore create mode 100644 src/Makefile.am create mode 100644 src/Makefile.in create mode 100644 src/e_mod_config.c create mode 100644 src/e_mod_main.c create mode 100644 src/e_mod_main.h diff --git a/.cvsignore b/.cvsignore new file mode 100644 index 0000000..c3c897b --- /dev/null +++ b/.cvsignore @@ -0,0 +1,29 @@ +.deps +.libs +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.guess +config.h +config.h.in +config.log +config.rpath +config.status +config.sub +configure +depcomp +install-sh +libtool +m4 +missing +mkinstalldirs +ltmain.sh +stamp-h1 +*.lo +*.la +*.edj +*.spec +*.tar.gz +module.desktop +INSTALL diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..0dbfa53 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,2 @@ +Code: Brian 'morlenxus' Miculcy +Theme: Simon 'jf_simon' Tischer diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..cecdea0 --- /dev/null +++ b/COPYING @@ -0,0 +1,28 @@ +Copyright (C) 2000 Brian 'morlenxus' Miculcy 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..f257259 --- /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. + +Brian 'morlenxus' Miculcy 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..d3c5b40 --- /dev/null +++ b/INSTALL @@ -0,0 +1,237 @@ +Installation Instructions +************************* + +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, +2006, 2007 Free Software Foundation, Inc. + +This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + +Briefly, the shell commands `./configure; make; make install' should +configure, build, and install this package. The following +more-detailed instructions are generic; see the `README' file for +instructions specific to this package. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. Caching is +disabled by default to prevent problems with accidental use of stale +cache files. + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You need `configure.ac' if +you want to change it or regenerate `configure' using a newer version +of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. + + Running `configure' might take a while. While running, it prints + some messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + + 6. Often, you can also type `make uninstall' to remove the installed + files again. + +Compilers and Options +===================== + +Some systems require unusual options for compilation or linking that the +`configure' script does not know about. Run `./configure --help' for +details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c99 CFLAGS=-g LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + +You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you can use GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + With a non-GNU `make', it is safer to compile the package for one +architecture at a time in the source code directory. After you have +installed the package for one architecture, use `make distclean' before +reconfiguring for another architecture. + +Installation Names +================== + +By default, `make install' installs the package's commands under +`/usr/local/bin', include files under `/usr/local/include', etc. You +can specify an installation prefix other than `/usr/local' by giving +`configure' the option `--prefix=PREFIX'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +pass the option `--exec-prefix=PREFIX' to `configure', the package uses +PREFIX as the prefix for installing programs and libraries. +Documentation and other data files still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=DIR' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + +Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + +There may be some features `configure' cannot figure out automatically, +but needs to determine by the type of machine the package will run on. +Usually, assuming the package is built to be run on the _same_ +architectures, `configure' can figure that out, but if it prints a +message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the option `--target=TYPE' to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + +If you want to set default values for `configure' scripts to share, you +can create a site shell script called `config.site' that gives default +values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + +Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +causes the specified `gcc' to be used as the C compiler (unless it is +overridden in the site shell script). + +Unfortunately, this technique does not work for `CONFIG_SHELL' due to +an Autoconf bug. Until the bug is fixed you can use this workaround: + + CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash + +`configure' Invocation +====================== + +`configure' recognizes the following options to control how it operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..076cd41 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,28 @@ +MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess config.h.in \ + config.sub configure depcomp install-sh ltmain.sh \ + missing module.desktop + +SUBDIRS = src + +EDJE_FLAGS = -v \ + -id $(top_srcdir)/images \ + -fd $(top_srcdir)/fonts + +# data files for the module +filesdir = $(datadir) + +files_DATA = module.desktop \ + e-module-diskio.edj + +EXTRA_DIST = $(files_DATA) \ + images/module_icon.png \ + fonts/VeraBd.ttf + +%.edj: %.edc + $(EDJE_CC) $(EDJE_FLAGS) $< $@ + +clean-local: + rm -rf e-module-diskio.edj module.desktop *~ +uninstall: + rm -rf $(DESTDIR)$(datadir) + 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/ac_attribute.m4 b/ac_attribute.m4 new file mode 100644 index 0000000..46c1a42 --- /dev/null +++ b/ac_attribute.m4 @@ -0,0 +1,14 @@ + +AC_DEFUN([AC_C___ATTRIBUTE__], +[ + AC_MSG_CHECKING(for __attribute__) + AC_CACHE_VAL(ac_cv___attribute__, [ + AC_TRY_COMPILE([#include ], + [int func(int x); int foo(int x __attribute__ ((unused))) { exit(1); }], + ac_cv___attribute__=yes, ac_cv___attribute__=no)]) + if test "$ac_cv___attribute__" = "yes"; then + AC_DEFINE(HAVE___ATTRIBUTE__, 1, [Define to 1 if your compiler has __attribute__]) + fi + AC_MSG_RESULT($ac_cv___attribute__) +]) + diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..31ccda0 --- /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 -I m4 $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/configure.in b/configure.in new file mode 100644 index 0000000..f253af7 --- /dev/null +++ b/configure.in @@ -0,0 +1,53 @@ +dnl Process this file with autoconf to produce a configure script. + +# get rid of that stupid cache mechanism +rm -f config.cache + +AC_INIT(diskio, 0.0.1, morlenxus@gmx.net) +AC_PREREQ(2.52) +AC_CONFIG_SRCDIR(configure.in) +AC_CANONICAL_BUILD +AC_CANONICAL_HOST +AC_ISC_POSIX + +AM_INIT_AUTOMAKE(1.8) +AM_CONFIG_HEADER(config.h) + +AC_PROG_CC +AM_PROG_CC_STDC +AC_HEADER_STDC +AC_C_CONST +AC_C___ATTRIBUTE__ + +define([AC_LIBTOOL_LANG_CXX_CONFIG], [:])dnl +define([AC_LIBTOOL_LANG_F77_CONFIG], [:])dnl +AC_PROG_LIBTOOL + +#AM_GNU_GETTEXT([external]) +#AM_GNU_GETTEXT_VERSION(0.14) + +MODULE_ARCH="$host_os-$host_cpu" +AC_SUBST(MODULE_ARCH) +AC_DEFINE_UNQUOTED(MODULE_ARCH, "$MODULE_ARCH", "Module architecture") + +AC_PATH_PROG(EDJE_CC, "edje_cc", "", $PATH) + +AC_PATH_PROG(E_CONFIG, "enlightenment-config", "", $PATH) +e_cflags=`$E_CONFIG --cflags` +e_libs=`$E_CONFIG --libs` +e_modules=`$E_CONFIG --module-dir` +AC_SUBST(e_cflags) +AC_SUBST(e_libs) + +datadir="${e_modules}/${PACKAGE}" +AC_ARG_ENABLE(homedir-install, + AS_HELP_STRING([--enable-homedir-install], [Install module in homedir]), + [ datadir="${HOME}/.e/e/modules/${PACKAGE}" ] +) + +AC_OUTPUT([ +Makefile +src/Makefile +module.desktop +], [ +]) diff --git a/e-module-diskio.edc b/e-module-diskio.edc new file mode 100644 index 0000000..96c3f50 --- /dev/null +++ b/e-module-diskio.edc @@ -0,0 +1,169 @@ +/* +* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2 +*/ +fonts +{ + font: "VeraBd.ttf" "VeraBd"; +} + +images +{ + image: "module_icon.png" COMP; + image: "module_icon_r.png" COMP; + image: "module_icon_w.png" COMP; +} + +collections +{ + group + { + name: "icon"; + max: 24 24; + parts + { + part + { + name: "image"; + mouse_events: 0; + type: IMAGE; + description + { + state: "default" 0.0; + image.normal: "module_icon.png"; + } + } + } + } + group + { + name: "modules/diskio/main"; + max: 128 128; + parts + { + part + { + name: "icon"; + mouse_events: 1; + type: IMAGE; + description + { + state: "default" 0.0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + image.normal: "module_icon.png"; + } + } + part + { + name: "read"; + type: IMAGE; + description + { + state: "off" 0.0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + image.normal: "module_icon_r.png"; + color: 0 0 0 0; + } + description + { + state: "on" 0.0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + color: 255 255 255 255; + } + } + part + { + name: "write"; + type: IMAGE; + description + { + state: "off" 0.0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + image.normal: "module_icon_w.png"; + color: 0 0 0 0; + } + description + { + state: "on" 0.0; + aspect: 1.0 1.0; + aspect_preference: BOTH; + color: 255 255 255 255; + } + } +///////////// + part { + name: "e.text.display_name"; + type: TEXT; + effect: OUTLINE_SOFT_SHADOW; + mouse_events: 0; + description + { + state: "default" 0.0; + rel1 + { + relative: 0.0 0.2; + offset: 0 0; + to_x: "icon"; + } + rel2 + { + relative: 0.95 0.95; + offset: -1 -1; + } + color: 255 255 255 255; + color2: 0 0 0 96; + color3: 0 0 0 32; + color_class: "module_label"; + text + { + text: "???"; + font: "VeraBold"; + size: 8; + min: 1 1; + align: 0.5 0.5; + text_class: "module_small"; + } + } +/////////////////// +} + } + programs + { + program + { + name: "read_off"; + signal: "read,off"; + source: ""; + action: STATE_SET "off" 0.0; + target: "read"; + } + program + { + name: "read_on"; + signal: "read,on"; + source: ""; + action: STATE_SET "on" 0.0; + target: "read"; + } + program + { + name: "write_off"; + signal: "write,off"; + source: ""; + action: STATE_SET "off" 0.0; + target: "write"; + } + program + { + name: "write_on"; + signal: "write,on"; + source: ""; + action: STATE_SET "on" 0.0; + target: "write"; + } + } + } +} diff --git a/fonts/.cvsignore b/fonts/.cvsignore new file mode 100644 index 0000000..8a7e479 --- /dev/null +++ b/fonts/.cvsignore @@ -0,0 +1,28 @@ +.deps +.libs +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.guess +config.h +config.h.in +config.log +config.rpath +config.status +config.sub +configure +depcomp +install-sh +libtool +m4 +missing +mkinstalldirs +ltmain.sh +stamp-h1 +*.lo +*.la +*.edj +*.spec +*.tar.gz +module.desktop diff --git a/fonts/VeraBd.ttf b/fonts/VeraBd.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a2a6b1fa8e28ea37b737ebf17b0d6563d6ac99a6 GIT binary patch literal 58675 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

)8H!(8G@rx-d!Q-;QhA(|LmE(YmhV2rpz7XzY2 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 literal 0 HcmV?d00001 diff --git a/images/.cvsignore b/images/.cvsignore new file mode 100644 index 0000000..8a7e479 --- /dev/null +++ b/images/.cvsignore @@ -0,0 +1,28 @@ +.deps +.libs +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.guess +config.h +config.h.in +config.log +config.rpath +config.status +config.sub +configure +depcomp +install-sh +libtool +m4 +missing +mkinstalldirs +ltmain.sh +stamp-h1 +*.lo +*.la +*.edj +*.spec +*.tar.gz +module.desktop diff --git a/images/module_icon.png b/images/module_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..562acfac1c30df8eee9dd2d240cbbeed63e0c72e GIT binary patch literal 13655 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 literal 0 HcmV?d00001 diff --git a/images/module_icon_r.png b/images/module_icon_r.png new file mode 100644 index 0000000000000000000000000000000000000000..7939de07e588db211cffa53e0260a295cca4c954 GIT binary patch literal 5280 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 Z2J7n-{IYQs+yxMXJ>zsb|D?~|{{mxO4O;*J literal 0 HcmV?d00001 diff --git a/images/module_icon_w.png b/images/module_icon_w.png new file mode 100644 index 0000000000000000000000000000000000000000..06e9c8e1ac2cfe0bc2620ea4664cbb44dcd7a8d2 GIT binary patch literal 5047 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 literal 0 HcmV?d00001 diff --git a/m4/.cvsignore b/m4/.cvsignore new file mode 100644 index 0000000..8a7e479 --- /dev/null +++ b/m4/.cvsignore @@ -0,0 +1,28 @@ +.deps +.libs +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.guess +config.h +config.h.in +config.log +config.rpath +config.status +config.sub +configure +depcomp +install-sh +libtool +m4 +missing +mkinstalldirs +ltmain.sh +stamp-h1 +*.lo +*.la +*.edj +*.spec +*.tar.gz +module.desktop diff --git a/m4/ac_attribute.m4 b/m4/ac_attribute.m4 new file mode 100644 index 0000000..46c1a42 --- /dev/null +++ b/m4/ac_attribute.m4 @@ -0,0 +1,14 @@ + +AC_DEFUN([AC_C___ATTRIBUTE__], +[ + AC_MSG_CHECKING(for __attribute__) + AC_CACHE_VAL(ac_cv___attribute__, [ + AC_TRY_COMPILE([#include ], + [int func(int x); int foo(int x __attribute__ ((unused))) { exit(1); }], + ac_cv___attribute__=yes, ac_cv___attribute__=no)]) + if test "$ac_cv___attribute__" = "yes"; then + AC_DEFINE(HAVE___ATTRIBUTE__, 1, [Define to 1 if your compiler has __attribute__]) + fi + AC_MSG_RESULT($ac_cv___attribute__) +]) + diff --git a/module.desktop.in b/module.desktop.in new file mode 100644 index 0000000..ca52ae0 --- /dev/null +++ b/module.desktop.in @@ -0,0 +1,5 @@ +[Desktop Entry] +Type=Link +Name=DiskIO +Icon=e-module-diskio +Comment=DiskIO Module Gadget:

Visualize disk i/o. diff --git a/src/.cvsignore b/src/.cvsignore new file mode 100644 index 0000000..8a7e479 --- /dev/null +++ b/src/.cvsignore @@ -0,0 +1,28 @@ +.deps +.libs +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.guess +config.h +config.h.in +config.log +config.rpath +config.status +config.sub +configure +depcomp +install-sh +libtool +m4 +missing +mkinstalldirs +ltmain.sh +stamp-h1 +*.lo +*.la +*.edj +*.spec +*.tar.gz +module.desktop diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..f4669fc --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,19 @@ +MAINTAINERCLEANFILES = Makefile.in + +INCLUDES = -I. \ + -I$(top_srcdir) \ + -I$(includedir) \ + @e_cflags@ + +pkgdir = $(datadir)/$(MODULE_ARCH) +pkg_LTLIBRARIES = module.la +module_la_SOURCES = e_mod_main.h \ + e_mod_main.c \ + e_mod_config.c + +module_la_LIBADD = @e_libs@ +module_la_LDFLAGS = -module -avoid-version +module_la_DEPENDENCIES = $(top_builddir)/config.h + +clean-local: + rm -rf *~ diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..9f2a295 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,490 @@ +# Makefile.in generated by automake 1.10.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = src +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/ac_attribute.m4 \ + $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(pkgdir)" +pkgLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(pkg_LTLIBRARIES) +am_module_la_OBJECTS = e_mod_main.lo e_mod_config.lo +module_la_OBJECTS = $(am_module_la_OBJECTS) +module_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(module_la_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ + --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +SOURCES = $(module_la_SOURCES) +DIST_SOURCES = $(module_la_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DSYMUTIL = @DSYMUTIL@ +DUMPBIN = @DUMPBIN@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EDJE_CC = @EDJE_CC@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +E_CONFIG = @E_CONFIG@ +FGREP = @FGREP@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LD = @LD@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIPO = @LIPO@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +MODULE_ARCH = @MODULE_ARCH@ +NM = @NM@ +NMEDIT = @NMEDIT@ +OBJDUMP = @OBJDUMP@ +OBJEXT = @OBJEXT@ +OTOOL = @OTOOL@ +OTOOL64 = @OTOOL64@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +e_cflags = @e_cflags@ +e_libs = @e_libs@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +lt_ECHO = @lt_ECHO@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +MAINTAINERCLEANFILES = Makefile.in +INCLUDES = -I. \ + -I$(top_srcdir) \ + -I$(includedir) \ + @e_cflags@ + +pkgdir = $(datadir)/$(MODULE_ARCH) +pkg_LTLIBRARIES = module.la +module_la_SOURCES = e_mod_main.h \ + e_mod_main.c \ + e_mod_config.c + +module_la_LIBADD = @e_libs@ +module_la_LDFLAGS = -module -avoid-version +module_la_DEPENDENCIES = $(top_builddir)/config.h +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-pkgLTLIBRARIES: $(pkg_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(pkgdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgdir)" + @list='$(pkg_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkgLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkgdir)/$$f'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(pkgLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkgdir)/$$f"; \ + else :; fi; \ + done + +uninstall-pkgLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(pkg_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(pkgdir)/$$p'"; \ + $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(pkgdir)/$$p"; \ + done + +clean-pkgLTLIBRARIES: + -test -z "$(pkg_LTLIBRARIES)" || rm -f $(pkg_LTLIBRARIES) + @list='$(pkg_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +module.la: $(module_la_OBJECTS) $(module_la_DEPENDENCIES) + $(module_la_LINK) -rpath $(pkgdir) $(module_la_OBJECTS) $(module_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e_mod_config.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/e_mod_main.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(LTLIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(pkgdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-local clean-pkgLTLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-pkgLTLIBRARIES + +install-dvi: install-dvi-am + +install-exec-am: + +install-html: install-html-am + +install-info: install-info-am + +install-man: + +install-pdf: install-pdf-am + +install-ps: install-ps-am + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-pkgLTLIBRARIES + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libtool clean-local clean-pkgLTLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-dvi \ + install-dvi-am install-exec install-exec-am install-html \ + install-html-am install-info install-info-am install-man \ + install-pdf install-pdf-am install-pkgLTLIBRARIES install-ps \ + install-ps-am install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \ + uninstall-am uninstall-pkgLTLIBRARIES + + +clean-local: + rm -rf *~ +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/e_mod_config.c b/src/e_mod_config.c new file mode 100644 index 0000000..3b651ad --- /dev/null +++ b/src/e_mod_config.c @@ -0,0 +1,138 @@ +#include +#include "e_mod_main.h" + +struct _E_Config_Dialog_Data +{ + Ecore_List *disks; + + int diskpos; +}; + +/* Local Function Prototypes */ +static void *_create_data(E_Config_Dialog *cfd); +static void _fill_data(Config_Item * ci, E_Config_Dialog_Data *cfdata); +static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); +static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); +static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); + +/* External Functions */ +EAPI E_Config_Dialog * +e_int_config_diskio_module(E_Container *con, Config_Item *ci) +{ + E_Config_Dialog *cfd = NULL; + E_Config_Dialog_View *v = NULL; + char buf[4096]; + + /* is this config dialog already visible ? */ + if (e_config_dialog_find("DiskIO", "_e_module_diskio_cfg_dlg")) return NULL; + + v = E_NEW(E_Config_Dialog_View, 1); + if (!v) return NULL; + + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.create_widgets = _basic_create; + v->basic.apply_cfdata = _basic_apply; + + /* Icon in the theme */ + snprintf(buf, sizeof(buf), "%s/e-module-diskio.edj", diskio_conf->module->dir); + + /* create new config dialog */ + cfd = e_config_dialog_new(con, "DiskIO Module", "DiskIO", + "_e_module_diskio_cfg_dlg", buf, 0, v, ci); + + e_dialog_resizable_set(cfd->dia, 1); + diskio_conf->cfd = cfd; + return cfd; +} + +/* Local Functions */ +static void * +_create_data(E_Config_Dialog *cfd) +{ + E_Config_Dialog_Data *cfdata = NULL; + Config_Item *ci; + + ci = cfd->data; + cfdata = E_NEW(E_Config_Dialog_Data, 1); + + _fill_data(ci, cfdata); + return cfdata; +} + +static void +_fill_data(Config_Item * ci, E_Config_Dialog_Data *cfdata) +{ + // load available disk devices + cfdata->disks = ecore_file_ls("/sys/block"); +} + +static void +_free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + diskio_conf->cfd = NULL; + E_FREE(cfdata); +} + +static Evas_Object * +_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + Config_Item *ci; + Evas_Object *o = NULL, *of = NULL, *ob = NULL; + E_Radio_Group *rg; + char path[128], *disk; + int pos = -1; + + ci = cfd->data; + + o = e_widget_list_add(evas, 0, 0); + + of = e_widget_framelist_add(evas, "Disk", 0); + e_widget_framelist_content_align_set(of, 0.0, 0.0); + rg = e_widget_radio_group_new (&(cfdata->diskpos)); + + if (cfdata->disks) + { + while ((disk = ecore_list_next(cfdata->disks))) + { + pos++; + + snprintf (path, sizeof (path), "/sys/block/%s/device", disk); + if (!ecore_file_exists(path)) continue; + + ob = e_widget_radio_add (evas, disk, pos, rg); + if (strcmp(disk, ci->disk)==0) e_widget_radio_toggle_set(ob, 1); + e_widget_framelist_object_append(of, ob); + } + } + + e_widget_list_object_append(o, of, 1, 1, 0.5); + + return o; +} + +static int +_basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + Config_Item *ci; + char *disk; + int pos = -1; + + ci = cfd->data; + + ecore_list_first_goto(cfdata->disks); + while ((disk = ecore_list_next(cfdata->disks))) + { + pos++; + + if (pos == cfdata->diskpos) + { + if (ci->disk) evas_stringshare_del(ci->disk); + ci->disk = evas_stringshare_add(disk); + break; + } + } + + e_config_save_queue(); + return 1; +} diff --git a/src/e_mod_main.c b/src/e_mod_main.c new file mode 100644 index 0000000..9b009ac --- /dev/null +++ b/src/e_mod_main.c @@ -0,0 +1,544 @@ +#include +#include "e_mod_main.h" + +/* Local Function Prototypes */ +static E_Gadcon_Client *_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style); +static void _gc_shutdown(E_Gadcon_Client *gcc); +static void _gc_orient(E_Gadcon_Client *gcc); +static char *_gc_label(void); +static const char *_gc_id_new(void); +static void _gc_id_del(const char *id); +static Evas_Object *_gc_icon(Evas *evas); + +static void _diskio_conf_new(void); +static void _diskio_conf_free(void); +static int _diskio_conf_timer(void *data); +static Config_Item *_diskio_conf_item_get(const char *id); +static void _diskio_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event); +static void _diskio_cb_menu_post(void *data, E_Menu *menu); +static void _diskio_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi); +static int _diskio_set(void *data); + +/* Local Structures */ +typedef struct _Instance Instance; +struct _Instance +{ + /* pointer to this gadget's container */ + E_Gadcon_Client *gcc; + + /* evas_object used to display */ + Evas_Object *o_diskio; + + /* popup anyone ? */ + E_Menu *menu; + + /* Config_Item structure. Every gadget should have one :) */ + Config_Item *conf_item; + + /* diskstat update timer */ + Ecore_Timer *timer; + unsigned long bytes_r; + unsigned long bytes_w; +}; + +/* Local Variables */ +static int uuid = 0; +static Evas_List *instances = NULL; +static E_Config_DD *conf_edd = NULL; +static E_Config_DD *conf_item_edd = NULL; +Config *diskio_conf = NULL; + +static const E_Gadcon_Client_Class _gc_class = +{ + GADCON_CLIENT_CLASS_VERSION, "diskio", + {_gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, + _gc_id_new, _gc_id_del}, + E_GADCON_CLIENT_STYLE_PLAIN +}; + +EAPI E_Module_Api e_modapi = {E_MODULE_API_VERSION, "DiskIO"}; + +/* + * Module Functions +*/ +EAPI void * +e_modapi_init(E_Module *m) +{ + char buf[4096]; + + /* Location of theme to load for this module */ + snprintf(buf, sizeof(buf), "%s/e-module-diskio.edj", m->dir); + + /* Define EET Data Storage */ + + conf_item_edd = E_CONFIG_DD_NEW("Config_Item", Config_Item); + #undef T + #undef D + #define T Config_Item + #define D conf_item_edd + E_CONFIG_VAL(D, T, id, STR); + E_CONFIG_VAL(D, T, disk, STR); + + conf_edd = E_CONFIG_DD_NEW("Config", Config); + #undef T + #undef D + #define T Config + #define D conf_edd + E_CONFIG_VAL(D, T, version, INT); + E_CONFIG_LIST(D, T, conf_items, conf_item_edd); /* the list */ + + /* Tell E to find any existing module data. First run ? */ + diskio_conf = e_config_domain_load("module.diskio", conf_edd); + if (diskio_conf) + { + /* Check config version */ + if ((diskio_conf->version >> 16) < MOD_CONFIG_FILE_EPOCH) + { + /* config too old */ + _diskio_conf_free(); + ecore_timer_add(1.0, _diskio_conf_timer, + "DiskIO Module Configuration data needed " + "upgrading. Your old configuration
has been" + " wiped and a new set of defaults initialized. " + "This
will happen regularly during " + "development, so don't report a
bug. " + "This simply means the module needs " + "new configuration
data by default for " + "usable functionality that your old
" + "configuration simply lacks. This new set of " + "defaults will fix
that by adding it in. " + "You can re-configure things now to your
" + "liking. Sorry for the inconvenience.
"); + } + + /* Ardvarks */ + else if (diskio_conf->version > MOD_CONFIG_FILE_VERSION) + { + /* config too new...wtf ? */ + _diskio_conf_free(); + ecore_timer_add(1.0, _diskio_conf_timer, + "Your DiskIO Module configuration is NEWER " + "than the module version. This is " + "very
strange. This should not happen unless" + " you downgraded
the module or " + "copied the configuration from a place where" + "
a newer version of the module " + "was running. This is bad and
as a " + "precaution your configuration has been now " + "restored to
defaults. Sorry for the " + "inconvenience.
"); + } + } + + /* if we don't have a config yet, or it got erased above, + * then create a default one */ + if (!diskio_conf) _diskio_conf_new(); + + /* create a link from the modules config to the module + * this is not written */ + diskio_conf->module = m; + + /* Tell any gadget containers (shelves, etc) that we provide a module + * for the user to enjoy */ + e_gadcon_provider_register(&_gc_class); + + /* Give E the module */ + return m; +} + +/* + * Function to unload the module + */ +EAPI int +e_modapi_shutdown(E_Module *m) +{ + /* Kill the config dialog */ + if (diskio_conf->cfd) e_object_del(E_OBJECT(diskio_conf->cfd)); + diskio_conf->cfd = NULL; + + /* Tell E the module is now unloaded. Gets removed from shelves, etc. */ + diskio_conf->module = NULL; + e_gadcon_provider_unregister(&_gc_class); + + /* Cleanup our item list */ + while (diskio_conf->conf_items) + { + Config_Item *ci = NULL; + + /* Grab an item from the list */ + ci = diskio_conf->conf_items->data; + /* remove it */ + diskio_conf->conf_items = + evas_list_remove_list(diskio_conf->conf_items, + diskio_conf->conf_items); + /* cleanup stringshares !! ) */ + if (ci->id) evas_stringshare_del(ci->id); + /* keep the planet green */ + E_FREE(ci); + } + + /* Cleanup the main config structure */ + E_FREE(diskio_conf); + + /* Clean EET */ + E_CONFIG_DD_FREE(conf_item_edd); + E_CONFIG_DD_FREE(conf_edd); + return 1; +} + +/* + * Function to Save the modules config + */ +EAPI int +e_modapi_save(E_Module *m) +{ + e_config_domain_save("module.diskio", conf_edd, diskio_conf); + return 1; +} + +/* Local Functions */ + +/* Called when Gadget_Container says go */ +static E_Gadcon_Client * +_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) +{ + Instance *inst = NULL; + char buf[4096]; + + /* theme file */ + snprintf(buf, sizeof(buf), "%s/e-module-diskio.edj", + diskio_conf->module->dir); + + /* New visual instance, any config ? */ + inst = E_NEW(Instance, 1); + inst->conf_item = _diskio_conf_item_get(id); + if (inst->conf_item->disk) evas_stringshare_add(inst->conf_item->disk); + + /* create on-screen object */ + inst->o_diskio = edje_object_add(gc->evas); + /* we have a theme ? */ + if (!e_theme_edje_object_set(inst->o_diskio, "base/theme/modules/diskio", + "modules/diskio/main")) + edje_object_file_set(inst->o_diskio, buf, "modules/diskio/main"); + + /* Start loading our module on screen via container */ + inst->gcc = e_gadcon_client_new(gc, name, id, style, inst->o_diskio); + inst->gcc->data = inst; + + /* hook a mouse down. we want/have a popup menu, right ? */ + evas_object_event_callback_add(inst->o_diskio, EVAS_CALLBACK_MOUSE_DOWN, + _diskio_cb_mouse_down, inst); + + /* add to list of running instances so we can cleanup later */ + instances = evas_list_append(instances, inst); + + inst->timer = ecore_timer_add(0.1, _diskio_set, inst); + + /* return the Gadget_Container Client */ + return inst->gcc; +} + +/* Set disk i/o */ +static int +_diskio_set(void *data) +{ + FILE *statfile; + Instance *inst = NULL; + + char buffer[128]; + char dummy[16]; + char path[128]; + unsigned long dummy0, dummy1, dummy2, dummy3, dummy4, dummy5, + dummy6, dummy7, dummy8, bytes_r_new=0, bytes_w_new=0; + + inst = data; + if (!inst) return 0; + if (!inst->conf_item) return 0; + + edje_object_part_text_set(inst->o_diskio, "e.text.display_name", + inst->conf_item->disk); + + snprintf (path, sizeof (path), "/sys/block/%s/stat", inst->conf_item->disk); + statfile = fopen(path, "r"); + if (!statfile) + { + edje_object_signal_emit(inst->o_diskio, "read,off", ""); + edje_object_signal_emit(inst->o_diskio, "write,off", ""); + return 0; + } + + fgets(buffer, sizeof(buffer), statfile); + sscanf(buffer, "%lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu", &dummy0, &dummy1, &bytes_r_new, &dummy2, &dummy3, &dummy4, &bytes_w_new, &dummy5, &dummy6, &dummy7, &dummy8); + + fclose (statfile); + + if (!bytes_r_new && !bytes_w_new) + { + edje_object_signal_emit(inst->o_diskio, "read,off", ""); + edje_object_signal_emit(inst->o_diskio, "write,off", ""); + return 1; + } + + if (inst->bytes_r != bytes_r_new) + { + edje_object_signal_emit(inst->o_diskio, "read,on", ""); + inst->bytes_r = bytes_r_new; + } + else + edje_object_signal_emit(inst->o_diskio, "read,off", ""); + + if (inst->bytes_w != bytes_w_new) + { + edje_object_signal_emit(inst->o_diskio, "write,on", ""); + inst->bytes_w = bytes_w_new; + } + else + edje_object_signal_emit(inst->o_diskio, "write,off", ""); + + return 1; +} + +/* Called when Gadget_Container says stop */ +static void +_gc_shutdown(E_Gadcon_Client *gcc) +{ + Instance *inst = NULL; + + if (!(inst = gcc->data)) return; + instances = evas_list_remove(instances, inst); + + /* Delete diskstat update timer */ + if (inst->timer) ecore_timer_del(inst->timer); + + /* kill popup menu */ + if (inst->menu) + { + e_menu_post_deactivate_callback_set(inst->menu, NULL, NULL); + e_object_del(E_OBJECT(inst->menu)); + inst->menu = NULL; + } + /* delete the visual */ + if (inst->o_diskio) + { + /* remove mouse down callback hook */ + evas_object_event_callback_del(inst->o_diskio, EVAS_CALLBACK_MOUSE_DOWN, + _diskio_cb_mouse_down); + evas_object_del(inst->o_diskio); + } + E_FREE(inst); +} + +/* For for when container says we are changing position */ +static void +_gc_orient(E_Gadcon_Client *gcc) +{ + e_gadcon_client_aspect_set(gcc, 16, 16); + e_gadcon_client_min_size_set(gcc, 16, 16); +} + +/* Gadget/Module label */ +static char * +_gc_label(void) +{ + return "DiskIO"; +} + +/* so E can keep a unique instance per-container */ +static const char * +_gc_id_new(void) +{ + Config_Item *ci = NULL; + + ci = _diskio_conf_item_get(NULL); + return ci->id; +} + +/* gets called when container says remove this item */ +static void +_gc_id_del(const char *id) +{ + Config_Item *ci = NULL; + + if (!(ci = _diskio_conf_item_get(id))) return; + + /* cleanup !! */ + if (ci->id) evas_stringshare_del(ci->id); + if (ci->disk) evas_stringshare_del(ci->disk); + + diskio_conf->conf_items = evas_list_remove(diskio_conf->conf_items, ci); + E_FREE(ci); +} + +static Evas_Object * +_gc_icon(Evas *evas) +{ + Evas_Object *o = NULL; + char buf[4096]; + + /* theme */ + snprintf(buf, sizeof(buf), "%s/e-module-diskio.edj", diskio_conf->module->dir); + + /* create icon object */ + o = edje_object_add(evas); + + /* load icon from theme */ + edje_object_file_set(o, buf, "icon"); + + return o; +} + +/* new module needs a new config :), or config too old and we need one anyway */ +static void +_diskio_conf_new(void) +{ + Config_Item *ci = NULL; + char buf[128]; + + diskio_conf = E_NEW(Config, 1); + diskio_conf->version = (MOD_CONFIG_FILE_EPOCH << 16); + +#define IFMODCFG(v) if ((diskio_conf->version & 0xffff) < v) { +#define IFMODCFGEND } + + /* setup defaults */ + IFMODCFG(0x008d); + _diskio_conf_item_get(NULL); + IFMODCFGEND; + + /* update the version */ + diskio_conf->version = MOD_CONFIG_FILE_VERSION; + + /* setup limits on the config properties here (if needed) */ + + /* save the config to disk */ + e_config_save_queue(); +} + +static void +_diskio_conf_free(void) +{ + /* cleanup any stringshares here */ + while (diskio_conf->conf_items) + { + Config_Item *ci = NULL; + + ci = diskio_conf->conf_items->data; + diskio_conf->conf_items = + evas_list_remove_list(diskio_conf->conf_items, + diskio_conf->conf_items); + /* EPA */ + if (ci->id) evas_stringshare_del(ci->id); + if (ci->disk) evas_stringshare_del(ci->disk); + E_FREE(ci); + } + + E_FREE(diskio_conf); +} + +/* timer for the config oops dialog */ +static int +_diskio_conf_timer(void *data) +{ + e_util_dialog_show("DiskIO Configuration Updated", data); + return 0; +} + +/* function to search for any Config_Item struct for this Item + * create if needed */ +static Config_Item * +_diskio_conf_item_get(const char *id) +{ + Evas_List *l = NULL; + Config_Item *ci = NULL; + char buf[128]; + + if (!id) + { + /* nothing passed, return a new id */ + snprintf(buf, sizeof(buf), "%s.%d", _gc_class.name, ++uuid); + id = buf; + } + else + { + for (l = diskio_conf->conf_items; l; l = l->next) + { + if (!(ci = l->data)) continue; + if ((ci->id) && (!strcmp(ci->id, id))) return ci; + } + } + ci = E_NEW(Config_Item, 1); + ci->id = evas_stringshare_add(id); + ci->disk = evas_stringshare_add("???"); + diskio_conf->conf_items = evas_list_append(diskio_conf->conf_items, ci); + return ci; +} + +/* Pants On */ +static void +_diskio_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event) +{ + Instance *inst = NULL; + Evas_Event_Mouse_Down *ev; + E_Zone *zone = NULL; + E_Menu_Item *mi = NULL; + int x, y; + + if (!(inst = data)) return; + ev = event; + + if ((ev->button == 3) && (!inst->menu)) + { + /* grab current zone */ + zone = e_util_zone_current_get(e_manager_current_get()); + + /* create popup menu */ + inst->menu = e_menu_new(); + e_menu_post_deactivate_callback_set(inst->menu, _diskio_cb_menu_post, + inst); + + mi = e_menu_item_new(inst->menu); + e_menu_item_label_set(mi, "Configuration"); + e_util_menu_item_edje_icon_set(mi, "enlightenment/configuration"); + e_menu_item_callback_set(mi, _diskio_cb_menu_configure, inst); + + mi = e_menu_item_new(inst->menu); + e_menu_item_separator_set(mi, 1); + + /* Each Gadget Client has a utility menu from the Container */ + e_gadcon_client_util_menu_items_append(inst->gcc, inst->menu, 0); + e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, + NULL, NULL); + + /* show the menu relative to gadgets position */ + e_menu_activate_mouse(inst->menu, zone, (x + ev->output.x), + (y + ev->output.y), 1, 1, + E_MENU_POP_DIRECTION_AUTO, ev->timestamp); + evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, + EVAS_BUTTON_NONE, ev->timestamp, NULL); + } +} + +/* popup menu closing, cleanup */ +static void +_diskio_cb_menu_post(void *data, E_Menu *menu) +{ + Instance *inst = NULL; + + if (!(inst = data)) return; + if (!inst->menu) return; + e_object_del(E_OBJECT(inst->menu)); + inst->menu = NULL; +} + +/* call configure from popup */ +static void +_diskio_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi) +{ + Instance *inst = NULL; + + inst = data; + if (!inst) return; + if (!diskio_conf) return; + if (diskio_conf->cfd) return; + e_int_config_diskio_module(mn->zone->container, inst->conf_item); +} diff --git a/src/e_mod_main.h b/src/e_mod_main.h new file mode 100644 index 0000000..7c3eb78 --- /dev/null +++ b/src/e_mod_main.h @@ -0,0 +1,59 @@ +#ifndef E_MOD_MAIN_H +#define E_MOD_MAIN_H + +/* Macros used for config file versioning */ +#define MOD_CONFIG_FILE_EPOCH 0x0001 +#define MOD_CONFIG_FILE_GENERATION 0x008d +#define MOD_CONFIG_FILE_VERSION \ + ((MOD_CONFIG_FILE_EPOCH << 16) | MOD_CONFIG_FILE_GENERATION) + +typedef struct _Config Config; +typedef struct _Config_Item Config_Item; + +/* Base config struct. Store Item Count, etc + * + * *module (not written to disk) (E Interaction) + * *cfd (not written to disk) (config dialog) + * + * Store list of your items that you want to keep. (sorting) + * Can define per-module config properties here. + * + * Version used to know when user config too old */ +struct _Config +{ + E_Module *module; + E_Config_Dialog *cfd; + + /* The list; their location on screen ? */ + Evas_List *conf_items; + + /* config file version */ + int version; +}; + +/* This struct used to hold config for individual items from above list */ +struct _Config_Item +{ + /* unique id */ + const char *id; + + /* selected disk */ + const char *disk; +}; + +/* Setup the E Module Version, Needed to check if module can run. */ +EAPI extern E_Module_Api e_modapi; + +/* E API Module Interface Declarations + * + * Need to initialize, shutdown, save the module */ +EAPI void *e_modapi_init(E_Module *m); +EAPI int e_modapi_shutdown(E_Module *m); +EAPI int e_modapi_save(E_Module *m); + +/* Function for calling the modules config dialog */ +EAPI E_Config_Dialog *e_int_config_diskio_module(E_Container *con, Config_Item *ci); + +extern Config *diskio_conf; + +#endif