Subversion Repositories HelenOS-historic

Rev

Rev 1640 | Rev 1648 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1640 Rev 1646
Line 80... Line 80...
80
    /* Auto-cursor position */
80
    /* Auto-cursor position */
81
    int cursor_active, cur_col, cur_row;
81
    int cursor_active, cur_col, cur_row;
82
    int cursor_shown;
82
    int cursor_shown;
83
} viewport_t;
83
} viewport_t;
84
 
84
 
-
 
85
#define MAX_ANIM_LEN    8
-
 
86
#define MAX_ANIMATIONS  4
-
 
87
typedef struct {
-
 
88
    int initialized;
-
 
89
    int enabled;
-
 
90
    unsigned int vp;
-
 
91
 
-
 
92
    unsigned int pos;
-
 
93
    unsigned int animlen;
-
 
94
    unsigned int pixmaps[MAX_ANIM_LEN];
-
 
95
} animation_t;
-
 
96
static animation_t animations[MAX_ANIMATIONS];
-
 
97
static int anims_enabled;
-
 
98
 
85
/** Maximum number of saved pixmaps
99
/** Maximum number of saved pixmaps
86
 * Pixmap is a saved rectangle
100
 * Pixmap is a saved rectangle
87
 */
101
 */
88
#define MAX_PIXMAPS        256
102
#define MAX_PIXMAPS        256
89
typedef struct {
103
typedef struct {
Line 318... Line 332...
318
static int viewport_create(unsigned int x, unsigned int y,unsigned int width,
332
static int viewport_create(unsigned int x, unsigned int y,unsigned int width,
319
               unsigned int height)
333
               unsigned int height)
320
{
334
{
321
    int i;
335
    int i;
322
 
336
 
323
for (i=0; i < MAX_VIEWPORTS; i++) {
337
    for (i=0; i < MAX_VIEWPORTS; i++) {
324
        if (!viewports[i].initialized)
338
        if (!viewports[i].initialized)
325
            break;
339
            break;
326
    }
340
    }
327
    if (i == MAX_VIEWPORTS)
341
    if (i == MAX_VIEWPORTS)
328
        return ELIMIT;
342
        return ELIMIT;
Line 699... Line 713...
699
        memcpy(screen.fbaddress + tmp, pmap->data + y * srcrowsize, realrowsize);
713
        memcpy(screen.fbaddress + tmp, pmap->data + y * srcrowsize, realrowsize);
700
    }
714
    }
701
    return 0;
715
    return 0;
702
}
716
}
703
 
717
 
-
 
718
/** Tick animation one step forward */
-
 
719
static void anims_tick(void)
-
 
720
{
-
 
721
    int i;
-
 
722
    static int counts = 0;
-
 
723
   
-
 
724
    /* Limit redrawing */
-
 
725
    counts = (counts+1) % 8;
-
 
726
    if (counts)
-
 
727
        return;
-
 
728
 
-
 
729
    for (i=0; i < MAX_ANIMATIONS; i++) {
-
 
730
        if (!animations[i].animlen || !animations[i].initialized || !animations[i].enabled)
-
 
731
            continue;
-
 
732
        draw_pixmap(animations[i].vp, animations[i].pixmaps[animations[i].pos]);
-
 
733
        animations[i].pos = (animations[i].pos+1) % animations[i].animlen;
-
 
734
    }
-
 
735
}
-
 
736
 
-
 
737
static int anim_handle(ipc_callid_t callid, ipc_call_t *call, int vp)
-
 
738
{
-
 
739
    int handled = 1;
-
 
740
    int retval = 0;
-
 
741
    int i,nvp;
-
 
742
    int newval;
-
 
743
 
-
 
744
    switch (IPC_GET_METHOD(*call)) {
-
 
745
    case FB_ANIM_CREATE:
-
 
746
        nvp = IPC_GET_ARG1(*call);
-
 
747
        if (nvp == -1)
-
 
748
            nvp = vp;
-
 
749
        if (nvp >= MAX_VIEWPORTS || nvp < 0 || !viewports[nvp].initialized) {
-
 
750
            retval = EINVAL;
-
 
751
            break;
-
 
752
        }
-
 
753
        for (i=0; i < MAX_ANIMATIONS; i++) {
-
 
754
            if (! animations[i].initialized)
-
 
755
                break;
-
 
756
        }
-
 
757
        if (i == MAX_ANIMATIONS) {
-
 
758
            retval = ELIMIT;
-
 
759
            break;
-
 
760
        }
-
 
761
        animations[i].initialized = 1;
-
 
762
        animations[i].animlen = 0;
-
 
763
        animations[i].pos = 0;
-
 
764
        animations[i].enabled = 0;
-
 
765
        animations[i].vp = nvp;
-
 
766
        retval = i;
-
 
767
        break;
-
 
768
    case FB_ANIM_DROP:
-
 
769
        i = IPC_GET_ARG1(*call);
-
 
770
        if (nvp >= MAX_ANIMATIONS || i < 0) {
-
 
771
            retval = EINVAL;
-
 
772
            break;
-
 
773
        }
-
 
774
        animations[i].initialized = 0;
-
 
775
        break;
-
 
776
    case FB_ANIM_ADDPIXMAP:
-
 
777
        i = IPC_GET_ARG1(*call);
-
 
778
        if (i >= MAX_ANIMATIONS || i < 0 || !animations[i].initialized) {
-
 
779
            retval = EINVAL;
-
 
780
            break;
-
 
781
        }
-
 
782
        if (animations[i].animlen == MAX_ANIM_LEN) {
-
 
783
            retval = ELIMIT;
-
 
784
            break;
-
 
785
        }
-
 
786
        newval = IPC_GET_ARG2(*call);
-
 
787
        if (newval < 0 || newval > MAX_PIXMAPS || !pixmaps[newval].data) {
-
 
788
            retval = EINVAL;
-
 
789
            break;
-
 
790
        }
-
 
791
        animations[i].pixmaps[animations[i].animlen++] = newval;
-
 
792
        break;
-
 
793
    case FB_ANIM_CHGVP:
-
 
794
        i = IPC_GET_ARG1(*call);
-
 
795
        if (i >= MAX_ANIMATIONS || i < 0) {
-
 
796
            retval = EINVAL;
-
 
797
            break;
-
 
798
        }
-
 
799
        nvp = IPC_GET_ARG2(*call);
-
 
800
        if (nvp == -1)
-
 
801
            nvp = vp;
-
 
802
        if (nvp >= MAX_VIEWPORTS || nvp < 0 || !viewports[nvp].initialized) {
-
 
803
            retval = EINVAL;
-
 
804
            break;
-
 
805
        }
-
 
806
        animations[i].vp = nvp;
-
 
807
        break;
-
 
808
    case FB_ANIM_START:
-
 
809
    case FB_ANIM_STOP:
-
 
810
        i = IPC_GET_ARG1(*call);
-
 
811
        if (i >= MAX_ANIMATIONS || i < 0) {
-
 
812
            retval = EINVAL;
-
 
813
            break;
-
 
814
        }
-
 
815
        newval = (IPC_GET_METHOD(*call) == FB_ANIM_START);
-
 
816
        if (newval ^ animations[i].enabled) {
-
 
817
            animations[i].enabled = newval;
-
 
818
            anims_enabled += newval ? 1 : -1;
-
 
819
        }
-
 
820
        break;
-
 
821
    default:
-
 
822
        handled = 0;
-
 
823
    }
-
 
824
    if (handled)
-
 
825
        ipc_answer_fast(callid, retval, 0, 0);
-
 
826
    return handled;
-
 
827
}
-
 
828
 
704
/** Handler for messages concerning pixmap handling */
829
/** Handler for messages concerning pixmap handling */
705
static int pixmap_handle(ipc_callid_t callid, ipc_call_t *call, int vp)
830
static int pixmap_handle(ipc_callid_t callid, ipc_call_t *call, int vp)
706
{
831
{
707
    int handled = 1;
832
    int handled = 1;
708
    int retval = 0;
833
    int retval = 0;
Line 771... Line 896...
771
    }
896
    }
772
    client_connected = 1;
897
    client_connected = 1;
773
    ipc_answer_fast(iid, 0, 0, 0); /* Accept connection */
898
    ipc_answer_fast(iid, 0, 0, 0); /* Accept connection */
774
 
899
 
775
    while (1) {
900
    while (1) {
776
        if (vport->cursor_shown)
901
        if (vport->cursor_active || anims_enabled)
777
            callid = async_get_call_timeout(&call,250000);
902
            callid = async_get_call_timeout(&call,250000);
778
        else
903
        else
779
            callid = async_get_call(&call);
904
            callid = async_get_call(&call);
780
 
905
 
781
        if (!callid) {
906
        if (!callid) {
782
            cursor_blink(vp);
907
            cursor_blink(vp);
-
 
908
            anims_tick();
783
            continue;
909
            continue;
784
        }
910
        }
785
        if (shm_handle(callid, &call, vp))
911
        if (shm_handle(callid, &call, vp))
786
            continue;
912
            continue;
787
        if (pixmap_handle(callid, &call, vp))
913
        if (pixmap_handle(callid, &call, vp))
788
            continue;
914
            continue;
-
 
915
        if (anim_handle(callid, &call, vp))
-
 
916
            continue;
789
 
917
 
790
        switch (IPC_GET_METHOD(call)) {
918
        switch (IPC_GET_METHOD(call)) {
791
        case IPC_M_PHONE_HUNGUP:
919
        case IPC_M_PHONE_HUNGUP:
792
            client_connected = 0;
920
            client_connected = 0;
793
            /* cleanup other viewports */
921
            /* cleanup other viewports */