f4a85c793adefb991b7be18139a9f80183ad5b71
[framework/uifw/e17.git] / src / modules / shot / .svn / text-base / e_mod_main.c.svn-base
1 #include "e.h"
2 #include "e_mod_main.h"
3
4 static E_Module *shot_module = NULL;
5
6 static E_Action *act = NULL;
7 static E_Int_Menu_Augmentation *maug = NULL;
8 static Ecore_Timer *timer = NULL;
9 static E_Win *win = NULL;
10 static Evas_Object *o_bg = NULL, *o_box = NULL, *o_content = NULL;
11 static Evas_Object *o_event = NULL, *o_img = NULL, *o_hlist = NULL;
12 static E_Manager *sman = NULL;
13 static E_Container *scon = NULL;
14 static int quality = 90;
15 static int screen = -1;
16 #define MAXZONES 64
17 static Evas_Object *o_rectdim[MAXZONES] = { NULL };
18 static Evas_Object *o_radio_all = NULL;
19 static Evas_Object *o_radio[MAXZONES] = { NULL };
20 static Evas_Object *o_fsel = NULL;
21 static Evas_Object *o_label = NULL;
22 static Evas_Object *o_entry = NULL;
23 static unsigned char *fdata = NULL;
24 static int fsize = 0;
25 static Ecore_Con_Url *url_up = NULL;
26 static Eina_List *handlers = NULL;
27 static char *url_ret = NULL;
28
29 static void
30 _win_delete_cb(E_Win *w __UNUSED__)
31 {
32    if (win)
33      {
34         e_object_del(E_OBJECT(win));
35         win = NULL;
36      }
37 }
38
39 static void
40 _win_resize_cb(E_Win *w __UNUSED__)
41 {
42    evas_object_resize(o_bg, win->w, win->h);
43 }
44
45 static void
46 _on_focus_cb(void *data __UNUSED__, Evas_Object *obj)
47 {
48    if (obj == o_content) e_widget_focused_object_clear(o_box);
49    else if (o_content) e_widget_focused_object_clear(o_content);
50 }
51
52 static void
53 _key_down_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event)
54 {
55    Evas_Event_Key_Down *ev = event;
56    
57    if (!strcmp(ev->keyname, "Tab"))
58      {
59         if (evas_key_modifier_is_set(evas_key_modifier_get(e_win_evas_get(win)), "Shift"))
60           {
61              if (e_widget_focus_get(o_box))
62                {
63                   if (!e_widget_focus_jump(o_box, 0))
64                     {
65                        e_widget_focus_set(o_content, 0);
66                        if (!e_widget_focus_get(o_content))
67                           e_widget_focus_set(o_box, 0);
68                     }
69                }
70              else
71                {
72                   if (!e_widget_focus_jump(o_content, 0))
73                      e_widget_focus_set(o_box, 0);
74                }
75           }
76         else
77           {
78              if (e_widget_focus_get(o_box))
79                {
80                   if (!e_widget_focus_jump(o_box, 1))
81                     {
82                        e_widget_focus_set(o_content, 1);
83                        if (!e_widget_focus_get(o_content))
84                           e_widget_focus_set(o_box, 1);
85                     }
86                }
87              else
88                {
89                   if (!e_widget_focus_jump(o_content, 1))
90                      e_widget_focus_set(o_box, 1);
91                }
92           }
93      }
94    else if (((!strcmp(ev->keyname, "Return")) ||
95              (!strcmp(ev->keyname, "KP_Enter")) ||
96              (!strcmp(ev->keyname, "space"))))
97      {
98         Evas_Object *o = NULL;
99         
100         if ((o_content) && (e_widget_focus_get(o_content)))
101            o = e_widget_focused_object_get(o_content);
102         else
103            o = e_widget_focused_object_get(o_box);
104         if (o) e_widget_activate(o);
105      }            
106 }            
107
108 static void
109 _screen_change_cb(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
110 {
111    Eina_List *l;
112    E_Zone *z;
113    
114    EINA_LIST_FOREACH(scon->zones, l, z)
115      {
116         if (screen == -1)
117            evas_object_color_set(o_rectdim[z->num], 0, 0, 0, 0);
118         else if (screen == (int)z->num)
119            evas_object_color_set(o_rectdim[z->num], 0, 0, 0, 0);
120         else
121            evas_object_color_set(o_rectdim[z->num], 0, 0, 0, 200);
122      }
123 }
124
125 static void
126 _save_to(const char *file)
127 {
128    char *extn = strrchr(file, '.');
129    char opts[256];
130    
131    if (!extn) 
132      {
133         e_util_dialog_show
134            (_("Error - Unknown format"),
135                _("File has an unspecified extension.<br>"
136                  "Please use '.jpg' or '.png' extensions<br>"
137                  "only as other formats are not<br>"
138                  "supported currently."));
139         return;
140      }
141    if (!((!strcasecmp(extn, ".png")) ||
142          (!strcasecmp(extn, ".jpg")) ||
143          (!strcasecmp(extn, ".jpeg"))))
144      {
145         e_util_dialog_show
146            (_("Error - Unknown format"),
147                _("File has an unrecognized extension.<br>"
148                  "Please use '.jpg' or '.png' extensions<br>"
149                  "only as other formats are not<br>"
150                  "supported currently."));
151         return;
152      }
153    if (!strcasecmp(extn, ".png"))
154       snprintf(opts, sizeof(opts), "compress=%i", 9);
155    else
156       snprintf(opts, sizeof(opts), "quality=%i", quality);
157    if (screen == -1)
158      {
159         evas_object_image_save(o_img, file, NULL, opts);
160      }
161    else
162      {
163         Evas_Object *o;
164         Eina_List *l;
165         E_Zone *z = NULL;
166         
167         EINA_LIST_FOREACH(scon->zones, l, z)
168           {
169              if (screen == (int)z->num) break;
170              z = NULL;
171           }
172         if (z)
173           {
174              unsigned char *src, *dst, *s, *d;
175              int sstd, dstd, y;
176              
177              o = evas_object_image_add(evas_object_evas_get(o_img));
178              evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
179              evas_object_image_alpha_set(o, EINA_FALSE);
180              evas_object_image_size_set(o, z->w, z->h);
181              src = evas_object_image_data_get(o_img, EINA_FALSE);
182              sstd = evas_object_image_stride_get(o_img);
183              dst = evas_object_image_data_get(o, EINA_TRUE);
184              dstd = evas_object_image_stride_get(o);
185              d = dst;
186              for (y = 0; y < z->h; y++)
187                {
188                   s = src + (sstd * y) + (z->x * 4);
189                   memcpy(d, s, z->w * 4);
190                   d += z->w * 4;
191                }
192              evas_object_image_save(o, file, NULL, opts);
193              evas_object_del(o);
194           }
195      }
196 }
197
198 static void
199 _file_select_ok_cb(void *data __UNUSED__, E_Dialog *dia)
200 {
201    const char *file;
202
203    file = e_widget_fsel_selection_path_get(o_fsel);
204    if (file) _save_to(file);
205    if (dia) e_util_defer_object_del(E_OBJECT(dia));
206    if (win)
207      {
208         e_object_del(E_OBJECT(win));
209         win = NULL;
210      }
211 }
212
213 static void
214 _file_select_cancel_cb(void *data __UNUSED__, E_Dialog *dia)
215 {
216    if (dia) e_util_defer_object_del(E_OBJECT(dia));
217    if (win)
218      {
219         e_object_del(E_OBJECT(win));
220         win = NULL;
221      }
222 }
223
224 static void
225 _win_save_cb(void *data __UNUSED__, void *data2 __UNUSED__)
226
227    E_Dialog *dia;
228    Evas_Object *o;
229    Evas_Coord mw, mh;
230   
231    dia = e_dialog_new(scon, "E", "_e_shot_fsel");
232    e_dialog_title_set(dia, _("Select screenshot save location"));
233    o = e_widget_fsel_add(dia->win->evas, "~/", "/", NULL, NULL,
234                          NULL, NULL,
235                          NULL, NULL, 1);
236    o_fsel = o;
237    evas_object_show(o);
238    e_widget_size_min_get(o, &mw, &mh);
239    e_dialog_content_set(dia, o, mw, mh);
240    e_dialog_button_add(dia, _("OK"), NULL,
241                        _file_select_ok_cb, NULL);
242    e_dialog_button_add(dia, _("Cancel"), NULL,
243                        _file_select_cancel_cb, NULL);
244    e_dialog_resizable_set(dia, 1);
245    e_win_centered_set(dia->win, 1);
246    e_dialog_show(dia);
247 }
248
249 static void
250 _share_done(void)
251 {
252    Ecore_Event_Handler *h;
253
254    EINA_LIST_FREE(handlers, h) ecore_event_handler_del(h);
255    o_label = NULL;
256    if (url_ret)
257      {
258         free(url_ret);
259         url_ret = NULL;
260      }
261    if (url_up)
262      {
263         ecore_con_url_free(url_up);
264         url_up = NULL;
265      }
266    ecore_con_url_shutdown();
267 }
268
269 static void
270 _upload_ok_cb(void *data __UNUSED__, E_Dialog *dia)
271 {
272    // ok just hides dialog and does background upload
273    o_label = NULL;
274    if (dia) e_util_defer_object_del(E_OBJECT(dia));
275    if (win)
276      {
277         e_object_del(E_OBJECT(win));
278         win = NULL;
279      }
280    _share_done();
281 }
282
283 static void
284 _upload_cancel_cb(void *data __UNUSED__, E_Dialog *dia)
285 {
286    if (dia) e_util_defer_object_del(E_OBJECT(dia));
287    if (win)
288      {
289         e_object_del(E_OBJECT(win));
290         win = NULL;
291      }
292 }
293
294 static Eina_Bool
295 _upload_data_cb(void *data __UNUSED__, int ev_type __UNUSED__, void *event)
296 {
297    Ecore_Con_Event_Url_Data *ev = event;
298    if (ev->url_con != url_up) return EINA_TRUE;
299    if ((o_label) && (ev->size < 1024))
300      {
301         char *txt = alloca(ev->size + 1);
302
303         memcpy(txt, ev->data, ev->size);
304         txt[ev->size] = 0;
305 /*        
306         printf("GOT %i bytes: '%s'\n", ev->size, txt);
307         int i;
308         for (i = 0; i < ev->size; i++) printf("%02x.", ev->data[i]);
309         printf("\n");
310  */
311         if (!url_ret) url_ret = strdup(txt);
312         else
313           {
314              char *n;
315              
316              n = malloc(strlen(url_ret) + ev->size + 1);
317              if (n)
318                {
319                   free(url_ret);
320                   strcpy(n, url_ret);
321                   strcat(n, txt);
322                   url_ret = n;
323                }
324           }
325      }
326    return EINA_FALSE;
327 }
328
329 static Eina_Bool
330 _upload_progress_cb(void *data __UNUSED__, int ev_type __UNUSED__, void *event)
331 {
332    Ecore_Con_Event_Url_Progress *ev = event;
333    if (ev->url_con != url_up) return EINA_TRUE;
334    if (o_label)
335      {
336         char buf[1024];
337         
338         snprintf(buf, sizeof(buf),
339                  "Uploaded %1.1fKB / %1.1fKB", 
340                  ev->up.now / 1024, 
341                  ev->up.total / 1024);
342         e_widget_label_text_set(o_label, buf);
343      }
344    return EINA_FALSE;
345 }
346
347 static Eina_Bool
348 _upload_complete_cb(void *data __UNUSED__, int ev_type __UNUSED__, void *event)
349 {
350    Ecore_Con_Event_Url_Complete *ev = event;
351    if (ev->url_con != url_up) return EINA_TRUE;
352    if (ev->status != 200)
353      {
354         e_util_dialog_show
355            (_("Error - Upload Failed"),
356                _("Upload failed with status code:<br>"
357                  "%i"),
358                ev->status);
359         _share_done();
360         return EINA_FALSE;
361      }
362    if ((o_entry) && (url_ret))
363       e_widget_entry_text_set(o_entry, url_ret);
364    _share_done();
365    return EINA_FALSE;
366 }
367
368 static void
369 _win_share_cb(void *data __UNUSED__, void *data2 __UNUSED__)
370 {
371    E_Dialog *dia;
372    Evas_Object *o, *ol;
373    Evas_Coord mw, mh;
374    char buf[PATH_MAX];
375    FILE *f;
376    
377    if (quality == 100) snprintf(buf, sizeof(buf), "/tmp/e-shot-XXXXXX.png");
378    else snprintf(buf, sizeof(buf), "/tmp/e-shot-XXXXXX.jpg");
379    if (!mkstemp(buf))
380      {
381         e_util_dialog_show
382            (_("Error - Can't create File"),
383                _("Cannot create temporary file:\n"
384                  "%s"),
385                buf);
386         if (win)
387           {
388              e_object_del(E_OBJECT(win));
389              win = NULL;
390           }
391         return;
392      }
393    _save_to(buf);
394    if (win)
395      {
396         e_object_del(E_OBJECT(win));
397         win = NULL;
398      }
399    f = fopen(buf, "rb");
400    if (!f)
401      {
402         // FIXME: error disp
403         return;
404      }
405    fseek(f, 0, SEEK_END);
406    fsize = ftell(f);
407    if (fsize < 1)
408      {
409         // FIXME: error disp
410         fclose(f);
411         return;
412      }
413    rewind(f);
414    if (fdata) free(fdata);
415    fdata = malloc(fsize);
416    if (!fdata)
417      {
418         // FIXME: error disp
419         fclose(f);
420         return;
421      }
422    if (fread(fdata, fsize, 1, f) != 1)
423      {
424         // FIXME: error disp
425         free(fdata);
426         fdata = NULL;
427         fclose(f);
428         return;
429      }
430    fclose(f);
431    ecore_file_unlink(buf);
432    
433    _share_done();
434    
435    if (!ecore_con_url_init())
436      {
437         // FIXME: error disp
438         free(fdata);
439         fdata = NULL;
440         return;
441      }
442    
443    handlers = eina_list_append
444       (handlers, ecore_event_handler_add
445           (ECORE_CON_EVENT_URL_DATA, _upload_data_cb, NULL));
446    handlers = eina_list_append
447       (handlers, ecore_event_handler_add
448           (ECORE_CON_EVENT_URL_PROGRESS, _upload_progress_cb, NULL));
449    handlers = eina_list_append
450       (handlers, ecore_event_handler_add
451           (ECORE_CON_EVENT_URL_COMPLETE, _upload_complete_cb, NULL));
452    
453    url_up = ecore_con_url_new("http://www.enlightenment.org/shot.php");
454    ecore_con_url_post(url_up, fdata, fsize, "application/x-e-shot");
455    
456    dia = e_dialog_new(scon, "E", "_e_shot_share");
457    e_dialog_title_set(dia, _("Uploading screenshot"));
458    
459    o = e_widget_list_add(dia->win->evas, 0, 0);
460    ol = o;
461    
462    o = e_widget_label_add(dia->win->evas, _("Uploading ..."));
463    o_label = o;
464    e_widget_list_object_append(ol, o, 0, 0, 0.5);
465    
466    o = e_widget_label_add(dia->win->evas, 
467                           _("Screenshot is available at this location:"));
468    e_widget_list_object_append(ol, o, 0, 0, 0.5);
469    
470    o = e_widget_entry_add(dia->win->evas, NULL, NULL, NULL, NULL);
471    o_entry = o;
472    e_widget_list_object_append(ol, o, 1, 0, 0.5);
473       
474    e_widget_size_min_get(ol, &mw, &mh);
475    e_dialog_content_set(dia, ol, mw, mh);
476    e_dialog_button_add(dia, _("OK"), NULL, _upload_ok_cb, NULL);
477    e_dialog_button_add(dia, _("Cancel"), NULL, _upload_cancel_cb, NULL);
478    e_dialog_resizable_set(dia, 1);
479    e_win_centered_set(dia->win, 1);
480    e_dialog_show(dia);
481 }
482
483 static void
484 _win_cancel_cb(void *data __UNUSED__, void *data2 __UNUSED__)
485 {
486    if (win)
487      {
488         e_object_del(E_OBJECT(win));
489         win = NULL;
490      }
491 }
492
493 static void
494 _rect_down_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
495 {
496    Evas_Event_Mouse_Down *ev = event_info;
497    Eina_List *l;
498    E_Zone *z;
499    
500    if (ev->button != 1) return;
501    
502    e_widget_radio_toggle_set(o_radio_all, 0);
503    EINA_LIST_FOREACH(scon->zones, l, z)
504      {
505         if (obj == o_rectdim[z->num])
506           {
507              screen = z->num;
508              e_widget_radio_toggle_set(o_radio[z->num], 1);
509           }
510         else
511            e_widget_radio_toggle_set(o_radio[z->num], 0);
512      }
513    
514    EINA_LIST_FOREACH(scon->zones, l, z)
515      {
516         if (screen == -1)
517            evas_object_color_set(o_rectdim[z->num], 0, 0, 0, 0);
518         else if (screen == (int)z->num)
519            evas_object_color_set(o_rectdim[z->num], 0, 0, 0, 0);
520         else
521            evas_object_color_set(o_rectdim[z->num], 0, 0, 0, 200);
522      }
523 }
524
525 static void
526 _shot_now(E_Zone *zone)
527 {
528    Ecore_X_Image *img;
529    Ecore_X_Window_Attributes att;
530    unsigned char *src;
531    unsigned int *dst;
532    int bpl = 0, rows = 0, bpp = 0;
533    Evas *evas, *evas2;
534    Evas_Object *o, *oa, *op, *ol;
535    Evas_Coord w, h;
536    Evas_Modifier_Mask mask;
537    E_Radio_Group *rg;
538    
539    sman = zone->container->manager;
540    scon = zone->container;
541    memset(&att, 0, sizeof(Ecore_X_Window_Attributes));
542    ecore_x_window_attributes_get(sman->root, &att);
543    img = ecore_x_image_new(sman->w, sman->h, att.visual, att.depth);
544    ecore_x_image_get(img, sman->root, 0, 0, 0, 0, sman->w, sman->h);
545    src = ecore_x_image_data_get(img, &bpl, &rows, &bpp);
546    if (!ecore_x_image_is_argb32_get(img))
547      {
548         dst = malloc(sman->w * sman->h * sizeof(int));
549         ecore_x_image_to_argb_convert(src, bpp, bpl, att.colormap, att.visual,
550                                       0, 0, sman->w, sman->h,
551                                       dst, (sman->w * sizeof(int)), 0, 0);
552      }
553    else
554       dst = (unsigned int *)src;
555    
556    if (win) e_object_del(E_OBJECT(win));
557    win = e_win_new(e_container_current_get(e_manager_current_get()));
558    
559    evas = e_win_evas_get(win);
560    e_win_title_set(win, _("Where to put Screenshot..."));
561    e_win_delete_callback_set(win, _win_delete_cb);
562    e_win_resize_callback_set(win, _win_resize_cb);
563    e_win_dialog_set(win, 1);
564    e_win_centered_set(win, 1);
565    e_win_name_class_set(win, "E", "_shot_dialog");
566    
567    o = edje_object_add(evas);
568    o_bg = o;;
569    e_theme_edje_object_set(o, "base/theme/dialog", "e/widgets/dialog/main");
570    evas_object_move(o, 0, 0);
571    evas_object_show(o);
572    
573    o = e_widget_list_add(evas, 0, 0);
574    o_content = o;
575    e_widget_size_min_get(o, &w, &h);
576    edje_extern_object_min_size_set(o, w, h);
577    edje_object_part_swallow(o_bg, "e.swallow.content", o);
578    evas_object_show(o);
579
580    w = sman->w / 4;
581    if (w < 220) w = 220;
582    h = (w * sman->h) / sman->w;
583    
584    o = e_widget_aspect_add(evas, w, h);
585    oa = o;
586    o = e_widget_preview_add(evas, w, h);
587    op = o;
588
589    evas2 = e_widget_preview_evas_get(op);
590    
591    o = evas_object_image_filled_add(evas2);
592    o_img = o;
593    evas_object_image_colorspace_set(o, EVAS_COLORSPACE_ARGB8888);
594    evas_object_image_alpha_set(o, EINA_FALSE);
595    evas_object_image_size_set(o, sman->w, sman->h);
596    evas_object_image_data_copy_set(o, dst);
597    if (dst != (unsigned int *)src) free(dst);
598    ecore_x_image_free(img);
599    evas_object_image_data_update_add(o, 0, 0, sman->w, sman->h);
600    e_widget_preview_extern_object_set(op, o);
601    evas_object_show(o);
602
603    evas_object_show(op);
604    evas_object_show(oa);
605    
606    e_widget_aspect_child_set(oa, op);
607    e_widget_list_object_append(o_content, oa, 0, 0, 0.5);
608    
609    o = e_widget_list_add(evas, 1, 1);
610    o_hlist = o;
611
612    o = e_widget_framelist_add(evas, _("Quality"), 0);
613    ol = o;
614
615    rg = e_widget_radio_group_new(&quality);
616    o = e_widget_radio_add(evas, _("Perfect"), 100, rg);
617    e_widget_framelist_object_append(ol, o);
618    o = e_widget_radio_add(evas, _("High"), 90, rg);
619    e_widget_framelist_object_append(ol, o);
620    o = e_widget_radio_add(evas, _("Medium"), 70, rg);
621    e_widget_framelist_object_append(ol, o);
622    o = e_widget_radio_add(evas, _("Low"), 50, rg);
623    e_widget_framelist_object_append(ol, o);
624    
625    e_widget_list_object_append(o_hlist, ol, 1, 0, 0.5);
626
627    screen = -1;
628    if (eina_list_count(scon->zones) > 1)
629      {
630         Eina_List *l;
631         E_Zone *z;
632         int i;
633         
634         o = e_widget_framelist_add(evas, _("Screen"), 0);
635         ol = o;
636         
637         rg = e_widget_radio_group_new(&screen);
638         o = e_widget_radio_add(evas, _("All"), -1, rg);
639         o_radio_all = o;
640         evas_object_smart_callback_add(o, "changed", _screen_change_cb, NULL);
641         e_widget_framelist_object_append(ol, o);
642         i = 0;
643         EINA_LIST_FOREACH(scon->zones, l, z)
644           {
645              char buf[32];
646
647              if (z->num >= MAXZONES) continue;
648              snprintf(buf, sizeof(buf), "%i", z->num);
649              o = e_widget_radio_add(evas, buf, z->num, rg);
650              o_radio[z->num] = o;
651              evas_object_smart_callback_add(o, "changed", _screen_change_cb, NULL);
652              e_widget_framelist_object_append(ol, o);
653              
654              o = evas_object_rectangle_add(evas2);
655              evas_object_event_callback_add(o, EVAS_CALLBACK_MOUSE_DOWN, 
656                                             _rect_down_cb, NULL);
657              o_rectdim[z->num] = o;
658              evas_object_color_set(o, 0, 0, 0, 0);
659              evas_object_show(o);
660              evas_object_geometry_get(o_img, NULL, NULL, &w, &h);
661              evas_object_move(o, 
662                               (z->x * w) / sman->w,
663                               (z->y * h) / sman->h);
664              evas_object_resize(o, 
665                                 (z->w * w) / sman->w,
666                                 (z->h * h) / sman->h);
667              i++;
668           }
669         
670         e_widget_list_object_append(o_hlist, ol, 1, 0, 0.5);
671      }
672    
673    e_widget_list_object_append(o_content, o_hlist, 0, 0, 0.5);
674
675    o = o_content;
676    e_widget_size_min_get(o, &w, &h);
677    edje_extern_object_min_size_set(o, w, h);
678    edje_object_part_swallow(o_bg, "e.swallow.content", o);
679    evas_object_show(o);
680    
681    ///////////////////////////////////////////////////////////////////////
682    
683    o = e_widget_list_add(evas, 1, 1);
684    o_box = o;
685    e_widget_on_focus_hook_set(o, _on_focus_cb, NULL);
686    edje_object_part_swallow(o_bg, "e.swallow.buttons", o);
687
688    o = e_widget_button_add(evas, _("Save"), NULL, _win_save_cb, win, NULL);
689    e_widget_list_object_append(o_box, o, 1, 0, 0.5);
690    o = e_widget_button_add(evas, _("Share"), NULL, _win_share_cb, win, NULL);
691    e_widget_list_object_append(o_box, o, 1, 0, 0.5);
692    o = e_widget_button_add(evas, _("Cancel"), NULL, _win_cancel_cb, win, NULL);
693    e_widget_list_object_append(o_box, o, 1, 0, 0.5);
694    
695    o = o_box;
696    e_widget_size_min_get(o, &w, &h);
697    edje_extern_object_min_size_set(o, w, h);
698    edje_object_part_swallow(o_bg, "e.swallow.buttons", o);
699    
700    o = evas_object_rectangle_add(evas);
701    o_event = o;
702    mask = 0;
703    if (!evas_object_key_grab(o, "Tab", mask, ~mask, 0)) printf("grab err\n");
704    mask = evas_key_modifier_mask_get(evas, "Shift");
705    if (!evas_object_key_grab(o, "Tab", mask, ~mask, 0)) printf("grab err\n");
706    mask = 0;
707    if (!evas_object_key_grab(o, "Return", mask, ~mask, 0)) printf("grab err\n");
708    mask = 0;
709    if (!evas_object_key_grab(o, "KP_Enter", mask, ~mask, 0)) printf("grab err\n");
710    evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN, _key_down_cb, NULL);
711    
712    edje_object_size_min_calc(o_bg, &w, &h);
713    evas_object_resize(o_bg, w, h);
714    e_win_resize(win, w, h);
715    e_win_size_min_set(win, w, h);
716    e_win_size_max_set(win, 99999, 99999);
717    e_win_show(win);
718    e_win_border_icon_set(win, "enlightenment/shot");
719    
720    if (!e_widget_focus_get(o_bg)) e_widget_focus_set(o_box, 1);
721 }
722
723 static Eina_Bool
724 _shot_delay(void *data)
725 {
726    timer = NULL;
727    _shot_now(data);
728    return EINA_FALSE;
729 }
730
731 static void
732 _shot(E_Zone *zone)
733 {
734    if (timer) ecore_timer_del(timer);
735    timer = ecore_timer_add(1.0, _shot_delay, zone);
736 }
737
738 static void
739 _e_mod_menu_cb(void *data __UNUSED__, E_Menu *m, E_Menu_Item *mi __UNUSED__)
740 {
741    if (m->zone) _shot(m->zone);
742 }
743
744 static void
745 _e_mod_action_cb(E_Object *obj, const char *params __UNUSED__)
746 {
747    E_Zone *zone = NULL;
748    
749    if (obj)
750      {
751         if (obj->type == E_MANAGER_TYPE)
752            zone = e_util_zone_current_get((E_Manager *)obj);
753         else if (obj->type == E_CONTAINER_TYPE)
754            zone = e_util_zone_current_get(((E_Container *)obj)->manager);
755         else if (obj->type == E_ZONE_TYPE)
756            zone = ((E_Zone *)obj);
757         else
758            zone = e_util_zone_current_get(e_manager_current_get());
759      }
760    if (!zone) zone = e_util_zone_current_get(e_manager_current_get());
761    if (!zone) return;
762    if (timer)
763       {
764          ecore_timer_del(timer);
765          timer = NULL;
766       }
767    _shot_now(zone);
768 }
769
770 static void
771 _e_mod_menu_add(void *data __UNUSED__, E_Menu *m)
772 {
773    E_Menu_Item *mi;
774    
775    mi = e_menu_item_new(m);
776    e_menu_item_label_set(mi, _("Take Screenshot"));
777    e_util_menu_item_theme_icon_set(mi, "screenshot");
778    e_menu_item_callback_set(mi, _e_mod_menu_cb, NULL);
779 }
780
781 /* module setup */
782 EAPI E_Module_Api e_modapi =
783 {
784    E_MODULE_API_VERSION,
785      "Shot"
786 };
787
788 EAPI void *
789 e_modapi_init(E_Module *m)
790 {
791    e_module_delayed_set(m, 1);
792    
793    shot_module = m;
794    act = e_action_add("shot");
795    if (act)
796      {
797         act->func.go = _e_mod_action_cb;
798         e_action_predef_name_set(_("Screen"), _("Take Screenshot"),
799                                  "shot", NULL, NULL, 0);
800      }
801    maug = e_int_menus_menu_augmentation_add_sorted
802       ("main/2",  _("Take Screenshot"), _e_mod_menu_add, NULL, NULL, NULL);
803    return m;
804 }
805
806 EAPI int
807 e_modapi_shutdown(E_Module *m __UNUSED__)
808 {
809    _share_done();
810    if (win)
811      {
812         e_object_del(E_OBJECT(win));
813         win = NULL;
814      }
815    if (timer)
816      {
817         ecore_timer_del(timer);
818         timer = NULL;
819      }
820    if (maug)
821      {
822         e_int_menus_menu_augmentation_del("main/2", maug);
823         maug = NULL;
824      }
825    if (act)
826      {
827         e_action_predef_name_del(_("Screen"), _("Take Screenshot"));
828         e_action_del("shot");
829         act = NULL;
830      }
831    shot_module = NULL;
832    return 1;
833 }
834
835 EAPI int
836 e_modapi_save(E_Module *m __UNUSED__)
837 {
838    return 1;
839 }