0,0 → 1,272 |
|
#include <stdlib.h> |
#include <string.h> |
#include <stdio.h> |
#include "winlib.h" |
|
#define CAPTION_CORNER_W 8 |
|
extern int res_caption_left[]; |
extern int res_caption_right[]; |
extern int res_caption_body[]; |
|
extern int res_close_btn[]; |
extern int res_close_btn_hl[]; |
extern int res_close_btn_pressed[]; |
|
extern int res_minimize_btn[]; |
extern int res_minimize_btn_hl[]; |
extern int res_minimize_btn_pressed[]; |
|
extern int res_full_btn[]; |
extern int res_full_btn_hl[]; |
extern int res_full_btn_pressed[]; |
|
extern uint32_t main_cursor; |
|
void update_caption_size(window_t *win); |
|
int caption_proc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2); |
|
|
int init_caption(window_t *win) |
{ |
button_t *btn; |
|
caption_t *cpt = &win->caption; |
ctx_t *ctx = &cpt->ctx; |
|
link_initialize(&cpt->ctrl.link); |
list_initialize(&cpt->ctrl.child); |
|
cpt->ctrl.handler = caption_proc; |
cpt->ctrl.parent = (ctrl_t*)win; |
|
cpt->text = win->caption_txt; |
|
cpt->bitmap.width = 1920; |
cpt->bitmap.height = CAPTION_HEIGHT; |
cpt->bitmap.flags = 0; |
|
if( create_bitmap(&cpt->bitmap) ) |
{ |
printf("not enough memory for caption bitmap\n"); |
return 0; |
} |
|
|
// printf("win_w %d win_h %d\n", win->w, win->h); |
ctx->pixmap = &cpt->bitmap; |
ctx->offset_x = 0; |
ctx->offset_y = 0; |
|
cpt->ctrl.ctx = ctx; |
|
btn = create_button(NULL, ID_CLOSE,0,5,18,18,(ctrl_t*)cpt); |
cpt->close_btn = btn; |
|
btn->img_default = res_close_btn; |
btn->img_hilite = res_close_btn_hl; |
btn->img_pressed = res_close_btn_pressed; |
|
btn = create_button(NULL, ID_MINIMIZE,0,5,18,18,(ctrl_t*)cpt); |
cpt->minimize_btn = btn; |
|
btn->img_default = res_minimize_btn; |
btn->img_hilite = res_minimize_btn_hl; |
btn->img_pressed = res_minimize_btn_pressed; |
|
btn = create_button(NULL, ID_FULLSCREEN,0,5,18,18,(ctrl_t*)cpt); |
cpt->full_btn = btn; |
|
btn->img_default = res_full_btn; |
btn->img_hilite = res_full_btn_hl; |
btn->img_pressed = res_full_btn_pressed; |
|
update_caption_size(win); |
|
return 1; |
}; |
|
|
void update_caption_size(window_t *win) |
{ |
caption_t *cpt = &win->caption; |
bitmap_t *bitmap = &cpt->bitmap; |
|
bitmap->width = win->w; |
resize_bitmap(bitmap); |
|
cpt->ctrl.rc.l = 0; |
cpt->ctrl.rc.t = 0; |
cpt->ctrl.rc.r = win->w; |
cpt->ctrl.rc.b = CAPTION_HEIGHT; |
cpt->ctrl.w = win->w; |
cpt->ctrl.h = CAPTION_HEIGHT; |
win->client.t = CAPTION_HEIGHT; |
|
cpt->close_btn->ctrl.rc.l = win->w - 27; |
cpt->close_btn->ctrl.rc.r = cpt->close_btn->ctrl.rc.l + |
cpt->close_btn->ctrl.w; |
|
cpt->minimize_btn->ctrl.rc.l = win->w - 27 - 18 - 5; |
cpt->minimize_btn->ctrl.rc.r = cpt->minimize_btn->ctrl.rc.l + |
cpt->minimize_btn->ctrl.w; |
|
cpt->full_btn->ctrl.rc.l = win->w - 27 - 18 -18 - 5 - 5; |
cpt->full_btn->ctrl.rc.r = cpt->full_btn->ctrl.rc.l + |
cpt->full_btn->ctrl.w; |
|
}; |
|
|
extern int win_font; |
|
void draw_caption(caption_t *cpt) |
{ |
int *pixmap, *src; |
rect_t rc; |
int i, j, w; |
|
lock_bitmap(&cpt->bitmap); |
|
blit_raw(&cpt->ctx, res_caption_left, 0, 0, |
CAPTION_CORNER_W, CAPTION_HEIGHT, CAPTION_CORNER_W*4); |
|
w = cpt->ctrl.w - (2*CAPTION_CORNER_W); |
if( w > 0) |
{ |
pixmap = (int*)cpt->ctx.pixmap->data; |
pixmap+= CAPTION_CORNER_W; |
src = res_caption_body; |
|
for(i = 0; i < CAPTION_HEIGHT; i++) |
{ |
for(j = 0; j < w; j++) |
pixmap[j] = src[i]; |
pixmap+= cpt->ctx.pixmap->pitch/4; |
} |
|
// blit_raw(&cpt->ctx,res_caption_body, CAPTION_CORNER_W, 0, |
// w, CAPTION_HEIGHT, 0); |
|
}; |
|
|
blit_raw(&cpt->ctx,res_caption_right, cpt->ctrl.w - CAPTION_CORNER_W, 0, |
CAPTION_CORNER_W, CAPTION_HEIGHT,CAPTION_CORNER_W*4); |
|
rc.l = 8; |
rc.t = 0; |
rc.r = cpt->ctrl.w - 27 - 18 - 18 - 5 - 5 - 8; |
rc.b = 18; |
|
draw_text_ext(cpt->ctx.pixmap, win_font, cpt->text, &rc, 0xFFFFFFFF); |
|
ctrl_t *child; |
child = (ctrl_t*)cpt->ctrl.child.next; |
|
while( &child->link != &cpt->ctrl.child) |
{ |
send_message(child, 1, 0, 0); |
child = (ctrl_t*)child->link.next; |
}; |
}; |
|
|
int caption_proc(ctrl_t *ctrl, uint32_t msg, uint32_t arg1, uint32_t arg2) |
{ |
caption_t *cpt = (caption_t*)ctrl; |
window_t *win = (window_t*)ctrl->parent; |
|
ctrl_t *child; |
int x, y; |
|
x = ((pos_t)arg2).x; |
y = ((pos_t)arg2).y; |
|
switch( msg ) |
{ |
case 1: |
break; |
|
|
case MSG_MOUSEMOVE: |
child = get_child(ctrl, x, y); |
if( win->child_over ) |
{ |
if(child == win->child_over) |
send_message(child, msg, 0, arg2); |
else |
send_message(win->child_over, MSG_MOUSELEAVE, 0, arg2); |
}; |
|
win->child_over = child; |
if( child ) |
{ |
send_message(child, MSG_MOUSEENTER, 0, arg2); |
send_message(child,msg,0,arg2); |
} |
else if(main_cursor != 0) |
{ |
set_cursor(0); |
main_cursor = 0; |
} |
break; |
|
|
case MSG_COMMAND: |
switch((short)arg1) |
{ |
case ID_CLOSE: |
win->win_command = WIN_CLOSED; |
break; |
|
case ID_MINIMIZE: |
__asm__ __volatile__( |
"int $0x40" |
::"a"(18),"b"(10)); |
win->win_state = MINIMIZED; |
send_message((ctrl_t*)win, MSG_SIZE, 0, 0); |
break; |
case ID_FULLSCREEN: |
{ |
int screensize; |
|
win->saved = win->rc; |
win->saved_state = win->win_state; |
screensize = GetScreenSize(); |
__asm__ __volatile__( |
"int $0x40" |
::"a"(67), "b"(0), "c"(0), |
"d"((screensize >> 16)-1),"S"((screensize & 0xFFFF)-1) ); |
win->win_state = FULLSCREEN; |
window_update_layout(win); |
}; |
break; |
|
default: |
break; |
}; |
|
default: |
child = get_child(ctrl, x, y); |
if(child) |
return send_message(child, msg, 0, arg2); |
} |
return 1; |
}; |
|
|
|
void blit_caption(caption_t *cpt) |
{ |
// printf("%s w:%d h:%d stride: %d\n",__FUNCTION__, |
// cpt->ctrl.w, cpt->ctrl.h, cpt->ctx.stride); |
|
lock_bitmap(&cpt->bitmap); |
|
Blit(cpt->ctx.pixmap->data, 0, 0, 0, 0, cpt->ctrl.w, cpt->ctrl.h, |
cpt->ctrl.w, cpt->ctrl.h, cpt->ctx.pixmap->pitch); |
}; |
|