Subversion Repositories Kolibri OS

Rev

Rev 9597 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #define MEMSIZE 1024 * 40
  2. #include "../lib/kolibri.h"
  3. #include "../lib/strings.h"
  4. #include "../lib/mem.h"
  5. #include "../lib/gui.h"
  6.  
  7. #include "../lib/obj/libimg.h"
  8. #include "../lib/obj/box_lib.h"
  9. #include "../lib/obj/proc_lib.h"
  10.  
  11. /* === TRANSLATIONS === */
  12.  
  13. #ifdef LANG_RUS
  14.         ?define T_SCREENSHOT "‘ªà¨­è®â"
  15.         ?define T_READY "ƒ®â®¢."
  16.         ?define T_RECORD "‡ ¯¨áì"
  17.         ?define T_STOP "Žáâ ­®¢¨âì § ¯¨áì"
  18.         ?define T_SETTINGS " áâனª¨"
  19.         ?define T_EDITBOX_FRAME "ãâì á®åà ­¥­¨ï áªà¨­è®â "
  20.         ?define T_DELAY "‡ ¤¥à¦ª  ¢ ᥪ㭤 å"
  21.         ?define T_NO_DIR " ¯ª  ¤«ï á®åà ­¥­¨ï ­¥ áãé¥áâ¢ã¥â!"
  22. #else
  23.         ?define T_SCREENSHOT "Screenshot"
  24.         ?define T_READY "Ready."
  25.         ?define T_RECORD "Record"
  26.         ?define T_STOP "Stop recording"
  27.         ?define T_SETTINGS "Settings"
  28.         ?define T_EDITBOX_FRAME "Save path"
  29.         ?define T_DELAY "Delay in seconds"
  30.         ?define T_NO_DIR "Saving directory does not exists!"
  31. #endif
  32.  
  33. /* === DATA === */     
  34.  
  35. proc_info Form;
  36.  
  37. enum {
  38.         BTN_SCREENSHOT=10,
  39.         BTN_RECORD,
  40.         BTN_SETTINGS,
  41.         BTN_CHOOSE_SAVING_PATH
  42. };
  43.  
  44. bool recording=false;
  45.  
  46. #define PD 18 //padding
  47. #define SETTINGS_Y PD+PD+60+10
  48.  
  49. char save_path[4096];
  50.  
  51. more_less_box delay = { 1, 0, SETTINGS_Y, T_DELAY };
  52. edit_box edit_save = {260,PD,SETTINGS_Y+50,0xffffff,0x94AECE,0xFFFfff,0xffffff,
  53.         0x10000000,sizeof(save_path)-2,#save_path,0, 0b};
  54.  
  55. bool show_settings = false;
  56.  
  57. opendialog open_folder_dialog =
  58. {
  59.   2, //0-file, 2-save, 3-select folder
  60.   #Form,
  61.   #communication_area_name,
  62.   0,
  63.   0, //dword opendir_path,
  64.   #save_path, //dword dir_default_path,
  65.   #open_dialog_path,
  66.   #DrawWindow,
  67.   0,
  68.   #save_path, //dword openfile_path,
  69.   0, //dword filename_area,
  70.   0, //dword filter_area,
  71.   420,
  72.   NULL,
  73.   320,
  74.   NULL
  75. };
  76.  
  77. /* === CODE === */
  78.  
  79. void init_libraries()
  80. {
  81.         load_dll(libimg, #libimg_init, 1);
  82.         load_dll(boxlib, #box_lib_init,0);
  83.         load_dll(Proc_lib,  #OpenDialog_init,0);
  84.         OpenDialog_init stdcall (#open_folder_dialog); 
  85. }
  86.  
  87. void main()
  88. {      
  89.         int id;
  90.  
  91.         I_Param = T_READY;
  92.         init_libraries();
  93.  
  94.         edit_box_set_text stdcall (#edit_save, "/tmp0/1");     
  95.  
  96.         @SetEventMask(EVM_REDRAW+EVM_KEY+EVM_BUTTON+EVM_MOUSE+EVM_MOUSE_FILTER);
  97.         loop() switch(@WaitEventTimeout(delay.value*100))
  98.         {
  99.         case evMouse:
  100.                 edit_box_mouse stdcall (#edit_save);
  101.                 break;
  102.  
  103.         case evButton:
  104.                 id = @GetButtonID();
  105.                 switch(id){
  106.                         case CLOSE_BTN: @ExitProcess();
  107.                         case BTN_SCREENSHOT: EventScreenshotClick(); break;
  108.                         case BTN_RECORD: EventRecordingClick(); break;
  109.                         case BTN_SETTINGS: EventSettingsClick(); break;
  110.                         case BTN_CHOOSE_SAVING_PATH: EventChooseSavePathClick(); break;
  111.                         default: delay.click(id);
  112.                 }
  113.                 break;
  114.  
  115.         case evKey:
  116.                 @GetKey();
  117.                 edit_box_key stdcall (#edit_save);
  118.                 EAX >>= 16;
  119.                 if (SCAN_CODE_ENTER == AL) EventScreenshotClick();
  120.                 else if (SCAN_CODE_ESC == AL) ExitProcess();
  121.                 break;
  122.      
  123.         case evReDraw:
  124.                 DrawWindow();
  125.  
  126.         default:
  127.                 if (recording) MakeScreenshot();
  128.         }
  129. }
  130.  
  131.  
  132. void DrawWindow()
  133. {
  134.         unsigned i;
  135.  
  136.         sc.get();
  137.         DefineAndDrawWindow(screen.w-400, screen.h/3, 280,
  138.                 skin_h + 50+PD+PD, 0x34, sc.work, "EasyShot",0);
  139.         GetProcessInfo(#Form, SelfInfo);
  140.  
  141.         if (!recording) {
  142.                 DrawCaptButton(PD, PD, 101, 28, BTN_SCREENSHOT,
  143.                         0x0090B8, 0xFFFfff, T_SCREENSHOT);
  144.                 DrawCaptButton(PD+105, PD, 75, 28, BTN_RECORD,
  145.                         0x0090B8, 0xFFFfff, T_RECORD);
  146.         } else {
  147.                 DrawCaptButton(PD, PD, 96+80+4, 28, BTN_RECORD,
  148.                         0xC75C54, 0xFFFfff, T_STOP);
  149.         }
  150.         DefineButton(PD+200, PD, 35, 28, BTN_SETTINGS, sc.button);
  151.         for (i=0; i<=2; i++) DrawBar(PD+210, i*5+PD+9, 15, 2, sc.button_text);
  152.         DrawStatusBar(I_Param);
  153.  
  154.         delay.draw(PD, SETTINGS_Y);
  155.         DrawFileBox(#edit_save, T_EDITBOX_FRAME, BTN_CHOOSE_SAVING_PATH);
  156.  
  157. }
  158.  
  159. void DrawStatusBar(char *s)
  160. {
  161.         I_Param = s;
  162.         WriteTextWithBg(PD, 35+PD, 0xD0, sc.work_text, I_Param, sc.light);
  163. }
  164.  
  165. dword ScreenshotBuf()
  166. {
  167.         static dword screenshot;
  168.         if (!screenshot) screenshot = malloc(screen.w * screen.h * 3); 
  169.         return screenshot;
  170. }
  171.  
  172. bool GetSavingPath()
  173. {
  174.         int i=0;
  175.         char save_file_name[4096];
  176.         do {
  177.                 i++;
  178.                 //sprintf(, "%s/screen_%i.png", #save_path, i);
  179.                 strcpy(#save_file_name, #save_path);
  180.                 if (save_file_name[strlen(#save_file_name)-1]!='/') chrcat(#save_file_name, '/');
  181.                 strcat(#save_file_name, "scr_");
  182.                 strcat(#save_file_name, itoa(i));
  183.                 strcat(#save_file_name, ".png");
  184.         } while (file_exists(#save_file_name));
  185.  
  186.         if (!dir_exists(#save_path)) {
  187.                 DrawStatusBar(T_NO_DIR);
  188.                 return NULL;
  189.         }
  190.         return #save_file_name;
  191. }
  192.  
  193. void MakeScreenshot()
  194. {
  195.         if (I_Path = GetSavingPath()) {
  196.                 CopyScreen(ScreenshotBuf(), 0, 0, screen.w, screen.h);
  197.                 I_Param = save_image(ScreenshotBuf(), screen.w, screen.h, I_Path);
  198.                 if (!I_Param) I_Param = I_Path;
  199.                 DrawStatusBar(I_Param);
  200.         } else {
  201.                 recording = false;
  202.                 DrawWindow();
  203.         }
  204. }
  205.  
  206. //===================================================//
  207. //                                                   //
  208. //                      EVENTS                       //
  209. //                                                   //
  210. //===================================================//
  211.  
  212. void EventScreenshotClick()
  213. {
  214.         MinimizeWindow();
  215.         pause(delay.value*100);
  216.         MakeScreenshot();
  217.         ActivateWindow(GetProcessSlot(Form.ID));
  218. }
  219.  
  220. void EventRecordingClick()
  221. {
  222.         recording ^= 1;
  223.         DrawWindow();
  224. }
  225.  
  226. void EventSettingsClick()
  227. {
  228.         show_settings ^= 1;
  229.         @MoveSize(OLD, OLD, show_settings*65 + 280,
  230.                 show_settings*110 + skin_h + PD+PD+50);
  231. }
  232.  
  233. void EventChooseSavePathClick()
  234. {
  235.         OpenDialog_start stdcall (#open_folder_dialog);
  236.         if (open_folder_dialog.status) {
  237.                 edit_box_set_text stdcall (#edit_save, #save_path);    
  238.         }
  239. }