// Get backdrop pattern short display_get_pattern(BOOL use_custom) { APTR iff; BPTR file; struct WBPatternPrefs pattern[NUM_PATTERNS]; short a; char *data[NUM_PATTERNS],*filename; short change=0; ULONG flags=0; // Copy from system fields to custom fields (if custom field is empty, or custom flag is not set) for (a=0;a<4;a++) { if (!GUI->env_BackgroundPic[a][0] || !use_custom) { strcpy(GUI->env_BackgroundPic[a],environment->env->env_BackgroundPic[a]); GUI->env_BackgroundFlags[a]=environment->env->env_BackgroundFlags[a]; GUI->env_BackgroundBorderColour[a]=environment->env->env_BackgroundBorderColour[a]; } } // Pattern disabled? if (environment->env->display_options&DISPOPTF_NO_BACKDROP) { // Check both patterns are invalid for (a=0;a<NUM_PATTERNS;a++) { // Is pattern valid? if (GUI->pattern[a].valid) { // Clear existing pattern display_update_pattern(a,0); // Free pattern data FreeVec(GUI->pattern[a].data); GUI->pattern[a].data=0; // Free pattern FreePattern(&GUI->pattern[a]); } } return 0; } // Use pattern prefs? if (environment->env->display_options&DISPOPTF_USE_WBPATTERN) { // End pattern notification stop_file_notify(GUI->pattern_notify); // Get filename filename=(IntuitionBase->LibNode.lib_Version<39)?"env:sys/wb.pat":"env:sys/wbpattern.prefs"; // User-specified file? if (environment->env->backdrop_prefs[0]) { BPTR lock; // Does file exist? if (lock=Lock(environment->env->backdrop_prefs,ACCESS_READ)) { // Yep UnLock(lock); filename=environment->env->backdrop_prefs; } } // Initialise pattern and data pointers for (a=0;a<NUM_PATTERNS;a++) { pattern[a]=GUI->pattern[a].prefs; data[a]=0; } // Try to open wbpattern prefs file if (IntuitionBase->LibNode.lib_Version>=39 && (iff=IFFOpen(filename,IFF_READ,ID_PREF))) { ULONG id; // Scan for chunks we know and love while (id=IFFNextChunk(iff,0)) { // FastIPrefs FIP0 chunk? if (id==ID_FIP0) { // Get flags IFFReadChunkBytes(iff,&flags,sizeof(flags)); } // PTRN chunk? else if (id==ID_PTRN) { struct WBPatternPrefs *prefs; // Allocate space for chunk if (prefs=AllocVec(IFFChunkSize(iff),MEMF_CLEAR)) { // Read chunk IFFReadChunkBytes(iff,prefs,-1); // Pattern we can handle? if (prefs->wbp_Which==WBP_ROOT || prefs->wbp_Which==WBP_DRAWER) { // Copy data CopyMem( (char *)prefs, (char *)&pattern[prefs->wbp_Which], sizeof(struct WBPatternPrefs)); // Allocate pattern data if (prefs->wbp_DataLength>0 && (data[prefs->wbp_Which]=AllocVec(prefs->wbp_DataLength+1,MEMF_CLEAR))) { // Copy pattern data CopyMem((char *)(prefs+1),data[prefs->wbp_Which],prefs->wbp_DataLength); } } // Free chunk FreeVec(prefs); } } } // Close iff file IFFClose(iff); } // Couldn't find it, try for wb.pat else if (IntuitionBase->LibNode.lib_Version<39 && (file=Open(filename,MODE_OLDFILE))) { // Allocate pattern data if (data[PATTERN_MAIN]=AllocVec(96,MEMF_CLEAR)) { // Skip forwards Seek(file,20,OFFSET_CURRENT); // Read pattern if ((Read(file,data[PATTERN_MAIN],96))<96) { FreeVec(data[PATTERN_MAIN]); data[PATTERN_MAIN]=0; } // Fill out WBPatternPrefs else { pattern[PATTERN_MAIN].wbp_Flags=WBPF_PATTERN; pattern[PATTERN_MAIN].wbp_Depth=GUI->screen_pointer->BitMap.Depth; if (pattern[PATTERN_MAIN].wbp_Depth>MAXDEPTH) pattern[PATTERN_MAIN].wbp_Depth=MAXDEPTH; } } // Close file Close(file); } // Start notification of wbpattern prefs GUI->pattern_notify=start_file_notify(filename,NOTIFY_PATTERN_CHANGED,GUI->appmsg_port); } // Otherwise, under 39 user-defined pictures else if (GfxBase->LibNode.lib_Version>=39) { short pat; // Do both patterns for (pat=0;pat<NUM_PATTERNS;pat++) { // Got valid picture? if (GUI->env_BackgroundPic[pat][0]) { // Fill out WBPatternPrefs pattern[pat].wbp_Flags=0; pattern[pat].wbp_Which=pat; pattern[pat].wbp_DataLength=strlen(GUI->env_BackgroundPic[pat]); if (data[pat]=AllocVec(pattern[pat].wbp_DataLength+1,0)) strcpy(data[pat],GUI->env_BackgroundPic[pat]); } // Set to no pattern else { // Fill out WBPatternPrefs pattern[pat].wbp_Flags=WBPF_PATTERN; pattern[pat].wbp_DataLength=0; data[pat]=0; } } } // Otherwise, default to no pattern else { short pat; // Do both patterns for (pat=0;pat<NUM_PATTERNS;pat++) { // Fill out WBPatternPrefs pattern[pat].wbp_Flags=WBPF_PATTERN; pattern[pat].wbp_DataLength=0; data[pat]=0; } } // Go through both patterns for (a=0;a<NUM_PATTERNS;a++) { BOOL diff=0; short precision=0; // Using Opus settings? if (!(environment->env->display_options&DISPOPTF_USE_WBPATTERN)) { // Get precision if (GUI->env_BackgroundFlags[a]&ENVBF_PRECISION_NONE) precision=-1; else if (GUI->env_BackgroundFlags[a]&ENVBF_PRECISION_GUI) precision=2; else if (GUI->env_BackgroundFlags[a]&ENVBF_PRECISION_ICON) precision=1; else if (GUI->env_BackgroundFlags[a]&ENVBF_PRECISION_EXACT) precision=3; } // Maybe set in prefs else { // Get precision precision=(a==0)?PATF_WB_MODE(flags):PATF_LISTER_MODE(flags); } // Valid data? if (data[a]) { // No last pattern? if (!GUI->pattern[a].data) { diff=1; } // Changed from pattern to picture or vice versa? else if ((pattern[a].wbp_Flags&WBPF_PATTERN && !(GUI->pattern[a].prefs.wbp_Flags&WBPF_PATTERN)) || (!(pattern[a].wbp_Flags&WBPF_PATTERN) && GUI->pattern[a].prefs.wbp_Flags&WBPF_PATTERN)) { diff=1; } // Pattern pattern? else if (pattern[a].wbp_Flags&WBPF_PATTERN) { // Different depth? if (pattern[a].wbp_Depth!=GUI->pattern[a].prefs.wbp_Depth) diff=1; // Has data changed from the last one? else { short num,d; // Get amount of data num=PAT_HEIGHT*pattern[a].wbp_Depth; // Compare data for (d=0;d<num;d++) { if (((USHORT *)data[a])[d]!=((USHORT *)GUI->pattern[a].data)[d]) { diff=1; break; } } } } // Picture? else { // Different name for picture, or it's random? if (strcmp(data[a],GUI->pattern[a].data)!=0 || GUI->pattern[a].random) { diff=1; } // Precision changed? else if (precision!=GUI->pattern[a].precision) { diff=1; } // Stretching changed? else if (a==0 && ((GUI->env_BackgroundFlags[a]&ENVBF_STRETCH_PIC && !(GUI->pattern[a].flags&PATF_STRETCH)) || !(GUI->env_BackgroundFlags[a]&ENVBF_STRETCH_PIC) && (GUI->pattern[a].flags&PATF_STRETCH))) { diff=1; } // Centering changed? else if ((GUI->env_BackgroundFlags[a]&ENVBF_CENTER_PIC && !(GUI->pattern[a].flags&PATF_CENTER)) || !(GUI->env_BackgroundFlags[a]&ENVBF_CENTER_PIC) && (GUI->pattern[a].flags&PATF_CENTER)) { diff=2; } } } // Had last data? else if (GUI->pattern[a].data) diff=1; if (diff!=1) { // Border pen changed? if ((GUI->env_BackgroundFlags[a]&ENVBF_USE_COLOUR && GUI->pattern[a].border_pen==0) || (!(GUI->env_BackgroundFlags[a]&ENVBF_USE_COLOUR) && GUI->pattern[a].border_pen!=0)) { diff=3; } else if (GUI->pattern[a].border_pen!=0 && GUI->env_BackgroundFlags[a]&ENVBF_USE_COLOUR) { ULONG col[3]; GetPalette32( &GUI->screen_pointer->ViewPort, col, 1, (GUI->pattern[a].border_pen==-1)?0:GUI->pattern[a].border_pen); if (ENVBF_COL_R_GET(col[0])!=ENVBF_COL_R_GET(GUI->env_BackgroundBorderColour[a]) || ENVBF_COL_R_GET(col[1])!=ENVBF_COL_G_GET(GUI->env_BackgroundBorderColour[a]) || ENVBF_COL_R_GET(col[2])!=ENVBF_COL_B_GET(GUI->env_BackgroundBorderColour[a])) { diff=3; } } } // Has it changed? if (diff) { // Existing pattern valid? if (GUI->pattern[a].valid) { // Clear existing patterns display_update_pattern(a,0); } // Change more than centering? if (diff==1) { // Free existing pattern FreePattern(&GUI->pattern[a]); FreeVec(GUI->pattern[a].data); // Copy pattern and data pointer GUI->pattern[a].prefs=pattern[a]; GUI->pattern[a].data=data[a]; // Stretch? if (a==0 && GUI->env_BackgroundFlags[a]&ENVBF_STRETCH_PIC) { flags|=PATF_STRETCH; flags&=~PATF_CENTER; } else { flags&=~PATF_STRETCH; if (!(environment->env->display_options&DISPOPTF_USE_WBPATTERN) && GUI->env_BackgroundFlags[a]&ENVBF_CENTER_PIC) flags|=PATF_CENTER; else flags&=~PATF_CENTER; } // Set flags and precision GUI->pattern[a].flags=flags; GUI->pattern[a].precision=precision; // Initialise pattern GetPattern( &GUI->pattern[a], GUI->screen_pointer, GUI->env_BackgroundBorderColour[a]|(GUI->env_BackgroundFlags[a]&ENVBF_USE_COLOUR)); } // Change colour else if (diff==3) { // Initialise pattern colour GetPatternBorder( &GUI->pattern[a], GUI->screen_pointer, GUI->env_BackgroundBorderColour[a]|(GUI->env_BackgroundFlags[a]&ENVBF_USE_COLOUR)); } // Centering changed else { // Environment flags set for centering? if (!(environment->env->display_options&DISPOPTF_USE_WBPATTERN) && GUI->env_BackgroundFlags[a]&ENVBF_CENTER_PIC) GUI->pattern[a].flags|=PATF_CENTER; else GUI->pattern[a].flags&=~PATF_CENTER; } // Install new pattern display_update_pattern(a,1); } // If not, free data else FreeVec(data[a]); } return change; }
// Quit the program void quit(BOOL script) { // If main status window is open, close it if (main_status) { CloseProgressWindow(main_status); main_status=0; } if (GUI) { // Clear 'startup' flag for scripts GUI->flags&=~GUIF_DONE_STARTUP; // Close commodities cx_remove(GUI->cx); // Update environment settings env_update_settings(1); // Stop notify request RemoveNotifyRequest(GUI->notify_req); GUI->notify_req=0; // Is there a hide appicon? if (GUI->hide_appicon) { RemoveAppIcon(GUI->hide_appicon); FreeCachedDiskObject(GUI->hide_diskobject); } // Or an appmenuitem? if (GUI->hide_appitem) RemoveAppMenuItem(GUI->hide_appitem); // Launch shutdown script if (script) RunScript(SCRIPT_SHUTDOWN,0); // Set quit flag GUI->flags|=GUIF_PENDING_QUIT; // Shut the display down close_display(CLOSE_ALL,TRUE); // Send quit notifications quit_notify(); // Stop notifications stop_file_notify(GUI->pattern_notify); stop_file_notify(GUI->font_notify); stop_file_notify(GUI->modules_notify); stop_file_notify(GUI->commands_notify); stop_file_notify(GUI->env_notify); stop_file_notify(GUI->desktop_notify); stop_file_notify(GUI->filetype_notify); // Free application port if (GUI->appmsg_port) { DOpusAppMessage *amsg; RemPort(GUI->appmsg_port); while ((amsg=(DOpusAppMessage *)GetMsg(GUI->appmsg_port))) ReplyAppMessage(amsg); DeleteMsgPort(GUI->appmsg_port); GUI->appmsg_port=0; // Remove public semaphore RemSemaphore((struct SignalSemaphore *)&pub_semaphore); } // Flush IPC port IPC_Flush(&main_ipc); // Close all processes IPC_ListQuit(&GUI->lister_list,&main_ipc,0,TRUE); IPC_ListQuit(&GUI->group_list,&main_ipc,0,TRUE); IPC_ListQuit(&GUI->buttons_list,&main_ipc,0,TRUE); IPC_ListQuit(&GUI->startmenu_list,&main_ipc,0,TRUE); IPC_ListQuit(&GUI->process_list,&main_ipc,0,TRUE); IPC_ListQuit(&GUI->function_list,&main_ipc,0,TRUE); // Free buffers buffers_clear(0); // Remove all handlers RemFunctionTrap("*","#?"); // Free filetypes FreeMemHandle(GUI->filetype_memory); // Flush the filetype cache ClearFiletypeCache(); // Free lister toolbar FreeToolBar(GUI->toolbar); // Free menus and hotkeys CloseButtonBank(GUI->lister_menu); CloseButtonBank(GUI->hotkeys); // Free user menus CloseButtonBank(GUI->user_menu); FreeVec(GUI->user_menu_data); // Free backdrop list backdrop_free(GUI->backdrop); // Free icons if (GUI->lister_icon) FreeCachedDiskObject(GUI->lister_icon); if (GUI->button_icon) FreeCachedDiskObject(GUI->button_icon); // Free arrow image CloseImage(GUI->toolbar_arrow_image); #ifdef __amigaos3__ FreeVec(arrow_hi_data_chip); FreeVec(arrow_lo_data_chip); FreeVec(small_arrow_chip); FreeVec(big_arrow_chip); #ifndef USE_SCREENTITLE FreeVec(moon_big_data_chip); FreeVec(moon_small_data_chip); #endif FreeVec(command_arrow_chip); FreeVec(parent_arrow_chip); #endif // Free screen signal if (GUI->screen_signal!=-1) FreeSignal(GUI->screen_signal); // Delete notify port if (GUI->notify_port) DeleteMsgPort(GUI->notify_port); // Free position memory FreeMemHandle(GUI->position_memory); // Free command history Att_RemList(GUI->command_history,0); // Delete icon positioning port DeleteMsgPort(GUI->iconpos_port); // Free popup menu PopUpFreeHandle(GUI->desktop_menu); // Clear requester pattern hook in library if (GUI->flags2&GUIF2_BACKFILL_SET) SetReqBackFill(0,0); } // Free scripts FreeScripts(); // Free environment environment_free(environment); // Delete main message ports IPC_Flush(&main_ipc); DeleteMsgPort(main_ipc.command_port); DeleteMsgPort(main_ipc.reply_port); // Pause here for a couple of seconds to let everything clean up Delay(3*50); // Free global data FreeMemHandle(global_memory_pool); // Delete any temporary files delete_temp_files(0); // Free locale data free_locale_data(&locale); // Close input device if (InputBase) { #ifdef __amigaos4__ DropInterface((struct Interface *)IInput); #endif CloseDevice((struct IORequest *)&input_req); } // Close timer device if (TimerBase) { #ifdef __amigaos4__ DropInterface((struct Interface *)ITimer); #endif CloseDevice((struct IORequest *)&timer_req); } // Close console device if (ConsoleDevice) { #ifdef __amigaos4__ DropInterface((struct Interface *)IConsole); #endif CloseDevice((struct IORequest *)&console_req); } // Close libraries #ifdef __amigaos4__ DropInterface((struct Interface *)Imu); #endif CloseLibrary(muBase); #ifndef __amigaos3__ #ifdef __amigaos4__ DropInterface((struct Interface *)INewIcon); #endif CloseLibrary((struct Library *)NewIconBase); #endif #ifdef __amigaos4__ DropInterface((struct Interface *)ICyberGfx); #endif CloseLibrary(CyberGfxBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IAmigaGuide); #endif CloseLibrary(AmigaGuideBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IDataTypes); #endif CloseLibrary(DataTypesBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IAsl); #endif CloseLibrary(AslBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IIcon); #endif CloseLibrary(IconBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IDiskfont); #endif CloseLibrary(DiskfontBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IWorkbench); #endif CloseLibrary(WorkbenchBase); #ifdef __amigaos4__ DropInterface((struct Interface *)ICommodities); #endif CloseLibrary(CxBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IRexxSys); #endif CloseLibrary((struct Library *)RexxSysBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IUtility); #endif CloseLibrary(UtilityBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IGadTools); #endif CloseLibrary(GadToolsBase); #ifdef __amigaos4__ DropInterface((struct Interface *)ILayers); #endif CloseLibrary((struct Library *)LayersBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IGraphics); #endif CloseLibrary((struct Library *)GfxBase); #ifdef __amigaos4__ DropInterface((struct Interface *)IIntuition); #endif CloseLibrary((struct Library *)IntuitionBase); // Restore old current directory? if (old_current_dir) { UnLock(CurrentDir(old_current_dir)); } // Close the dopus5.library #ifdef __amigaos4__ DropInterface((struct Interface *)IDOpus); #endif CloseLibrary(DOpusBase); // Outahere! exit(0); }