void SendIPC (char const *from, char const *to, int ipc, void* data){ msg.name_to=to; msg.name_from=from; msg.data=data; GBS_SendMessage (MMI_CEPID, MSG_IPC, ipc, &msg); }
int KeyHook(int key, int style) { #define idlegui_id(icsm) (((int *)icsm)[DISPLACE_OF_IDLEGUI_ID/4]) #define func(x) style == x && key == (int)cfg_key && !IsCalling() && IsUnlocked() if (cfg_enable_keyhook) { if (cfg_style == 0) { if (func(KEY_DOWN)) { goto LAUNCH; } } else { static int flag; void *icsm = FindCSMbyID(CSM_root()->idle_id); if (func(KEY_DOWN)) { if (flag == 1) { flag = 0; } else { flag = 1; return KEYHOOK_BREAK; } } if (func(LONG_PRESS)) { LAUNCH: if (cfg_enable_of_idlescreen) { if (IsGuiOnTop(idlegui_id(icsm))) { CreateClipperGUI(); return KEYHOOK_BREAK; } } else { if (!IsGuiOnTop(idlegui_id(icsm))) { CreateClipperGUI(); return KEYHOOK_BREAK; } } } else if (func(KEY_UP) && flag == 1) { GBS_SendMessage(MMI_CEPID, KEY_DOWN, cfg_key); } } } return KEYHOOK_NEXT; }
void *BridgeMessageSend(void *func_ptr, int type, void *packed_args) { ThreadInfo *i = (ThreadInfo*) malloc(sizeof(ThreadInfo)); i->sync = (type == NU_SYNCHRONIZED_PROC); i->loked = 1; i->ret = 0; if(i->sync && NU_Create_Semaphore(&i->loker, "mopi", 0, NU_PRIORITY) != NU_SUCCESS) { ShowMSG(1, (int)"ProcB: Semaphore init failed"); free(i); return 0; } GBS_SendMessage(BridgeMOPI_ID, MOPI_THREAD_PROC, func_ptr, i, packed_args); switch(type) { case NU_SYNCHRONIZED_PROC: NU_Obtain_Semaphore(&i->loker, NU_SUSPEND); break; case NU_ASYNC_PROC: /* in async mode return not support */ return 0; } if(i->sync) NU_Delete_Semaphore(&i->loker); /* возвращаемое значение */ void *ret = i->ret; /* больше не нужно оно */ free(i); /* чистим стек аргументов */ free(packed_args); /* возвращаем результат выполнения */ return ret; }
/* Bridge of mopi and nucleus */ void MopiBridgeMessenger() { GBS_MSG msg; if (GBS_RecActDstMessage(&msg)) { if (msg.msg == MOPI_THREAD_PROC) { if(msg.submess) { ThreadInfo *inf = (ThreadInfo *)msg.data0; uint32_t pcnt; void **args, *pret = 0, *arg_ptr = msg.data1; void *(*ptr_func)(void *, ...) = (void *(*)(void *, ...))msg.submess; /* нету параметров */ if(!arg_ptr) { ptr_func(0); pcnt = 0; } else pcnt = unpack_args(arg_ptr, &args); switch(pcnt) { case 0: pret = ptr_func(0); break; case 1: pret = ptr_func(args[0]); break; case 2: pret = ptr_func(args[0], args[1]); break; case 3: pret = ptr_func(args[0], args[1], args[2]); break; case 4: pret = ptr_func(args[0], args[1], args[2], args[3]); break; case 5: pret = ptr_func(args[0], args[1], args[2], args[3], args[4]); break; case 6: pret = ptr_func(args[0], args[1], args[2], args[3], args[4], args[5]); break; case 7: pret = ptr_func(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); break; case 8: pret = ptr_func(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); break; case 9: pret = ptr_func(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); break; case 10: pret = ptr_func(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]); break; case 11: pret = ptr_func(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10]); break; case 12: pret = ptr_func(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11]); break; default: ShowMSG(1, (int)"Bridge invalid param!"); break; } if(inf->sync) { inf->ret = pret; inf->loked = 0; NU_Release_Semaphore(&inf->loker); } else { free(arg_ptr); free(inf); } } } else { GBS_SendMessage(MMI_CEPID,MSG_HELPER_TRANSLATOR,msg.pid_from,msg.msg,msg.submess); } } }