From c1699d13a053ff9c0539fa2b27fc497bd6f71783 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sat, 28 Apr 2012 04:09:56 +0000 Subject: [PATCH] finally - xkbswitch into core e. needs some polishing work. what i have done here beyond just "copy the code" is: 1. fix up some code that was useless (didnt need to be done). 2. reformat all the code to be closer to efl/e style guidelines 3. add flags to the gadget popup menu to change keyboard 4. fix lots of warnings 5. fix some correctness in c - () vs (void) 6. added q66 to AUTHORS 7. made it use _() intl macro, not D_() (needed) 8. put xkbswitch module stuff in theme (need some prettying/work) 9. added some XXX: comments on things to do right now xkbswithc is actually very powerful (thanks q66) but its not that user-friendly. it lets you add a short-list of "keyboard layouts" you nee/duse. the gagdet lets you quick-switch between them. this actually works. it has nice little flaggy things to try help you out. what we probably need to do is: 1. fix a buffer overflow waiting to happen in the kbdswitch changing. XXX'd 2. add a wizard page asking for kbd layout 3. double-check that "last used kbdlayout" is actually turned on 4. move xkbd config to core e config (not separate in module) 5. pretty up the gagdet (add a shadow around the flag, some placeholder if no flag is selected etc.) 6. go over the xkb parser - it looks fragile from a read :) SVN revision: 70531 --- AUTHORS | 1 + configure.ac | 4 + data/Makefile.am | 4 +- data/flags/Makefile.am | 97 ++ data/flags/ad_flag.png | Bin 0 -> 2983 bytes data/flags/af_flag.png | Bin 0 -> 3238 bytes data/flags/al_flag.png | Bin 0 -> 3833 bytes data/flags/am_flag.png | Bin 0 -> 318 bytes data/flags/ara_flag.png | Bin 0 -> 3546 bytes data/flags/at_flag.png | Bin 0 -> 379 bytes data/flags/az_flag.png | Bin 0 -> 1073 bytes data/flags/ba_flag.png | Bin 0 -> 3039 bytes data/flags/bd_flag.png | Bin 0 -> 1361 bytes data/flags/be_flag.png | Bin 0 -> 334 bytes data/flags/bg_flag.png | Bin 0 -> 322 bytes data/flags/br_flag.png | Bin 0 -> 3998 bytes data/flags/brai_flag.png | Bin 0 -> 7550 bytes data/flags/bt_flag.png | Bin 0 -> 6709 bytes data/flags/bw_flag.png | Bin 0 -> 416 bytes data/flags/by_flag.png | Bin 0 -> 2828 bytes data/flags/ca_flag.png | Bin 0 -> 1341 bytes data/flags/cd_flag.png | Bin 0 -> 4667 bytes data/flags/ch_flag.png | Bin 0 -> 588 bytes data/flags/cn_flag.png | Bin 0 -> 1627 bytes data/flags/cz_flag.png | Bin 0 -> 1513 bytes data/flags/de_flag.png | Bin 0 -> 317 bytes data/flags/dk_flag.png | Bin 0 -> 466 bytes data/flags/ee_flag.png | Bin 0 -> 375 bytes data/flags/epo_flag.png | Bin 0 -> 1173 bytes data/flags/es_flag.png | Bin 0 -> 2395 bytes data/flags/et_flag.png | Bin 0 -> 3178 bytes data/flags/fi_flag.png | Bin 0 -> 522 bytes data/flags/fo_flag.png | Bin 0 -> 629 bytes data/flags/fr_flag.png | Bin 0 -> 327 bytes data/flags/gb_flag.png | Bin 0 -> 4182 bytes data/flags/ge_flag.png | Bin 0 -> 1657 bytes data/flags/gh_flag.png | Bin 0 -> 1084 bytes data/flags/gn_flag.png | Bin 0 -> 440 bytes data/flags/gr_flag.png | Bin 0 -> 744 bytes data/flags/hr_flag.png | Bin 0 -> 2288 bytes data/flags/hu_flag.png | Bin 0 -> 325 bytes data/flags/ie_flag.png | Bin 0 -> 326 bytes data/flags/il_flag.png | Bin 0 -> 1611 bytes data/flags/in_flag.png | Bin 0 -> 1411 bytes data/flags/iq_flag.png | Bin 0 -> 1771 bytes data/flags/ir_flag.png | Bin 0 -> 4471 bytes data/flags/is_flag.png | Bin 0 -> 471 bytes data/flags/it_flag.png | Bin 0 -> 326 bytes data/flags/jp_flag.png | Bin 0 -> 1573 bytes data/flags/ke_flag.png | Bin 0 -> 2582 bytes data/flags/kg_flag.png | Bin 0 -> 4056 bytes data/flags/kh_flag.png | Bin 0 -> 3029 bytes data/flags/kr_flag.png | Bin 0 -> 4368 bytes data/flags/kz_flag.png | Bin 0 -> 4344 bytes data/flags/la_flag.png | Bin 0 -> 1054 bytes data/flags/latam_flag.png | Bin 0 -> 9496 bytes data/flags/lk_flag.png | Bin 0 -> 3735 bytes data/flags/lt_flag.png | Bin 0 -> 330 bytes data/flags/lv_flag.png | Bin 0 -> 351 bytes data/flags/ma_flag.png | Bin 0 -> 2307 bytes data/flags/mao_flag.png | Bin 0 -> 3545 bytes data/flags/me_flag.png | Bin 0 -> 3519 bytes data/flags/mk_flag.png | Bin 0 -> 2952 bytes data/flags/ml_flag.png | Bin 0 -> 437 bytes data/flags/mm_flag.png | Bin 0 -> 2593 bytes data/flags/mn_flag.png | Bin 0 -> 1781 bytes data/flags/mt_flag.png | Bin 0 -> 946 bytes data/flags/mv_flag.png | Bin 0 -> 1038 bytes data/flags/ng_flag.png | Bin 0 -> 508 bytes data/flags/nl_flag.png | Bin 0 -> 366 bytes data/flags/no_flag.png | Bin 0 -> 592 bytes data/flags/np_flag.png | Bin 0 -> 14010 bytes data/flags/ph_flag.png | Bin 0 -> 2965 bytes data/flags/pk_flag.png | Bin 0 -> 2011 bytes data/flags/pl_flag.png | Bin 0 -> 320 bytes data/flags/pt_flag.png | Bin 0 -> 3615 bytes data/flags/ro_flag.png | Bin 0 -> 327 bytes data/flags/rs_flag.png | Bin 0 -> 3697 bytes data/flags/ru_flag.png | Bin 0 -> 362 bytes data/flags/se_flag.png | Bin 0 -> 428 bytes data/flags/si_flag.png | Bin 0 -> 1237 bytes data/flags/sk_flag.png | Bin 0 -> 2244 bytes data/flags/sn_flag.png | Bin 0 -> 1060 bytes data/flags/sy_flag.png | Bin 0 -> 1533 bytes data/flags/th_flag.png | Bin 0 -> 409 bytes data/flags/tj_flag.png | Bin 0 -> 1688 bytes data/flags/tm_flag.png | Bin 0 -> 6504 bytes data/flags/tr_flag.png | Bin 0 -> 1784 bytes data/flags/tw_flag.png | Bin 0 -> 1993 bytes data/flags/tz_flag.png | Bin 0 -> 3550 bytes data/flags/ua_flag.png | Bin 0 -> 332 bytes data/flags/unknown_flag.png | Bin 0 -> 5602 bytes data/flags/us_flag.png | Bin 0 -> 2869 bytes data/flags/uz_flag.png | Bin 0 -> 1350 bytes data/flags/vn_flag.png | Bin 0 -> 1473 bytes data/flags/za_flag.png | Bin 0 -> 3222 bytes data/themes/default.edc | 135 +++ po/POTFILES.in | 7 + src/modules/Makefile.am | 4 + .../conf_display/e_int_config_display.c | 889 +++++++++++------- src/modules/xkbswitch/Makefile.am | 34 + src/modules/xkbswitch/e-module-xkbswitch.edj | Bin 0 -> 9213 bytes src/modules/xkbswitch/e_mod_config.c | 768 +++++++++++++++ src/modules/xkbswitch/e_mod_keybindings.c | 194 ++++ src/modules/xkbswitch/e_mod_keybindings.h | 16 + src/modules/xkbswitch/e_mod_main.c | 770 +++++++++++++++ src/modules/xkbswitch/e_mod_main.h | 97 ++ src/modules/xkbswitch/e_mod_parse.c | 310 ++++++ src/modules/xkbswitch/e_mod_parse.h | 52 + src/modules/xkbswitch/module.desktop.in | 6 + 110 files changed, 3069 insertions(+), 319 deletions(-) create mode 100644 data/flags/Makefile.am create mode 100644 data/flags/ad_flag.png create mode 100644 data/flags/af_flag.png create mode 100644 data/flags/al_flag.png create mode 100644 data/flags/am_flag.png create mode 100644 data/flags/ara_flag.png create mode 100644 data/flags/at_flag.png create mode 100644 data/flags/az_flag.png create mode 100644 data/flags/ba_flag.png create mode 100644 data/flags/bd_flag.png create mode 100644 data/flags/be_flag.png create mode 100644 data/flags/bg_flag.png create mode 100644 data/flags/br_flag.png create mode 100644 data/flags/brai_flag.png create mode 100644 data/flags/bt_flag.png create mode 100644 data/flags/bw_flag.png create mode 100644 data/flags/by_flag.png create mode 100644 data/flags/ca_flag.png create mode 100644 data/flags/cd_flag.png create mode 100644 data/flags/ch_flag.png create mode 100644 data/flags/cn_flag.png create mode 100644 data/flags/cz_flag.png create mode 100644 data/flags/de_flag.png create mode 100644 data/flags/dk_flag.png create mode 100644 data/flags/ee_flag.png create mode 100644 data/flags/epo_flag.png create mode 100644 data/flags/es_flag.png create mode 100644 data/flags/et_flag.png create mode 100644 data/flags/fi_flag.png create mode 100644 data/flags/fo_flag.png create mode 100644 data/flags/fr_flag.png create mode 100644 data/flags/gb_flag.png create mode 100644 data/flags/ge_flag.png create mode 100644 data/flags/gh_flag.png create mode 100644 data/flags/gn_flag.png create mode 100644 data/flags/gr_flag.png create mode 100644 data/flags/hr_flag.png create mode 100644 data/flags/hu_flag.png create mode 100644 data/flags/ie_flag.png create mode 100644 data/flags/il_flag.png create mode 100644 data/flags/in_flag.png create mode 100644 data/flags/iq_flag.png create mode 100644 data/flags/ir_flag.png create mode 100644 data/flags/is_flag.png create mode 100644 data/flags/it_flag.png create mode 100644 data/flags/jp_flag.png create mode 100644 data/flags/ke_flag.png create mode 100644 data/flags/kg_flag.png create mode 100644 data/flags/kh_flag.png create mode 100644 data/flags/kr_flag.png create mode 100644 data/flags/kz_flag.png create mode 100644 data/flags/la_flag.png create mode 100644 data/flags/latam_flag.png create mode 100644 data/flags/lk_flag.png create mode 100644 data/flags/lt_flag.png create mode 100644 data/flags/lv_flag.png create mode 100644 data/flags/ma_flag.png create mode 100644 data/flags/mao_flag.png create mode 100644 data/flags/me_flag.png create mode 100644 data/flags/mk_flag.png create mode 100644 data/flags/ml_flag.png create mode 100644 data/flags/mm_flag.png create mode 100644 data/flags/mn_flag.png create mode 100644 data/flags/mt_flag.png create mode 100644 data/flags/mv_flag.png create mode 100644 data/flags/ng_flag.png create mode 100644 data/flags/nl_flag.png create mode 100644 data/flags/no_flag.png create mode 100644 data/flags/np_flag.png create mode 100644 data/flags/ph_flag.png create mode 100644 data/flags/pk_flag.png create mode 100644 data/flags/pl_flag.png create mode 100644 data/flags/pt_flag.png create mode 100644 data/flags/ro_flag.png create mode 100644 data/flags/rs_flag.png create mode 100644 data/flags/ru_flag.png create mode 100644 data/flags/se_flag.png create mode 100644 data/flags/si_flag.png create mode 100644 data/flags/sk_flag.png create mode 100644 data/flags/sn_flag.png create mode 100644 data/flags/sy_flag.png create mode 100644 data/flags/th_flag.png create mode 100644 data/flags/tj_flag.png create mode 100644 data/flags/tm_flag.png create mode 100644 data/flags/tr_flag.png create mode 100644 data/flags/tw_flag.png create mode 100644 data/flags/tz_flag.png create mode 100644 data/flags/ua_flag.png create mode 100644 data/flags/unknown_flag.png create mode 100644 data/flags/us_flag.png create mode 100644 data/flags/uz_flag.png create mode 100644 data/flags/vn_flag.png create mode 100644 data/flags/za_flag.png create mode 100644 src/modules/xkbswitch/Makefile.am create mode 100644 src/modules/xkbswitch/e-module-xkbswitch.edj create mode 100644 src/modules/xkbswitch/e_mod_config.c create mode 100644 src/modules/xkbswitch/e_mod_keybindings.c create mode 100644 src/modules/xkbswitch/e_mod_keybindings.h create mode 100644 src/modules/xkbswitch/e_mod_main.c create mode 100644 src/modules/xkbswitch/e_mod_main.h create mode 100644 src/modules/xkbswitch/e_mod_parse.c create mode 100644 src/modules/xkbswitch/e_mod_parse.h create mode 100644 src/modules/xkbswitch/module.desktop.in diff --git a/AUTHORS b/AUTHORS index 6b0f204d4..e58a155ad 100644 --- a/AUTHORS +++ b/AUTHORS @@ -32,3 +32,4 @@ Sthitha Doyoun Kang Gwanglim Lee Thomas Gstädtner +q66 diff --git a/configure.ac b/configure.ac index cc8e4b572..fb1995a0e 100644 --- a/configure.ac +++ b/configure.ac @@ -797,6 +797,7 @@ AC_E_OPTIONAL_MODULE([shot], true) AC_E_OPTIONAL_MODULE([backlight], true) AC_E_OPTIONAL_MODULE([tasks], true) AC_E_OPTIONAL_MODULE([conf_randr], true) +AC_E_OPTIONAL_MODULE([xkbswitch], true) SUSPEND="" HIBERNATE="" @@ -951,9 +952,12 @@ src/modules/backlight/Makefile src/modules/backlight/module.desktop src/modules/tasks/Makefile src/modules/tasks/module.desktop +src/modules/xkbswitch/Makefile +src/modules/xkbswitch/module.desktop src/preload/Makefile data/Makefile data/images/Makefile +data/flags/Makefile data/input_methods/Makefile data/themes/Makefile data/themes/images/Makefile diff --git a/data/Makefile.am b/data/Makefile.am index b7a5119ff..782c2d9ef 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -7,5 +7,5 @@ xsession \ input_methods \ etc \ icons \ -backgrounds - +backgrounds \ +flags diff --git a/data/flags/Makefile.am b/data/flags/Makefile.am new file mode 100644 index 000000000..7667f1c49 --- /dev/null +++ b/data/flags/Makefile.am @@ -0,0 +1,97 @@ +MAINTAINERCLEANFILES = Makefile.in +filesdir = $(datadir)/enlightenment/data/flags +files_DATA = \ +ad_flag.png \ +af_flag.png \ +al_flag.png \ +am_flag.png \ +ara_flag.png \ +at_flag.png \ +az_flag.png \ +ba_flag.png \ +bd_flag.png \ +be_flag.png \ +bg_flag.png \ +brai_flag.png \ +br_flag.png \ +bt_flag.png \ +bw_flag.png \ +by_flag.png \ +ca_flag.png \ +cd_flag.png \ +ch_flag.png \ +cn_flag.png \ +cz_flag.png \ +de_flag.png \ +dk_flag.png \ +ee_flag.png \ +epo_flag.png \ +es_flag.png \ +et_flag.png \ +fi_flag.png \ +fo_flag.png \ +fr_flag.png \ +gb_flag.png \ +ge_flag.png \ +gh_flag.png \ +gn_flag.png \ +gr_flag.png \ +hr_flag.png \ +hu_flag.png \ +ie_flag.png \ +il_flag.png \ +in_flag.png \ +iq_flag.png \ +ir_flag.png \ +is_flag.png \ +it_flag.png \ +jp_flag.png \ +ke_flag.png \ +kg_flag.png \ +kh_flag.png \ +kr_flag.png \ +kz_flag.png \ +la_flag.png \ +latam_flag.png \ +lk_flag.png \ +lt_flag.png \ +lv_flag.png \ +ma_flag.png \ +mao_flag.png \ +me_flag.png \ +mk_flag.png \ +ml_flag.png \ +mm_flag.png \ +mn_flag.png \ +mt_flag.png \ +mv_flag.png \ +ng_flag.png \ +nl_flag.png \ +no_flag.png \ +np_flag.png \ +ph_flag.png \ +pk_flag.png \ +pl_flag.png \ +pt_flag.png \ +ro_flag.png \ +rs_flag.png \ +ru_flag.png \ +se_flag.png \ +si_flag.png \ +sk_flag.png \ +sn_flag.png \ +sy_flag.png \ +th_flag.png \ +tj_flag.png \ +tm_flag.png \ +tr_flag.png \ +tw_flag.png \ +tz_flag.png \ +ua_flag.png \ +unknown_flag.png \ +us_flag.png \ +uz_flag.png \ +vn_flag.png \ +za_flag.png + +EXTRA_DIST = $(files_DATA) diff --git a/data/flags/ad_flag.png b/data/flags/ad_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..a970afc3caea04c359442dc95a89f5e72d4a0282 GIT binary patch literal 2983 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 D%%PeY literal 0 HcmV?d00001 diff --git a/data/flags/af_flag.png b/data/flags/af_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..84f583021440e87487877311e39b241d1206ecdd GIT binary patch literal 3238 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 literal 0 HcmV?d00001 diff --git a/data/flags/al_flag.png b/data/flags/al_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..fec5a750205b8ceac471168a9c33b791f0c1bb28 GIT binary patch literal 3833 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 a;1FQ+CefcMY|b810p_OGCbbCn*#7`pB0&!T literal 0 HcmV?d00001 diff --git a/data/flags/am_flag.png b/data/flags/am_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..74d914800d36fef8925d2b9d1ac51cbae53c525e GIT binary patch literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~iuz@TP(*#z3Ldo-U3d6}R5r*~r^qz~g!_|47f8 z13qgGOj_7=gJI#1bzX06RObQ>K>-imXUVx4^(?;o^m-c4UQP!F4hBXA29^c}0R|>? zPDARO&jCAq7tcM+{eT-?l7SIPTZ8MK*-rYioo>he%M4zje}IDptAS8G3}~Ri-{$T^ UwuWgQ-}^u^p00i_>zopr0A*`V#sB~S literal 0 HcmV?d00001 diff --git a/data/flags/ara_flag.png b/data/flags/ara_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..c1b17643d91e2f910ea4feee93b508309d07f6d0 GIT binary patch literal 3546 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 Ws!V*ZPyT6P01H!Vlg6v=iT?+{ot%RJ literal 0 HcmV?d00001 diff --git a/data/flags/at_flag.png b/data/flags/at_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..c9851fe606b2f647fef96e6db9d2c22090f0ba2d GIT binary patch literal 379 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 literal 0 HcmV?d00001 diff --git a/data/flags/bd_flag.png b/data/flags/bd_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..975b54c6899d94d8dab3fe801357d69fe70b243f GIT binary patch literal 1361 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~itEH}6X3Oa=y)d!86DP=hR@x4u1 zS@f=@si(D>L`9A&Xt}KBWDoN3aWD}`_TedSlI!V|GBG?hL&LH8W7EOO?2nFiJIZyk z3ruZE&|x!e;D}hFIVEp*j{I(GfBqi|b4sF5{n@_%{K|H@vh;nw=g<6q=8vNbesJmB zujlK<=lN~1TsAYdS~og6u_~B>%R!_;gCUS%5rYe32h)U?hjXXsPx3s_Eo{WO#pOa| zZ$yY^Mz2uRqu2i*CmX(VsK2(zJpJPPn=EE5(^~VL*D##9{ql3RVe#LVbwxhcw|20* zD^Ckae)Hd8qwS-JIcIKv*N2opZIfAQ0()JGe4!cK+?yeVN5S6!R}n-zw^GYmHRrO%s6&wlanPBU-FIw{LjE zGOhopj{N7!v;&VKRv-S?$5U-BbBfnSNkZ5mm?ipm&Ai=0n@VgB?QZ?9m;Rg6pSR5> zs_%xuiw%p7z5VZnF>HTrlv=2oc73LnwtLd7#VdDb+aC9ii065!<^Cq-#mAFO{QD2G zHHW0n?M*zKaAM&+uGQWbr@Z?k&Cgr>r{(SQtT%R{Py3=4F)Yh^ZeMSi@cpG$tAea} z#(6%LnjhIyQy*_++A&op;q%jm@^jZuw7>jybgh2d8;j`FKvSUIr*O^7NAr2|${(Kyk+ncViTo5^|z1MD8Y?^&gUqm>M=mD3tnyqUj zO!FXK4GRg4hAP`KU6X&a zc2#SHFnp~_xbi1*YxQyAJwS!2p3G;~Zg1n<{MUu?%3=YtW3tuRC_5{IlN^*}9pD+6|o+ zm!5qJ?yg+ykaX}kw~z&?9Wq8QViYz# zczZO`jn}TxHhZsjjYV`j&9q%DQBm?d;GSIVjLcSS#x;iWN*5;W6{t1qE1>Dr`Xh+KZumc zzsjY!GN3Twxl;f7+p%V`yf5Tt-7#&-E4g}E%5mk@$=iQcx=qu!R@>)wXUOYQ{P9|A;gds4*POmM sv*YCSMo8WlU{!z>21boFyt=akR{0I1Gj#Q*>R literal 0 HcmV?d00001 diff --git a/data/flags/be_flag.png b/data/flags/be_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..43a9442d397a54544774b16ca2c891646a818e01 GIT binary patch literal 334 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~nGnaJ|;8wLqcUo-U3d6}R4A*~shQAkmiC@?uQ_ z@9qx4oCMBjP2PnDjh_}>eewUat$*p$>Gt{SRsppjgN7Hc&Re_6@7BA!G5@bf?Q`RP z_g%X_ShxSqxiw$nkyv#4CgaJ~W_AZRaXK(?Ffb}Gurx3TFfh@8!+-`H0^@`qbG7;A Rgv)?rJYD@<);T3K0RTCCPw)T$ literal 0 HcmV?d00001 diff --git a/data/flags/bg_flag.png b/data/flags/bg_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..c7b795738a8c791e8656026c7264a98fa8b6aace GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~nHGr7|b~7NF31PZ!6Kid%2*Y~*b);9)o@v5{TK z^!7&H;y`7?&XtEaI6lNqy;Z3?H<}r!7#ZBt`=w}n*`h19&V}b#z-$JV1_l8JCII9n33WRMz3_ TJ-}&I4U+P7^>bP0l+XkKnwLg& literal 0 HcmV?d00001 diff --git a/data/flags/br_flag.png b/data/flags/br_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..98bba07aa3691bcfd24c894083cbe6bab97243cd GIT binary patch literal 3998 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 literal 0 HcmV?d00001 diff --git a/data/flags/bt_flag.png b/data/flags/bt_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..3d0f0b01ac32eaf0655e4ff3205db1b0f3eee487 GIT binary patch literal 6709 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 literal 0 HcmV?d00001 diff --git a/data/flags/bw_flag.png b/data/flags/bw_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..d557d29b1d5a34a7ed98ebb8f3675bb5dc044954 GIT binary patch literal 416 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg)ZdndP)BnX;W|$pqu$4|8Zu*+N&l_noCvm zTUeg83heVf@b{-#?+HekbK#daa1*c|-IWXoaG<}2fw5M)bYoJ`ERd+DtDnm{r-UW| D+){Id literal 0 HcmV?d00001 diff --git a/data/flags/by_flag.png b/data/flags/by_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..890148f2b8923b7250966c660bdeb5f31ca982e3 GIT binary patch literal 2828 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 literal 0 HcmV?d00001 diff --git a/data/flags/ca_flag.png b/data/flags/ca_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..42c1babfad8046f6dac1a6e29b11feb5011149b9 GIT binary patch literal 1341 zcmZ{ke>l?#9LK-b$S6H@bmveQ*AL<Edz-AQE zKUh!lx{QtVlMjy+=wWp6_%VM#x87yV44U475Rm7u0)Xk(br}GU>EG+kjftp}0UL#e zcAKm=#g%J>008bp`6JGzjL1h%A!$ULj`<$?jk`Bbj+Ubh?`A#B@3pVQBEWeTiRQJU z$T7B;{Z2PKuL-B*&kl*k;6<$TvKBEtj1TV&^g|0zZ;3x*+wzXS-?o_Toi^r{GR#+8 z&)`amyd_%I3clwoNdLkARb4mhl?)j)_!Q|}5j)hhG|MIJ3Fk(1Q53OK4=ElBKmZE> zN{&8c29ZutbkZyajVFeDS*XZI4m(1mKa0ivZ*R#@oj{6QAktkurN^21az?PH#eKl; zW#caIj4-t7b6x=ru>10r`I;Syu4m&uL49qnFa8q9FcoCz3ZFk$`DEfcsfxlNj2Dz_ zN?P5Slq@EczDJ8DF3kswmDtc|_4=)OE_C);v#dzGqfqDp&&Rt;VODB(>H9ea&zRFQ-S#uVzV!gSQC*%SE*VT2*bo+X8LGf-@>@HZ5Jyq@H~f;%VJ@4 zS-!;46uP+-Im-SmtnfWjF=m-L#;tcAZNcY0_$bCilzJ&u^(@Dd`n6LT$F~ZCHp&T(U)!l=P23J>Yq+WUZsUTGt&k1iwAU zb*g5fQdJ+~2XMHeW<{%3*~25GNCf+8NBlpUwQ!Bf zl`BuKm8>?A#K%A%%U-xntzPHY%Rc7DErWw@i$GaMoz1jUm?UB>*pGAZVAfJQTD zaZ!(Xz9uHd-T)VLobq)%U}{pgd`8_6;{FFFlRI6&(gjH++}pW!6LK&t4!pzQ$O9k; zu*)>Xf~BrxFxCPIatGZ9PJmE=a~71m?b56M_B--~xD=Jn@Ib1k!RlITX~MD=N@l3j rgLgt}W!yV?zzzf7ZzTu-R3dc1cQ6l>5Yb?~o-wF^ApaUa?2Z2b9E*`< literal 0 HcmV?d00001 diff --git a/data/flags/cd_flag.png b/data/flags/cd_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..dff2fa1cbaa9cb843716278921633c6e1e1f296c GIT binary patch literal 4667 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 literal 0 HcmV?d00001 diff --git a/data/flags/ch_flag.png b/data/flags/ch_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..5d293793440beb460585f060f96ada88d3280247 GIT binary patch literal 588 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg)Zdnd9i*wBlK0s5>c)B=-RNQ)d zd!rt6q0E7g|1Wx7cN5O^R8}i|fB4XmL(DUd9C*g+qb7Fm-~-7gQjL!3Z3|(vV5(up zZ3dD|gJ$T7lz^=_xjuhA>SVTM!!EJfzwZw&n6S6z>;1z9?|thTdiOR5+`pxHRQj@& zrS_Y+zpqbEm@j9^gw=6K1~V{zXb1Z)aLsHHOYwl{`yIcozrFV{QNpH#>!$acoed_h z)mqQ6@_df_!q|R){+1}+SHI@__a|Q1S literal 0 HcmV?d00001 diff --git a/data/flags/cn_flag.png b/data/flags/cn_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..43c8498aea239d88211d23bfb4a1f9b8e1b92d8f GIT binary patch literal 1627 zcma)6c~H^`6#juC0%@dp007j; zt|Siy#%{Q(iXt}QPPQok#P)C@0F|8vQbnS2>W~WwkZ)Mt%aXf_3M|a^S2h43G&dXs zWasEAiqMN>iZgTwVW_$vQ~g-f2LO;EGRes^a&Y>Q?-`VrL32aaK-Rz`sd-z`khTWu zQ$ay9^g563sd1Dr8ZVQ?tDNdf(Yd)rgCQXG>4u!*$e1S0zYL=&=A>Lx&vB=#)ayOU zDMbjW|HE*LUJ*ZMj7UW6t{n=mJz+mQ8$4M3TzaKpHCJvM7>+;^MpG}WO4^(I1$vgO zv8>Qi!KS$+FclzxR3T_o?EjF~0^{?mXbk+$gYDti3cvuo(Ik;`UU}@Pp~3R#=Y!n# z8ey$#F1LgAw4zhfFq^%p4xz%qaiZUAIIZs%_lD3wC^X*^Poqwlp|n=U^Jn6dns}$|YJyqn~sKn=EtU{~q3QpAAFZ%5HU>ZMVAueC-Uu8d#&1 z@|F$t<6S(021kr<`)@`@ZAPk>zF4^t-(INo+cqvf%RkhK;T)5k_}6StwXvI<(D7{J zkE2jvQ%r|3dfu36GLeKFQ1Uk&3W2K>`52(i;c4T6WN2L zk2q+N(P{mVq7tTL3?&oSZdWq`)(o2b(l05lo}8^hE>dF32qkf&mKhVy7yvN!ai*ww z&mXTGvv31VEe)RL@@*>41$I(|5DkgmmmgwVwUH{joq0a~S!$Fa$I17J?w4>7S96`h zBXWA^B7ymJ0d>K`wsrcFWWB=g+rqnA8H`!?o%SqMpK$2}G&7}Uz-ZUYYup>_5!1ZH zf-suXtiH|L&0f5zH(RhUG#?jROGmf6JU@I+i~|1=nPv=0w<{uAnj*n77Iw!fOMuS! z!U(!FA#Tm(>6+=ES{m zh&$l^;xTb!IFG=TR3)x2SM1!+7A)vpUb4gHz8jfJsdP_U%Wh08G4SlVRZn*;&;OjY zmy@ceSs4h~^FHxKbpwnMaaPCYxYpuJ|E2+{Q_XmLguM6wH$yx9F<2Gdv!hs4W4gr? zSgvNUSG+wOLP^><#XFV%OyMAo*iVY@Cdt#1`V8sp%%1irn`n^QvF1T#A>&(FJ;Qeg zQhh!y{b}X`qmh#!vf|f5AM}wixg%Y@c8!9JU4}v8S*x0Z*(&e!qs!A4E6w1;*;O<1 zC+S`HU(vi`=gEczr6$o;H;bpYp@>591d%d#72s_J&*z?)o9I?f7x^9Zb%DJZ8jxDZ zi~+rFnQSGQ;CjTV>$y6IVH3qG1(rnHKIUpniXSygN_MuI>0Zk*!}Htl{E)@Sl~NeX z@nPeK!%85uJnnVhsCld;JVx*nYV{wAh6VD01TYeg|2NULWEpAM7Zk6id9zxOyMW}M g)JDa&1ap;ji07IhfOWOUM4|iu+4(T3lECEr1NpwW!2kdN literal 0 HcmV?d00001 diff --git a/data/flags/cz_flag.png b/data/flags/cz_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..559efd62d002ba4690ab5d8ca7ec1f2c19d9ad06 GIT binary patch literal 1513 zcmai!dpOe#6vuy)>xR}v$`+w1h0KiAY+cOjGDA(R+&1+pD`rc@%gUl?xpX0V&9oF= zR@-tZw`G-Er9xIJJhYluTEt5Td*^xj`+d)O&Np67GE&pCe_Zh)Vs5!eh20DzIV z7h#X4au!2hSCgOM!=G!4?m?m_0Z=cxKw6ru=@>A*4#WZgWW{2Dfc%2hnx@_fZ<2@J z8y#~)6L=7|mIVMhr@RR}1LNPT-Us`?j)S*;|Dj%r3pjgm|FfIVyaTe%8xs!i&e^oF zXad?{@a}5F)2j&H({DeZQ_v~rQ?>PdBe^e-5r@cE+@o!yn+q4}nfwe-$=J^ZQ9e{_ zW}$!nG!b&)zpYKp-+P9s62|bim=+nHbdBv!^2$aIj@dt-b>-9%saU+2H;n4*#k}>5 z`lO8)2a}y_Ipc~Qq3ByUOMLwwsgX6I*-rMH2UKl}hfXIGMs*+zk46@W?)#8Y2#&Pe z%|YamI6V+zF_ea_GV_H9?BZ{yqUKv?e*fm&$>iBY1_5gJ3cNU-%fwRKJ%{PXWK@;h znPfmyAFW}DF7bwbVz50Wa#|1&kvWMbJc(wXIC-uzCCI2n2cQM7s!nV0HLRW(VC0B8 zc9)+vC%wx7ro^ei+4H^maN3>G>-$pZpd9qtyAe)ZkLHK<74xm{CKOHQfM>#+{iBLG zrrx5ep`84gMV~FvmgK!v9mKn|@gYkHeyL-Bm?ZB86mSg|oUg8#9U1-7$2ry?Nb#<9*Y zM&an8Pk~;)*t_?#(ycedOB{E`3ifS?+yjiB8GaD6(LR*ROtRTUA>zXB>c(pIG@3C; z#*U^c%i|RuzsSns!m>^Wd?U_}C=+L+Z8=iQ?rAqWKhOOI+>ZBwX>UWz$Sw%ZyfEBy zmGa9^+`0OENwrx!SirU}a5G=$^1iv$wM8EtiC%58<3PlDQYgtJonocoBaOR1vgqj5 zD`X3D31)40!rb~LYcqRN8=Ip-fU&9VISC(9Ld-{$ig(LyQBooflI~$Seek2}3B{sE#|2Lo(hRZolCoAc-|iutYU+ox7*~>llU^BaA82hLE9rR{DhXSS$DGu zdK6CaLSJBcBiyR?S#c9tw*pr8g=8R8t*kYp9#+a%)KObc%6U+Z3e#;`kx>#Rsam+K z>@{{c?RDrkz-Y!$@gWJB9sig%Tih>0A^`ugwi6#+9U2pSVos4MQUg#AW*SnTal5dx z>idNbUXF2p4xlw-SQ=M|f~hl^2_%Zt78FnPILIw+TJFE5{m#gmm|egsV|g>&8oOnG zZ#-dyv7Cw&8}OjAPIj(WLMANu(i%T8y}U$wz}}?h@*Kac3H)RjU9LIj9AF1;DAu~d zN9Vq==(@)f)LnnQo}@3p-#`?E4NbjyrCALu3*N+JBwo`{x3I4!%lpp(c7iTjWWz*q z@uX)#Po`o^LuZq({(#pYdj3x%rRy21B4K|4Q0}AilA(Tj{u5YHc4To54I^#&IBT6y l!Gk+|J?dojf2P(;TH>>+P8j>i+Ew$E0dEgKf@l{l`ClIMyix!F literal 0 HcmV?d00001 diff --git a/data/flags/de_flag.png b/data/flags/de_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..cd29a19ff2cea036738e79cec7eb7b5f6f2b9d62 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~iu9m}`>_P@dtGr;B4q#jUq@4)QiA@HhmTW=fI3_dxf8WV&1+DWEV2{bN8cFd*PMc|1a}o2{$kZFfchVa4;|`FtA{7 zGQZT$NDDmofk^?oJQGysr3$mwW4XZ@J5TS=;rhxd(TLYn1~l-YlXXimYyIp{c@>b1 Mr>mdKI;Vst0HcselK=n! literal 0 HcmV?d00001 diff --git a/data/flags/dk_flag.png b/data/flags/dk_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf042cf79ba73f5d1f79b43d0278a1694cbb2d2 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~nGrN!e6|Qw$7@@t!V@Ar-gY-m&#!c9dv%C>fsg zc)!3O#fS>VgWMHN+T7Y3JygXOsefo-vlHj+zx`6{``-7f6XpLVUJ5_F>FUx6 zYu8_i3+I{V{6i_XNY|Eh~H*b>M70Uzq>=*2< z{HreXzAMa#pLZ?J++t^$(2vFO4acW1VVB+Cn-&$$6aUw9N*t_%!}ES@foAr-gY-csZ{Q zKWMOLux?NlV8p5sXi9_TO8149&ktH8z1;P#Smf6CzehciGH;g!Gixlh;Nn$V`b6W3 jPzQ#U2>Th(K!bcGbMhuhb}sv6VIV0_S3j3^P6%9E-kZD!colW(_}A z)um4krk%~YWNI4hohuXj{OQff@4DWl%|2~)?mKgnjZOdg5C7{c(r|T~@?qWW3tLCR`TW?@TK8pi`Lc@QDBV8I)RC}=w=

{j6WJuNd7}v_W*JT?>KLS%|}F3NwCJ!Sdj z#s4<`tB=`UyCXK&IoEhvczKAn0N06r15XX6B{&>GuytUzrB9%YxPs3*fXb`xEv<=EY~dG z744eoy6fTog+}o+<@Q!DDKPotYVE&4{ly7$_mZ5$hPiQDBhBvl>Yia(7PieYWLE5| zxv$GkU49u@8ND-#Ey_f2?vFKd_2M_hxMp{k{Mvn4%R@I{k?q8p9jy#%{5My6uC&_s za7WqN+e=@sU-vrcv}>9?f8W3N{7K?m@aDP^ z>*0elpNkzFlwYuyq3 z^ykS%yX$tU){~ZBI~_4=;bdw5SDq(@=bp4yp8j%D{t5N`_2J1A4bv3Dm^0pFhbYKg z`1$AaDxGy9nPn@15%c(b{w)99r9PfM7hB)!ulRJ_OZJ@Qn&0{F{i`!uB&=9l7AL0G zPF;ar)dZH!X7ga-%o<{#^a}>yNw1H+ij%1-cn6a`>Juee(D9+*`c6w=K_` zu6pm!(LcElrq6gik-6K1L4bjSfu-U9f4v7WpLeqUPn=&{ajfU;@75nnjNYAm#P?sG t0hC`L${3g!7#kRf<6_H|Ah82AKbfag=4U_N_@ouY_jL7hS?83{1ON#G2bcf= literal 0 HcmV?d00001 diff --git a/data/flags/es_flag.png b/data/flags/es_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..ea801a381ae60af789ad864f52ed3a05955dc0e7 GIT binary patch literal 2395 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 DjRpKB literal 0 HcmV?d00001 diff --git a/data/flags/fr_flag.png b/data/flags/fr_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..cd01be597728f024ab1a30e20f5d959b07d7622a GIT binary patch literal 327 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~iuv!a~tsnn0l|o-U3d6}R4A-YDqcAmSRRJ?+F+ zMZt_lqZF zC4X|wIqjcwziw>5#Q(&Xfyse^gMm?jfu(^#fPsky90oMtU}x8`kEf37%9I$8jHj!g J%Q~loCIEhiO2PmD literal 0 HcmV?d00001 diff --git a/data/flags/gb_flag.png b/data/flags/gb_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..9246d8cc83c689d81485a3b11f40bb181a8c7054 GIT binary patch literal 4182 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 literal 0 HcmV?d00001 diff --git a/data/flags/ge_flag.png b/data/flags/ge_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..239b3a66885b13cb97deb22141b2d6106ebc8db7 GIT binary patch literal 1657 zcmaJ?d0f&56#pT3CZd*;wM;F`&6B3Z@IX<@qf!*iWh!XXtOi)-i3&9j)=X_3UU@K= zi)Ybcswd-k)m9oY%1rE zIlc~{u9VbvdeCT26ENl*e*fD0*RD%$!@E{p8O;BebLH@N(LGJ%{ryw+5#!@tW*L*q zoKq3VUqvy27?0GInh9Rhu-7z;7am%K6i~H+PumUJuYpJa6J#+QT)T{smz!fYmu_Zk zGv@hxEejZ~%#ya+Beb;?*0CMoSV3KKAdn}r(wo>Ixz@PznMD?ix7oXIW}?qMIv7Y! zlI^G(DnW5iSF}R|Nn{Eg&(EjMS7xSD{=I+~VyqL^{;c=#9TdRKEZvrBrz=nqlwP#Vi#nMIdpa9uZl znaF2dQt90M?6~1nVMv)TT!jkHZOwn#u@@ofZ0wzh3Kw0Slmv=phlDxc#|fHp0lMj< zRFDVOIU3r4-XlD;-uq@WIH#w}-@@H1B07}?7t;3Dfy=$qp&nP#JiD4IL#DLk$5lylj znLCX52LaBuEM{B6dqKq;VAWvp>%JvL*#Ri)V4#;^ zi5LE|&GVK0^ZDlbU*yp0#_}Lyz3*~d4+Nc1UZ}e zF%=tAE`-tUSw(Uv5M3!6baKz>y6nDv<>~t*e$N3wA2vTZOhgV?{2Ajs5WO|1S`7Gq!CQ@I)gc?9e}jONod6AS|v797=kgYKH2D8Un}GI5C5>YDl|jer-L0SUW=2CD<(-tm$E+K zupD1>yVi`Y?CYNQ{YqXROhT{+{PEzttC;%6YRY;RxE$h3~zTHzlWxc72|-n!_POBP)A3XPeer{U1FpgBY1)I@t} z>Z+8YUOv#P)dj)ug{i{RkILq`DM#H? z)ZYzYo%3mP4P7@=Fq6oIF4=R|!=%}RG})i63)egm7KwVxjZM-NV4*ZemD4!tpGXL; zep!%fw*N5rL(I`1BeDz^(mmzG=OFTv^s^>B^P(~=Mlwl!fx3_AY`idQ6LxACv_tb} zs>eH^sxp2yYX%X|I-AeIk6+lPLQ$sf%vp>a72mJ@LEWOesuGRlo{n_B-pGDYJ=qP> zDB$pOT_T6;VPa&piGN+>{i0e8+%+Qo^OMJ4@dl>^-?-=hdjwxnVXJ)Z0;R*o(CGhV bq?rzqhdI_Qj#)>lp9J7{H~`D_B3=0#<`@6O literal 0 HcmV?d00001 diff --git a/data/flags/gh_flag.png b/data/flags/gh_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..2e1ace276887616e8c2397d94280d3d01645e277 GIT binary patch literal 1084 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~iuPk@xmp3JeU)Cp}#pLn>~)z3rPLlFHEj@&B7M z@5*lIFlKSuE@0p2#u4J$S(PECr)FyE5^R4#nKR?cW)(S(i$_*pThVzTPV1VRu3*lG zD^5*PI!CoUxO_W`G#2XS-q11L{rPDkb53hQcF)UmHv3QKeM_D+xANKCncIUofeyh2 zbV`r)sxQ`#Rtj_9WMfr*&ts$1q+SLN1{MY;2F3;k2L=TO0ZeXT(%lN9t5eR1HEB%B zlsI|k*Je}3oSOABPLzJg+`ss){*9A73pPJnmr$Qm`sf|kzqd{6kH_y>HGhB1(q8_E zlhXg9*Q@+q_u%}#qNnUv-Tjz^)80ib`M3Bg@BR8KSMO}?V3@Sz`GmzUcLq!{u@ztS ze1bEB=fi2rrTk~^Ke)@>cc;jO!LuOe$mJhL6Yga{7H5`~{y52+Kj8cEFG)+1G-EEL z+rQYm?nAzHwM1xqeEt5N3sRpHYpy+U{r?}w96jd#`JcWVU9ejIxXsUlckQh|x+~c4 z`1?F+*}~HAcWoI?PnnnF`}*lOwyn8-*Z-y_ta-+$_K&BeV#gYOeyd$3l7F6`j=!Dr zYOU-xE3U}3yRWbLz1O~s(PPqc@5#Z9c2+M|e76oa-n_8s!+rhpKAyeW!Bt;pvhCe? zIIMW`$`T*GIU9KvT)VMj{krqAwf~(XCkJ=0U$9ei>GJufUY!lk*=i@Tf99bZ>GAopH6$Xr+vP}+81Y9 z{22-_*gjYhV|+4QBIumimerT91)S%4`)bS7&AeCdi3fcvxm{8ybM&9ehfh8$+O5(; zbVBRzy*f69tAFX&Z|CNiZM|c)`Ty5F>%V`WZesK3Q%l6_EyF)5)n0nOBDXlIe~tffy@qRtmPRw?R6Ote(aTV$aoJ0E z=2IQh^!tBL?x<9-v7RkDslA>@5nBRBN&eXK4M?ov|MB=O2X&Z!6z}T?@jYGrT-G@y GGywoQL70(Y)*K0-AbW|YuPgg)Zdncsv+X+?jsi`w@N{tuskrs_ zsv_SZ1CfS@(-Z_Ej-1g8@N0M=Bg44S`K?Lu3AGoTeH&7_LWKJ+thv8@UQOlC%WVu> zw5KU9zh^2n`I8LaxeI2D91M&K3@i-{0t`$J4CtH<(#MT*=3n0aEmgli_tm`DYrom9 zU;q0{+_|goCEE*Dldu)kKH6iyfRDWQec1!54rbv-20}yz+ L`njxgN@xNA#^Y)k literal 0 HcmV?d00001 diff --git a/data/flags/gr_flag.png b/data/flags/gr_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..e6ee4cbd6777dea201c1fa2b5631bbd38aa77678 GIT binary patch literal 744 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~iuTtk2~Wr3?&ArJgR1Ar-gY-Z}3rk|@Fcp**Me z+QdsG<(+HtQZp(zd-(2ImAsI+xU@q-$jYNJcG0`P?6HfYOZu!zKC7`TOi>k_k~YEq zllZGJ@0{gFE=yfrkoWoLoNoqaPVYHC{b6NAxj75aUSyE4y!&5GhGo(IS;u(Ue^npe zd%MT$>%Q z(Qf{Dv)0TDzcL@3c)fn*95ylTLW_W`b(LpdWvSNuu$X^}*{0%))*jIYm$rGaeb??Y z*xp^L8*R}i9UT4s_Ma#T+1X*fwhT-S3NK-aie5M-RDXze!~m*rK@&z zt(tk@V{)s;SMvjB?%Y~-eah*nSFUB>ea^dp9pnv`h9k)dd!u6h38p;@3pHBJxTEyB zYsQ(kK_}O+C8R!GuJwu$sEC14AyfFqtx5h*+v-1C?~Pffxb^FgcEPI0nGe3a@zPq} zSXfuy@%WbFijcb2)}`;YHk|cpeU@R%a5ZadmiH#rE~Wp1OE_JC)@`z5TlQ5{_mv4l zc%IEx>3a+>pvDLLJ_!5g$YOo?!m-N-HkKRnH5)DaU2!opVVWhci?9X*2g9)g247Qe z=A~FNJlC_^C>_anVEIYc-3uYUU|>X!d@y_4-Tbq*b^Fw8X1Rg*p00i_>zopr04kR< Aj{pDw literal 0 HcmV?d00001 diff --git a/data/flags/hr_flag.png b/data/flags/hr_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..6757587507f31999806130fe244bbca590b2f758 GIT binary patch literal 2288 zcma);S5VW9626M zmW-WHaQa;2Z1*&4Ww@wjTv|H55iEV$IOp~DXz70189zGWXU14FuX`L5)`**LHpaM3 zv~nNGkc>v#>yC%Sm5>Jm8_I28Rla6_rQ^_IzVhOKqg#UzbkNn@1T|lcpO>jEHIvp? zJf+BjIi;Zwy!a17W5F`F=<|J_u?OenhJu3@rq7a{x_>P?fPTfb|X9AbsVwA=Ck&n-FQ;GHt-$WGT6l5JgEPhn~ z4musf*k2;O;r~NN=trPZj0@M6iNxq@0uSqp8C5pcpDU0V0mkniehDQEA_j~alaRA3Et~G{iHJ=bKvhjJ~F--kr^${Jw=)mLQoN3>s`wswEhQt87 zyzEW|yS{R5f=V&3Y_JV2;c(1Tuxw6FB`~jjfabNGHrGQu2T?jKd zA(iQ@Y>k?~ET`gDGUO%Wc2V|vhKq-__#(0H4v&EX?1%l zv_P4W4@CvJ(eTB4+`V=dwsPbU6_?J>JQQ>7`}4v`5_AiC-(bD0b9mv&=8*bh)QBfO zBjHu0c>zZ|7iVYgvXxPsiteYEHZ@m}g0v=R)1L`=7@Ct92?TlFrkin-bf4a5+vQ># zv6tI1GgK>vJM0b|B3h*Fu4=S?Cdc;uBcEh1%?>J`#z8syuuU`%a(4XMLGr8oq=xqH z57n%Avab|z8N~8^uyA_bvF%#kVyJ^`(M@%bAG@fWYu=ugrM%(dqFazo%Y|H*ZP(ziXo)*a#@7`;k&B!uWRc|s zHwP+3X5SQ>QjPV7I`<6Rix@7NY;ulmCLyc&l&tK#GC+)|6(4Uiv}jr%T(D{C8ON5) z6_Kn<6+yW?dyNb1D_!bcPnRy?m;lJ3Xyp{kpZdP`m!ZnahAda73-^HQS< zkyv>RZ>u1FK=DXq4v?bfaE}FS4S%qIazTT}(ShLePA*@**x*W4p{MjnsT-UX5{L)g z(X(#Z^5fI7F$=4W3R1r73h$1+lu-#*4IvC)VUkIo6@5Kg%VV5kqRzTWUYC0JDaLV^ zrFJwjiSy}`lF|33hLWCzg)19-i>zuIJ@(vt4L1&4qt&O2c{p08r^M*RHeGU9*>X`!Jk5l4#WGnX|1}&YNT! zUxjD0F+975_Or++w6BTp%|C3>3cnGVaJ2ROO?u7Pat-lqS`mrXuQ`m#VvK;n8&{Yf z=R!gPDl;+1OJ@)Mx`?%+EV?(#uQ1slIf}~G^4T%8pc^?o@ndkb4&045 zG33hiJ8()cp0A!jpxvrQRL2VzmU1~EN08e|4Ha)9xMV!(mp6zV=zZ~Mlp9^%_FePQ z7OOy5R;xYq0H!yLRLwkph{({wmo^^yxW@@>TFma?+?nC2AoSZV2C%TU!;8$law z?Y0KiL{1PU2cjFk?vcT5nxc20xcIN&n{w(l&=oeOKUR%%f8?(bq#U(X^{RYU z9kv*5h(_O>E10xgU)Y3eBPJF)EgG_ljNQ4^kP-O!-Er!c;+`O57KqCL@kSTkvr8Z; zSsrJ;#0gVu;wawg61!)Nk#-1dTDCfGB_>ul7=!no>JqrKb2pIezXe;H7jG>1|t zW}sd&bvBCjF77yhJU6xch~z0irlD|CYNJO_U$@Or+Y8FX9v;6AtNB!uAuC($5PUeM zg0{bEeIYelo!UF(^KfD1La@5k@RIOWzmZ9O?dvTQF_Ell`JhnRyK^58*iuaS@h@O0 z*#dp*kWW5EA=cw=d$U(U(mt`-`eW1`KPZ!6Kid%1Q8S*w52sm7nJIKIw zL*Rnw{SyuhY7+{4jxus)-k)t1Uw`YV7b8$TGWe%=>tW0`lfI2tes`UeIHtzHsKCI| zz#zcDkY_>GX=S+maMhb-4_UF9grt%I9mH2K XgjaI*^A*cDgQPrN{an^LB{Ts55b{aI literal 0 HcmV?d00001 diff --git a/data/flags/ie_flag.png b/data/flags/ie_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..33c3db8b78d789b9ab21ef7a9862bbc30c27b992 GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~iufR`IvOtw5p6o-U3d6}R4ARupV-5NNw-EfXrC z)5c3@%ug7 zmfd+SSeL$cNzBj2df^5J0R|=q1`Y;B1qK$Ha2U|Q2YLPE5bip`E$T`j8BbR~mvv4F FO#qLcN5udD literal 0 HcmV?d00001 diff --git a/data/flags/il_flag.png b/data/flags/il_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..0d801719bd8bedacbf1cec4bc615b6fe8e5ff5c1 GIT binary patch literal 1611 zcmah}X;hL46#Wp920<%Z7$=vp%(arxOj9!pb18QdO%crnixw2cHbpBl*H(itjnteJ z70ivyEwgk&s2mJM)50W6vm$XDVQA*h{F-_1+;`u(=e>8%`*Sb(c~?{1)p|Y3jh$2`<`6^$%9ivM~DH@`p>>j+m$DTl&|#wm9JH=2nfG(scAz@iD$$E zY;D{-V{==b^{B&!OruMr7V?VWZq4C9oq@1)|qh|hh>?8AMwR2Fe@7a^1JMttI z@Fag=72pdz34x64ocqp*2<#jOER`dF^SWH)K*S7i7symIgi%fZX$pAYKe^TWglwMp zLkdtikpi^KMF;h$a)o;8sRhl!MI9LRXvRuVB_-)w&&!Ad)00uAD@=igOcOLzxsv0CLJN&Dj5#q9QZ!2@t3L22!_4@w6x0bg@;(ozPntgN9B1g*ZJGpSC zBjLm|wjQ2hYG5ui5H$B&Lgu}&uqW3*)!<%)&>>|CVr?5Bv8Vg*?yKJH^l@FS)X(as z6ttk>KdFqN5pi=qM)=Mmoc+RHfM#1ltDjlHmxb{+fEB`1IZLs}vl)(6nd2FUJz&Eu z*!JVDs2gR>!a`{G1OPWyJ0=?Bx5_(|;v-mW(C^hZ5`!;bKy!NJLN_*{?M2lInUnT&_j+HxvO^Zmb;?qtd@2m15Lwyen1f# z^NK=fjBw@ra)5fyk)&(em_W3GwC`5^le~ZR)Aoho7UCHbm~&uortS12nr9_{ae$+R z5qx>AOu>97$FLR^eq9S)!tGiP3rW}a%D<~EH$!}Vs+Smw)8P-xQd`x5(F+0%?7%B` zd#mfKP7x3KdYT`_4#b~N-fB2zPi!tLU~I0L6LN4)NJ+mm|1u07F%tc$HpHcCs_1Ur)tTc zAF*jDhougZesT#TYS8DvnD3~IWzohlJ63pT@52i>lB=)DK;4Yz&Vt0I=GLpm3FzW4 zSchKK8NgzEf3#3Ipmzp%O~NM5%(G~=tGmyet`X$aM;(JuUP~1ng6AiJwst0$sWGyH zaw5w`OM7#LZsVp(&Lf^I%Z1-`v=?DB2l0CIhh>f0<#jehQ6IX$3!GC5&;Oj8CoT|T zCwMYfznGy0#OYIRdAbn1ksR=DkaHx?aB5FPeyx!6hvK)R`}4r4BI49~J)~-LfMn<@J4n}Hm%cdk{8h-dEp&{C;(iY?+xDi{qPUoM zm=)x-vuCL$R=1r!U3;>}vca;dtn|hD8{4eggge$)L-6T5@X%t&tf)MGDt%dQ!bZ|? z^m`WF0A#ot+21nQ#r!}IU-!x9JNy%F$|y03Wg}Z3N(r`84RVrpMNNvw-@JZkC(;qj z4+h)oARo_P;yRyWE(Um@)3`22Kn2jz#u^Rz3zA&X7LG$$mU5X-vxM#Gp-!oR1sQ}w z|DqWMdgEfKk_a`Cl+-06`p%m7IBHtVOIw`=A7%(}j;q+wahrmK1$b~}%33`9Q8J#| zjI;M}_}OQ&c}VdrjyT^`{5Hy2M41=#qJ!-zu)ISZ9fIc~4zi?5=!Id-TjJP)kB zrTXph>S by6Y^oq{si5Sww(`%Ju$LHY- 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 Li4J&tI4=L+=tvc( literal 0 HcmV?d00001 diff --git a/data/flags/ir_flag.png b/data/flags/ir_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..c80febd59715caedbb64ecfc7a1956b78bf0ca38 GIT binary patch literal 4471 zcmb7IXH-)`w+%=y8X!t<(xnK}L?E;vO}ZdG0s^5)?_Du~G!f}lK#)i%(xe8IqF@Yx z&`Us?^d6*t@yGk|-gGkc$N?wv_6GSH%@VWR;60Q5TA5EG(}{#U3d zi1%+``$3|iaM06&0IvRB#T^ytM1~vU!rz9~FdZoIzBtBi5_ep9i%~ORy{MF?uXky^-XV7Q4o) zYZpw-K-IGk(eAlM6>Ag=Dxu-=(1DA*1HY7UO5-P~=qXOIb9S?x<<>M+PYz zcu$X3ekr{_oYb{>PLAC&q0jW$1H0_1kue`)q>QhXPBCoo{1XF)cW z?SwUyFk%xf$}R#B0VIH;AvCJD$$8R9-)NI)mjU=q0F3_|Znws^&3$C^x_^7<75Co) zsK~}$T=RrJ;T67)1gKtIIaS^iLnXHf8 zN1lb9+T{n4p`Iz?2{HPfdPtfShHJ&c)x-PKhyA{JQ*!NsOT<>%cG7W7XF8 zcUXnRf4?V5I6XrIUZ7@>@oWDwMng&VLWN@+-=AwuIiHimxA|im@+81{?3Qqk-y`$# z7CBUri*t(i!BFGR@mrOxvRo=>OT7xJUz1Gz*g*~ojLu1yF!;BVi*_MpIC7fqLCAg` z2k8VOhFDFM$%k(sqj5vS=7^83se> z^Kz%3PO$Pg320mETt+Mje#Xkc5%s+ylA9nZh^pM%@)fy1sm|U>!q)jp*6A;8@=)-P zT=qP3sg8X^pk$)cdskE>q-v&lg>`2E=;83rL9!RUgV_<_Q$$Msk@Muhnrh z3B^s$Nq>FjL_t?|l^+3*^_2tIzQB@S%bD=XJv1nfTj?>9VTY-*rop%9-Ch zJky@&)krTbVa<|>wVahw>(4p$>RFPGvCM-;@yj1W=r6-BEh&CqP|YLeI5*LoOEyj` zw~NfomYZFQzInd5{A5Gzh_!fOnA?agc^KAti=b+m;44lyx*k!xKsZ0E=`X9#Hy@xqU0 zBVynK|Kg;Fb|P03D)SO)`FPs>*(NB3!O<{~vdKBU$>cm>Jp`VwgeVzeM!!j2eqi66 zo}i@Y2T3}j3+hew{iHkSo|fp;3NAwYN^44oBx{ea)?^4yR?&?I{b(0~5~XvQU{y7f zr+Cjpm0e{}FRO4^{@09@$Md+|GopG&$~q4v9C;U)8PCGNAx&sP@D z>(c}qnpY^~<56j^X?Ux%O}n>DD}aS@EuQSiEW58_x4x~;wqft(h&t1J6dt(AAI$^c zRW+j?a4Pp|qxW*7iFiilQCjf$y%w$!0}-V#j)whnjw~!9Jkarz-o1W)^rZIF$y7#cp5!m7^%MAd1k~!ow?n? zd_4MuxK1J6R3-JZ9%>Wl#hup(laNE>+vB$5v%%AIhi!zTaZ@4y(&UZ6M>Ie~UJc)f z5+?Un5Qua~oeNkAYHT)5!#EY;L=H~Jkh6iOD`8Z9->K$sAf#h|{9LH0mE7P|P2|mA z*UJExM|)YByUs3k_+#)p80Z)$0wmQOkw5}$DS2Ti4p0~BerS}6+Z|0Ki8zhZOz)A3 zJ)G$*sU&*$M88FKu_lUs(DKU8sIr)FSbTJ>M`FW;H2F560#4ags(MLj%tSpFd9m?p z_9An^F|x3+pG!lZzxD>FdN3Dq&&PrLbm&7IP$W7E`~wqlJ<1tQ`1^0PJ;m*=yj+K) z_i?}tUNxztM0KsTg}A+61$>tYhQ+G~4bVu|sL|Q-5xQef|+aYD0 z`!|!2)*@Gbv>rziq+@r2!~xX!iv5Ek)6gY`q%;PT{7C zK3lM|CIVRxJAA%qi(*~U*T;tMX*x8|(I9lU_WCW)_p=zP6Q`yV&(=Tv(a?yuqVJXb z9(i@v1HSaxjc_wmifIhG+xPu@+re+B$aHrJmZ~BY!S?)6>6n8SdhYN=3Pe_n$nL#8 z$$cLEU0?oHiyDx}3Rx}5OYY6OSP0g?z(n;aN3cbOu*xJ8>Kq#k^1EhQm^S9scH6!0 zKHV_CJq}Hc*qv`Xebki^!1IjhMWbxy4yx!-zB6WQJm`Zgx2EyCUk<^GccZ!|>Pp*Q znm=Jc3tEBkoKJ*=u=iNsSsb4{IL1|?2fb|@Z2mp}WF<1&mM)6#FUaniXhMcP?`-E- z3FzqXvgY2B+dlNSAg~W+7icE*8ZpgAF#}Nt1`yyp`q%T=BrE!;fX4c_6J~JF(sGko zaFK%FT7dA4QSgf7)G4htO$ z3u7pZD?yND(2U|QQgF*n&!!aD8AzGDBx}Eys=Z z)5m_Klc5Fck`1!vZ`+I+7dp6$u zuhy;PilV;Gy*_W{4ihyUL52^ER&wmy!^tVP-DKN;=$!kqy5l>CuvYW}jA}A$u#}fj ziBe{ohE(nwt9vOg*Y9U7)#svr7b(Wc$$;#>__7M5@mSdQeqVLvQeYfw>zu=fpSo7D zd(kN(Z64|i?maOdIy-%!m`F1O4q^0ir9PWii`|J!C@tp==ayxpo__P_cXgu0;4(0o z!p&>vVTr3HSu%yygXFMN8Mk{0Qj)4hH6srqISvq?j6me5$Lbqv-B23{H%Cvzky+B# zG|^8jz<5AiZ1By<4iq1jkl%7PM#5X+30_A zD(*5fO9gIrwHz4y^qj6GY^rgysdKY^6~2`)5goWq#%m$Sn5gfLr zTWv+v>=!h0v@r`ei zxN=4^b};I=V?pFM@ud(_cT8dJ=GHW|uE0-+v>xSSo)>_#A>IZXiNg?o8IWFSOrtyV z<)+w5wJpT!OUxfimH0YO_LV=vM7ix%xRqE4z2B+SDnVQh1$lgXYlfwQj236dj-W(h zI_V>9!RlB-!KpAg>_Ny2H`zl4u70q;um}E+a8=EVKt$Q#?+?7-L^+$7TXqZ&cmO5?&R{8k8L&qWG*yRP00H$}k4VZkj$DfGa zHWqVjflC8e>{8!gn6Jvss^-H1`SgnTX_Qw zZiAu`CDoX^i)E+7_q^w?$Z-~8Nhmeo_5e~y%uVUKIuPdu%b`=NBx~gwV(g$?dSbC+I8^Y(h0tN?>_Zv0 zf(-qDj^xYrJE8BRQ4O&U)AnJpR2N2OM(=8O#=gOcF?IKDsfBs}7}Ty@7!q_ndg*lu x)jqx#x<=f>|Noo#{{#QmX9)k(;iO_0)&1QQ_#VF(NIW6|=x7>1s@0#q_zy*DjeY0ST!T1V=&0#SA?w`rrVG@0V!N}g|tHljd n6z4WDKCG{k>mlY3*Pd1sYDI7rIV)z4*}Q$iB}1bv@M literal 0 HcmV?d00001 diff --git a/data/flags/it_flag.png b/data/flags/it_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..270d1666c578771044d8d79f8c38f7c90451a722 GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~iuTWx)lVB|xFeo-U3d6}R4AUdY>EAmVy)T4R6) z%cKVeYYwpGI7X}%Ucj+|olC~p(|y7%kMS`j@rHRZ0&Qy zo|l&I-;`gwE~jlDV8+P7z^K5$(!e0Vz~sO{3l0N1c>05(`WH`KVsgq8kd&vZpUXO@ GgeCyvaY<1C literal 0 HcmV?d00001 diff --git a/data/flags/jp_flag.png b/data/flags/jp_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..49af2cf852628fe3287885042ee658f5ccc55c20 GIT binary patch literal 1573 zcmaKsc|6m99LGQ3Z8k%fBXhNCm41$&i9*86a+L6MhK@P%BaxY-at)Qmk`8B%6qej< z{gk6oGdB-zbg?1=9Vv83_nB;z1qruFydTm^)Je5SQ9W2xMepgeEG; z;>1x@zqk@wRA-0&k5m9e@-0Zl_Lus84n$er3kJL?J~i}%5|68~MbajTf!%zyn`q~> zh#SRbWn3*S>5=!RSFw9;m9)Le@9sI7$bOFyG`D5yLR#hd3L<*y*AFW1+NovEH93Nq z($%dF%U(zOu6ZaSK21<_7S681k1Rx-SqRS=&BmheO+=k@-{R(rJrhmo$=#7k$jv6+ zW&ptvrELQ^UV~NU(KYpQCMQZTh7021Iv0&*LyN^nam(q- z+p4_e6z@B}RKynbPj!sQ7-u|bTnm<3-rPO(D}AONc777>sl7AgrOF-|*~SV@Y`n2i zRl&pk@%6x4-XCieo4uBdsSEUL5`>d_-1AaWK6m&jh!R+)`eE(t854ZSk}Gk0wL&Fj!iZ`g$H#iHqd~FLq_Bo49vu z_jF7lYRaL>hr}=OI-bt?Nkmfp-=uN}Tg~RD4q*HoVQDwJZdjc9xQax+Fwkf{pqIIH z(j^QascH6LSihh{J4iZNj6Dr;2HF{kKg04Btj58I#Z}Dmt?ccAy~{5yaN6R}KP!OJ z3ur5;hbfe$78~V#+z2!0)@ENlu`qumlO{JXU8Hh2VF6t?4H4!}Jn-NddOuO&Rv&|Z z?#Xpwu+~+$m5D4?!yMNs6Xq3ICgAaMc#Ah9eZD&S9^360qC-GSErj3Kwj&5`Unz7n z1Pno>cqwj9IQ+0aR(YpKgu_7ue!#T9%x&1c<{mJ0>BIN+nt)E9&z?BXUsk7akR>y> zX?r0g5%G=)jIk@$%ajRbi!B^eAArs9c6z5#IIYD1e+NqN8eg79!w9Pw;eONhmZL1-|lG#A`y=7 z^Lq}+;d^30%IO$;0jWNkx2 zajkGd_Bf@bT3hG(9_cz-^T_d$v=yh}-4)&miaB=8FoGtgJg-t3nc(~bV!I?=4%jmJ zE^7gSx9g>9CC!iP6E!^gqC?&I7O7sA`85XN4W+4gfebUPv#UskMHtrNH4ndC9|FV9fzp>QYD6eqj({lUR)!CTEKQ;qdd&3u9rQo51{@zXP3niHK!O^H-;_Hk|+Sn>{ zYt6nbGnq?x9(Ro5O@wod#4puOhRij-n=s{kxhBX)73|k%gea(?DME6LeGLqPk++C& zG;WGbiPHW=EjG&9z4lJl!vNiCk>7*uH|X=QY+MIVi)svUQS#P8h69VER-{rQIp%-2 CO}8-s literal 0 HcmV?d00001 diff --git a/data/flags/ke_flag.png b/data/flags/ke_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..4619928759f4bf5b2d2b6d6072cfd8a7e7dc2ff9 GIT binary patch literal 2582 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 E0Y-qSssI20 literal 0 HcmV?d00001 diff --git a/data/flags/kg_flag.png b/data/flags/kg_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..a707e21d5d70498ca9f821aa4049a138a8182b0a GIT binary patch literal 4056 zcmb7HcQhMn8;=!x)*i9q;@UN%X^e#f~wu%%l-HJ{`$`QKI1&+J?A~|`2C*eNwm6U!po_@)fsgmoH!}N$)H1levbk*E@+2ngELjQNW%RRY=Jml?v+xp$W0NjlPo1%?qYqFK zsTIy%g$@$?3dJU4Bnt6K6ztY9}^*Hho??u6}@#8sPSSxq;=N1I5twEl<%(_~jp;lz~4?rM(~|=(S%uoi+OR z-O1)E^@QR4y~rxrNSly#lIW4T8lVj6_DfOfwaX7hhST4`1Ss^bIs4g2AYmnlzq6DB zg-S9gp1WBA+^>#{Z)Sr5-N30{X9*EXK9^+PQU)w9zE1k1Tt_=%hu|HbTvSuZt;9*& z7|QW8%RLs_`QE6=&AUh&=ND+7#Y4B3RL(Cv#%kWz*1MZ~f|bD4G1AVe$V@*#v_(A; z^T5JW!zTPiW(^W``_oOGS+p&?kpNKNO zSMiy!hHpjE84Zrt4B?ektXSCsaE5=+OAJ8w<>Cuhtk!H3CYCu(_x*tZYfDEja)_)#h?AvoLhaoK1+{-Ui5n(^}O z`Da>`m6Ri9BezM^4~r<)yneFvEb|VZ*AqjeZz8O|^vpQ<^eM&&^hy``g=&_asIi zUUKS?H1pPXK?BkFuC${mc|mDNSp~nK-er+; zBriIBJtnwFCel1HOsc!aJY&#dK<|0-gczrDU3+R*zetrUsn7(&2o&Q(R*%~f%8w8uKD>~<_q!F8HSCp zkB4xC+(1J=!w0+dmyVdX$C(3geF85IdRQWpBtMqZbM}ilH@5QQ5pm%bw?a$=(oB>z z%LN2%kDsa*WC=#+o|npkKK>&`1htwkrj$f3gEx)fKVy|QlJZH7w7-pLo6Ez%Z_d(0 zA%mFFTKq+cp^|1v)R#ran7Pub3-w-#2CI6!!VOYG&OsyXLY9XA)e&j=vl`*%nr=>p z6}xMBhw@-hMznYmbt@&n_>*UmUTB>G_eq(yHJ(Pjt*n|F->5uk0qqkrvoJe>c4thE zCfHj;brr*%&;tJ&T8RLL)%26^P6=oPha<&VWYT79>(%<_g^Z3)oA+q2W%WSdHL zKO+__AR{J^oIdEZ&b-Z$;&V;#28kIs0NoK_LFq3k7;;wuf8S4n62~qA#e+Ji?~dUu z>D@J0Y8VAm&-G<=>@|%yTbH@>x`PK^SxNFRFNJxP!27WcbDjY!-P)t0d9I0``82hr zdB#ik5srlJgVDN^9!S5DPxN|x^W-y4O(dK}DNV3-{V(=29rRpn;HdAczP`MgrT>Ik z+)hfC>Yy}{qa9A5$PLzf349I?z|oK1tft~T_@?6(%WxNqiycXix;NA5Zr{t-wI{*V zea*@3Snvf9{ZkAK1g9d;D~B6B@5K_X&Y zZc7W;b6L&LzoCQ|Y=4%V{tKS}4T8-{4>Q`~dTmk;B3eaNq323H0WM=$+)Bovy=k;? z2RB&2wjAe*;n)6$X~c#ZUGPT`#N===1k3d)3XcbT5Xg*9>Xqt{s)}JI=bq7W1}6^0eOZ)OwR=awP(yi|)#J z-Ig?4mLo`#O4c2C0c^K%kIG+4e*ez9=*FILdXW?8(~16h;H}e-%HarfxCJ5-B?4LK zc>=;1S{Nv6Q3$efB|=MaqptF{Ior+L)i0kkUh#d^{a`;{^F`-!FCG}GAb56@67W1)xa?r89xv(HsyUKf(FZTA`iK$9+SZw4Xrg8IZ9xT zhkcW<)N)71v-Asm;FJZGaJ#wfZ3GFj5XCpuP9_AwMHC{ex4^3`SNlW2y5v>MtvJxd zYETkNxa@q0j_opvzn?6oiyAKr?NtO8gS@v_(Tia;dNQ|VMO0}+{OAOjBjf`|eMW4A zTTMKVnYNdGsqpEC6?yO_{CpYSZ1O>0$=9kPo)4n7+5?O3Een(6;W~pzV6gS z2>r{gRbdv%j$n#5z22tk_EgW(gLN;n1<)kAc>rvll3Ek#6OAw2bH^>rs@}=^r4&$K z2om(FWZ>^?e0v!K0Y9$XYc6pp7&|`!2XCX0W5FXCIGp9B=au_*yx_-7<~?&W$7THX z@1E|iK|L^=D8H42VOflXUS)*__?{N3)cdG<=HB2lO*Dn z&V-@)`FSBJ1#`CU&qXY=e3UMh2J18^c3S@ZVyTW}<@%$1ajz-wL;M7-v7a{D(a#6< zH0hv}R&8bxsgQptbQtPn>*_B}EIJ@FB&b?dgYaqvJO}>%`6cPX^`#vU(?|R6&Z327~v>`}~aD!Og zrh!KmhTH=NLEZvQ@-&(R&B8-Y2hXOJ|_Al_X!K7yzkt4Np@w#|G}=D z>DMaBkjfSIFQJYTTQ-iU`9WB{&^$Ee9}r|=DW0~~Vv$-h=Hhl8C)1s;m$=OJ1Q3|$ zr$Zvg?#S#gSR9i1Yq!oMO2SkJp|w@Gg3G%CCg7q2C7Gd9K94%MiaNCvlul~}uia&X zX~oP``8bOsnb|Mg*--jwe#W{0zlLsDeK#6b_V$pPSh;vZTYuVQewCH&4tw`}hV-4I zD|$LJn%nkxjcNFj$aizcO!=LatPsT|5mt?9D>Dx_OU(1%a8=LUK9e775_wx!oHA4O zk3w%({Y3!iQ#m(l7k>Wxeznq+N2+xDyOImz*0%+Mh9x;d+f7NEMI0MWaBkmcGlE_=Nse9;V&wKX6BvNX z>#!@1=!2!qvx~z0Iu4H&n!pXmXfxcikgL+jilh`=l3XS9pol>`AdH+UO?Jq&*2`OFHHi9_ zzF+-l6XlO_wUZv~xn`&IG=V=mG?c4J49h=da&@-*z1=^@^hlc*g`N#Fn%~ZqsAYVV zgd9x#=&T9>gr1xSdqqkBfBcmmE1UV6bty`+>Y_QNo_?diJg)U=!wl~bgzs?E3ZKy= zdPJcAe&xiO2d7<_x_M2BMBspChrW{hw8(K^Po_%zbHmI5_mi)wHJk}LHP@7P$s-!0 z0r90#a>aFY&))qeE{fe_%0F}mgg&FGI5mjd8V>CBq3N}J72h0X7?UWy?)frxDlOq> zWRSfeQGHQ0O=ha1_u5pArMFgCUdqtO-2hjX&!eGkXVMQMq>TfTj-3Q1jhi|4E@40F zdXHB|OkF`MfzNw9A;XIt*l?H*`Oc|c+{nEM!0<>vqstwE%YOdz@QL&woUw7 zfhXA5r|>Hg+OnH0RSh3|5gq_VX+w7$r}!{GUc7&kvgd* zKWlv@o*naoL5v(9e%~ZoAaBpc4N6`(lo~@(zMy{x?ip_kG*^=S6e93B>&3rbdd;*I(ilt z;@o(AwGW&?o#4bsdCm~)~g^!6)J9M1zilR_-I86L`@&)8>J49|9VdvJh&qXtXKGF6NlE_E)Th+xYpL&b z`0v`3eU3tk&WU0ZoxY)?eE<|{SM6(>;j0Y1`{xl~Mdmyxba&gh9d?ro3Edv^4M9ou z&;7`>FC@!%rO^KP7KfYFM&F>Q%7W;Nr=%I8uVC z7aTPFNdGh@2FQCzH5&wK?Bl$qPylBzO8G7fBsr+G0xi?b=)&;UH@9us8B$aUZkvQI zw>9HuM0htu^BM|o*H3ycP~R+&;PZ@lsix^Wjo=nYnAe`z|JE_@R|&+_KiwHNdK*h5 zJ$11S+6NS<$kKYlxM|)*6O=GsuUJpd2qXmZ2H|AXeqr&wq zXx|$&Wgef)V?}39Q(v{2mCEd|+*$F6@hpMcp*I$6cB`%m;{8K)MAy%BAB#Kt7FlwD zl-`HwXrp^ayqjV$e(ur(Bfd?aA{X`b5~*C3Ps~)n&Hg1TIr<;2>ZO|3*amTW-<)31 zLz&k=1$G?_BGbt&Hp99sHL(!hgEW!#lxqRfsQG!F_xxJn$|h~LeWR46h=`Ux`Yl3W z)blDnIbUz?Hjn*}2R?ZzC{HLnXk-nPYGDp00c#=wK#($tvZP zM|r30)cLYoTTP|@VQ*pvP57lbdZ{d_YGO_;!UnE8^7ee(Ut*FA`zPi^%S>wAdhhd; zd@axA8!zmA30FAk`KroET&TR7X|63Bft06D10aIL(%wD&2ykj1EGKS1>Uj}_wRdIX z9e(V@zYvV@sfR31XWtx%jeJYlaS|dnV~2WiniP*BuNG;dwmI(rDIy`LbDyzVtv-SE z&CuN{%4bk*X`IBS_FmaDVZ8X=_+>?6Px9rXp8^~2A}pumFT-U40e*)w+qv4{w7MAf zJPQg3{J)~LwV<@WfP-R{1KRmT{gNBpbXYNEJVhB+0!zm2%R_eoSgmQWt1Q zo)&bzRf<4n)OMydV^VAFlU2$oF^!F`I>m|=mouAg_oN8rNayOSLztozJ~^MBNkWNf zbT>nr&d~QEV^|kBTrv&7CLbKn7Zg?<7;M`bMCPm<|KK(_IxCm)J2=bBG6nA}Q|R&e z?quzB7h}t=zIqowF{6<+l{`HQIRK{x%tH0wgGwUmx)|WPSIo=ZbPH7v zUF%JXbhdV=8YxIW444qkDV#!>$2bR5+AUT*^x`OoC*f&t)a^}D>y8;?zxHF&N_f_?Z(gt1D%3L1Ggutw z)Xod?;@EEBjQwa{*}*_#jr!d?-#(Q6d+VsQ3LHOvfLYz_@2Ia14E|#F?UpjYJfQIU z5W7cb6OgB~dQv7zNE#l4(nYVS6W+b{Jlm5_mC;-YcXjon>3t8s%&!6FXx}+doSyuMND^et1Xi{`e#p`0(uWBzsdc^BruP^}k#RN8c7~jE+AtSj&2T@Z z^)>h@7MJ#s+8fjxxL*k)ZmHowQ=RdbPK|wFoab-}on0<%_$U`ui|WU167<{zU+$4F zJAyrdb}7~vm&cbQY(#fkPxZdknlwoTn;rJFZhadyHxe7@a#K7V6AjxSS~H1N4~src z&$p~|@>4#$+YcQW`SqGV-Dx&k^6Txu_=utS2N8^jA&0?!wQAR7g^YPWL(wn=i#v=6 zG@)HG^0y4T$WUPAy{X#~0R6eBKf{=7BU}FR31siw!${-a8}jIK$5`+q@^693G0zHUBaTf|ZJQ9#YjqhTG$D7leY5;K#vG-2rX!#~;J zzC_7bHv1QBHZVd;2^h6N7qL4k?!vKU2dRC}v8-1*nd4(H)>@IjLl%Jj?1*=G6-%SM z^GseS)z$DWEljHH(*S0ctN%hqyTAB1R z+kI-0rCWyx$R=mbi=#=ci?suHku-IjJm03*G8q3GSA5oTY_cc_0PQ;x`V14$0(%soE$=lrmv4qs? z@N>yWg@KF7c~h72;Q@HZR-SiUb`Y=NtL4BT8zHB4R1hFHE{1R%nIO_gKG{BFycN$` z9(MLEE>C(grHY?4nUACgQL^KAp}M)>p1Z!9_(7LiJEq9PtvS};*3I+p9Mjgz)rAv| zL24xIZ=el_c}r=Bx|MX_fphPK*A-I0*bA@`)G?TdFH%eI)(h}JTC})JIQdgWnjQD^ zqCsj^YH_{os>f^G6JDF${%@YoyP|X_=M77&(1af}!&DQcyngQU)mtsNU1{Y^@l}GD z!DnQDx2~$f^>lL=$b;=iy9dWL!Vvs`S)_!RQ@}&f#`79;u%FVqr-tza{~HUP!ig-a x2VZ#Rl2)*3Isctj{=+x_56b#aioPg|H+ehUUAIEpkxjq>FjH&DJ7YxBe*i1k*n|K8 literal 0 HcmV?d00001 diff --git a/data/flags/kr_flag.png b/data/flags/kr_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..ae035a4f8c7b73ec93e8c4f7389c2f4c29d80ec3 GIT binary patch literal 4368 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 NKvz>=qf*T}>_0^_N+AFM literal 0 HcmV?d00001 diff --git a/data/flags/la_flag.png b/data/flags/la_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..8a94ff18f99db93f9025a111fcc825e28667fb05 GIT binary patch literal 1054 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~opA+e*RsMGOqgt36#DLn>~)z2omOC6nR!$NSdn zBj0J58E2*~)YV=$`?cfE7OR#E`)wUKQvP zY+%Dh%k29+u34LX+&7pkJ?6~%zKijoU=kMx0}BHa17ib&1A_vC00WeJVE?^1-aXqb z%?_5ZoWDQ4;k6a-WkG}F!gkdLRRsrWx#JUsi|*Bw-jiWSjy@b!F>hi@O3xHiH?{03 zrfm#=4wO3Iij@owO%3s_UbSWa$Kcw1)w{J$d5P-so-R~LUXo(9c&1C#e%qN>4}6f9 zsxxU`Td2#TkyM~E6?|v9H_-_+=b^F}`!);)$v~EeR-vm87Q#u zZ)u~P{RPIBZmv){-HpHGPAyjD5*HO};JvMM^cvs)*V7wwCnhm%NVMCU@>kgM{OK&a ztu72^DbvDDrpIjgCHHJn_bHwA0u8#`*^e>V);(a}QTBJ;*3<)^H|;9>tH*fbOF~M} z-{!|*$KJ`yTyLJ}33S!f&n3Se@v2^)xupVR44ts*{eRu z`_-FQ7hfFt;%;BQZ>LPn=W83z#k{+E=TN(?_KfI=D>F~;-Bp==L;Ulz*$h2~uU<-r z9N(E|JJ<8%lOOBil6&TzTXLmvU9@d&vt@m4^bYk8d#icgasJ6T{cPO>2KEhY&zYFy z4%nO7*hqd^&%pFGBjTFGN#m&cXLfTvv`A$N1|R`;Y$&jF)%WHF&*uFVdQ&MBb@07T5t=Kufz literal 0 HcmV?d00001 diff --git a/data/flags/latam_flag.png b/data/flags/latam_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..3480ad5c1fb5015086d0e83721fcd4c568847e75 GIT binary patch literal 9496 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 literal 0 HcmV?d00001 diff --git a/data/flags/lk_flag.png b/data/flags/lk_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..63d98f5337b7c62bf13b2eb6b666b465ff6521fe GIT binary patch literal 3735 zcma)9hf~wf)BaFHk)ncBMWiW$QUVA_Qxk{;B(%^&S0qRYp+%%BNSEFbQBgozXhE6; z5Tpd@Eh5sv2pW3*<@*=B@7(O}%-+oH?%nh3+`cq2)a76kWCH+z1EzP+m}W!&6BcHg zCTcqL(hReszV1EX^uP7Gxj2R9VfE6p!~g*M`Tv9t$j;@bIYGWK0|;o0=@PrVI(zz| zDgbbb!|v&r224@NfoS3J;I_XTeLr@;EGF}K8lQ8EQA78BUldDl>iv)ihQ(k0XkGJ! za#_x(1~&KBAc^M@dp(CyhrAVoGIu?l@d#A-YkFdbHyW0Hy*C|;km`J=7o(E#+2)T1 z4t{zW;saT$G_YdbKRl{cXZP{nIbQ1DXx{I)=Dx!s8u@>#jt#ZNc7|i_#-|srm;LqB zMl8BpOo{{IKqOwf>&>28-ZL)DnQ zwPf^h?4QI-0O;$d-$MAC-=aR?moGO*;}&fLs76sB-N1C`iSTrA`O1s>#(xvXmhIW= z^V>jc#V?}r+7m$#M6^K}`n0brOGUc-CN=+y^Yy_-3=1x+YvmeW38HvcTfoJjCyf`_ zFN^6x{9N+P&6`Zm0}s`zH<%ryt5@J5ljNO@>JnXRIJgK4c#|oBS zkLph$&XE-4?NR23Yn$%EAs@51-o8Z7=%L#TgW9)xmg&+XOh@3-kL|_|`6>AGl*0fW zS;epnScy43Ybeu1uwdG{qc`)3oHEr|D8<2_JZh~Q(!9&bfie@<$z z=MU{0MaFoyaQx?pnZrHA5eF>j2fNW&=4D>_lq~QoQVDogtt+UtD;`CW*fLbr&94ws zwod^XF64dzw@ir>(5u(lW|PD<9VIgIv+dPF1|Q7V$ra#!^L+HC!i{V;--(2slVgds5@Wx<#LaX01hU{%bsh;>KeT>d3+2Q|^4trr3q!(wo zIsWd}?i1B*YohSUY!EF;N$aynIbv7=7{6G^4P5X~sL;TLYCNbJtd(L>%bn)CTq6~2 z7n#w5)hP88ari)tZPo0dgx~~a-CmcehJCR~z4X&W;Dk{8A_P;65Yyo7QnRg@)v_kN z<|{nCt2HY0<{nOXs|5wsF^S%qlIM@T8YZ*o{wtuw_^p$P#=ZV+1fY;2`6u8v4=$w1 z@4YTvw`80m-v8AlkS#8phKBz^9PWm;I%4 zo_an{kxHFSckHpbC0KdWc~fscO(%PwiElpLnTq)9ve;t1)J7&ZjMS^TjK3fBVR2UAc>IU6q8(f z?~-X7fEV)J$jItpm9?>q!N7?1r9OJTPEi>d^^|tq0c$sK5 zdFrc}mH86h*HJo44joM?D!Ud|aRZ|1@!G;jFH*LH87)r4O9T`)FaD19{~ol33CcdkI1+=Jb4k8Ru6}QK|{?(e*{LqMevu0Xjcps3Fh!smD zSM=vFjl{Akw?e0zBLMi8svg9^LPN0gP0VQ4Jgs^Rwa9h>Fa7a@fUJW!FQGBkC_(!| z$lY_uK;~HW#B{KN*F6P1?DenV&J~Fnw zDWGQ?whW=`yrup(nIE6TkAM9^EePRIGyJ^A+@6?mSVh2;?a#0frEZrIf>SXY%qv<8 z#7Eb>{*6j2YfVIa|JNhsU8f;@MbpuxY*>P>az(dABT+H46HI3Kz=mS!exjxTd(j76hqwOTSE{1=`3NusA?CWN z*tpysqtB}0j|cyn7Q20ZxS36Ro+1S{3k9e?T@H%)NcPP#?^bwwJZio0sYkAVzD-1r z`8|ZzuPf4Om@)hPg+@Q59#^HQX+%O1oH#dJ*@$@^ifxqJ>H^`eEu_YtYrlR<>TJ?i zRknBXeWeSW129sy2g3Yt2#?d*2tqUsj&RU)u%IN)E%xDjhL#8)cspiykr$jcIL+%z zDc9DwZBf*uLKlY^TfoP@Vz}z7%z1YVC4^MYQLuyf5I@e=?Q+qeos9n54-!z%$dMDT zIdYKJo3-fn?kYa_l}VA;Puw%#TSHehjGztE-aXo@N1tdUYn)3wWQocZhswgwOidhk zA$t(3<@Zx!EHZ`j%STOaAyOEV{JeR&X%-7`b`(`*Xz=S$SELI-!C z>b3#y`pXPmpYxh_nmKZxdhiOh`aYY>74>i)uU8o;J=T|Tcvl%m{~m(7c;*t-hddzK zE-JOmb-=Gmfquu*pz*oI{~TnLa1y3z_Y8fW79cqbjHqqdVovtTNYTbPF70<;Q~CM~ zp+BpmwPNqb!>>WPG9g$n-v5;u{Z^{4=_F!%X17Au3u$PZt*lPf&p5h2{J?-IWWR^Y zZ9*X-T{%f#XktrunXvi=6IXy43h5^0B-YFSpj?@uh+kB~Z)lClJ#7#EelK1CU!?uC zL3@!j5bB~nNKB}~G(Fnp#%ZlFcfTL~YjiiPAWY1T$E={|k1i>dx$QgObHX!(Yd6Q<_9%i%l;4gc7VV%-042c#har;)DRcvC7v)rI7IU_FU8qW(l7Yo{F@&z zak{nF@7;~2=;$!zoanAB6lg-g>&0_5$3nTuu&7lUTGZB`{BkpDy!KAPv zyJQFUgtn14obl7`O}lW#=8b(mxb&_jA-#~3^ycPM2|BrY_QdS}05$&Srx{tuBG*LC zZqW44X}y^9dFYRWIV_U1F}9rI-)drKe5~&O{5;k7-H>rvkR+X)uIo@o*u$KLDHptu zf8@hUIcO$k^`@hxf-zekU%3pNS2lT0f zZ=U*0i<}wq?d5mH(V=X8ejtJgT@_6?pi~bh6J8>ptVLRkAYm7kFu;?y!WYc>P>x;7 zg~!Xl(k8GDUeVyTy};l4sOeeZk5l7W-$Opoiq`L;u*$@9B~2pB0f>o zCs3u8w{MoR+&RlvMGLop@uW9vOO?P z_zwN&mS%719(@6XY2M%;HXfIfgRjU8=Y`a$y=dN2q}bTa;!wyVZKKgE&yT*Y@7}uvH;^19!qPlxVW;8hLx+GxAU|JS?)H|9Q)k}e% zE(7@1BrMKy5bNRs3Vj?|vUBy5KgV#TM&Bw5DGPJku1yzI!Jn`nPXtf(H9>b= z4gy^~u1m7kH2gz{EXequ61@fM9&n7OufG*I?p{Z}=(GgT0#BgjqTs{Otr+t|E%*=Zm;(L#00Cb*~W`|zK%90qZyOyuW_ zjPJ+4ZQy1}78$XNzkgfn!~`;x>N@Q;fbh+sf7$eVWqN_i2A_cS;iI)fp}(e5Rfk}x zI=S}*BvunywQwbMG%u$$O>32J>}XgpRnk$Va{aDfKUD6v0(GE(Ke09K*{}0nuke=YyAk1hmqmer zrGY_!fyse^gMks9<6syhH|?a^D&uO#8b&Pg2%P~PHJT;4)zh7{jpyz5Ubv5e1tEuS eY6Am0XwbKr`ix7NiEWt*NXpaI&t;ucLK6T!CQPUR literal 0 HcmV?d00001 diff --git a/data/flags/lv_flag.png b/data/flags/lv_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..e32b8fc24fba472d4bdc0ef3685e50a368ba707c GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~oo#LuBUZYe1nlo-U3d6}R5r*(liLAmSQm=ggQE z#8#4!W;`uf)TB9xwWm{bhg)8X$AZu2J3H>jq;uyPve!`?IHd|o?4dHQ1u7v2R^lp1pK>s>6EYM4>9 zOmO_`e&O-H2<2ji%P(_y-5Hqh8q2^4*3Ezh8uspCgTe~DWM4f D1B6!< literal 0 HcmV?d00001 diff --git a/data/flags/ma_flag.png b/data/flags/ma_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..8ed48d2c399740ec7712cf096b65ecb236e4e411 GIT binary patch literal 2307 zcmb7G`8O1b7oV|=v2T;I3>xxGvKz*l>{~LjWF1Q(Ph=n4Sh5tNFwrn$-^Q~=M6xs4 zC0j^DmJnlv6n&@fU+~_!=kvMCIiK@6_x^MrS(qELvk0&N004GlBRxx6j`;&Hh{ioy zu0ym0474=V0o05NZPFT$o2j85;P;;>cvGH9n=s!uvI_(NSb6^d2*BrEpbeRVjIZl6 z&9g$8xmiBmWF`Ut;0MNf*Q_veJA_R?p)b&weAN&S+1lbCSM!6lA?e8pQ{y>sT#;3E#YT3Kw%#ie-$pY@B;4c_fCC$`=ZFUvs4j?)e(5!j?B5D} zv%bA;esz0Ju>7gLrR9f)4#O83)HKhKwJ4De@-ATpbd8I2{*M2OS!mU&0q$MY+GWyh z-C!}ghk!V+=)a{`peTR$K@Rl{sC5zy5u*hB588(S-{sEkJg`OeY+6q))t@CzjLu5z zjZO0EnuJ#U1WX$-QEb0DqmQgu(~I$5%|P27Ix$qhPO90&q_F@4`(Jr46=2%d-_Hh~ z++(4mVPBZm$}iDp1x(dSvRU0#w7}7&&WF|1P-IMB^CK^#T}Wb%b8yHb zw&81q;Lae=oQ}2gdH|L8>(X(}2chyhy3AO|d7}}FqM-3f)jNFpfaZ))A<%=l39N(0 zkOVrW2@?XpS7#u$4$%jw?7PYgU_4unc99EqX{QS~_zt~UP&_iHiuf+39q)UXPJN#z zm%{Ma;q?yo1werDO(^P%@mv=F& zbA2SV8`a;S7&*S?UWhpOU@oJxF*`d^6ABx-+K#3Eex}Bny3l=^P%BfnHb( zfUTJz*@M(~M>vqs?ml_EcGPuYk7<1Jo%lcvqI74d;a1v%Xe8=KY}^CQ{A=(rPRYbX z0l8;RJ(v0F=e@JhD((%G4Fr}nZRv+8;oSROzDgc8!I z^wE%xGFM5KF{VhzDzD7>S(fs5 z1(`ln*$E3tvdjyw;3r?ncRx2ft~fXpsMVB<;9?O(@x3Z`!elAAa6iqc z>k?g=yi3SQG|{t)yKNI8EFY)jD09SWm4J=jj2!G(Y9D|&a5}9Z5C$o}MnW#7%P0ue z&7kGyfksEwm|V+6khX`e=2t8HQj+b%bBM^rT+WM8B$F*i;-md`==Ux&5KK#8)Qr-L zNFsO)TgQsp8qkH}U7hm|1C9#i-)7_E-G*=MS5*(^TsGWSNk4!NlyBr4ce*K#qfD2E z#nDKG(M7nd`bgc@{@}~PrQp^sLG$<%`fT~c!K&yW97TF$`)}JYb@d)MNEZ-GAbcqe z!L1e(j&I=9vl0y|3ib>N(}HCx_p1zI`r@qTx8x?m=-w2YZZ_<=p4~@7BLe&rrBgIp zkR2Vh&sq-Ujx{jbgSRc@*FppNS{!1Is>OK;t{Gc1Pj)LV9d?Oku{LulY&vXxNm^9Z zI-Rp;x!54YC0SHTwUC_R%p|xjHfO*(y;pO{plG;S`MM9bMjx|R?5`1MN0*dD*$)R{)o1FQQCtt& zS+}jq@=H=8j|Mg<@#+r;%rBqhaf>@1_eoMZyQl1uVmPH{8PTba#}=N|Y&}rivctE< z{=u#y-7U)BkV0W-?sB!jIAB8K!N}rDpA0(tG&+J{L@ssHE&_4+&^@Nm^^`H> zR}}s)Gz^+E#LRdK*fa=(MDAlOMFDA^w?B2QNWee?|5=L*XMO*^!*> z<2>}t$uqm2b~}-m?(nlbLbimadj*|&cpXxZ}BnApVB@QfU&;0 KUX6}R-2VXEfFof5 literal 0 HcmV?d00001 diff --git a/data/flags/mao_flag.png b/data/flags/mao_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..57053d499f53ab56a5c795317167e0e3b2c6c173 GIT binary patch literal 3545 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 QOBldN&+Hyj_sPru0I5psW_~r|j8f%dYH_ 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 OD}VvU6kVn3Nd6yhdw_QU literal 0 HcmV?d00001 diff --git a/data/flags/mk_flag.png b/data/flags/mk_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..50815fa72b45c843bb51d251ef5cc262f3a1b473 GIT binary patch literal 2952 zcmb7G`9Bkm8{dpYj!jZIR&FX+O1W}1M$TNhkKvP}Y(=io%+)7KvM5rfOSu-l&YG

KszyW)IgFq_5?@xr#RvwW6fUv}0009Ms$M%N@qO9#K4h#t#7uGu#d-e?9 z{!Y>wZsrpE9vr#y?7}LA;f_m}jVT&vOB{>EjEvT#t|97)jp2nt-v}6yOtvL5J zfsU=(TV5jxUM<(f?lcZF20_P{A44+En|9FTPWvyG^Mb$S=K+^ljd*0Par!kIBmZk=_vKpukz*fujT#h zwYU}aC#7JF(Yn*eZL|oe`O*AA$^nSJqD`!Gf0d}YPHeQ}1%%5|tU$*SyJpAW>c7I^RcnA{ zT<{W3eQ`+v%4IvDR?Eap*9%*j+=ngSB;PwA(3OIu@i#-VlhvXIbcztlLjw2D#{}43 z65AEMeD{|m_K%a=q_FcJyS>;XnVr3p8<+3&7?3yq9jS@W9T^s4jtv1UT`|P&d6uj_@(9Vh*g>2k2Pc*NE6wCTI@dXofQ zp-WwnecOefV#*KO<17MKJ;nS$pxT6W-B-N=o(cT?xwn`*U#zTBfND?t@syiBwb8+{y%ZYA^*FQMWsB^+YNq_lmuN zC?aPre%r=>XobVnH5ct$Hu@iVR)bpN!(R{~ZH``lh>p@fcOB;#xDaPpmSt(bsdN_j zIHcD8-Iab!RO9Q(%-)U1U~LJ(8-|LwrAR?ti(HDi+E{3!^zGNv_5Gj*y$aIVXivjI zC6-~6cmI4a72^qddXqA^X!h-)JhXOcu(MPVTP$)g&FizDQi{pc`59W9SA|4a`p{9v zLQ((6g&X6cfEM;?rjy)eredu{QMt+WvY>9+txUOV;+w>zCH=XJ>YugUuAKDNnqN&1 zFFq4AMNnY7}dT3v{yxf<|JIYXFP=(f)(a!EFgn#;A7LN63Sjx$Y?@c!L znhQWg_r4EEB$^7gd?)qA4jOhZan1bR($9|R&QO!&tl{FRn>Q0W9D1;b6{0fqa#2z; z>T~|&y$>><7!RarCNRD>MPC~v?046NKBqTF_$cZinA5U(&lO#(fj5CIpQqE^mw#HH z6w}Pkt;=&$gqZbQAP_x`ndvh%$yL3p2*Y#ikyO6BceEsd{sxXe6oF@S+@%Ab$*VRw z1?P4=kc|3+|6XS=64K^EK5J>H>!?6FbQR;w5&_ht(%^hA&FIumVh1|&TXEA}cP)y{ z+@cT7Kz7iZo}s&k45B@+e`FV(pRTo{W2y~(!W!W6JDVjPlTR~k?yEV8MvB2j0uu!YH^^BPSPbxjf; zoJ)?&?vLj%o_P_^L@BX`v1tW_wR-eAO(#8D2$(INX&3%cn`>@);#wbNr_A^@SvsUladF zgl(c+--zM#$~ou)J?=CTE0HGNjk?V%TsC7wn)Of>14-;fhEpFPI+QL_hgv6@YM8v) z5+r$+W`kccrs?e-KhxKJgR?ksAOtHF<~BCjrigl9JM#}qUx^it)!*G(7|kJP?Bw`q z@h5Bj&LYd4qTkJ@nMZr@=D`NR#KP?!?O6KmqJb|6eih7Aey(~!i5{-^(RSI3(>!bP z97ixrh1Y+7G9@Peg0A>(O@CBXZD2$26kREKC=?!mdnAOfK3A9*{wz10t{M?wlvZ|1jzjTygtSC zj7&L{s}bwGkbe*rca6w+ppfqL;M)4Z7YAzUO0Y!#2@Rtc&`>wd!ki@TzmJ5E(2;S6XfNhgN=VX$8?vPDq zTj(ISTca5*U2};PXEWj8)nK=PyzPl;XfJR+c_%;0CIe0|*6nU9=xi%VXGMY}UT@us zi}3%VB8OG(#`+xhC@5dS`&8ho*C)&6YsQCxLeILmc$DT!rNmwj_96$=WGP^}d)1#F zuDv0Nf!t_NyS_dxRL;&FZ=+kqFnzhn`l$TPNP76b%>ruQ6zCokh}`3oAjXix@yh`B xzZUKk6vozZ_~gqoL_OK``cL+9|F{FN3&9P$5X6p*=IwiCfVG7^ywco1`Tsm^rMmzC literal 0 HcmV?d00001 diff --git a/data/flags/ml_flag.png b/data/flags/ml_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..d0325baff60fba70ac35adf81711387e6d9b53ae GIT binary patch literal 437 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg)Zdpzt#i&DzWr3!cdb&7uF{f1Pdf%X0ef z)O**{{xtvYk7J0(u8Reyc{GsOpCnl%m9yALGoPS)4oKE8UXl@b#JI~}fdL3SUHx3v IIVCg!0JK+RCIA2c literal 0 HcmV?d00001 diff --git a/data/flags/mm_flag.png b/data/flags/mm_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..10c3ea27e7f903b1c85407eaad0ec35853ce23e8 GIT binary patch literal 2593 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 literal 0 HcmV?d00001 diff --git a/data/flags/mn_flag.png b/data/flags/mn_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..1f59c7f525a533abf54a0fd312a9a82cfd65d66c GIT binary patch literal 1781 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 literal 0 HcmV?d00001 diff --git a/data/flags/mv_flag.png b/data/flags/mv_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..1cd95c43fbb0890ae9a35107656b4d78285a67c0 GIT binary patch literal 1038 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~oqbNX9&$3rW=%s)+lgCi?d$xU2Dn~+oQqJWN5ZcJ5l8KW&0+jRo#iV z6SO@ha!j<+U6bn*(-csy0=jT-|C0}}&d1A_yD0)qep2aGF_5UKx4{P^L% zbs~lbm7i|?J!!g0vUnr9q)c#+|$SdFID2MxlFRRyA=}cC~CO-Mc#W>-EK1J4yp% zYYp!)Hf?)h{5k&8DofE@L2+v>gO{D0xVYN3|4PN{N#EjDT;6FNo|2N{^MT(hTJ*q< zH67QchP*n=`aa9?aNn2KTs!^sYyM1Ge{0#}TUR&eUzlyfG~tV5 ze_$JagMP3>|491Wb&bfI!qk9DmKN>-uFKy-fVtA_wd_z+ya)^BwjJ UZ10Jis}16Ny85}Sb4q9e0EM)>7XSbN literal 0 HcmV?d00001 diff --git a/data/flags/ng_flag.png b/data/flags/ng_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..919b3456c62faa3ff011e3d5120e1a723c3975a5 GIT binary patch literal 508 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg)Zdpzt>*Wig(t)Pbc)B=-RNQ)d zLotuZQKaGF_AO!tzFAUy2dq*iFPpyN_~Qu@lV){Et59Em~%lme5BX6p31A_nqlLG?>1ET^13kJvh@xItS zb#_bT%P!d-+f(mh|2*wZ_vLkuSx|H+^uP9g@c#N^%ikO94{zU5J#*RpEB)VHb@pHX zx&L2Iv?XHrDmUHx3vIVCg!0H)KG5dZ)H literal 0 HcmV?d00001 diff --git a/data/flags/nl_flag.png b/data/flags/nl_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..3b82622bf695a596a339a890061bd9bd8300363b GIT binary patch literal 366 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 Y7xo`BB$N5S^Jjp(^e3q*32@N=0805%zyJUM literal 0 HcmV?d00001 diff --git a/data/flags/ph_flag.png b/data/flags/ph_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..32c32205fb16f38288f1be617be13fb384176364 GIT binary patch literal 2965 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 literal 0 HcmV?d00001 diff --git a/data/flags/pl_flag.png b/data/flags/pl_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..fd89ea3aa61246209dd28ec47127057949de136b GIT binary patch literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~oq9mQ0|2A5iG5r;B4q#jUq@6!{tqcpNTHT@b*r zuIJ$z4iU~(D+-xdmb_p2>RtEBZ6M2#K~3xzMdQm>UAA>DJl6tdGq5x;2rw`?FmNz1 zDlo7R;5=|YW*2iiOPba8J7ZsJk^F)gmG*bpKd=+29jc504Lp!F7m46%e|yS#6G+C> L)z4*}Q$iB}`Q%3Q literal 0 HcmV?d00001 diff --git a/data/flags/pt_flag.png b/data/flags/pt_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..721bbb86a798de8cee67a822ec59a4cd96e96a92 GIT binary patch literal 3615 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 SKI?Cl188eJRLWK0VLz;>gTe~ HDWM4fe_2TU literal 0 HcmV?d00001 diff --git a/data/flags/rs_flag.png b/data/flags/rs_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..ea7757a7d49dcee57609501657f2ead55c273a72 GIT binary patch literal 3697 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 SE6ZAgWISE{T-G@yGywoA{$W1= literal 0 HcmV?d00001 diff --git a/data/flags/se_flag.png b/data/flags/se_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..b161f1bd2a8184c6d4be2c7ae9a96dfbd13e0a5e GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~oq1z&=A`3kC*8OHUWakcwMx?`-rs?7-0Q(3|(l zS;rTT9^5e8@kI2_FQ&45^ZAF`3q*I7irtxOwPlC5c_5Q(!77Di!H*~DX*N!-xnFYn z;KbjGjRoRNKpT*O!0shdckfK!s8>{6Eq?CTZMS0i>xT_y^}j8ddsF3QCD&aw21W%2 zmIej^1||mv4hBZ7oCoo%`Py{mty^R(F^TuyVbAy5FWy=I{_=-km3hmvpIl$PgzLfc z)PO3LyOYvdCp+$AL^13|ONo6%U5v|akN-@!g8r~hu=iOU`^<2Ai|zi{U8-*ubcQ$N iGq4bF0myCWAmcQjc7^);bvc4ZK~kQselF{r5}E)?Ifmx| literal 0 HcmV?d00001 diff --git a/data/flags/si_flag.png b/data/flags/si_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..8b946e64b9b23ed8837001494d842883ccfaddba GIT binary patch literal 1237 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPms~oq1R)y`WE(QjcBu^K|kcwMxZ%5|@m&zRY`2Oau zt#@mS1b6DhxVZ56=$+ya((B|36yOvH>>SXKK*Kwd*#Z5)+o=1S8hM|j46Tg(_ zG6BVyc@8d)iB27N1h;JzHM{lr@C@EVi}bbge%H<0_Dv=C*Y9ujRp&AtC#iU1Lx1nH zo~>_5l=xLtvf&}Sy`eh-hKRhUh3u9%nSG2>D=nXAbFGZNPoCs z8Q;3yx%ZAuz0MjqS7XuluDdG1H?QYT4=-nY^=eL7^gn@!m?_nVb5|O48}MlKh8w?p z=hYzH#vgDef>~A7Z`EGb3vU)OMn{@fR(5}%ZX)3@n_nR+%0s8}>9X&+H>_I^=GR{@ zvSGWxcaC|=G&9|&<`d_#D*t}IUB+RR+^5fTLuT_WSkm&S?bhsjUsGJ?n11f+OxZ5r zkatOQ>vmBEee(w!7aA(v+)$FmSYFy~uv*El&LknI@{2s<58tiVL{8q|x-cV-@!ss< zBWETShJ|0dyg&MKaKtwk#eSYnqtu9=hu-Htp6*=j%lL%VPg9tY#eaUzR`!(^)0enA zn=)*6KR(l1jlaQF`10>>`(ii0ylu*N;MjC;$&bG*Ur9UF+09HT(Y7-$XOt|^y4JdB zm%YRd+e7Td-TzB}S68`I)Suh>_73xwzYKj(zc0DJGW)7z>Z30`@98xD*e6w| zuTkukYugYq!8P-+>$UeQmjCQ>)@qsM^6RZ^TR^qt-~aEFd#Aj;dFY$ock88Q{}lyp zRQ=ZQ%l$X+=S9vt)8r@26`df?yTWtHiCtyBs|>_|T2y9ot+cstAlrTWhO{qP%db4+ zXKpO5UAFnbg($sis-4f-mN>2OUBb}u)Ip19rRNfk!xNe!9OlQDZ(5tps#(ALl3iHC z>6?Le?~Qx!NnbN~_qer3cE&!t2^k!n&&}2{ofPq@eQa_5-LDCf{J-Ain`<*1cs7qe zxay_O{C%4mPcgsDWy-mM>V>r98Eo=@W6^c1J3siF9F|e)B5+jVrIatSau3@p9*O*lxzq zzwwWN2J-}@+$QVt>-xdE-|Lk5?i)A0V}fTw1r$|m2rkx44HBIBK|Hg=X!+Vd;cI~f O5QC?ypUXO@geCye7bhD4 literal 0 HcmV?d00001 diff --git a/data/flags/sk_flag.png b/data/flags/sk_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8b380e124aa2b650e7b6badb45311803815dd0 GIT binary patch literal 2244 zcmai0c{J1w7ygZ5jA_P_rLh}JFO#(tLl_xrp(2g449ZTEo!2tFQ!(~0+e;%cMhPL= zDT(PNdl_4UI$0XKqKwR^zu$Ad@44sR=icX>d(J)Q-al^2MLSCbObP}70K(b|clnS> zza0uWjNQf_{f7kcJa35uxWBEWqvHOdB0#iq4h4WCqQ4yk6h1&6iu_^Lw&wifd~!#0 zpbZv6Z{TA|LwbK_4q0MX;~Y!@a6}v8fjcWM!3UY}S9Wk1?#F zxAzYshCbdS3p49PN8gx!`58x9{c|Y$SHc=*(QOu~p!h#g+C~jw3w3M5<7Ia7o8smo z`^dE*H~_}N0Uh8CApEanm{H(&QaZEEC|S4Z!er5Nr+0}hw1O+emB38wXD#A7ORwhj z@&S+*B}18ne^^Fd&9W(;PLVY1>_*#9LWje>TsST9`(V{dm}CkTU#(5U^)CcDvmb&A z6a?&tns*$;_@dcNxX~Jyy;-$0WIo565`Fgbl-2}M=jZKT9OqSTu?(m^F>0DzZj-2{ z$5^om+x0dc)$m5vMSUIqI7!{tAIN?X%zY$6s7-L!W~m{R@oR7p{>6733wQb&M$dk~ z(;E|ZE1`FllJFxAznH5O(SfKF6rz~`ALU6eVk5RnYhxw0Ot?_T3h?V?Qh5V1&-s){ zOALZ)60H-&Y1-qmhBWnyjFZF|Ej?T2{$c)Z{f@gB9$*}H1zlngq9B72J|j&&#qVDuTD&MkN04fr zMKVG_1s?!jC4mAMy*$o{HHqN-A)z8ae-~sX1+DrVewmc(NYw*z-K{@e)v zi>8OyMkEpqPf!PdhRA!U2N+=|#L1(!(XIobteQAo$l=*pcxjhj!rDNK5cJaJCi}%0 zjzYHw7OGkZdE~56<)m7uQry6^)7!dNorgZ7DEyKcBZ`j5TNv~AInUA ziL2@cckCX&p=*F7Ar(|YD)UNd-pt{Jk0xA=q(x~6m>>xy(M>hff1i-m^O@Rr>UR`* zr&^PKuXJurpo}4Xr?JHI4Zu6-irt6>-#9C{^n?i`k7c*hn`6Zjr&`}`fYAJ>J6vd!a z6803Hf&kL}@2*5glbrgJekt?BvOUy;$LpTC&yDziSJx{HY8U^p^myiyJlw<0@RJ8) zt$ck`zI<9Wap@X3P=#&j=JbSIQr4ZgDdv@azas?op3H2QWbhex(P@xO}#JS9?wZXdvzFNN^BV9cNN1e~)P*h>nu99w)qlvH|W8e3fzl*y? zQ44{bZQ2$6C+2KT>`Fia;%fD&%RBC$U-Awh@ke~O`?7cMgzIm(7@asfbpi8@xyAe= zw)}>UfJ}6}N?sGylHDkeLW{p|mb0vmlZ&kshlr_aXFau?v-vh(?{w0?=!jBq^T62U z9d6hX+TVZ+w?(S{xm@v>>U`(f**HiY?=7$udxe>6EerA#ND1P6y}kG4h3d=G_pJfZ%FL$n0(e5zrxE5CGh zlh=tow1lm{`>)Vrs9OxD6@!Un3BARGHbnr~Sa=e#f|>Kz57%eiY`+)Y*i)^L9G5SB8(?lfI&Q{!Dyu%%>4X760t= z>v;#cAL2nXtC)1vGjZd0Rs&KAdyEmQ&-0)4XoLOnUN5?~gC{QnUn>TN`uHmzqeGn3 z%?@g0qnzcAq#G$5`KN1oY)}og?bq+8SNkE@i{pC zmD-gP&08=9%ox;fhkCeQ6X4{Jce{2XeWcnp*?O8~Y74mXo=gq*>!jTCl#8SL#^-Kv zWgqPwU%KDyeG{Pj>yPT<*CJ5~W1_=yZUT{!P!;nC+^ivZecl8$z9!e~M>Z}7Ss9pU zJb(oB$lwaEXDzLIy*RE0M6M#XQ&`5l_#f5`=>~o}m)p Up)(e9_-_E#=61N6bA+V-0=ka~n*aa+ literal 0 HcmV?d00001 diff --git a/data/flags/sn_flag.png b/data/flags/sn_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..98a9029e29dccc436a5a8c85a38ba75bb34fcd62 GIT binary patch literal 1060 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPgg)Zdp!Y*_>_fZZj}2FY$D745_&F z_U`_C;dGhfAJ2ccoNdJs$Rz4?Awrc~RPIEBM2`#Gl9t9LNtq!>E;Vix;xZO8?hyT` z&Z5fIA#|ltFHkgm*cZ6*FlvY1)^WS>^E0?l%vVPnDk@J8eUK23QztHq-HH*O3`Nv+f2&|rY{nFYi z+0RTFU0$ZW`ue^LNOCH;IoDTJzBm0cfnkyHZ?{=<&X)aoQoR1AIg7y5=>9#g^6&pB zov$nG;L>(o_IrCUQ^&E>u9-DyZ~5fsf2`W+!4UYP^498IdB5V}%>DA{pI=vA z|8a>e_6|~1->Mq4&hZidbE$m$AJMVl_5Tb0c1;%xU(zc2^0fXEZTGo-^|>q?Zpyqj z;Qcz|*Regz{@wiXt@!k%z2fr!E1#FWtXlu_03UbSnI>zNn%nO}ejd!+aQfx{TfSwMFk2sz+N5xvahuAr)2Wx|PVW4+rS@L(+sw)D=J=HC%(*owq99rHi)Vs=V3omx zE4M#pTCdxF_)EfpmFf@b*U0_RN%$UiIb#0hsf+!7s>SEtOI5E*uJzl!J?g?^;iD!O zROVWzyvqA@W^eWUmv8?IBKYOk>$hbj|Me~!KLXVA@9sdjf>T=iRX! zclYmkHa&cL_idl@{l&W~j)a`>6z@+teKdEq=o$U=+ky@ZZOg*SpRDw|y!XBD@o(#D zPs`t)z1IF}ChvCT2C>k!-iud;-vD*WOMkUv}}!;e1}s z1xN3A?A@p3@txf#-TUm>H|MAM0GYeFZhm9AaEPn(%kh~m?6=L!BA+Mh&V1#w$VugSyz78Ne*e;OXk;vd$@?2>_gwx^4gf literal 0 HcmV?d00001 diff --git a/data/flags/sy_flag.png b/data/flags/sy_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..17575eca4b1a76e6ee91083e5495f15575247a77 GIT binary patch literal 1533 zcmaJ>`#;kQ82*l!Ob3ZGHYJMXI=6(=u+3OQWN}=NxgXa_mQ=@OLK#OWf57{Gp7(h^&-=^!!~1#e*xOkh5myig0N@DT8hc5=aX%m? zDwypkQjdT{y$M!WVE;##v{YmXoWo>mmq-AB$ov2Zcvt`xnBc2;TTAeW$Z?2{9vyNM z4FDo{@mLFD^!V3Fw-CoDICzD(80rC5gi%30Q)tmcWRtLmCCV1r3)K9a1*-0#KvG_fuL5duEc;MsBBt;$0-y zckq29Rr^`H+h#M7-}i60#-$uw>vl~WC8&TR&a$-*;YO{z%|0QaLmO`A$OMimLn?aK$?F z)RZF^*lFrRQ`wOU!^hwYsJE%DA9Q7_n%IYQfPqVX^{@r^B*ED5*gRRc>~1sDPY zHe>Q6%H#7^p8_97e$V8I3uoAvx~l=e{lbkEj!;uooytHmW-3QXiCMi170%EMCF!JZ zd5QqvJ}T|4EUdxZ7Avjn(*R)aKaV8S@g9JN1KuTCYc|{(TSVQ-P)My^D|{;IU>mPY z?4}ZI9Hj=2VGTv3ZIh}h@zsvh2A{%ux_7=t9T%J}#(K_0%et1@*`{%$pV(b4+f>P; z6TwQQug{GSrqJ!Vv!kc>R8aW39Zu!RF9loANd$syJxz{5h2dn!XK@3__RO?^it}Pt z^Fw9BW3n4_DO=*(+3%Q9+nRJ^CK5=!F_F$+_WWi4v!N5hd@j9%yv0W~)8bTL*d%yTY zZ4h;zd>rw{MX%iw&!|p#n0Ops@7`rBnIuX@DwaDVG1iU`U zFxL?!UDlju?!x%?9j8cX2zKCde+dHX6c|8s-rj`rOh%Nr1%{+33NHM^7nTZR>9Lhh zY!?IMq3fqTt?qt1$6u4`ptcs?Bw@~9kzeLC^_WIY^a-?Bq{u}yus$R5_$zFcWWcVbs@+KuG)MM3SHeG zA4A%MDNPq=>n5+~2KStJ)}l;=Z+cp=JJZX@I%S*!BD<+`EzYaxJw4xiJ*!Y&7WLdh zW6E9rX`i6tk#@mHAPIBLf2q>XFrli;G&v_9rox*Hj;@fjlzrmaWiG`?Sc<1xF}MgW zFN_A%)zzaN0~Iop;ExbrS!QO?%y}pv8V3cuffSI^f#Tq_6Kqv`V@qRAcKvCk34)*o M@RoMi8njo!|9VrxasU7T literal 0 HcmV?d00001 diff --git a/data/flags/th_flag.png b/data/flags/th_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..68029ee39e1d41bb89c8128777807b695d5dcc16 GIT binary patch literal 409 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 literal 0 HcmV?d00001 diff --git a/data/flags/unknown_flag.png b/data/flags/unknown_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..2cee86839d6b25657dbfe6480246fee5732f7e10 GIT binary patch literal 5602 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 literal 0 HcmV?d00001 diff --git a/data/flags/uz_flag.png b/data/flags/uz_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..899f1781e846010f8b86fe11688c04b3e6008ab0 GIT binary patch literal 1350 zcmai!e>l?#9LK+Y9JQf3$_Upv;Y75AWbUxttilpgv{;Eu(;{u=l3ZlnO*9e9lo~lq z%#TKEROk1vmdzNg%huI|{8%0HAP-0HBZZ zg$JrLbhHKUU3U5QyQ1?8_51}ji z$^z`5Su5Ll1^~2QqTpUZ=}BnS^JFiC7WfQ{2nt>GrYG8@*6>a{dX-!na50O z!LC(N zn*2R8_15M}$K@0@lUZNZxtCuwcgg>o_3B-|R7(<*x5D;zjvg{+SQsOQq`$$;I=P?A z7uVPHRiG2OPsa}}dqB%8#$P;EF{U5xC~R8JC%8OAQ*pKholf*sI8X?iOO#PJhfaJR zRW?2gVNXQ*$+UDlkqwCKlzF5EQoXZVE`D&~iUo}4O@WohrP zu|i|o1Y-q<3be`_q&eq%L%<2gtG>xopYkB!NJ-q8%>5vDdBO5kHNBKxy|C$ z#E-LkSkdM(y@NI~7{$Au#dROQfWfc4Np|=wo6>|HjfoCv)br_zDe2hPO~Y!jGpa_G8~BhgEdV zMqX|2dr*=+;bKwM`JigBiCanlCvIUN!RDH^K@2mS`ZS$NY`|uu3bxFJu33ITu zJxos8w;g5JS@$U;ZDcD5Z+Fw>vl4dq&heO-fk-=8Z0#6@fVd|Y5uI~HQzD&7eFx~J zh31grj`0hlkGtkBZ_FPny%5gAEZEhTG+^x-1yn-0-C?V|+#z{Tzc`n>q&numC%A8jq}4bjv3VO2Qr2qdg|Gma>rQ|l zjaOE0?;#rHXLUFp=%Kf?WH~JBp>mQ`%27~uZ#*;fd^aD5)*>1Jn*XiT)y;DSEi10C zCQrCs+Y1!`Y#QNq%?)5&CmZiJLzL1@Q!TT<-3I)hzVtr+Wgz*6*iM{4sx`n~n^6dV JINLiS?H@C|WY7Qr literal 0 HcmV?d00001 diff --git a/data/flags/vn_flag.png b/data/flags/vn_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..15c1913cc688ed64b5ea31d23c5a0a83411e22cb GIT binary patch literal 1473 zcma)+eKga19LIm#?wGk-GrP#+IMNJLxXN{7TU$(M9&U&Vi5zvChoq=2c85Ahs(IcJ zCA3Sq%To^&U6kZ;+)^Iq&O>OdhjVTB=bZaz_uPBF=kt9(oXEopm-fC+3%&^M2p^+S znKuyBazNuA*9J>RK&*W5`bb)bhXbw#hhsAR$dtP%6dZ+xqcV6^n3epPUNTrreO=Gb>$&-MdyU$JX6*KV!7{y12n zQ(i}cV>T~dg)o%LKKvF*nodI`J^^a(n7_(c^#Ni}I?BpF=LfCXKkxFST>*FP)&&lx zmP2f~t)=n3JPSC+etrJbdNJbJ`G;i2iZEfkk+1zxXfzS>d^o#^nQU{v%3pq_r(%23 z(M;%ZU6FN}OxHl>8l~0W%43LCqTdU>H zL9bJKYymc?>1Bhq)-ufd0_2?c;+6gv8x=o;I0a;UVo3iwilA95iJjHUggJ5tH-}Q+_}S&gLcO~ z8hNsbZ@N@hs%*Q+l{xqHbkF3Dez1FAlEsgmX+uw@_kb%hm3XdkLP@Ada!HebqiVcNc)6!Ge%-{S>5^8; zgZ>MdMT@Mpx#%}TTRi_b-Zg7r#L^u}-#Q#b8K4wFKQ$->L4wlfVk8n4lyYvYwX)%X z%ZWWtZadOlIZH&YJN+q|Z=v|H zjoivy(<^7^3gte4Kv=SEo6{igRU@vrsies!ij)dki}W#J31&BEh_rHSr0>G(F}-L7 zen}+!aqRxCvmW9s51%(I|94T%D&xEeE$hTn)n$iWI6Og)*S|vHE4;W}-)uR!-#qhO isM`O+&_Ad$g-n~I*eB~9z^Z|u1po%!n|6m9n))}i4skjF literal 0 HcmV?d00001 diff --git a/data/flags/za_flag.png b/data/flags/za_flag.png new file mode 100644 index 0000000000000000000000000000000000000000..dec515f48b17be0a1f578c7a702e8ecbbff49b12 GIT binary patch literal 3222 zcmb7Hi8s{k7yr&M6NagjvBac=u~gGo-bwa-dC6{UWlYFEmWBp3OxX=Zin7ZxLx|q^ zCA)0N7LjD^dx${_zj^T;!^D=EAN_#?{o-A6t_PN9yZycR^9&T>nM=?mX+!I5@gp#d`l;0T_;Q%Piim&f8li&T&vWNdJJWM$)tbo>d1 zLM|%k{KzLct$VH_iBamcN_+K>8|(50Hs^B)bD6LzP)G$$`zkMiVgg>=H3}k&BDOaD zOcZxWOL)O2vGu5|=ng6*WO^!U>{;rggxkKcdvyABd9|^{{XVG#9NAKEqqYE5*ova4 zhi7uGlG+H*uL+)6i8vV+PK zuASSOtXjRghN5e{*K3fUgk5k1bhp!a^3EC)lu15mMz3xf~u$x!+_4w&t~|@8S|@kUWx5rNj3j| z>TolXpDVYf92Dl&msi9P)7MH)#G0VJ`)^xzTwo7Lz}8X*k8aiQ>l zqto>c(#%4um`gGk8*0;LXz;SCs)`%3sOZ*tW4Q-p>z`Tbw!>RfVT706fj3xW-V2n& z1g)lhm*ZVLM0$5}gd4^|#pYSQePPB}?np{=jf>u6L3^@BFj?Uf>%o1vmIVhks0#Vc zyL;gCM4XUT@-{9A?afpyC7dciTnq}3A^f2)R_|X{?nrX?=JEvPF>&H*k*$xHR7X^E z4Kg2cbU>@2aMExr=Du<^!&JLeCrabbCm_A9X1W&j4q&r_cuyKY!&4opjCXdbH%G<} zb{Hykb?U;AfC&Q4$qT05{8rFPf5$oNLG1U|!ErEJ@pGhl>)wKoFR2oiBe?_2%~HKk zSFe*&(n;^rm8^HdH+KIn{pYdWd!!n-3)d~FD%=&jCXOJ;$Ib!qws1aOb>W;*`O&%V zrs8sbu-C2cvqA(_+u6Rh?yhR|H8nw>52hXGI=cd=<#Z&`ZasxEZ%iZ$fa_DmaA$(#?~h z;8#D8!!yDHq+BDjBryc&5Bf|{mq@k)y_Jv<+-c;N2lL|N1(#7;yZ=_b*_Gc?PPKwJ zDxqs@MmE}NAfbW#+OzhSc&5SngLAFukCi-3V{hh$`6I+`AA%T0lbSVmoK4-l?0BBU zN^BM^$AC|gw+MvZ&`PFR*)uFh^#|H9TU?YV@1j^4>QzeVKrE$Xv}rRd4nLH-44mp` zMtI9AlM3@KKDP=+E+@L-+HT(w@;4K)0b}3qKk4LRc8qKoR#6_?JN(@RcUDr2CHwsI z(#6pZY&@Y~A|9Rf^sVj!FcTSg=VJdr6)fWw0r5r^ZBtg@Q&ud``z^gjM2{W*4 z|B6*WiPMLjQ~dRqOKS$P?*hvs36$Gr&EW;7dS-mll{`-IP_fsVBSZ;NmECF6UZA-w zPuzs+rtoHOj$dq0KCcXf+HG?wmH@54DbBOWkI0i41Z$rx@IXsCQhU8!wc`PREC6@= zAyh_}(X2K+UyB5NvwSXr;?T`@)CcU1 zaO;^rd8^#Pq~Bzx_k$&+SJ-#)OQReXqpmUP-2Aw3RDFyLatyJpD_`@YaT58W!!I$z zC+h&2^Zq`l1@O-OA?sh=-UgT+IiLD*iDddCW(p^9Mw;4^vwSQJ(>b-x%2u5i`L)_} zEcgwJ))k*m>n?5Af{81{wg0pSBW3x~3YUZFyPHOPEq={rc2fT+_LvWMhR+NoZlW^K ze8&YoeyC5ZPZ86*U{vKhaj3SnIntf2cI?dS&lcY;W;4M;KbM%@4MWW*jafQav2dm# zVff||$#r!JBe%ZOi8#>=Avzy`=)ZT5aowk%^|?>^fgEroy_(p6_Y^MDQ1Q?86Os@2 zIoQ;-tqV6P-U=PWa#90vR|mKi*59lI+RH6-Lwlb zS>ug#{M&Hb0oHKCzR#0P13q~QDzceAZGzNL^I%%vH-&52jW^2R$r)6Ej5cl_(aWPk0ICTLeUid@Gd9{{ulWQ^7wZpP}Qr2L=KdzH>D z~x0Fn3Q;+!Rx4fz2Xa(}YX zj<{!a;1UK2tAA~6wQ!p}|M1|$&v;rQQgDrn%`SUb7<~KLMx8fU*~yRl%whXj+B58F zH?uaYq4k!QvOkfQ5nm!(lSXUjd^%_oZ|WrrGDcnOa|pySfCI@4YCB8V*a&@md?*UJtxC{%INa z)G?o#9L&z%AwHk5+FbG2b)e;VDZLs07957vI>Gth)G6Tz?3zl9k0(BmVQ&zCk)E0E JD{Ysk{{zwc=?4G+ literal 0 HcmV?d00001 diff --git a/data/themes/default.edc b/data/themes/default.edc index 6fec1d56c..6aeaf7890 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -41314,4 +41314,139 @@ collections { } } } + + group + { + name: "modules/xkbswitch/main"; + max: 148 128; + + parts + { + part + { + name: "flag"; + type: SWALLOW; + mouse_events: 0; + + description + { + state: "default" 0.0; + align: 0.5 0.5; + } + } + + part + { + name: "event"; + type: RECT; + mouse_events: 1; + + description + { + state: "default" 0.0; + color: 255 255 255 0; + } + } + + part + { + name: "label"; + type: TEXT; + effect: SOFT_SHADOW; + mouse_events: 0; + + description + { + state: "default" 0.0; + align: 0.5 0.5; + + rel1 + { + relative: 0.5 0.5; + offset: 0 0; + } + + rel2 + { + relative: 0.5 0.5; + offset: 0 0; + } + + color: 255 255 255 255; + color3: 0 0 0 128; + + text + { + text: ""; + font: "Sans"; + size: 9; + align: 0.5 0.5; + min: 1 1; + text_class: "module_small"; + } + } + } + } + } + + group + { + name: "modules/xkbswitch/noflag"; + max: 148 128; + + parts + { + part + { + name: "event"; + type: RECT; + mouse_events: 1; + + description + { + state: "default" 0.0; + color: 255 255 255 0; + } + } + + part + { + name: "label"; + type: TEXT; + effect: SOFT_SHADOW; + mouse_events: 0; + + description + { + state: "default" 0.0; + align: 0.5 0.5; + + rel1 + { + relative: 0.5 0.5; + offset: 0 0; + } + + rel2 + { + relative: 0.5 0.5; + offset: 0 0; + } + + color: 255 255 255 255; + color3: 0 0 0 128; + + text + { + text: ""; + font: "Sans"; + size: 9; + align: 0.5 0.5; + min: 1 1; + text_class: "module_small"; + } + } + } + } + } } diff --git a/po/POTFILES.in b/po/POTFILES.in index e2f5046f7..186b52eea 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -246,3 +246,10 @@ src/modules/mixer/conf_module.c src/modules/mixer/e_mod_main.c src/modules/connman/e_mod_main.c src/modules/systray/e_mod_main.c +src/modules/shot/e_mod_main.c +src/modules/tasks/e_mod_main.c +src/modules/tasks/e_mod_config.c +src/modules/xkbswitch/e_mod_main.c +src/modules/xkbswitch/e_mod_config.c +src/modules/xkbswitch/e_mod_keybindings.c +src/modules/xkbswitch/e_mod_parse.c diff --git a/src/modules/Makefile.am b/src/modules/Makefile.am index 949fc6303..77a89435c 100644 --- a/src/modules/Makefile.am +++ b/src/modules/Makefile.am @@ -191,6 +191,10 @@ if USE_MODULE_TASKS SUBDIRS += tasks endif +if USE_MODULE_XKBSWITCH +SUBDIRS += xkbswitch +endif + #if HAVE_WAYLAND_DRM # SUBDIRS += wl_drm #endif diff --git a/src/modules/conf_display/e_int_config_display.c b/src/modules/conf_display/e_int_config_display.c index d6de603ee..e544464c7 100644 --- a/src/modules/conf_display/e_int_config_display.c +++ b/src/modules/conf_display/e_int_config_display.c @@ -5,14 +5,447 @@ * Give list some icons. */ -#define RANDR_11 ((1 << 16) | 1) - static void _fill_data (E_Config_Dialog_Data *cfdata); static void *_create_data (E_Config_Dialog *cfd); static void _free_data (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static int _basic_check_changed (E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); static int _basic_apply_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); + +struct _E_Config_Dialog_Data +{ + E_Config_Dialog *cfd; + + Evas_Object *scr_list; + Evas_Object *res_list; + Evas_Object *policy_list; + + const char *cur_scr; + + int restore; + int orientation; + int flip_x; + int flip_y; +}; + +E_Config_Dialog * +e_int_config_display(E_Container *con, const char *params __UNUSED__) +{ + E_Config_Dialog *cfd; + E_Config_Dialog_View *v; + + if (e_config_dialog_find("E", "screen/screen_resolution")) return NULL; + v = E_NEW(E_Config_Dialog_View, 1); + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.apply_cfdata = _basic_apply_data; + v->basic.create_widgets = _basic_create_widgets; + v->basic.check_changed = _basic_check_changed; + v->override_auto_apply = 1; + + cfd = e_config_dialog_new(con, _("Screen Resolution Settings"), + "E", "screen/screen_resolution", + "preferences-system-screen-resolution", 0, v, NULL); + return cfd; +} + +static void +_fill_data(E_Config_Dialog_Data *cfdata) +{ +} + +static void * +_create_data(E_Config_Dialog *cfd) +{ + E_Config_Dialog_Data *cfdata; + + cfdata = E_NEW(E_Config_Dialog_Data, 1); + _fill_data(cfdata); + cfdata->cfd = cfd; + return cfdata; +} + +static void +_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) +{ + if (cfdata->cur_scr) eina_stringshare_del(cfdata->cur_scr); + E_FREE(cfdata); +} + +static int +_basic_check_changed(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) +{ + return 1; +} + +static int +_basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + return 1; +} + +static void +_res_get(E_Config_Dialog_Data *cfdata) +{ + Eina_List *l; + E_Randr_Output_Info *oi = NULL; + Ecore_X_Randr_Mode_Info *mode; + + e_widget_ilist_clear(cfdata->res_list); + if (!cfdata->cur_scr) return; + + if (e_randr_screen_info.rrvd_info.randr_info_12) + { + EINA_LIST_FOREACH + (e_randr_screen_info.rrvd_info.randr_info_12->outputs, l, oi) + { + char buf[512]; + + strncpy(buf, oi->name, sizeof(buf) - 1); + buf[oi->name_length] = 0; + if (!strcmp(buf, cfdata->cur_scr)) break; + oi = NULL; + } + } + if (!oi) return; + if (!oi->monitor) return; + + switch (oi->policy) + { + case ECORE_X_RANDR_OUTPUT_POLICY_ABOVE: + printf(" policy: ABOVE\n"); break; + case ECORE_X_RANDR_OUTPUT_POLICY_RIGHT: + printf(" policy: RIGHT\n"); break; + case ECORE_X_RANDR_OUTPUT_POLICY_BELOW: + printf(" policy: BELOW\n"); break; + case ECORE_X_RANDR_OUTPUT_POLICY_LEFT: + printf(" policy: LEFT\n"); break; + case ECORE_X_RANDR_OUTPUT_POLICY_CLONE: + printf(" policy: CLONE\n"); break; + case ECORE_X_RANDR_OUTPUT_POLICY_NONE: + printf(" policy: NONE\n"); break; + default: + printf(" policy: unknown\n"); break; + break; + } + if (oi->crtc) + { + mode = oi->crtc->current_mode; + if (mode) + { + if ((mode->hTotal > 0) && (mode->vTotal > 0) && (mode->dotClock > 0)) + { + double hz = (double)mode->dotClock / + (double)(mode->hTotal * mode->vTotal); + printf( " %ix%i %1.1fHz\n", mode->width, mode->height, hz); + } + } + printf(" geometry: %i %i %ix%i\n", + oi->crtc->geometry.x, oi->crtc->geometry.y, + oi->crtc->geometry.w, oi->crtc->geometry.h); + if (oi->crtc->current_orientation & ECORE_X_RANDR_ORIENTATION_ROT_0) + printf(" orient: 0\n"); + if (oi->crtc->current_orientation & ECORE_X_RANDR_ORIENTATION_ROT_90) + printf(" orient: 90\n"); + if (oi->crtc->current_orientation & ECORE_X_RANDR_ORIENTATION_ROT_180) + printf(" orient: 180\n"); + if (oi->crtc->current_orientation & ECORE_X_RANDR_ORIENTATION_ROT_270) + printf(" orient: 270\n"); + if (oi->crtc->current_orientation & ECORE_X_RANDR_ORIENTATION_FLIP_X) + printf(" orient: flip x\n"); + if (oi->crtc->current_orientation & ECORE_X_RANDR_ORIENTATION_FLIP_Y) + printf(" orient: flip y\n"); + printf(" can do:\n"); + if (oi->crtc->orientations & ECORE_X_RANDR_ORIENTATION_ROT_0) + printf(" orient: 0\n"); + if (oi->crtc->orientations & ECORE_X_RANDR_ORIENTATION_ROT_90) + printf(" orient: 90\n"); + if (oi->crtc->orientations & ECORE_X_RANDR_ORIENTATION_ROT_180) + printf(" orient: 180\n"); + if (oi->crtc->orientations & ECORE_X_RANDR_ORIENTATION_ROT_270) + printf(" orient: 270\n"); + if (oi->crtc->orientations & ECORE_X_RANDR_ORIENTATION_FLIP_X) + printf(" orient: flip x\n"); + if (oi->crtc->orientations & ECORE_X_RANDR_ORIENTATION_FLIP_Y) + printf(" orient: flip y\n"); + } + + printf(" monitor is %ix%i mm\n", + oi->monitor->size_mm.width, oi->monitor->size_mm.height); + + EINA_LIST_FOREACH(oi->monitor->modes, l, mode) + { + char buf[512]; + + if ((mode->hTotal > 0) && (mode->vTotal > 0) && (mode->dotClock > 0)) + { + double hz = (double)mode->dotClock / + (double)(mode->hTotal * mode->vTotal); + + snprintf(buf, sizeof(buf), "%ix%i %1.1fHz", + mode->width, mode->height, hz); + e_widget_ilist_append(cfdata->res_list, NULL, buf, NULL, cfdata, NULL); + } + } +} + +static void +_screens_select(void *data) +{ + E_Config_Dialog_Data *cfdata = data; + _res_get(cfdata); +} + +static void +_screens_get(E_Config_Dialog_Data *cfdata) +{ + Eina_List *l; + E_Randr_Output_Info *oi; + + if (e_randr_screen_info.rrvd_info.randr_info_12) + { + EINA_LIST_FOREACH + (e_randr_screen_info.rrvd_info.randr_info_12->outputs, l, oi) + { + char buf[512]; + + strncpy(buf, oi->name, sizeof(buf) - 1); + buf[oi->name_length] = 0; + printf("%s:\n", buf); + switch (oi->connection_status) + { + case ECORE_X_RANDR_CONNECTION_STATUS_CONNECTED: + printf(" connect: connected\n"); break; + case ECORE_X_RANDR_CONNECTION_STATUS_DISCONNECTED: + printf(" connect: disconnected\n"); break; + default: + printf(" connect: unknown\n"); break; + } + switch (oi->connector_type) + { + case ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_DVI: + printf(" type DVI\n"); break; + case ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_HDMI_A: + printf(" type HDMI_A\n"); break; + case ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_HDMI_B: + printf(" type HDMI_B\n"); break; + case ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_MDDI: + printf(" type MDDI\n"); break; + case ECORE_X_RANDR_EDID_DISPLAY_INTERFACE_DISPLAY_PORT: + printf(" type DISPLAY_PORT\n"); break; + default: + printf(" type unknown\n"); break; + } + e_widget_ilist_append(cfdata->scr_list, NULL, buf, _screens_select, cfdata, buf); + } + } +} + +static Evas_Object * +_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + Evas_Object *o, *of, *ob, *ot; + E_Radio_Group *rg; + + o = e_widget_table_add(evas, 0); + + of = e_widget_framelist_add(evas, _("Outputs"), 0); + ob = e_widget_ilist_add(evas, 16, 16, &(cfdata->cur_scr)); + cfdata->scr_list = ob; + e_widget_size_min_set(ob, 128, 200); + e_widget_framelist_object_append(of, ob); + e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 1); + + of = e_widget_framelist_add(evas, _("Modes"), 0); + ob = e_widget_ilist_add(evas, 16, 16, NULL); + cfdata->res_list = ob; + e_widget_size_min_set(ob, 192, 200); + e_widget_framelist_object_append(of, ob); + e_widget_table_object_append(o, of, 1, 0, 1, 1, 1, 1, 1, 1); + + ob = e_widget_check_add(evas, _("Restore on login"), &cfdata->restore); + e_widget_table_object_append(o, ob, 1, 1, 2, 1, 1, 1, 0, 0); + + ot = e_widget_table_add(evas, 0); + of = e_widget_framelist_add(evas, _("Policy"), 0); + ob = e_widget_ilist_add(evas, 16, 16, NULL); + cfdata->policy_list = ob; + e_widget_size_min_set(ob, 100, 80); + e_widget_framelist_object_append(of, ob); + e_widget_table_object_append(ot, of, 0, 0, 1, 1, 1, 1, 1, 1); + + of = e_widget_framelist_add(evas, _("Rotation"), 0); + rg = e_widget_radio_group_new(&(cfdata->orientation)); + ob = e_widget_radio_icon_add(evas, NULL, "preferences-screen-normal", 24, 24, ECORE_X_RANDR_ORIENTATION_ROT_0, rg); + e_widget_framelist_object_append(of, ob); + ob = e_widget_radio_icon_add(evas, NULL, "preferences-screen-left", 24, 24, ECORE_X_RANDR_ORIENTATION_ROT_90, rg); + e_widget_framelist_object_append(of, ob); + ob = e_widget_radio_icon_add(evas, NULL, "preferences-screen-around", 24, 24, ECORE_X_RANDR_ORIENTATION_ROT_180, rg); + e_widget_framelist_object_append(of, ob); + ob = e_widget_radio_icon_add(evas, NULL, "preferences-screen-right", 24, 24, ECORE_X_RANDR_ORIENTATION_ROT_270, rg); + e_widget_framelist_object_append(of, ob); + e_widget_table_object_append(ot, of, 0, 1, 1, 1, 1, 0, 1, 0); + + of = e_widget_framelist_add(evas, _("Mirroring"), 0); + ob = e_widget_check_icon_add(evas, NULL, "preferences-screen-hflip", 24, 24, &(cfdata->flip_x)); + e_widget_framelist_object_append(of, ob); + ob = e_widget_check_icon_add(evas, NULL, "preferences-screen-vflip", 24, 24, &(cfdata->flip_y)); + e_widget_framelist_object_append(of, ob); + e_widget_table_object_append(ot, of, 0, 2, 1, 1, 1, 0, 1, 0); + + e_widget_table_object_append(o, ot, 2, 0, 1, 1, 1, 1, 1, 1); + e_dialog_resizable_set(cfd->dia, 1); + + _screens_get(cfdata); + return o; +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#if 0 + + +/* + man = e_manager_current_get(); + sizes = ecore_x_randr_screen_primary_output_sizes_get(man->root, &s); + cfdata->has_rates = EINA_FALSE; + + if ((!sizes) || (s == 0)) + ecore_timer_add(0.5, _deferred_noxrandr_error, NULL); + else + { + ecore_x_randr_screen_primary_output_current_size_get(man->root, &cfdata->orig_size.width, &cfdata->orig_size.height, NULL, NULL, &cfdata->orig_size_index); + cfdata->orig_rate = ecore_x_randr_screen_primary_output_current_refresh_rate_get(man->root); + + for (i = 0; i < (s - 1); i++) + { + Resolution * res; + Ecore_X_Randr_Refresh_Rate * rates; + int r = 0, j; + + res = E_NEW(Resolution, 1); + if (!res) continue; + + res->size.width = sizes[i].width; + res->size.height = sizes[i].height; + res->size_index = i; + rates = ecore_x_randr_screen_primary_output_refresh_rates_get(man->root, i, &r); + for (j = 0; j < r; j++) + { + Ecore_X_Randr_Refresh_Rate * rt; + + cfdata->has_rates = EINA_TRUE; + rt = E_NEW(Ecore_X_Randr_Refresh_Rate, 1); + if (!rt) continue; + *rt = rates[j]; + res->rates = eina_list_append(res->rates, rt); + } + if (rates) E_FREE(rates); + cfdata->resolutions = eina_list_append(cfdata->resolutions, res); + } + + cfdata->resolutions = eina_list_sort(cfdata->resolutions, + eina_list_count(cfdata->resolutions), _sort_resolutions); + cfdata->resolutions = eina_list_reverse(cfdata->resolutions); + + _load_resolutions(cfdata); + if (!cfdata->has_rates) + ecore_timer_add(0.5, _deferred_norates_error, NULL); + } + + E_FREE(sizes); + + _load_rates(cfdata); + */ + +# define RANDR_11 ((1 << 16) | 1) + static void _load_resolutions (E_Config_Dialog_Data *cfdata); static void _load_rates (E_Config_Dialog_Data *cfdata); static void _ilist_item_change (void *data); @@ -40,192 +473,6 @@ struct _SureBox E_Config_Dialog_Data *cfdata; }; -struct _E_Config_Dialog_Data -{ - E_Config_Dialog *cfd; - Eina_List *resolutions; - Ecore_X_Randr_Screen_Size orig_size; - int orig_size_index; - Ecore_X_Randr_Refresh_Rate orig_rate; - int orig_orientation; - int orig_flip; - int restore; - int can_rotate; - int can_flip; - int orientation; - int flip; - int flip_x; - int flip_y; - Eina_Bool has_rates; - - Evas_Object *rate_list; - Evas_Object *res_list; - SureBox *surebox; -}; - -static void -_surebox_dialog_cb_delete(E_Win *win) -{ - E_Dialog *dia; - SureBox *sb; - E_Config_Dialog *cfd; - - dia = win->data; - sb = dia->data; - sb->cfdata->surebox = NULL; - cfd = sb->cfdata->cfd; - if (sb->timer) ecore_timer_del(sb->timer); - sb->timer = NULL; - free(sb); - e_object_del(E_OBJECT(dia)); - e_object_unref(E_OBJECT(cfd)); -} - -static void -_surebox_dialog_cb_yes(void *data, E_Dialog *dia) -{ - SureBox *sb; - - sb = data; - - if (sb->cfdata->restore) - e_randr_11_store_configuration(E_RANDR_CONFIGURATION_STORE_ALL); - - _fill_data(sb->cfdata); - _load_resolutions(sb->cfdata); - /* No need to load rates as the currently selected resolution has not been - * changed since last selection. */ - if (dia) _surebox_dialog_cb_delete(dia->win); -} - -static void -_surebox_dialog_cb_no(void *data, E_Dialog *dia) -{ - SureBox *sb; - - sb = data; - ecore_x_randr_screen_primary_output_refresh_rate_set(sb->dia->win->container->manager->root, - sb->cfdata->orig_size_index, sb->cfdata->orig_rate); - _load_resolutions(sb->cfdata); - _load_rates(sb->cfdata); - _surebox_dialog_cb_delete(dia->win); -} - -static void -_surebox_text_fill(SureBox *sb) -{ - char buf[4096]; - - if (!sb->dia) return; - if (sb->iterations > 1) - { - if (sb->cfdata->has_rates) - snprintf(buf, sizeof(buf), - _("Does this look OK? Save if it does, or Restore if not.
" - "If you do not press a button, the old resolution of
" - "%dx%d at %d Hz will be restored in %d seconds."), - sb->cfdata->orig_size.width, sb->cfdata->orig_size.height, - sb->cfdata->orig_rate, sb->iterations); - else - snprintf(buf, sizeof(buf), - _("Does this look OK? Save if it does, or Restore if not.
" - "If you do not press a button, the old resolution of
" - "%dx%d will be restored in %d seconds."), - sb->cfdata->orig_size.width, sb->cfdata->orig_size.height, - sb->iterations); - } - else - { - if (sb->cfdata->has_rates) - snprintf(buf, sizeof(buf), - _("Does this look OK? Save if it does, or Restore if not.
" - "If you do not press a button, the old resolution of
" - "%dx%d at %d Hz will be restored IMMEDIATELY."), - sb->cfdata->orig_size.width, sb->cfdata->orig_size.height, - sb->cfdata->orig_rate); - else - snprintf(buf, sizeof(buf), - _("Does this look OK? Save if it does, or Restore if not.
" - "If you do not press a button, the old resolution of
" - "%dx%d will be restored IMMEDIATELY."), - sb->cfdata->orig_size.width, sb->cfdata->orig_size.height); - } - e_dialog_text_set(sb->dia, buf); -} - -static Eina_Bool -_surebox_timer_cb(void *data) -{ - SureBox *sb; - - sb = data; - sb->iterations--; - _surebox_text_fill(sb); - if (sb->iterations == 0) - { - _surebox_dialog_cb_no(sb, sb->dia); - return ECORE_CALLBACK_CANCEL; - } - return ECORE_CALLBACK_RENEW; -} - -static SureBox * -_surebox_new(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) -{ - SureBox *sb; - - sb = E_NEW(SureBox, 1); - sb->dia = e_dialog_new(cfd->con, "E", "_display_res_sure_dialog"); - sb->timer = ecore_timer_add(1.0, _surebox_timer_cb, sb); - sb->iterations = 15; - sb->cfd = cfd; - sb->cfdata = cfdata; - cfdata->surebox = sb; - sb->dia->data = sb; - e_dialog_title_set(sb->dia, _("Resolution change")); - e_dialog_icon_set(sb->dia, "preferences-system-screen-resolution", 48); - _surebox_text_fill(sb); - e_win_delete_callback_set(sb->dia->win, _surebox_dialog_cb_delete); - e_dialog_button_add(sb->dia, _("Save"), NULL, _surebox_dialog_cb_yes, sb); - e_dialog_button_add(sb->dia, _("Restore"), NULL, _surebox_dialog_cb_no, sb); - e_dialog_button_focus_num(sb->dia, 1); - e_win_centered_set(sb->dia->win, 1); - e_win_borderless_set(sb->dia->win, 1); - e_win_layer_set(sb->dia->win, 6); - e_win_sticky_set(sb->dia->win, 1); - e_dialog_show(sb->dia); - e_object_ref(E_OBJECT(cfd)); - return sb; -} - -E_Config_Dialog * -e_int_config_display(E_Container *con, const char *params __UNUSED__) -{ - E_Config_Dialog *cfd; - E_Config_Dialog_View *v; - - if (!ecore_x_randr_query()) - { - ecore_timer_add(0.5, _deferred_noxrandr_error, NULL); - fprintf(stderr, "XRandR not present on this display.\n"); - return NULL; - } - - if (e_config_dialog_find("E", "screen/screen_resolution")) return NULL; - v = E_NEW(E_Config_Dialog_View, 1); - v->create_cfdata = _create_data; - v->free_cfdata = _free_data; - v->basic.apply_cfdata = _basic_apply_data; - v->basic.create_widgets = _basic_create_widgets; - v->basic.check_changed = _basic_check_changed; - v->override_auto_apply = 1; - - cfd = e_config_dialog_new(con, _("Screen Resolution Settings"), - "E", "screen/screen_resolution", - "preferences-system-screen-resolution", 0, v, NULL); - return cfd; -} - static void _fill_data(E_Config_Dialog_Data *cfdata) { @@ -261,17 +508,6 @@ _fill_data(E_Config_Dialog_Data *cfdata) } } -static void * -_create_data(E_Config_Dialog *cfd) -{ - E_Config_Dialog_Data *cfdata; - - cfdata = E_NEW(E_Config_Dialog_Data, 1); - _fill_data(cfdata); - cfdata->cfd = cfd; - return cfdata; -} - static void _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) { @@ -370,127 +606,9 @@ _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) cfdata->orig_orientation = cfdata->orientation; cfdata->orig_flip = cfdata->flip; } - return 1; } -static Evas_Object * -_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata) -{ - Evas_Object *o, *of, *ob, *ot; - E_Radio_Group *rg; - E_Manager *man; - Ecore_X_Randr_Screen_Size_MM *sizes; - int i, s; - - o = e_widget_table_add(evas, 0); - - of = e_widget_framelist_add(evas, _("Resolution"), 0); - ob = e_widget_ilist_add(evas, 16, 16, NULL); - cfdata->res_list = ob; - e_widget_size_min_set(ob, 170, 215); - e_widget_framelist_object_append(of, ob); - e_widget_table_object_append(o, of, 0, 0, 1, 1, 1, 1, 1, 1); - - ob = e_widget_check_add(evas, _("Restore on login"), &cfdata->restore); - e_widget_table_object_append(o, ob, 0, 1, 2, 1, 1, 1, 0, 0); - - ot = e_widget_table_add(evas, 0); - of = e_widget_framelist_add(evas, _("Refresh"), 0); - ob = e_widget_ilist_add(evas, 16, 16, NULL); - cfdata->rate_list = ob; - e_widget_size_min_set(ob, 100, 80); - e_widget_framelist_object_append(of, ob); - e_widget_table_object_append(ot, of, 0, 0, 1, 1, 1, 1, 1, 1); - - man = e_manager_current_get(); - sizes = ecore_x_randr_screen_primary_output_sizes_get(man->root, &s); - cfdata->has_rates = EINA_FALSE; - - if ((!sizes) || (s == 0)) - ecore_timer_add(0.5, _deferred_noxrandr_error, NULL); - else - { - ecore_x_randr_screen_primary_output_current_size_get(man->root, &cfdata->orig_size.width, &cfdata->orig_size.height, NULL, NULL, &cfdata->orig_size_index); - cfdata->orig_rate = ecore_x_randr_screen_primary_output_current_refresh_rate_get(man->root); - - for (i = 0; i < (s - 1); i++) - { - Resolution * res; - Ecore_X_Randr_Refresh_Rate * rates; - int r = 0, j; - - res = E_NEW(Resolution, 1); - if (!res) continue; - - res->size.width = sizes[i].width; - res->size.height = sizes[i].height; - res->size_index = i; - rates = ecore_x_randr_screen_primary_output_refresh_rates_get(man->root, i, &r); - for (j = 0; j < r; j++) - { - Ecore_X_Randr_Refresh_Rate * rt; - - cfdata->has_rates = EINA_TRUE; - rt = E_NEW(Ecore_X_Randr_Refresh_Rate, 1); - if (!rt) continue; - *rt = rates[j]; - res->rates = eina_list_append(res->rates, rt); - } - if (rates) E_FREE(rates); - cfdata->resolutions = eina_list_append(cfdata->resolutions, res); - } - - cfdata->resolutions = eina_list_sort(cfdata->resolutions, - eina_list_count(cfdata->resolutions), _sort_resolutions); - cfdata->resolutions = eina_list_reverse(cfdata->resolutions); - - _load_resolutions(cfdata); - if (!cfdata->has_rates) - ecore_timer_add(0.5, _deferred_norates_error, NULL); - } - - E_FREE(sizes); - - _load_rates(cfdata); - - if (cfdata->can_rotate) - { - of = e_widget_framelist_add(evas, _("Rotation"), 0); - rg = e_widget_radio_group_new(&(cfdata->orientation)); - ob = e_widget_radio_icon_add(evas, NULL, "preferences-screen-normal", 24, 24, ECORE_X_RANDR_ORIENTATION_ROT_0, rg); - e_widget_framelist_object_append(of, ob); - if (!(cfdata->can_rotate & ECORE_X_RANDR_ORIENTATION_ROT_0)) e_widget_disabled_set(ob, 1); - ob = e_widget_radio_icon_add(evas, NULL, "preferences-screen-left", 24, 24, ECORE_X_RANDR_ORIENTATION_ROT_90, rg); - e_widget_framelist_object_append(of, ob); - if (!(cfdata->can_rotate & ECORE_X_RANDR_ORIENTATION_ROT_90)) e_widget_disabled_set(ob, 1); - ob = e_widget_radio_icon_add(evas, NULL, "preferences-screen-around", 24, 24, ECORE_X_RANDR_ORIENTATION_ROT_180, rg); - e_widget_framelist_object_append(of, ob); - if (!(cfdata->can_rotate & ECORE_X_RANDR_ORIENTATION_ROT_180)) e_widget_disabled_set(ob, 1); - ob = e_widget_radio_icon_add(evas, NULL, "preferences-screen-right", 24, 24, ECORE_X_RANDR_ORIENTATION_ROT_270, rg); - e_widget_framelist_object_append(of, ob); - if (!(cfdata->can_rotate & ECORE_X_RANDR_ORIENTATION_ROT_270)) e_widget_disabled_set(ob, 1); - e_widget_table_object_append(ot, of, 0, 1, 1, 1, 1, 0, 1, 0); - } - - if (cfdata->can_flip) - { - of = e_widget_framelist_add(evas, _("Mirroring"), 0); - ob = e_widget_check_icon_add(evas, NULL, "preferences-screen-hflip", 24, 24, &(cfdata->flip_x)); - e_widget_framelist_object_append(of, ob); - if (!(cfdata->can_flip & ECORE_X_RANDR_ORIENTATION_FLIP_X)) e_widget_disabled_set(ob, 1); - ob = e_widget_check_icon_add(evas, NULL, "preferences-screen-vflip", 24, 24, &(cfdata->flip_y)); - e_widget_framelist_object_append(of, ob); - if (!(cfdata->can_flip & ECORE_X_RANDR_ORIENTATION_FLIP_Y)) - e_widget_disabled_set(ob, 1); - e_widget_table_object_append(ot, of, 0, 2, 1, 1, 1, 0, 1, 0); - } - - e_widget_table_object_append(o, ot, 1, 0, 1, 1, 1, 1, 1, 1); - e_dialog_resizable_set(cfd->dia, 1); - return o; -} - static int _sort_resolutions(const void *d1, const void *d2) { @@ -642,3 +760,140 @@ _deferred_norates_error(void *data __UNUSED__) "the resolution, which may cause damage to your screen.")); return ECORE_CALLBACK_CANCEL; } + + +static void +_surebox_dialog_cb_delete(E_Win *win) +{ + E_Dialog *dia; + SureBox *sb; + E_Config_Dialog *cfd; + + dia = win->data; + sb = dia->data; + sb->cfdata->surebox = NULL; + cfd = sb->cfdata->cfd; + if (sb->timer) ecore_timer_del(sb->timer); + sb->timer = NULL; + free(sb); + e_object_del(E_OBJECT(dia)); + e_object_unref(E_OBJECT(cfd)); +} + +static void +_surebox_dialog_cb_yes(void *data, E_Dialog *dia) +{ + SureBox *sb; + + sb = data; + + if (sb->cfdata->restore) + e_randr_11_store_configuration(E_RANDR_CONFIGURATION_STORE_ALL); + + _fill_data(sb->cfdata); + _load_resolutions(sb->cfdata); + /* No need to load rates as the currently selected resolution has not been + * changed since last selection. */ + if (dia) _surebox_dialog_cb_delete(dia->win); +} + +static void +_surebox_dialog_cb_no(void *data, E_Dialog *dia) +{ + SureBox *sb; + + sb = data; + ecore_x_randr_screen_primary_output_refresh_rate_set(sb->dia->win->container->manager->root, + sb->cfdata->orig_size_index, sb->cfdata->orig_rate); + _load_resolutions(sb->cfdata); + _load_rates(sb->cfdata); + _surebox_dialog_cb_delete(dia->win); +} + +static void +_surebox_text_fill(SureBox *sb) +{ + char buf[4096]; + + if (!sb->dia) return; + if (sb->iterations > 1) + { + if (sb->cfdata->has_rates) + snprintf(buf, sizeof(buf), + _("Does this look OK? Save if it does, or Restore if not.
" + "If you do not press a button, the old resolution of
" + "%dx%d at %d Hz will be restored in %d seconds."), + sb->cfdata->orig_size.width, sb->cfdata->orig_size.height, + sb->cfdata->orig_rate, sb->iterations); + else + snprintf(buf, sizeof(buf), + _("Does this look OK? Save if it does, or Restore if not.
" + "If you do not press a button, the old resolution of
" + "%dx%d will be restored in %d seconds."), + sb->cfdata->orig_size.width, sb->cfdata->orig_size.height, + sb->iterations); + } + else + { + if (sb->cfdata->has_rates) + snprintf(buf, sizeof(buf), + _("Does this look OK? Save if it does, or Restore if not.
" + "If you do not press a button, the old resolution of
" + "%dx%d at %d Hz will be restored IMMEDIATELY."), + sb->cfdata->orig_size.width, sb->cfdata->orig_size.height, + sb->cfdata->orig_rate); + else + snprintf(buf, sizeof(buf), + _("Does this look OK? Save if it does, or Restore if not.
" + "If you do not press a button, the old resolution of
" + "%dx%d will be restored IMMEDIATELY."), + sb->cfdata->orig_size.width, sb->cfdata->orig_size.height); + } + e_dialog_text_set(sb->dia, buf); +} + +static Eina_Bool +_surebox_timer_cb(void *data) +{ + SureBox *sb; + + sb = data; + sb->iterations--; + _surebox_text_fill(sb); + if (sb->iterations == 0) + { + _surebox_dialog_cb_no(sb, sb->dia); + return ECORE_CALLBACK_CANCEL; + } + return ECORE_CALLBACK_RENEW; +} + +static SureBox * +_surebox_new(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata) +{ + SureBox *sb; + + sb = E_NEW(SureBox, 1); + sb->dia = e_dialog_new(cfd->con, "E", "_display_res_sure_dialog"); + sb->timer = ecore_timer_add(1.0, _surebox_timer_cb, sb); + sb->iterations = 15; + sb->cfd = cfd; + sb->cfdata = cfdata; + cfdata->surebox = sb; + sb->dia->data = sb; + e_dialog_title_set(sb->dia, _("Resolution change")); + e_dialog_icon_set(sb->dia, "preferences-system-screen-resolution", 48); + _surebox_text_fill(sb); + e_win_delete_callback_set(sb->dia->win, _surebox_dialog_cb_delete); + e_dialog_button_add(sb->dia, _("Save"), NULL, _surebox_dialog_cb_yes, sb); + e_dialog_button_add(sb->dia, _("Restore"), NULL, _surebox_dialog_cb_no, sb); + e_dialog_button_focus_num(sb->dia, 1); + e_win_centered_set(sb->dia->win, 1); + e_win_borderless_set(sb->dia->win, 1); + e_win_layer_set(sb->dia->win, 6); + e_win_sticky_set(sb->dia->win, 1); + e_dialog_show(sb->dia); + e_object_ref(E_OBJECT(cfd)); + return sb; +} +#endif diff --git a/src/modules/xkbswitch/Makefile.am b/src/modules/xkbswitch/Makefile.am new file mode 100644 index 000000000..a502a1af1 --- /dev/null +++ b/src/modules/xkbswitch/Makefile.am @@ -0,0 +1,34 @@ +MAINTAINERCLEANFILES = Makefile.in +MODULE = xkbswitch + +# data files for the module +filesdir = $(libdir)/enlightenment/modules/$(MODULE) +files_DATA = \ +e-module-$(MODULE).edj module.desktop + +EXTRA_DIST = $(files_DATA) + +# the module .so file +INCLUDES = -I. \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src/modules/$(MODULE) \ + -I$(top_srcdir)/src/bin \ + -I$(top_builddir)/src/bin \ + -I$(top_srcdir)/src/modules \ + @e_cflags@ +pkgdir = $(libdir)/enlightenment/modules/$(MODULE)/$(MODULE_ARCH) +pkg_LTLIBRARIES = module.la +module_la_SOURCES = e_mod_main.c \ + e_mod_main.h \ + e_mod_config.c \ + e_mod_parse.c \ + e_mod_parse.h \ + e_mod_keybindings.c \ + e_mod_keybindings.h + +module_la_LIBADD = @e_libs@ @dlopen_libs@ +module_la_LDFLAGS = -module -avoid-version +module_la_DEPENDENCIES = $(top_builddir)/config.h + +uninstall: + rm -rf $(DESTDIR)$(libdir)/enlightenment/modules/$(MODULE) diff --git a/src/modules/xkbswitch/e-module-xkbswitch.edj b/src/modules/xkbswitch/e-module-xkbswitch.edj new file mode 100644 index 0000000000000000000000000000000000000000..349383ccb3265a422f26907cc8b5169d400f84c6 GIT binary patch literal 9213 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 E51-%zcK`qY literal 0 HcmV?d00001 diff --git a/src/modules/xkbswitch/e_mod_config.c b/src/modules/xkbswitch/e_mod_config.c new file mode 100644 index 000000000..f613d4737 --- /dev/null +++ b/src/modules/xkbswitch/e_mod_config.c @@ -0,0 +1,768 @@ +#include "e.h" +#include "e_mod_main.h" +#include "e_mod_parse.h" + +/* Local prototypes */ + +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(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata); +static int _basic_apply(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata); + +static void _cb_add(void *data, void *data2 __UNUSED__); +static void _cb_del(void *data, void *data2 __UNUSED__); + +static void _cb_up(void *data, void *data2 __UNUSED__); +static void _cb_dn(void *data, void *data2 __UNUSED__); + +static void _dlg_add_cb_ok(void *data, E_Dialog *dlg); +static void _dlg_add_cb_cancel(void *data, E_Dialog *dlg); + +static E_Dialog *_dlg_add_new(E_Config_Dialog_Data *cfdata); + +static void _dlg_add_cb_del(void *obj); + +static Eina_Bool _cb_dlg_fill_delay(void *data); + +static void _cb_layout_select(void *data); +static void _cb_used_select (void *data); + +static Eina_Bool _cb_fill_delay(void *data); + +/* Externals */ + +E_Config_Dialog * +e_xkb_cfg_dialog(E_Container *con, const char *params __UNUSED__) +{ + E_Config_Dialog *cfd; + E_Config_Dialog_View *v; + + if (e_config_dialog_find("XKB Switcher", "keyboard_and_mouse/xkbswitch")) + return NULL; + if (!(v = E_NEW(E_Config_Dialog_View, 1))) return NULL; + + v->create_cfdata = _create_data; + v->free_cfdata = _free_data; + v->basic.create_widgets = _basic_create; + v->basic.apply_cfdata = _basic_apply; + + cfd = e_config_dialog_new(con, _("XKB Switcher Module"), "XKB Switcher", + "keyboard_and_mouse/xkbswitch", "preferences-desktop-locale", + 0, v, NULL); + + e_dialog_resizable_set(cfd->dia, 1); + e_xkb_cfg->cfd = cfd; + return cfd; +} + +/* Locals */ + +static void * +_create_data(E_Config_Dialog *cfd __UNUSED__) +{ + E_Config_Dialog_Data *cfdata; + Eina_List *l, *ll, *lll; + E_XKB_Config_Layout *cl, *nl; + E_XKB_Dialog_Option *od; + E_XKB_Option *op; + E_XKB_Option_Group *gr; + + parse_rules(); /* XXX: handle in case nothing was found? */ + + cfdata = E_NEW(E_Config_Dialog_Data, 1); + + cfdata->cfg_layouts = NULL; + EINA_LIST_FOREACH(e_xkb_cfg->used_layouts, l, cl) + { + nl = E_NEW(E_XKB_Config_Layout, 1); + nl->name = eina_stringshare_add(cl->name); + nl->model = eina_stringshare_add(cl->model); + nl->variant = eina_stringshare_add(cl->variant); + + cfdata->cfg_layouts = eina_list_append(cfdata->cfg_layouts, nl); + } + + /* Initialize options */ + + cfdata->only_label = e_xkb_cfg->only_label; + cfdata->cfg_options = NULL; + + lll = e_xkb_cfg->used_options; + EINA_LIST_FOREACH(optgroups, l, gr) + { + EINA_LIST_FOREACH(gr->options, ll, op) + { + od = E_NEW(E_XKB_Dialog_Option, 1); + od->name = eina_stringshare_add(op->name); + if (lll && + (od->name == ((E_XKB_Config_Option*)eina_list_data_get(lll))->name)) + { + od->enabled = 1; + lll = eina_list_next(lll); + } + else od->enabled = 0; + cfdata->cfg_options = eina_list_append(cfdata->cfg_options, od); + } + } + + return cfdata; +} + +static void +_free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) +{ + E_XKB_Config_Layout *cl; + E_XKB_Dialog_Option *od; + + e_xkb_cfg->cfd = NULL; + + EINA_LIST_FREE(cfdata->cfg_layouts, cl) + { + eina_stringshare_del(cl->name); + eina_stringshare_del(cl->model); + eina_stringshare_del(cl->variant); + E_FREE(cl); + } + + EINA_LIST_FREE(cfdata->cfg_options, od) + { + eina_stringshare_del(od->name); + E_FREE(od); + } + + eina_stringshare_del(cfdata->default_model); + E_FREE(cfdata); + clear_rules(); +} + +static int +_basic_apply(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata) +{ + Eina_List *l; + E_XKB_Config_Layout *cl, *nl; + E_XKB_Config_Option *oc; + E_XKB_Dialog_Option *od; + + EINA_LIST_FREE(e_xkb_cfg->used_layouts, cl) + { + eina_stringshare_del(cl->name); + eina_stringshare_del(cl->model); + eina_stringshare_del(cl->variant); + E_FREE(cl); + } + + EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl) + { + nl = E_NEW(E_XKB_Config_Layout, 1); + nl->name = eina_stringshare_add(cl->name); + nl->model = eina_stringshare_add(cl->model); + nl->variant = eina_stringshare_add(cl->variant); + + e_xkb_cfg->used_layouts = + eina_list_append(e_xkb_cfg->used_layouts, nl); + } + + if (e_xkb_cfg->default_model) + eina_stringshare_del(e_xkb_cfg->default_model); + + e_xkb_cfg->default_model = eina_stringshare_add(cfdata->default_model); + + /* Save options */ + e_xkb_cfg->only_label = cfdata->only_label; + + EINA_LIST_FREE(e_xkb_cfg->used_options, oc) + { + eina_stringshare_del(oc->name); + E_FREE(oc); + } + + EINA_LIST_FOREACH(cfdata->cfg_options, l, od) + { + if (!od->enabled) continue; + + oc = E_NEW(E_XKB_Config_Option, 1); + oc->name = eina_stringshare_add(od->name); + e_xkb_cfg->used_options = eina_list_append(e_xkb_cfg->used_options, oc); + } + + e_xkb_update_icon(); + e_xkb_update_layout(); + + e_config_save_queue(); + return 1; +} + +static Evas_Object * +_basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata) +{ + /* Holds the dialog contents, displays a toolbar on the top */ + Evas_Object *mainn = e_widget_toolbook_add(evas, 24, 24); + { + /* Holds the used layouts ilist and the button table */ + Evas_Object *layoutss = e_widget_list_add(evas, 0, 0); + { + /* Holds the used layouts */ + Evas_Object *configs = e_widget_ilist_add(evas, 32, 32, NULL); + { + e_widget_size_min_set(configs, 220, 160); + e_widget_ilist_go(configs); + + e_widget_list_object_append(layoutss, configs, 1, 1, 0.5); + cfdata->used_list = configs; + } + + /* Holds the buttons */ + Evas_Object *buttons = e_widget_table_add(evas, 1); + { + cfdata->btn_up = e_widget_button_add(evas, _("Up"), "go-up", _cb_up, cfdata, NULL); + { + e_widget_disabled_set(cfdata->btn_up, EINA_TRUE); + e_widget_table_object_append(buttons, cfdata->btn_up, 0, 0, 1, 1, 1, 1, 1, 0); + } + + cfdata->btn_down = e_widget_button_add(evas, _("Down"), "go-down", _cb_dn, cfdata, NULL); + { + e_widget_disabled_set(cfdata->btn_down, EINA_TRUE); + e_widget_table_object_append(buttons, cfdata->btn_down, 1, 0, 1, 1, 1, 1, 1, 0); + } + + cfdata->btn_add = e_widget_button_add(evas, _("Add"), "list-add", _cb_add, cfdata, NULL); + { + e_widget_table_object_append(buttons, cfdata->btn_add, 0, 1, 1, 1, 1, 1, 1, 0); + } + + cfdata->btn_del = e_widget_button_add(evas, _("Remove"), "list-remove", _cb_del, cfdata, NULL); + { + e_widget_disabled_set(cfdata->btn_del, EINA_TRUE); + e_widget_table_object_append(buttons, cfdata->btn_del, 1, 1, 1, 1, 1, 1, 1, 0); + } + + e_widget_list_object_append(layoutss, buttons, 1, 0, 1); + } + + e_widget_toolbook_page_append(mainn, NULL, _("Configurations"), layoutss, 1, 1, 1, 1, 0.5, 0.0); + } + + /* Holds the default models */ + Evas_Object *modelss = e_widget_ilist_add(evas, 32, 32, &cfdata->default_model); + { + e_widget_size_min_set(modelss, 220, 160); + cfdata->dmodel_list = modelss; + + e_widget_toolbook_page_append(mainn, NULL, _("Models"), modelss, 1, 1, 1, 1, 0.5, 0.0); + } + + /* Holds the options */ + Evas_Object *options = e_widget_list_add(evas, 0, 0); + { + E_XKB_Option *option; + E_XKB_Option_Group *group; + Eina_List *l, *ll, *lll; + Evas_Coord mw, mh; + + Evas_Object *general = e_widget_framelist_add(evas, _("General"), 0); + { + Evas_Object *only_label = e_widget_check_add(evas, _("Label only"), &(cfdata->only_label)); + { + e_widget_framelist_object_append(general, only_label); + } + e_widget_list_object_append(options, general, 1, 1, 0.0); + } + + lll = cfdata->cfg_options; + + EINA_LIST_FOREACH(optgroups, l, group) + { + Evas_Object *grp = e_widget_framelist_add(evas, group->description, 0); + + EINA_LIST_FOREACH(group->options, ll, option) + { + Evas_Object *chk = e_widget_check_add(evas, option->description, + &(((E_XKB_Dialog_Option*) + eina_list_data_get(lll))->enabled)); + e_widget_framelist_object_append(grp, chk); + lll = eina_list_next(lll); + } + e_widget_list_object_append(options, grp, 1, 1, 0.0); + } + + e_widget_size_min_get(options, &mw, &mh); + + if (mw < 220) mw = 220; + if (mh < 160) mh = 160; + + evas_object_resize(options, mw, mh); + + Evas_Object *scroller = e_widget_scrollframe_simple_add(evas, options); + e_widget_size_min_set(scroller, 220, 160); + + e_widget_toolbook_page_append(mainn, NULL, _("Options"), scroller, 1, 1, 1, 1, 0.5, 0.0); + } + + /* Display the first page by default */ + e_widget_toolbook_page_show(mainn, 0); + } + + /* The main evas */ + cfdata->evas = evas; + + /* Clear up any previous timer */ + if (cfdata->fill_delay) + ecore_timer_del(cfdata->fill_delay); + + /* Trigger the fill */ + cfdata->fill_delay = ecore_timer_add(0.2, _cb_fill_delay, cfdata); + + return mainn; +} + +static void +_cb_add(void *data, void *data2 __UNUSED__) +{ + E_Config_Dialog_Data *cfdata; + if (!(cfdata = data)) return; + + if (cfdata->dlg_add_new) e_win_raise(cfdata->dlg_add_new->win); + else cfdata->dlg_add_new = _dlg_add_new(cfdata); +} + +static void +_cb_del(void *data, void *data2 __UNUSED__) +{ + E_Config_Dialog_Data *cfdata; + int n = 0; + + if (!(cfdata = data)) return; + if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return; + + cfdata->cfg_layouts = eina_list_remove_list(cfdata->cfg_layouts, eina_list_nth_list(cfdata->cfg_layouts, n)); + + /* Update the list */ + evas_event_freeze(cfdata->evas); + edje_freeze(); + e_widget_ilist_freeze(cfdata->used_list); + e_widget_ilist_remove_num(cfdata->used_list, n); + e_widget_ilist_go(cfdata->used_list); + e_widget_ilist_thaw(cfdata->used_list); + edje_thaw(); + evas_event_thaw(cfdata->evas); +} + +static void +_cb_up(void *data, void *data2 __UNUSED__) +{ + E_Config_Dialog_Data *cfdata; + void *nddata; + Evas_Object *ic; + Eina_List *l; + const char *lbl; + int n; + + if (!(cfdata = data)) return; + if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return; + + l = eina_list_nth_list(cfdata->cfg_layouts, n); + + nddata = eina_list_data_get(eina_list_prev(l)); + eina_list_data_set(eina_list_prev(l), eina_list_data_get(l)); + eina_list_data_set(l, nddata); + + /* Update the list */ + + evas_event_freeze(cfdata->evas); + edje_freeze(); + e_widget_ilist_freeze(cfdata->used_list); + + ic = e_icon_add(cfdata->evas); + e_icon_file_set(ic, e_icon_file_get(e_widget_ilist_nth_icon_get(cfdata->used_list, n))); + lbl = e_widget_ilist_nth_label_get(cfdata->used_list, n); + e_widget_ilist_prepend_relative_full(cfdata->used_list, ic, NULL, lbl, _cb_used_select, cfdata, NULL, (n - 1)); + e_widget_ilist_remove_num(cfdata->used_list, n); + + e_widget_ilist_go(cfdata->used_list); + e_widget_ilist_thaw(cfdata->used_list); + edje_thaw(); + evas_event_thaw(cfdata->evas); + + e_widget_ilist_selected_set(cfdata->used_list, (n - 1)); +} + +static void +_cb_dn(void *data, void *data2 __UNUSED__) +{ + E_Config_Dialog_Data *cfdata; + void *nddata; + Evas_Object *ic; + Eina_List *l; + const char *lbl; + int n; + + if (!(cfdata = data)) return; + if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return; + + l = eina_list_nth_list(cfdata->cfg_layouts, n); + + nddata = eina_list_data_get(eina_list_next(l)); + eina_list_data_set(eina_list_next(l), eina_list_data_get(l)); + eina_list_data_set(l, nddata); + + /* Update the list */ + + evas_event_freeze(cfdata->evas); + edje_freeze(); + e_widget_ilist_freeze(cfdata->used_list); + + ic = e_icon_add(cfdata->evas); + e_icon_file_set(ic, e_icon_file_get(e_widget_ilist_nth_icon_get(cfdata->used_list, n))); + lbl = e_widget_ilist_nth_label_get(cfdata->used_list, n); + e_widget_ilist_append_relative_full(cfdata->used_list, ic, NULL, lbl, _cb_used_select, cfdata, NULL, n); + e_widget_ilist_remove_num(cfdata->used_list, n); + + e_widget_ilist_go(cfdata->used_list); + e_widget_ilist_thaw(cfdata->used_list); + edje_thaw(); + evas_event_thaw(cfdata->evas); + + e_widget_ilist_selected_set(cfdata->used_list, (n + 1)); +} + +static E_Dialog * +_dlg_add_new(E_Config_Dialog_Data *cfdata) +{ + E_Dialog *dlg; + Evas *evas; + Evas_Coord mw, mh; + + if (!(dlg = e_dialog_new(e_xkb_cfg->cfd->con, "E", "xkbswitch_config_add_dialog"))) return NULL; + + dlg->data = cfdata; + + e_object_del_attach_func_set(E_OBJECT(dlg), _dlg_add_cb_del); + e_win_centered_set(dlg->win, 1); + + evas = e_win_evas_get(dlg->win); + e_dialog_title_set(dlg, _("Add New Configuration")); + + /* The main toolbook, holds the lists and tabs */ + Evas_Object *mainn = e_widget_toolbook_add(evas, 24, 24); + { + /* Holds the available layouts */ + Evas_Object *available = e_widget_ilist_add(evas, 32, 32, NULL); + { + e_widget_size_min_set(available, 220, 160); + e_widget_ilist_go(available); + e_widget_toolbook_page_append(mainn, NULL, _("Available"), available, 1, 1, 1, 1, 0.5, 0.0); + cfdata->layout_list = available; + } + + /* Holds the available models */ + Evas_Object *modelss = e_widget_ilist_add(evas, 32, 32, NULL); + { + e_widget_toolbook_page_append(mainn, NULL, _("Model"), modelss, 1, 1, 1, 1, 0.5, 0.0); + cfdata->model_list = modelss; + } + + /* Holds the available variants */ + Evas_Object *variants = e_widget_ilist_add(evas, 32, 32, NULL); + { + e_widget_toolbook_page_append(mainn, NULL, _("Variant"), variants, 1, 1, 1, 1, 0.5, 0.0); + cfdata->variant_list = variants; + } + e_widget_toolbook_page_show(mainn, 0); + } + + e_widget_size_min_get(mainn, &mw, &mh); + e_dialog_content_set(dlg, mainn, mw, mh); + + cfdata->dlg_evas = evas; + + /* Clear up any previous timer */ + if (cfdata->dlg_fill_delay) ecore_timer_del(cfdata->dlg_fill_delay); + + /* Trigger the fill */ + cfdata->dlg_fill_delay = ecore_timer_add(0.2, _cb_dlg_fill_delay, cfdata); + + /* Some buttons */ + e_dialog_button_add(dlg, _("OK"), NULL, _dlg_add_cb_ok, cfdata); + e_dialog_button_add(dlg, _("Cancel"), NULL, _dlg_add_cb_cancel, cfdata); + + e_dialog_button_disable_num_set(dlg, 0, 1); + e_dialog_button_disable_num_set(dlg, 1, 0); + + e_dialog_resizable_set(dlg, 1); + e_dialog_show(dlg); + + return dlg; +} + +static void +_dlg_add_cb_ok(void *data __UNUSED__, E_Dialog *dlg) +{ + E_Config_Dialog_Data *cfdata = dlg->data; + E_XKB_Config_Layout *cl; + char buf[PATH_MAX]; + /* Configuration information */ + const char *layout = e_widget_ilist_selected_value_get(cfdata->layout_list); + const char *model = e_widget_ilist_selected_value_get(cfdata->model_list); + const char *variant = e_widget_ilist_selected_value_get(cfdata->variant_list); + + /* The new configuration */ + cl = E_NEW(E_XKB_Config_Layout, 1); + cl->name = eina_stringshare_add(layout); + cl->model = eina_stringshare_add(model); + cl->variant = eina_stringshare_add(variant); + + cfdata->cfg_layouts = eina_list_append(cfdata->cfg_layouts, cl); + + /* Update the main list */ + evas_event_freeze(cfdata->evas); + edje_freeze(); + e_widget_ilist_freeze(cfdata->used_list); + + { + Evas_Object *ic = e_icon_add(cfdata->evas); + { + const char *name = cl->name; + + if (strchr(name, '/')) name = strchr(name, '/') + 1; + snprintf(buf, sizeof(buf), "%s/data/flags/%s_flag.png", + e_prefix_data_get(), name); + + if (!ecore_file_exists(buf)) + snprintf(buf, sizeof(buf), "%s/data/flags/unknown_flag.png", + e_prefix_data_get()); + e_icon_file_set(ic, buf); + } + + snprintf(buf, sizeof(buf), "%s (%s, %s)", cl->name, cl->model, cl->variant); + + e_widget_ilist_append_full(cfdata->used_list, ic, NULL, buf, _cb_used_select, cfdata, NULL); + } + + e_widget_ilist_go (cfdata->used_list); + e_widget_ilist_thaw(cfdata->used_list); + edje_thaw(); + evas_event_thaw(cfdata->evas); + + cfdata->dlg_add_new = NULL; + e_object_unref(E_OBJECT(dlg)); +} + +static void +_dlg_add_cb_cancel(void *data __UNUSED__, E_Dialog *dlg) +{ + E_Config_Dialog_Data *cfdata = dlg->data; + cfdata->dlg_add_new = NULL; + e_object_unref(E_OBJECT(dlg)); +} + +static void +_dlg_add_cb_del(void *obj) +{ + E_Dialog *dlg = obj; + E_Config_Dialog_Data *cfdata = dlg->data; + cfdata->dlg_add_new = NULL; + e_object_unref(E_OBJECT(dlg)); +} + +static Eina_Bool +_cb_dlg_fill_delay(void *data) +{ + E_Config_Dialog_Data *cfdata; + Eina_List *l; + E_XKB_Layout *layout; + char buf[PATH_MAX]; + + if (!(cfdata = data)) return ECORE_CALLBACK_RENEW; + + /* Update the list of available layouts */ + evas_event_freeze(cfdata->dlg_evas); + edje_freeze(); + + e_widget_ilist_freeze(cfdata->layout_list); + e_widget_ilist_clear (cfdata->layout_list); + + EINA_LIST_FOREACH(layouts, l, layout) + { + Evas_Object *ic = e_icon_add(cfdata->dlg_evas); + { + const char *name = layout->name; + + if (strchr(name, '/')) name = strchr(name, '/') + 1; + snprintf(buf, sizeof(buf), "%s/data/flags/%s_flag.png", + e_prefix_data_get(), name); + if (!ecore_file_exists(buf)) + snprintf(buf, sizeof(buf), "%s/data/flags/unknown_flag.png", + e_prefix_data_get()); + e_icon_file_set(ic, buf); + } + + snprintf(buf, sizeof(buf), "%s (%s)", layout->description, layout->name); + + e_widget_ilist_append_full(cfdata->layout_list, ic, NULL, buf, _cb_layout_select, cfdata, layout->name); + } + + e_widget_ilist_go (cfdata->layout_list); + e_widget_ilist_thaw(cfdata->layout_list); + + edje_thaw(); + evas_event_thaw(cfdata->dlg_evas); + + cfdata->dlg_fill_delay = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void +_cb_layout_select(void *data) +{ + E_Config_Dialog_Data *cfdata; + E_XKB_Variant *variant; + E_XKB_Layout *layout; + E_XKB_Model *model; + Eina_List *l; + const char *label; + int n; + char buf[PATH_MAX]; + + if (!(cfdata = data)) return; + + /* Find the right layout */ + + if ((n = e_widget_ilist_selected_get(cfdata->layout_list)) < 0) + return; + if (!(label = e_widget_ilist_nth_label_get(cfdata->layout_list, n))) + return; + + if (!(layout = eina_list_search_unsorted + (layouts, layout_sort_by_name_cb, + e_widget_ilist_nth_value_get(cfdata->layout_list, n) + ))) return; + + /* Update the lists */ + evas_event_freeze(cfdata->dlg_evas); + edje_freeze(); + + /* Models */ + e_widget_ilist_freeze(cfdata->model_list); + e_widget_ilist_clear(cfdata->model_list); + + EINA_LIST_FOREACH(models, l, model) + { + snprintf(buf, sizeof(buf), "%s (%s)", model->description, model->name); + e_widget_ilist_append(cfdata->model_list, NULL, buf, NULL, cfdata, model->name); + } + + e_widget_ilist_go(cfdata->model_list); + e_widget_ilist_thaw(cfdata->model_list); + + /* Variants */ + e_widget_ilist_freeze(cfdata->variant_list); + e_widget_ilist_clear(cfdata->variant_list); + + EINA_LIST_FOREACH(layout->variants, l, variant) + { + snprintf(buf, sizeof(buf), "%s (%s)", variant->name, variant->description); + e_widget_ilist_append(cfdata->variant_list, NULL, buf, NULL, cfdata, variant->name); + } + + e_widget_ilist_go(cfdata->variant_list); + e_widget_ilist_thaw(cfdata->variant_list); + + edje_thaw(); + evas_event_thaw(cfdata->dlg_evas); + + e_widget_ilist_selected_set(cfdata->model_list, 0); + e_widget_ilist_selected_set(cfdata->variant_list, 0); + + e_dialog_button_disable_num_set(cfdata->dlg_add_new, 0, 0); +} + +static Eina_Bool +_cb_fill_delay(void *data) +{ + E_Config_Dialog_Data *cfdata; + Eina_List *l; + E_XKB_Config_Layout *cl; + E_XKB_Model *model; + int n = 0; + char buf[PATH_MAX]; + + if (!(cfdata = data)) return ECORE_CALLBACK_RENEW; + + /* Update the list of used layouts */ + evas_event_freeze(cfdata->evas); + edje_freeze(); + + e_widget_ilist_freeze(cfdata->used_list); + e_widget_ilist_clear(cfdata->used_list); + + EINA_LIST_FOREACH(cfdata->cfg_layouts, l, cl) + { + Evas_Object *ic = e_icon_add(cfdata->evas); + const char *name = cl->name; + + if (strchr(name, '/')) name = strchr(name, '/') + 1; + snprintf(buf, sizeof(buf), "%s/data/flags/%s_flag.png", + e_prefix_data_get(), name); + if (!ecore_file_exists(buf)) + snprintf(buf, sizeof(buf), "%s/flags/unknown_flag.png", + e_prefix_data_get()); + e_icon_file_set(ic, buf); + + snprintf(buf, sizeof(buf), "%s (%s, %s)", cl->name, cl->model, cl->variant); + e_widget_ilist_append_full(cfdata->used_list, ic, NULL, buf, _cb_used_select, cfdata, NULL); + } + + e_widget_ilist_go(cfdata->used_list); + e_widget_ilist_thaw(cfdata->used_list); + + e_widget_ilist_freeze(cfdata->dmodel_list); + e_widget_ilist_clear(cfdata->dmodel_list); + + /* Update the global model list */ + EINA_LIST_FOREACH(models, l, model) + { + snprintf(buf, sizeof(buf), "%s (%s)", model->description, model->name); + e_widget_ilist_append(cfdata->dmodel_list, NULL, buf, NULL, cfdata, model->name); + if (model->name == e_xkb_cfg->default_model) + e_widget_ilist_selected_set(cfdata->dmodel_list, n); + n++; + } + + e_widget_ilist_go(cfdata->dmodel_list); + e_widget_ilist_thaw(cfdata->dmodel_list); + edje_thaw(); + evas_event_thaw(cfdata->evas); + + cfdata->fill_delay = NULL; + return ECORE_CALLBACK_CANCEL; +} + +static void +_cb_used_select(void *data) +{ + E_Config_Dialog_Data *cfdata; + int n, c; + + if (!(cfdata = data)) return; + if ((n = e_widget_ilist_selected_get(cfdata->used_list)) < 0) return; + + c = e_widget_ilist_count(cfdata->used_list); + e_widget_disabled_set(cfdata->btn_del, EINA_FALSE); + + if (n == (c - 1)) + { + e_widget_disabled_set(cfdata->btn_up, EINA_FALSE); + e_widget_disabled_set(cfdata->btn_down, EINA_TRUE ); + } + else if (n == 0) + { + e_widget_disabled_set(cfdata->btn_up, EINA_TRUE ); + e_widget_disabled_set(cfdata->btn_down, EINA_FALSE); + } + else + { + e_widget_disabled_set(cfdata->btn_up, EINA_FALSE); + e_widget_disabled_set(cfdata->btn_down, EINA_FALSE); + } +} diff --git a/src/modules/xkbswitch/e_mod_keybindings.c b/src/modules/xkbswitch/e_mod_keybindings.c new file mode 100644 index 000000000..10206a246 --- /dev/null +++ b/src/modules/xkbswitch/e_mod_keybindings.c @@ -0,0 +1,194 @@ +#include "e.h" +#include "e_mod_main.h" +#include "e_mod_keybindings.h" + +#define E_XKB_ACTION_GROUP _("Keyboard Layouts") +#define E_XKB_ACTION_NEXT _("Switch to the next layout") +#define E_XKB_ACTION_PREV _("Switch to the previous layout") + +#define ACT_FN_GO(act) \ + static void _e_actions_act_##act##_go(E_Object *obj, const char *params) + +#define ACT_GO(name) \ +{ \ + act = e_action_add(#name); \ + if (act) act->func.go = _e_actions_act_##name##_go; \ +} + +ACT_FN_GO(e_xkb_layout_next); +ACT_FN_GO(e_xkb_layout_prev); + +static void _e_xkb_register_module_keybinding(E_Config_Binding_Key *key, const char *action); +static void _e_xkb_unregister_module_keybinding(E_Config_Binding_Key *key, int save); + +int +e_xkb_register_module_actions(void) +{ + E_Action *act; + + e_action_predef_name_set(E_XKB_ACTION_GROUP, E_XKB_ACTION_NEXT, E_XKB_NEXT_ACTION, + NULL, NULL, 0); + e_action_predef_name_set(E_XKB_ACTION_GROUP, E_XKB_ACTION_PREV, E_XKB_PREV_ACTION, + NULL, NULL, 0); + + ACT_GO(e_xkb_layout_next); + ACT_GO(e_xkb_layout_prev); + + return 1; +} + +int +e_xkb_unregister_module_actions(void) +{ + e_action_del(E_XKB_NEXT_ACTION); + e_action_del(E_XKB_PREV_ACTION); + + e_action_predef_name_del(E_XKB_ACTION_GROUP, E_XKB_ACTION_NEXT); + e_action_predef_name_del(E_XKB_ACTION_GROUP, E_XKB_ACTION_PREV); + + return 1; +} + +// XXX: i dont think module should register bindings imho. leave that up to +// standard profiles? +int +e_xkb_register_module_keybindings(void) +{ + e_managers_keys_ungrab(); + + _e_xkb_register_module_keybinding(&(e_xkb_cfg->layout_next_key), E_XKB_NEXT_ACTION); + _e_xkb_register_module_keybinding(&(e_xkb_cfg->layout_prev_key), E_XKB_PREV_ACTION); + + e_managers_keys_grab(); + + return 1; +} + +int +e_xkb_unregister_module_keybindings(void) +{ + e_managers_keys_ungrab(); + + _e_xkb_unregister_module_keybinding(&(e_xkb_cfg->layout_next_key), 1); + _e_xkb_unregister_module_keybinding(&(e_xkb_cfg->layout_prev_key), 1); + + e_managers_keys_grab(); + + return 1; +} + +static void +_e_xkb_unregister_module_keybinding(E_Config_Binding_Key *key, int save) +{ + E_Config_Binding_Key *eb; + Eina_List *l; + Eina_Bool done = EINA_FALSE; + Eina_Bool found = EINA_FALSE; + + if (!key) return; + + while (!done) + { + done = EINA_TRUE; + + EINA_LIST_FOREACH(e_config->key_bindings, l, eb) + { + if (eb && eb->action && eb->action[0] && + (!strcmp(!eb->action ? "" : eb->action, + !key->action ? "" : key->action))) + { + if (save) + { + eina_stringshare_del(key->key); + eina_stringshare_del(key->params); + + key->context = eb->context; + key->key = eina_stringshare_add(eb->key); + key->modifiers = eb->modifiers; + key->any_mod = eb->any_mod; + key->params = (!eb->params ? NULL : eina_stringshare_add(eb->params)); + } + + e_bindings_key_del(eb->context, eb->key, eb->modifiers, eb->any_mod, eb->action, eb->params); + + eina_stringshare_del(eb->key); + eina_stringshare_del(eb->action); + eina_stringshare_del(eb->params); + + E_FREE(eb); + + e_config->key_bindings = eina_list_remove_list(e_config->key_bindings, l); + + found = EINA_TRUE; + done = EINA_FALSE; + + break; + } + } + } + + if (!found) + { + eina_stringshare_del(key->key); + eina_stringshare_del(key->params); + + key->key = NULL; + key->context = E_BINDING_CONTEXT_ANY; + key->modifiers = E_BINDING_MODIFIER_NONE; + key->any_mod = 0; + } +} + +static void +_e_xkb_register_module_keybinding(E_Config_Binding_Key *key, const char *action) +{ + E_Config_Binding_Key *eb; + E_Config_Binding_Key *t; + Eina_List *l; + Eina_Bool found = EINA_FALSE; + + if (!key || !key->key || !key->key[0] || !action) return; + + eb = E_NEW(E_Config_Binding_Key, 1); + + eb->context = key->context; + eb->key = eina_stringshare_add(key->key); + eb->modifiers = key->modifiers; + eb->any_mod = key->any_mod; + eb->action = (!action ? NULL : eina_stringshare_add(action)); + eb->params = (!key->params ? NULL : eina_stringshare_add(key->params)); + + EINA_LIST_FOREACH(e_config->key_bindings, l, t) + { + if (found) break; + if (!strcmp(!t->action ? "" : t->action, eb->action) && !strcmp(!t->params ? "" : t->params, !eb->params ? "" : eb->params)) found = EINA_TRUE; + } + + if (!found) + { + e_config->key_bindings = eina_list_append(e_config->key_bindings, eb); + e_bindings_key_add(key->context, key->key, key->modifiers, + key->any_mod, action, key->params); + } + else + { + eina_stringshare_del(eb->key); + eina_stringshare_del(eb->action); + eina_stringshare_del(eb->params); + E_FREE(eb); + } +} + +ACT_FN_GO(e_xkb_layout_next) +{ + e_xkb_layout_next(); + return; + obj = 0; params = 0; +} + +ACT_FN_GO(e_xkb_layout_prev) +{ + e_xkb_layout_prev(); + return; + obj = 0; params = 0; +} diff --git a/src/modules/xkbswitch/e_mod_keybindings.h b/src/modules/xkbswitch/e_mod_keybindings.h new file mode 100644 index 000000000..de86164ce --- /dev/null +++ b/src/modules/xkbswitch/e_mod_keybindings.h @@ -0,0 +1,16 @@ +#ifdef E_TYPEDEFS +#else +#ifndef E_MOD_KEYBIND_H +#define E_MOD_KEYBIND_H + +#define E_XKB_NEXT_ACTION "e_xkb_layout_next" +#define E_XKB_PREV_ACTION "e_xkb_layout_prev" + +int e_xkb_register_module_actions(void); +int e_xkb_unregister_module_actions(void); + +int e_xkb_register_module_keybindings(void); +int e_xkb_unregister_module_keybindings(void); + +#endif +#endif diff --git a/src/modules/xkbswitch/e_mod_main.c b/src/modules/xkbswitch/e_mod_main.c new file mode 100644 index 000000000..29b83b4da --- /dev/null +++ b/src/modules/xkbswitch/e_mod_main.c @@ -0,0 +1,770 @@ +#include "e.h" +#include "e_mod_main.h" +#include "e_mod_parse.h" +#include "e_mod_keybindings.h" + +/* Static functions + * The static functions specific to the current code unit. + */ + +/* 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, E_Gadcon_Orient orient); + +static const char *_gc_label (E_Gadcon_Client_Class *client_class); +static const char *_gc_id_new(E_Gadcon_Client_Class *client_class __UNUSED__); + +static Evas_Object *_gc_icon(E_Gadcon_Client_Class *client_class, Evas *evas); + +/* CONFIG */ + +static void _e_xkb_cfg_new (void); +static void _e_xkb_cfg_free(void); + +static Eina_Bool _e_xkb_cfg_timer(void *data); + +/* EVENTS */ + +static void _e_xkb_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event); + +static void _e_xkb_cb_menu_post(void *data, E_Menu *menu __UNUSED__); +static void _e_xkb_cb_menu_configure(void *data, E_Menu *mn, E_Menu_Item *mi __UNUSED__); + +static void _e_xkb_cb_lmenu_post(void *data, E_Menu *menu __UNUSED__); +static void _e_xkb_cb_lmenu_set(void *data, E_Menu *mn __UNUSED__, E_Menu_Item *mi __UNUSED__); + +/* Static variables + * The static variables specific to the current code unit. + */ + +/* GADGET INSTANCE */ + +typedef struct _Instance +{ + E_Gadcon_Client *gcc; + + Evas_Object *o_xkbswitch; + Evas_Object *o_xkbflag; + + E_Menu *menu; + E_Menu *lmenu; +} Instance; + +/* LIST OF INSTANCES */ +static Eina_List *instances = NULL; + +/* EET STRUCTURES */ + +static E_Config_DD *e_xkb_cfg_edd = NULL; +static E_Config_DD *e_xkb_cfg_layout_edd = NULL; +static E_Config_DD *e_xkb_cfg_option_edd = NULL; + +/* Global variables + * Global variables shared across the module. + */ + +/* CONFIG STRUCTURE */ +E_XKB_Config *e_xkb_cfg = NULL; + +static const E_Gadcon_Client_Class _gc_class = +{ + GADCON_CLIENT_CLASS_VERSION, + "xkbswitch", + { + _gc_init, _gc_shutdown, _gc_orient, _gc_label, _gc_icon, _gc_id_new, NULL, NULL + }, + E_GADCON_CLIENT_STYLE_PLAIN +}; + +EAPI E_Module_Api e_modapi = +{ + E_MODULE_API_VERSION, + "XKB Switcher" +}; + +/* Module initializer + * Initializes the configuration file, checks its versions, populates + * menus, finds the rules file, initializes gadget icon. + */ +EAPI void * +e_modapi_init(E_Module *m) +{ + /* Menus and dialogs */ + e_configure_registry_category_add("keyboard_and_mouse", 80, _("Input"), + NULL, "preferences-behavior"); + e_configure_registry_item_add("keyboard_and_mouse/xkbswitch", 110, + _("XKB Switcher"), NULL, + "preferences-desktop-locale", + e_xkb_cfg_dialog); + e_xkb_cfg_layout_edd = E_CONFIG_DD_NEW("E_XKB_Config_Layout", E_XKB_Config_Layout); +#undef T +#undef D +#define T E_XKB_Config_Layout +#define D e_xkb_cfg_layout_edd + E_CONFIG_VAL(D, T, name, STR); + E_CONFIG_VAL(D, T, model, STR); + E_CONFIG_VAL(D, T, variant, STR); + + e_xkb_cfg_option_edd = E_CONFIG_DD_NEW("E_XKB_Config_Option", E_XKB_Config_Option); +#undef T +#undef D +#define T E_XKB_Config_Option +#define D e_xkb_cfg_option_edd + E_CONFIG_VAL(D, T, name, STR); + + e_xkb_cfg_edd = E_CONFIG_DD_NEW("e_xkb_cfg", E_XKB_Config); +#undef T +#undef D +#define T E_XKB_Config +#define D e_xkb_cfg_edd + E_CONFIG_LIST(D, T, used_layouts, e_xkb_cfg_layout_edd); + E_CONFIG_LIST(D, T, used_options, e_xkb_cfg_option_edd); + E_CONFIG_VAL(D, T, layout_next_key.context, INT); + E_CONFIG_VAL(D, T, layout_next_key.modifiers, INT); + E_CONFIG_VAL(D, T, layout_next_key.key, STR); + E_CONFIG_VAL(D, T, layout_next_key.action, STR); + E_CONFIG_VAL(D, T, layout_next_key.params, STR); + E_CONFIG_VAL(D, T, layout_next_key.any_mod, UCHAR); + E_CONFIG_VAL(D, T, layout_prev_key.context, INT); + E_CONFIG_VAL(D, T, layout_prev_key.modifiers, INT); + E_CONFIG_VAL(D, T, layout_prev_key.key, STR); + E_CONFIG_VAL(D, T, layout_prev_key.action, STR); + E_CONFIG_VAL(D, T, layout_prev_key.params, STR); + E_CONFIG_VAL(D, T, layout_prev_key.any_mod, UCHAR); + E_CONFIG_VAL(D, T, default_model, STR); + E_CONFIG_VAL(D, T, only_label, INT); + E_CONFIG_VAL(D, T, version, INT); + + /* Version check */ + e_xkb_cfg = e_config_domain_load("module.xkbswitch", e_xkb_cfg_edd); + if (e_xkb_cfg) + { + /* Check config version */ + if ((e_xkb_cfg->version >> 16) < MOD_CONFIG_FILE_EPOCH) + { + /* config too old */ + _e_xkb_cfg_free(); + ecore_timer_add(1.0, _e_xkb_cfg_timer, + _("XKB Switcher Module Configuration data needed " + "upgrading. Your old configuration
has been" + " wiped and a new set of defaults initialized. " + "This
will happen regularly during " + "development, so don't report a
bug. " + "This simply means the module needs " + "new configuration
data by default for " + "usable functionality that your old
" + "configuration simply lacks. This new set of " + "defaults will fix
that by adding it in. " + "You can re-configure things now to your
" + "liking. Sorry for the inconvenience.
")); + } + /* Ardvarks */ + else if (e_xkb_cfg->version > MOD_CONFIG_FILE_VERSION) + { + /* config too new...wtf ? */ + _e_xkb_cfg_free(); + ecore_timer_add(1.0, _e_xkb_cfg_timer, + _("Your XKB Switcher Module configuration is NEWER " + "than the module version. This is " + "very
strange. This should not happen unless" + " you downgraded
the module or " + "copied the configuration from a place where" + "
a newer version of the module " + "was running. This is bad and
as a " + "precaution your configuration has been now " + "restored to
defaults. Sorry for the " + "inconvenience.
")); + } + } + + if (!e_xkb_cfg) _e_xkb_cfg_new(); + e_xkb_cfg->module = m; + /* Rules */ + find_rules(); + /* Update the layout - can't update icon, gadgets are not there yet */ + e_xkb_update_layout(); + /* Gadcon */ + e_gadcon_provider_register(&_gc_class); + /* Bindings */ + e_xkb_register_module_actions(); + e_xkb_register_module_keybindings(); + + return m; +} + +/* Module shutdown + * Called when the module gets unloaded. Deregisters the menu state + * and frees up the config. + */ +EAPI int +e_modapi_shutdown(E_Module *m __UNUSED__) +{ + E_XKB_Config_Layout *cl; + E_XKB_Config_Option *op; + + e_configure_registry_item_del("keyboard_and_mouse/xkbswitch"); + e_configure_registry_category_del("keyboard_and_mouse"); + + if (e_xkb_cfg->cfd) e_object_del(E_OBJECT(e_xkb_cfg->cfd)); + + e_xkb_cfg->cfd = NULL; + e_xkb_cfg->module = NULL; + + e_gadcon_provider_unregister(&_gc_class); + + e_xkb_unregister_module_actions(); + e_xkb_unregister_module_keybindings(); + + EINA_LIST_FREE(e_xkb_cfg->used_layouts, cl) + { + eina_stringshare_del(cl->name); + eina_stringshare_del(cl->model); + eina_stringshare_del(cl->variant); + + E_FREE(cl); + } + + EINA_LIST_FREE(e_xkb_cfg->used_options, op) + { + eina_stringshare_del(op->name); + E_FREE(op); + } + + if (e_xkb_cfg->default_model) + eina_stringshare_del(e_xkb_cfg->default_model); + + E_FREE(e_xkb_cfg); + + E_CONFIG_DD_FREE(e_xkb_cfg_layout_edd); + E_CONFIG_DD_FREE(e_xkb_cfg_option_edd); + E_CONFIG_DD_FREE(e_xkb_cfg_edd); + + clear_rules(); + + return 1; +} + +/* Module state save + * Used to save the configuration file. + */ +EAPI int +e_modapi_save(E_Module *m __UNUSED__) +{ + e_config_domain_save("module.xkbswitch", e_xkb_cfg_edd, e_xkb_cfg); + return 1; +} + +/* Updates icons on all available xkbswitch gadgets to reflect the + * current layout state. + */ +void +e_xkb_update_icon(void) +{ + Instance *inst; + Eina_List *l; + + if (!e_xkb_cfg->used_layouts) return; + const char *name = ((E_XKB_Config_Layout*)eina_list_data_get(e_xkb_cfg->used_layouts))->name; + + if ((name) && (strchr(name, '/'))) name = strchr(name, '/') + 1; + + if (e_xkb_cfg->only_label) + { + EINA_LIST_FOREACH(instances, l, inst) + { + if (inst->o_xkbflag) + { + evas_object_del(inst->o_xkbflag); + inst->o_xkbflag = NULL; + } + + e_theme_edje_object_set(inst->o_xkbswitch, + "base/theme/modules/xkbswitch", + "modules/xkbswitch/noflag"); + edje_object_part_text_set(inst->o_xkbswitch, "label", name); + } + } + else + { + char buf[PATH_MAX]; + + snprintf(buf, sizeof(buf), "%s/data/flags/%s_flag.png", + e_prefix_data_get(), name); + + EINA_LIST_FOREACH(instances, l, inst) + { + if (!inst->o_xkbflag) + { + inst->o_xkbflag = e_icon_add(inst->gcc->gadcon->evas); + e_icon_file_set(inst->o_xkbflag, buf); + edje_object_part_swallow(inst->o_xkbswitch, "flag", + inst->o_xkbflag); + } + else + e_icon_file_set(inst->o_xkbflag, buf); + edje_object_part_text_set(inst->o_xkbswitch, "label", name); + } + } +} + +void +e_xkb_update_layout(void) +{ + E_XKB_Config_Layout *cl; + E_XKB_Config_Option *op; + Eina_List *l; + char buf[PATH_MAX]; + + if (!e_xkb_cfg->used_layouts) return; + + /* We put an empty -option here in order to override all previously + * set options. + */ + + // XXX: this is unsafe. doesn't keep into account size of buf + snprintf(buf, sizeof(buf), "setxkbmap "); + EINA_LIST_FOREACH(e_xkb_cfg->used_layouts, l, cl) + { + strcat(buf, cl->name); + break; + if (l->next) strcat(buf, ","); + } + + strcat(buf, " -variant "); + EINA_LIST_FOREACH(e_xkb_cfg->used_layouts, l, cl) + { + strcat(buf, cl->variant); + strcat(buf, ","); + break; + } + + strcat(buf, " -model "); + cl = eina_list_data_get(e_xkb_cfg->used_layouts); + + if (strcmp(cl->model, "default")) + strcat(buf, cl->model); + else if (strcmp(e_xkb_cfg->default_model, "default")) + strcat(buf, e_xkb_cfg->default_model); + else + strcat(buf, "default"); + + EINA_LIST_FOREACH(e_xkb_cfg->used_options, l, op) + { + strcat(buf, " -option "); + strcat(buf, op->name); + break; + } + printf("RUN: '%s'\n", buf); + ecore_exe_run(buf, NULL); +} + +void +e_xkb_layout_next(void) +{ + void *odata, *ndata; + Eina_List *l; + + odata = eina_list_data_get(e_xkb_cfg->used_layouts); + + EINA_LIST_FOREACH(eina_list_next(e_xkb_cfg->used_layouts), l, ndata) + { + eina_list_data_set(eina_list_prev(l), ndata); + } + + eina_list_data_set(eina_list_last(e_xkb_cfg->used_layouts), odata); + e_xkb_update_icon(); + e_xkb_update_layout(); +} + +void +e_xkb_layout_prev(void) +{ + void *odata, *ndata; + Eina_List *l; + + odata = eina_list_data_get(eina_list_last(e_xkb_cfg->used_layouts)); + + for (l = e_xkb_cfg->used_layouts, ndata = eina_list_data_get(l); + l; l = eina_list_next(l)) + { + if (eina_list_next(l)) + ndata = eina_list_data_set(eina_list_next(l), ndata); + } + + eina_list_data_set(e_xkb_cfg->used_layouts, odata); + e_xkb_update_icon(); + e_xkb_update_layout(); +} + +/* LOCAL STATIC FUNCTIONS */ + +static E_Gadcon_Client * +_gc_init(E_Gadcon *gc, const char *gcname, const char *id, const char *style) +{ + Instance *inst; + const char *name; + + char buf[PATH_MAX]; + + if (e_xkb_cfg->used_layouts) + name = ((E_XKB_Config_Layout*)eina_list_data_get(e_xkb_cfg->used_layouts))->name; + else name = NULL; + + if ((name) && (strchr(name, '/'))) name = strchr(name, '/') + 1; + + /* The instance */ + inst = E_NEW(Instance, 1); + /* The gadget */ + inst->o_xkbswitch = edje_object_add(gc->evas); + //XXX add to theme + e_theme_edje_object_set(inst->o_xkbswitch, + "base/theme/modules/xkbswitch", + "modules/xkbswitch/main"); + if (name) edje_object_part_text_set(inst->o_xkbswitch, "label", name); + /* The gadcon client */ + inst->gcc = e_gadcon_client_new(gc, gcname, id, style, inst->o_xkbswitch); + inst->gcc->data = inst; + /* The flag icon */ + if (!e_xkb_cfg->only_label) + { + inst->o_xkbflag = e_icon_add(gc->evas); + snprintf(buf, sizeof(buf), "%s/data/flags/%s_flag.png", + e_prefix_data_get(), name ? name : "unknown"); + e_icon_file_set(inst->o_xkbflag, buf); + /* The icon is part of the gadget. */ + edje_object_part_swallow(inst->o_xkbswitch, "flag", inst->o_xkbflag); + } + else inst->o_xkbflag = NULL; + + /* Hook some menus */ + evas_object_event_callback_add(inst->o_xkbswitch, EVAS_CALLBACK_MOUSE_DOWN, + _e_xkb_cb_mouse_down, inst); + /* Make the list know about the instance */ + instances = eina_list_append(instances, inst); + + return inst->gcc; +} + +static void +_gc_shutdown(E_Gadcon_Client *gcc) +{ + Instance *inst; + + if (!(inst = gcc->data)) return; + instances = eina_list_remove(instances, inst); + + if (inst->menu) + { + e_menu_post_deactivate_callback_set(inst->menu, NULL, NULL); + e_object_del(E_OBJECT(inst->menu)); + inst->menu = NULL; + } + if (inst->lmenu) + { + e_menu_post_deactivate_callback_set(inst->lmenu, NULL, NULL); + e_object_del(E_OBJECT(inst->lmenu)); + inst->lmenu = NULL; + } + if (inst->o_xkbswitch) + { + evas_object_event_callback_del(inst->o_xkbswitch, + EVAS_CALLBACK_MOUSE_DOWN, + _e_xkb_cb_mouse_down); + evas_object_del(inst->o_xkbswitch); + evas_object_del(inst->o_xkbflag); + } + E_FREE(inst); +} + +static void +_gc_orient(E_Gadcon_Client *gcc, E_Gadcon_Orient orient __UNUSED__) +{ + e_gadcon_client_aspect_set(gcc, 16, 16); + e_gadcon_client_min_size_set(gcc, 16, 16); +} + +static const char * +_gc_label(E_Gadcon_Client_Class *client_class __UNUSED__) +{ + return _("XKB Switcher"); +} + +static const char * +_gc_id_new(E_Gadcon_Client_Class *client_class __UNUSED__) +{ + return _gc_class.name; +} + +static Evas_Object * +_gc_icon(E_Gadcon_Client_Class *client_class __UNUSED__, Evas *evas) +{ + Evas_Object *o; + char buf[PATH_MAX]; + + snprintf(buf, sizeof(buf), "%s/e-module-xkbswitch.edj", + e_xkb_cfg->module->dir); + o = edje_object_add(evas); + edje_object_file_set(o, buf, "icon"); + return o; +} + +static void +_e_xkb_cfg_new(void) +{ + e_xkb_cfg = E_NEW(E_XKB_Config, 1); + + e_xkb_cfg->used_layouts = NULL; + e_xkb_cfg->used_options = NULL; + e_xkb_cfg->version = MOD_CONFIG_FILE_VERSION; + e_xkb_cfg->default_model = eina_stringshare_add("default"); + +#define BIND(act, actname) \ + e_xkb_cfg->layout_##act##_key.context = E_BINDING_CONTEXT_ANY; \ + e_xkb_cfg->layout_##act##_key.key = eina_stringshare_add("comma"); \ + e_xkb_cfg->layout_##act##_key.modifiers = E_BINDING_MODIFIER_CTRL | E_BINDING_MODIFIER_ALT; \ + e_xkb_cfg->layout_##act##_key.any_mod = 0; \ + e_xkb_cfg->layout_##act##_key.action = eina_stringshare_add(actname); \ + e_xkb_cfg->layout_##act##_key.params = NULL + + BIND(next, E_XKB_NEXT_ACTION); + BIND(prev, E_XKB_PREV_ACTION); +#undef BIND + + e_config_save_queue(); +} + +static void +_e_xkb_cfg_free(void) +{ + E_XKB_Config_Layout *cl; + E_XKB_Config_Option *op; + + EINA_LIST_FREE(e_xkb_cfg->used_layouts, cl) + { + eina_stringshare_del(cl->name); + eina_stringshare_del(cl->model); + eina_stringshare_del(cl->variant); + E_FREE(cl); + } + + EINA_LIST_FREE(e_xkb_cfg->used_options, op) + { + eina_stringshare_del(op->name); + E_FREE(op); + } + + if (e_xkb_cfg->default_model) + eina_stringshare_del(e_xkb_cfg->default_model); + E_FREE(e_xkb_cfg); +} + +static Eina_Bool +_e_xkb_cfg_timer(void *data) +{ + e_util_dialog_internal( _("XKB Switcher Configuration Updated"), data); + return EINA_FALSE; +} + +static void +_e_xkb_cb_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event) +{ + Evas_Event_Mouse_Down *ev = event; + Instance *inst = data; + + if (!inst) return; + + if ((ev->button == 3) && (!inst->menu)) /* Right-click utility menu */ + { + int x, y; + E_Menu_Item *mi; + + /* The menu and menu item */ + inst->menu = e_menu_new(); + mi = e_menu_item_new(inst->menu); + /* Menu item specifics */ + e_menu_item_label_set(mi, _("Settings")); + e_util_menu_item_theme_icon_set(mi, "preferences-system"); + e_menu_item_callback_set(mi, _e_xkb_cb_menu_configure, NULL); + /* Append into the util menu */ + inst->menu = e_gadcon_client_util_menu_items_append(inst->gcc, + inst->menu, 0); + /* Callback */ + e_menu_post_deactivate_callback_set(inst->menu, _e_xkb_cb_menu_post, + inst); + /* Coords */ + e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &x, &y, + NULL, NULL); + /* Activate - we show the menu relative to the gadget */ + e_menu_activate_mouse(inst->menu, + e_util_zone_current_get(e_manager_current_get()), + (x + ev->output.x), (y + ev->output.y), 1, 1, + E_MENU_POP_DIRECTION_AUTO, ev->timestamp); + + evas_event_feed_mouse_up(inst->gcc->gadcon->evas, ev->button, + EVAS_BUTTON_NONE, ev->timestamp, NULL); + } + else if ((ev->button == 1) && (!inst->lmenu)) /* Left-click layout menu */ + { + Evas_Coord x, y, w, h; + int cx, cy; + + /* Coordinates and sizing */ + evas_object_geometry_get(inst->o_xkbswitch, &x, &y, &w, &h); + e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &cx, &cy, + NULL, NULL); + x += cx; + y += cy; + + if (!inst->lmenu) inst->lmenu = e_menu_new(); + + if (inst->lmenu) + { + E_XKB_Config_Layout *cl; + E_Menu_Item *mi; + Eina_List *l; + int dir; + char buf[PATH_MAX]; + + mi = e_menu_item_new(inst->lmenu); + + e_menu_item_label_set(mi, _("Settings")); + e_util_menu_item_theme_icon_set(mi, "preferences-system"); + e_menu_item_callback_set(mi, _e_xkb_cb_menu_configure, NULL); + + mi = e_menu_item_new(inst->lmenu); + e_menu_item_separator_set(mi, 1); + + /* Append all the layouts */ + EINA_LIST_FOREACH(e_xkb_cfg->used_layouts, l, cl) + { + const char *name = cl->name; + + mi = e_menu_item_new(inst->lmenu); + + e_menu_item_radio_set(mi, 1); + e_menu_item_radio_group_set(mi, 1); + e_menu_item_toggle_set(mi, + (l == e_xkb_cfg->used_layouts) ? 1 : 0); + if (strchr(name, '/')) name = strchr(name, '/') + 1; + snprintf(buf, sizeof(buf), "%s/data/flags/%s_flag.png", + e_prefix_data_get(), name); + if (!ecore_file_exists(buf)) + snprintf(buf, sizeof(buf), "%s/data/flags/unknown_flag.png", + e_prefix_data_get()); + e_menu_item_icon_file_set(mi, buf); + snprintf(buf, sizeof(buf), "%s (%s, %s)", cl->name, + cl->model, cl->variant); + e_menu_item_label_set(mi, buf); + e_menu_item_callback_set(mi, _e_xkb_cb_lmenu_set, cl); + } + + /* Deactivate callback */ + e_menu_post_deactivate_callback_set(inst->lmenu, + _e_xkb_cb_lmenu_post, inst); + /* Proper menu orientation */ + switch (inst->gcc->gadcon->orient) + { + case E_GADCON_ORIENT_TOP: + dir = E_MENU_POP_DIRECTION_DOWN; + break; + case E_GADCON_ORIENT_BOTTOM: + dir = E_MENU_POP_DIRECTION_UP; + break; + case E_GADCON_ORIENT_LEFT: + dir = E_MENU_POP_DIRECTION_RIGHT; + break; + case E_GADCON_ORIENT_RIGHT: + dir = E_MENU_POP_DIRECTION_LEFT; + break; + case E_GADCON_ORIENT_CORNER_TL: + dir = E_MENU_POP_DIRECTION_DOWN; + break; + case E_GADCON_ORIENT_CORNER_TR: + dir = E_MENU_POP_DIRECTION_DOWN; + break; + case E_GADCON_ORIENT_CORNER_BL: + dir = E_MENU_POP_DIRECTION_UP; + break; + case E_GADCON_ORIENT_CORNER_BR: + dir = E_MENU_POP_DIRECTION_UP; + break; + case E_GADCON_ORIENT_CORNER_LT: + dir = E_MENU_POP_DIRECTION_RIGHT; + break; + case E_GADCON_ORIENT_CORNER_RT: + dir = E_MENU_POP_DIRECTION_LEFT; + break; + case E_GADCON_ORIENT_CORNER_LB: + dir = E_MENU_POP_DIRECTION_RIGHT; + break; + case E_GADCON_ORIENT_CORNER_RB: + dir = E_MENU_POP_DIRECTION_LEFT; + break; + case E_GADCON_ORIENT_FLOAT: + case E_GADCON_ORIENT_HORIZ: + case E_GADCON_ORIENT_VERT: + default: + dir = E_MENU_POP_DIRECTION_AUTO; + break; + } + + e_gadcon_locked_set(inst->gcc->gadcon, 1); + + /* We display not relatively to the gadget, but similarly to + * the start menu - thus the need for direction etc. + */ + e_menu_activate_mouse(inst->lmenu, + e_util_zone_current_get + (e_manager_current_get()), + x, y, w, h, dir, ev->timestamp); + } + } + else if (ev->button == 2) /* Middle click */ + e_xkb_layout_next(); +} + +static void +_e_xkb_cb_menu_post(void *data, E_Menu *menu __UNUSED__) +{ + Instance *inst = data; + + if (!(inst) || !inst->menu) return; + inst->menu = NULL; +} + +static void +_e_xkb_cb_lmenu_post(void *data, E_Menu *menu __UNUSED__) +{ + Instance *inst = data; + + if (!(inst) || !inst->lmenu) return; + inst->lmenu = NULL; +} + +static void +_e_xkb_cb_menu_configure(void *data __UNUSED__, E_Menu *mn, E_Menu_Item *mi __UNUSED__) +{ + if (!e_xkb_cfg || e_xkb_cfg->cfd) return; + e_xkb_cfg_dialog(mn->zone->container, NULL); +} + +static void +_e_xkb_cb_lmenu_set(void *data, E_Menu *mn __UNUSED__, E_Menu_Item *mi __UNUSED__) +{ + Eina_List *l; + void *ndata; + void *odata = eina_list_data_get(e_xkb_cfg->used_layouts); + + EINA_LIST_FOREACH(e_xkb_cfg->used_layouts, l, ndata) + { + if (ndata == data) eina_list_data_set(l, odata); + } + + eina_list_data_set(e_xkb_cfg->used_layouts, data); + + e_xkb_update_icon(); + e_xkb_update_layout(); +} diff --git a/src/modules/xkbswitch/e_mod_main.h b/src/modules/xkbswitch/e_mod_main.h new file mode 100644 index 000000000..9ca03fd16 --- /dev/null +++ b/src/modules/xkbswitch/e_mod_main.h @@ -0,0 +1,97 @@ +/* + * Main module header. + * Contains some i18n stuff, module versioning, + * config and public prototypes from main. + */ + +#ifndef E_MOD_MAIN_H +#define E_MOD_MAIN_H + +/* Macros used for config file versioning */ +/* You can increment the EPOCH value if the old configuration is not + * compatible anymore, it creates an entire new one. + * You need to increment GENERATION when you add new values to the + * configuration file but is not needed to delete the existing conf */ +#define MOD_CONFIG_FILE_EPOCH 0x0001 +#define MOD_CONFIG_FILE_GENERATION 0x008d +#define MOD_CONFIG_FILE_VERSION \ + ((MOD_CONFIG_FILE_EPOCH << 16) | MOD_CONFIG_FILE_GENERATION) + +typedef struct _E_XKB_Config +{ + /* Not written to disk */ + E_Module *module; + E_Config_Dialog *cfd; + + /* Written to disk */ + E_Config_Binding_Key layout_next_key; + E_Config_Binding_Key layout_prev_key; + + Eina_List *used_layouts; + Eina_List *used_options; + const char *default_model; + + int only_label; + + int version; +} E_XKB_Config; + +/* This represents the node data in used_layouts */ +typedef struct _E_XKB_Config_Layout +{ + const char *name; + const char *model; + const char *variant; +} E_XKB_Config_Layout; + +/* This represents a keyboard option in the config dialog */ +typedef struct _E_XKB_Dialog_Option +{ + int enabled; + const char *name; +} E_XKB_Dialog_Option; + +/* This represents a keyboard option saved into eet */ +typedef struct _E_XKB_Config_Option +{ + const char *name; +} E_XKB_Config_Option; + +/* automatically typedef'd by E */ +struct _E_Config_Dialog_Data +{ + Evas *evas, *dlg_evas; + Evas_Object *layout_list, *used_list; + Evas_Object *dmodel_list, *model_list, *variant_list; + Evas_Object *btn_add, *btn_del, *btn_up, *btn_down; + Ecore_Timer *fill_delay; + Ecore_Timer *dlg_fill_delay; + + Eina_List *cfg_layouts; + Eina_List *cfg_options; + const char *default_model; + + int only_label; + + E_Dialog *dlg_add_new; +}; + +/* Prototypes */ + +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 e_xkb_update_icon (void); +void e_xkb_update_layout(void); + +void e_xkb_layout_next(void); +void e_xkb_layout_prev(void); + +E_Config_Dialog *e_xkb_cfg_dialog(E_Container *con, const char *params); + +extern E_XKB_Config *e_xkb_cfg; + +#endif diff --git a/src/modules/xkbswitch/e_mod_parse.c b/src/modules/xkbswitch/e_mod_parse.c new file mode 100644 index 000000000..e31632116 --- /dev/null +++ b/src/modules/xkbswitch/e_mod_parse.c @@ -0,0 +1,310 @@ +#include "e.h" +#include "e_mod_parse.h" + +Eina_List *layouts = NULL; +Eina_List *models = NULL; +Eina_List *optgroups = NULL; + +static const char *rules_file = NULL; + +void +find_rules(void) +{ + int i = 0; + const char *lstfiles[] = { + "/usr/share/X11/xkb/rules/xorg.lst", + "/usr/share/X11/xkb/rules/xfree86.lst", + "/usr/local/share/X11/xkb/rules/xorg.lst", + "/usr/local/share/X11/xkb/rules/xfree86.lst", + "/usr/X11R6/lib/X11/xkb/rules/xorg.lst", + "/usr/X11R6/lib/X11/xkb/rules/xfree86.lst", + "/usr/local/X11R6/lib/X11/xkb/rules/xorg.lst", + "/usr/local/X11R6/lib/X11/xkb/rules/xfree86.lst", + NULL + }; + + for (; lstfiles[i]; i++) + { + FILE *f = fopen(lstfiles[i], "r"); + if (f) + { + fclose(f); + rules_file = lstfiles[i]; + break; + } + } +} + +int +parse_rules(void) +{ + E_XKB_Model *model = NULL; + E_XKB_Layout *layout = NULL; + E_XKB_Option *option = NULL; + E_XKB_Variant *variant = NULL; + E_XKB_Option_Group *group = NULL; + char buf[4096]; + + if (!rules_file) return 0; + + layouts = NULL; + models = NULL; + + FILE *f = fopen(rules_file, "r"); + if (!f) return 0; + + /* move on to next line, the first one is useless */ + if (!fgets(buf, sizeof(buf), f)) goto err; + + /* let X decide on this one, also serves as + * "fallback on global" for layout combinations + */ + model = E_NEW(E_XKB_Model, 1); + model->name = eina_stringshare_add("default"); + model->description = eina_stringshare_add("Automatic"); + models = eina_list_append(models, model); + + /* read models here */ + for (;;) + { + if (fgets(buf, sizeof(buf), f)) + { + char *n = strchr(buf, '\n'); + if (n) *n = '\0'; + + /* means end of section */ + if (!buf[0]) break; + /* get rid of initial 2 spaces here */ + char *p = buf + 2; + char *tmp = strdup(p); + + model = E_NEW(E_XKB_Model, 1); + model->name = eina_stringshare_add(strtok(tmp, " ")); + + free(tmp); + + p += strlen(model->name); + while (p[0] == ' ') ++p; + + model->description = eina_stringshare_add(p); + + models = eina_list_append(models, model); + } + else + break; + } + + /* move on again */ + if (!fgets(buf, sizeof(buf), f)) goto err; + + /* read layouts here */ + for (;;) + { + if (fgets(buf, sizeof(buf), f)) + { + char *n = strchr(buf, '\n'); + if (n) *n = '\0'; + + if (!buf[0]) break; + + char *p = buf + 2; + char *tmp = strdup(p); + + layout = E_NEW(E_XKB_Layout, 1); + layout->name = eina_stringshare_add(strtok(tmp, " ")); + + free(tmp); + + p += strlen(layout->name); + while (p[0] == ' ') ++p; + + variant = E_NEW(E_XKB_Variant, 1); + variant->name = eina_stringshare_add("basic"); + variant->description = eina_stringshare_add("Default layout variant"); + + layout->description = eina_stringshare_add(p); + layout->variants = eina_list_append(layout->variants, variant); + + layouts = eina_list_append(layouts, layout); + } + else + break; + } + + /* move on again */ + if (!fgets(buf, sizeof(buf), f)) goto err; + + /* read variants here */ + for (;;) + { + if (fgets(buf, sizeof(buf), f)) + { + char *n = strchr(buf, '\n'); + if (n) *n = '\0'; + + if (!buf[0]) break; + + char *p = buf + 2; + char *tmp = strdup(p); + + variant = E_NEW(E_XKB_Variant, 1); + variant->name = eina_stringshare_add(strtok(tmp, " ")); + + char *tok = strtok(NULL, " "); + *strchr(tok, ':') = '\0'; + + layout = eina_list_search_unsorted(layouts, layout_sort_by_name_cb, tok); + layout->variants = eina_list_append(layout->variants, variant); + + p += strlen(variant->name); + while (p[0] == ' ') ++p; + p += strlen(tok); + p += 2; + + free(tmp); + + variant->description = eina_stringshare_add(p); + } + else + break; + } + + /* move on again */ + if (!fgets(buf, sizeof(buf), f)) goto err; + + /* read options here */ + for (;;) + { + if (fgets(buf, sizeof(buf), f)) + { + char *n = strchr(buf, '\n'); + if (n) *n = '\0'; + + if (!buf[0]) break; + + char *p = buf + 2; + char *tmp = strdup(p); + char *name = strtok(tmp, " "); + + p += strlen(name); + while (p[0] == ' ') ++p; + + if (!strchr(name, ':')) + { + group = E_NEW(E_XKB_Option_Group, 1); + + /* A hack to get it to parse right if + * the group name contains a space + */ + if (strstr(p, " ")) + { + p = strstr(p, " "); + while (p[0] == ' ') ++p; + } + + group->description = eina_stringshare_add(p); + + optgroups = eina_list_append(optgroups, group); + } + else + { + option = E_NEW(E_XKB_Option, 1); + option->name = eina_stringshare_add(name); + option->description = eina_stringshare_add(p); + + group->options = eina_list_append(group->options, option); + } + + free(tmp); + } + else + break; + } + +err: + fclose(f); + + /* Sort layouts */ + layouts = + eina_list_sort(layouts, eina_list_count(layouts), layout_sort_cb); + return 1; +} + +void +clear_rules(void) +{ + E_XKB_Option_Group *og; + E_XKB_Variant *v; + E_XKB_Option *o; + E_XKB_Layout *la; + E_XKB_Model *m; + + EINA_LIST_FREE(layouts, la) + { + eina_stringshare_del(la->name); + eina_stringshare_del(la->description); + + EINA_LIST_FREE(la->variants, v) + { + eina_stringshare_del(v->name); + eina_stringshare_del(v->description); + + E_FREE(v); + } + + E_FREE(la); + } + + EINA_LIST_FREE(models, m) + { + eina_stringshare_del(m->name); + eina_stringshare_del(m->description); + + E_FREE(m); + } + + EINA_LIST_FREE(optgroups, og) + { + eina_stringshare_del(og->description); + + EINA_LIST_FREE(og->options, o) + { + eina_stringshare_del(o->name); + eina_stringshare_del(o->description); + + E_FREE(o); + } + + E_FREE(og); + } + + optgroups = NULL; + layouts = NULL; + models = NULL; +} + +int +layout_sort_cb(const void *data1, const void *data2) +{ + const E_XKB_Layout *l1, *l2; + + if (!(l1 = data1)) return 1; + if (!l1->name) return 1; + if (!(l2 = data2)) return -1; + if (!l2->name) return -1; + + return strcmp(l1->name, l2->name); +} + +int +layout_sort_by_name_cb(const void *data1, const void *data2) +{ + const E_XKB_Layout *l1 = NULL; + const char *l2 = NULL; + + if (!(l1 = data1)) return 1; + if (!l1->name) return 1; + if (!(l2 = data2)) return -1; + + return strcmp(l1->name, l2); +} diff --git a/src/modules/xkbswitch/e_mod_parse.h b/src/modules/xkbswitch/e_mod_parse.h new file mode 100644 index 000000000..0998c781f --- /dev/null +++ b/src/modules/xkbswitch/e_mod_parse.h @@ -0,0 +1,52 @@ +/* + * XML parsing abstraction interface header. + * Contains public structs and lists externs which are further used. + */ + +#ifndef E_MOD_PARSE_H +#define E_MOD_PARSE_H + +typedef struct _E_XKB_Model +{ + const char *name; + const char *description; +} E_XKB_Model; + +typedef struct _E_XKB_Variant +{ + const char *name; + const char *description; +} E_XKB_Variant; + +typedef struct _E_XKB_Layout +{ + const char *name; + const char *description; + + Eina_List *variants; +} E_XKB_Layout; + +typedef struct _E_XKB_Option_Group +{ + const char *description; + Eina_List *options; +} E_XKB_Option_Group; + +typedef struct _E_XKB_Option +{ + const char *name; + const char *description; +} E_XKB_Option; + +int parse_rules(void); +void clear_rules(void); +void find_rules(void); + +int layout_sort_cb (const void *data1, const void *data2); +int layout_sort_by_name_cb(const void *data1, const void *data2); + +extern Eina_List *models; +extern Eina_List *layouts; +extern Eina_List *optgroups; + +#endif diff --git a/src/modules/xkbswitch/module.desktop.in b/src/modules/xkbswitch/module.desktop.in new file mode 100644 index 000000000..4579a66cd --- /dev/null +++ b/src/modules/xkbswitch/module.desktop.in @@ -0,0 +1,6 @@ +[Desktop Entry] +Type=Link +Name=XKBSwitch +Icon=e-module-xkbswitch +X-Enlightenment-ModuleType=utils +Comment=Keyboard layout configuration and switcher