From d3b055925b0eeea2eaa5cc7ca1933d188d611d0b Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 12 Feb 2016 18:53:03 -0500 Subject: [PATCH] wifi --- edc/lock_insecure.png | Bin 0 -> 8014 bytes edc/lock_locked.png | Bin 0 -> 7054 bytes edc/wifi_shadow.png | Bin 0 -> 3932 bytes edc/wireless.edc | 84 +++++------ src/gadgets/bryce.c | 26 +++- src/gadgets/core.c | 10 ++ src/gadgets/demo.c | 2 + src/gadgets/wireless/connman.c | 239 ++++++++++++++++++++++---------- src/gadgets/wireless/mod.c | 9 ++ src/gadgets/wireless/wireless.c | 220 +++++++++++++++++++++-------- src/gadgets/wireless/wireless.h | 84 ++++++++--- 11 files changed, 471 insertions(+), 203 deletions(-) create mode 100644 edc/lock_insecure.png create mode 100644 edc/lock_locked.png create mode 100644 edc/wifi_shadow.png diff --git a/edc/lock_insecure.png b/edc/lock_insecure.png new file mode 100644 index 0000000000000000000000000000000000000000..ddafaf7bf19701a2a1bf043414a3012ca8089dbc GIT binary patch literal 8014 zcmd6MWm6nX(=}NfLU0JSxCav4eUXLW?yzid4T}WV;O-FI9fG@CumlaVXmGz++#c@t zSG---(^XylWlr~;nwb-!rXr7nMUI7pgoFcD0BO9&!dK71Kzm(H!rL!j0~$n09)v`W zM219G6o+E*n!$8d(04^b!Y2Hmzd_3U@%}Z54g)L8qHh4+67vf&ePyIXLISRUK~h?t z%O~0X@l=c2dlGxAr+!YByyV~o!GsS>E;O+TOOv?K1PT~y=k!Y`81dXoUo;KBq)L!D zqgFI)V0RD=hj6%$&wU3BkVpi9>t*Z9*vw@#XwBbPX@dE&z~;fB+0?NPOXMRKPw!(a zce_rz_l~Jsa(5@K<|Sxp-hv+@eR1 zDcp+N(#QZ1t9dwu{lk64a^iLvk0eovuagPl>h*RV5!i=zx-r2U`D`F>`l>d{`LGlf6eZkT1frwosVHV{flMEmB8a z-df(08B!WL3fF!^-Kf{oTgvX^hjo@aSh{!ajf*7jeA?Q`CX#f)&9v3((E15vY4{I@ zdqTQzhFOi(h@ntzJuj0raVa0Bwv?GHj>s$xIi}7 z47HCu2uCfH=8YRY(jmT!yf26XnKT;U@d*oA6Z~r`@q&Ax8a+Ntm5Bm>f#8pA5HV2= zQB6oci>Q0Z+mPb8^){zF>X*kW_uYfDffK(CIS@O%`JvXm^G?iP-RB7R!ykq%Fio?f zT^=O7SrSzkbBOyx5XW2m>)vXS#h6v-*lm9up*-lv0VVNe6NtAIL&aR>K#?UGvgvf% zem}wNx82g`L~eH*+-tJI2fy(ktf(w;^xIoM^&GDSI>hKimq`V)bT8dN8SXwkki zus08%M4YFc4(3+MByC5hWejlt&FI|aDg8Yw11p!J#jkf@(Pk-Bvjv++T|TvSnB37@ ziC?VwZYUj*uVYWd`S!%>y=>1|y_}m;Jv2GB!AbTW3^YJshi05&Vj@XB+nJ{6AJSGU zL>ieAGefkwGHXlT`5|=F=?EXLP40)Ky0+yYsYwu)r7A`MKQW2NU0qlCHtQkH zGOOlxcV94dmce7zim2x(|8os`W)*=yu5l z_%wP9+`#!Ccyb?oT;`PwT?~GN6Asxt2)t6*Y3}{X!-GKA$sYa_`MHi61ycQUZ0VWb zHb>$0Bx}{>Z*+&laY!JiEUcA1gJ62WeFEA^S+r&J)u6oNbyK=AEmxiG(4a~eCQEf<5vtm40?3jBDp{;1Te*&Eh@ z_q%>5u4j+Ks9K6mivqdU~qTrPDH*(|XS=jv(VQ2webF3**RXf)434EO-xjNoKepjk+&`Vd8}D zCJ!!oZ@NiuaXlYZnVS(#%$2g`xp42O)=V?>=xJw3ugMaDecPG`5WdHUcIK>-$N% z7)*x{&-u8nGwj}@K;u!zUY+23<5+GXPo1>bVM;tGc>@PXZcarxORshP8Rt;2pP z8;Qq|MB094h!2R&2le-l_+1Sh8MJk^-VaNBto6OZQY0#D3R?IvEJ956!6Cc7X40lg zArYUE#M_Ddd-fu{tJ|CT-4h}P6r{HpMt4=N2D^i4EIyQIuIH9lOyy^DR20Z>{;(A} zPM69gE&>)kf>4HLJY9KVJ7+Hls%+mIQOz)RT1p z^<0qsS+snr=0<}OhrcB~q2dk}tWwg+B;lv&j#*bKSL^ROv099kavvuvM;?A#FSd*^ zkR6p5RWxLF_iMp;66}ZA=$i7RG|2y28$Pc-^iX?JozwTKY#@vHAA3j?L~a_h=_P43 z4T88&@MV(Z)EXDR91N<+dgzM?suQnV44gf&u!bIgNEP>(_K3Nm#W27&7@AwO+*&F> z{5;GNdw{m2Lt9NN8xx&GV?bqpH%Jjs2;ZztdUj{6y=x|pR%lbKVl&fWwpn@?UOxzl zXbOf!&+8EnV;B)|LEN4^IKV}Z#?2|70v7d`4_Opn*T>^5@C zimlTKJgZvT@x-Hj?@;F12%FmXAztletswBcQ^0C575VB~bQD$8%_jpZ&}*Vtv9cDh zhwVdEwcD4&*d(-H_S06WST-G{$mmS z&wAMk*pK%sKDNpB>hZk`aaFqSo%~4n3-(%-eS_YS0ymnfFXd9qfY3k2CCkpQ$3s+v z7S{!Z^~NdDlWC{fhgt}Xum=I3b&0J!Gd7!~aMh+(e$Vv5+6=VoKBXEZiieF%8;qob z^m3B4*ns7wXhDRN&m}$F4T#i@e!F&EnVUfg9{yYKNB3lyig0?>aRR!!bzP96@I^tL zE?+@Iou1oszt+Pej2h*dX7jAM=WdD_g3TpKp|fI$W*Jg4A&$SO8G=2#{^Y8P{1G`dfFj^&p!T`PCMFxMS0t{JdjDvDJS+-m7&;ybQ>FX3 zf~zVTb4v!*NN5j>EDUJR1K5`4rbFz11!yJ3wbA6$e9^;hr3c1WfEp!@5a@$VvXGKvki zSGxIcPW|6PHoRYbs^k)zo2(^1@_TZzt1V_m4mig~OfrgfFf5#1Q9z*mZaG00)_00e z_M(WxCC{qnG^^JvtM%hk*|{Ii+xU{c>fEU)JExB_iIdoPyjwUK5utc(!*68yDwwRA{4r!VZDbQR(^fDBOBX z3Mr|qQX-hVMn>DzAr89J^2}wBHG(1g094KJAWbg#_^?dy zo-num>n6(u1p~C=2ATmEWYE@VG^O$6kj#E8tTYf_)zYLb9f$eNIC)euo7ua3ofAFFCoq+K3VqN!UPQp zDOR#xIbBTKO;EhzsLUw=0 zucWpJolLk*zc%emxgAS?&C%leAcKkxYYiEPnlQ*|Hb|WvHQ%8B7bdhK>z9|fJX4Yj zyD(=`nfrLE8UYrD4Y4enI-5&{YxGOOI^pZ#IcQ|5b|(|$9CS?o4MmW^i1rI4%V^Np zB1f(Hc)*J%%QytTp6`zo4G#Xee4bVO($_8oUna-`^YWAKjY7E{@rmI&qh@64Qf!G8 z&G999Y`wKY3+tuPC3uzh7M1^NQ#_J?d4c#%@e&H66GtX||-yUPY zKL|v1#^V{RriWk+uFjSJ$r{FRJ*TtpjH-X*WXkL&@YPcsV|6v*E2!Ua+GhPO5A*PV zkwAA4U}p0*qv=TWu>M?yX`3V{1p{a69STS+fk28g(KBoF6dTW(GR|>p;`l^d!c81} zTvQ-m5e{a%FgNb!7`XI!ecOE-HsjOTFl*floo7&LKw4{pMCn z_sok~DAz>^VoC?0l-_4f(Me@}_+GTd-_W$ym0z*S5TunnUtej`cw_DRlqJ3})d|DT z)ARIfzdsyVgFV`fT=QL>lW#QjIvkDqsovaq^a3ovT@)eiiJ>cSWTYpUlNP)SIF{(5 zRA_9#xLW3wf{t=z`;^U&iTgV6LhrM{RWdXW49WFgJ8}LXC(nV1=kDOB`eoo7Y2W)I zqnB*|W$*K~?B^8K9P8ZY|3n1RHHClbs=hJp3K09?7(Q-GT%$fwVk}+3R(UW!(qgmV zD*)oh{dPvSl8gL&lg{D!-cu6fIIlKwZTjT2)^dU)@zAPl#P=JI{HliLi+|~|+e^V( z^9^5Ax^c(X!vrxBLk|h&yDP1mZ@!DyIj5O+%4n!@b_0l`GuEVwuS{j8$!VPu;6A>o zUsBq>L(NpWzV2IDrvB1QwFdY&O(NAwE$K;wpkT05=2)8V;@H+^9MD+w3bFRy;spTD zTp8uR+EZ)fNODo?Sj?XEyuiKfZU2qC>ywi9@_Pij-trMoI!2S8mo6LnS#fSP@Tpep zMBs5_5tr6}HM%@)Or_qq_FF8hZ!I-CgHGaU^e9;edUwyzUxZ4sR+=q^L$G z=bIoPZeqWzH2-RK(%~d{qT-ulM|rs1^F-!#l@a|>vMPf5{(M5_;#Su`Da~i3fJ7E% z9gMFIL4xRp8KhX-6t7G|mzA@Q<3?|PgfUf!lJLCI zC;}^}5Qy20fVDjid3$hh{^(rzV8W7d!*8~uv99HA#%XGJ4moZZIDM9kK1mD1^*@BU zoY)n=a5$-#GX+;IC-tT7jt})bT|EUqh@ZR1O`6P5X2$#+7?Jl}Lw)ost#BHL`fQd% zITOR_`^7Wg@1ZXz#dUqTs9n2sf%AL&UnMSb=nFpV51jYKo#?flP5UJa`tbd>a!bFE z_GHhB<+b8A853+hy_B9Br`@Qjr@?K8`RE!6UNeSD38)j1N>`<^K^oBa#RkMrP)!DQ zh2obiCpIEfVrs(no0n4Sxx295Xu|_;!#KBuT}3-sYhD|R7yZ+Ye?q7+CDbJCAD>PN zAIqrM*`3Z5^=J+S{psfC;poXao4>Nm9z%Sf5E{Dn2z_U7`BU$1{Ol=c=YP&2$^YsS zQc2YRTtPtyAJNtrBBpz1CW~R7K6M=)5B^x0cC>gEx)Me$lrB8ncYw>@6@4m#&VQq8 zh@CK(#OfO}YUJ)TS67^o5PCg2$k$R-S!ja|&Smy5Y9ZEA;gqK+3zczrFR6ki&FL>_ z=PFI_N7JIU$ZSeOrQQJx(0d`g+V*s%2Qza(T>=ZQn$`ds!(*1?%RSeO(?7oTcaNW$ z6V6BuN|aF+<{^{N&PPv!L^k={n4vm-5*!QpSf$Z{ECuzV76;nnzXEfO*N~AZKK^Zj zbK(uDjhNmSz?us_{Q0E*=sA>Snr%}g$t5Z;y+3P+Yb%;Tsbc8oQUlfG%){K@XO^y` zA2f}))1q^tSHI6vK0fbZ&nW+=@tcd=FJ0^Dka+rDt}5v<8+7A&ik(W8K8}`J`8_Gl%pYRA3yaJ z|5*>d6tv0Ta_B``rrQ}nJKv`vZSFEb@$n+W^_o;9q9gwlRI1H}C-01JD0DTfIH8i8ah(FiA&IL2_W)-U;N%6Iaz830Izp#o2-Q9p{Akg zUfEA)3mf9ooypjn8}C_hAueYd*#7@*v**4fH4xSml|5s&03OMwl*@dn&V@F*r(#!G zpopv@m-ApNdik*`L2umUEyQ^NlHut8*uRC4JoxuWF`CnPndfG@i2A<_H1HJdKLuZE zSd^WdRi{4LAB%?QY*LREOZTlDK1(E!KtWJbP*}Jfsz&k7p0`MT&0=U9H(9RLYF}n& zx+b!ZH!fPFQfL?&y%`4A@E&N`RWu#j$29IK>$p~!!y^1(hYSA$sA?VoxuOu{8?<6> z5a?ob!AS3ZR@`oT!oGuEE7~8!Cu1wV=hck;KEaodVAEESmzVK zeWzh^LVvbKI7X74HlerCq`8z^efB&JEM^F5P%NlPvE1(dH#yUyUF)3qd)8^XOm zBVe(<67yt`rI8k#c`y2Iuuo~Oyn|Dt-(-}gI(Qb8KNLX{?lw3T0*iY}x;+kzc_G#3 z7I*StD4wJ|JRbJ%wen(RfY@AxvB=rQ;w6y6za8&LGRm<^3ss;hvk8{3Rg+Y5@5T!{ z{+Qf!$Cn#$v(qjrT|IM@ygP$~!Cxwmq#6+fldO{@;0WWkd{TBZPw10W-)YwF7%;T*RP|G7bXoBHm+u;)2GY=7wY$F-t90*vsjqM5XYuLxuo`h%SP7_zuQb1i%X%Pw zfe$R}YVS@!J>hmuC+HEc^ynx%0YtK_A9;C`eX#ii5ZMVAPN3Bj5Pgq&`JG?VT2rN< zB5#cjjn1a&ud6g)L94qxy?chFg*l>uue3vk-)^9aLK{<$cY=zYh8%=DI2Gk6qf|-E zh1D!mC$$0|Ivcj!TY`P9gtCd|I_sMnyP1biAbvx_4;iG$VXWm_k`-FyMGD2MT56Y# zTHt&OhUK!E4cQu?ceg9!Ms*-oNqM3zmQ+(ZDr7xEdbxAZKI89oT_`R8?0{)Ip#%(S z#1?5a)+!quJ1ekx9C#q)8&P6Y>?1P<*-EVh!PYjYKJovf7A` zIjuTaRnk%*lO(>7Nbp#4u{_a}<@aqv?Izu0Yg*pP>G0m=x>yJh_H0kD&P+Pr^MULm zI=C%0eUAudouK*jdvu}|A`!}M!rzG)-`0=t^wT4IwKS|3>NfLL=EBq1-dE)t2`sAu Js*yGe`ad|=yjK7K literal 0 HcmV?d00001 diff --git a/edc/lock_locked.png b/edc/lock_locked.png new file mode 100644 index 0000000000000000000000000000000000000000..91d3ad8929ad13e021f5513eadcf6ef007b155ed GIT binary patch literal 7054 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 aJb9P$^xSBKOaJlb3`0Xj2UwwG6Z$`+ES~KE literal 0 HcmV?d00001 diff --git a/edc/wifi_shadow.png b/edc/wifi_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..b1dc20f54dd1e22e53b3e03ba5d664a8780ec6e3 GIT binary patch literal 3932 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 literal 0 HcmV?d00001 diff --git a/edc/wireless.edc b/edc/wireless.edc index 644c043..9d8a857 100644 --- a/edc/wireless.edc +++ b/edc/wireless.edc @@ -1,6 +1,7 @@ group { name: "e/modules/wireless/wifi"; nomouse; images.image: "slot_horiz_top.png" COMP; images.image: "slot_horiz_bottom.png" COMP; + images.image: "wifi_shadow.png" COMP; images.image: "wifi_base.png" COMP; images.image: "wifi_sig_1.png" COMP; images.image: "wifi_sig_2.png" COMP; @@ -10,6 +11,8 @@ group { name: "e/modules/wireless/wifi"; nomouse; images.image: "hole_tiny.png" COMP; images.image: "led_tiny_orange.png" COMP; images.image: "led_tiny_green.png" COMP; + images.image: "lock_locked.png" COMP; + images.image: "lock_insecure.png" COMP; script { public message(Msg_Type:type, id, ...) { @@ -95,6 +98,16 @@ group { name: "e/modules/wireless/wifi"; nomouse; } } /////////////////////// + part { name: "wifi_shadow"; + clip_to: "clip_wifi"; + description { state: "default" 0.0; + aspect: (160/144) (160/144); aspect_preference: BOTH; + align: 0.5 1.0; + rel2.relative: 1.0 0.5; + rel2.to_y: "slot"; + image.normal: "wifi_shadow.png"; + } + } part { name: "wifi_base"; clip_to: "clip_wifi"; description { state: "default" 0.0; @@ -159,6 +172,24 @@ group { name: "e/modules/wireless/wifi"; nomouse; visible: 1; } } + part { name: "lock"; + clip_to: "clip_wifi"; + description { state: "default" 0.0; hid; + aspect: (160/144) (160/144); aspect_preference: BOTH; + align: 0.5 1.0; + rel2.relative: 1.0 0.5; + rel2.to_y: "slot"; + image.normal: "lock_locked.png"; + link.base: "e,state,unsecured" "e"; + } + desc { "insecure"; inherit; vis; + image.normal: "lock_insecure.png"; + link.base: "e,state,insecure" "e"; + } + desc { "secure"; inherit; vis; + link.base: "e,state,secure" "e"; + } + } ////////////////////////// part { name: "slot"; description { state: "default" 0.0; @@ -504,56 +535,3 @@ group { name: "e/modules/wireless/bluetooth"; nomouse; } } } - -group { name: "e/modules/wireless/end"; - images.image: "glow_lock_locked.png" COMP; - images.image: "glow_lock_unlocked.png" COMP; - images.image: "glow_lock_double.png" COMP; - parts { - part { name: "base"; mouse_events: 0; - description { state: "default" 0.0; - image.normal: "glow_lock_locked.png"; - max: 16 16; - aspect: 1.0 1.0; aspect_preference: BOTH; - visible: 0; - } - description { state: "none" 0.0; - inherit: "default" 0.0; - image.normal: "glow_lock_unlocked.png"; - visible: 1; - } - description { state: "wep" 0.0; - inherit: "default" 0.0; - image.normal: "glow_lock_locked.png"; - visible: 1; - } - description { state: "psk" 0.0; - inherit: "default" 0.0; - image.normal: "glow_lock_double.png"; - visible: 1; - } - } - } - programs { - program { - signal: "e,security,off"; source: "e"; - action: STATE_SET "default" 0.0; - target: "base"; - } - program { - signal: "e,security,none"; source: "e"; - action: STATE_SET "none" 0.0; - target: "base"; - } - program { - signal: "e,security,wep"; source: "e"; - action: STATE_SET "wep" 0.0; - target: "base"; - } - program { - signal: "e,security,psk"; source: "e"; - action: STATE_SET "psk" 0.0; - target: "base"; - } - } -} diff --git a/src/gadgets/bryce.c b/src/gadgets/bryce.c index 9dbce4a..4dd63d6 100644 --- a/src/gadgets/bryce.c +++ b/src/gadgets/bryce.c @@ -62,6 +62,14 @@ static E_Action *menu_act; b = evas_object_data_get((obj), "__bryce"); \ if (!b) abort() +static void +_bryce_obstacle_del(void *obs) +{ + Bryce *b = e_object_data_get(obs); + + b->zone_obstacles = eina_list_remove(b->zone_obstacles, obs); +} + static void _bryce_autohide_end(void *data, Efx_Map_Data *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED) { @@ -218,12 +226,12 @@ _bryce_autosize(Bryce *b) elm_object_content_set(b->scroller, b->site); } evas_object_size_hint_min_get(b->site, &sw, &sh); - evas_object_size_hint_min_get(b->layout, &lw, &lh); + edje_object_size_min_calc(elm_layout_edje_get(b->layout), &lw, &lh); _bryce_position(b, lw + sw, lh + sh, &x, &y); if (b->orient == Z_GADGET_SITE_ORIENT_HORIZONTAL) - w = MIN(lw + sw, maxw), h = b->size * e_scale; + w = MIN(MAX(lw + sw, b->size * e_scale), maxw), h = b->size * e_scale; else if (b->orient == Z_GADGET_SITE_ORIENT_VERTICAL) - w = b->size * e_scale, h = MIN(lh + sh, maxh); + w = b->size * e_scale, h = MIN(MAX(lh + sh, b->size * e_scale), maxh); efx_resize(b->bryce, EFX_EFFECT_SPEED_LINEAR, EFX_POINT(x, y), w, h, 0.1, NULL, NULL); b->size_changed = 0; } @@ -418,9 +426,15 @@ _bryce_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event e_zone_obstacle_modify(obs, &(Eina_Rectangle){b->x, b->y, w, h}, vertical); } else - b->zone_obstacles = eina_list_append(b->zone_obstacles, - e_zone_obstacle_add(e_comp_object_util_zone_get(obj), NULL, - &(Eina_Rectangle){b->x, b->y, w, h}, vertical)); + { + void *obs; + + obs = e_zone_obstacle_add(e_comp_object_util_zone_get(obj), NULL, + &(Eina_Rectangle){b->x, b->y, w, h}, vertical); + e_object_data_set(obs, b); + E_OBJECT_DEL_SET(obs, _bryce_obstacle_del); + b->zone_obstacles = eina_list_append(b->zone_obstacles, obs); + } } else { diff --git a/src/gadgets/core.c b/src/gadgets/core.c index 983394b..5581bd1 100644 --- a/src/gadgets/core.c +++ b/src/gadgets/core.c @@ -165,6 +165,14 @@ _gadget_reparent(Z_Gadget_Site *zgs, Z_Gadget_Config *zgc) } } +static void +_gadget_popup(void *data, Evas_Object *obj EINA_UNUSED, void *event_info) +{ + Z_Gadget_Site *zgs = data; + + evas_object_smart_callback_call(zgs->layout, "gadget_popup", event_info); +} + static void _gadget_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -211,6 +219,7 @@ _gadget_object_create(Z_Gadget_Config *zgc) zgc->e_obj_inherit = E_OBJECT_ALLOC(E_Object, Z_GADGET_TYPE, _gadget_object_free); e_object_data_set(zgc->e_obj_inherit, g); zgc->gadget = zgc->display = g; + evas_object_smart_callback_add(g, "gadget_popup", _gadget_popup, zgc->site); evas_object_data_set(g, "__z_gadget", zgc); if (zgc->site->style_cb) zgc->site->style_cb(zgc->site->layout, zgc->style.name, g); @@ -856,6 +865,7 @@ _gadget_menu_remove(void *data, E_Menu *m EINA_UNUSED, E_Menu_Item *mi EINA_UNUS evas_object_smart_callback_call(zgc->site->layout, "gadget_removed", zgc->display); zgc->site->gadgets = eina_list_remove(zgc->site->gadgets, zgc); + evas_object_smart_need_recalculate_set(zgc->site->layout, 1); _gadget_free(zgc); e_config_save_queue(); } diff --git a/src/gadgets/demo.c b/src/gadgets/demo.c index e9643d2..887434a 100644 --- a/src/gadgets/demo.c +++ b/src/gadgets/demo.c @@ -7,6 +7,7 @@ EINTERN Evas_Object *start_create(Evas_Object *parent, int *id EINA_UNUSED, Z_Ga EINTERN void clock_init(void); EINTERN void clock_shutdown(void); EINTERN void ibar_init(void); +EINTERN void wireless_init(void); static Eina_List *handlers; static Evas_Object *rect; @@ -160,6 +161,7 @@ gadget_demo(void) z_gadget_type_add("Start", start_create); clock_init(); ibar_init(); + wireless_init(); z_gadget_init(); z_bryce_init(); diff --git a/src/gadgets/wireless/connman.c b/src/gadgets/wireless/connman.c index 96a0db5..e3023d0 100644 --- a/src/gadgets/wireless/connman.c +++ b/src/gadgets/wireless/connman.c @@ -46,21 +46,38 @@ typedef struct const char *path; Eldbus_Proxy *proxy; + /* Private */ + struct + { + Eldbus_Pending *connect; + Eldbus_Pending *disconnect; + Eldbus_Pending *remov; + void *data; + } pending; + Eldbus_Signal_Handler *handler; + /* Properties */ Eina_Stringshare *name; - Eina_Array *security; + Wireless_Network_Security security; Connman_State state; Connman_Service_Type type; uint8_t strength; - - /* Private */ - struct - { - Eldbus_Pending *connect; - Eldbus_Pending *disconnect; - Eldbus_Pending *remov; - void *data; - } pending; + unsigned int method; + Eina_Stringshare *address; + Eina_Stringshare *gateway; + union + { + struct + { + Eina_Stringshare *netmask; + } v4; + struct + { + Eina_Stringshare *prefixlength; + Wireless_Network_IPv6_Privacy privacy; + } v6; + } ip; + Eina_Bool ipv6 : 1; } Connman_Service; typedef struct Connman_Field @@ -85,20 +102,81 @@ static Eina_Inlist *connman_services; static unsigned int connman_services_count; static Eldbus_Service_Interface *agent_iface; -static Connman_State connman_state; +static Connman_Service *connman_current_service; static Eina_Bool connman_offline; static Eina_Bool connman_powered; +/* connman -> wireless */ +static Eina_Hash *connman_services_map; + + +static Wireless_Network_State +_connman_wifi_state_convert(Connman_State state) +{ + Wireless_Network_State wifi_state; + switch (state) + { + case CONNMAN_STATE_ASSOCIATION: + case CONNMAN_STATE_CONFIGURATION: + wifi_state = WIRELESS_NETWORK_STATE_CONFIGURING; + break; + case CONNMAN_STATE_READY: + wifi_state = WIRELESS_NETWORK_STATE_CONNECTED; + break; + case CONNMAN_STATE_ONLINE: + wifi_state = WIRELESS_NETWORK_STATE_ONLINE; + break; + case CONNMAN_STATE_FAILURE: + wifi_state = WIRELESS_NETWORK_STATE_FAILURE; + break; + case CONNMAN_STATE_NONE: + case CONNMAN_STATE_OFFLINE: + case CONNMAN_STATE_IDLE: + case CONNMAN_STATE_DISCONNECT: + default: + wifi_state = WIRELESS_NETWORK_STATE_NONE; + } + return wifi_state; +} + +static Wireless_Connection * +_connman_service_convert(Connman_Service *cs) +{ + Wireless_Connection *wn; + + wn = E_NEW(Wireless_Connection, 1); + memcpy(wn, &cs->name, sizeof(Wireless_Connection)); + wn->state = _connman_wifi_state_convert(cs->state); + return wn; +} + +static void +connman_update_current_network(Connman_Service *cs) +{ + connman_current_service = cs; + if (eina_hash_population(connman_services_map)) + wireless_wifi_current_network_set(eina_hash_find(connman_services_map, &cs)); +} + static void connman_update_networks(void) { Eina_Array *arr; Connman_Service *cs; + Wireless_Connection *wn; + eina_hash_free_buckets(connman_services_map); arr = eina_array_new(connman_services_count); EINA_INLIST_FOREACH(connman_services, cs) - eina_array_push(arr, &cs->name); + { + wn = _connman_service_convert(cs); + eina_hash_add(connman_services_map, &cs, wn); + eina_array_push(arr, wn); + } arr = wireless_wifi_networks_set(arr); + if (connman_current_service) + connman_update_current_network(connman_current_service); + if (!arr) return; eina_array_free(arr); } @@ -108,38 +186,6 @@ connman_update_airplane_mode(Eina_Bool offline) wireless_airplane_mode_set(offline); } -static void -connman_update_state(Connman_State state) -{ - Wifi_State wifi_state; - - if (connman_state == state) return; - connman_state = state; - switch (connman_state) - { - case CONNMAN_STATE_ASSOCIATION: - case CONNMAN_STATE_CONFIGURATION: - wifi_state = WIFI_NETWORK_STATE_CONFIGURING; - break; - case CONNMAN_STATE_READY: - wifi_state = WIFI_NETWORK_STATE_CONNECTED; - break; - case CONNMAN_STATE_ONLINE: - wifi_state = WIFI_NETWORK_STATE_ONLINE; - break; - case CONNMAN_STATE_FAILURE: - wifi_state = WIFI_NETWORK_STATE_FAILURE; - break; - case CONNMAN_STATE_NONE: - case CONNMAN_STATE_OFFLINE: - case CONNMAN_STATE_IDLE: - case CONNMAN_STATE_DISCONNECT: - default: - wifi_state = WIFI_NETWORK_STATE_NONE; - } - wireless_wifi_state_set(wifi_state); -} - static Connman_State str_to_state(const char *s) { @@ -169,28 +215,27 @@ str_to_type(const char *s) { if (!strcmp(s, "ethernet")) return CONNMAN_SERVICE_TYPE_ETHERNET; - else if (!strcmp(s, "wifi")) + if (!strcmp(s, "wifi")) return CONNMAN_SERVICE_TYPE_WIFI; - else if (!strcmp(s, "bluetooth")) + if (!strcmp(s, "bluetooth")) return CONNMAN_SERVICE_TYPE_BLUETOOTH; - else if (!strcmp(s, "cellular")) + if (!strcmp(s, "cellular")) return CONNMAN_SERVICE_TYPE_CELLULAR; DBG("Unknown type %s", s); return CONNMAN_SERVICE_TYPE_NONE; } -static void -_connman_service_security_array_clean(Connman_Service *cs) +static Wireless_Network_Security +str_to_security(const char *s) { - const char *item; - Eina_Array_Iterator itr; - unsigned int i; - - EINA_ARRAY_ITER_NEXT(cs->security, i, item, itr) - eina_stringshare_del(item); - - eina_array_clean(cs->security); + if (!strcmp(s, "none")) return WIRELESS_NETWORK_SECURITY_NONE; + if (!strcmp(s, "wep")) return WIRELESS_NETWORK_SECURITY_WEP; + if (!strcmp(s, "psk")) return WIRELESS_NETWORK_SECURITY_PSK; + if (!strcmp(s, "ieee8021x")) return WIRELESS_NETWORK_SECURITY_IEEE8021X; + if (!strcmp(s, "wps")) return WIRELESS_NETWORK_SECURITY_WPS; + CRI("UNKNOWN TYPE %s", s); + return WIRELESS_NETWORK_SECURITY_NONE; } static void @@ -215,12 +260,18 @@ _connman_service_free(Connman_Service *cs) eldbus_pending_cancel(cs->pending.remov); free(cs->pending.data); } + eina_stringshare_del(cs->address); + eina_stringshare_del(cs->gateway); + if (cs->ipv6) + eina_stringshare_del(cs->ip.v6.prefixlength); + else + eina_stringshare_del(cs->ip.v4.netmask); eina_stringshare_del(cs->name); - _connman_service_security_array_clean(cs); - eina_array_free(cs->security); eina_stringshare_del(cs->path); + eldbus_signal_handler_del(cs->handler); obj = eldbus_proxy_object_get(cs->proxy); + DBG("service free %p || proxy %p", cs, cs->proxy); eldbus_proxy_unref(cs->proxy); eldbus_object_unref(obj); @@ -271,20 +322,55 @@ _connman_service_parse_prop_changed(Connman_Service *cs, const char *prop_name, else if (!strcmp(prop_name, "Security")) { const char *s; + Eldbus_Message_Iter *itr_array; - DBG("Old security count: %d", - cs->security ? eina_array_count(cs->security) : 0); - if (cs->security) - _connman_service_security_array_clean(cs); - else - cs->security = eina_array_new(5); - - while (eldbus_message_iter_get_and_next(value, 's', &s)) + DBG("Old security: %u", cs->security); + cs->security = WIRELESS_NETWORK_SECURITY_NONE; + + EINA_SAFETY_ON_FALSE_RETURN(eldbus_message_iter_arguments_get(value, "as", + &itr_array)); + while (eldbus_message_iter_get_and_next(itr_array, 's', &s)) + cs->security |= str_to_security(s); + DBG("New security %u", cs->security); + } + else if (!strcmp(prop_name, "IPv4")) + { + Eldbus_Message_Iter *array, *dict; + + EINA_SAFETY_ON_FALSE_RETURN(eldbus_message_iter_arguments_get(value, "a{sv}", &array)); + while (eldbus_message_iter_get_and_next(array, 'e', &dict)) { - eina_array_push(cs->security, eina_stringshare_add(s)); - DBG("Push %s", s); + Eldbus_Message_Iter *var; + const char *name, *val; + + EINA_SAFETY_ON_FALSE_RETURN(eldbus_message_iter_arguments_get(dict, "sv", &name, &var)); + if (!strcmp(name, "Method")) + { + cs->method = WIRELESS_NETWORK_IPV4_METHOD_OFF; + EINA_SAFETY_ON_FALSE_RETURN(eldbus_message_iter_arguments_get(var, "s", &val)); + if (!strcmp(val, "off")) + cs->method = WIRELESS_NETWORK_IPV4_METHOD_OFF; + else if (!strcmp(val, "dhcp")) + cs->method = WIRELESS_NETWORK_IPV4_METHOD_DHCP; + else if (!strcmp(val, "manual")) + cs->method = WIRELESS_NETWORK_IPV4_METHOD_MANUAL; + } + else if (!strcmp(name, "Address")) + { + EINA_SAFETY_ON_FALSE_RETURN(eldbus_message_iter_arguments_get(var, "s", &val)); + eina_stringshare_replace(&cs->address, val); + } + else if (!strcmp(name, "Netmask")) + { + EINA_SAFETY_ON_FALSE_RETURN(eldbus_message_iter_arguments_get(var, "s", &val)); + eina_stringshare_replace(&cs->ip.v4.netmask, val); + } + else if (!strcmp(name, "Gateway")) + { + EINA_SAFETY_ON_FALSE_RETURN(eldbus_message_iter_arguments_get(var, "s", &val)); + eina_stringshare_replace(&cs->gateway, val); + } } - DBG("New security count: %d", eina_array_count(cs->security)); } } @@ -301,6 +387,8 @@ _connman_service_prop_dict_changed(Connman_Service *cs, Eldbus_Message_Iter *pro if (eldbus_message_iter_arguments_get(dict, "sv", &name, &var)) _connman_service_parse_prop_changed(cs, name, var); } + if (cs->state == CONNMAN_STATE_ONLINE) + connman_update_current_network(cs); } static void @@ -312,6 +400,8 @@ _connman_service_property(void *data, const Eldbus_Message *msg) if (eldbus_message_arguments_get(msg, "sv", &name, &var)) _connman_service_parse_prop_changed(cs, name, var); + if (cs->state == CONNMAN_STATE_ONLINE) + connman_update_current_network(cs); } static void @@ -325,13 +415,13 @@ _connman_service_new(const char *path, Eldbus_Message_Iter *props) obj = eldbus_object_get(dbus_conn, CONNMAN_BUS_NAME, path); cs->proxy = eldbus_proxy_get(obj, CONNMAN_SERVICE_IFACE); - eldbus_proxy_signal_handler_add(cs->proxy, "PropertyChanged", + cs->handler = eldbus_proxy_signal_handler_add(cs->proxy, "PropertyChanged", _connman_service_property, cs); _connman_service_prop_dict_changed(cs, props); connman_services = eina_inlist_append(connman_services, EINA_INLIST_GET(cs)); connman_services_count++; - DBG("Added service: %p %s", cs, path); + DBG("Added service: %p %s || proxy %p", cs, path, cs->proxy); } static void @@ -374,7 +464,7 @@ _connman_manager_parse_prop_changed(const char *name, Eldbus_Message_Iter *value if (!eldbus_message_iter_arguments_get(value, "s", &state)) return EINA_FALSE; DBG("New state: %s", state); - connman_update_state(str_to_state(state)); + //connman_update_state(str_to_state(state)); } else if (!strcmp(name, "OfflineMode")) { @@ -765,6 +855,7 @@ _connman_end(void) { Eldbus_Object *obj; + if (!proxy_manager) return; eldbus_proxy_call(proxy_manager, "UnregisterAgent", NULL, NULL, -1, "o", CONNMAN_AGENT_PATH); while (connman_services) @@ -799,6 +890,7 @@ EINTERN void connman_init(void) { if (_connman_log_dom > -1) return; + connman_services_map = eina_hash_pointer_new(free); eldbus_name_owner_changed_callback_add(dbus_conn, CONNMAN_BUS_NAME, _connman_name_owner_changed, NULL, EINA_TRUE); @@ -809,6 +901,7 @@ EINTERN void connman_shutdown(void) { E_FREE_FUNC(agent_iface, eldbus_service_object_unregister); + E_FREE_FUNC(connman_services_map, eina_hash_free); _connman_end(); eldbus_name_owner_changed_callback_del(dbus_conn, CONNMAN_BUS_NAME, _connman_name_owner_changed, NULL); eina_log_domain_unregister(_connman_log_dom); diff --git a/src/gadgets/wireless/mod.c b/src/gadgets/wireless/mod.c index e3687b6..d9fc04b 100644 --- a/src/gadgets/wireless/mod.c +++ b/src/gadgets/wireless/mod.c @@ -1,5 +1,11 @@ #include "e.h" +EINTERN void wireless_gadget_init(void); +EINTERN void wireless_gadget_shutdown(void); + +EINTERN void connman_init(void); +EINTERN void connman_shutdown(void); + EINTERN Eldbus_Connection *dbus_conn; EINTERN void @@ -7,10 +13,13 @@ wireless_init(void) { dbus_conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SYSTEM); connman_init(); + wireless_gadget_init(); } EINTERN void wireless_shutdown(void) { + wireless_gadget_shutdown(); connman_shutdown(); + E_FREE_FUNC(dbus_conn, eldbus_connection_unref); } diff --git a/src/gadgets/wireless/wireless.c b/src/gadgets/wireless/wireless.c index fb33093..f0f841f 100644 --- a/src/gadgets/wireless/wireless.c +++ b/src/gadgets/wireless/wireless.c @@ -9,37 +9,50 @@ typedef struct Instance Eina_Hash *popup_items; } Instance; -static Wifi_State wifi_state; +static Wireless_Network_State wifi_network_state; static Eina_Array *wifi_networks; -static Wifi_Network *wifi_current; +static Wireless_Connection *wifi_current; static Eina_Bool wifi_enabled; static Eina_List *instances; static void -_wifi_icon_init(Evas_Object *icon, Wifi_Network *wn) +_wifi_icon_init(Evas_Object *icon, Wireless_Connection *wn) { Edje_Message_Int_Set *msg; + int state = 0, strength = 0; + if (wn) + { + state = wn->state; + strength = wn->strength; + } msg = alloca(sizeof(Edje_Message_Int_Set) + sizeof(int)); msg->count = 2; - msg->val[0] = wn->state; - msg->val[1] = wn->strength; + msg->val[0] = state; + msg->val[1] = strength; edje_object_message_send(elm_layout_edje_get(icon), EDJE_MESSAGE_INT_SET, 1, msg); -} -static void -_wifi_state_update(Evas_Object *g) -{ - switch (wifi_state) + if (!wn) { - case WIFI_STATE_NONE: break; - case WIFI_STATE_ETHERNET: - elm_object_signal_emit(g, "e,state,ethernet", "e"); + elm_object_signal_emit(icon, "e,state,disconnected", "e"); + return; + } + switch (wn->type) + { + case WIRELESS_SERVICE_TYPE_ETHERNET: + elm_object_signal_emit(icon, "e,state,ethernet", "e"); break; - case WIFI_STATE_WIFI: - elm_object_signal_emit(g, "e,state,wifi", "e"); + case WIRELESS_SERVICE_TYPE_WIFI: + elm_object_signal_emit(icon, "e,state,wifi", "e"); + if (wn->security > WIRELESS_NETWORK_SECURITY_WEP) + elm_object_signal_emit(icon, "e,state,secure", "e"); + else if (wn->security == WIRELESS_NETWORK_SECURITY_WEP) + elm_object_signal_emit(icon, "e,state,insecure", "e"); + else if (!wn->security) + elm_object_signal_emit(icon, "e,state,unsecured", "e"); break; + default: break; } } @@ -53,7 +66,7 @@ static void _wifi_popup_list_populate(Instance *inst) { Eina_Iterator *it; - Wifi_Network *wn; + Wireless_Connection *wn; it = eina_array_iterator_new(wifi_networks); EINA_ITERATOR_FOREACH(it, wn) @@ -61,6 +74,7 @@ _wifi_popup_list_populate(Instance *inst) Evas_Object *icon; Elm_Object_Item *item; + if (wn->type != WIRELESS_SERVICE_TYPE_WIFI) continue; icon = elm_layout_add(inst->popup_list); e_theme_edje_object_set(icon, NULL, "e/modules/wireless/wifi"); _wifi_icon_init(icon, wn); @@ -76,12 +90,6 @@ _wifi_popup_wifi_toggle(void *data, Evas_Object *obj EINA_UNUSED, void *event_in Instance *inst = data; } -static void -_wifi_popup_dismissed(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED) -{ - evas_object_del(obj); -} - static void _wifi_popup_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { @@ -91,6 +99,12 @@ _wifi_popup_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, v inst->popup = NULL; } +static Eina_Bool +_wifi_popup_key() +{ + return EINA_TRUE; +} + static void _wifi_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { @@ -99,23 +113,32 @@ _wifi_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, Evas_Object *ctx, *box, *list, *toggle; if (ev->button != 1) return; + if (inst->popup) + { + evas_object_hide(inst->popup); + evas_object_del(inst->popup); + return; + } inst->popup_items = eina_hash_pointer_new(NULL); - inst->popup = ctx = elm_ctxpopup_add(e_comp->elm); - elm_object_style_set(inst->popup, "noblock"); - evas_object_smart_callback_add(inst->popup, "dismissed", _wifi_popup_dismissed, inst); - evas_object_event_callback_add(inst->popup, EVAS_CALLBACK_DEL, _wifi_popup_del, inst); + ctx = elm_ctxpopup_add(e_comp->elm); + elm_object_style_set(ctx, "noblock"); box = elm_box_add(ctx); E_EXPAND(box); E_FILL(box); inst->popup_list = list = elm_list_add(ctx); + elm_list_mode_set(list, ELM_LIST_COMPRESS); + elm_scroller_content_min_limit(list, 0, 1); + evas_object_size_hint_max_set(list, -1, e_comp_object_util_zone_get(inst->box)-> h / 3); E_EXPAND(list); E_FILL(list); _wifi_popup_list_populate(inst); elm_list_go(list); + evas_object_show(list); elm_box_pack_end(box, list); toggle = elm_check_add(ctx); + evas_object_show(toggle); elm_object_style_set(toggle, "toggle"); elm_object_text_set(toggle, "Wifi State"); elm_object_part_text_set(toggle, "on", "On"); @@ -125,7 +148,77 @@ _wifi_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, elm_box_pack_end(box, toggle); elm_object_content_set(ctx, box); z_gadget_util_ctxpopup_place(inst->box, ctx); - evas_object_show(ctx); + evas_object_smart_callback_call(inst->box, "gadget_popup", ctx); + inst->popup = e_comp_object_util_add(ctx, E_COMP_OBJECT_TYPE_NONE); + evas_object_layer_set(inst->popup, evas_object_layer_get(inst->popup) + 1); + e_comp_object_util_autoclose(inst->popup, NULL, _wifi_popup_key, NULL); + evas_object_show(inst->popup); + evas_object_event_callback_add(inst->popup, EVAS_CALLBACK_DEL, _wifi_popup_del, inst); +} + +static void +_wifi_tooltip_row(Evas_Object *tb, const char *label, const char *value, int row) +{ + Evas_Object *lbl; + + lbl = elm_label_add(tb); + evas_object_show(lbl); + E_ALIGN(lbl, 0, 0.5); + elm_object_text_set(lbl, label); + elm_table_pack(tb, lbl, 0, row, 1, 1); + + lbl = elm_label_add(tb); + evas_object_show(lbl); + E_ALIGN(lbl, 0, 0.5); + elm_object_text_set(lbl, value); + elm_table_pack(tb, lbl, 1, row, 1, 1); +} + +static Evas_Object * +_wifi_tooltip(void *data, Evas_Object *obj EINA_UNUSED, Evas_Object *tooltip) +{ + Instance *inst = data; + Evas_Object *tb; + int row = 0; + const char *val; + char buf[1024]; + + if (!wifi_current) return NULL; + tb = elm_table_add(tooltip); + elm_table_padding_set(tb, 5, 1); + + _wifi_tooltip_row(tb, "Name:", wifi_current->name, row++); + val = "Disabled"; + if (wifi_current->ipv6) + { + if (wifi_current->method == WIRELESS_NETWORK_IPV6_METHOD_MANUAL) + val = "Manual"; + else if (wifi_current->method == WIRELESS_NETWORK_IPV6_METHOD_AUTO) + val = "Auto"; + else if (wifi_current->method == WIRELESS_NETWORK_IPV6_METHOD_6TO4) + val = "6to4"; + } + else + { + if (wifi_current->method == WIRELESS_NETWORK_IPV4_METHOD_MANUAL) + val = "Manual"; + else if (wifi_current->method == WIRELESS_NETWORK_IPV4_METHOD_DHCP) + val = "DHCP"; + } + _wifi_tooltip_row(tb, "Method:", val, row++); + + if (wifi_current->type == WIRELESS_SERVICE_TYPE_WIFI) + { + snprintf(buf, sizeof(buf), "%u%%", wifi_current->strength); + _wifi_tooltip_row(tb, "Signal:", buf, row++); + } + + if ((wifi_current->state == WIRELESS_NETWORK_STATE_CONNECTED) || + (wifi_current->state == WIRELESS_NETWORK_STATE_ONLINE)) + { + _wifi_tooltip_row(tb, "Address:", wifi_current->address, row++); + } + return tb; } static void @@ -134,6 +227,7 @@ wireless_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void Instance *inst = data; instances = eina_list_remove(instances, inst); + evas_object_hide(inst->popup); evas_object_del(inst->popup); free(inst); } @@ -153,7 +247,10 @@ wireless_create(Evas_Object *parent, int *id, Z_Gadget_Site_Orient orient) E_EXPAND(g); E_FILL(g); e_theme_edje_object_set(g, NULL, "e/modules/wireless/wifi"); + evas_object_show(g); elm_box_pack_end(inst->box, g); + evas_object_show(inst->box); + elm_object_tooltip_content_cb_set(g, _wifi_tooltip, inst, NULL); evas_object_size_hint_aspect_set(inst->box, EVAS_ASPECT_CONTROL_BOTH, 1, 1); evas_object_event_callback_add(inst->box, EVAS_CALLBACK_DEL, wireless_del, inst); @@ -161,54 +258,69 @@ wireless_create(Evas_Object *parent, int *id, Z_Gadget_Site_Orient orient) if (*id < 0) elm_object_signal_emit(g, "e,state,wifi", "e"); - else - { - _wifi_state_update(g); - if (wifi_current) - _wifi_icon_init(g, wifi_current); - } + else if (wifi_current) + _wifi_icon_init(g, wifi_current); instances = eina_list_append(instances, inst); return inst->box; } -static void -wireless_init(void) +EINTERN void +wireless_gadget_init(void) { z_gadget_type_add("Wireless", wireless_create); } - EINTERN void -wireless_wifi_state_set(Wifi_State state) +wireless_gadget_shutdown(void) { - Eina_List *l; - Instance *inst; - - if (wifi_state == state) return; - - wifi_state = state; - EINA_LIST_FOREACH(instances, l, inst) - _wifi_state_update(inst->wifi); + z_gadget_type_del("Wireless"); } EINTERN void -wireless_wifi_current_network_set(Wifi_Network *wn) +wireless_wifi_network_state_set(Wireless_Network_State state) { Eina_List *l; Instance *inst; + if (wifi_network_state == state) return; + + wifi_network_state = state; + //EINA_LIST_FOREACH(instances, l, inst) + //_wifi_network_state_update(inst->wifi); +} + +EINTERN void +wireless_wifi_current_network_set(Wireless_Connection *wn) +{ + Eina_List *l; + Instance *inst; + Wireless_Connection *prev; + + prev = wifi_current; wifi_current = wn; EINA_LIST_FOREACH(instances, l, inst) - if (inst->popup) - { - Elm_Object_Item *it; - Evas_Object *icon; + { + if (inst->popup) + { + Elm_Object_Item *it; + Evas_Object *icon; - it = eina_hash_find(inst->popup_items, &wn); - icon = elm_object_item_content_get(it); - _wifi_icon_init(icon, wn); - } + if (wn) + { + it = eina_hash_find(inst->popup_items, &wn); + icon = elm_object_item_content_get(it); + _wifi_icon_init(icon, wn); + } + if (prev) + { + it = eina_hash_find(inst->popup_items, &prev); + icon = elm_object_item_content_get(it); + _wifi_icon_init(icon, prev); + } + } + _wifi_icon_init(inst->wifi, wn); + } } EINTERN Eina_Array * diff --git a/src/gadgets/wireless/wireless.h b/src/gadgets/wireless/wireless.h index 2ac701f..98488ad 100644 --- a/src/gadgets/wireless/wireless.h +++ b/src/gadgets/wireless/wireless.h @@ -4,34 +4,84 @@ #include "e.h" #include "gadget.h" -typedef enum Wifi_State +typedef enum { - WIFI_STATE_NONE, - WIFI_STATE_ETHERNET, - WIFI_STATE_WIFI, -} Wifi_State; + WIRELESS_SERVICE_TYPE_NONE = -1, + WIRELESS_SERVICE_TYPE_ETHERNET, + WIRELESS_SERVICE_TYPE_WIFI, + WIRELESS_SERVICE_TYPE_BLUETOOTH, + WIRELESS_SERVICE_TYPE_CELLULAR, +} Wireless_Service_Type; typedef enum { - WIFI_NETWORK_STATE_NONE, - WIFI_NETWORK_STATE_CONFIGURING, - WIFI_NETWORK_STATE_CONNECTED, - WIFI_NETWORK_STATE_ONLINE, - WIFI_NETWORK_STATE_FAILURE, -} Wifi_Network_State; + WIRELESS_NETWORK_STATE_NONE, + WIRELESS_NETWORK_STATE_CONFIGURING, + WIRELESS_NETWORK_STATE_CONNECTED, + WIRELESS_NETWORK_STATE_ONLINE, + WIRELESS_NETWORK_STATE_FAILURE, +} Wireless_Network_State; -typedef struct Wifi_Network +typedef enum +{ + WIRELESS_NETWORK_SECURITY_NONE = 0, + WIRELESS_NETWORK_SECURITY_WEP = (1 << 0), + WIRELESS_NETWORK_SECURITY_PSK = (1 << 1), + WIRELESS_NETWORK_SECURITY_IEEE8021X = (1 << 2), + WIRELESS_NETWORK_SECURITY_WPS = (1 << 3), +} Wireless_Network_Security; + +typedef enum +{ + WIRELESS_NETWORK_IPV4_METHOD_OFF, + WIRELESS_NETWORK_IPV4_METHOD_MANUAL, + WIRELESS_NETWORK_IPV4_METHOD_DHCP, +} Wireless_Network_IPv4_Method; + +typedef enum +{ + WIRELESS_NETWORK_IPV6_METHOD_OFF, + WIRELESS_NETWORK_IPV6_METHOD_MANUAL, + WIRELESS_NETWORK_IPV6_METHOD_AUTO, + WIRELESS_NETWORK_IPV6_METHOD_6TO4, +} Wireless_Network_IPv6_Method; + +typedef enum +{ + WIRELESS_NETWORK_IPV6_PRIVACY_DISABLED, + WIRELESS_NETWORK_IPV6_PRIVACY_ENABLED, + WIRELESS_NETWORK_IPV6_PRIVACY_PREFERRED, +} Wireless_Network_IPv6_Privacy; + +typedef struct Wireless_Connection { Eina_Stringshare *name; - Eina_Array *security; - Wifi_Network_State state; + Wireless_Network_Security security; + Wireless_Network_State state; + Wireless_Service_Type type; uint8_t strength; -} Wifi_Network; + unsigned int method; + Eina_Stringshare *address; + Eina_Stringshare *gateway; + union + { + struct + { + Eina_Stringshare *netmask; + } v4; + struct + { + Eina_Stringshare *prefixlength; + Wireless_Network_IPv6_Privacy privacy; + } v6; + } ip; + Eina_Bool ipv6 : 1; +} Wireless_Connection; extern Eldbus_Connection *dbus_conn; -EINTERN void wireless_wifi_state_set(Wifi_State state); -EINTERN void wireless_wifi_current_network_set(Wifi_Network *wn); +EINTERN void wireless_wifi_network_state_set(Wireless_Network_State state); +EINTERN void wireless_wifi_current_network_set(Wireless_Connection *wn); EINTERN Eina_Array *wireless_wifi_networks_set(Eina_Array *networks); EINTERN void wireless_airplane_mode_set(Eina_Bool enabled);