爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
12
返回列表 发新帖
楼主: binghelingxi
收起左侧

[ELF文件] eMenu - главное меню для newsgold

[复制链接]
发表于 2009-6-25 16:53:40 | 显示全部楼层
本帖最后由 无泪の城 于 2009-6-26 00:57 编辑

源码
  1. #include "\ARM\inc\swilib.h"
  2. #include "conf_loader.h"

  3. #define isElka() (isnewSGold()==2)
  4. #define UNI_YDISP (isElka()?24:0)

  5. typedef struct
  6. {
  7.   int flag; //0, 8, 16 хз
  8.   int (*onKey)(GUI *gui, GUI_MSG *msg);
  9.   void (*global_hook_proc)(GUI *gui, int cmd);
  10.   void *locret; //0
  11.   const int *softkeys;
  12.   const SOFTKEYSTAB *softkeystab;
  13.   int unkflag; //1
  14.   int lgp_null;
  15.   const int *icons; //&x52A
  16.   int pos; //0 (pos?)
  17.   int font; //4
  18.   int textcolor; //0x64
  19.   int _101;
  20.   int timeout; //0-forever
  21. } MSG_BOX;

  22. typedef struct
  23. {
  24.   int *icon_inact;
  25.   int *icon_big;
  26.   int lgp_id;
  27.   void (*run)();
  28. } NATMENU_ITEM_DESC;

  29. int(*MsgBox)(int _1, int, MSG_BOX*, int lgp_id);
  30. void(*AddHeader)(GUI*,HEADER_DESC*,void* malloc_adr);
  31. int m; //коэффициент для формулы = isnewSGold

  32. #pragma inline
  33. void patch_header(const HEADER_DESC* headc)
  34. {
  35.   HEADER_DESC *head=(HEADER_DESC *)headc;
  36.   head->rc.x=0;
  37.   head->rc.y=UNI_YDISP;
  38.   head->rc.x2=ScreenW()-1;
  39.   head->rc.y2=HeaderH()+UNI_YDISP;
  40. }

  41. void ElfKiller()
  42. {
  43.   extern void kill_data(void *p, void (*func_p)(void *));
  44.   extern void *ELF_BEGIN;
  45.   kill_data(&ELF_BEGIN,(void (*)(void *))mfree_adr());
  46. }

  47. CSM_DESC icsmd;

  48. //int (*oldIcsmOnMessage)(CSM_RAM*,GBS_MSG*);
  49. void (*oldIcsmOnClose)(CSM_RAM*);

  50. //----------------MMenu----------------
  51. int MHico;
  52. HEADER_DESC MHeader={0, 0, 0, 0, &MHico, 0, LGP_NULL};
  53. int MSoftKeys[]={0,1,2};

  54. SOFTKEY_DESC Msk[]=
  55. {
  56.   {0x0018,0x0000,(int)""},
  57.   {0x0001,0x0000,(int)"Назад"},
  58.   {0x003D,0x0000,(int)LGP_DOIT_PIC}
  59. };

  60. SOFTKEYSTAB Mskt=
  61. {
  62.   Msk,0
  63. };

  64. GBSTMR tmr;
  65. NATMENU_ITEM_DESC *items;
  66. short hs[]={56,101,159,204};
  67. int pic_n=0;
  68. int pos=4;
  69. #define TIME 262/5

  70. void PickNumTmr()
  71. {
  72.   pic_n++;
  73.   if(pic_n>4)
  74.     pic_n=0;
  75.   DirectRedrawGUI();
  76.   GBS_StartTimerProc(&tmr, TIME, PickNumTmr);
  77. }

  78. void UpdateHeader(GUI* gui)
  79. {
  80.   MHico=*items[pos].icon_inact-11-m; //Значек заголовка
  81.   ((int*)GetDataOfItemByID(gui, 2))[13]=items[pos].lgp_id; //Текст заголовка
  82. }

  83. void TmrReset()
  84. {
  85.   GBS_DelTimer(&tmr);
  86.   pic_n=0;
  87.   GBS_StartTimerProc(&tmr, TIME, PickNumTmr);
  88. }

  89. void (*OOnRedraw)(GUI *data);
  90. void NOnRedraw(GUI *data)
  91. {
  92.   OOnRedraw(data); //Сначала старый OnRedraw

  93.   for(int i=0;i<12;i++)
  94.   {
  95.     if(i==pos)continue;
  96. /* --==Формула==--
  97. * x= 3m+2+(36m+5)j
  98. * y=31m-2+(28m+2)i
  99. */
  100.     int x=3*m+2+(36*m+5)*(i%3);
  101.     int y=31*m-2+(28*m+2)*(i/3);
  102.     int pic=*items.icon_inact;
  103.     DrawImg(x,y,pic);
  104.   }
  105.   if(m==2)
  106.     DrawImg(pos%3*(77)+1,hs[pos/3],items[pos].icon_big[pic_n]);
  107.   else
  108.     DrawImg(3*m+2+(36*m+5)*(pos%3),31*m-2+(28*m+2)*(pos/3),items[pos].icon_big[pic_n]);
  109. }

  110. const void * NGuiMeths[11];

  111. void MGHook(GUI *gui, int cmd)
  112. {
  113.   switch(cmd)
  114.   {
  115.   case 1://Создание: подмена onRedraw + добавление хедера
  116.     {
  117.       AddHeader(gui,&MHeader,malloc_adr());
  118.       memcpy(NGuiMeths,gui->methods,11*sizeof(void*));
  119.       gui->methods=(void*)NGuiMeths;
  120.       OOnRedraw=(void(*)(GUI*))NGuiMeths[0];//(gui->methods[0]);
  121.       NGuiMeths[0]=(void*)NOnRedraw;
  122.     }
  123.     break;
  124.   case 5://Получение фокуса (?)
  125.     TmrReset();
  126.     break;
  127.   case 6://Потеря фокуса
  128.     UpdateHeader(gui);
  129.     GBS_DelTimer(&tmr);//Экономим ресурсы (типо)
  130.     break;
  131.   }
  132. }

  133. int MOnKey(GUI *gui, GUI_MSG *msg)
  134. {
  135.   int key=msg->gbsmsg->submess;
  136.   if(msg->gbsmsg->msg==KEY_DOWN)
  137.   {
  138.     if(pos==0 && (key==LEFT_BUTTON | key==UP_BUTTON))
  139.     {
  140.       pos=11;
  141.       goto end;
  142.     }
  143.     if(pos==11 && (key==RIGHT_BUTTON | key==DOWN_BUTTON))
  144.     {
  145.       pos=0;
  146.       goto end;
  147.     }
  148.     switch(key)
  149.     {
  150.     case ENTER_BUTTON:
  151.       goto run;
  152.     case LEFT_BUTTON:
  153.       pos--;
  154.       break;
  155.     case RIGHT_BUTTON:
  156.       pos++;
  157.       break;
  158.     case UP_BUTTON:
  159.       pos-=3;
  160.       break;
  161.     case DOWN_BUTTON:
  162.       pos+=3;
  163.       break;
  164.     case RIGHT_SOFT:
  165.       GBS_DelTimer(&tmr);
  166.       return(0);
  167.     case '*':
  168.       pos=9;
  169.       goto run;
  170.     case '0':
  171.       pos=10;
  172.       goto run;
  173.     case '#':
  174.       pos=11;
  175.       goto run;
  176.     default:
  177.       if(key>='1' && key<='9')
  178.       {
  179.         pos=key-1-'0';
  180.         goto run;
  181.       }
  182.       else
  183.         return(0);
  184.     }
  185.     if(pos<0)
  186.       pos+=11;
  187.     if(pos>11)
  188.       pos-=11;

  189.   end:
  190.     UpdateHeader(gui);
  191.     TmrReset();
  192.     RefreshGUI();
  193.     return(0);
  194.   run:
  195.     items[pos].run();
  196.     return(0);
  197.   }
  198.   return(0);
  199. }

  200. MSG_BOX MMenu=
  201. {
  202.   0,
  203.   MOnKey,
  204.   MGHook,
  205.   0,
  206.   MSoftKeys,
  207.   &Mskt,
  208.   1,
  209.   LGP_NULL,
  210.   0,
  211.   0,
  212.   0,
  213.   0x64,
  214.   0x65,
  215.   0
  216. };
  217. //-----------------CSM-----------------
  218. const int minus11=-11;
  219. unsigned short maincsm_name_body[140];
  220. int MCSMid;

  221. typedef struct
  222. {
  223.   CSM_RAM csm;
  224.   int gui_id;
  225. }MAIN_CSM;

  226. __thumb void MOnCreate(CSM_RAM *data)
  227. {
  228.   MAIN_CSM *csm=(MAIN_CSM*)data;
  229.   MHico=*items[4].icon_inact-11-m;
  230.   csm->gui_id=MsgBox(0,0,&MMenu,LGP_NULL);
  231. }

  232. __thumb int MOnMsg(CSM_RAM *data, GBS_MSG *msg)
  233. {
  234.   MAIN_CSM *csm=(MAIN_CSM*)data;
  235.   if ((msg->msg==MSG_GUI_DESTROYED)&&((int)msg->data0==csm->gui_id))
  236.     csm->csm.state=-3;
  237.   return(1);
  238. }

  239. void MOnClose(CSM_RAM *csm)
  240. {
  241.   GBS_DelTimer(&tmr);
  242.   pos=4;
  243. }

  244. const struct
  245. {
  246.   CSM_DESC maincsm;
  247.   WSHDR maincsm_name;
  248. }MAINCSM =
  249. {
  250.   {
  251.   MOnMsg,
  252.   MOnCreate,
  253. #ifdef NEWSGOLD
  254.   0,
  255.   0,
  256.   0,
  257.   0,
  258. #endif
  259.   MOnClose,
  260.   sizeof(MAIN_CSM),
  261.   1,
  262.   &minus11
  263.   },
  264.   {
  265.     maincsm_name_body,
  266.     NAMECSM_MAGIC1,
  267.     NAMECSM_MAGIC2,
  268.     0x0,
  269.     139
  270.   }
  271. };
  272. //-------------------------------------

  273. /*int newIcsmOnMessage(CSM_RAM* data,GBS_MSG* msg)
  274. {
  275.   if(msg->msg == MSG_RECONFIGURE_REQ)
  276.     InitConfig();

  277.   return oldIcsmOnMessage(data,msg);
  278. }*/

  279. GBSTMR errtmr;
  280. GUI * errgui;

  281. #pragma swi_number=0x37
  282. __swi __arm void Ringtones_SetState(unsigned char state);

  283. void ErrTmr()
  284. {
  285.   if(errgui==NULL)
  286.     errgui=GetTopGUI();
  287.   if(errgui==GetTopGUI())
  288.   {
  289.     GBS_SendMessage(MMI_CEPID,KEY_DOWN,ENTER_BUTTON);
  290.     GBS_StartTimerProc(&errtmr, 262/3, ErrTmr);
  291.   }
  292.   else
  293.     Ringtones_SetState(0);
  294. }

  295. int hook(int submsg, int msg)
  296. {
  297.   if (IsUnlocked() && submsg==ENTER_BUTTON && msg==KEY_DOWN)
  298.     if (IsGuiOnTop(((int *)FindCSMbyID(CSM_root()->idle_id))[DISPLACE_OF_IDLEGUI_ID/4]))
  299.     {
  300.       if(FindCSMbyID(MCSMid))
  301.         CloseCSM(MCSMid);
  302.       char dummy[sizeof(MAIN_CSM)];
  303.       LockSched();
  304.       MCSMid=CreateCSM(&MAINCSM.maincsm,dummy,0);
  305.       UnlockSched();
  306.       return(2);
  307.     }
  308.   return (0);
  309. }

  310. void newIcsmOnClose(CSM_RAM *data)
  311. {
  312.   extern void seqkill(void *data, void(*next_in_seq)(CSM_RAM *), void *data_to_kill, void *seqkiller);
  313.   extern void *ELF_BEGIN;
  314.   RemoveKeybMsgHook((void *)hook);
  315.   seqkill(data,oldIcsmOnClose,&ELF_BEGIN,SEQKILLER_ADR());
  316. }

  317. __thumb unsigned int GetBLAddr(unsigned int adr)
  318. {
  319.   short _1_11=((short*)adr)[0];
  320.   int _1=(_1_11&0x7FF)<<11|(_1_11&0x0400?0xFFC00000:0);
  321.   short _2=((short*)adr)[1]&0x7FF;
  322.   return(unsigned int)(adr+_1*2+_2*2+4+(_1_11>>12&1));
  323. }

  324. void main()
  325. {
  326.   unsigned int adr;

  327.   //Нахожу функцию MsgBox
  328.   #pragma swi_number=0x8050
  329.   __swi __arm unsigned int MsgBoxOkCancel_adr();
  330.   adr=MsgBoxOkCancel_adr()+7; //Тут лежит инструкция "B MsgBox"
  331.   MsgBox=(int(*)(int,int,MSG_BOX*,int))(adr+(short)((*(short*)adr|0xF800))*2+5);

  332.   //Нахожу функцию AddHeader
  333.   #pragma swi_number=0x8152
  334.   __swi __arm unsigned int CreateMenu_adr();
  335.   AddHeader=(void(*)(GUI*,HEADER_DESC*,void*))GetBLAddr(GetBLAddr(CreateMenu_adr()+33)+123);

  336.   //Нахожу таблицу пунктов NativeMenu
  337.   #pragma swi_number=0x8061
  338.   __swi __arm unsigned int ShowNativeMenu_adr();
  339.   adr=GetBLAddr(GetBLAddr(ShowNativeMenu_adr()+1)+9)+23;
  340.   items=*(void**)((adr&0xFFFFFFFD)+*(char*)adr*4+4);
  341.   
  342.   m=isnewSGold();

  343.   patch_header(&MHeader);
  344.   MHeader.lgp_id=items[4].lgp_id;

  345.   wsprintf((WSHDR*)&MAINCSM.maincsm_name,"%t","Главное меню");

  346.   LockSched();
  347.   CSM_RAM *icsm=FindCSMbyID(CSM_root()->idle_id);
  348.   memcpy(&icsmd,icsm->constr,sizeof(icsmd));
  349.   oldIcsmOnClose=icsmd.onClose;
  350.   icsmd.onClose=newIcsmOnClose;
  351.   icsm->constr=&icsmd;
  352.   AddKeybMsgHook((void *)hook);
  353.   UnlockSched();

  354.   #pragma swi_number=0x8060
  355.   __swi __arm void* ShowMainMenu_adr();
  356.   static GBSTMR mmtmr;
  357.   Ringtones_SetState(1);
  358.   GBS_StartTimerProc(&mmtmr, 262*5, (void(*)())ShowMainMenu_adr());
  359.   GBS_StartTimerProc(&errtmr, 262*5+262/3, ErrTmr);
  360. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-6-25 21:16:52 | 显示全部楼层
我自己汉的elf都是直接替换16进制字符。
蠢办法。。。
回复 支持 反对

使用道具 举报

发表于 2009-6-25 23:50:34 | 显示全部楼层

RE: eMenu - 中文化

本帖最后由 无泪の城 于 2009-6-26 00:45 编辑

1.PNG 2.PNG
eMenu_chs.elf (3.99 KB, 下载次数: 20)

评分

参与人数 1实力分 +1 收起 理由
binghelingxi + 1 体力活

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2010-3-19 21:33:55 | 显示全部楼层
本帖最后由 注册真难 于 2010-3-21 19:55 编辑

回复 23# 无泪の城


S68 生成不了配置文件  还有和其他任何版本一样  进入短信后  选收件箱之类的 就会死机    这个原因估计是我刷了MSS3的原因 不过生成不了配置文件不知道为什么了   就这个版本生成不了  前面的都行   不过不能和MSS3配合的话也是很麻烦啊
回复 支持 反对

使用道具 举报

发表于 2010-3-22 18:25:21 | 显示全部楼层
S68由于没有相对应的补丁,不推荐使用……
回复 支持 反对

使用道具 举报

发表于 2010-3-22 20:19:59 | 显示全部楼层
回复 25# 无泪の城


   
S68刷了禁止JAVA后 用这个菜单刚好可以打开 呵呵  很方便的 就是配置文件里没有设置图标的地方   打开的话那些图标都乱排的。。。本来想用你这个汉化版可能好一点 结果也是一样。。。无奈 呵呵

主要是S68用MYMENU2的话不能调用地址  MYMENU2我觉得是最好用的了 简洁方便  在刷一个替换STK的补丁  的确很好用。 就是无法调用地址 可惜啊  只能用IDLE调用  可是不知道为什么  比如设置这个地址  没禁用JAVA前可以调用打开  可是禁用了以后就不能直接打开设置的主菜单了 不过和JAVA的那个补丁肯定也没关系就是了 不知道为什么  不过可以直接打开里面的语言设置只类的分项  可是这样要设置的就太多了 好麻烦哦  还是你这个EMENU好用 呵呵 和主菜单一样的 用的习惯 不知道S68怎么样才能用上了。。。呵呵 我是比较追求完美主义的  其实主菜单的东西我根本不用  我都用全ELF的  所以用MY MENU就够了  可是就是想有个主菜单 感觉好点 呵呵  SMENU的话又感觉太花俏了 不喜欢 比起SMENU 我还更喜欢简单的MY MENU2呢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员 微信登录

本版积分规则

小黑屋|Archiver|手机版|爱技术 ( 沪ICP备08115260号-3 )

GMT+8, 2025-6-6 14:03

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表