@@ -288,22 +288,73 @@ async function copyImageToClipboard() {
288288 showError ( 'No image to copy' ) ;
289289 return ;
290290 }
291+
292+ const tempImage = new Image ( ) ;
293+ tempImage . crossOrigin = 'anonymous' ;
291294
292- // Fetch the image and create a clipboard item
293- const response = await fetch ( img . src ) ;
294- const blob = await response . blob ( ) ;
295- const data = [ new ClipboardItem ( { [ blob . type ] : blob } ) ] ;
296- await navigator . clipboard . write ( data ) ;
295+ await new Promise ( ( resolve , reject ) => {
296+ tempImage . onload = resolve ;
297+ tempImage . onerror = reject ;
298+ tempImage . src = img . src + '?t=' + new Date ( ) . getTime ( ) ;
299+ } ) ;
300+
301+ const canvas = document . createElement ( 'canvas' ) ;
302+ canvas . width = tempImage . naturalWidth ;
303+ canvas . height = tempImage . naturalHeight ;
304+ const ctx = canvas . getContext ( '2d' ) ;
305+ ctx . drawImage ( tempImage , 0 , 0 ) ;
306+
307+ try {
308+ const blob = await new Promise ( resolve => canvas . toBlob ( resolve , 'image/png' , 1.0 ) ) ;
309+ const clipboardItem = new ClipboardItem ( { 'image/png' : blob } ) ;
310+ await navigator . clipboard . write ( [ clipboardItem ] ) ;
311+
312+ const reader = new FileReader ( ) ;
313+ reader . onloadend = ( ) => {
314+ const base64data = reader . result ;
315+ try {
316+ localStorage . setItem ( 'lastScreensaverImage' , base64data ) ;
317+ } catch ( e ) {
318+ console . warn ( 'Failed to save to localStorage:' , e ) ;
319+ }
320+ } ;
321+ reader . readAsDataURL ( blob ) ;
322+
323+ const feedback = document . createElement ( 'div' ) ;
324+ feedback . className = 'image-upload-feedback' ;
325+ feedback . textContent = 'Image copied! ✓' ;
326+ img . parentElement . appendChild ( feedback ) ;
327+ setTimeout ( ( ) => feedback . remove ( ) , 2000 ) ;
328+
329+ } catch ( clipboardError ) {
330+ console . error ( 'Clipboard write failed:' , clipboardError ) ;
331+ const link = document . createElement ( 'a' ) ;
332+ const imgUrl = canvas . toDataURL ( 'image/png' ) ;
333+ link . href = imgUrl ;
334+ link . download = `screensaver-${ Date . now ( ) } .png` ;
335+ document . body . appendChild ( link ) ;
336+ link . click ( ) ;
337+ document . body . removeChild ( link ) ;
338+
339+ const feedback = document . createElement ( 'div' ) ;
340+ feedback . className = 'image-upload-feedback' ;
341+ feedback . textContent = 'Clipboard failed - Image downloaded instead' ;
342+ img . parentElement . appendChild ( feedback ) ;
343+ setTimeout ( ( ) => feedback . remove ( ) , 2000 ) ;
344+ }
345+ } catch ( error ) {
346+ console . error ( 'Error copying image:' , error ) ;
347+ showError ( 'Failed to copy image - CORS or network error' ) ;
297348
298- // Show success feedback
299349 const feedback = document . createElement ( 'div' ) ;
300350 feedback . className = 'image-upload-feedback' ;
301- feedback . textContent = 'Image copied to clipboard! ✓' ;
302- img . parentElement . appendChild ( feedback ) ;
303- setTimeout ( ( ) => feedback . remove ( ) , 2000 ) ;
304- } catch ( error ) {
305- console . error ( 'Failed to copy image:' , error ) ;
306- showError ( 'Failed to copy image to clipboard' ) ;
351+ feedback . style . backgroundColor = '#ef4444' ;
352+ feedback . textContent = 'Failed to copy image' ;
353+ const img = document . getElementById ( 'screensaver-image' ) ;
354+ if ( img && img . parentElement ) {
355+ img . parentElement . appendChild ( feedback ) ;
356+ setTimeout ( ( ) => feedback . remove ( ) , 2000 ) ;
357+ }
307358 }
308359}
309360
@@ -364,7 +415,9 @@ function buildScreensaverImageUrl(prompt) {
364415 nologo : 'true' ,
365416 model : modelSelect . value || 'unity' ,
366417 enhance : enhanceCheck . checked . toString ( ) ,
367- private : privateCheck . checked . toString ( )
418+ private : privateCheck . checked . toString ( ) ,
419+ t : Date . now ( ) ,
420+ cors : 'true'
368421 } ) ;
369422
370423 return `https://image.pollinations.ai/prompt/${ encodeURIComponent ( prompt ) } ?${ params . toString ( ) } ` ;
@@ -574,7 +627,14 @@ function initializeScreensaver() {
574627
575628 const copyBtn = document . getElementById ( 'screensaver-copy' ) ;
576629 if ( copyBtn ) {
577- copyBtn . addEventListener ( 'click' , copyImageToClipboard ) ;
630+ copyBtn . addEventListener ( 'click' , async ( ) => {
631+ try {
632+ await copyImageToClipboard ( ) ;
633+ } catch ( error ) {
634+ console . error ( 'Failed to copy image:' , error ) ;
635+ showError ( 'Failed to copy image' ) ;
636+ }
637+ } ) ;
578638 }
579639
580640 const downloadBtn = document . getElementById ( 'screensaver-download' ) ;
0 commit comments