00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef FXAPP_H
00022 #define FXAPP_H
00023
00024 #ifndef FXOBJECT_H
00025 #include "FXObject.h"
00026 #endif
00027
00028 namespace FX {
00029
00030
00031
00032 class FXApp;
00033 class FXWindow;
00034 class FXIcon;
00035 class FXBitmap;
00036 class FXCursor;
00037 class FXRootWindow;
00038 class FXMainWindow;
00039 class FXPopup;
00040 class FXFont;
00041 class FXDC;
00042 class FXDCWindow;
00043 class FXVisual;
00044 class FXGLVisual;
00045 class FXGLContext;
00046 class FXTranslator;
00047 class FXComposeContext;
00048
00049
00050 struct FXTimer;
00051 struct FXChore;
00052 struct FXSignal;
00053 struct FXRepaint;
00054 struct FXInput;
00055 struct FXHandles;
00056 struct FXInvocation;
00057
00058
00059
00061 enum FXInputMode {
00062 INPUT_NONE = 0,
00063 INPUT_READ = 1,
00064 INPUT_WRITE = 2,
00065 INPUT_EXCEPT = 4
00066 };
00067
00068
00070 enum FXModality {
00071 MODAL_FOR_NONE,
00072 MODAL_FOR_WINDOW,
00073 MODAL_FOR_POPUP
00074 };
00075
00076
00078 enum FXDefaultCursor {
00079 DEF_ARROW_CURSOR,
00080 DEF_RARROW_CURSOR,
00081 DEF_TEXT_CURSOR,
00082 DEF_HSPLIT_CURSOR,
00083 DEF_VSPLIT_CURSOR,
00084 DEF_XSPLIT_CURSOR,
00085 DEF_SWATCH_CURSOR,
00086 DEF_MOVE_CURSOR,
00087 DEF_DRAGH_CURSOR,
00088 DEF_DRAGV_CURSOR,
00089 DEF_DRAGTL_CURSOR,
00090 DEF_DRAGBR_CURSOR=DEF_DRAGTL_CURSOR,
00091 DEF_DRAGTR_CURSOR,
00092 DEF_DRAGBL_CURSOR=DEF_DRAGTR_CURSOR,
00093 DEF_DNDSTOP_CURSOR,
00094 DEF_DNDASK_CURSOR,
00095 DEF_DNDCOPY_CURSOR,
00096 DEF_DNDMOVE_CURSOR,
00097 DEF_DNDLINK_CURSOR,
00098 DEF_CROSSHAIR_CURSOR,
00099 DEF_CORNERNE_CURSOR,
00100 DEF_CORNERNW_CURSOR,
00101 DEF_CORNERSE_CURSOR,
00102 DEF_CORNERSW_CURSOR,
00103 DEF_HELP_CURSOR,
00104 DEF_HAND_CURSOR,
00105 DEF_ROTATE_CURSOR,
00106 DEF_BLANK_CURSOR,
00107 DEF_WAIT_CURSOR
00108 };
00109
00110
00134 class FXAPI FXApp : public FXObject {
00135 FXDECLARE(FXApp)
00136
00137
00138 friend class FXId;
00139 friend class FXBitmap;
00140 friend class FXImage;
00141 friend class FXIcon;
00142 friend class FXCursor;
00143 friend class FXDrawable;
00144 friend class FXWindow;
00145 friend class FXShell;
00146 friend class FXRootWindow;
00147 friend class FXTopWindow;
00148 friend class FXMainWindow;
00149 friend class FXPopup;
00150 friend class FXFont;
00151 friend class FXVisual;
00152 friend class FXGLVisual;
00153 friend class FXGLContext;
00154 friend class FXDC;
00155 friend class FXDCWindow;
00156 friend class FXDragCorner;
00157 friend class FXDockHandler;
00158 friend class FXComposeContext;
00159
00160 private:
00161
00162
00163 void *display;
00164 FXHash hash;
00165 FXRegistry registry;
00166 FXWindow *activeWindow;
00167 FXWindow *cursorWindow;
00168 FXWindow *mouseGrabWindow;
00169 FXWindow *keyboardGrabWindow;
00170 FXWindow *keyWindow;
00171 FXWindow *selectionWindow;
00172 FXWindow *clipboardWindow;
00173 FXWindow *dropWindow;
00174 FXWindow *dragWindow;
00175 FXWindow *refresher;
00176 FXWindow *refresherstop;
00177 FXPopup *popupWindow;
00178 FXRootWindow *root;
00179 FXVisual *monoVisual;
00180 FXVisual *defaultVisual;
00181 FXTimer *timers;
00182 FXChore *chores;
00183 FXRepaint *repaints;
00184 FXTimer *timerrecs;
00185 FXChore *chorerecs;
00186 FXRepaint *repaintrecs;
00187 FXInvocation *invocation;
00188 FXSignal *signals;
00189 FXint signalreceived;
00190 FXFont *normalFont;
00191 FXFont *stockFont;
00192 FXMutex appMutex;
00193 FXEvent event;
00194 FXuint stickyMods;
00195 FXInput *inputs;
00196 FXint ninputs;
00197 FXHandles *handles;
00198 FXint maxhandle;
00199 FXuchar *ddeData;
00200 FXuint ddeSize;
00201 FXuint maxcolors;
00202 FXTime typingSpeed;
00203 FXTime clickSpeed;
00204 FXTime scrollSpeed;
00205 FXTime scrollDelay;
00206 FXTime blinkSpeed;
00207 FXTime animSpeed;
00208 FXTime menuPause;
00209 FXTime toolTipPause;
00210 FXTime toolTipTime;
00211 FXTime autoHideDelay;
00212 FXint dragDelta;
00213 FXint wheelLines;
00214 FXint scrollBarSize;
00215 FXColor borderColor;
00216 FXColor baseColor;
00217 FXColor hiliteColor;
00218 FXColor shadowColor;
00219 FXColor backColor;
00220 FXColor foreColor;
00221 FXColor selforeColor;
00222 FXColor selbackColor;
00223 FXColor tipforeColor;
00224 FXColor tipbackColor;
00225 FXColor selMenuTextColor;
00226 FXColor selMenuBackColor;
00227 FXCursor *waitCursor;
00228 FXuint waitCount;
00229 FXuint windowCount;
00230 FXCursor *cursor[DEF_WAIT_CURSOR+1];
00231 FXTranslator *translator;
00232 FXint appArgc;
00233 const FXchar *const *appArgv;
00234 const FXchar *inputmethod;
00235 const FXchar *inputstyle;
00236 FXbool initialized;
00237
00238 private:
00239 static FXApp *app;
00240
00241
00242 #ifdef WIN32
00243
00244 FXushort ddeTargets;
00245 FXushort ddeAtom;
00246 FXDragType ddeDelete;
00247 FXDragType *ddeTypeList;
00248 FXuint ddeNumTypes;
00249 FXDragAction ddeAction;
00250 FXDragAction ansAction;
00251 FXDragType *xselTypeList;
00252 FXuint xselNumTypes;
00253 void* xdndTypes;
00254 FXushort xdndAware;
00255 FXID xdndSource;
00256 FXID xdndTarget;
00257 FXbool xdndStatusPending;
00258 FXbool xdndFinishPending;
00259 FXbool xdndStatusReceived;
00260 FXbool xdndFinishSent;
00261 FXRectangle xdndRect;
00262 FXID stipples[17];
00263
00264 #else
00265
00266 private:
00267 FXID wmDeleteWindow;
00268 FXID wmSaveYourself;
00269 FXID wmQuitApp;
00270 FXID wmProtocols;
00271 FXID wmMotifHints;
00272 FXID wmTakeFocus;
00273 FXID wmClientMachine;
00274 FXID wmState;
00275 FXID wmNetState;
00276 FXID wmNetIconName;
00277 FXID wmNetWindowName;
00278 FXID wmNetSupported;
00279 FXID wmNetHidden;
00280 FXID wmNetShaded;
00281 FXID wmNetHMaximized;
00282 FXID wmNetVMaximized;
00283 FXID wmNetFullScreen;
00284 FXID wmNetBelowOthers;
00285 FXID wmNetAboveOthers;
00286 FXID wmNetNeedAttention;
00287 FXID wmNetMoveResize;
00288 FXID wmNetRestack;
00289 FXID wmNetPing;
00290 FXID wmNetProcessId;
00291 FXID wmNetWindowType;
00292 FXID wmWindowTypes[14];
00293 FXID wmWindowRole;
00294 FXID wmClientLeader;
00295 FXID wmClientId;
00296 FXID embedAtom;
00297 FXID embedInfoAtom;
00298 FXID timestampAtom;
00299 FXID ddeTargets;
00300 FXID ddeAtom;
00301 FXID ddeDelete;
00302 FXID ddeIncr;
00303 FXDragType *ddeTypeList;
00304 FXuint ddeNumTypes;
00305 FXDragAction ddeAction;
00306 FXDragAction ansAction;
00307 FXID xcbSelection;
00308 FXDragType *xcbTypeList;
00309 FXuint xcbNumTypes;
00310 FXDragType *xselTypeList;
00311 FXuint xselNumTypes;
00312 FXDragType *xdndTypeList;
00313 FXuint xdndNumTypes;
00314 FXID xdndProxy;
00315 FXID xdndAware;
00316 FXID xdndEnter;
00317 FXID xdndLeave;
00318 FXID xdndPosition;
00319 FXID xdndStatus;
00320 FXID xdndDrop;
00321 FXID xdndFinished;
00322 FXID xdndSelection;
00323 FXID xdndTypes;
00324 FXID xdndActions;
00325 FXID xdndActionList[6];
00326 FXID xdndSource;
00327 FXID xdndTarget;
00328 FXID xdndProxyTarget;
00329 FXbool xdndStatusPending;
00330 FXbool xdndStatusReceived;
00331 FXbool xdndWantUpdates;
00332 FXbool xdndFinishSent;
00333 FXRectangle xdndRect;
00334 FXint xrrScreenChange;
00335 FXint xfxFixesSelection;
00336 FXint xInputOpcode;
00337 FXint xsbDevice;
00338 FXID stipples[23];
00339 void *xim;
00340 FXbool shmi;
00341 FXbool shmp;
00342 FXbool xrender;
00343 FXbool synchronize;
00344
00345 #endif
00346
00347 private:
00348
00349
00350 FXApp(const FXApp&);
00351 FXApp &operator=(const FXApp&);
00352 static void signalhandler(int sig);
00353 static void immediatesignalhandler(int sig);
00354 void leaveWindow(FXWindow *window,FXWindow *ancestor);
00355 void enterWindow(FXWindow *window,FXWindow *ancestor);
00356 void selectionSetData(const FXWindow* window,FXDragType type,FXuchar* data,FXuint size);
00357 void selectionGetData(const FXWindow* window,FXDragType type,FXuchar*& data,FXuint& size);
00358 void selectionGetTypes(const FXWindow* window,FXDragType*& types,FXuint& numtypes);
00359 void clipboardSetData(const FXWindow* window,FXDragType type,FXuchar* data,FXuint size);
00360 void clipboardGetData(const FXWindow* window,FXDragType type,FXuchar*& data,FXuint& size);
00361 void clipboardGetTypes(const FXWindow* window,FXDragType*& types,FXuint& numtypes);
00362 void dragdropSetData(const FXWindow* window,FXDragType type,FXuchar* data,FXuint size);
00363 void dragdropGetData(const FXWindow* window,FXDragType type,FXuchar*& data,FXuint& size);
00364 void dragdropGetTypes(const FXWindow* window,FXDragType*& types,FXuint& numtypes);
00365 void openInputDevices();
00366 void closeInputDevices();
00367 #ifdef WIN32
00368 static long CALLBACK wndproc(FXID hwnd,unsigned int iMsg,unsigned int wParam,long lParam);
00369 protected:
00370 virtual long dispatchEvent(FXID hwnd,unsigned int iMsg,unsigned int wParam,long lParam);
00371 #else
00372 void addRepaint(FXID win,FXint x,FXint y,FXint w,FXint h,FXbool synth=false);
00373 void removeRepaints(FXID win,FXint x,FXint y,FXint w,FXint h);
00374 void scrollRepaints(FXID win,FXint dx,FXint dy);
00375 static void imcreatecallback(void*,FXApp*,void*);
00376 static void imdestroycallback(void*,FXApp*,void*);
00377 #endif
00378
00379 protected:
00380
00382 virtual FXbool getNextEvent(FXRawEvent& ev,FXTime blocking=forever);
00383
00385 virtual FXbool dispatchEvent(FXRawEvent& ev);
00386
00387 public:
00388 long onCmdQuit(FXObject*,FXSelector,void*);
00389 long onCmdDump(FXObject*,FXSelector,void*);
00390 long onCmdHover(FXObject*,FXSelector,void*);
00391
00392 public:
00393
00395 enum {
00396 ID_QUIT=1,
00397 ID_DUMP,
00398 ID_HOVER,
00399 ID_LAST
00400 };
00401
00402 public:
00403
00405 static const FXuchar copyright[];
00406
00407 public:
00408
00414 FXApp(const FXString& name="Application",const FXString& vendor=FXString::null);
00415
00417 void setAppName(const FXString& name);
00418
00420 const FXString& getAppName() const;
00421
00423 void setVendorName(const FXString& name);
00424
00426 const FXString& getVendorName() const;
00427
00429 FXbool hasInputMethod() const;
00430
00432 void setDefaultVisual(FXVisual* vis);
00433
00435 FXVisual* getDefaultVisual() const { return defaultVisual; }
00436
00438 FXVisual* getMonoVisual() const { return monoVisual; }
00439
00441 void setRootWindow(FXRootWindow* rt);
00442
00444 FXRootWindow* getRootWindow() const { return root; }
00445
00447 FXWindow *getFocusWindow() const;
00448
00450 FXWindow *getCursorWindow() const { return cursorWindow; }
00451
00453 FXWindow *getActiveWindow() const { return activeWindow; }
00454
00456 FXPopup* getPopupWindow() const { return popupWindow; }
00457
00459 FXWindow* getSelectionWindow() const { return selectionWindow; }
00460
00462 FXWindow* getClipboardWindow() const { return clipboardWindow; }
00463
00465 FXWindow* getDragWindow() const { return dragWindow; }
00466
00468 FXWindow* findWindowWithId(FXID xid) const;
00469
00471 FXWindow* findWindowAt(FXint rx,FXint ry,FXID window=0) const;
00472
00474 void setNormalFont(FXFont* font);
00475
00477 FXFont* getNormalFont() const { return normalFont; }
00478
00480 void beginWaitCursor();
00481
00483 void endWaitCursor();
00484
00486 void setWaitCursor(FXCursor *cur);
00487
00489 FXCursor* getWaitCursor() const { return waitCursor; }
00490
00492 void setDefaultCursor(FXDefaultCursor which,FXCursor* cur);
00493
00495 FXCursor* getDefaultCursor(FXDefaultCursor which) const { return cursor[which]; }
00496
00498 FXDragType registerDragType(const FXString& name) const;
00499
00501 FXString getDragTypeName(FXDragType type) const;
00502
00507 void setTranslator(FXTranslator* trans);
00508
00512 FXTranslator* getTranslator() const { return translator; }
00513
00515 void* getDisplay() const { return display; }
00516
00518 virtual FXbool openDisplay(const FXchar* dpy=NULL);
00519
00521 virtual FXbool closeDisplay();
00522
00533 void addTimeout(FXObject* tgt,FXSelector sel,FXTime ns=1000000000,void* ptr=NULL);
00534
00543 void addDeadline(FXObject* tgt,FXSelector sel,FXTime due=forever,void* ptr=NULL);
00544
00549 void removeTimeout(FXObject* tgt,FXSelector sel=0);
00550
00555 FXbool hasTimeout(FXObject *tgt,FXSelector sel=0) const;
00556
00564 FXTime remainingTimeout(FXObject *tgt,FXSelector sel=0);
00565
00573 void addChore(FXObject* tgt,FXSelector sel,void *ptr=NULL);
00574
00579 void removeChore(FXObject* tgt,FXSelector sel=0);
00580
00585 FXbool hasChore(FXObject *tgt,FXSelector sel=0) const;
00586
00594 void addSignal(FXint sig,FXObject* tgt,FXSelector sel,FXbool immediate=false,FXuint flags=0);
00595
00597 void removeSignal(FXint sig);
00598
00609 FXbool addInput(FXObject *tgt,FXSelector sel,FXInputHandle fd,FXuint mode=INPUT_READ,void* ptr=NULL);
00610
00617 FXbool removeInput(FXInputHandle fd,FXuint mode=INPUT_READ);
00618
00620 FXbool getKeyState(FXuint keysym) const;
00621
00623 FXbool peekEvent();
00624
00626 FXbool runOneEvent(FXTime blocking=forever);
00627
00632 FXint run();
00633
00638 FXint runUntil(FXuint& condition);
00639
00645 FXint runWhileEvents(FXTime blocking=0);
00646
00654 FXint runModalWhileEvents(FXWindow* window=NULL,FXTime blocking=0);
00655
00660 FXint runModal();
00661
00667 FXint runModalFor(FXWindow* window);
00668
00674 FXint runModalWhileShown(FXWindow* window);
00675
00680 FXint runPopup(FXWindow* window);
00681
00683 FXbool isModal(FXWindow* window) const;
00684
00686 FXWindow* getModalWindow() const;
00687
00689 FXModality getModality() const;
00690
00696 void stop(FXint value=0);
00697
00702 void stopModal(FXWindow* window,FXint value=0);
00703
00707 void stopModal(FXint value=0);
00708
00713 void refresh();
00714
00718 void forceRefresh();
00719
00724 void flush(FXbool sync=false);
00725
00730 void repaint();
00731
00733 FXint getArgc() const { return appArgc; }
00734
00736 const FXchar *const *getArgv() const { return appArgv; }
00737
00739 FXbool isInitialized() const { return initialized; }
00740
00746 virtual void init(int& argc,char** argv,FXbool connect=true);
00747
00752 virtual void exit(FXint code=0);
00753
00760 FXRegistry& reg(){ return registry; }
00761
00774 FXMutex& mutex(){ return appMutex; }
00775
00777 void beep();
00778
00780 FXTime getTypingSpeed() const { return typingSpeed; }
00781 FXTime getClickSpeed() const { return clickSpeed; }
00782 FXTime getScrollSpeed() const { return scrollSpeed; }
00783 FXTime getScrollDelay() const { return scrollDelay; }
00784 FXTime getBlinkSpeed() const { return blinkSpeed; }
00785 FXTime getAnimSpeed() const { return animSpeed; }
00786 FXTime getMenuPause() const { return menuPause; }
00787 FXTime getToolTipPause() const { return toolTipPause; }
00788 FXTime getToolTipTime() const { return toolTipTime; }
00789 FXTime getAutoHideDelay() const { return autoHideDelay; }
00790
00792 void setTypingSpeed(FXTime speed);
00793 void setClickSpeed(FXTime speed);
00794 void setScrollSpeed(FXTime speed);
00795 void setScrollDelay(FXTime delay);
00796 void setBlinkSpeed(FXTime speed);
00797 void setAnimSpeed(FXTime speed);
00798 void setMenuPause(FXTime pause);
00799 void setToolTipPause(FXTime pause);
00800 void setToolTipTime(FXTime time);
00801 void setAutoHideDelay(FXTime time);
00802
00804 void setDragDelta(FXint delta);
00805 FXint getDragDelta() const { return dragDelta; }
00806
00808 void setWheelLines(FXint lines);
00809 FXint getWheelLines() const { return wheelLines; }
00810
00812 void setScrollBarSize(FXint size);
00813 FXint getScrollBarSize() const { return scrollBarSize; }
00814
00816 FXColor getBorderColor() const { return borderColor; }
00817 FXColor getBaseColor() const { return baseColor; }
00818 FXColor getHiliteColor() const { return hiliteColor; }
00819 FXColor getShadowColor() const { return shadowColor; }
00820 FXColor getBackColor() const { return backColor; }
00821 FXColor getForeColor() const { return foreColor; }
00822 FXColor getSelforeColor() const { return selforeColor; }
00823 FXColor getSelbackColor() const { return selbackColor; }
00824 FXColor getTipforeColor() const { return tipforeColor; }
00825 FXColor getTipbackColor() const { return tipbackColor; }
00826 FXColor getSelMenuTextColor() const { return selMenuTextColor; }
00827 FXColor getSelMenuBackColor() const { return selMenuBackColor; }
00828
00830 void setBorderColor(FXColor color);
00831 void setBaseColor(FXColor color);
00832 void setHiliteColor(FXColor color);
00833 void setShadowColor(FXColor color);
00834 void setBackColor(FXColor color);
00835 void setForeColor(FXColor color);
00836 void setSelforeColor(FXColor color);
00837 void setSelbackColor(FXColor color);
00838 void setTipforeColor(FXColor color);
00839 void setTipbackColor(FXColor color);
00840 void setSelMenuTextColor(FXColor color);
00841 void setSelMenuBackColor(FXColor color);
00842
00844 FXuint getWindowCount() const { return windowCount; }
00845
00847 virtual void create();
00848
00850 virtual void destroy();
00851
00853 virtual void detach();
00854
00856 virtual void save(FXStream& store) const;
00857
00859 virtual void load(FXStream& store);
00860
00862 void dumpWidgets() const;
00863
00865 static inline FXApp* instance(){ return app; }
00866
00868 virtual ~FXApp();
00869 };
00870
00871 }
00872
00873 #endif