From 55c23fb67fb870289fb061bf78cf629863376988 Mon Sep 17 00:00:00 2001 From: Christopher Michael Date: Wed, 30 Aug 2006 18:08:52 +0000 Subject: [PATCH] Cpu in the shelf. Removes gadman errors. Removed the graph until I get something better for this. Just displays text for now. Need to remove old module.cpu.cfg for this to work. SVN revision: 25216 --- Makefile.am | 14 +- autogen.sh | 13 - configure.in | 8 - cpu.edc | 72 +--- cpu.png | Bin 7822 -> 2918 bytes e_mod_config.c | 115 ------ e_mod_config.h | 11 - e_mod_main.c | 988 ++++++++++++++++++++++++++----------------------- e_mod_main.h | 65 +--- module.eap | Bin 15802 -> 6779 bytes 10 files changed, 563 insertions(+), 723 deletions(-) delete mode 100644 e_mod_config.c delete mode 100644 e_mod_config.h diff --git a/Makefile.am b/Makefile.am index 7f48bfb..201361e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,4 @@ -MAINTAINERCLEANFILES = Makefile.in e_modules-cpu.spec - -SUBDIRS = po +MAINTAINERCLEANFILES = Makefile.in EDJE_CC = @edje_cc@ EDJE_FLAGS = -v \ @@ -16,9 +14,7 @@ EXTRA_DIST = $(files_DATA) \ cpu.edc \ VeraMono.ttf \ cpu.png \ -module.eap \ -e_modules-cpu.spec \ -e_modules-cpu.spec.in +module.eap # data files for the module filesdir = $(datadir) @@ -32,11 +28,9 @@ INCLUDES = -I. \ pkgdir = $(datadir)/$(MODULE_ARCH) pkg_LTLIBRARIES = module.la module_la_SOURCES = e_mod_main.c \ - e_mod_main.h \ - e_mod_config.c \ - e_mod_config.h + e_mod_main.h -module_la_LIBADD = @e_libs@ -lm +module_la_LIBADD = @e_libs@ module_la_LDFLAGS = -module -avoid-version module_la_DEPENDENCIES = $(top_builddir)/config.h diff --git a/autogen.sh b/autogen.sh index 6823405..7aeabb6 100755 --- a/autogen.sh +++ b/autogen.sh @@ -3,24 +3,11 @@ rm -rf autom4te.cache rm -f aclocal.m4 ltmain.sh -touch README - echo "Running aclocal..." ; aclocal $ACLOCAL_FLAGS || exit 1 echo "Running autoheader..." ; autoheader || exit 1 echo "Running autoconf..." ; autoconf || exit 1 echo "Running libtoolize..." ; (libtoolize --copy --automake || glibtoolize --automake) || exit 1 echo "Running automake..." ; automake --add-missing --copy --gnu || exit 1 -echo "Generating gettext cpu.pot template"; \ -xgettext \ ---output cpu.pot \ ---output-dir=po \ ---language=C \ ---add-location \ ---keyword=D_ \ ---sort-by-file \ ---copyright-holder="TODO" \ ---foreign-user \ -`find . -name "*.[ch]" -print` || exit 1 if [ -z "$NOCONFIGURE" ]; then ./configure "$@" diff --git a/configure.in b/configure.in index 0f50b32..2c9cc4a 100644 --- a/configure.in +++ b/configure.in @@ -17,12 +17,6 @@ AC_C_CONST AM_ENABLE_SHARED AM_PROG_LIBTOOL -ALL_LINGUAS="bg eo fi it sv ja ru" -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") @@ -148,8 +142,6 @@ AC_SUBST(e_modules) AC_OUTPUT([ Makefile -e_modules-cpu.spec -po/Makefile ],[ ]) diff --git a/cpu.edc b/cpu.edc index 75c82b4..64be271 100644 --- a/cpu.edc +++ b/cpu.edc @@ -50,89 +50,41 @@ collections } } } - part { - name, "lines"; - mouse_events, 0; - type, SWALLOW; - clip_to: "fade_clip"; - description - { - state, "default" 0.0; - rel1 - { - relative: 0.0 0.0; - } - rel2 - { - relative: 1.0 1.0; - } - color, 0 0 0 0; - } - } - } - } - //close group net - - group - { - name: "modules/cpu/text"; - parts - { - part - { - name: "text_clip"; - type: RECT; - mouse_events: 0; - description - { - state: "default" 0.0; - color: 255 255 255 255; - rel1 - { - relative: 0.0 0.0; - offset: 0 0; - } - rel2 - { - relative: 1.0 1.0; - offset: -1 -1; - } - } - } - part - { - name: "in-text"; + name: "load"; type: TEXT; - effect: SOFT_SHADOW; + effect: OUTLINE_SOFT_SHADOW; mouse_events: 0; - clip_to: "text_clip"; + clip_to: "fade_clip"; description { state: "default" 0.0; align: 0.5 0.5; rel1 { - relative: 0.5 0.5; + relative: 0.0 0.0; + to: "cpu"; } rel2 { - relative: 0.5 0.5; + relative: 1.0 1.0; + to: "cpu"; } - color: 0 0 0 255; - color3: 255 255 255 100; + color: 255 0 0 255; + color2: 0 0 0 96; + color3: 0 0 0 32; text { - text: ""; + text: "0%"; font: "VeraMono"; size: 10; min: 1 1; align: 0.5 0.5; + text_class: "module_large"; } } } } } } - diff --git a/cpu.png b/cpu.png index 26ee659510cef0829603ff07f81f0f35c1b78a91..6c435b2b8b09b2f66214477f8626055dfe212476 100644 GIT binary patch delta 2900 zcmV-a3#;^wJ?0i5iBL{Q3K|Lk000U}NJLTq001xm001xu1^@s6R|5HmksvXD2p$Lv zDJM`a-~a#$^hrcPRA}DSn#+!4*;R(WwaZ+`&yi`VK zz|*Hshw$NB)0F@C{Ot1B%*0H^BM5ig!QF6oi3r@iTS0{HZEMRMZ~M%D95=%wa5Jns z&a6Mj>bCYf+zBE+Ir*Q{pZ@eeK8lD_-~xCG=m_xQ#mjLVj{b17DS!3y<>jMr$Ev{X zqEQtv!#&zQ+upbdWV2wVnAP7tZ#ToVo~JgSYukOdEO#d&_~g@Ho;-W@?5`u@Ux8l$ zWl`Yd}3 zs=&#oCttm|IRAr)$iNlw0$8US1LvZu(qOW+UMFzx;%b?#tF3eS4t(6O=+2$J8hgLp z7ePH@**|ZK2#6RX;tB8}@E&jk$OuqM!QEx+?yYomik`J8^S8 zUhG<2&B9mtBSAa_9s}{ANTmllX4Mec^XJ6HDNKR_Ij8ySg>BPgy)b%h4X&OcKoseKs)fKIdT5LQ26nIG39>J_@)S z5ys)6uwJh*Jz#w`;bt5i3Y5~6m{Y6o#mOu@(Z@hvl$Sy_wz{#keuGdf`Foo(t;2pA zgfs}_H~@i~b98S70cOE!JVbTk`1k-f2u~cW?qODt6(k9NF3N^n43S~S6Z^u?FuLhA z&R;z2df<8=(A#bAfADL3I2Xft}ru_PEyvMh{{d;`)TffQi@i8fZ zq(CG9?`~v&Z8?O2X2K_+AW89j#W#QFJywVR!ax4gfAQ+fcCf!#zEkK{G8e&;$8W8Q z&7$vr@HL)%{R#IUJYZZ33}a##q$(nU$biU*$cmH>N$H4`R-{1~24fHcq4?W^=rBJu25Oa4904I6z(0aI6NE~1`w%M4sR86W_D6z zOaw$6B7;jskrO=-^DNvT3Z#5>`Y zXz{b8J&ERxKrrwM;v0~H$OOItp9q@>&4g()0(-DwR^`?(9%s7jHbY2vgpSS&!;nxd zxYtF0R0Z5ChpE-mtLw$9qM;<85GICHKr;9hp&P<7t{FGo3h&#%jfJ+yTR^D8|F$~T z03Jq|ripPp0F;PQZ|Yi=vE~W4RzD0v5egED#Kb5WhJuj6Gw6oMnK0`b0|y)}$}p@t zMc(8AVjBatOSlN$(o&^=;#LT&DRS$LOjt%Jq{t8%V zu}06sZ=er!lZv-cz;A<)8z8tR2xB$E!3qS!LJ0~I8Sx46-s&~oqBY2gnx!Ov6q^-L zMXl6AIMaIfI)3TKE_af-`6M&1R3d5ttJ%m{trAyP6GbcL4-Vkq5W*Z>2{I|#^19qh zje(YCqorBe5?8{VDHpUT?z6cHRb?Dk+xgQSQ9RDx+0y528jaRiukH$zGEqtblyP*% zQL)G*sp&B>e-=^{k{7}&bYg~oj#Uq^q+Mf^m7*1@wdyNo%Ge6o0;fCabVTdEY7oyJ zsa`P7FIs=AhDSzXO>!q9Gmr@ij*^yTq^KMzLWu^Qx$TVBiK!W-IM(RHjDjSo3*@({ z16>gN;(^`fTSTgbG~@X-k*jsZtyx~1^=Bn&stjzY=&?7AQ?2bIA_xM1k{E^qNVhdL zcX=Reu}bXBZW^Tk%8)SKV7kV%S~AQDEiGkgRUnihD!KD$3eDVSFC&LuYla*2;R) zt`}y9K16hi#a)&7S{k)~TFk;1uA;^H?DI38KYPGYy3Z&=s9~iNGgpP#!fIHlV?#|&!1oM;?)|}+C$LQg1!R3T@09GsykW8V>_pDcRv32r#ya?NcL6U zJzf#2SkBm#F)fXfII0TgR)bW{*%TvZBdhUxUHIQG*8JkL%wAMK zfJ}sJq3YEuJ;{lGogo%GwBoK>u%*-8v@Q09_PBPzxj&dwTtAc&sZW9CmT(@E*ZkgP z#7?Mw__oi9-dKs3xsY!gnnmcFrUdlXt@jwmk)xv(W`$R0myF|T;qnjP{R-3cn)Rmk z73^8`dcf{lJ?@wbbslI6ycv?}R7?iH2UN-Ro$L`(ZMzx;FVKRDXEAloTf?DF?5?1Gs} z&ga!SBD)IuPLbNfdN&(g*yx)kbF&cBlsP{;gD9jl>~u#rjs31IVn_HLPSXj!z=Z49 zr^`mcjqr(o9SD_DC`Cif{NnsI-~Zl^`1s?WaCUaN2b<0+?6-Y;-@BPk>_f2cxb_9_ zVA&6L?<`~=ee^wbAAf#ve(}T8)6+kS@FN6?2npXR-3!lNncs4m`I*GdgW$c^FqRmi zKXxZJIKn=cmI%xhXF?r!?tO??b(04 z@ecxbhGN|Gb@y0zS9gB~oB`{mM2vu}*K5}6^*Qiy+wm>ngZ41(VDB#pzv}-^%!R;! zm%!)1tM;5Y#_oUuoB}@sCg2O;VN;<0e}eo91@FIGdpiHTDX{^f7iwt2-tX2y_dxB- y_}5A+uY@-vubT(XfFig26XeUV_}fCMU;H0%=eV4ViYnRw0000#{d8x9Z5t% zRCwC$om;GJ*Ll}}W6ZhM+83X5e91X+;>2x3Lt48KjA;tt5|>cYBm^27h=KuC@XAH- zQZ6cwmWsGZJRk%W;;E@1iUgt$1rb_7RNN$uow&}elsL9yAMbO#FK6$y)|_K}9}i>9 zImeiDti8|i*+(kzS<=*6d+m8!-+z3!|M!hC;qL41>+WlKnRDLPyoqF|=d{n=*YBpm zUfk*Ag zkG0{t-U(G@Xj=~`;uPl{l{H`r;+595{r%Rnn)PapsA4d9@qod(7HcdbL0;Z_R6#^g z6^yZX@8jRey#q%_uk-D1|ITSL_Gg)^A`k}$hkWB}zr&5A6{?D;^2xvSVKdSobB5a8 z^%vp$1<*z?{HFbjK!_Kb*0F9JAOFOUKjxgfe{XNkE|*K|y*JJ|+cb?m!%Uesk(ttH zrZk$V=RW({&%6#az&*eUSOaoP8sSAyQJ(y(AGIf+SpM_9*Y-bf*G%1#nfg1x=YZFM zOTdljE7}AIJrf8MPYhHC2ZzV`j`J`6#lco z4p2qW-q@rS^;rHLxPKVbkXUTkNkGQk!E8E!NeOiB2IAS44J{J8vmB9KhDl7TMS z@#%NndHisXDG>2oryrZ|mku=T$G6g~8${$$;AP-i^br~XxEB3{xhahZDjC4>B1V%N z@6C~H0HoIvMj%LHTB1rT!?EZvYIOucf8GSp{u+{-xb!-7*U`bm^=5ClM)(}}%l@x% zq{r)b7FZQzFsU5~iDd5u-Ws<>^c4>Hb~I5k2BSVB>Zv+2C7Df6K*#AxH)GnDm@sgYD7;5AsxZpNK1u0*iy~4LN=H$4Jo%_BViP1#p;CaerdVvkcH^&@%|StUS< z%5Yv8{0^B`g>y5~EGY^-0X;LLl8pM&aYaq&V5y>$z7#)S0Cp46-kgt6%`r)xX+A=y zPPi91+B?0m8OlaiY4nbrb7s;~J1?0TE00CX z8SVhvrzN@dS;>m1n9NK_uG%6SK97At_F2lpPfZ_XA*3TW$TI~bwg0&$OngG={Bp`Q zCnhZcA%!IT!$d!^h+lJ61{jN+#^FR)`kBO#M&G?|<(PV{kn72Or_u^{XT8 zQ=D(PaA}K&zwbd#PLBETM}C~|y!6|7pfDaR<54b!XiEyFFYz5Edrl5Uw^gUf`K&x5 zUPC4tF^Pt5(ll*K@N#pN=Ml%pC%pXfE40q>>MK`6MlT_<>!K`cD-I8iSst%27QXxP zRqns<%El<@w5_<0XqQA}a!<_BSX)f8*|SK{a@1r@W~Rn5yO#U}o1?3;$(oubQDwC{ z#yN+ovTl~l>IJ(y7rDN7$ZWR5)vJf>?q0g+2F(Guc=0}d`M>;k zs%pV=U;P$uz5LG1@rnvnRdesXm-*cP_&m-lU;gs*+@ z<<%EZRjjqF*XuqiN|Q-cS*>m$qT!ysM==;UvJoEOD-7y*|dbYfQahd;0>` zR1<1toCHoBvyMa8Hx9>{&N>~*q^5{cQdgou#vmw1HxAj^nenH7;{ANz4}3rKS&cPN z*A@|nwHn`HKCifV=>o1@BkE~Zt5A$FielK_no*gG8#j)5`K6axuNroCws38OF^1J@ ziHPTcdoOZyxKCYM>UzePo_(HAf96+t;l-=W>upSJ3YsoSNUC|bn)rkP7k$Hh8}-fX zG^QEKvHxkA_mCHyERXoeN1xz*@B0Hh_m!u)e)U@%-#B31w3uqRUR|4*$b=tfti}e0 zmRVKdeMdtGmLNoHG$uZRcOIi2V=W?{Yp;d)QAIgA+~>P5zQQN}++&Ok-yu7g8Sszm7Q;Pyy2slRj^f2#F8478M6pK|E9f7L2su!}g8mzs|q; z_y38XdGe3(i~r#ZEVg#Qn9RIR3u@EoNy}9D?MF>%$eR~S1dYX&G`Z`OvNX{fIpvep zG4Fr>V_dql#eEN4;oU#g2a>Vw~_syT-BBt+Gc28<%9;k$FpBTOlL9c9ati z=72;l%S3Y&!BIDyH_2|(9Lgm1ErY?>5aAef@CDLDe_${YeL|%uA)Lhru#6S(E_8M{ zj}cGPtY}?JUDYEqqa$iblLYSeBc@YKQ*Ne2B=is^b>9g?S<1X4ec`>sdxxrv(Tj;f zjU!kURTDHLArL2E^dKl|ObDn5kx{2@#y6mC@Igip<1v+BaNySgC~ZSDWfXND@h)cK zlugf>jyd`6JQKR?$9GOxQr~bIZ9L`lJ9hT)U>`3EMhwFeBiiD3%D6qws%U(d{} zO-hQLRz^%BCPt>p+6qiXT?gL~{6a?|Bp`G-N)nY#Sln29Gro%uyxa zJgUtQLHQO`uqajq7q4q=6}2?Y6E+CEx0{5e2G1rVVgdW1m5G9#-9vdSjs~&^L*mzx9RD7>7NYDVhM_mY$#d&rX z3#Uqp_N*OhG#x#v#=#w}$Xhdp; zcDJ{9=xvvI?z!ig%@$O)>K&{Xhd7T|mkU>X=BSa8zleZI+>dUHkx&N)(JToLON%wZ zAqU4S7?r?7sqZyHoS@FLSk!p8?EOzS>YsV$8IErpa$)zroOLR&u;*SF8Yd>3$-aE^ z;<^!Ic()d8X>(_kou0SNuiDVx(o<9Q`FHH+G6nt zEyg$uCJ>1+x-zN}5Fa9?=(ro#P}SS0tPx{+2mQl8^d3}Ons&{6z8Lw0Vu|7o(coJ4 z5llKW!W@IAzwiwI^Yc%$y|_qKRl%&qxde4p(K-j#VNK{qA^~A=-W}+^H&Y@G5f^|E zKO~3~ARH1k!6~>?P18Y2GC{JEWsl@03P_dPLG4U8FZgJ*6W8u&2XY$9lO6jCG_r3`2`!su8^w zbbL^1mP$a3w=T(x?^UM-W?*5pZSZY_ZymGw7W3K)X>2wVXxwBx_7k_iz`&WM((#C= zr@q;!0h2PS2+lk3O4~HlwWX>pRj(GKXsJ)~d=Ewrgg+aI9*kg`d{<{bm!kZpwo#fzRPfBLr3+-ey2eC?QCsP)iy>eKFG+LUL*QibPO#S znWD~F6Tvwfj6jVW6(qi6WN4{ZfjF^|n4BVZnlX=(wvF7A3b*62>znZpDw}56oUICd zJ)tv0I+QU@Pq<6`UXp~(^_%LT37Tx1ffzvT9JbM+{2HgwU}A%@SH+q-Tt_uJYu%LI zP7*sU&pkPZzNTU7R+z7x)S$^~5lq`?GX5!qfZ+P#Om4(H;4#j=VX>aLGQ>O{OxRt;_ z2EmsANx>NWhW341s0>~3T8@sGx`-hF&^ut7((tu!8jwS=ualVcF`o2AKRvRj-SR0Br#sq=e zxMdnK-X>sd9{nWulma3?Y(CkXQ(Es4A>fE$HBoq_doEqvcNTur}TWoR~EzQP(yA7?I>%XQ`sF`s;7a_Yliljxj{4XkWHDtja!_Xq) zscek`v)O{CZMbsfVP>=0l=e`aG@qSsLMJ+@&PlQ)&UB(;O!1==>%u^Z3r<;M+1_5z zv<{#49f=RoUld+tIvOIz`9@G9eSv2RNT9YQ`Mzt}>{gIrLQZz``oeGW(j8w>&kShW zM~&7PW^v*plSTpEP!u}PPCsKN>}#>jvg7DwR4^h=pNdsGQQ`3L1pF!#`o+a20*6Wv zX-Cd!stPK(b58t&?QDEFI?xi@X-1+IV=%gkWAYnj6*MN!zzAwP?WfwH3ECAT^iFj8 zHtuWtm{7aIenMNA5np7JQE!qhH&2@M z(Uw*jVAudJib_jm=YjvyY4)6huxTQrW_`ow>a4SAy%d(y83EJH)I^8URp=(~s%&f2 zcb_BSCrPEw$7D?kHo5nUqN6EC_ z0k=Ccbt^YhrIlYeb>R|?*|iM4QC_(J{vE`(vBog0HiMc-OUITOAKPwxN_i(?YXl&3 z&Wy6_Zhm*yC6X+nG9;v7ptbEVAx1Y9dUV1za>N{emcC@$N zd75U)a^;yKxuVv~7^Kjo-D1^Z58baiLk5u1e>F#;9)**Wg`?IERnNh;PF=yu*vf zi;vM!pf>tQNtM3fFCteo6S+&zVjpFJ=VbXdTr2 z?=T_*;b-}GzxZXo|Ls@!wg3Hm=qK_n2-3B*O@nJ1T(iclR`}HtzdXjRmbB{=+VvXW zws_a#+7|B|&bbJJ44SGMQ@-%Iae>@hx5|3$Sgt**Wy|r=nxmEHE8lvJ?R($F-nAp< zv-!qkZL-2Z>bR5k%W>#`ZsBW}Sr;1x;tER_t0RT=^18nY>$c+O{_(H!5B|oF^4vFG z;_X*1anDwr_=V`CUDOmGTWJV=vaOGP0MjRAE^0zuRlNqd2ukZb&JUX5RarNVrd6(9 zyTSi?`G8}8nWvxmCbRigfjb(Tpwcv+^LgFGM3r=u51nl{vk^xn(&Zn97hh@kTR->T z_$xp4DD!&8xAym`>Nyt{6|Wzj;GE~=WQF&h#x9-OcmpH=M}|L zo6v=!3eGD{1M{sK=RB_QFf**Bre5rDbaH`jeD|1d{`S|{+P;U%+6uG+VZEj z+5CDo>1WK@0*~t&^#X^D%X(UCak9<7{g2+qjuy$gKCXZC$>1O zKroqltAJ_43K6#BjRY@YISlf~1? zxusJyBwa;6*X)7oPaD`ET^vhCVYG?abhJsaZQiIsjV7}k;{qyXpc)j#nm7@@&9+6-jlooc!47|T-FO1grJrpqHtd6{vjmxX;golHKNCPj$_-C(~r z%zvA#t29d1bUfa(=3?z<*>5KM%$@NOI$G6o+?r2fmh##6T8uBWuwd<`8U5b1tX4~G zRbh<C8^ztZr0Rw(2H`=HYf`j!vPnN27kz>H;PO zTBm`|Z31C3Gt~)G#B+3GpAUTCaX$S^|C+z~w||EDoVZ}_*tBejjy5bXqSIAI`iU`l zBUhd~XpxK?o%7T@Ve|20O~{Vd>5QU2yghTG!yD-0ki={>&6=m4`iFez!ylxwYtSXu z_H(dCDSrtN-4Mr@ob~DT0Nr5c$I(&gVH+FG(Z&@8bkz4+@G0FIQs)`IzWmZFQ(#o7 zs+ynw`G3jb;dMU#=bvCPm%i}3$;C}Ip|GM$wpQNQr%$;b)e2Lmv|Le}<^*GpRB+52 zv_p%*$uvyxqgJz(Wwf}u z3x$QKraTUlIDG@K$^XYbp|nJUP9;B0I7d{677|W2JXz&dJ$O+g+O{e7podzIWwF@e z>eT~&_V4`*c6WCYqOKI3YGK6a<{z*jPuR3xQi--Gfw{TbRyHx^X9u0Wdf8cV&uPG% zm08QnFTHZu)qK;NHO8>DwTpKh1GM=EPcm-ZOl9Qjs%}{Db`wRhp)32W2`7bkdg_+O zrcTQsjzG=^z2(mZB!zfL@38GM;#s@WjD+VwTJX&G=q2PkM${NR-n$I_w*9+t}uD zmSDz0wIgBQ%<;SlOj603P{ -#include "e_mod_main.h" -#include "e_mod_config.h" -#include "config.h" - -struct _E_Config_Dialog_Data -{ - int check_interval; - int show_text; - int show_graph; -}; - -/* Protos */ -static void *_create_data (E_Config_Dialog * cfd); -static void _free_data (E_Config_Dialog * cfd, E_Config_Dialog_Data * cfdata); -static Evas_Object *_basic_create_widgets (E_Config_Dialog * cfd, Evas * evas, - E_Config_Dialog_Data * cfdata); -static int _basic_apply_data (E_Config_Dialog * cfd, - E_Config_Dialog_Data * cfdata); -static void _fill_data (Cpu * c, E_Config_Dialog_Data * cfdata); - -/* Config Calls */ -void -_configure_cpu_module (E_Container * con, Cpu * c) -{ - E_Config_Dialog *cfd; - E_Config_Dialog_View *v; - 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/module.eap", e_module_dir_get (c->module)); - cfd = e_config_dialog_new (con, D_ ("Cpu Configuration"), "CPU", "_e_modules_cpu_config_dialog", buf, 0, v, c); - c->cfd = cfd; -} - -static void -_fill_data (Cpu * c, E_Config_Dialog_Data * cfdata) -{ - cfdata->check_interval = c->conf->check_interval; - cfdata->show_text = c->conf->show_text; - cfdata->show_graph = c->conf->show_graph; -} - -static void * -_create_data (E_Config_Dialog * cfd) -{ - E_Config_Dialog_Data *cfdata; - Cpu *c; - - c = cfd->data; - cfdata = E_NEW (E_Config_Dialog_Data, 1); - - _fill_data (c, cfdata); - return cfdata; -} - -static void -_free_data (E_Config_Dialog * cfd, E_Config_Dialog_Data * cfdata) -{ - Cpu *c; - - c = cfd->data; - c->cfd = NULL; - free (cfdata); -} - -static Evas_Object * -_basic_create_widgets (E_Config_Dialog * cfd, Evas * evas, - E_Config_Dialog_Data * cfdata) -{ - Evas_Object *o, *of, *ob; - Cpu *c; - - c = cfd->data; - - o = e_widget_list_add (evas, 0, 0); - of = e_widget_framelist_add (evas, D_ ("Cpu Settings"), 0); - ob = e_widget_check_add (evas, D_ ("Show Text"), (&(cfdata->show_text))); - e_widget_framelist_object_append (of, ob); - ob = e_widget_check_add (evas, D_ ("Show Graph"), (&(cfdata->show_graph))); - e_widget_framelist_object_append (of, ob); - - ob = e_widget_label_add (evas, D_ ("Check Interval:")); - e_widget_framelist_object_append (of, ob); - ob = - e_widget_slider_add (evas, 1, 0, _("%1.0f seconds"), 1, 60, 1, 0, NULL, - &(cfdata->check_interval), 150); - e_widget_framelist_object_append (of, ob); - 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) -{ - Cpu *c; - - c = cfd->data; - c->conf->check_interval = cfdata->check_interval; - c->conf->show_text = cfdata->show_text; - c->conf->show_graph = cfdata->show_graph; - e_config_save_queue (); - if (c->face->monitor) - ecore_timer_interval_set (c->face->monitor, - (double) cfdata->check_interval); - - return 1; -} diff --git a/e_mod_config.h b/e_mod_config.h deleted file mode 100644 index 96ab8cb..0000000 --- a/e_mod_config.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifdef E_TYPEDEFS -#else -#ifndef E_MOD_CONFIG_H -#define E_MOD_CONFIG_H - -#include "e_mod_main.h" - -void _configure_cpu_module(E_Container *con, Cpu *c); - -#endif -#endif diff --git a/e_mod_main.c b/e_mod_main.c index f36ad2b..7e360b2 100644 --- a/e_mod_main.c +++ b/e_mod_main.c @@ -1,8 +1,533 @@ #include #include "e_mod_main.h" -#include "e_mod_config.h" -#include "config.h" +typedef struct _Instance Instance; +typedef struct _Cpu Cpu; + +struct _Instance +{ + E_Gadcon_Client *gcc; + Cpu *cpu; + Ecore_Timer *timer; +}; + +struct _Cpu +{ + Instance *inst; + Evas_Object *o_icon; +}; + +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 Config_Item *_config_item_get(const char *id); +static int _set_cpu_load(void *data); +static int _get_cpu_count(void); +static int _get_cpu_load(void); +static void _button_cb_mouse_down(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _menu_cb_post(void *data, E_Menu *m); +static void _cpu_menu_fast(void *data, E_Menu *m, E_Menu_Item *mi); +static void _cpu_menu_medium(void *data, E_Menu *m, E_Menu_Item *mi); +static void _cpu_menu_normal(void *data, E_Menu *m, E_Menu_Item *mi); +static void _cpu_menu_slow(void *data, E_Menu *m, E_Menu_Item *mi); +static void _cpu_menu_very_slow(void *data, E_Menu *m, E_Menu_Item *mi); + +static E_Config_DD *conf_edd = NULL; +static E_Config_DD *conf_item_edd = NULL; + +Config *cpu_conf = NULL; + +static int cpu_count; +static int cpu_stats[4]; + +static const E_Gadcon_Client_Class _gc_class = +{ + GADCON_CLIENT_CLASS_VERSION, "cpu", + {_gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon} +}; + +static E_Gadcon_Client * +_gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) +{ + Cpu *cpu; + Instance *inst; + Config_Item *ci; + E_Gadcon_Client *gcc; + char buf[4096]; + + cpu_count = _get_cpu_count(); + + inst = E_NEW(Instance, 1); + + ci = _config_item_get(id); + if (!ci->id) + ci->id = evas_stringshare_add(id); + + cpu = E_NEW(Cpu, 1); + cpu->inst = inst; + + snprintf(buf, sizeof(buf), "%s/cpu.edj", + e_module_dir_get(cpu_conf->module)); + + cpu->o_icon = edje_object_add(gc->evas); + if (!e_theme_edje_object_set(cpu->o_icon, + "base/theme/modules/cpu", "modules/cpu/main")) + edje_object_file_set(cpu->o_icon, buf, "modules/cpu/main"); + evas_object_show(cpu->o_icon); + + gcc = e_gadcon_client_new(gc, name, id, style, cpu->o_icon); + gcc->data = inst; + inst->gcc = gcc; + inst->cpu = cpu; + + cpu_conf->instances = evas_list_append(cpu_conf->instances, inst); + + evas_object_event_callback_add(cpu->o_icon, EVAS_CALLBACK_MOUSE_DOWN, + _button_cb_mouse_down, inst); + + inst->timer = ecore_timer_add(ci->interval, _set_cpu_load, inst); + return gcc; +} + +static void +_gc_shutdown(E_Gadcon_Client *gcc) +{ + Instance *inst; + Cpu *cpu; + + inst = gcc->data; + cpu = inst->cpu; + + if (inst->timer) + ecore_timer_del(inst->timer); + if (cpu->o_icon) + evas_object_del(cpu->o_icon); + + cpu_conf->instances = evas_list_remove(cpu_conf->instances, inst); + E_FREE(cpu); + E_FREE(inst); +} + +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); +} + +static char * +_gc_label(void) +{ + return _("Cpu"); +} + +static Evas_Object * +_gc_icon(Evas *evas) +{ + Evas_Object *o; + char buf[4096]; + + if (!cpu_conf->module) return NULL; + + snprintf(buf, sizeof(buf), "%s/module.eap", + e_module_dir_get(cpu_conf->module)); + + o = edje_object_add(evas); + edje_object_file_set(o, buf, "icon"); + return o; +} + +static Config_Item * +_config_item_get(const char *id) +{ + Evas_List *l; + Config_Item *ci; + + for (l = cpu_conf->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->interval = 1; + + cpu_conf->items = evas_list_append(cpu_conf->items, ci); + return ci; +} + +static int +_set_cpu_load(void *data) +{ + Instance *inst; + Cpu *cpu; + int load, i = 0; + char str[100], str_tmp[100]; + + if (cpu_count == -1) return 0; + + inst = data; + if (!inst) return 1; + cpu = inst->cpu; + if (!cpu) return 1; + + _get_cpu_load(); + + snprintf(str, sizeof(str), "%d%%", cpu_stats[0]); + i = 1; + while (i < cpu_count) + { + snprintf(str_tmp, sizeof(str_tmp), " / %d%%", cpu_stats[i]); + strncat(str, str_tmp, sizeof(str)); + i++; + } + edje_object_part_text_set(cpu->o_icon, "load", str); + return 1; +} + +static int +_get_cpu_count(void) +{ + FILE *f; + char tmp[4]; + int cpu = -1; + + if (!(f = fopen("/proc/stat", "r"))) return cpu; + + while (fscanf(f, "cp%s %*u %*u %*u %*u %*u %*u %*u %*u\n", (char *) &tmp) == 1) + cpu++; + + fclose(f); + return cpu; +} + +static int +_get_cpu_load(void) +{ + FILE *stat; + static unsigned long old_u[4], old_n[4], old_s[4], old_i[4], old_wa[4], old_hi[4], old_si[4]; + unsigned long new_u, new_n, new_s, new_i, new_wa = 0, new_hi = 0, new_si = 0, ticks_past; + int tmp_u = 0, tmp_n = 0, tmp_s = 0; + char dummy[16]; + int i = 0; + + if (!(stat = fopen("/proc/stat", "r"))) return -1; + + while (i < cpu_count) + { + + if (fscanf(stat, "%s %lu %lu %lu %lu %lu %lu %lu", dummy, &new_u, &new_n, + &new_s, &new_i, &new_wa, &new_hi, &new_si) < 5) + { + fclose (stat); + return; + } + + ticks_past = ((new_u + new_n + new_s + new_i + new_wa + new_hi + new_si) - + (old_u[i] + old_n[i] + old_s[i] + old_i[i] + old_wa[i] + old_hi[i] + old_si[i])); + + if (ticks_past) + { + tmp_u = ((new_u - old_u[i])); + tmp_n = ((new_n - old_n[i])); + tmp_s = ((new_s - old_s[i])); + } + + cpu_stats[i] = (tmp_u + tmp_n + tmp_s) / cpu_count; + + old_u[i] = new_u; + old_n[i] = new_n; + old_s[i] = new_s; + old_wa[i] = new_wa; + old_hi[i] = new_hi; + old_si[i] = new_si; + + if (cpu_stats[i] >= 100) cpu_stats[i] = 100; + + i++; + } + fclose (stat); +} + +static void +_button_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) && (!cpu_conf->menu)) + { + E_Menu *mn; + E_Menu_Item *mi; + int cx, cy, cw, ch; + Evas_List *l; + char buf[256]; + Config_Item *ci; + + ci = _config_item_get(inst->gcc->id); + + mn = e_menu_new(); + cpu_conf->menu_interval = mn; + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Fast (0.5 sec)")); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (ci->interval <= 0.5) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _cpu_menu_fast, inst); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Medium (1 sec)")); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (ci->interval > 0.5) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _cpu_menu_medium, inst); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Normal (2 sec)")); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (ci->interval >= 2.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _cpu_menu_normal, inst); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Slow (5 sec)")); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (ci->interval >= 5.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _cpu_menu_slow, inst); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Very Slow (30 sec)")); + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + if (ci->interval >= 30.0) e_menu_item_toggle_set(mi, 1); + e_menu_item_callback_set(mi, _cpu_menu_very_slow, inst); + + mn = e_menu_new(); + cpu_conf->menu = mn; + e_menu_post_deactivate_callback_set(mn, _menu_cb_post, inst); + + mi = e_menu_item_new(mn); + e_menu_item_label_set(mi, _("Time Between Updates")); + e_menu_item_submenu_set(mi, cpu_conf->menu_interval); + + e_gadcon_client_util_menu_items_append(inst->gcc, mn, 0); + + e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &cx, &cy, &cw, &ch); + e_menu_activate_mouse(mn, + e_util_zone_current_get(e_manager_current_get()), + cx + ev->output.x, cy + 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 +_menu_cb_post(void *data, E_Menu *m) +{ + if (!cpu_conf->menu) return; + e_object_del(E_OBJECT(cpu_conf->menu)); + cpu_conf->menu = NULL; + if (cpu_conf->menu_interval) + e_object_del(E_OBJECT(cpu_conf->menu_interval)); + cpu_conf->menu_interval = NULL; +} + +static void +_cpu_menu_fast(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Instance *inst; + Config_Item *ci; + + inst = data; + ci = _config_item_get(inst->gcc->id); + + ci->interval = 0.5; + ecore_timer_del(inst->timer); + inst->timer = ecore_timer_add(ci->interval, _set_cpu_load, inst); + e_config_save_queue(); +} + +static void +_cpu_menu_medium(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Instance *inst; + Config_Item *ci; + + inst = data; + ci = _config_item_get(inst->gcc->id); + + ci->interval = 1.0; + ecore_timer_del(inst->timer); + inst->timer = ecore_timer_add(ci->interval, _set_cpu_load, inst); + e_config_save_queue(); +} + +static void +_cpu_menu_normal(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Instance *inst; + Config_Item *ci; + + inst = data; + ci = _config_item_get(inst->gcc->id); + + ci->interval = 2.0; + ecore_timer_del(inst->timer); + inst->timer = ecore_timer_add(ci->interval, _set_cpu_load, inst); + e_config_save_queue(); +} + +static void +_cpu_menu_slow(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Instance *inst; + Config_Item *ci; + + inst = data; + ci = _config_item_get(inst->gcc->id); + + ci->interval = 5.0; + ecore_timer_del(inst->timer); + inst->timer = ecore_timer_add(ci->interval, _set_cpu_load, inst); + e_config_save_queue(); +} + +static void +_cpu_menu_very_slow(void *data, E_Menu *m, E_Menu_Item *mi) +{ + Instance *inst; + Config_Item *ci; + + inst = data; + ci = _config_item_get(inst->gcc->id); + + ci->interval = 30.0; + ecore_timer_del(inst->timer); + inst->timer = ecore_timer_add(ci->interval, _set_cpu_load, inst); + e_config_save_queue(); +} + +EAPI E_Module_Api e_modapi = +{ + E_MODULE_API_VERSION, "Cpu" +}; + +EAPI void * +e_modapi_init(E_Module *m) +{ + conf_item_edd = E_CONFIG_DD_NEW("Cpu_Config_Item", Config_Item); + conf_edd = E_CONFIG_DD_NEW("Cpu_Config", Config); + + #undef T + #define T Config_Item + #undef D + #define D conf_item_edd + E_CONFIG_VAL(D, T, id, STR); + E_CONFIG_VAL(D, T, interval, DOUBLE); + + #undef T + #define T Config + #undef D + #define D conf_edd + E_CONFIG_LIST(D, T, items, conf_item_edd); + + cpu_conf = e_config_domain_load("module.cpu", conf_edd); + if (!cpu_conf) + { + Config_Item *ci; + + cpu_conf = E_NEW(Config, 1); + ci = E_NEW(Config_Item, 1); + ci->id = evas_stringshare_add("0"); + ci->interval = 1; + + cpu_conf->items = evas_list_append(cpu_conf->items, ci); + } + + cpu_conf->module = m; + e_gadcon_provider_register(&_gc_class); + return m; +} + +EAPI int +e_modapi_shutdown(E_Module *m) +{ + cpu_conf->module = NULL; + e_gadcon_provider_unregister(&_gc_class); + if (cpu_conf->config_dialog) + e_object_del(E_OBJECT(cpu_conf->config_dialog)); + if (cpu_conf->menu) + { + e_menu_post_deactivate_callback_set(cpu_conf->menu, NULL, NULL); + e_object_del(E_OBJECT(cpu_conf->menu)); + cpu_conf->menu = NULL; + } + + while(cpu_conf->items) + { + Config_Item *ci; + + ci = cpu_conf->items->data; + if (ci->id) + evas_stringshare_del(ci->id); + cpu_conf->items = evas_list_remove_list(cpu_conf->items, cpu_conf->items); + E_FREE(ci); + } + + E_FREE(cpu_conf); + E_CONFIG_DD_FREE(conf_item_edd); + E_CONFIG_DD_FREE(conf_edd); + return 1; +} + +EAPI int +e_modapi_save(E_Module *m) +{ + Evas_List *l; + + for (l = cpu_conf->instances; l; l = l->next) + { + Instance *inst; + Config_Item *ci; + + inst = l->data; + ci = _config_item_get(inst->gcc->id); + if (ci->id) + evas_stringshare_del(ci->id); + ci->id = evas_stringshare_add(inst->gcc->id); + } + e_config_domain_save("module.cpu", conf_edd, cpu_conf); + return 1; +} + +EAPI int +e_modapi_about(E_Module *m) +{ + e_module_dialog_show (m, _("Enlightenment Cpu Monitor Module"), + _("This module is used to monitor cpu load.")); + return 1; +} + + + + + + + + + + + +/* static Cpu *_cpu_init (E_Module * m); static void _cpu_shutdown (Cpu * n); static void _cpu_config_menu_new (Cpu * n); @@ -19,205 +544,13 @@ static void _cpu_face_cb_menu_edit (void *data, E_Menu * mn, E_Menu_Item * mi); static void _cpu_face_cb_menu_configure (void *data, E_Menu * mn, E_Menu_Item * mi); -static int _cpu_face_update_values (void *data); static int _cpu_face_get_cpu_count (Cpu_Face * cf); static void _cpu_face_get_load (Cpu_Face * cf); static void _cpu_face_graph_values (Cpu_Face * cf); static void _cpu_face_graph_clear (Cpu_Face * cf); static int cpu_count; -static int cpu_stats[4]; -EAPI E_Module_Api e_modapi = { - E_MODULE_API_VERSION, - "Cpu" -}; - -EAPI void * -e_modapi_init (E_Module * m) -{ - Cpu *c; - - /* Set up module's message catalogue */ - bindtextdomain (PACKAGE, LOCALEDIR); - bind_textdomain_codeset (PACKAGE, "UTF-8"); - - c = _cpu_init (m); - if (!c) - return NULL; - c->module = m; - return c; -} - -EAPI int -e_modapi_shutdown (E_Module * m) -{ - Cpu *c; - - c = m->data; - if (!c) - return 0; - - if (c->cfd) - { - e_object_del (E_OBJECT (c->cfd)); - c->cfd = NULL; - } - _cpu_shutdown (c); - return 1; -} - -EAPI int -e_modapi_save (E_Module * m) -{ - Cpu *c; - - c = m->data; - if (!c) - return 0; - e_config_domain_save ("module.cpu", c->conf_edd, c->conf); - return 1; -} - -EAPI int -e_modapi_about (E_Module * m) -{ - e_module_dialog_show (m, D_ ("Enlightenment Cpu Monitor Module"), - D_ ("This module is used to monitor a cpu.")); - return 1; -} - -EAPI int -e_modapi_config (E_Module * m) -{ - Cpu *c; - E_Container *con; - - c = m->data; - if (!c) - return 0; - if (!c->face) - return 0; - - con = e_container_current_get (e_manager_current_get ()); - if (c->face->con == con) - _configure_cpu_module (con, c); - - return 1; -} - -static Cpu * -_cpu_init (E_Module * m) -{ - Cpu *c; - E_Menu_Item *mi; - Evas_List *mans, *l, *l2; - - c = E_NEW (Cpu, 1); - - if (!c) - return NULL; - - c->conf_edd = E_CONFIG_DD_NEW ("Cpu_Config", Config); -#undef T -#undef D -#define T Config -#define D c->conf_edd - E_CONFIG_VAL (D, T, check_interval, INT); - E_CONFIG_VAL (D, T, show_text, INT); - E_CONFIG_VAL (D, T, show_graph, INT); - - c->conf = e_config_domain_load ("module.cpu", c->conf_edd); - if (!c->conf) - { - c->conf = E_NEW (Config, 1); - - c->conf->check_interval = 1; - c->conf->show_text = 1; - c->conf->show_graph = 1; - } - E_CONFIG_LIMIT (c->conf->check_interval, 0, 60); - E_CONFIG_LIMIT (c->conf->show_text, 0, 1); - E_CONFIG_LIMIT (c->conf->show_graph, 0, 1); - - _cpu_config_menu_new (c); - - mans = e_manager_list (); - for (l = mans; l; l = l->next) - { - E_Manager *man; - - man = l->data; - for (l2 = man->containers; l2; l2 = l2->next) - { - E_Container *con; - Cpu_Face *cf; - - con = l2->data; - cf = E_NEW (Cpu_Face, 1); - - if (cf) - { - cf->conf_face_edd = - E_CONFIG_DD_NEW ("Cpu_Face_Config", Config_Face); - -#undef T -#undef D -#define T Config_Face -#define D cf->conf_face_edd - E_CONFIG_VAL (D, T, enabled, UCHAR); - - c->face = cf; - cf->cpu = c; - cf->con = con; - cf->evas = con->bg_evas; - - cf->conf = E_NEW (Config_Face, 1); - - cf->conf->enabled = 1; - - if (!_cpu_face_init (cf)) - return NULL; - - _cpu_face_menu_new (cf); - - mi = e_menu_item_new (c->config_menu); - e_menu_item_label_set (mi, _("Configuration")); - e_menu_item_callback_set (mi, _cpu_face_cb_menu_configure, cf); - - mi = e_menu_item_new (c->config_menu); - e_menu_item_label_set (mi, con->name); - e_menu_item_submenu_set (mi, cf->menu); - - if (!cf->conf->enabled) - _cpu_face_disable (cf); - else - _cpu_face_enable (cf); - } - } - } - return c; -} - -static void -_cpu_shutdown (Cpu * c) -{ - _cpu_face_free (c->face); - - c->module = NULL; - E_FREE (c->conf); - E_CONFIG_DD_FREE (c->conf_edd); - E_FREE (c); -} - -static void -_cpu_config_menu_new (Cpu * c) -{ - E_Menu *mn; - - mn = e_menu_new (); - c->config_menu = mn; -} static int _cpu_face_init (Cpu_Face * cf) @@ -246,19 +579,6 @@ _cpu_face_init (Cpu_Face * cf) evas_object_color_set (o, 255, 255, 255, 255); evas_object_show (o); - o = edje_object_add (cf->evas); - cf->txt_obj = o; - if (!e_theme_edje_object_set - (o, "base/theme/modules/cpu", "modules/cpu/text")) - { - snprintf (buf, sizeof (buf), PACKAGE_DATA_DIR "/cpu.edj"); - edje_object_file_set (o, buf, "modules/cpu/text"); - } - evas_object_layer_set (o, 2); - evas_object_repeat_events_set (o, 0); - evas_object_pass_events_set (o, 1); - evas_object_color_set (o, 255, 255, 255, 255); - evas_object_show (o); o = evas_object_rectangle_add (cf->evas); cf->event_obj = o; @@ -309,258 +629,6 @@ _cpu_face_menu_new (Cpu_Face * cf) e_menu_item_callback_set (mi, _cpu_face_cb_menu_edit, cf); } -static void -_cpu_face_enable (Cpu_Face * cf) -{ - cf->conf->enabled = 1; - e_config_save_queue (); - evas_object_show (cf->cpu_obj); - evas_object_show (cf->event_obj); - if (cf->cpu->conf->show_graph) - evas_object_show (cf->chart_obj); - if (cf->cpu->conf->show_text) - evas_object_show (cf->txt_obj); -} - -static void -_cpu_face_disable (Cpu_Face * cf) -{ - cf->conf->enabled = 0; - e_config_save_queue (); - evas_object_hide (cf->event_obj); - evas_object_hide (cf->chart_obj); - evas_object_hide (cf->cpu_obj); - evas_object_hide (cf->txt_obj); -} - -static void -_cpu_face_free (Cpu_Face * cf) -{ - if (cf->monitor) - ecore_timer_del (cf->monitor); - if (cf->menu) - e_object_del (E_OBJECT (cf->menu)); - if (cf->event_obj) - evas_object_del (cf->event_obj); - if (cf->cpu_obj) - evas_object_del (cf->cpu_obj); - if (cf->old_values) - _cpu_face_graph_clear (cf); - if (cf->chart_obj) - evas_object_del (cf->chart_obj); - if (cf->txt_obj) - evas_object_del (cf->txt_obj); - - if (cf->gmc) - { - e_gadman_client_save (cf->gmc); - e_object_del (E_OBJECT (cf->gmc)); - } - - E_FREE (cf->conf); - E_FREE (cf); - cpu_count--; -} - -static void -_cpu_face_cb_gmc_change (void *data, E_Gadman_Client * gmc, - E_Gadman_Change change) -{ - Cpu_Face *cf; - Evas_Coord x, y, w, h; - - cf = data; - switch (change) - { - case E_GADMAN_CHANGE_MOVE_RESIZE: - e_gadman_client_geometry_get (cf->gmc, &x, &y, &w, &h); - evas_object_move (cf->chart_obj, x, y); - evas_object_move (cf->event_obj, x, y); - evas_object_move (cf->cpu_obj, x, y); - evas_object_move (cf->txt_obj, x, y); - evas_object_resize (cf->chart_obj, w, h); - evas_object_resize (cf->event_obj, w, h); - evas_object_resize (cf->cpu_obj, w, h); - evas_object_resize (cf->txt_obj, w, h); - _cpu_face_graph_clear (cf); - break; - case E_GADMAN_CHANGE_RAISE: - evas_object_raise (cf->cpu_obj); - evas_object_raise (cf->chart_obj); - evas_object_raise (cf->event_obj); - evas_object_raise (cf->txt_obj); - break; - default: - break; - } -} - -static void -_cpu_face_cb_mouse_down (void *data, Evas * evas, Evas_Object * obj, - void *event_info) -{ - Cpu_Face *cf; - Evas_Event_Mouse_Down *ev; - - ev = event_info; - cf = data; - if (ev->button == 3) - { - e_menu_activate_mouse (cf->menu, e_zone_current_get (cf->con), - ev->output.x, ev->output.y, 1, 1, - E_MENU_POP_DIRECTION_DOWN, ev->timestamp); - e_util_container_fake_mouse_up_all_later (cf->con); - } -} - -static void -_cpu_face_cb_menu_edit (void *data, E_Menu * mn, E_Menu_Item * mi) -{ - Cpu_Face *cf; - - cf = data; - e_gadman_mode_set (cf->gmc->gadman, E_GADMAN_MODE_EDIT); -} - -static void -_cpu_face_cb_menu_configure (void *data, E_Menu * mn, E_Menu_Item * mi) -{ - Cpu_Face *cf; - - cf = data; - _configure_cpu_module (cf->con, cf->cpu); -} - -static int -_cpu_face_update_values (void *data) -{ - Cpu_Face *cf; - char str[100]; - int i = 0; - char str_tmp[100]; - - cf = data; - _cpu_face_get_load (cf); - - if (cpu_stats[0] == -1) - return 1; - - if (cf->cpu->conf->show_text) - { - snprintf (str, sizeof (str), "%d%%", cpu_stats[0]); - i = 1; - while (i < cpu_count) - { - snprintf (str_tmp, sizeof (str_tmp), " / %d%%", cpu_stats[i]); - strncat (str, str_tmp, sizeof (str)); - i++; - } - edje_object_part_text_set (cf->txt_obj, "in-text", str); - } - else - edje_object_part_text_set (cf->txt_obj, "in-text", ""); - - if ((cf->cpu->conf->show_graph) - && (edje_object_part_exists (cf->cpu_obj, "lines"))) - _cpu_face_graph_values (cf); - else - _cpu_face_graph_clear (cf); - - return 1; -} - -static int -_cpu_face_get_cpu_count (Cpu_Face * cf) -{ - char tmp[4]; - FILE *f; - int cpu = -1; - - if (!(f = fopen ("/proc/stat", "r"))) - return -1; - - while (fscanf (f, "cp%s %*u %*u %*u %*u %*u %*u %*u %*u\n", (char *) &tmp) - == 1) - cpu++; - - fclose (f); - return cpu; -} - -static void -_cpu_face_get_load (Cpu_Face * cf) -{ - static unsigned long old_u[4], old_n[4], old_s[4], old_i[4], old_wa[4], - old_hi[4], old_si[4]; - unsigned long new_u, new_n, new_s, new_i, new_wa = 0, new_hi = 0, new_si = - 0, ticks_past; - int tmp_u, tmp_n, tmp_s, tmp_i; - char dummy[16]; - FILE *stat; - int cpu_count; - Edje_Message_Float msg; - - cpu_count = _cpu_face_get_cpu_count (cf); - if (cpu_count == -1) - return; - - if (!(stat = fopen ("/proc/stat", "r"))) - return; - - int i = 0; - - while (i < cpu_count) - { - - if (fscanf - (stat, "%s %lu %lu %lu %lu %lu %lu %lu", dummy, &new_u, &new_n, - &new_s, &new_i, &new_wa, &new_hi, &new_si) < 5) - { - fclose (stat); - return; - } - - ticks_past = - ((new_u + new_n + new_s + new_i + new_wa + new_hi + new_si) - - (old_u[i] + old_n[i] + old_s[i] + old_i[i] + old_wa[i] + old_hi[i] + - old_si[i])); - - if (ticks_past) - { - tmp_u = ((new_u - old_u[i])); - tmp_n = ((new_n - old_n[i])); - tmp_s = ((new_s - old_s[i])); - tmp_i = ((new_i - old_i[i])); - } - else - { - tmp_u = 0; - tmp_n = 0; - tmp_s = 0; - tmp_i = 0; - } - - /* Update the values */ - cpu_stats[i] = (tmp_u + tmp_n + tmp_s) / cpu_count; - - old_u[i] = new_u; - old_n[i] = new_n; - old_s[i] = new_s; - old_i[i] = new_i; - old_wa[i] = new_wa; - old_hi[i] = new_hi; - old_si[i] = new_si; - - if (cpu_stats[i] >= 100) - cpu_stats[i] = 100; - - msg.val = cpu_stats[i]; - edje_object_message_send (cf->cpu_obj, EDJE_MESSAGE_FLOAT, i, &msg); - - i++; - } - fclose (stat); -} static void _cpu_face_graph_values (Cpu_Face * cf) @@ -666,3 +734,5 @@ _cpu_face_graph_clear (Cpu_Face * cf) evas_event_thaw (cf->evas); } + +*/ diff --git a/e_mod_main.h b/e_mod_main.h index d8b1c7f..4bc1ecb 100644 --- a/e_mod_main.h +++ b/e_mod_main.h @@ -1,62 +1,33 @@ -#define D_(str) dgettext(PACKAGE, str) - #ifndef E_MOD_MAIN_H #define E_MOD_MAIN_H typedef struct _Config Config; -typedef struct _Config_Face Config_Face; -typedef struct _Cpu Cpu; -typedef struct _Cpu_Face Cpu_Face; +typedef struct _Config_Item Config_Item; -struct _Config +struct _Config { - int check_interval; - int show_text; - int show_graph; + E_Module *module; + E_Config_Dialog *config_dialog; + E_Menu *menu, *menu_interval; + Evas_List *instances; + Evas_List *items; }; -struct _Config_Face +struct _Config_Item { - unsigned char enabled; -}; - -struct _Cpu -{ - E_Menu *config_menu; - Cpu_Face *face; - Config *conf; - E_Module *module; - E_Config_DD *conf_edd; - E_Config_Dialog *cfd; -}; - -struct _Cpu_Face -{ - Evas *evas; - E_Container *con; - E_Menu *menu; - Cpu *cpu; - Evas_List *old_values[4]; - - Config_Face *conf; - E_Config_DD *conf_face_edd; - - Evas_Object *cpu_obj; - Evas_Object *event_obj; - Evas_Object *chart_obj; - Evas_Object *txt_obj; - - Ecore_Timer *monitor; - - E_Gadman_Client *gmc; + const char *id; + double interval; }; EAPI extern E_Module_Api e_modapi; -EAPI void *e_modapi_init(E_Module *m); -EAPI int e_modapi_shutdown(E_Module *m); -EAPI int e_modapi_save(E_Module *m); -EAPI int e_modapi_about(E_Module *m); -EAPI int e_modapi_config(E_Module *m); +EAPI void *e_modapi_init (E_Module *m); +EAPI int e_modapi_shutdown (E_Module *m); +EAPI int e_modapi_save (E_Module *m); +EAPI int e_modapi_about (E_Module *m); + +//void _config_cpu_module (Config_Item *ci); + +extern Config *cpu_conf; #endif diff --git a/module.eap b/module.eap index 9c54e5267f7c266fc2cdb32667e33d73b611958c..8b893424cd9f340d452ebd4ce404792579415152 100644 GIT binary patch delta 6159 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 Vnk}q#{T@sZdm`(xYj(V!{|{v@%|rkI