28#if !(defined(_ANDROID))
35#include <libFreeWRL.h>
39#include "../main/MainLoop.h"
40#include "../vrml_parser/Structs.h"
41#include "../opengl/OpenGL_Utils.h"
42#include "../scenegraph/Viewer.h"
43#include "../ui/common.h"
46#include <Xm/RowColumn.h>
48#include <Xm/ToggleB.h>
49#include <Xm/CascadeB.h>
51#include <Xm/Separator.h>
54#include <Xm/ScrolledW.h>
56#include <Xm/SelectioB.h>
57#include <Xm/MessageB.h>
58#include <Xm/DrawingA.h>
60#define ABOUT_FREEWRL "FreeWRL Version %s\n \
62FreeWRL is a VRML/X3D Browser for OS X and Unix.\n \n \
63Thanks to the Open Source community for all the help received.\n \
66#define DJ_KEEP_COMPILER_WARNING 0
69static int MainWidgetRealized = FALSE;
73static Widget freewrlTopWidget, mainw, menubar;
74static Widget frame, freewrlDrawArea;
75static Widget about_widget;
76static Widget newFileWidget;
78static Arg buttonArgs[10];
static int buttonArgc = 0;
80extern char myMenuStatus[];
82static void fv_createMenuBar(
void);
83static void fv_createDrawingFrame(
void);
86static void myXtManageChild (
int c, Widget child)
89 printf (
"at %d, managing %d\n",c, child);
91 if (child != NULL) XtManageChild (child);
96static void StateWatcher (Widget w, XtPointer unused, XEvent *event, Boolean *cont)
100 TRACE_MSG(
"freewrlTopWidget [StateWatch] went through (xm callback): widget %p event %p\n", (
void*)w, (
void*)event);
102 if (event->type == MapNotify) setDisplayed (TRUE);
103 else if (event->type == UnmapNotify) setDisplayed (FALSE);
106static void fv_DrawArea_events (Widget w, XtPointer unused, XEvent *event, Boolean *cont)
111 XWindowAttributes attr;
112 XSetWindowAttributes set_attr;
114 TRACE_MSG(
"fv_DrawArea event went through (xm callback): widget %p event %p\n", (
void*)w, (
void*)event);
116 memset(&attr, 0,
sizeof(attr));
117 memset(&set_attr, 0,
sizeof(set_attr));
120 XGetWindowAttributes(Xdpy, Xwin, &attr);
121 TRACE_MSG(
"DrawArea event mask: %lu\n", attr.your_event_mask);
122 if (!(attr.your_event_mask & PointerMotionMask)) {
123 TRACE_MSG(
"DrawArea window not configured to receive PointerMotionMask...\n");
126 set_attr.event_mask = attr.your_event_mask | PointerMotionMask;
127 XChangeWindowAttributes(Xdpy, Xwin, CWEventMask, &set_attr);
132 DEBUG_XEV(
"EVENT through MOTIF\n");
133 handle_Xevents(*event);
148#include "../../../icons/icon.h"
150void set_app_icon(Widget top) {
151 Display *d = XtDisplay(top);
152 Atom net_wm_icon = XInternAtom(d,
"_NET_WM_ICON", False);
153 Atom cardinal = XInternAtom(d,
"CARDINAL", False);
154 Window w = XtWindow(top);
163 if (
sizeof(buffer) > (
sizeof(
long) * 2)) {
167 printf (
"ERROR IN ICON SIZE - nothing there??\n");
174 int length = 2 + (wid * hei);
175 XChangeProperty(d, w, net_wm_icon, cardinal,
176 32, PropModeReplace, (
const unsigned char*) buffer, length);
186 char *argv_out[1] = { NULL };
187 Dimension width, height;
188 Arg initArgs[10];
int initArgc = 0;
191 XtSetArg(initArgs[initArgc], XmNlabelString, XmStringCreate(getWindowTitle(), XmSTRING_DEFAULT_CHARSET)); initArgc++;
192 XtSetArg(initArgs[initArgc], XmNheight, params->height); initArgc++;
193 XtSetArg(initArgs[initArgc], XmNwidth, params->width); initArgc++;
194 XtSetArg(initArgs[initArgc], XmNmappedWhenManaged, False); initArgc++;
200 XtToolkitInitialize();
201 Xtcx = XtCreateApplicationContext();
203 XtDisplayInitialize(Xtcx, Xdpy,
"FreeWRL",
"FreeWRL_class", NULL, 0, &argc_out, argv_out);
205 freewrlTopWidget = XtAppCreateShell(
"FreeWRL",
"FreeWRL_class", applicationShellWidgetClass, Xdpy, initArgs, initArgc);
207 if (!freewrlTopWidget) {
208 ERROR_MSG(
"Can't initialize Motif\n");
213 XtVaSetValues(freewrlTopWidget,
214 XmNdepth, Xvi->depth,
215 XmNvisual, Xvi->visual,
216 XmNcolormap, colormap,
219 mainw = XmCreateMainWindow(freewrlTopWidget, getWindowTitle(), NULL, 0);
223 myXtManageChild(29, mainw);
229 fv_createDrawingFrame();
233 XmNworkWindow, frame,
234 XmNcommandWindow, NULL,
239 XtRealizeWidget (freewrlTopWidget);
244 set_app_icon(freewrlTopWidget);
251 if (params->winToEmbedInto != INT_ID_UNDEFINED){
252 printf(
"fwMotifWindow::Trying to reparent window: %ld, to new parent: %ld\n",
253 XtWindow(freewrlTopWidget),
254 params->winToEmbedInto);
256 XReparentWindow(XtDisplay(freewrlTopWidget),
257 XtWindow(freewrlTopWidget),
258 (Window) params->winToEmbedInto, 0, 0);
260 XMapWindow(XtDisplay(freewrlTopWidget), XtWindow(freewrlTopWidget));
263 XFlush(XtDisplay(freewrlTopWidget));
265 MainWidgetRealized = XtIsRealized(freewrlTopWidget);
266 TRACE_MSG(
"fv_create_main_window: top widget realized: %s\n", BOOL_STR(MainWidgetRealized));
268 Xwin = XtWindow(freewrlTopWidget);
269 GLwin = XtWindow(freewrlDrawArea);
273 XtVaGetValues(freewrlDrawArea, XmNwidth, &width, XmNheight, &height, NULL);
275 fv_setScreenDim(width,height);
278 XtAddEventHandler(freewrlTopWidget, StructureNotifyMask, FALSE, StateWatcher, NULL);
280 XtAddEventHandler(freewrlDrawArea, event_mask, False, fv_DrawArea_events, NULL);
298static XmString xec_NewString(
char *s)
305 char *t = XtNewString(s);
308 separator = XmStringSeparatorCreate();
310 xms1 = XmStringCreateLocalized(p);
313 while ((p = strtok(NULL,
"\n")))
315 line = XmStringCreateLocalized(p);
316 xms2 = XmStringConcat(xms1,separator);
318 xms1 = XmStringConcat(xms2,line);
323 XmStringFree(separator);
329static void fv_aboutFreeWRLpopUp (Widget w, XtPointer data, XtPointer callData)
335 char *msg, *rdr, *vendor;
339 ver = libFreeWRL_get_version();
341 rdr = (
char *)glGetString(GL_RENDERER);
342 vendor = (
char *)glGetString(GL_VENDOR);
344 msg = MALLOC(
void *, strlen(ABOUT_FREEWRL) + strlen(ver)
345 + strlen(rdr) + strlen(vendor));
346 sprintf(msg, ABOUT_FREEWRL, ver, rdr, vendor);
348 diastring = xec_NewString(msg);
349 XtSetArg(args[ac], XmNmessageString, diastring); ac++;
350 XtSetValues(about_widget, args, ac);
351 XmStringFree(diastring);
354 myXtManageChild(2,about_widget);
358static void fv_quitMenuBar (Widget w, XtPointer data, XtPointer callData)
360 fwl_doQuit(__FILE__,__LINE__);
363static void fv_reloadFile (Widget w, XtPointer data, XtPointer callData)
365 ConsoleMessage (
"reloading %s", BrowserFullPath);
370static void fv_fileSelectPressed (Widget w, XtPointer data, XmFileSelectionBoxCallbackStruct *callData)
375 XmStringGetLtoR(callData->value,
376 XmSTRING_DEFAULT_CHARSET, &newfile);
378 if (!Anchor_ReplaceWorld(newfile)) {
385static void fv_unManageMe (Widget widget, XtPointer client_data,
386 XmFileSelectionBoxCallbackStruct *selection)
388 XtUnmanageChild(widget);
392static void fv_newFilePopup(Widget cascade_button,
char *text, XmPushButtonCallbackStruct *cbs)
394 myXtManageChild(4,newFileWidget);
395 XtPopup(XtParent(newFileWidget), XtGrabNone);
398#ifdef DOESNOTGETICONICSTATE
400static void fv_GLAreaexpose (Widget w, XtPointer data, XtPointer callData)
402 XmDrawingAreaCallbackStruct *cd = (XmDrawingAreaCallbackStruct *) callData;
403 switch (cd->reason) {
404 case XmCR_EXPOSE: printf (
"got expose event \n");
405 default: printf (
"not known event, %d\n",cd->reason);
411static void fv_GLArearesize (Widget w, XtPointer data, XtPointer callData)
414 Dimension width, height;
416 XtVaGetValues (w, XmNwidth, &width, XmNheight, &height, NULL);
418 fv_setScreenDim (width,height);
422static void fv_removeWidgetFromSelect (Widget parent,
423#
if NeedWidePrototypes
432 tmp = XmSelectionBoxGetChild(parent, button);
434 printf (
"hmmm - button does not exist\n");
436 XtUnmanageChild(tmp);
441static void fv_freewrlHomePopup (Widget w, XtPointer data, XtPointer callData)
443#if DJ_KEEP_COMPILER_WARNING
448 const char pattern[] =
"%s http://freewrl.sourceforge.net &";
450 browser = freewrl_get_browser_program();
454 sysline = MALLOC(
char *, strlen(browser)+strlen(pattern));
455 sprintf(sysline, pattern, browser);
457 freewrlSystem(sysline);
464printEvent (XEvent event)
466 switch (event.type) {
467 case KeyPress: printf (
"KeyPress");
break;
468 case KeyRelease: printf (
"KeyRelease");
break;
469 case ButtonPress: printf (
"ButtonPress");
break;
470 case ButtonRelease: printf (
"ButtonRelease");
break;
471 case MotionNotify: printf (
"MotionNotify");
break;
472 case EnterNotify: printf (
"EnterNotify");
break;
473 case LeaveNotify: printf (
"LeaveNotify");
break;
474 case FocusIn: printf (
"FocusIn");
break;
475 case FocusOut: printf (
"FocusOut");
break;
476 case KeymapNotify: printf (
"KeymapNotify");
break;
477 case Expose: printf (
"Expose");
break;
478 case GraphicsExpose: printf (
"GraphicsExpose");
break;
479 case NoExpose: printf (
"NoExpose");
break;
480 case VisibilityNotify: printf (
"VisibilityNotify");
break;
481 case CreateNotify: printf (
"CreateNotify");
break;
482 case DestroyNotify: printf (
"DestroyNotify");
break;
483 case UnmapNotify: printf (
"UnmapNotify");
break;
484 case MapNotify: printf (
"MapNotify");
break;
485 case MapRequest: printf (
"MapRequest");
break;
486 case ReparentNotify: printf (
"ReparentNotify");
break;
487 case ConfigureNotify: printf (
"ConfigureNotify");
break;
488 case ConfigureRequest: printf (
"ConfigureRequest");
break;
489 case GravityNotify: printf (
"GravityNotify");
break;
490 case ResizeRequest: printf (
"ResizeRequest");
break;
491 case CirculateNotify: printf (
"CirculateNotify");
break;
492 case CirculateRequest: printf (
"CirculateRequest");
break;
493 case PropertyNotify: printf (
"PropertyNotify");
break;
494 case SelectionClear: printf (
"SelectionClear");
break;
495 case SelectionRequest: printf (
"SelectionRequest");
break;
496 case SelectionNotify: printf (
"SelectionNotify");
break;
497 case ColormapNotify: printf (
"ColormapNotify");
break;
498 case ClientMessage: printf (
"ClientMessage");
break;
499 case MappingNotify: printf (
"MappingNotify");
break;
500 default :printf (
"Event out of range - %d",event.type);
507static void fv_createFilePulldown()
509 Widget menupane, btn, cascade;
516 memset(args, 0,
sizeof(args));
518 mask = XmStringCreateLocalized(
"*.x3d");
519 XtSetArg(args[ac], XmNdirMask, mask); ac++;
522 newFileWidget = XmCreateFileSelectionDialog(mainw,
"select", args, 1);
524 XtAddCallback(newFileWidget, XmNokCallback, (XtCallbackProc)fv_fileSelectPressed, NULL);
525 XtAddCallback(newFileWidget, XmNcancelCallback, (XtCallbackProc)fv_unManageMe, NULL);
527 fv_removeWidgetFromSelect(newFileWidget,XmDIALOG_HELP_BUTTON);
528 XtUnmanageChild(newFileWidget);
531 menupane = XmCreatePulldownMenu (menubar,
"menupane", NULL, 0);
532 btn = XmCreatePushButton (menupane,
"Reload", NULL, 0);
533 XtAddCallback (btn, XmNactivateCallback, (XtCallbackProc)fv_reloadFile, NULL);
534 myXtManageChild (5,btn);
535 btn = XmCreatePushButton (menupane,
"New...", NULL, 0);
536 XtAddCallback (btn, XmNactivateCallback, (XtCallbackProc)fv_newFilePopup, NULL);
537 myXtManageChild (6,btn);
539 btn = XmCreatePushButton (menupane,
"Quit", NULL, 0);
540 XtAddCallback (btn, XmNactivateCallback, (XtCallbackProc)fv_quitMenuBar, NULL);
541 myXtManageChild (7,btn);
542 XtSetArg (args[0], XmNsubMenuId, menupane);
543 cascade = XmCreateCascadeButton (menubar,
"File", args, 1);
544 myXtManageChild (8,cascade);
547static void fv_createHelpPulldown()
549 Widget btn, menupane, cascade;
554 menupane = XmCreatePulldownMenu (menubar,
"menupane", NULL, 0);
564 XtSetArg(args[ac], XmNmessageAlignment,XmALIGNMENT_CENTER); ac++;
565 about_widget = XmCreateInformationDialog(menubar,
"about", args, ac);
566 XtAddCallback(about_widget, XmNokCallback, (XtCallbackProc)fv_unManageMe, NULL);
567 fv_removeWidgetFromSelect (about_widget, XmDIALOG_CANCEL_BUTTON);
573 btn = XmCreatePushButton (menupane,
"About FreeWRL...", NULL, 0);
574 XtAddCallback (btn, XmNactivateCallback, (XtCallbackProc)fv_aboutFreeWRLpopUp, NULL);
575 myXtManageChild (23,btn);
576 btn = XmCreatePushButton (menupane,
"FreeWRL Homepage...", NULL, 0);
577 XtAddCallback (btn, XmNactivateCallback, (XtCallbackProc)fv_freewrlHomePopup, NULL);
578 myXtManageChild (24,btn);
580 XtSetArg (args[0], XmNsubMenuId, menupane);
581 cascade = XmCreateCascadeButton (menubar,
"Help", args, 1);
582 myXtManageChild (25,cascade);
586static void fv_createMenuBar(
void)
588 Arg menuArgs[10];
int menuArgc = 0;
591 memset(menuArgs, 0,
sizeof(menuArgs));
596#ifdef XmNscrolledWindowChildType
597 XtSetArg(menuArgs[menuArgc], XmNscrolledWindowChildType, XmMENU_BAR); menuArgc++;
600 menubar = XmCreateMenuBar (mainw,
"menubar", menuArgs, menuArgc);
601 myXtManageChild (26,menubar);
604 XtSetArg(buttonArgs[buttonArgc], XmCVisibleWhenOff, TRUE); buttonArgc++;
605 XtSetArg(buttonArgs[buttonArgc],XmNindicatorType,XmN_OF_MANY); buttonArgc++;
607 if (!RUNNINGASPLUGIN) fv_createFilePulldown();
608 fv_createHelpPulldown();
616static void fv_createDrawingFrame(
void)
619 frame = XtVaCreateManagedWidget(
"form", xmPanedWindowWidgetClass, mainw, NULL);
627 freewrlDrawArea = XtVaCreateManagedWidget (
"freewrlDrawArea", glwDrawingAreaWidgetClass,
628 frame,
"visualInfo", Xvi,
629 XmNtopAttachment, XmATTACH_WIDGET,
630 XmNbottomAttachment, XmATTACH_FORM,
631 XmNleftAttachment, XmATTACH_FORM,
632 XmNrightAttachment, XmATTACH_FORM,
636 freewrlDrawArea = XmCreateDrawingArea (frame,
"drawing_a", NULL, 0);
638#ifdef DOESNOTGETICONICSTATE
639 XtAddCallback (freewrlDrawArea, XmNexposeCallback, fv_GLAreaexpose, NULL);
642 XtAddCallback (freewrlDrawArea, XmNresizeCallback, fv_GLArearesize, NULL);
644 myXtManageChild(27,freewrlDrawArea);
647void setConsoleMessage (
char *str)
655void frontendUpdateButtons()