Subversion Repositories Kolibri OS

Rev

Rev 4438 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1.  
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include "winlib.h"
  6.  
  7. #define CAPTION_CORNER_W    8
  8.  
  9. extern int res_caption_left[];
  10. extern int res_caption_right[];
  11. extern int res_caption_body[];
  12.  
  13. extern int res_close_btn[];
  14. extern int res_close_btn_hl[];
  15. extern int res_close_btn_pressed[];
  16.  
  17. extern int res_minimize_btn[];
  18. extern int res_minimize_btn_hl[];
  19. extern int res_minimize_btn_pressed[];
  20.  
  21. extern int res_full_btn[];
  22. extern int res_full_btn_hl[];
  23. extern int res_full_btn_pressed[];
  24.  
  25. extern uint32_t main_cursor;
  26.  
  27. void update_caption_size(window_t *win);
  28.  
  29. int caption_proc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2);
  30.  
  31.  
  32. int init_caption(window_t *win)
  33. {
  34.     button_t  *btn;
  35.  
  36.     caption_t *cpt = &win->caption;
  37.     ctx_t     *ctx = &cpt->ctx;
  38.  
  39.     link_initialize(&cpt->ctrl.link);
  40.     list_initialize(&cpt->ctrl.child);
  41.  
  42.     cpt->ctrl.handler = caption_proc;
  43.     cpt->ctrl.parent  = (ctrl_t*)win;
  44.  
  45.     cpt->text = win->caption_txt;
  46.  
  47.     ctx->pixmap_data = user_alloc(1920*CAPTION_HEIGHT*4);
  48.     ctx->pixmap_pitch= 1920*4;
  49.     ctx->offset_x = 0;
  50.     ctx->offset_y = 0;
  51.  
  52.     cpt->ctrl.ctx = ctx;
  53.  
  54.     btn = create_button(NULL, ID_CLOSE,0,5,18,18,(ctrl_t*)cpt);
  55.     cpt->close_btn = btn;
  56.  
  57.     btn->img_default = res_close_btn;
  58.     btn->img_hilite  = res_close_btn_hl;
  59.     btn->img_pressed = res_close_btn_pressed;
  60.  
  61.     btn = create_button(NULL, ID_MINIMIZE,0,5,18,18,(ctrl_t*)cpt);
  62.     cpt->minimize_btn = btn;
  63.  
  64.     btn->img_default = res_minimize_btn;
  65.     btn->img_hilite  = res_minimize_btn_hl;
  66.     btn->img_pressed = res_minimize_btn_pressed;
  67.  
  68.     btn = create_button(NULL, ID_FULLSCREEN,0,5,18,18,(ctrl_t*)cpt);
  69.     cpt->full_btn = btn;
  70.  
  71.     btn->img_default = res_full_btn;
  72.     btn->img_hilite  = res_full_btn_hl;
  73.     btn->img_pressed = res_full_btn_pressed;
  74.  
  75.     update_caption_size(win);
  76.  
  77.     return 1;
  78. };
  79.  
  80.  
  81. void update_caption_size(window_t *win)
  82. {
  83.     caption_t *cpt = &win->caption;
  84.     ctx_t     *ctx = &cpt->ctx;
  85.  
  86.     ctx->pixmap_pitch = win->w * 4;
  87.  
  88.     cpt->ctrl.rc.l    = 0;
  89.     cpt->ctrl.rc.t    = 0;
  90.     cpt->ctrl.rc.r    = win->w;
  91.     cpt->ctrl.rc.b    = CAPTION_HEIGHT;
  92.     cpt->ctrl.w       = win->w;
  93.     cpt->ctrl.h       = CAPTION_HEIGHT;
  94.     win->client.t     = CAPTION_HEIGHT;
  95.  
  96.     cpt->close_btn->ctrl.rc.l = win->w - 27;
  97.     cpt->close_btn->ctrl.rc.r = cpt->close_btn->ctrl.rc.l +
  98.                            cpt->close_btn->ctrl.w;
  99.  
  100.     cpt->minimize_btn->ctrl.rc.l = win->w - 27 - 18 - 5;
  101.     cpt->minimize_btn->ctrl.rc.r = cpt->minimize_btn->ctrl.rc.l +
  102.                            cpt->minimize_btn->ctrl.w;
  103.  
  104.     cpt->full_btn->ctrl.rc.l = win->w - 27 - 18 -18 - 5 - 5;
  105.     cpt->full_btn->ctrl.rc.r = cpt->full_btn->ctrl.rc.l +
  106.                            cpt->full_btn->ctrl.w;
  107. };
  108.  
  109. extern int win_font;
  110.  
  111. void draw_caption(caption_t *cpt)
  112. {
  113.     ctx_t  *ctx = &cpt->ctx;
  114.     int    *pixmap, *src;
  115.     rect_t  rc;
  116.     int     i, j, w;
  117.  
  118.     blit_raw(ctx, res_caption_left, 0, 0,
  119.              CAPTION_CORNER_W, CAPTION_HEIGHT, CAPTION_CORNER_W*4);
  120.  
  121.     w = cpt->ctrl.w - (2*CAPTION_CORNER_W);
  122.     if( w > 0)
  123.     {
  124.         pixmap = (int*)ctx->pixmap_data;
  125.         pixmap+= CAPTION_CORNER_W;
  126.         src = res_caption_body;
  127.  
  128.         for(i = 0; i < CAPTION_HEIGHT; i++)
  129.         {
  130.             for(j = 0; j < w; j++)
  131.                 pixmap[j] = src[i];
  132.             pixmap+= ctx->pixmap_pitch/4;
  133.         }
  134.     };
  135.  
  136.     blit_raw(ctx,res_caption_right, cpt->ctrl.w - CAPTION_CORNER_W, 0,
  137.              CAPTION_CORNER_W, CAPTION_HEIGHT,CAPTION_CORNER_W*4);
  138.  
  139.     rc.l = 8;
  140.     rc.t = 0;
  141.     rc.r = cpt->ctrl.w - 27 - 18 - 18 - 5 - 5 - 8;
  142.     rc.b = 18;
  143.  
  144.     draw_text_ext(ctx->pixmap_data, ctx->pixmap_pitch, win_font, cpt->text, &rc, 0xFFFFFFFF);
  145.  
  146.     ctrl_t *child;
  147.     child  = (ctrl_t*)cpt->ctrl.child.next;
  148.  
  149.     while( &child->link != &cpt->ctrl.child)
  150.     {
  151.         send_message(child, 1, 0, 0);
  152.         child = (ctrl_t*)child->link.next;
  153.     };
  154. };
  155.  
  156.  
  157. int caption_proc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2)
  158. {
  159.     caption_t *cpt = (caption_t*)ctrl;
  160.     window_t *win  = (window_t*)ctrl->parent;
  161.  
  162.     ctrl_t *child;
  163.     int x, y;
  164.  
  165.     x = ((pos_t)arg2).x;
  166.     y = ((pos_t)arg2).y;
  167.  
  168.     switch( msg )
  169.     {
  170.         case 1:
  171.             break;
  172.  
  173.  
  174.         case MSG_MOUSEMOVE:
  175.             child = get_child(ctrl, x, y);
  176.             if( win->child_over )
  177.             {
  178.                 if(child == win->child_over)
  179.                     send_message(child, msg, 0, arg2);
  180.                 else
  181.                     send_message(win->child_over, MSG_MOUSELEAVE, 0, arg2);
  182.             };
  183.  
  184.             win->child_over = child;
  185.             if( child )
  186.             {
  187.                 send_message(child, MSG_MOUSEENTER, 0, arg2);
  188.                 send_message(child,msg,0,arg2);
  189.             }
  190.             else if(main_cursor != 0)
  191.             {
  192.                 set_cursor(0);
  193.                 main_cursor = 0;
  194.             }
  195.             break;
  196.  
  197.  
  198.         case MSG_COMMAND:
  199.             switch((short)arg1)
  200.             {
  201.                 case ID_CLOSE:
  202.                     win->win_command = WIN_CLOSED;
  203.                     break;
  204.  
  205.                 case ID_MINIMIZE:
  206.                     __asm__ __volatile__(
  207.                     "int $0x40"
  208.                     ::"a"(18),"b"(10));
  209.                     win->win_state = MINIMIZED;
  210.                     send_message((ctrl_t*)win, MSG_SIZE, 0, 0);
  211.                     break;
  212.                 case ID_FULLSCREEN:
  213.                 {
  214.                     int screensize;
  215.  
  216.                     win->saved = win->rc;
  217.                     win->saved_state = win->win_state;
  218.                     screensize = GetScreenSize();
  219.                     __asm__ __volatile__(
  220.                     "int $0x40"
  221.                     ::"a"(67), "b"(0), "c"(0),
  222.                     "d"((screensize >> 16)-1),"S"((screensize & 0xFFFF)-1) );
  223.                     win->win_state = FULLSCREEN;
  224.                     window_update_layout(win);
  225.                 };
  226.                     break;
  227.  
  228.                 default:
  229.                     break;
  230.             };
  231.  
  232.         default:
  233.             child = get_child(ctrl, x, y);
  234.             if(child)
  235.                 return send_message(child, msg, 0, arg2);
  236.     }
  237.     return 1;
  238. };
  239.  
  240.  
  241.  
  242. void blit_caption(caption_t *cpt)
  243. {
  244. //    printf("%s w:%d h:%d stride: %d\n",__FUNCTION__,
  245. //            cpt->ctrl.w, cpt->ctrl.h, cpt->ctx.stride);
  246.  
  247.  
  248.     Blit(cpt->ctx.pixmap_data, 0, 0, 0, 0, cpt->ctrl.w, cpt->ctrl.h,
  249.          cpt->ctrl.w, cpt->ctrl.h, cpt->ctx.pixmap_pitch);
  250. };
  251.  
  252.