OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [mw/] [src/] [demos/] [nanox/] [getselection.c] - Blame information for rev 673

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 673 markom
#include <stdio.h>
2
#include <stdlib.h>
3
#include <unistd.h>
4
#include <string.h>
5
 
6
#include "nano-X.h"
7
 
8
static int bytes_received = 0;
9
static char *data = NULL;
10
 
11
int got_client_data(GR_EVENT *event)
12
{
13
        GR_EVENT_CLIENT_DATA *ev = &event->clientdata;
14
 
15
        fprintf(stderr, "Got client data packet with serial number %ld for "
16
                        "window %d from window %d\n", ev->serial, ev->wid,
17
                                                                ev->rid);
18
        if(!(data = realloc(data, bytes_received + ev->datalen))) {
19
                fprintf(stderr, "Out of memory\n");
20
                exit(7);
21
        }
22
        memcpy(data + bytes_received, ev->data, ev->datalen);
23
        free(ev->data);
24
 
25
        fprintf(stderr, "Got client data packet with serial number %ld for "
26
                        "window %d from window %d\n", ev->serial, ev->wid,
27
                                                                ev->rid);
28
        fprintf(stderr, "Already received %d bytes, this packet is %ld bytes "
29
                        "long, and the total data length is %ld bytes so ",
30
                                        bytes_received, ev->datalen, ev->len);
31
 
32
        bytes_received += ev->datalen;
33
        if(bytes_received == ev->len) {
34
                fprintf(stderr, "we have received all of the data now.\n");
35
                fprintf(stderr, "The data in the packet is:\n%s\n", data);
36
                return 1;
37
        }
38
        else if(bytes_received < ev->len) {
39
                fprintf(stderr, "this is not the last data packet.\n");
40
                return 0;
41
        } else fprintf(stderr, "we have received too much data (shouldn't "
42
                                                                "happen)\n");
43
 
44
        return 1;
45
}
46
 
47
int main(int argc, char *argv[])
48
{
49
        GR_CHAR *typelist, *p;
50
        GR_WINDOW_ID sid, wid;
51
        GR_EVENT event;
52
        int n = 0, mimetype = -1;
53
 
54
        if(GrOpen() < 0) {
55
                fprintf(stderr, "Couldn't connect to Nano-X server\n");
56
                return 1;
57
        }
58
 
59
        sid = GrGetSelectionOwner(&typelist);
60
        if(!sid) {
61
                fprintf(stderr, "Clipboard is empty\n");
62
                return 2;
63
        }
64
 
65
        if(!typelist) {
66
                fprintf(stderr, "GrGetSelectionOwner() returned an empty "
67
                                "type list for window %d\n", sid);
68
                return 3;
69
        }
70
 
71
        fprintf(stderr, "Window %d owns the selection\n", sid);
72
        fprintf(stderr, "It claims to be able to supply data in the following "
73
                        "types:\n%s\n", typelist);
74
 
75
        p = strtok(typelist, " ");
76
        do {
77
                if(!strncmp("text/plain", p, 10)) {
78
                        mimetype = n;
79
                        break;
80
                }
81
                n++;
82
        } while((p = strtok(NULL, " ")));
83
 
84
        if(mimetype == -1) {
85
                fprintf(stderr, "Type text/plain is not available\n");
86
                return 4;
87
        }
88
 
89
        free(typelist);
90
 
91
        fprintf(stderr, "Type text/plain is available- requesting data\n");
92
 
93
        wid = GrNewWindow(GR_ROOT_WINDOW_ID, 0, 0, 1, 1, 0, 0, 0);
94
        if(!wid) {
95
                fprintf(stderr, "Couldn't get a window\n");
96
                return 5;
97
        }
98
 
99
        GrSelectEvents(wid, GR_EVENT_MASK_CLIENT_DATA);
100
 
101
        GrRequestClientData(wid, sid, 0, mimetype);
102
 
103
        while(1) {
104
                GrGetNextEventTimeout(&event, 4000);
105
                switch(event.type) {
106
                        case GR_EVENT_TYPE_CLIENT_DATA:
107
                                if(got_client_data(&event))
108
                                        return 0;
109
                                break;
110
                        case GR_EVENT_TYPE_TIMEOUT:
111
                                fprintf(stderr, "Timed out waiting for data\n");
112
                                return 6;
113
                        default:
114
                                break;
115
                }
116
        }
117
 
118
        return 0;
119
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.