Rev 8860 | Rev 8936 | 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 | { |
||
8933 | leency | 53 | mem_init(); |
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); |
90 | IF (Form.status_window>=2) 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 | if (list.first > list.count) list.first = list.count - list.visible; |
||
107 | |||
7806 | leency | 108 | DrawBar(0,0, Form.cwidth, PANEL_TOP_H, sc.work); |
109 | DrawBar(0,Form.cheight-PANEL_BOTTOM_H, Form.cwidth, PANEL_BOTTOM_H, sc.work); |
||
8933 | leency | 110 | DrawWideRectangle(GAP-GAP, LIST_Y-GAP, GAP*2+list.w, GAP*2+list.h, GAP-2, sc.work); |
111 | |||
112 | DefineButton(GAP, list.h + LIST_Y + 8, 110, 25, BT_DELETE_LAST, sc.button); |
||
113 | $inc edx |
||
114 | $add ebx, 130 << 16 //BT_DELETE_ALL |
||
115 | $int 64 |
||
116 | $inc edx |
||
117 | $add ebx, 130 << 16 //BT_UNLOCK |
||
118 | $int 64 |
||
119 | |||
120 | WriteText(GAP+10, LIST_Y + list.h + 14, 0x90, sc.button_text, "Delete last Delete all Unlock"); |
||
121 | |||
122 | WriteText(GAP+12, LIST_Y - 23, 0x90, sc.work_text, T_COLUMNS_TITLE); |
||
123 | WriteText(GAP+list.w - 88-14, LIST_Y - 23, 0x90, sc.work_text, T_COLUMN_VIEW); |
||
6662 | leency | 124 | ClipViewSelectListDraw(); |
125 | SelectList_DrawBorder(); |
||
6567 | leency | 126 | } |
127 | |||
7037 | leency | 128 | dword slot_data; |
129 | struct clipboard_data |
||
130 | { |
||
131 | dword size; |
||
132 | dword type; |
||
133 | dword encoding; |
||
134 | dword content; |
||
135 | dword content_offset; |
||
136 | } cdata; |
||
137 | |||
6653 | leency | 138 | void SelectList_DrawLine(dword i) |
6567 | leency | 139 | { |
8933 | leency | 140 | int yyy, slot_data_type_number; |
6567 | leency | 141 | |
8933 | leency | 142 | yyy = i*LINE_H+LIST_Y; |
143 | DrawBar(GAP, yyy, list.w, LINE_H, -i%2 * 0x0E0E0E + 0xF1F1f1); |
||
144 | |||
145 | if (list.first + i >= list.count) { |
||
146 | return; |
||
147 | } |
||
148 | |||
149 | slot_data = Clipboard__GetSlotData(list.first + i); |
||
7037 | leency | 150 | cdata.size = ESDWORD[slot_data]; |
151 | cdata.type = ESDWORD[slot_data+4]; |
||
152 | if (cdata.type==SLOT_DATA_TYPE_TEXT) || (cdata.type==SLOT_DATA_TYPE_TEXT_BLOCK) |
||
153 | cdata.content_offset = 12; |
||
154 | else |
||
155 | cdata.content_offset = 8; |
||
156 | cdata.content = slot_data + cdata.content_offset; |
||
157 | |||
8933 | leency | 158 | WriteText(GAP+12, yyy+TEXT_Y, 0x90, 0x000000, itoa(list.first + i)); |
7984 | leency | 159 | EDX = ConvertSizeToKb(cdata.size); |
8933 | leency | 160 | WriteText(GAP+44, yyy+TEXT_Y, 0x90, 0x000000, EDX); |
7037 | leency | 161 | slot_data_type_number = cdata.type; |
8933 | leency | 162 | WriteText(GAP+140, yyy+TEXT_Y, 0x90, 0x000000, data_type[slot_data_type_number]); |
163 | WriteText(GAP+list.w - 88, yyy+TEXT_Y, 0x90, 0x006597, "TEXT HEX"); |
||
164 | DefineButton(GAP+list.w - 98, yyy, 50, LINE_H, 100+i+BT_HIDE, NULL); |
||
165 | DefineButton(GAP+list.w - 95 + 51, yyy, 40, LINE_H, 300+i+BT_HIDE, NULL); |
||
6567 | leency | 166 | |
8933 | leency | 167 | ESI = list.w - 345 / 8; |
168 | if (cdata.size - cdata.content_offset < ESI) ESI = cdata.size - cdata.content_offset; |
||
169 | WriteText(GAP+236, yyy+TEXT_Y, 0x30, 0x000000, cdata.content); |
||
6567 | leency | 170 | } |
171 | |||
7037 | leency | 172 | int SaveSlotContents(dword size, off) { |
7984 | leency | 173 | if (! CreateFile(size, off, DEFAULT_SAVE_PATH)) { |
6567 | leency | 174 | return true; |
7984 | leency | 175 | } else { |
6567 | leency | 176 | notify("'Can not create /tmp0/1/clipview.tmp\nPreview function is not available.' -E"); |
177 | return false; |
||
178 | } |
||
179 | } |
||
180 | |||
8933 | leency | 181 | void ClipViewSelectListDraw() |
182 | { |
||
183 | int i, list_last; |
||
184 | |||
185 | list.count = Clipboard__GetSlotCount(); |
||
186 | |||
187 | if (list.count > list.visible) list_last = list.visible; else list_last = list.count; |
||
188 | |||
189 | for (i=0; i |
||
190 | |||
191 | DrawBar(GAP,i*LINE_H+LIST_Y, list.w, -i*LINE_H+ list.h, 0xFFFfff); |
||
192 | if (!list.count) WriteText(list.w / 2 + GAP - 60, |
||
193 | list.h / 2 - 8 + LIST_Y, 0x90, 0x999999, "No data to show"); |
||
194 | |||
195 | if (list.count > list.visible) { |
||
196 | param[0] = list.first / list.visible + '0'; |
||
197 | DefineButton(Form.cwidth-84-GAP, list.h + LIST_Y + 8, 25, 25, BT_LIST_LEFT, sc.button); //BT_LEFT |
||
198 | $inc edx |
||
199 | $add ebx, 57 << 16 //BT_RIGHT |
||
200 | $int 64 |
||
201 | WriteText(Form.cwidth-84-GAP+10, list.h + LIST_Y + 14, 0x90, sc.button_text, "< >"); |
||
202 | $add ebx, 28 << 16 |
||
203 | $mov edx, #param; |
||
204 | $mov edi, sc.work_text |
||
205 | $add ecx, 0x40 << 24 |
||
206 | $int 64 |
||
207 | } |
||
6653 | leency | 208 | } |
209 | |||
8933 | leency | 210 | void SelectList_DrawBorder() { |
211 | DrawRectangle3D(GAP-2, LIST_Y-2, |
||
212 | list.w+3, list.h+3, |
||
213 | sc.work_dark, sc.work_light); |
||
214 | DrawRectangle3D(GAP-1, LIST_Y-1, |
||
215 | list.w+1, list.h+1, |
||
216 | sc.work_graph, sc.work_graph); |
||
6653 | leency | 217 | } |
218 | |||
6567 | leency | 219 | //===================================================// |
220 | // // |
||
221 | // EVENTS // |
||
222 | // // |
||
223 | //===================================================// |
||
224 | |||
225 | void EventDeleteLastSlot() |
||
226 | { |
||
6653 | leency | 227 | int i; |
8933 | leency | 228 | for (i=0; i |
229 | DeleteButton(list.first + i + 100); |
||
230 | $add edx, 200 |
||
231 | $int 64 |
||
232 | } |
||
7037 | leency | 233 | Clipboard__DeleteLastSlot(); |
8933 | leency | 234 | DrawWindowContent(); |
6567 | leency | 235 | } |
236 | |||
237 | void EventDeleteAllSlots() |
||
238 | { |
||
7037 | leency | 239 | while (Clipboard__GetSlotCount()) Clipboard__DeleteLastSlot(); |
8933 | leency | 240 | DrawWindowContent(); |
6567 | leency | 241 | } |
242 | |||
243 | void EventResetBufferLock() { |
||
7037 | leency | 244 | Clipboard__ResetBlockingBuffer(); |
8933 | leency | 245 | DrawWindowContent(); |
6567 | leency | 246 | } |
247 | |||
248 | void EventOpenAsText(int slot_id) { |
||
7037 | leency | 249 | slot_data = Clipboard__GetSlotData(slot_id); |
250 | cdata.size = ESDWORD[slot_data]-12; |
||
251 | cdata.content = slot_data+12; |
||
8860 | leency | 252 | if (SaveSlotContents(cdata.size, cdata.content)) RunProgram("/sys/develop/cedit", DEFAULT_SAVE_PATH); |
6567 | leency | 253 | } |
254 | |||
255 | void EventOpenAsHex(int slot_id) { |
||
7037 | leency | 256 | slot_data = Clipboard__GetSlotData(slot_id); |
257 | cdata.size = ESDWORD[slot_data]; |
||
258 | cdata.content = slot_data; |
||
259 | if (SaveSlotContents(cdata.size, cdata.content)) RunProgram("/sys/develop/heed", DEFAULT_SAVE_PATH); |
||
6567 | leency | 260 | } |
261 | |||
262 | stop:><>><>>><>>><>><>>>>=> |