Mozilla/mozilla/java/webclient/src_moz/gtk/GtkBrowserControlCanvas.cpp
edburns%acm.org 3d7dee72f2 r=edburns
Author: Ron Capelli <capelli@acm.org>

The following files are updated to allow use of IBM Java 1.3.x
JVMs on Linux.  Instead of statically linking libjawt.lib, the
code now dynamically links libjawt.so and then libawt.so only
if needed (similar to previous change for win32).  It should
work on Solaris, but we couldn't test that here.

    mozilla/java/webclient/src_moz/Makefile.in
    mozilla/java/webclient/src_moz/gtk/GtkBrowserControlCanvas.cpp

The following files are changed to support the ant 'clean'
target for src_ie.

    mozilla/java/webclient/build.xml
    mozilla/java/webclient/src_ie/Makefile.in

The following files are changed to disable the CurrentPage(2)
interface for IE, since it will be a while before that can be
made to work.  With these changes, IE embeds smoothly with
Navigation and History interfaces working nicely to some degree.

    mozilla/java/webclient/src_ie/WrapperFactoryImpl.cpp

mozilla/java/webclient/classes_spec/org/mozilla/webclient/test/EMWindow.java

The following file is changed so that it does not depend on
Mozilla, allowing it to be shared cleanly for IE.

    mozilla/java/webclient/src_moz/win32/Win32BrowserControlCanvas.cpp

The following file is changed to correct the list of makefiles
that need to be configured for Webclient.

    mozilla/java/makefiles

Finally, please delete the following files from CVS.

    mozilla/java/webclient/src_ie/build.xml
    mozilla/java/webclient/src_ie/Makefile.win


git-svn-id: svn://10.0.0.236/trunk@142382 18797224-902f-48f8-a5cc-f745e15eee43
2003-05-13 20:22:13 +00:00

294 lines
8.5 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Netscape Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
*
* Contributor(s):
*/
/*
* GtkBrowserControlCanvas.cpp
*/
#include <jni.h>
#include <jawt_md.h>
#include <jawt.h>
#include "GtkBrowserControlCanvas.h"
#include <X11/Xlib.h>
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#include "gtkmozembed.h"
#include "nsIDOMDocument.h"
#include "nsGtkEventHandler.h"
#include <dlfcn.h>
typedef jboolean (JNICALL *PJAWT_GETAWT)(JNIEnv*, JAWT*);
#include "../ns_util.h" //for throwing Exceptions to Java
extern "C" void NS_SetupRegistry();
extern "C" {
/*
* Class: org_mozilla_webclient_gtk_GtkBrowserControlCanvas
* Method: createTopLevelWindow
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_org_mozilla_webclient_wrapper_1native_gtk_GtkBrowserControlCanvas_createTopLevelWindow
(JNIEnv * env, jobject obj) {
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
("GtkBrowserControlCanvas_createTopLevelWindow: entering\n"));
static GtkWidget *mShell = NULL;
/* Initialise GTK */
gtk_set_locale ();
gtk_init (0, NULL);
/*
void * widgetGtkDll = dlopen("libwidget_gtk.so", RTLD_NOW | RTLD_GLOBAL);
if (widgetGtkDll)
{
void (* symbolHandle)(_GdkEvent*,void*);
symbolHandle =
(void(*)(_GdkEvent*,void*)) dlsym(widgetGtkDll,
"handle_gdk_event");
if (symbolHandle != NULL)
gdk_event_handler_set (symbolHandle, NULL, NULL);
}
*/
gdk_rgb_init();
mShell = gtk_window_new (GTK_WINDOW_POPUP);
gtk_window_set_default_size(GTK_WINDOW(mShell), 300, 300);
gtk_window_set_title(GTK_WINDOW(mShell), "Simple browser");
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
("GtkBrowserControlCanvas_createTopLevelWindow widget: %p: exiting\n",
mShell));
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
("GtkBrowserControlCanvas_createTopLevelWindow: exiting\n"));
return (jint) mShell;
}
/*
* Class: org_mozilla_webclient_gtk_GtkBrowserControlCanvas
* Method: createContainerWindow
* Signature: (III)I
*/
JNIEXPORT jint JNICALL Java_org_mozilla_webclient_wrapper_1native_gtk_GtkBrowserControlCanvas_createContainerWindow
(JNIEnv * env, jobject obj, jint parent, jint screenWidth, jint screenHeight) {
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
("GtkBrowserControlCanvas_createContainerWindow: entering\n"));
GtkWidget * window = (GtkWidget *) parent;
gtk_widget_realize(GTK_WIDGET(window));
gtk_widget_show(window);
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
("GtkBrowserControlCanvas_createContainerWindow window: %p: exiting\n",
window));
PR_LOG(prLogModuleInfo, PR_LOG_DEBUG,
("GtkBrowserControlCanvas_createContainerWindow: exiting\n"));
return (jint) window;
}
int getWinID(GtkWidget * gtkWidgetPtr) {
//GdkWindow * gdkWindow = gtk_widget_get_parent_window(gtkWidgetPtr);
GdkWindow * gdkWindow = gtkWidgetPtr->window;
int gtkwinid = GDK_WINDOW_XWINDOW(gdkWindow);
return gtkwinid;
}
/*
* Class: org_mozilla_webclient_gtk_GtkBrowserControlCanvas
* Method: getGTKWinID
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_org_mozilla_webclient_wrapper_1native_gtk_GtkBrowserControlCanvas_getGTKWinID
(JNIEnv * env, jobject obj, jint gtkWinPtr) {
GtkWidget * gtkWidgetPtr = (GtkWidget *) gtkWinPtr;
return getWinID(gtkWidgetPtr);
}
/*
* Class: org_mozilla_webclient_gtk_GtkBrowserControlCanvas
* Method: reparentWindow
* Signature: (II)V
*/
JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_gtk_GtkBrowserControlCanvas_reparentWindow (JNIEnv * env, jobject obj, jint childID, jint parentID) {
XReparentWindow(GDK_DISPLAY(), childID, parentID, 0, 0);
}
/*
* Class: org_mozilla_webclient_gtk_GtkBrowserControlCanvas
* Method: processEvents
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_gtk_GtkBrowserControlCanvas_processEvents
(JNIEnv * env, jobject obj) {
//printf("process events....\n");
//processEventLoopIntelligently();
}
/*
* Class: org_mozilla_webclient_gtk_GtkBrowserControlCanvas
* Method: setGTKWindowSize
* Signature: (III)V
*/
JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_gtk_GtkBrowserControlCanvas_setGTKWindowSize
(JNIEnv * env, jobject obj, jint gtkWinPtr, jint width, jint height) {
if (gtkWinPtr != 0) {
GtkWidget * gtkWidgetPtr = (GtkWidget *) gtkWinPtr;
if (gtkWidgetPtr) {
gtk_widget_set_usize(gtkWidgetPtr, width, height);
}
}
}
/*
* Class: org_mozilla_webclient_gtk_GtkBrowserControlCanvas
* Method: getHandleToPeer
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_org_mozilla_webclient_wrapper_1native_gtk_GtkBrowserControlCanvas_getHandleToPeer
(JNIEnv *env, jobject canvas) {
JAWT awt;
JAWT_DrawingSurface* ds;
JAWT_DrawingSurfaceInfo* dsi;
JAWT_X11DrawingSurfaceInfo* dsi_x11;
Drawable handle_x11;
void *_hAWT; // JAWT module handle
jint lock;
PJAWT_GETAWT pJAWT_GetAWT; // JAWT_GetAWT function pointer
//Get the AWT
_hAWT = dlopen("libjawt.so", RTLD_NOW | RTLD_GLOBAL);
if (!_hAWT) {
printf(" +++ No libjawt.so... Trying libawt.so +++ \n");
_hAWT = dlopen("libawt.so",RTLD_NOW | RTLD_GLOBAL); // IBM Java 1.3.x packages JAWT_GetAWT in awt.dll
}
if (!_hAWT) {
printf(" +++ JAWT DLL Not Found +++ \n");
::util_ThrowExceptionToJava(env, "Exception: JAWT DLL Not Found");
return 0;
}
pJAWT_GetAWT = (PJAWT_GETAWT)dlsym(_hAWT, "JAWT_GetAWT");
if (!pJAWT_GetAWT) {
printf(" +++ JAWT_GetAWT Entry Not Found +++ \n");
::util_ThrowExceptionToJava(env, "Exception: JAWT_GetAWT Entry Not Found");
dlclose(_hAWT);
return 0;
}
awt.version = JAWT_VERSION_1_3;
if (pJAWT_GetAWT(env, &awt) == JNI_FALSE) {
printf(" +++ AWT Not Found +++ \n");
::util_ThrowExceptionToJava(env, "Exception: AWT Not Found");
dlclose(_hAWT);
return 0;
}
//Get the Drawing Surface
ds = awt.GetDrawingSurface(env, canvas);
if (ds == NULL) {
printf(" +++ NULL Drawing Surface +++ \n");
::util_ThrowExceptionToJava(env, "Exception: Null Drawing Surface");
dlclose(_hAWT);
return 0;
}
//Lock the Drawing Surface
lock = ds->Lock(ds);
if ((lock & JAWT_LOCK_ERROR) != 0) {
printf(" +++ Error Locking Surface +++ \n");
::util_ThrowExceptionToJava(env, "Exception: Error Locking Surface");
awt.FreeDrawingSurface(ds);
dlclose(_hAWT);
return 0;
}
//Get the Drawing Surface info
dsi = ds->GetDrawingSurfaceInfo(ds);
if (dsi == NULL) {
printf(" +++ Error Getting Surface Info +++ \n");
::util_ThrowExceptionToJava(env, "Exception: Error Getting Surface Info");
ds->Unlock(ds);
awt.FreeDrawingSurface(ds);
dlclose(_hAWT);
return 0;
}
//Get the Platform specific Drawing Info
dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)dsi->platformInfo;
//Get the Handle to the Native Drawing Surface info
handle_x11 = (Drawable) dsi_x11->drawable;
//Clean up after us
ds->FreeDrawingSurfaceInfo(dsi);
ds->Unlock(ds);
awt.FreeDrawingSurface(ds);
dlclose(_hAWT);
//return the native peer handle
return (jint) handle_x11;
}
/*
* Class: org_mozilla_webclient_gtk_GtkBrowserControlCanvas
* Method: loadMainDll
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_org_mozilla_webclient_wrapper_1native_gtk_GtkBrowserControlCanvas_loadMainDll
(JNIEnv *, jclass)
{
PR_LOG(prLogModuleInfo, PR_LOG_ERROR,
("Incorrect loadMainDll called. Perhaps Java is loading the wrond dll?"));
PR_ASSERT(NULL);
}
} // End extern "C"