Создание Эльфов : Эльфостроение : Форум

Страница 193 из 211: « 1 ... 189 190 191 192 [193] 194 195 196 197 ... 211 »

 E1kolyan:
27.11.11, 01:25
 IDOL1234, куча исходников есть на форуме...

 IDOL1234:
27.11.11, 05:07
 Metaler, мне нужно генерировать нажатие по таймеру, а не подменять нажатые клавиши. В том-то всё и дело..
E1kolyan, возможно, я не там искал. Пересмотрел исходники с СВН, прошёлся по ним поиском, но функции, которые мне советовали чуть выше (не кейхук, ещё выше), используются в них всего несколько раз, причём в совершенно непонятном для меня контексте (какие-то манипуляции с графикой, кажется). Поискал ключевые слова по форуму - тоже не нашёл..


[ Редактировано IDOL1234 в 27.11.11 05:08 ]

[ Редактировано IDOL1234 в 27.11.11 05:10 ]

 SummerWood:
28.11.11, 14:38
 есть ли аналог javax.sound.sampled.* в
библ-ке функций?

 IDOL1234:
30.11.11, 00:41
 Если я не ошибаюсь, эльф может только воспроизвести звук, поддерживаемый телефоном, и записать его в файл при помощи встроенного диктофона. Никаких "низкоуровневых" операций над звуком на данный момент не осуществляется (за исключением ручного редактирования файлов, но этим вроде бы никто не занимается).


Добавлено 2.12.11 01:08

Объясните пожалуйста содержимое файла dyn_syntax.cfg: что такое, например, ACTION_INFO? Почему-то ACTION_INFO_TAG ни разу не отловился...
Какие константы соответствуют какому событию? (ну, кроме кодов и событий клавиш)
Какие ивенты можно сгенерировать, не используя pagehook?
----
Как можно передавать информацию на внешнее устройство? Понятно, что оно может имитировать подключение/отключение гарнитуры через определённые промежутки времени, а телефон может отвечать воспроизведением коротенького звука через гарнитуру, но это же ЧУДОВИЩНО! Есть ли другие способы? На вики есть куча функций, связанных с работой аксессуаров, но все они без описаний..
----
Традиционный вопрос по OMAC
Этот эльф использует n_macros.h, который устарел. В нём используется функция text2id. Её нужно (?) заменить на textid_create. Но как быть с textid_delete?
Собственно, файл
Код: 
#ifndef N_MACROS
#define N_MACROS

////////////////////////////////////////////////////////////////////////////////
// n_macros.h
// Various macros collected in one file by nkls
//  Needed by most of my sources
//  Use it and share it any way you want.
////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////
// STRID / IMGID

#define STRID_NULL  0x6FFFFFFF    // I've got used to these, but they are the 
#define IMGID_NULL  0xFFFF        // same as NOIMAGE and EMPTY_SID

#define IMGID wchar_t


////////////////////////////////////////////////////////////////////////////////
// MAX / MIN / ABS

#ifndef MIN
#define MIN(_a_, _b_) (((_a_)<(_b_))?(_a_):(_b_))
#endif

#ifndef MAX
#define MAX(_a_, _b_) (((_a_)>(_b_))?(_a_):(_b_))
#endif

#ifndef ABS
#define ABS(_a_) ((_a_)>=0?(_a_):-(_a_))
#endif


////////////////////////////////////////////////////////////////////////////////
// STRID macros

// 16-bit wchar_t strings
#define WSTR2ID(_wstr_)           Str2ID(_wstr_, 0, SID_ANY_LEN)
#define CWSTR2ID(_wstr_)          Str2ID(_wstr_, 0, MAXELEMS(_wstr_)-1)
#define WSTRN2ID(_wstr_, _LEN_)   Str2ID(_wstr_, 0, _LEN_)

// 8-bit char strings
#define STR2ID(_str_)             Str2ID(_str_, 6, SID_ANY_LEN)
#define CSTR2ID(_str_)            Str2ID(_str_, 6, sizeof(_str_)-1)
#define STRN2ID(_str_, _LEN_)     Str2ID(_str_, 6, _LEN_)

// STRID merge
#define MERGEID(_IDArray_, _LEN_) Str2ID(_IDArray_, 5, _LEN_)

// Integer to STRID
#define INT2ID                    int2strID

// String element to ID
#define STRELEM2ID(_elem_)        (0x78000000+(_elem_))


// PRNTFSTRID
#define PRNTFSTRID(_buf_, ...)    STRN2ID(_buf_, sprintf(_buf_, __VA_ARGS__))



////////////////////////////////////////////////////////////////////////////////
// MessageBox() macros

// STRID Message box (with timeout and parent book) macro
#define STRIDMSGTB(__STRID__, __TIME__, __BOOK__) MessageBox(STRID_NULL, __STRID__, IMGID_NULL, 1, __TIME__, __BOOK__)

// String Message box (with timeout and parent book) macros
#define WSTRMSGTB(__LSTR__, __TIME__, __BOOK__)   STRIDMSGTB(WSTR2ID(__LSTR__), __TIME__, __BOOK__)
#define STRMSGTB(__STR__, __TIME__, __BOOK__)     STRIDMSGTB(STR2ID(__STR__), __TIME__, __BOOK__)
#define CWSTRMSGTB(__LSTR__, __TIME__, __BOOK__)  STRIDMSGTB(CWSTR2ID(__LSTR__), __TIME__, __BOOK__)
#define CSTRMSGTB(__STR__, __TIME__, __BOOK__)    STRIDMSGTB(CSTR2ID(__STR__), __TIME__, __BOOK__)



// STRID Message box (with parent book and no timeout) macro
#define STRIDMSGB(__STRID__, __BOOK__)            STRIDMSGTB(__STRID__, 0, __BOOK__)

// String Message box (with parent book and no timeout) macros
#define WSTRMSGB(__LSTR__, __BOOK__)              STRIDMSGB(WSTR2ID(__LSTR__), __BOOK__)
#define STRMSGB(__STR__, __BOOK__)                STRIDMSGB(STR2ID(__STR__), __BOOK__)
#define CWSTRMSGB(__LSTR__, __BOOK__)             STRIDMSGB(CWSTR2ID(__LSTR__), __BOOK__)
#define CSTRMSGB(__STR__, __BOOK__)               STRIDMSGB(CSTR2ID(__STR__), __BOOK__)



// STRID Message box (with no parent book and timeout) macro
#define STRIDMSGT(__STRID__, __TIME__)            STRIDMSGBT(__STRID__, __TIME__, NULL)

// String Message box (with no parent book and timeout) macros
#define WSTRMSGT(__LSTR__, __TIME__)              STRIDMSGT(WSTR2ID(__LSTR__), __TIME__)
#define STRMSGT(__STR__, __TIME__)                STRIDMSGT(STR2ID(__STR__), __TIME__)
#define CWSTRMSGT(__LSTR__, __TIME__)             STRIDMSGT(CWSTR2ID(__LSTR__), __TIME__)
#define CSTRMSGT(__STR__, __TIME__)               STRIDMSGT(CSTR2ID(__STR__), __TIME__)



// STRID Message box macro
#define STRIDMSG(__STRID__)                       STRIDMSGB(__STRID__, NULL)

// String Message box macros
#define WSTRMSG(__LSTR__)                         STRIDMSG(WSTR2ID(__LSTR__))
#define STRMSG(__STR__)                           STRIDMSG(STR2ID(__STR__))
#define CWSTRMSG(__LSTR__)                        STRIDMSG(CWSTR2ID(__LSTR__))
#define CSTRMSG(__STR__)                          STRIDMSG(CSTR2ID(__STR__))

// PRINTFMSG
#define PRINTFMSG(_buf_, ...)                     STRIDMSG(STRN2ID(_buf_, sprintf(_buf_, __VA_ARGS__)))


////////////////////////////////////////////////////////////////////////////////
// DEBUG

// DEBUG Condition Message
#ifndef NDEBUG
#define DEBCOND(cond)        {if(cond){debug_printf("\nDEBCOND: %s\n", #cond);CSTRMSG(#cond);}}
#define DEBCONDS(cond,_str_) {if(cond){debug_printf("\nDEBCOND: %s\n", _str_);CSTRMSG(_str_);}}
#else
#define DEBCOND(...)
#define DEBCONDS(...)
#endif

////////////////////////////////////////////////////////////////////////////////
// Debug msg and printf. note: no printf message longer than 300 chars!

#ifndef NDEBUG
#define DEBUG_MSG(_str_) STRMSG(_str_)
#define DEBUG_PRINTF(...) debug_printf(__VA_ARGS__)
#define DEBUG_PRINTF_MSG(...) {char s[300];STRN2ID(s, MAX(sprintf(s, __VA_ARGS__), 299));}
#else
#define DEBUG_MSG(_str_)
#define DEBUG_PRINTF(...)
#define DEBUG_PRINTF_MSG(...)
#endif

#endif


[ Редактировано IDOL1234 в 2.12.11 10:38 ]

 SERGK393:
02.12.11, 19:59
 IDOL1234, вообще-то textid_delete не существует, есть TextID_Destroy.
И некоторые переопределения уже есть в инклудах, такие как TEXTID, IMAGEID, EMPTY_TEXTID

 IDOL1234:
02.12.11, 22:17
 
вообще-то textid_delete не существует, есть TextID_Destroy

Ошибся, по памяти писал.
некоторые переопределения уже есть в инклудах, такие как TEXTID, IMAGEID, EMPTY_TEXTID

Хм... Посмотрим..

Помогите пожалуйста разобраться с механизмом реализации нажатия в OMAC'e. Я довёл его до компилируемого состояния (отключил месседжбоксы и отладку, исправил таймеры и хуки), но я не понимаю, для чего именно нужен хук (он же события отлавливает О_о), описаний некоторый инструкций в рунете я не нашёл.

Код:
Код: 
////////////////////////////////////////////////////////////////////////////////
//
// Opera Mini Accelerometer Control (OMAC)  -  main.c
//   (c) nkls 2010-2011
//
// 
// 
//
////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Includes
#include <Lib_Clara.h>
#include <Dll.h>
//#include <n_macros.h>       ------------------------------------------------------------------------------

#include "accelerometer_interface.h"

#include "..\Dlls\Accelerometer\export\AccelerometerDll.h"


////////////////////////////////////////////////////////////////////////////////
// Definitions
#define ELF_NAME             "OperaMini AccelControl"
#define ELF_VERSION          "v1.1" "Я"
#define ELF_AUTHOR           "nkls"

#define STR_ABOUT            ELF_NAME " " ELF_VERSION "\n" \
                             "© " ELF_AUTHOR          "\n" \
                                                      "\n" \
                             "build " __DATE__ " " __TIME__


////////////////////////////////////////////////////////////////////////////////
// Typedefs

typedef struct {
  BOOK * book;
  DISP_OBJ_ONCLOSE_METHOD defOnClose;
  DISP_OBJ_ONKEY_METHOD defOnKey;
}OM_HOOK_DATA;

typedef enum {
  SCROLL_NO_SCROLL=0,
  SCROLL_UP,
  SCROLL_DOWN,
  SCROLL_LEFT,
  SCROLL_RIGHT,
} SCROLL_MODE;

typedef struct {
  BOOK book;
  OM_HOOK_DATA * hook;
  ACCELEROMETER_DLL_DATA * acc_dll;
  u16 catch_timer;
  u16 acc_check_timer;
  u16 check_timer_retries;
  SCROLL_MODE scroll;

  int tilt;
  int catch_retry_count;
  bool isHorizontal;
  bool isTiltScrollActivated;
  bool usingz;
}OMAC_BOOK;


////////////////////////////////////////////////////////////////////////////////
// Method declarations
static void onCloseBook(BOOK * book);
void freeOMBookHook(OM_HOOK_DATA * omdata);
void onAccCheckTimer(u16, LPARAM data);
int onMainGotFocus(void * msg, BOOK * book, PAGE_DESC * page_desc, LPARAM _omacbook, u16);
int onMainLostFocus(void * msg, BOOK * book, PAGE_DESC * page_desc, LPARAM _omacbook, u16);


////////////////////////////////////////////////////////////////////////////////
// elf exit
void elf_exit(void){kill_data(&ELF_BEGIN, (void(*)(void*))mfree_adr());}


////////////////////////////////////////////////////////////////////////////////
// book methods
int isCUIDisplayableBook(BOOK * bk) {
  if(!strcmp(bk->xbook->name, "CUIDisplayableBook"))
    return 1;
  return 0;
}

int isOMBook(BOOK * bk) {
  if(!strcmp(bk->xbook->name, "CUIDisplayableBook")) {
    char s[32];
    TextID_GetString(BookObj_GetSession(bk)->name, s, MAXELEMS(s));
    if(!strcmp(s, "Opera Mini"))
      return 1;
  }
  return 0;
}

int isOurOMACBook(BOOK * bk) {
  if(bk->onClose == onCloseBook)
    return 1;
  return 0;
}

int isAnyOMACBook(BOOK * bk) {
  if(!strcmp(bk->xbook->name, ELF_NAME))
    return 1;
  return 0;
}

int isBook(BOOK * b, int * p) {
  return ((int*)b == p) ? 1 : 0;
}


bool BookExist(BOOK * book) {
  return (FindBookEx(isBook, (int*)book) != NULL);
}

inline GUI * BOOK_GetTopGUI(BOOK * b) {
  return (GUI*)List_Get(b->xguilist->guilist, 0);
}

////////////////////////////////////////////////////////////////////////////////
// Hook related methods and hooks
void myOMOnKey(DISP_OBJ * p, int key, int i2, int i3, int mode) {
  //DEBUG_PRINTF("\nmyOMOnKey(%X, %d, %d, %d, %d)\n", p, key, i2, i3, mode);     ------------------------------------------------------
  OMAC_BOOK * bk = (OMAC_BOOK*)FindBook(isOurOMACBook);
  if(bk) {
    if(key == KEY_DIGITAL_0 && mode == KBD_SHORT_PRESS) {
      if(bk->isTiltScrollActivated ^= 1) {
        int x, y, z;
        if(ACCELEROMETER_GetCoords(bk->acc_dll, &x, &y, &z, 1) >= 0) {
          int useaxis = (bk->isHorizontal)?x:y;
          if(z < useaxis) {
            bk->usingz = 1;
            bk->tilt = z;
          } else {
            bk->usingz = 0;
            bk->tilt = useaxis;
          }
        }
        else bk->isTiltScrollActivated = 0;
      } else {
        int send_key = -1;
        if(bk->scroll == SCROLL_DOWN)send_key = KEY_DOWN;
        else if(bk->scroll == SCROLL_UP)send_key = KEY_UP;
        else if(bk->scroll == SCROLL_LEFT)send_key = KEY_LEFT;
        else if(bk->scroll == SCROLL_RIGHT)send_key = KEY_RIGHT;
        if(send_key != -1)
        {

         bk->hook->defOnKey(p, send_key, i2, i3, KBD_LONG_RELEASE);
        }
      }
    }
    else

      bk->hook->defOnKey(p, key, i2, i3, mode);
  }
}

void myOMOnClose(DISP_OBJ * p) {
  //DEBUG_PRINTF("\nmyOMOnClose(%X)\n", p);   ------------------------------------------------------
  OMAC_BOOK * bk = (OMAC_BOOK*)FindBook(isOurOMACBook);
  if(bk) {
    bk->hook->defOnClose(p);
    //DEBUG_PRINTF("\nmyOMOnClose: releasing hook structure...\n");                        ------------------------------------------------------
    freeOMBookHook(bk->hook);
    bk->hook = NULL;
    if(ACCELEROMETER_IsOpen(bk->acc_dll))
      ACCELEROMETER_Close(bk->acc_dll);

    ModifyUIPageHook(MAIN_WINDOW_GOT_FOCUS_EVENT, onMainGotFocus, 0, PAGE_HOOK_REMOVE);
    ModifyUIPageHook(MAIN_WINDOW_LOST_FOCUS_EVENT, onMainLostFocus, 0, PAGE_HOOK_REMOVE);

    bk->isTiltScrollActivated = 0;
    if(bk->acc_check_timer)
      Timer_Kill(&bk->acc_check_timer);
  }
  //else CSTRMSG("Critical error! :,(");                         ------------------------------------------------------

 // DEBUG_PRINTF("\nmyOMOnClose: DONE!\n");                        ------------------------------------------------------
}


OM_HOOK_DATA * getOMBookHook(BOOK * ombook) {
  OM_HOOK_DATA * omdata = (OM_HOOK_DATA*)malloc(sizeof(OM_HOOK_DATA));
  memset(omdata, 0, sizeof(OM_HOOK_DATA));

  //DEBUG_PRINTF("\ngetOMBookHook: creating hook structure (%X)\n", omdata);                        ------------------------------------------------------
  
  omdata->book = ombook;

  GUI * gui = BOOK_GetTopGUI(ombook);
  if(gui) {
    DISP_OBJ * disp_obj = GUIObject_GetDispObject(gui);
    DISP_DESC * disp_desc = DispObject_GetDESC(disp_obj);

    omdata->defOnClose = DispObject_GetOnClose(disp_obj);
    if(omdata->defOnClose && omdata->defOnClose != myOMOnClose)
      DISP_DESC_SetOnClose(disp_desc, myOMOnClose);
    
    omdata->defOnKey = DispObject_GetOnKey(disp_obj);
    if(omdata->defOnKey && omdata->defOnKey != myOMOnKey)
      DISP_DESC_SetOnKey(disp_desc, myOMOnKey);
    
//    DEBUG_PRINTF("\ngetOMBookHook: filled in data structures OK\n", omdata);                        ------------------------------------------------------
    return omdata;
  }
  //DEBUG_PRINTF("\ngetOMBookHook: failed!\n", omdata);                        ------------------------------------------------------
  mfree(omdata);
  return NULL;
}


void freeOMBookHook(OM_HOOK_DATA * omdata) {
  //DEBUG_PRINTF("\nfreeOMBookHook: starting to reset hooks...\n", omdata);                        ------------------------------------------------------
  if(BookExist(omdata->book)) {
    GUI * gui = BOOK_GetTopGUI(omdata->book);
    if(gui) {
      DISP_OBJ * disp_obj = GUIObject_GetDispObject(gui);
      DISP_DESC * disp_desc = DispObject_GetDESC(disp_obj);
      DISP_OBJ_ONCLOSE_METHOD doc = DispObject_GetOnClose(disp_obj);
      if(doc == myOMOnClose)
        DISP_DESC_SetOnClose(disp_desc, omdata->defOnClose);
      
      DISP_OBJ_ONKEY_METHOD dok = DispObject_GetOnKey(disp_obj);
      if(dok == myOMOnKey)
        DISP_DESC_SetOnKey(disp_desc, omdata->defOnKey);

      ModifyUIPageHook(MAIN_WINDOW_GOT_FOCUS_EVENT, onMainGotFocus, 0, PAGE_HOOK_REMOVE);
      ModifyUIPageHook(MAIN_WINDOW_LOST_FOCUS_EVENT, onMainLostFocus, 0, PAGE_HOOK_REMOVE);
    }
  }
  //DEBUG_PRINTF("\nfreeOMBookHook: done, releasing hook structure...\n", omdata);                        ------------------------------------------------------
  mfree(omdata);
}


////////////////////////////////////////////////////////////////////////////////
// catch timer
void onCatchTimer(u16, LPARAM _omacbook) {
  BOOK * b;
  OMAC_BOOK * omacbook = (OMAC_BOOK*)_omacbook;
  if(omacbook) {
    if(b = FindBook(isOMBook)) {
      //DEBUG_PRINTF("\nonCatchTimer: found Opera Mini book! (%X)\n", b);                        ------------------------------------------------------
      omacbook->hook = getOMBookHook(b);
      if(omacbook->hook == NULL) {
//        DEBUG_PRINTF("\nonCatchTimer: could not hook, retrying in one second...\n", b);                        ------------------------------------------------------
        omacbook->catch_retry_count = 1;
        Timer_ReSet(&omacbook->catch_timer, 1000, onCatchTimer, omacbook);
      }
      else {
        //DEBUG_PRINTF("\nonCatchTimer: hooked ok, opening accelerometer handle...\n", b);                        ------------------------------------------------------
        omacbook->catch_retry_count = 0;
        omacbook->catch_timer = 0;
        if(!ACCELEROMETER_IsOpen(omacbook->acc_dll))
          ACCELEROMETER_Open(omacbook->acc_dll);
        Timer_ReSet(&omacbook->acc_check_timer, 1000, onAccCheckTimer, omacbook);

        ModifyUIPageHook(MAIN_WINDOW_GOT_FOCUS_EVENT, onMainGotFocus, (LPARAM)omacbook, 1);
        ModifyUIPageHook(MAIN_WINDOW_LOST_FOCUS_EVENT, onMainLostFocus, (LPARAM)omacbook, 1);
      }
    }
    else {
      omacbook->catch_retry_count--;
      //DEBUG_PRINTF("\nonCatchTimer: could not find Opera Mini book! (%d attempts left)\n", omacbook->catch_retry_count);                        ------------------------------------------------------
      if(omacbook->catch_retry_count > 0)
        Timer_ReSet(&omacbook->catch_timer, 1000, onCatchTimer, omacbook);
      else
        omacbook->catch_timer = 0;
    }
  }
}


////////////////////////////////////////////////////////////////////////////////
// Event hooks
int onSessionCreated(void * mess, BOOK * book) {
  OMAC_BOOK * omacbook = (OMAC_BOOK*)book;
//  DEBUG_PRINTF("\nELF: onSESSION_CREATED_EVENT\n");                        ------------------------------------------------------
  if(omacbook) {
    if(omacbook->hook)
      return 0;
    BOOK * b = FindBook(isCUIDisplayableBook);
    if(b) {
      char s[100];
      TextID_GetString(BookObj_GetSession(b)->name, s, MAXELEMS(s));
      //DEBUG_PRINTF("\nSESSION_CREATED_EVENT: %s\n", s);                        ------------------------------------------------------
      if(!strcmp(s, "SemcOjexInvoker")) {
        omacbook->catch_retry_count = 5;
        Timer_ReSet(&omacbook->catch_timer, 1000, onCatchTimer, omacbook);
      }
    }
  }
  return 0;
}

int onMainGotFocus(void * msg, BOOK * book, PAGE_DESC * page_desc, LPARAM _omacbook, u16) {
  OMAC_BOOK * omacbook = (OMAC_BOOK*)_omacbook;
  if(omacbook && omacbook->hook && !omacbook->acc_check_timer && omacbook->hook->book == book) {
    ACCELEROMETER_Open(omacbook->acc_dll);
    Timer_ReSet(&omacbook->acc_check_timer, 100, onAccCheckTimer, omacbook);
    //DEBUG_PRINTF("\nELF: resume OMAC\n");                        ------------------------------------------------------
  }
  return 0;
}

int onMainLostFocus(void * msg, BOOK * book, PAGE_DESC * page_desc, LPARAM _omacbook, u16) {
  OMAC_BOOK * omacbook = (OMAC_BOOK*)_omacbook;
  if(omacbook && omacbook->hook && omacbook->acc_check_timer && omacbook->hook->book == book) {
    Timer_Kill(&omacbook->acc_check_timer);
    ACCELEROMETER_Close(omacbook->acc_dll);
    //DEBUG_PRINTF("\nELF: pause OMAC\n");                        ----------------------------------------------
  }
  return 0;
}


////////////////////////////////////////////////////////////////////////////////
// Various methods
void ChangeMode(OMAC_BOOK * b) {
  if(b->hook) {
    DISP_OBJ_ONKEY_METHOD send = b->hook->defOnKey;
    GUI * gui = BOOK_GetTopGUI(b->hook->book);
    DISP_OBJ * dobj = GUIObject_GetDispObject(gui);
    send(dobj, KEY_STAR, 0, 1, KBD_SHORT_PRESS);
    send(dobj, KEY_STAR, 0, 1, KBD_SHORT_RELEASE);
    send(dobj, KEY_DIEZ, 0, 1, KBD_SHORT_PRESS);
    send(dobj, KEY_DIEZ, 0, 1, KBD_SHORT_RELEASE);
  }
}

void sendkey(OMAC_BOOK * b, int key, int mode) {
  //DEBUG_PRINTF("\nsendkey: %d\n", key);          --------------------------------------
  if(b->hook) {
    DISP_OBJ_ONKEY_METHOD send = b->hook->defOnKey;
    GUI * gui = BOOK_GetTopGUI(b->hook->book);
    DISP_OBJ * dobj = GUIObject_GetDispObject(gui);
    send(dobj, key, 0, 1, mode);
  }
}

void onAccCheckTimer(u16, LPARAM data) {
  OMAC_BOOK * b = (OMAC_BOOK*)data;
  int x, y, z;

  if(ACCELEROMETER_GetCoords(b->acc_dll, &x, &y, &z, 1) >= 0) {

    if(b->isTiltScrollActivated) {
      //change orientation?
      if(b->isHorizontal && x < 20 && y > 200 || !b->isHorizontal && y < 20 && x > 200) {
        b->isHorizontal = !b->isHorizontal;
        ChangeMode(b);
        // Delay, so that it won't change again within 1 second...
        Timer_ReSet(&b->acc_check_timer, 1000, onAccCheckTimer, data);
      }
      else {
        if(b->usingz) {
          if(b->isHorizontal)x = b->tilt - z;
          else               y = b->tilt - z;
        } else {
          if(b->isHorizontal)x -= b->tilt;
          else               y -= b->tilt;
        }
        
        x /= (18*2); // maybe not that optimal...
        y /= (18*2);
        
        if(x > 3) {
          if(b->scroll == SCROLL_NO_SCROLL || b->scroll == SCROLL_RIGHT) {
            sendkey(b, KEY_LEFT, KBD_SHORT_PRESS);
            b->scroll = SCROLL_LEFT;
          }
        }
        else if(x < -3) { // sensitivity difference as |a-b| != |b-a| ?
          if(b->scroll == SCROLL_NO_SCROLL || b->scroll == SCROLL_LEFT) {
            sendkey(b, KEY_RIGHT, KBD_SHORT_PRESS);
            b->scroll = SCROLL_RIGHT;
          }
        }
        else if(b->scroll == SCROLL_LEFT || b->scroll == SCROLL_RIGHT) {
          sendkey(b, (b->scroll==SCROLL_LEFT)?KEY_LEFT:KEY_RIGHT, KBD_LONG_RELEASE);
          b->scroll = SCROLL_NO_SCROLL;
        }
  
        if(y > 3) {
          if(b->scroll == SCROLL_NO_SCROLL || b->scroll == SCROLL_UP) {
            sendkey(b, KEY_DOWN, KBD_SHORT_PRESS);
            b->scroll = SCROLL_DOWN;
          }
        }
        else if(y < -3) { // sensitivity difference as |a-b| != |b-a| ?
          if(b->scroll == SCROLL_NO_SCROLL || b->scroll == SCROLL_DOWN) {
            sendkey(b, KEY_UP, KBD_SHORT_PRESS);
            b->scroll = SCROLL_UP;
          }
        }
        else if(b->scroll == SCROLL_DOWN || b->scroll == SCROLL_UP) {
          sendkey(b, (b->scroll==SCROLL_DOWN)?KEY_DOWN:KEY_UP, KBD_LONG_RELEASE);
          b->scroll = SCROLL_NO_SCROLL;
        }
      }
    }
    else { // (!b->isTiltScrollActivated)
      if(b->isHorizontal && y > 800 || !b->isHorizontal && x > 800) {
        b->isHorizontal = !b->isHorizontal;
        ChangeMode(b);
        // Delay, so that it won't change again within 1 second...
        Timer_ReSet(&b->acc_check_timer, 1000, onAccCheckTimer, data);
        return;
      }
    }
  } //else DEBUG_PRINTF("\nonAccCheckTimer: Could not get accelerometer data!\n");  ---------------------------------------------

  Timer_ReSet(&b->acc_check_timer, 200, onAccCheckTimer, data);
}


////////////////////////////////////////////////////////////////////////////////
// Page event methods
static int onTerminate(void *, BOOK * book) {
  FreeBook(book);
  return 1;
}

static int onAuthorInfo(void * mess, BOOK * book) {
  //CSTRMSGB(STR_ABOUT, *(BOOK**)mess);                        ------------------------------------------------------
  return 1;
}

////////////////////////////////////////////////////////////////////////////////
// Base page
const PAGE_MSG HW_PageEvents[] @ "DYN_PAGE" = {
  SESSION_CREATED_EVENT_TAG, onSessionCreated,
  ELF_TERMINATE_EVENT, onTerminate,
  ELF_SHOW_INFO_EVENT, onAuthorInfo,
  NIL_EVENT_TAG,       NULL
};

PAGE_DESC base_page ={"HW_BasePage", 0, HW_PageEvents};

////////////////////////////////////////////////////////////////////////////////
// Book methods
static void onCloseBook(BOOK * book) {
  OMAC_BOOK * omacbook = (OMAC_BOOK*)book;
  if(omacbook) {
    if(ACCELEROMETER_IsOpen(omacbook->acc_dll))
      ACCELEROMETER_Close(omacbook->acc_dll);

    ModifyUIPageHook(MAIN_WINDOW_GOT_FOCUS_EVENT, onMainGotFocus, 0, 0);
    ModifyUIPageHook(MAIN_WINDOW_LOST_FOCUS_EVENT, onMainLostFocus, 0, 0);
    
    UnLoadDLL(omacbook->acc_dll);
    if(omacbook->acc_check_timer)
      Timer_Kill(&omacbook->acc_check_timer);
    if(omacbook->catch_timer)
      Timer_Kill(&omacbook->catch_timer);
    if(omacbook->hook)
      freeOMBookHook(omacbook->hook);
    SUBPROC(elf_exit);
  }
}

static OMAC_BOOK * CreateOMACBook(void) {
  ACCELEROMETER_DLL_DATA * acc_dll = (ACCELEROMETER_DLL_DATA*)LoadDLL(L"accelerometer.dll");

  if(INVALID(acc_dll)) {
    //char s[100];
    //PRINTFMSG(s, "Failed to load accelerometer.dll! (DLL_ERROR=%d)", acc_dll); --------------------------------------------
    return NULL;
  }

  if(ACCELEROMETER_Version(acc_dll) < ACCELEROMETER_DLL_VERSION_NUMBER) {
    UnLoadDLL(acc_dll);
    //CSTRMSG("You are using an outdated accelerometer.dll!\n\n" ----------------------------------------------------------------
           // "Please update it to the latest version!");
    return NULL;
  }

  if(!ACCELEROMETER_IsPhoneSupported(acc_dll)) {
    UnLoadDLL(acc_dll);
    //CSTRMSG("Your phone model is not supported!"); -----------------------------------------------------------
    return NULL;
  }

  OMAC_BOOK * bk = (OMAC_BOOK*)malloc(sizeof(OMAC_BOOK));
  memset(bk, 0, sizeof(OMAC_BOOK));
  if(!CreateBook((BOOK*)bk, onCloseBook, &base_page, ELF_NAME, -1, 0)) {
    mfree(bk);
    return NULL;
  }
  bk->acc_dll = acc_dll;
  
  onSessionCreated(0, (BOOK*)bk); // Attempt to find already existing Opera Mini instance
  
  return bk;
}


////////////////////////////////////////////////////////////////////////////////
// Main method

int main(void) {
  if(FindBook(isAnyOMACBook))
  {
//    CSTRMSG("Already running!");                        ------------------------------------------------------
  }
  else if(CreateOMACBook())
    return 0;
  SUBPROC(elf_exit);
  return 0;
}


В частности, что это за метод такой?
Код:
  if(b->hook) {
    DISP_OBJ_ONKEY_METHOD send = b->hook->defOnKey;
...


"1" - это add_before или add_after?
Код:
ModifyUIPageHook(MAIN_WINDOW_GOT_FOCUS_EVENT, onMainGotFocus, (LPARAM)omacbook, 1);


О_о
Код:
  DISP_OBJ_ONCLOSE_METHOD defOnClose;
  DISP_OBJ_ONKEY_METHOD defOnKey;



[ Редактировано IDOL1234 в 2.12.11 22:27 ]

 D3mon:
02.12.11, 23:58
 IDOL1234, писал:
"1" - это add_before или add_after?
Код:
ModifyUIPageHook(MAIN_WINDOW_GOT_FOCUS_EVENT, onMainGotFocus, (LPARAM)omacbook, 1);


ответ на этот вопрос можно найти в types.h:
Код:
typedef enum PAGE_HOOK_MODE
{
    PAGE_HOOK_REMOVE=0,
    PAGE_HOOK_ADD_BEFORE,
    PAGE_HOOK_ADD_AFTER
}PAGE_HOOK_MODE;


Советую внимательно поизучать этот файл, можно много чего интересного найти!

 IDOL1234:
03.12.11, 13:04
 

ответ на этот вопрос можно найти в types.h:

Эмм. Я это видел. Так нет ведь значений!
0 я заменил на PAGE_HOOK_REMOVE, а с остальными не разобрался.

 Pavlus:
03.12.11, 14:06
 Там значения автоматически подставляются. Почитай учебник по Си.

 SERGK393:
03.12.11, 15:20
 
IDOL1234 пишет:
В частности, что это за метод такой?
Код:
  if(b->hook) {
    DISP_OBJ_ONKEY_METHOD send = b->hook->defOnKey;
...


О_о
Код:
  DISP_OBJ_ONCLOSE_METHOD defOnClose;
  DISP_OBJ_ONKEY_METHOD defOnKey;

Код:
  if(b->hook) {
    DISP_OBJ_ONKEY_METHOD send = b->hook->defOnKey;
...

Он находит стандартный метод нажатия клавиш

Код:
  DISP_OBJ_ONCLOSE_METHOD defOnClose;

Метод при закрытии
Код:
DISP_OBJ_ONKEY_METHOD defOnKey;

Метод при нажатии клавиш
Страница 193 из 211: « 1 ... 189 190 191 192 [193] 194 195 196 197 ... 211 »

URL этой темы:
https://mobilefree.justdanpo.ru/newbb_plus/viewtopic.php?topic_id=2479&start=1920

© 2005-2018 supertrubka.org