void _libaroma_ctl_fragment_measure(LIBAROMA_WINDOWP win){
  _VALIDATE_FRAGMENT();
  libaroma_mutex_lock(me->dmutex);
  win->x = 0;
  win->y = 0;
  win->ax=ctl->x;
  win->ay=ctl->y;
  win->w = ctl->w;
  win->h = ctl->h;
  if (win->dc){
    if ((win->dc->w!=win->w)||(win->dc->h!=win->h)){
      libaroma_canvas_free(win->dc);
      win->dc=NULL;
    }
  }
  if (!win->dc){
    win->dc = libaroma_canvas(
      win->w,
      win->h
    );
  }
  _libaroma_ctl_fragment_window_updatebg(win);
  int i;
  #ifdef LIBAROMA_CONFIG_OPENMP
    #pragma omp parallel for
  #endif
  for (i=0;i<win->childn;i++){
    libaroma_window_measure(win,win->childs[i]);
  }
  libaroma_mutex_unlock(me->dmutex);
}
Esempio n. 2
0
/*
 * Function    : libaroma_window_add
 * Return Value: byte
 * Descriptions: add control into window
 */
byte libaroma_window_add(
  LIBAROMA_WINDOWP win,
  LIBAROMA_CONTROLP ctl
){
  __CHECK_WM(0);
  if (win==NULL){
    ALOGW("window_add win is NULL");
    return 0;
  }
  if (ctl==NULL){
    ALOGW("window_add ctl is NULL");
    return 0;
  }
  if (ctl->window != NULL){
    ALOGW("window_add ctl already have window");
    return 0;
  }
  libaroma_window_measure(win, ctl);
  if (win->childn==0){
    win->childs = (LIBAROMA_CONTROLP *) malloc(sizeof(LIBAROMA_CONTROLP));
    if (!win->childs){
      ALOGW("window_add malloc failed");
      win->childs=NULL;
      return 0;
    }
    win->childs[0]=ctl;
  }
  else{
    LIBAROMA_CONTROLP * newchilds = (LIBAROMA_CONTROLP *)
      realloc(win->childs, sizeof(LIBAROMA_CONTROLP)*(win->childn+1));
    if (!newchilds){
      ALOGW("window_add realloc failed");
      return 0;
    }
    win->childs = newchilds;
    win->childs[win->childn] = ctl;
  }
  ctl->window = win;
  win->childn++;
  _libaroma_window_recalculate(win);
  return 1;
} /* End of libaroma_window_add */
Esempio n. 3
0
/*
 * Function    : libaroma_window_process_event
 * Return Value: dword
 * Descriptions: process message
 */
dword libaroma_window_process_event(LIBAROMA_WINDOWP win, LIBAROMA_MSGP msg){
  __CHECK_WM(0);
  if (win==NULL){
    ALOGW("window_event win is null");
    return 0;
  }
  if (win->parent!=NULL){
    ALOGW("window_event cannot used for child window...");
    return 0;
  }
  dword ret = 0;
  if (win->handler){
    if (win->handler->message_hooker){
      if (win->handler->message_hooker(win,msg,&ret)){
        return ret;
      }
    }
  }
  switch (msg->msg){
    case LIBAROMA_MSG_WIN_ACTIVE:
      {
          /* set current window size */
        if (msg->x!=10){
          _libaroma_window_ready(win);
        }
        if ((!win->lock_sync)||(msg->x==10)){
          if ((!win->active)||(msg->x==10)){
            int i;
            win->active=1;
            
            /* signal child */
            for (i=0;i<win->childn;i++){
              if (win->childs[i]->handler->message){
                win->childs[i]->handler->message(win->childs[i], msg);
              }
            }
          }
        }
      }
      break;
    case LIBAROMA_MSG_WIN_RESIZE:
      {
        int i;
        _libaroma_window_ready(win);
        for (i=0;i<win->childn;i++){
          if (win->childs[i]->handler->message){
            win->childs[i]->handler->message(win->childs[i], msg);
          }
        }
      }
      break;
    case LIBAROMA_MSG_WIN_INACTIVE:
      {
        if (win->active){
          /* stop thread manager */
          win->active=0;
          
          /* send inactive message to child */
          int i;
          for (i=0;i<win->childn;i++){
            if (win->childs[i]->handler->message){
              win->childs[i]->handler->message(win->childs[i], msg);
            }
          }
        }
      }
      break;
    case LIBAROMA_MSG_WIN_MEASURED:
      {
        /* remeasured all childs */
        int i;
        for (i=0;i<win->childn;i++){
          libaroma_window_measure(win,win->childs[i]);
        }
      }
      break;
    case LIBAROMA_MSG_WIN_DIRECTMSG:
      {
        return (dword) msg->x;
      }
      break;
    case LIBAROMA_MSG_WIN_INVALIDATE:
      {
        libaroma_window_invalidate(win, 1);
      }
      break;
    case LIBAROMA_MSG_TOUCH:
      {
        /* touch handler */
        if (msg->state==LIBAROMA_HID_EV_STATE_DOWN){
          win->touched = NULL;
          int x = msg->x;
          int y = msg->y;
          libaroma_window_calculate_pos(win,NULL,&x,&y);
          int i;
          for (i=0;i<win->childn;i++){
            if (_libaroma_window_is_inside(win->childs[i],x,y)){
              win->touched = win->childs[i];
              break;
            }
          }
          if (win->touched!=NULL){
            if (win->touched->handler->message){
              ret=win->touched->handler->message(win->touched, msg);
            }
          } 
        }
        else if (win->touched!=NULL){
          if (msg->state==LIBAROMA_HID_EV_STATE_MOVE){
            if (win->touched->handler->message){
              ret=win->touched->handler->message(win->touched, msg);
            }
          }
          else if (msg->state==LIBAROMA_HID_EV_STATE_UP){
            if (win->touched->handler->message){
              ret=win->touched->handler->message(win->touched, msg);
            }
            win->touched=NULL;
          }
        }
      }
      break;
  }
  return ret;
} /* End of libaroma_window_process_event */