From 6ad3c0393775b6787d52d1d6aaea8477af529a68 Mon Sep 17 00:00:00 2001 From: Sthithaprajna Garapaty Date: Mon, 10 Dec 2007 02:43:23 +0000 Subject: [PATCH] New MPD Module to show MPD status in the shelf. SVN revision: 33073 --- ABOUT-NLS | 218 +++++++++++++++ AUTHORS | 1 + COPYING | 28 ++ ChangeLog | 2 + INSTALL | 229 ++++++++++++++++ Makefile.am | 41 +++ NEWS | 0 README | 5 + VeraMono.ttf | Bin 0 -> 49204 bytes autogen.sh | 17 ++ configure.in | 105 ++++++++ e-module-mpdule.edj | Bin 0 -> 5452 bytes e_mod_config.c | 136 ++++++++++ e_mod_main.c | 557 +++++++++++++++++++++++++++++++++++++++ e_mod_main.h | 39 +++ e_modules-mpdule.spec.in | 50 ++++ module.desktop | 6 + mpdule.edc | 159 +++++++++++ 18 files changed, 1593 insertions(+) create mode 100644 ABOUT-NLS create mode 100644 AUTHORS create mode 100644 COPYING 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 configure.in create mode 100644 e-module-mpdule.edj create mode 100644 e_mod_config.c create mode 100644 e_mod_main.c create mode 100644 e_mod_main.h create mode 100644 e_modules-mpdule.spec.in create mode 100644 module.desktop create mode 100644 mpdule.edc diff --git a/ABOUT-NLS b/ABOUT-NLS new file mode 100644 index 0000000..94cbc42 --- /dev/null +++ b/ABOUT-NLS @@ -0,0 +1,218 @@ +Notes on the Free Translation Project +************************************* + + Free software is going international! The Free Translation Project +is a way to get maintainers of free software, translators, and users all +together, so that will gradually become able to speak many languages. +A few packages already provide translations for their messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work at translations should contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +Quick configuration advice +========================== + + If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +INSTALL Matters +=============== + + Some packages are "localizable" when properly installed; the +programs they contain can be made to speak your own native language. +Most such packages use GNU `gettext'. Other packages have their own +ways to internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the GNU `gettext' own +library will be used. This library is wholly contained within this +package, usually in the `intl/' subdirectory, so prior installation of +the GNU `gettext' package is _not_ required. Installers may use +special options at configuration time for changing the default +behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will respectively bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might be not what is desirable. You +should use the more recent version of the GNU `gettext' library. I.e. +if the file `intl/VERSION' shows that the library which comes with this +package is more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages have usually many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +Using This Package +================== + + As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, +and `CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your country by running the command +`locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +Translating Teams +================= + + For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" +area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `translation@iro.umontreal.ca' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skill are praised more than +programming skill, here. + +Available Packages +================== + + Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of April +2005. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files en fr ja de bg es fi pl pt ru + +-------------------------------+ + enlightenment | [] [] [] [] [] [] [] [] [] [] | + + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If August 2002 seems to be old, you may fetch a more recent copy of +this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date +matrix with full percentage details can be found at +`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. + +Using `gettext' in new packages +=============================== + + If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +to use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`translation@iro.umontreal.ca' to make the `.pot' files available to +the translation teams. + diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..163a0d8 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +iamsthitha diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..bb43adc --- /dev/null +++ b/COPYING @@ -0,0 +1,28 @@ +Copyright (C) 2007 Sthithaprajna Garapaty 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/ChangeLog b/ChangeLog new file mode 100644 index 0000000..ffdfa1b --- /dev/null +++ b/ChangeLog @@ -0,0 +1,2 @@ +09/06/2005 Christopher Michael + * Added Support For Virtual Desktops diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..54caf7c --- /dev/null +++ b/INSTALL @@ -0,0 +1,229 @@ +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + + These are generic installation instructions. + + 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 only 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. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. 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. + +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=c89 CFLAGS=-O2 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 must use a version of `make' that +supports the `VPATH' variable, such as 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 `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have 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' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' 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 `--target=TYPE' option 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 + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`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..34b0beb --- /dev/null +++ b/Makefile.am @@ -0,0 +1,41 @@ +MAINTAINERCLEANFILES = Makefile.in + +SUBDIRS = + +EDJE_CC = @edje_cc@ +EDJE_FLAGS = -v \ +-id $(top_srcdir) \ +-fd $(top_srcdir) + +filesdir = $(datadir) +files_DATA = e-module-mpdule.edj \ + module.desktop \ + mpdule.edj + +EXTRA_DIST = $(files_DATA) \ + e_modules-mpdule.spec \ + mpdule.edc \ + VeraMono.ttf + +CONFIG_CLEAN_FILES = e_modules-mpdule.spec mpdule.edj + +# 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 +module_la_LIBADD = @e_libs@ +module_la_LDFLAGS = -module -avoid-version +module_la_DEPENDENCIES = $(top_builddir)/config.h $(top_builddir)/mpdule.edj + +%.edj: %.edc + $(EDJE_CC) $(EDJE_FLAGS) $< $@ + +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..187d329 --- /dev/null +++ b/README @@ -0,0 +1,5 @@ +Simple MPD module +Load it into your shelf. Set it to: Able to be Resized, and resize to a good size for best experience. + +To see more than just the artist and title, edit the theme (See comments in the theme for more info). + 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..ae01364 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,17 @@ +#!/bin/sh + +rm -rf autom4te.cache +rm -f aclocal.m4 ltmain.sh + +touch README + +echo "Running autopoint..." ; autopoint -f || : +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..59beb95 --- /dev/null +++ b/configure.in @@ -0,0 +1,105 @@ +dnl Process this file with autoconf to produce a configure script. + +# get rid of that stupid cache mechanism +rm -f config.cache + +AC_INIT(configure.in) +AC_CANONICAL_BUILD +AC_CANONICAL_HOST + +AM_INIT_AUTOMAKE(mpdule, 0.0.1) +AM_CONFIG_HEADER(config.h) +AC_ISC_POSIX +AC_PROG_CC +AM_PROG_CC_STDC +AC_HEADER_STDC +AC_HEADER_TIME +AC_CHECK_HEADERS(sys/time.h libmpd/libmpdclient.h) +AC_C_CONST +AM_ENABLE_SHARED +AM_PROG_LIBTOOL + +ALL_LINGUAS="" +AC_SUBST(ALL_LINGUAS) + +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") + +CPPFLAGS="`enlightenment-config --cflags` `pkg-config libmpd --cflags`" +LDFLAGS="`enlightenment-config --libs` `pkg-config libmpd --libs`" + +dnl Set PACKAGE_DATA_DIR in config.h. +if test "x${prefix}" = "xNONE"; then + AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${HOME}/.e/e/modules/${PACKAGE}", "Package installed data destination") + datadir="${HOME}/.e/e/modules/${PACKAGE}" +else + AC_DEFINE_UNQUOTED(PACKAGE_DATA_DIR, "${libdir}/enlightenment/modules/${PACKAGE}", "Package installed data destination") + datadir="${libdir}/enlightenment/modules/${PACKAGE}" +fi + +AC_PREFIX_DEFAULT(${HOME}/.e/e) +if test "x$prefix" = "xNONE"; then + datarootdir=${ac_default_prefix} +else + datarootdir=${prefix}/share +fi +localedir=${datarootdir}/locale +AC_SUBST(LOCALEDIR, "${localedir}") +AC_DEFINE_UNQUOTED(LOCALEDIR, "${localedir}", [Module Locale Directory]) + +#AC_CHECK_LIB(dl, dlopen, dlopen_libs=-ldl) +#AC_SUBST(dlopen_libs) + +AC_ARG_WITH(edje-config, +[ --with-edje-config=EDJE_CONFIG use edje-config specified ], +[ + EDJE_CONFIG=$withval; + echo "using "$EDJE_CONFIG" for edje-config"; +/ +],[ + PROG="edje-config"; + AC_PATH_PROG(EDJE_CONFIG, $PROG, "", $PATH) +]) +edje_cflags=`$EDJE_CONFIG --cflags` +edje_libs=`$EDJE_CONFIG --libs` +AC_SUBST(edje_cflags) +AC_SUBST(edje_libs) + +edje_cc="`$EDJE_CONFIG --prefix`/bin/edje_cc" +AC_ARG_WITH(edje-cc, +[ --with-edje-cc=PATH specify a specific path to edje_cc], +[ + v=$withval; + edje_cc=$v + echo " Enlightenment edje_cc explicitly set to "$edje_cc; +],[ + edje_cc="`$EDJE_CONFIG --prefix`/bin/edje_cc" +]) +AC_SUBST(edje_cc) + +AC_ARG_WITH(enlightenment-config, +[ --with-enlightenment-config=E_CONFIG use enlightenment-config specified ], +[ + E_CONFIG=$withval; + echo "using "$E_CONFIG" for enlightenment-config"; +],[ + PROG="enlightenment-config"; + AC_PATH_PROG(E_CONFIG, $PROG, "", $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) +AC_SUBST(e_modules) + +AC_OUTPUT([ +Makefile +e_modules-mpdule.spec +],[ +]) + diff --git a/e-module-mpdule.edj b/e-module-mpdule.edj new file mode 100644 index 0000000000000000000000000000000000000000..999938d415c4ad631b88e6974e413840f3cd8915 GIT binary patch literal 5452 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 literal 0 HcmV?d00001 diff --git a/e_mod_config.c b/e_mod_config.c new file mode 100644 index 0000000..4840450 --- /dev/null +++ b/e_mod_config.c @@ -0,0 +1,136 @@ +#include +#include "e_mod_main.h" + +struct _E_Config_Dialog_Data +{ + int poll_time; + char *hostname; + char *port; +}; + +/* 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 onTimeCheckChange (void *data, Evas_Object * obj); +static void onDateCheckChange (void *data, Evas_Object * obj); + +void +_config_mpdule_module (Config_Item * ci) +{ + E_Config_Dialog *cfd; + E_Config_Dialog_View *v; + E_Container *con; + char buf[4096]; + + 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; + + snprintf (buf, sizeof (buf), "%s/e-module-mpdule.edj", + e_module_dir_get (mpdule_config->module)); + con = e_container_current_get (e_manager_current_get ()); + cfd = e_config_dialog_new (con, D_ ("MPDule Configuration"), "MPDule", "_e_modules_mpdule_config_dialog", buf, 0, v, ci); + mpdule_config->config_dialog = cfd; +} + +static void +_fill_data (Config_Item * ci, E_Config_Dialog_Data * cfdata) +{ + char buf[128]; + + cfdata->poll_time = ci->poll_time; + cfdata->hostname = strdup(ci->hostname); + snprintf(buf, sizeof(buf), "%d", ci->port); + cfdata->port = strdup(buf); +} + +static void * +_create_data (E_Config_Dialog * cfd) +{ + E_Config_Dialog_Data *cfdata; + Config_Item *ci; + + ci = cfd->data; + cfdata = E_NEW (E_Config_Dialog_Data, 1); + + _fill_data (ci, cfdata); + return cfdata; +} + +static void +_free_data (E_Config_Dialog * cfd, E_Config_Dialog_Data * cfdata) +{ + if (!mpdule_config) + return; + mpdule_config->config_dialog = NULL; + free(cfdata->hostname); + E_FREE(cfdata); +} + +static Evas_Object * +_basic_create_widgets (E_Config_Dialog * cfd, Evas * evas, + E_Config_Dialog_Data * cfdata) +{ + Evas_Object *o, *of, *ob, *time_entry, *time_check, *hostname_entry, *port_entry; + E_Radio_Group *rg; + + o = e_widget_list_add (evas, 0, 0); + + of = e_widget_frametable_add (evas, D_ ("Configuration"), 1); + ob = e_widget_label_add (evas, D_ ("Poll Time:")); + e_widget_frametable_object_append (of, ob, 0, 0, 1, 1, 1, 0, 1, 0); + ob = e_widget_slider_add (evas, 1, 0, D_ ("%1.0f seconds"), 1, 60, 1, 0, NULL, &(cfdata->poll_time), 100); + e_widget_frametable_object_append (of, ob, 0, 1, 1, 1, 1, 0, 1, 0); + ob = e_widget_label_add (evas, D_ ("Hostname:")); + e_widget_frametable_object_append (of, ob, 0, 2, 1, 1, 1, 0, 1, 0); + hostname_entry = e_widget_entry_add (evas, &cfdata->hostname, NULL, NULL, NULL); + e_widget_min_size_set (hostname_entry, 150, 1); + e_widget_frametable_object_append (of, hostname_entry, 0, 3, 1, 1, 1, 0, 1, 0); + ob = e_widget_label_add (evas, D_ ("Port:")); + e_widget_frametable_object_append (of, ob, 0, 4, 1, 1, 1, 0, 1, 0); + port_entry = e_widget_entry_add (evas, &cfdata->port, NULL, NULL, NULL); + e_widget_min_size_set (hostname_entry, 150, 1); + e_widget_frametable_object_append (of, port_entry, 0, 5, 1, 1, 1, 0, 1, 0); + 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) +{ + Config_Item *ci; + + ci = cfd->data; + ci->poll_time = cfdata->poll_time; + if (ci->hostname) + evas_stringshare_del(ci->hostname); + ci->hostname = evas_stringshare_add(cfdata->hostname); + ci->port = atoi(cfdata->port); + e_config_save_queue (); + _mpdule_config_updated (ci); + return 1; +} + +static void +onTimeCheckChange (void *data, Evas_Object * obj) +{ + int checked = e_widget_check_checked_get (obj); + + e_widget_disabled_set (data, !checked); +} + +static void +onDateCheckChange (void *data, Evas_Object * obj) +{ + int checked = e_widget_check_checked_get (obj); + + e_widget_disabled_set (data, !checked); +} diff --git a/e_mod_main.c b/e_mod_main.c new file mode 100644 index 0000000..861c506 --- /dev/null +++ b/e_mod_main.c @@ -0,0 +1,557 @@ +#include +#include "e_mod_main.h" +#if TIME_WITH_SYS_TIME +# include +# include +#else +# if HAVE_SYS_TIME_H +# include +# else +# include +# endif +#endif +#include + +#define MAX_SONG_LENGTH 255 + +/* Func Proto Requirements for Gadcon */ +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 Evas_Object *_gc_icon (Evas * evas); +static const char *_gc_id_new(void); + +/* Module Protos */ +static void _mpdule_cb_mouse_down (void *data, Evas * e, Evas_Object * obj, + void *event_info); +static void _mpdule_menu_cb_configure (void *data, E_Menu * m, + E_Menu_Item * mi); +static void _mpdule_menu_cb_post (void *data, E_Menu * m); +static int _mpdule_cb_check (void *data); +static Config_Item *_mpdule_config_item_get (const char *id); + +static E_Config_DD *conf_edd = NULL; +static E_Config_DD *conf_item_edd = NULL; + +Config *mpdule_config = NULL; + +/* Define the class and gadcon functions this module provides */ +static const E_Gadcon_Client_Class _gc_class = { + GADCON_CLIENT_CLASS_VERSION, + "mpdule", {_gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL}, + E_GADCON_CLIENT_STYLE_PLAIN +}; + +typedef struct _Instance Instance; +struct _Instance +{ + E_Gadcon_Client *gcc; + Evas_Object *mpdule; + mpd_Connection *mpd; + Ecore_Timer *update_timer; + Config_Item *ci; +}; + + +static void _mpdule_connect (Instance * inst); +static void _mpdule_disconnect (Instance * inst); +static void _mpdule_update_song (Instance * inst); +static void _mpdule_update_song_cb (void *data); + +static E_Gadcon_Client * +_gc_init (E_Gadcon * gc, const char *name, const char *id, const char *style) +{ + Evas_Object *o; + E_Gadcon_Client *gcc; + Instance *inst; + char buf[4096]; + + inst = E_NEW (Instance, 1); + + inst->ci = _mpdule_config_item_get (id); + if (!inst->ci->id) + inst->ci->id = evas_stringshare_add (id); + + o = edje_object_add (gc->evas); + snprintf (buf, sizeof (buf), "%s/mpdule.edj", + e_module_dir_get (mpdule_config->module)); + if (!e_theme_edje_object_set + (o, "base/theme/modules/mpdule", "modules/mpdule/main")) + edje_object_file_set (o, buf, "modules/mpdule/main"); + evas_object_show (o); + + gcc = e_gadcon_client_new (gc, name, id, style, o); + gcc->data = inst; + inst->gcc = gcc; + inst->mpdule = o; + + evas_object_event_callback_add (o, EVAS_CALLBACK_MOUSE_DOWN, + _mpdule_cb_mouse_down, inst); + _mpdule_connect(inst); + _mpdule_update_song(inst); + inst->update_timer = ecore_timer_add((double)inst->ci->poll_time, + _mpdule_update_song_cb, inst); + + + mpdule_config->instances = + evas_list_append (mpdule_config->instances, inst); + return gcc; +} + +static void +_gc_shutdown (E_Gadcon_Client * gcc) +{ + Instance *inst; + + inst = gcc->data; + if (inst->update_timer) + ecore_timer_del(inst->update_timer); + _mpdule_disconnect(inst); + mpdule_config->instances = + evas_list_remove (mpdule_config->instances, inst); + + evas_object_event_callback_del (inst->mpdule, EVAS_CALLBACK_MOUSE_DOWN, + _mpdule_cb_mouse_down); + + evas_object_del (inst->mpdule); + free (inst); + inst = NULL; +} + +static void +_gc_orient (E_Gadcon_Client * gcc) +{ + Instance *inst; + Evas_Coord mw, mh; + + inst = gcc->data; + edje_object_size_min_calc (inst->mpdule, &mw, &mh); + e_gadcon_client_min_size_set (gcc, mw, mh); +} + +static char * +_gc_label (void) +{ + return D_ ("MPDule"); +} + +static Evas_Object * +_gc_icon (Evas * evas) +{ + Evas_Object *o; + char buf[4096]; + + o = edje_object_add (evas); + snprintf (buf, sizeof (buf), "%s/e-module-mpdule.edj", + e_module_dir_get (mpdule_config->module)); + edje_object_file_set (o, buf, "icon"); + return o; +} + +static const char * +_gc_id_new(void) +{ + Config_Item *ci; + + ci = _mpdule_config_item_get(NULL); + return ci->id; +} + +static void +_mpdule_cb_mouse_down (void *data, Evas * e, Evas_Object * obj, + void *event_info) +{ + Instance *inst; + Evas_Event_Mouse_Down *ev; + + inst = data; + ev = event_info; + if ((ev->button == 3) && (!mpdule_config->menu)) + { + E_Menu *mn; + E_Menu_Item *mi; + int x, y, w, h; + + mn = e_menu_new (); + e_menu_post_deactivate_callback_set (mn, _mpdule_menu_cb_post, inst); + mpdule_config->menu = mn; + + mi = e_menu_item_new (mn); + e_menu_item_label_set (mi, D_ ("Configuration")); + e_util_menu_item_edje_icon_set (mi, "enlightenment/configuration"); + e_menu_item_callback_set (mi, _mpdule_menu_cb_configure, inst); + + mi = e_menu_item_new (mn); + e_menu_item_separator_set (mi, 1); + + e_gadcon_client_util_menu_items_append (inst->gcc, mn, 0); + e_gadcon_canvas_zone_geometry_get (inst->gcc->gadcon, &x, &y, &w, &h); + e_menu_activate_mouse (mn, + e_util_zone_current_get (e_manager_current_get + ()), x + ev->output.x, + y + ev->output.y, 1, 1, + E_MENU_POP_DIRECTION_DOWN, ev->timestamp); + evas_event_feed_mouse_up (inst->gcc->gadcon->evas, ev->button, + EVAS_BUTTON_NONE, ev->timestamp, NULL); + } +} + +static void +_mpdule_menu_cb_post (void *data, E_Menu * m) +{ + if (!mpdule_config->menu) + return; + e_object_del (E_OBJECT (mpdule_config->menu)); + mpdule_config->menu = NULL; +} + +static void +_mpdule_menu_cb_configure (void *data, E_Menu * m, E_Menu_Item * mi) +{ + Instance *inst; + + inst = data; + _config_mpdule_module (inst->ci); +} + +void +_mpdule_config_updated (Config_Item *ci) +{ + Evas_List *l; + + if (!mpdule_config) + return; + for (l = mpdule_config->instances; l; l = l->next) + { + Instance *inst; + + inst = l->data; + if (!inst->ci != ci) + continue; + _mpdule_disconnect(inst); + _mpdule_connect(inst); + _mpdule_update_song(inst); + if (inst->update_timer) + ecore_timer_interval_set (inst->update_timer, + (double) ci->poll_time); + else + inst->update_timer = + ecore_timer_add ((double) ci->poll_time, _mpdule_update_song_cb, + inst); + break; + } +} + + +static Config_Item * +_mpdule_config_item_get (const char *id) +{ + Evas_List *l; + Config_Item *ci; + char buf[128]; + + + if (!id) + { + int num = 0; + + /* Create id */ + if (mpdule_config->items) + { + const char *p; + ci = evas_list_last(mpdule_config->items)->data; + p = strrchr(ci->id, '.'); + if (p) num = atoi(p + 1) + 1; + } + snprintf(buf, sizeof(buf), "%s.%d", _gc_class.name, num); + id = buf; + } + else + { + for (l = mpdule_config->items; l; l = l->next) + { + ci = l->data; + if (!ci->id) + continue; + if (!strcmp (ci->id, id)) + return ci; + } + } + + ci = E_NEW (Config_Item, 1); + ci->id = evas_stringshare_add (id); + ci->poll_time = 1.0; + ci->hostname = evas_stringshare_add ("localhost"); + ci->port = 6600; + + mpdule_config->items = evas_list_append (mpdule_config->items, ci); + return ci; +} + +EAPI E_Module_Api e_modapi = { + E_MODULE_API_VERSION, + "MPDule" +}; + +static void +_mpdule_connect(Instance *inst) +{ + mpd_Connection *mpd; + Config_Item *ci; + + ci = inst->ci; + mpd = mpd_newConnection(ci->hostname, ci->port, 3.0); + inst->mpd = mpd; +} + +static void +_mpdule_disconnect(Instance *inst) +{ + if (inst->mpd) { + mpd_closeConnection(inst->mpd); + inst->mpd = NULL; + } +} + +static void +_mpdule_update_song_cb(void *data) +{ + Instance *inst; + + inst = data; + _mpdule_update_song(inst); + return 0; +} + +static void +_mpdule_update_song(Instance *inst) +{ + mpd_Connection *mpd; + Evas_Object *mpdule; + + if (!inst->mpd) + return; + mpd = inst->mpd; + mpdule = inst->mpdule; + mpd_sendStatusCommand(mpd); + if (mpd->error == 0) + { + mpd_Status *status = mpd_getStatus(mpd); + + if (status) + { + if (status->state == MPD_STATUS_STATE_UNKNOWN) + { + edje_object_part_text_set (mpdule, "mpdule.status", D_ ("Unknown")); + } + else if (status->state == MPD_STATUS_STATE_STOP) + { + edje_object_part_text_set (mpdule, "mpdule.status", D_ ("Stopped")); + } + else if (status->state == MPD_STATUS_STATE_PLAY) + { + edje_object_part_text_set (mpdule, "mpdule.status", D_ ("Playing")); + } + else if (status->state == MPD_STATUS_STATE_PAUSE) + { + edje_object_part_text_set (mpdule, "mpdule.status", D_ ("Paused")); + } + + if (status->state > MPD_STATUS_STATE_STOP) + { + mpd_sendCurrentSongCommand(mpd); + mpd_InfoEntity *entity = NULL; + + while ( (entity = mpd_getNextInfoEntity(mpd)) ) + { + if ( entity->type == MPD_INFO_ENTITY_TYPE_SONG && + entity->info.song->id == status->songid ) + { + mpd_Song *song = entity->info.song; + + if (song->artist) + { + edje_object_part_text_set (mpdule, "mpdule.artist", song->artist); + + } + else + { + edje_object_part_text_set (mpdule, "mpdule.artist", ""); + } + if (song->title) + { + edje_object_part_text_set (mpdule, "mpdule.title", song->title); + + } + else + { + edje_object_part_text_set (mpdule, "mpdule.title", ""); + } + if (song->album) + { + edje_object_part_text_set (mpdule, "mpdule.album", song->album); + + } + else + { + edje_object_part_text_set (mpdule, "mpdule.album", ""); + } + if (song->track) + { + edje_object_part_text_set (mpdule, "mpdule.track", song->track); + + } + else + { + edje_object_part_text_set (mpdule, "mpdule.track", ""); + } + if (song->date) + { + edje_object_part_text_set (mpdule, "mpdule.date", song->date); + + } + else + { + edje_object_part_text_set (mpdule, "mpdule.date", ""); + } + if (song->genre) + { + edje_object_part_text_set (mpdule, "mpdule.genre", song->genre); + + } + else + { + edje_object_part_text_set (mpdule, "mpdule.genre", ""); + } + if (song->composer) + { + edje_object_part_text_set (mpdule, "mpdule.composer", song->composer); + + } + else + { + edje_object_part_text_set (mpdule, "mpdule.composer", ""); + } + if (song->time) + { + char * songtime; + sprintf(songtime, "%i", song->time); + edje_object_part_text_set (mpdule, "mpdule.time", songtime); + + } + else + { + edje_object_part_text_set (mpdule, "mpdule.time", ""); + } + if (song->file) + { + edje_object_part_text_set (mpdule, "mpdule.file", song->file); + + } + else + { + edje_object_part_text_set (mpdule, "mpdule.file", ""); + } + } + + mpd_freeInfoEntity(entity); + } + } + + mpd_freeStatus(status); + } + } + else + { + _mpdule_disconnect(inst); + _mpdule_connect(inst); + } +} + +EAPI void * +e_modapi_init (E_Module * m) +{ + bindtextdomain (PACKAGE, LOCALEDIR); + bind_textdomain_codeset (PACKAGE, "UTF-8"); + + conf_item_edd = E_CONFIG_DD_NEW ("MPDule_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, poll_time, DOUBLE); + E_CONFIG_VAL (D, T, hostname, STR); + E_CONFIG_VAL (D, T, port, INT); + + conf_edd = E_CONFIG_DD_NEW ("MPDule_Config", Config); +#undef T +#undef D +#define T Config +#define D conf_edd + E_CONFIG_LIST (D, T, items, conf_item_edd); + + mpdule_config = e_config_domain_load ("module.mpdule", conf_edd); + if (!mpdule_config) + { + Config_Item *ci; + + mpdule_config = E_NEW (Config, 1); + + ci = E_NEW (Config_Item, 1); + ci->id = evas_stringshare_add ("0"); + ci->poll_time = 1.0; + ci->hostname = evas_stringshare_add ("localhost"); + ci->port = 6600; + + mpdule_config->items = evas_list_append (mpdule_config->items, ci); + } + mpdule_config->module = m; + + e_gadcon_provider_register (&_gc_class); + return m; +} + +EAPI int +e_modapi_shutdown (E_Module * m) +{ + mpdule_config->module = NULL; + e_gadcon_provider_unregister (&_gc_class); + + if (mpdule_config->config_dialog) + e_object_del (E_OBJECT (mpdule_config->config_dialog)); + if (mpdule_config->menu) + { + e_menu_post_deactivate_callback_set (mpdule_config->menu, NULL, NULL); + e_object_del (E_OBJECT (mpdule_config->menu)); + mpdule_config->menu = NULL; + } + + while (mpdule_config->items) + { + Config_Item *ci; + + ci = mpdule_config->items->data; + mpdule_config->items = + evas_list_remove_list (mpdule_config->items, mpdule_config->items); + if (ci->id) + evas_stringshare_del (ci->id); + free (ci); + ci = NULL; + } + + free (mpdule_config); + mpdule_config = NULL; + E_CONFIG_DD_FREE (conf_item_edd); + E_CONFIG_DD_FREE (conf_edd); + return 1; +} + +EAPI int +e_modapi_save (E_Module * m) +{ + e_config_domain_save ("module.mpdule", conf_edd, mpdule_config); + return 1; +} diff --git a/e_mod_main.h b/e_mod_main.h new file mode 100644 index 0000000..8dd0817 --- /dev/null +++ b/e_mod_main.h @@ -0,0 +1,39 @@ +#define D_(str) dgettext(PACKAGE, str) + +#ifndef E_MOD_MAIN_H +#define E_MOD_MAIN_H + +#define RESOLUTION_MINUTE 0 +#define RESOLUTION_SECOND 1 + +typedef struct _Config Config; +typedef struct _Config_Item Config_Item; + +struct _Config +{ + E_Module *module; + E_Config_Dialog *config_dialog; + E_Menu *menu; + Evas_List *instances; + Evas_List *items; +}; + +struct _Config_Item +{ + const char *id; + double poll_time; + const char *hostname; + int port; +}; + +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); + +void _config_mpdule_module(Config_Item *ci); +void _mpdule_config_updated(Config_Item *ci); +extern Config *mpdule_config; + +#endif diff --git a/e_modules-mpdule.spec.in b/e_modules-mpdule.spec.in new file mode 100644 index 0000000..5cff1c0 --- /dev/null +++ b/e_modules-mpdule.spec.in @@ -0,0 +1,50 @@ +%define module_name mpdule + +Summary: %{module_name} module for the Enlightenment window manager +Name: e_modules-%{module_name} +Version: @VERSION@ +Release: 0.%(date '+%Y%m%d') +License: BSD +Group: User Interface/Desktops +URL: http://www.enlightenment.org/ +Source: ftp://ftp.enlightenment.org/pub/enlightenment/%{module_name}-%{version}.tar.gz +Packager: %{?_packager:%{_packager}}%{!?_packager:Michael Jennings } +Vendor: %{?_vendorinfo:%{_vendorinfo}}%{!?_vendorinfo:The Enlightenment Project (http://www.enlightenment.org/)} +Distribution: %{?_distribution:%{_distribution}}%{!?_distribution:%{_vendor}} +BuildRequires: ecore-devel, evas-devel, esmart-devel, edje-bin +BuildRequires: edje-devel, eet-devel, enlightenment-devel >= 0.16.999 +Requires: enlightenment >= 0.16.999 +BuildRoot: %{_tmppath}/%{name}-%{version}-root + +%description +%{module_name} module for the Enlightenment window manager. + +%prep +%setup -q -n %{module_name}-%{version} + +%build +%{configure} +%{__make} %{?_smp_mflags} %{?mflags} + +%install +%{__make} %{?mflags_install} DESTDIR=$RPM_BUILD_ROOT install +%{find_lang} %{module_name} || true > %{module_name}.lang + +%clean +test "x$RPM_BUILD_ROOT" != "x/" && rm -rf $RPM_BUILD_ROOT + +%post +/sbin/ldconfig + +%postun +/sbin/ldconfig + +%files -f %{module_name}.lang +%defattr(-, root, root) +%doc AUTHORS ChangeLog COPYING* INSTALL NEWS README +%if "%{module_name}" == "emu" +%{_bindir}/%{module_name}* +%endif +%{_libdir}/enlightenment/modules/%{module_name}* + +%changelog diff --git a/module.desktop b/module.desktop new file mode 100644 index 0000000..6af1e23 --- /dev/null +++ b/module.desktop @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Link +Name=Mixer +Icon=e-module-mixer +Comment=Mixer Gadget
Allows you to control your system
volume. +Comment[it]=Modulo Mixer
Permette di controllare il volume
dell'audio del sistema. diff --git a/mpdule.edc b/mpdule.edc new file mode 100644 index 0000000..8357f36 --- /dev/null +++ b/mpdule.edc @@ -0,0 +1,159 @@ +fonts { + font: "VeraMono.ttf" "VeraMono"; +} +/* +Available labels: +mpdule.status +mpdule.artist +mpdule.title +mpdule.album +mpdule.track +mpdule.date +mpdule.genre +mpdule.composer +mpdule.time +mpdule.file +*/ +collections +{ + group + { + name: "modules/mpdule/main"; + parts + { + part + { + name: "base"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 255 255 255; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + } + } + part + { + name: "item_clip"; + type: RECT; + mouse_events: 1; + description { + state: "default" 0.0; + color: 255 255 255 0; + rel1 { + relative: 0.0 0.0; + } + rel2 { + relative: 1.0 1.0; + } + } + } + part + { + name: "mpdule.artist"; + type: TEXT; + effect: OUTLINE_SOFT_SHADOW; + clip_to: "base"; + mouse_events: 1; + description + { + state: "default" 0.0; + visible: 1; + align: 0.5 0.5; + rel1 + { + relative: 0.0 0.0; + offset: 0 4; + } + rel2 + { + relative: 1.0 0.5; + offset: -1 -3; + } + color: 255 255 255 255; + color2: 0 0 0 96; + color3: 0 0 0 32; + text { + text: ""; + font: "VeraMono"; + size: 10; + min: 1 1; + align: 0.5 0.5; + text_class: "mpdule"; + } + } + description + { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description + { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + part + { + name: "mpdule.title"; + type: TEXT; + clip_to: "base"; + effect: OUTLINE_SOFT_SHADOW; + mouse_events: 1; + description + { + state: "default" 0.0; + visible: 1; + align: 0.5 0.5; + rel1 + { + relative: 0.0 0.5; + offset: 0 4; + } + rel2 + { + relative: 1.0 1.0; + offset: -1 -3; + } + color: 255 255 255 255; + color2: 0 0 0 96; + color3: 0 0 0 32; + text { + text: ""; + font: "VeraMono"; + size: 9; + min: 1 1; + align: 0.5 0.5; + text_class: "mpdule"; + } + } + description + { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + } + description + { + state: "visible" 0.0; + inherit: "default" 0.0; + visible: 1; + } + } + } + /* Close Parts */ + programs + { + } + /* Close Programs */ + } + /* Close Group */ +} +/* Close Coll */