سؤال

لقد قمت بإنشاء مكون إضافي بسيط يشبه العالم وهو يرسم الصندوق الأحمر.

التضمين في تطبيق Xulrunner يعمل المكون الإضافي بشكل جيد تقريبًا. يقوم تطبيق Xulrunner بنجاح بإعادة رسم المربع على تغيير حجم نافذة التطبيق.

ولكن بعد أي حدث للماوس ، على سبيل المثال - انقر الأيسر ، يتعطل طلبي مع "Stack Overflow". يقول Debugger إن السبب هو دورة لا نهاية لها من مكالمتين من ForwardMethod متبوعًا بدعوة واحدة من JSD_GetValueForObject

بعد محتويات مكدس تحطم هو التالي:

  • -[NSApplication _indexOfWindow:]
  • -[NSEvent window]
  • JSD_GetValueForObject
  • JSD_GetValueForObject
  • JSD_GetValueForObject
  • forwardMethod
  • forwardMethod
  • JSD_GetValueForObject
  • forwardMethod
  • forwardMethod
  • JSD_GetValueForObject
  • forwardMethod
  • forwardMethod
  • JSD_GetValueForObject
  • forwardMethod
  • forwardMethod
  • JSD_GetValueForObject
  • forwardMethod
  • forwardMethod
  • JSD_GetValueForObject
  • forwardMethod
  • forwardMethod
  • .....إلخ

الكود الخاص بي هو:

int16_t NPP_HandleEvent(NPP instance, void* event)
{
    EventRecord* carbonEvent = (EventRecord*)event;

    if (carbonEvent && (carbonEvent->what == updateEvt))
    {       
        PluginInstance* currentInstance = (PluginInstance*)(instance->pdata);
        CGContextRef cgContext = ((NP_CGContext*)(currentInstance->window.window))->context;
        float windowWidth = currentInstance->window.width;
        float windowHeight = currentInstance->window.height;

        static int x = 0;

        if (x++)
            return;

        NPRect clipRect = currentInstance->window.clipRect;

        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;

        //[plugin attachToWindow:browserWindow at:NSMakePoint(window->x, y)];
        NSPoint point = NSMakePoint(currentInstance->window.x, y);

        // find the NSView at the point
        NSView* hitView = [[browserWindow contentView] hitTest:NSMakePoint(point.x+1, point.y+1)];
        if (hitView == nil || ![[hitView className] isEqualToString:@"ChildView"]) 
        {
            x = 0;
            return;
        }

        NSView* parentView = hitView;       

        NSBox *box = [[NSBox alloc] initWithFrame:NSMakeRect(0.0, 0.0, 100, 100)];
        [box setBoxType:NSBoxCustom];
        [box setBorderType:NSLineBorder];
        [box setTitlePosition:NSNoTitle];
        [box setFillColor:[NSColor redColor]];

        [parentView addSubview:box];

        //DrawPlugin(cgContext, windowWidth, windowHeight);
    }

    return 0;
}
هل كانت مفيدة؟

المحلول

لا أعتقد أن الكاكاو ونظام EventRecord القديم يمزجون جيدًا.

أصبح نموذج حدث الكاكاو الآن في البناء الأخير من Mozilla.

تحقق من الشجرة ل Comm-Central زئبقي وجربه:
زئبق استنساخ http://hg.mozilla.org/mozilla-central/ SRC
المسار إلى مشروع Xcode هو:
SRC/الوحدات النمطية/البرنامج المساعد/SDK/عينات/أساسية/Mac/
ويجب نسخ المكون الإضافي إلى:
/المكتبة/المكونات الإضافية/الإنترنت/

جربتها بنفسي باستخدام البرنامج المساعد الأساسي Firefox ويعمل نظام أحداث الكاكاو.
أنا فقط لا أعرف كيفية الحصول على مؤشر إلى NSView الحالي.

أعتقد أنه كان يجب القيام به لإصدار 64 بت من Firefox على Mac. إنه غير متوفر في Firefox 3.6 ، ولكن قد يكون في Firefox 3.7 ، وإصدار NPAPI SDK مع نموذج حدث الكاكاو هو الإصدار 0.23.

تعديل:
لتجربته مباشرة دون تنزيل Mercurial آخر Mozilla Build كـ Misha على:
http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly/latest-trunk/
مشروع Xcode مع نموذج حدث الكاكاو هو في:
http://mxr.mozilla.org/mozilla-central/source/modules/plugin/sdk/samples/basic/mac/

تستخدم عينة NetScapecoCoAplugin في مصادر WebKit نموذج حدث الكاكاو أيضًا.

نصائح أخرى

شكرا لك ، وينز ، كثيرا!

لقد قمت للتو بتنزيل أحدث إنشاء Mozilla و SDK من

http://ftp.mozilla.org/pub/mozilla.org/xulrunner/nightly/latest-trunk/

و basicplugin.xcodeproj من

http://mxr.mozilla.org/mozilla-central/source/modules/plugin/sdk/samples/basic/mac/

يمكن الآن الوصول إلى نموذج حدث الكاكاو.

أنا فقط لا أعرف كيفية الحصول على مؤشر إلى NSView الحالي

مرحبا وينز!

يبدو أن الإجابة واضحة- يمكننا الحصول على NSView باستخدام نموذج الحدث القديم EventRecord وبعد هذا التحول إلى نموذج حدث الكاكاو عن طريق إضافة الخط:

Browser-> setValue (مثيل ، nppvplugineventmodel ، (void*) npeventModelCocoa) ؛

يصبح طلبي مستقرًا تمامًا بعد ذلك. لا مزيد من الحوادث !!!

لقد تلقيت للتو npcocoaeventdrawrect بعد تنشيط النافذة الرئيسية لتطبيقي. لذلك يبدو أن نموذج حدث الكاكاو يعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top