00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef FXAPP_H
00025 #define FXAPP_H
00026
00027 #ifndef FXOBJECT_H
00028 #include "FXObject.h"
00029 #endif
00030
00031 namespace FX {
00032
00033
00034
00035 class FXApp;
00036 class FXWindow;
00037 class FXIcon;
00038 class FXBitmap;
00039 class FXCursor;
00040 class FXRootWindow;
00041 class FXMainWindow;
00042 class FXPopup;
00043 class FXFont;
00044 class FXDC;
00045 class FXDCWindow;
00046 class FXVisual;
00047 class FXGLVisual;
00048 class FXGLContext;
00049 class FXTranslator;
00050 class FXComposeContext;
00051
00052
00053 struct FXTimer;
00054 struct FXChore;
00055 struct FXSignal;
00056 struct FXRepaint;
00057 struct FXInput;
00058 struct FXInvocation;
00059
00060
00061
00062
00063 enum FXInputMode {
00064 INPUT_NONE = 0,
00065 INPUT_READ = 1,
00066 INPUT_WRITE = 2,
00067 INPUT_EXCEPT = 4
00068 };
00069
00070
00071
00072 enum FXModality {
00073 MODAL_FOR_NONE,
00074 MODAL_FOR_WINDOW,
00075 MODAL_FOR_POPUP
00076 };
00077
00078
00079
00080 enum FXDefaultCursor {
00081 DEF_ARROW_CURSOR,
00082 DEF_RARROW_CURSOR,
00083 DEF_TEXT_CURSOR,
00084 DEF_HSPLIT_CURSOR,
00085 DEF_VSPLIT_CURSOR,
00086 DEF_XSPLIT_CURSOR,
00087 DEF_SWATCH_CURSOR,
00088 DEF_MOVE_CURSOR,
00089 DEF_DRAGH_CURSOR,
00090 DEF_DRAGV_CURSOR,
00091 DEF_DRAGTL_CURSOR,
00092 DEF_DRAGBR_CURSOR=DEF_DRAGTL_CURSOR,
00093 DEF_DRAGTR_CURSOR,
00094 DEF_DRAGBL_CURSOR=DEF_DRAGTR_CURSOR,
00095 DEF_DNDSTOP_CURSOR,
00096 DEF_DNDCOPY_CURSOR,
00097 DEF_DNDMOVE_CURSOR,
00098 DEF_DNDLINK_CURSOR,
00099 DEF_CROSSHAIR_CURSOR,
00100 DEF_CORNERNE_CURSOR,
00101 DEF_CORNERNW_CURSOR,
00102 DEF_CORNERSE_CURSOR,
00103 DEF_CORNERSW_CURSOR,
00104 DEF_HELP_CURSOR,
00105 DEF_HAND_CURSOR,
00106 DEF_ROTATE_CURSOR,
00107 DEF_WAIT_CURSOR
00108 };
00109
00110
00111
00112
00113 struct FXAPI FXEvent {
00114 FXuint type;
00115 FXuint time;
00116 FXint win_x;
00117 FXint win_y;
00118 FXint root_x;
00119 FXint root_y;
00120 FXint state;
00121 FXint code;
00122 FXString text;
00123 FXint last_x;
00124 FXint last_y;
00125 FXint click_x;
00126 FXint click_y;
00127 FXint rootclick_x;
00128 FXint rootclick_y;
00129 FXuint click_time;
00130 FXuint click_button;
00131 FXint click_count;
00132 FXbool moved;
00133 FXRectangle rect;
00134 FXbool synthetic;
00135 FXDragType target;
00136 };
00137
00138
00139
00140 class FXAPI FXApp : public FXObject {
00141 FXDECLARE(FXApp)
00142
00143
00144 friend class FXId;
00145 friend class FXBitmap;
00146 friend class FXImage;
00147 friend class FXIcon;
00148 friend class FXCursor;
00149 friend class FXDrawable;
00150 friend class FXWindow;
00151 friend class FXShell;
00152 friend class FXRootWindow;
00153 friend class FXTopWindow;
00154 friend class FXMainWindow;
00155 friend class FXPopup;
00156 friend class FXFont;
00157 friend class FXVisual;
00158 friend class FXGLVisual;
00159 friend class FXGLContext;
00160 friend class FXDC;
00161 friend class FXDCWindow;
00162 friend class FXDragCorner;
00163 friend class FXDockHandler;
00164 friend class FXComposeContext;
00165
00166 private:
00167
00168
00169 void *display;
00170 const FXchar *dpy;
00171 FXHash hash;
00172 FXRegistry registry;
00173 FXWindow *activeWindow;
00174 FXWindow *cursorWindow;
00175 FXWindow *mouseGrabWindow;
00176 FXWindow *keyboardGrabWindow;
00177 FXWindow *keyWindow;
00178 FXWindow *selectionWindow;
00179 FXWindow *clipboardWindow;
00180 FXWindow *dropWindow;
00181 FXWindow *dragWindow;
00182 FXWindow *refresher;
00183 FXWindow *refresherstop;
00184 FXPopup *popupWindow;
00185 FXRootWindow *root;
00186 FXVisual *monoVisual;
00187 FXVisual *defaultVisual;
00188 FXTimer *timers;
00189 FXChore *chores;
00190 FXRepaint *repaints;
00191 FXTimer *timerrecs;
00192 FXChore *chorerecs;
00193 FXRepaint *repaintrecs;
00194 FXInvocation *invocation;
00195 FXSignal *signals;
00196 FXint nsignals;
00197 FXFont *normalFont;
00198 FXFont *stockFont;
00199 FXMutex appMutex;
00200 FXEvent event;
00201 FXuint stickyMods;
00202 FXInput *inputs;
00203 FXint ninputs;
00204 FXint maxinput;
00205 FXuchar *ddeData;
00206 FXuint ddeSize;
00207 FXuint maxcolors;
00208 FXuint typingSpeed;
00209 FXuint clickSpeed;
00210 FXuint scrollSpeed;
00211 FXuint scrollDelay;
00212 FXuint blinkSpeed;
00213 FXuint animSpeed;
00214 FXuint menuPause;
00215 FXuint tooltipPause;
00216 FXuint tooltipTime;
00217 FXint dragDelta;
00218 FXint wheelLines;
00219 FXint scrollBarSize;
00220 FXColor borderColor;
00221 FXColor baseColor;
00222 FXColor hiliteColor;
00223 FXColor shadowColor;
00224 FXColor backColor;
00225 FXColor foreColor;
00226 FXColor selforeColor;
00227 FXColor selbackColor;
00228 FXColor tipforeColor;
00229 FXColor tipbackColor;
00230 FXColor selMenuTextColor;
00231 FXColor selMenuBackColor;
00232 FXCursor *waitCursor;
00233 FXuint waitCount;
00234 FXuint windowCount;
00235 FXCursor *cursor[DEF_WAIT_CURSOR+1];
00236 FXTranslator *translator;
00237 FXint appArgc;
00238 const FXchar *const *appArgv;
00239 const FXchar *inputmethod;
00240 const FXchar *inputstyle;
00241 bool initialized;
00242
00243 private:
00244 static FXApp *app;
00245
00246
00247 #ifndef WIN32
00248 private:
00249 FXID wmDeleteWindow;
00250 FXID wmQuitApp;
00251 FXID wmProtocols;
00252 FXID wmMotifHints;
00253 FXID wmTakeFocus;
00254 FXID wmState;
00255 FXID wmNetState;
00256 FXID wmNetIconName;
00257 FXID wmNetWindowName;
00258 FXID wmNetSupported;
00259 FXID wmNetWindowType;
00260 FXID wmNetHMaximized;
00261 FXID wmNetVMaximized;
00262 FXID wmNetMoveResize;
00263 FXID wmNetPing;
00264 FXID wmNetTypes[8];
00265 FXID wmNetStates[12];
00266 FXID wmWindowRole;
00267 FXID wmClientLeader;
00268 FXID wmClientId;
00269 FXID embedAtom;
00270 FXID embedInfoAtom;
00271 FXID timestampAtom;
00272 FXID ddeTargets;
00273 FXID ddeAtom;
00274 FXID ddeDelete;
00275 FXID ddeIncr;
00276 FXDragType *ddeTypeList;
00277 FXuint ddeNumTypes;
00278 FXDragAction ddeAction;
00279 FXDragAction ansAction;
00280 FXID xcbSelection;
00281 FXDragType *xcbTypeList;
00282 FXuint xcbNumTypes;
00283 FXDragType *xselTypeList;
00284 FXuint xselNumTypes;
00285 FXDragType *xdndTypeList;
00286 FXuint xdndNumTypes;
00287 FXID xdndProxy;
00288 FXID xdndAware;
00289 FXID xdndEnter;
00290 FXID xdndLeave;
00291 FXID xdndPosition;
00292 FXID xdndStatus;
00293 FXID xdndDrop;
00294 FXID xdndFinished;
00295 FXID xdndSelection;
00296 FXID xdndActionMove;
00297 FXID xdndActionCopy;
00298 FXID xdndActionLink;
00299 FXID xdndActionPrivate;
00300 FXID xdndTypes;
00301 FXID xdndSource;
00302 FXID xdndTarget;
00303 FXID xdndProxyTarget;
00304 FXbool xdndStatusPending;
00305 FXbool xdndStatusReceived;
00306 FXbool xdndWantUpdates;
00307 FXbool xdndFinishSent;
00308 FXRectangle xdndRect;
00309 FXint xrreventbase;
00310 FXID stipples[23];
00311 void *r_fds;
00312 void *w_fds;
00313 void *e_fds;
00314 void *xim;
00315 FXbool shmi;
00316 FXbool shmp;
00317 FXbool synchronize;
00318
00319 #else
00320
00321 FXushort ddeTargets;
00322 FXushort ddeAtom;
00323 FXDragType ddeDelete;
00324 FXDragType *ddeTypeList;
00325 FXuint ddeNumTypes;
00326 FXDragAction ddeAction;
00327 FXDragAction ansAction;
00328 FXDragType *xselTypeList;
00329 FXuint xselNumTypes;
00330 void* xdndTypes;
00331 FXushort xdndAware;
00332 FXID xdndSource;
00333 FXID xdndTarget;
00334 FXbool xdndStatusPending;
00335 FXbool xdndFinishPending;
00336 FXbool xdndStatusReceived;
00337 FXbool xdndFinishSent;
00338 FXRectangle xdndRect;
00339 FXID stipples[17];
00340 void **handles;
00341
00342 #endif
00343
00344 private:
00345
00346
00347 FXApp(const FXApp&);
00348 FXApp &operator=(const FXApp&);
00349 static void signalhandler(int sig);
00350 static void immediatesignalhandler(int sig);
00351 void leaveWindow(FXWindow *window,FXWindow *ancestor);
00352 void enterWindow(FXWindow *window,FXWindow *ancestor);
00353 void selectionSetData(const FXWindow* window,FXDragType type,FXuchar* data,FXuint size);
00354 void selectionGetData(const FXWindow* window,FXDragType type,FXuchar*& data,FXuint& size);
00355 void selectionGetTypes(const FXWindow* window,FXDragType*& types,FXuint& numtypes);
00356 void clipboardSetData(const FXWindow* window,FXDragType type,FXuchar* data,FXuint size);
00357 void clipboardGetData(const FXWindow* window,FXDragType type,FXuchar*& data,FXuint& size);
00358 void clipboardGetTypes(const FXWindow* window,FXDragType*& types,FXuint& numtypes);
00359 void dragdropSetData(const FXWindow* window,FXDragType type,FXuchar* data,FXuint size);
00360 void dragdropGetData(const FXWindow* window,FXDragType type,FXuchar*& data,FXuint& size);
00361 void dragdropGetTypes(const FXWindow* window,FXDragType*& types,FXuint& numtypes);
00362 #ifndef WIN32
00363 void addRepaint(FXID win,FXint x,FXint y,FXint w,FXint h,FXbool synth=0);
00364 void removeRepaints(FXID win,FXint x,FXint y,FXint w,FXint h);
00365 void scrollRepaints(FXID win,FXint dx,FXint dy);
00366 static void imcreatecallback(void*,FXApp*,void*);
00367 static void imdestroycallback(void*,FXApp*,void*);
00368 #else
00369 static long CALLBACK wndproc(FXID hwnd,unsigned int iMsg,unsigned int wParam,long lParam);
00370 protected:
00371 virtual long dispatchEvent(FXID hwnd,unsigned int iMsg,unsigned int wParam,long lParam);
00372 #endif
00373
00374 protected:
00375
00376
00377 virtual bool getNextEvent(FXRawEvent& ev,bool blocking=true);
00378
00379
00380 virtual bool dispatchEvent(FXRawEvent& ev);
00381
00382 public:
00383 long onCmdQuit(FXObject*,FXSelector,void*);
00384 long onCmdDump(FXObject*,FXSelector,void*);
00385 long onCmdHover(FXObject*,FXSelector,void*);
00386
00387 public:
00388
00389
00390 enum {
00391 ID_QUIT=1,
00392 ID_DUMP,
00393 ID_HOVER,
00394 ID_LAST
00395 };
00396
00397 public:
00398
00399
00400 static const FXuchar copyright[];
00401
00402 public:
00403
00404
00405
00406
00407
00408
00409 FXApp(const FXString& name="Application",const FXString& vendor="FoxDefault");
00410
00411
00412 const FXString& getAppName() const { return registry.getAppKey(); }
00413
00414
00415 const FXString& getVendorName() const { return registry.getVendorKey(); }
00416
00417
00418 bool openDisplay(const FXchar* dpyname=NULL);
00419
00420
00421 bool closeDisplay();
00422
00423
00424 void* getDisplay() const { return display; }
00425
00426
00427 bool isInitialized() const { return initialized; }
00428
00429
00430 FXint getArgc() const { return appArgc; }
00431
00432
00433 const FXchar *const *getArgv() const { return appArgv; }
00434
00435
00436 bool hasInputMethod() const;
00437
00438
00439 FXVisual* getDefaultVisual() const { return defaultVisual; }
00440
00441
00442 void setDefaultVisual(FXVisual* vis);
00443
00444
00445 FXVisual* getMonoVisual() const { return monoVisual; }
00446
00447
00448 FXRootWindow* getRootWindow() const { return root; }
00449
00450
00451 void setRootWindow(FXRootWindow* rt);
00452
00453
00454 FXWindow *getFocusWindow() const;
00455
00456
00457 FXWindow *getCursorWindow() const { return cursorWindow; }
00458
00459
00460 FXWindow *getActiveWindow() const { return activeWindow; }
00461
00462
00463 FXPopup* getPopupWindow() const { return popupWindow; }
00464
00465
00466 FXWindow* findWindowWithId(FXID xid) const;
00467
00468
00469 FXWindow* findWindowAt(FXint rx,FXint ry,FXID window=0) const;
00470
00471
00472 virtual void create();
00473
00474
00475 virtual void destroy();
00476
00477
00478 virtual void detach();
00479
00480
00481
00482
00483
00484
00485
00486
00487 void addTimeout(FXObject* tgt,FXSelector sel,FXuint ms=1000,void* ptr=NULL);
00488
00489
00490
00491
00492 void removeTimeout(FXObject* tgt,FXSelector sel);
00493
00494
00495
00496
00497 bool hasTimeout(FXObject *tgt,FXSelector sel) const;
00498
00499
00500
00501
00502
00503
00504 FXuint remainingTimeout(FXObject *tgt,FXSelector sel);
00505
00506
00507
00508
00509 void handleTimeouts();
00510
00511
00512
00513
00514
00515
00516
00517
00518 void addChore(FXObject* tgt,FXSelector sel,void *ptr=NULL);
00519
00520
00521
00522
00523 void removeChore(FXObject* tgt,FXSelector sel);
00524
00525
00526
00527
00528 bool hasChore(FXObject *tgt,FXSelector sel) const;
00529
00530
00531
00532
00533
00534
00535
00536
00537 void addSignal(FXint sig,FXObject* tgt,FXSelector sel,FXbool immediate=FALSE,FXuint flags=0);
00538
00539
00540 void removeSignal(FXint sig);
00541
00542
00543
00544
00545
00546
00547
00548 bool addInput(FXInputHandle fd,FXuint mode,FXObject *tgt,FXSelector sel);
00549
00550
00551
00552
00553
00554 bool removeInput(FXInputHandle fd,FXuint mode);
00555
00556
00557 bool getKeyState(FXuint keysym) const;
00558
00559
00560 bool peekEvent();
00561
00562
00563 bool runOneEvent(bool blocking=true);
00564
00565
00566
00567
00568
00569 FXint run();
00570
00571
00572
00573
00574
00575 FXint runUntil(FXuint& condition);
00576
00577
00578
00579
00580
00581 FXint runWhileEvents();
00582
00583
00584
00585
00586
00587
00588
00589
00590 FXint runModalWhileEvents(FXWindow* window=NULL);
00591
00592
00593
00594
00595
00596 FXint runModal();
00597
00598
00599
00600
00601
00602
00603 FXint runModalFor(FXWindow* window);
00604
00605
00606
00607
00608
00609
00610 FXint runModalWhileShown(FXWindow* window);
00611
00612
00613
00614
00615
00616 FXint runPopup(FXWindow* window);
00617
00618
00619 bool isModal(FXWindow* window) const;
00620
00621
00622 FXWindow* getModalWindow() const;
00623
00624
00625 FXModality getModality() const;
00626
00627
00628
00629
00630
00631
00632 void stop(FXint value=0);
00633
00634
00635
00636
00637
00638 void stopModal(FXWindow* window,FXint value=0);
00639
00640
00641
00642
00643 void stopModal(FXint value=0);
00644
00645
00646 void forceRefresh();
00647
00648
00649 void refresh();
00650
00651
00652 void flush(bool sync=false);
00653
00654
00655
00656
00657
00658 void repaint();
00659
00660
00661
00662
00663
00664
00665 virtual void init(int& argc,char** argv,bool connect=true);
00666
00667
00668
00669
00670
00671 virtual void exit(FXint code=0);
00672
00673
00674
00675
00676
00677
00678
00679 FXRegistry& reg(){ return registry; }
00680
00681
00682 FXDragType registerDragType(const FXString& name) const;
00683
00684
00685 FXString getDragTypeName(FXDragType type) const;
00686
00687
00688 FXWindow* getDragWindow() const { return dragWindow; }
00689
00690
00691 void beep();
00692
00693
00694 static inline FXApp* instance(){ return app; }
00695
00696
00697 void setNormalFont(FXFont* font);
00698
00699
00700 FXFont* getNormalFont() const { return normalFont; }
00701
00702
00703 void beginWaitCursor();
00704
00705
00706 void endWaitCursor();
00707
00708
00709 void setWaitCursor(FXCursor *cur);
00710
00711
00712 FXCursor* getWaitCursor() const { return waitCursor; }
00713
00714
00715 FXCursor* getDefaultCursor(FXDefaultCursor which) const { return cursor[which]; }
00716
00717
00718 void setDefaultCursor(FXDefaultCursor which,FXCursor* cur);
00719
00720
00721
00722
00723
00724 FXbool writeWindow(FXStream& store,FXWindow *window);
00725
00726
00727
00728
00729
00730 FXbool readWindow(FXStream& store,FXWindow*& window,FXWindow* father,FXWindow* owner);
00731
00732
00733
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744 FXMutex& mutex(){ return appMutex; }
00745
00746
00747
00748
00749
00750 void setTranslator(FXTranslator* trans);
00751
00752
00753 FXTranslator* getTranslator() const { return translator; }
00754
00755
00756 FXuint getTypingSpeed() const { return typingSpeed; }
00757 FXuint getClickSpeed() const { return clickSpeed; }
00758 FXuint getScrollSpeed() const { return scrollSpeed; }
00759 FXuint getScrollDelay() const { return scrollDelay; }
00760 FXuint getBlinkSpeed() const { return blinkSpeed; }
00761 FXuint getAnimSpeed() const { return animSpeed; }
00762 FXuint getMenuPause() const { return menuPause; }
00763 FXuint getTooltipPause() const { return tooltipPause; }
00764 FXuint getTooltipTime() const { return tooltipTime; }
00765 FXint getDragDelta() const { return dragDelta; }
00766 FXint getWheelLines() const { return wheelLines; }
00767 FXint getScrollBarSize() const { return scrollBarSize; }
00768
00769
00770 void setTypingSpeed(FXuint speed);
00771 void setClickSpeed(FXuint speed);
00772 void setScrollSpeed(FXuint speed);
00773 void setScrollDelay(FXuint delay);
00774 void setBlinkSpeed(FXuint speed);
00775 void setAnimSpeed(FXuint speed);
00776 void setMenuPause(FXuint pause);
00777 void setTooltipPause(FXuint pause);
00778 void setTooltipTime(FXuint time);
00779 void setDragDelta(FXint delta);
00780 void setWheelLines(FXint lines);
00781 void setScrollBarSize(FXint size);
00782
00783
00784 FXColor getBorderColor() const { return borderColor; }
00785 FXColor getBaseColor() const { return baseColor; }
00786 FXColor getHiliteColor() const { return hiliteColor; }
00787 FXColor getShadowColor() const { return shadowColor; }
00788 FXColor getBackColor() const { return backColor; }
00789 FXColor getForeColor() const { return foreColor; }
00790 FXColor getSelforeColor() const { return selforeColor; }
00791 FXColor getSelbackColor() const { return selbackColor; }
00792 FXColor getTipforeColor() const { return tipforeColor; }
00793 FXColor getTipbackColor() const { return tipbackColor; }
00794 FXColor getSelMenuTextColor() const { return selMenuTextColor; }
00795 FXColor getSelMenuBackColor() const { return selMenuBackColor; }
00796
00797
00798 void setBorderColor(FXColor color);
00799 void setBaseColor(FXColor color);
00800 void setHiliteColor(FXColor color);
00801 void setShadowColor(FXColor color);
00802 void setBackColor(FXColor color);
00803 void setForeColor(FXColor color);
00804 void setSelforeColor(FXColor color);
00805 void setSelbackColor(FXColor color);
00806 void setTipforeColor(FXColor color);
00807 void setTipbackColor(FXColor color);
00808 void setSelMenuTextColor(FXColor color);
00809 void setSelMenuBackColor(FXColor color);
00810
00811
00812 FXuint getWindowCount() const { return windowCount; }
00813
00814
00815 virtual void save(FXStream& store) const;
00816
00817
00818 virtual void load(FXStream& store);
00819
00820
00821 void dumpWidgets() const;
00822
00823
00824 virtual ~FXApp();
00825 };
00826
00827 }
00828
00829 #endif