Rev 8943 | Rev 9003 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
8933 | leency | 1 | #define ENTRY_POINT #main |
6567 | leency | 2 | |
6653 | leency | 3 | #define MEMSIZE 4096*20 |
8933 | leency | 4 | |
6567 | leency | 5 | #include "..\lib\strings.h" |
6 | #include "..\lib\clipboard.h" |
||
7 | #include "..\lib\gui.h" |
||
8933 | leency | 8 | #include "..\lib\fs.h" |
6567 | leency | 9 | |
10 | //===================================================// |
||
11 | // // |
||
12 | // DATA // |
||
13 | // // |
||
14 | //===================================================// |
||
15 | |||
16 | ?define T_COLUMNS_TITLE "# | Data size | Data type | Contents" |
||
7493 | leency | 17 | ?define T_COLUMN_VIEW "| View" |
6567 | leency | 18 | ?define DEFAULT_SAVE_PATH "/tmp0/1/clipview.tmp" |
19 | char *data_type[] = { "Text", "Image", "RAW", "Unknown" }; |
||
20 | |||
21 | enum { |
||
8933 | leency | 22 | BT_DELETE_LAST = 10, |
23 | BT_DELETE_ALL, |
||
24 | BT_UNLOCK, |
||
25 | BT_LIST_LEFT, |
||
26 | BT_LIST_RIGHT |
||
6567 | leency | 27 | }; |
28 | |||
8933 | leency | 29 | #define PANEL_BOTTOM_H 35 |
30 | #define GAP 5 |
||
31 | #define LIST_Y 32 |
||
32 | #define PANEL_TOP_H LIST_Y-2 |
||
33 | #define LINE_H 20 |
||
34 | #define TEXT_Y LINE_H - 14 / 2 |
||
6567 | leency | 35 | |
36 | proc_info Form; |
||
37 | |||
8933 | leency | 38 | struct LIST { |
39 | int w,h; |
||
40 | int count; |
||
41 | int first; |
||
42 | int visible; |
||
43 | } list = 0; |
||
44 | |||
6567 | leency | 45 | //===================================================// |
46 | // // |
||
47 | // CODE // |
||
48 | // // |
||
49 | //===================================================// |
||
50 | |||
51 | void main() |
||
52 | { |
||
8936 | leency | 53 | @mem_init(); |
8933 | leency | 54 | @SetEventMask(EVM_REDRAW + EVM_BUTTON); |
7984 | leency | 55 | loop() switch(@WaitEventTimeout(10)) |
6567 | leency | 56 | { |
57 | case evButton: |
||
8933 | leency | 58 | @GetButtonID(); |
59 | switch(EAX) { |
||
60 | case 1: |
||
61 | ExitProcess(); |
||
62 | case BT_DELETE_LAST: |
||
63 | EventDeleteLastSlot(); |
||
64 | break; |
||
65 | case BT_DELETE_ALL: |
||
66 | EventDeleteAllSlots(); |
||
67 | break; |
||
68 | case BT_UNLOCK: |
||
69 | EventResetBufferLock(); |
||
70 | break; |
||
71 | case BT_LIST_LEFT: |
||
72 | list.first -= list.visible; |
||
73 | if (list.first <= 0) list.first = 0; |
||
74 | ClipViewSelectListDraw(); |
||
75 | break; |
||
76 | case BT_LIST_RIGHT: |
||
77 | if (list.first + list.visible < list.count) list.first += list.visible; |
||
78 | ClipViewSelectListDraw(); |
||
79 | break; |
||
80 | default: |
||
81 | if (EAX>=300) EventOpenAsHex(EAX-300); |
||
82 | else EventOpenAsText(EAX-100); |
||
7984 | leency | 83 | } |
6567 | leency | 84 | break; |
85 | |||
86 | case evReDraw: |
||
7806 | leency | 87 | sc.get(); |
8933 | leency | 88 | DefineAndDrawWindow(GetScreenWidth()-600/2,80,600,400,0x73,NULL,"Clipboard Viewer",NULL); |
6567 | leency | 89 | GetProcessInfo(#Form, SelfInfo); |
8946 | leency | 90 | IF (Form.status_window&ROLLED_UP) break; |
7984 | leency | 91 | IF (Form.height < 200) { MoveSize(OLD,OLD,OLD,200); break; } |
92 | IF (Form.width < 570) { MoveSize(OLD,OLD,570,OLD); break; } |
||
6567 | leency | 93 | DrawWindowContent(); |
94 | break; |
||
95 | |||
96 | default: |
||
8933 | leency | 97 | if (Clipboard__GetSlotCount() > list.count) ClipViewSelectListDraw(); |
6567 | leency | 98 | } |
99 | } |
||
100 | |||
101 | void DrawWindowContent() |
||
102 | { |
||
8933 | leency | 103 | list.w = Form.cwidth-GAP-GAP; |
104 | list.h = Form.cheight-PANEL_BOTTOM_H-LIST_Y-GAP; |
||
105 | list.visible = list.h / LINE_H; |
||
106 | |||
7806 | leency | 107 | DrawBar(0,0, Form.cwidth, PANEL_TOP_H, sc.work); |
108 | DrawBar(0,Form.cheight-PANEL_BOTTOM_H, Form.cwidth, PANEL_BOTTOM_H, sc.work); |
||
8933 | leency | 109 | DrawWideRectangle(GAP-GAP, LIST_Y-GAP, GAP*2+list.w, GAP*2+list.h, GAP-2, sc.work); |
110 | |||
111 | DefineButton(GAP, list.h + LIST_Y + 8, 110, 25, BT_DELETE_LAST, sc.button); |
||
112 | $inc edx |
||
113 | $add ebx, 130 << 16 //BT_DELETE_ALL |
||
114 | $int 64 |
||
115 | $inc edx |
||
116 | $add ebx, 130 << 16 //BT_UNLOCK |
||
117 | $int 64 |
||
118 | |||
8943 | leency | 119 | WriteText(GAP+11, LIST_Y + list.h + 14, 0x90, sc.button_text, "Delete last Delete all Reset lock"); |
8933 | leency | 120 | |
121 | WriteText(GAP+12, LIST_Y - 23, 0x90, sc.work_text, T_COLUMNS_TITLE); |
||
122 | WriteText(GAP+list.w - 88-14, LIST_Y - 23, 0x90, sc.work_text, T_COLUMN_VIEW); |
||
6662 | leency | 123 | ClipViewSelectListDraw(); |
124 | SelectList_DrawBorder(); |
||
6567 | leency | 125 | } |
126 | |||
7037 | leency | 127 | dword slot_data; |
128 | struct clipboard_data |
||
129 | { |
||
130 | dword size; |
||
131 | dword type; |
||
132 | dword encoding; |
||
133 | dword content; |
||
134 | dword content_offset; |
||
135 | } cdata; |
||
136 | |||
6653 | leency | 137 | void SelectList_DrawLine(dword i) |
6567 | leency | 138 | { |
8933 | leency | 139 | int yyy, slot_data_type_number; |
6567 | leency | 140 | |
8933 | leency | 141 | yyy = i*LINE_H+LIST_Y; |
142 | DrawBar(GAP, yyy, list.w, LINE_H, -i%2 * 0x0E0E0E + 0xF1F1f1); |
||
143 | |||
144 | if (list.first + i >= list.count) { |
||
145 | return; |
||
146 | } |
||
147 | |||
148 | slot_data = Clipboard__GetSlotData(list.first + i); |
||
7037 | leency | 149 | cdata.size = ESDWORD[slot_data]; |
150 | cdata.type = ESDWORD[slot_data+4]; |
||
151 | if (cdata.type==SLOT_DATA_TYPE_TEXT) || (cdata.type==SLOT_DATA_TYPE_TEXT_BLOCK) |
||
152 | cdata.content_offset = 12; |
||
153 | else |
||
154 | cdata.content_offset = 8; |
||
155 | cdata.content = slot_data + cdata.content_offset; |
||
156 | |||
8933 | leency | 157 | WriteText(GAP+12, yyy+TEXT_Y, 0x90, 0x000000, itoa(list.first + i)); |
7984 | leency | 158 | EDX = ConvertSizeToKb(cdata.size); |
8933 | leency | 159 | WriteText(GAP+44, yyy+TEXT_Y, 0x90, 0x000000, EDX); |
7037 | leency | 160 | slot_data_type_number = cdata.type; |
8933 | leency | 161 | WriteText(GAP+140, yyy+TEXT_Y, 0x90, 0x000000, data_type[slot_data_type_number]); |
162 | WriteText(GAP+list.w - 88, yyy+TEXT_Y, 0x90, 0x006597, "TEXT HEX"); |
||
163 | DefineButton(GAP+list.w - 98, yyy, 50, LINE_H, 100+i+BT_HIDE, NULL); |
||
8936 | leency | 164 | $add edx, 200 |
165 | $add ebx, 52 << 16 - 10 //BT_HEX |
||
166 | $int 64 |
||
6567 | leency | 167 | |
8933 | leency | 168 | ESI = list.w - 345 / 8; |
169 | if (cdata.size - cdata.content_offset < ESI) ESI = cdata.size - cdata.content_offset; |
||
170 | WriteText(GAP+236, yyy+TEXT_Y, 0x30, 0x000000, cdata.content); |
||
6567 | leency | 171 | } |
172 | |||
8936 | leency | 173 | int SaveSlotContents() { |
174 | if (! CreateFile(cdata.size, cdata.content, DEFAULT_SAVE_PATH)) { |
||
6567 | leency | 175 | return true; |
7984 | leency | 176 | } else { |
8936 | leency | 177 | notify("'Can not create /tmp0/1/clipview.tmp' -E"); |
6567 | leency | 178 | return false; |
179 | } |
||
180 | } |
||
181 | |||
8933 | leency | 182 | void ClipViewSelectListDraw() |
183 | { |
||
184 | int i, list_last; |
||
185 | |||
186 | list.count = Clipboard__GetSlotCount(); |
||
8936 | leency | 187 | if (list.first >= list.count) list.first = list.count - list.visible; |
188 | if (list.first < 0) list.first = 0; |
||
8933 | leency | 189 | |
190 | if (list.count > list.visible) list_last = list.visible; else list_last = list.count; |
||
191 | |||
192 | for (i=0; i |
||
193 | |||
194 | DrawBar(GAP,i*LINE_H+LIST_Y, list.w, -i*LINE_H+ list.h, 0xFFFfff); |
||
195 | if (!list.count) WriteText(list.w / 2 + GAP - 60, |
||
196 | list.h / 2 - 8 + LIST_Y, 0x90, 0x999999, "No data to show"); |
||
197 | |||
8943 | leency | 198 | //Show "<" and ">" buttons and a page number |
199 | //in case when there are items more than visible at once |
||
8933 | leency | 200 | if (list.count > list.visible) { |
201 | param[0] = list.first / list.visible + '0'; |
||
202 | DefineButton(Form.cwidth-84-GAP, list.h + LIST_Y + 8, 25, 25, BT_LIST_LEFT, sc.button); //BT_LEFT |
||
203 | $inc edx |
||
204 | $add ebx, 57 << 16 //BT_RIGHT |
||
205 | $int 64 |
||
206 | WriteText(Form.cwidth-84-GAP+10, list.h + LIST_Y + 14, 0x90, sc.button_text, "< >"); |
||
207 | $add ebx, 28 << 16 |
||
208 | $mov edx, #param; |
||
8936 | leency | 209 | $mov edi, sc.work |
8933 | leency | 210 | $add ecx, 0x40 << 24 |
8943 | leency | 211 | $add ecx, sc.work_text //page number |
8933 | leency | 212 | $int 64 |
213 | } |
||
6653 | leency | 214 | } |
215 | |||
8933 | leency | 216 | void SelectList_DrawBorder() { |
217 | DrawRectangle3D(GAP-2, LIST_Y-2, |
||
218 | list.w+3, list.h+3, |
||
219 | sc.work_dark, sc.work_light); |
||
220 | DrawRectangle3D(GAP-1, LIST_Y-1, |
||
221 | list.w+1, list.h+1, |
||
222 | sc.work_graph, sc.work_graph); |
||
6653 | leency | 223 | } |
224 | |||
6567 | leency | 225 | //===================================================// |
226 | // // |
||
227 | // EVENTS // |
||
228 | // // |
||
229 | //===================================================// |
||
230 | |||
231 | void EventDeleteLastSlot() |
||
232 | { |
||
6653 | leency | 233 | int i; |
8933 | leency | 234 | for (i=0; i |
235 | DeleteButton(list.first + i + 100); |
||
236 | $add edx, 200 |
||
237 | $int 64 |
||
238 | } |
||
7037 | leency | 239 | Clipboard__DeleteLastSlot(); |
8933 | leency | 240 | DrawWindowContent(); |
6567 | leency | 241 | } |
242 | |||
243 | void EventDeleteAllSlots() |
||
244 | { |
||
7037 | leency | 245 | while (Clipboard__GetSlotCount()) Clipboard__DeleteLastSlot(); |
8933 | leency | 246 | DrawWindowContent(); |
6567 | leency | 247 | } |
248 | |||
249 | void EventResetBufferLock() { |
||
7037 | leency | 250 | Clipboard__ResetBlockingBuffer(); |
8933 | leency | 251 | DrawWindowContent(); |
6567 | leency | 252 | } |
253 | |||
254 | void EventOpenAsText(int slot_id) { |
||
7037 | leency | 255 | slot_data = Clipboard__GetSlotData(slot_id); |
256 | cdata.size = ESDWORD[slot_data]-12; |
||
257 | cdata.content = slot_data+12; |
||
8936 | leency | 258 | if (SaveSlotContents()) RunProgram("/sys/develop/cedit", DEFAULT_SAVE_PATH); |
6567 | leency | 259 | } |
260 | |||
261 | void EventOpenAsHex(int slot_id) { |
||
7037 | leency | 262 | slot_data = Clipboard__GetSlotData(slot_id); |
263 | cdata.size = ESDWORD[slot_data]; |
||
264 | cdata.content = slot_data; |
||
8936 | leency | 265 | if (SaveSlotContents()) RunProgram("/sys/develop/heed", DEFAULT_SAVE_PATH); |
6567 | leency | 266 | } |
267 | |||
268 | stop:><>><>>><>">>>><>><>><>>>>=> |