@@ -253,14 +253,14 @@ public string CaptionText
253253 {
254254 get
255255 {
256- return String . Format ( CultureInfo . InvariantCulture ,
257- "{0}\u00D7 {1}" ,
256+ return String . Format ( CultureInfo . InvariantCulture ,
257+ "{0}\u00D7 {1}" ,
258258 ( int ) ( this . WindowWidth - 2 * OuterBorderWidth ) ,
259259 ( int ) ( this . WindowHeight - 2 * OuterBorderWidth - HeaderHeight ) ) ;
260260 }
261261 }
262262
263- public void SnapToRenderView ( )
263+ private IList < string > GetWindowClassNames ( )
264264 {
265265 var classNames = new List < string > ( ) ;
266266
@@ -269,61 +269,66 @@ public void SnapToRenderView()
269269 var orw = Models . AppsInterop . OctaneRenderWindow . GetFromAllProcesses ( ) ;
270270 classNames . AddRange ( orw . Select ( w => w . ClassName ) ) ;
271271
272+ classNames . Add ( "MozillaWindowClass" ) ; // TODO: do not use window class names, check any applications with topmost windows
273+
274+ return classNames ;
275+ }
276+
277+ public void SnapToRenderView ( )
278+ {
272279 // select foreground window from several processes of supported applications
273- var window = Models . AppsInterop . NativeWindow . GetTopMostWindow ( classNames ) ;
280+ var nativeWindow = Models . AppsInterop . NativeWindow . GetTopMostWindow ( this . GetWindowClassNames ( ) ) ;
274281
275- if ( window != null )
282+ if ( nativeWindow != null )
276283 {
277- switch ( window . ClassName )
284+ if ( nativeWindow . ClassName == Models . AppsInterop . PhotoViewerWindow . MainWindowClassName )
278285 {
279- case Models . AppsInterop . PhotoViewerWindow . MainWindowClassName :
280- {
281- var photoViewerWindow = new Models . AppsInterop . PhotoViewerWindow ( window . Handle ) ;
286+ var photoViewerWindow = new Models . AppsInterop . PhotoViewerWindow ( nativeWindow . Handle ) ;
282287
283- var rectViewedImage = photoViewerWindow . PhotoCanvasRect ( ) ;
284- if ( ! rectViewedImage . IsEmpty )
285- {
286- this . PositionWindow ( Models . Geometry . Point . Zero , rectViewedImage ) ;
287- }
288+ var rectViewedImage = photoViewerWindow . PhotoCanvasRect ( ) ;
289+ if ( ! rectViewedImage . IsEmpty )
290+ {
291+ this . PositionWindow ( Models . Geometry . Point . Zero , rectViewedImage ) ;
292+ }
293+ }
294+ else
295+ {
296+ Task . Factory . StartNew < Tuple < Models . Geometry . Rectangle , Models . Geometry . Point > > ( ( ) =>
297+ {
298+ var bitmap = nativeWindow . GetShot ( ) ;
299+ var flatImage = new Models . FlatImage ( bitmap ) ;
288300
289- break ;
301+ Models . Geometry . Rectangle rectRenderedImage ;
302+ if ( Models . AppsInterop . OctaneRenderWindow . GetFromAllProcesses ( ) . Any ( w => w . ClassName == nativeWindow . ClassName ) )
303+ {
304+ // TODO: remove this Octane Render specific code
305+ rectRenderedImage = Models . AppsInterop . OctaneRenderWindow . FindRenderedImageBorders ( flatImage ) ;
290306 }
291- default : // TODO: check is Octane Render!
292- //case Models.AppInterop.OctaneRender.OctaneRenderWindow.MainWindowClassName:
307+ else
308+ {
309+ rectRenderedImage = flatImage . FindBoundingsOfInnerImage ( ) ;
310+ }
311+
312+ var nativeWindowLocation = new Models . Geometry . Point ( nativeWindow . Location . X , nativeWindow . Location . Y ) ;
313+ return new Tuple < Models . Geometry . Rectangle , Models . Geometry . Point > ( rectRenderedImage , nativeWindowLocation ) ;
314+ } ) . ContinueWith ( ( t ) =>
315+ {
316+ var rectRenderedImage = t . Result . Item1 ;
317+ var windowLocation = t . Result . Item2 ;
318+ if ( ! rectRenderedImage . IsEmpty )
293319 {
294- Task . Factory . StartNew < Tuple < Models . Geometry . Rectangle , Models . Geometry . Point > > ( ( ) =>
295- {
296- var octaneWindow = new Models . AppsInterop . OctaneRenderWindow ( window . Handle ) ;
297- var bitmap = octaneWindow . GetShot ( ) ;
298- var flatImage = new Models . FlatImage ( bitmap ) ;
299- var rectRenderedImage = Models . AppsInterop . OctaneRenderWindow . FindRenderedImageBorders ( flatImage ) ;
300- var octaneWindowLocation = new Models . Geometry . Point ( octaneWindow . Location . X , octaneWindow . Location . Y ) ;
301- return new Tuple < Models . Geometry . Rectangle , Models . Geometry . Point > ( rectRenderedImage , octaneWindowLocation ) ;
302- } ) . ContinueWith ( ( t ) =>
303- {
304- var rectRenderedImage = t . Result . Item1 ;
305- var octaneWindowLocation = t . Result . Item2 ;
306- if ( ! rectRenderedImage . IsEmpty )
307- {
308- this . PositionWindow ( t . Result . Item2 , t . Result . Item1 ) ;
309- }
310- } ,
311- TaskScheduler . FromCurrentSynchronizationContext ( ) ) ;
312-
313- break ;
320+ this . PositionWindow ( t . Result . Item2 , t . Result . Item1 ) ;
314321 }
315- //default:
316- //{
317- // throw new NotSupportedException(window.ClassName);
318- //}
322+ } ,
323+ TaskScheduler . FromCurrentSynchronizationContext ( ) ) ;
319324 }
320325 }
321326 }
322327
323328 private void PositionWindow ( Models . Geometry . Point parentLocation , Models . Geometry . Rectangle rectRenderedImage )
324329 {
325330 var diffX = 0.0 ;
326- var diffY = HeaderHeight ;
331+ var diffY = HeaderHeight ;
327332 // TODO: remove magiс numbers
328333 this . WindowLeft = rectRenderedImage . Left + parentLocation . X - diffX - 1 ;
329334 this . WindowTop = rectRenderedImage . Top + parentLocation . Y - diffY - 1 ;
0 commit comments