[webkit-help] npapi resize problems
Tim Prepscius
timprepscius at gmail.com
Mon May 24 04:52:08 PDT 2010
okay even more information:
I found this post:
http://stackoverflow.com/questions/1770415/firefox-cocoa-plugin
NP_CGContext* npContext = currentInstance->window.window;
NSWindow* browserWindow = [[[NSWindow alloc]
initWithWindowRef:npContext->window] autorelease];
int y = [browserWindow frame].size.height -
(clipRect.bottom - clipRect.top) - currentInstance->window.y;
....
so for kicks I pulled the values of browserWindow frame size height.
and they "stay correct" after resize..
hmmm..
so I guess I can put in a hack to use this instead of the port bounds...
I wonder if there is a way to do this without using Cocoa.
????
-tim
On 5/24/10, Tim Prepscius <timprepscius at gmail.com> wrote:
> So just a little bit more information..
>
> The change in math is coming from:
> GetPortBounds( )
>
> which after the resize is 50 pixels greater vertically. hhhmmmm...
>
> GetPortBounds of
> CGrafPtr pkPort = aglGetDrawable(m_pkAglContext);
>
> which was:
> m_pkAglContext = aglCreateContext(pkPixelFormat,0); and
> if (!aglSetDrawable(m_pkAglContext,m_pkAglDrawable)
>
> m_pkAglDrawable = (AGLDrawable)GetWindowPort(pkWindow);
>
> and pkWindow refers back to that currentInstance->window.window
>
> --
>
> hmmmmmmmmmmmm
>
> ...
>
> So it seems to me that.
>
> The context is correctly associated with the drawable, which is the window
> The NP_SetWindow is sending in the correct window.x window.y clip
>
> But somewhere during the recomputation of layout during resize, the
> window port is resized so as not to include the title bar.
>
>
> Does this sound correct?
>
> If it is correct, I see three possible solutions, both of which I am
> not sure how I would implement.
>
> Solution #1. Find the correct variable to subtract out of this
> GetPortBounds. I have no idea.. Any thoughts? This is obviously the
> correct solution.
>
> Solution #2: Manufacture a resize event and send it to the window.
> Always subtract some hacked constant from GetPortBounds.
>
> Solution #3: Catch the resize event for the window. Thereafter,
> subtract out some hacked value.
>
>
> Any thoughts? Hints.. Especially to solution #1? Is there a better
> way. Is this possible in pure carbon? I really really am not looking
> forward to obj-c.
>
> -tim
>
> On 5/24/10, Tim Prepscius <timprepscius at gmail.com> wrote:
>> Greetings,
>>
>> I'm not really sure if this is the appropriate place to pose this
>> question.
>> Anyway, here goes:
>>
>> I've developed an opengl plugin for firefox/safari/chrome under
>> win32/osx.
>>
>> Within OSX, using Safari my plugin exhibits incorrect vertical
>> placement behavior after the browser window is resized.
>>
>> In detail:
>> 1. I start the browser and go to the plugin test page.
>> 2. Plugin starts fine, is correctly placed.. (I made a surrounding div
>> so I can see placement problems)
>>
>> [ NPP_SetWindow is called, I look at the window.x window.y
>> window.width window.height
>> I also look at the clipping rectange ]
>>
>> 3. I scroll the window. the plugin maintains its appropriate
>> relative position.
>>
>> [NPP_SetWindow is called, I can see the window.y changing correctly ]
>>
>> 4. I resize the window by only one pixel horizontally (it doesn't
>> matter how much or in what direction)
>>
>> The window.x window.y window.width window.height change appropriately.
>> In this case the X variable might change by 1 pixel width by 1 or
>> something like that.
>>
>> *** however *** the plugin now draws at the wrong vertical position.
>> The number of pixels off the plugin draws is equal to the number of
>> pixels of the top "url + buttons" area.
>>
>> -------------------
>>
>> So, I'm searching for the correct vertical placement variable to
>> add/subtract from window.y but have not found it.
>>
>> I've tried also looking at that CGContext, and working backwards from
>> there, but it doesn't give me any different information.
>>
>> I think I need to somehow get some attribute of that window, to see if
>> there is an additional offset, but I'm not sure which one.
>>
>> -------------
>>
>> Any hints?
>>
>> -tim
>>
>>
>> :::::::::::::::::::::::::::::::::
>>
>> // Called to update a plugin instances's NPWindow
>> NPError NPP_SetWindow(NPP instance, NPWindow* window)
>> {
>> fprintf (stderr, "NP_SetWindow called!!!\n");
>>
>> if(instance == NULL)
>> return NPERR_INVALID_INSTANCE_ERROR;
>>
>> if(window == NULL)
>> return NPERR_GENERIC_ERROR;
>>
>> PluginInstance* currentInstance = (PluginInstance*)(instance->pdata);
>>
>> currentInstance->window = *window;
>>
>> NP_CGContext *context =
>> ((NP_CGContext*)(currentInstance->window.window));
>>
>> fprintf (stderr, "%d %d %d %d - %d %d %d %d",
>> currentInstance->window.x, currentInstance->window.y,
>> currentInstance->window.width, currentInstance->window.height,
>> currentInstance->window.clipRect.left,
>> currentInstance->window.clipRect.top,
>> currentInstance->window.clipRect.right,
>> currentInstance->window.clipRect.bottom
>> );
>>
>> CGContextRef cgContext =
>> ((NP_CGContext*)(currentInstance->window.window))->context;
>> CGRect rect = CGRectMake(0,0,1,1);
>> CGRect userRect = CGContextConvertRectToUserSpace (cgContext, rect);
>> fprintf(stderr, "userspace %f %f %f %f", userRect.origin.x,
>> userRect.origin.y, userRect.size.width, userRect.size.height);
>>
>> CGRect deviceRect = CGContextConvertRectToDeviceSpace (cgContext, rect);
>> fprintf(stderr, "devicespace %f %f %f %f", deviceRect.origin.x,
>> deviceRect.origin.y, deviceRect.size.width, deviceRect.size.height);
>>
>>
>> if (!currentInstance->initialized && context)
>> {
>> currentInstance->initialized = true;
>>
>> StartInstance(context->window,currentInstance->argc,currentInstance->argn,currentInstance->argv);
>> UpdatePositionWidthHeight (context->window,
>> currentInstance->window.x, currentInstance->window.y,
>> currentInstance->window.width, currentInstance->window.height);
>> }
>> else
>> {
>> UpdatePositionWidthHeight (context->window,
>> currentInstance->window.x, currentInstance->window.y,
>> currentInstance->window.width, currentInstance->window.height);
>> }
>>
>> return NPERR_NO_ERROR;
>> }
>> :::::::::::::::::::::::::::
>>
>
More information about the webkit-help
mailing list