comparison dw.hpp @ 2960:1dabe9c6c67b

C++: Step 2 of the std::string transition. Implement std::string versions of the Connect callback functions. Add "C" to the name of the UTF8 returning functions. Reimplement the functions as std::string by default.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 16 Feb 2023 12:04:52 +0000
parents cde59690d3dd
children b9bd130f438a
comparison
equal deleted inserted replaced
2959:cde59690d3dd 2960:1dabe9c6c67b
22 #define DW_LAMBDA 22 #define DW_LAMBDA
23 #include <functional> 23 #include <functional>
24 #endif 24 #endif
25 25
26 // Attempt to allow compilation on GCC older than 4.7 26 // Attempt to allow compilation on GCC older than 4.7
27 #if defined(__GNUC__) && (__GNuC__ < 5 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7)) 27 #if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7))
28 #define override 28 #define override
29 #define final 29 #define final
30 #endif 30 #endif
31 31
32 // Attempt to allow compilation on MSVC older than 2012 32 // Attempt to allow compilation on MSVC older than 2012
35 #endif 35 #endif
36 36
37 namespace DW 37 namespace DW
38 { 38 {
39 39
40 #define THREAD_STACK 10000 40 #define _DW_THREAD_STACK 10000
41
42 // Macro to convert an allocated C string buffer to std::string, free the buffer and return the std::string
43 #define _dw_string_free_return(a) std::string utf8string = a ? std::string(a) : std::string(); if(a) dw_free(a); return utf8string;
41 44
42 // Forward declare these so they can be referenced 45 // Forward declare these so they can be referenced
43 class Render; 46 class Render;
44 class Pixmap; 47 class Pixmap;
45 class MenuItem; 48 class MenuItem;
78 return DW_NULL; 81 return DW_NULL;
79 } 82 }
80 void GetPreferredSize(int *width, int *height) { dw_window_get_preferred_size(hwnd, width, height); } 83 void GetPreferredSize(int *width, int *height) { dw_window_get_preferred_size(hwnd, width, height); }
81 int SetColor(unsigned long fore, unsigned long back) { return dw_window_set_color(hwnd, fore, back); } 84 int SetColor(unsigned long fore, unsigned long back) { return dw_window_set_color(hwnd, fore, back); }
82 void SetData(const char *dataname, void *data) { dw_window_set_data(hwnd, dataname, data); } 85 void SetData(const char *dataname, void *data) { dw_window_set_data(hwnd, dataname, data); }
86 void SetData(std::string dataname, void *data) { dw_window_set_data(hwnd, dataname.c_str(), data); }
83 void *GetData(const char *dataname) { return dw_window_get_data(hwnd, dataname); } 87 void *GetData(const char *dataname) { return dw_window_get_data(hwnd, dataname); }
88 void *GetData(std::string dataname) { return dw_window_get_data(hwnd, dataname.c_str()); }
84 void SetPointer(int cursortype) { dw_window_set_pointer(hwnd, cursortype); } 89 void SetPointer(int cursortype) { dw_window_set_pointer(hwnd, cursortype); }
85 void SetStyle(unsigned long flags, unsigned long mask) { dw_window_set_style(hwnd, flags, mask); } 90 void SetStyle(unsigned long flags, unsigned long mask) { dw_window_set_style(hwnd, flags, mask); }
86 void SetStyle(unsigned long flags) { dw_window_set_style(hwnd, flags, flags); } 91 void SetStyle(unsigned long flags) { dw_window_set_style(hwnd, flags, flags); }
87 void SetTooltip(const char *bubbletext) { dw_window_set_tooltip(hwnd, bubbletext); } 92 void SetTooltip(const char *bubbletext) { dw_window_set_tooltip(hwnd, bubbletext); }
93 void SetTooltip(std::string bubbletext) { dw_window_set_tooltip(hwnd, bubbletext.c_str()); }
88 int Unpack() { return dw_box_unpack(hwnd); } 94 int Unpack() { return dw_box_unpack(hwnd); }
89 }; 95 };
90 96
91 // Box class is a packable object 97 // Box class is a packable object
92 class Boxes : virtual public Widget 98 class Boxes : virtual public Widget
375 Window(HWND owner, std::string title, unsigned long style) { SetHWND(dw_window_new(owner, title.c_str(), style)); Setup(); } 381 Window(HWND owner, std::string title, unsigned long style) { SetHWND(dw_window_new(owner, title.c_str(), style)); Setup(); }
376 Window(std::string title, unsigned long style) { SetHWND(dw_window_new(HWND_DESKTOP, title.c_str(), style)); Setup(); } 382 Window(std::string title, unsigned long style) { SetHWND(dw_window_new(HWND_DESKTOP, title.c_str(), style)); Setup(); }
377 Window(unsigned long style) { SetHWND(dw_window_new(HWND_DESKTOP, "", style)); Setup(); } 383 Window(unsigned long style) { SetHWND(dw_window_new(HWND_DESKTOP, "", style)); Setup(); }
378 Window(const char *title) { SetHWND(dw_window_new(HWND_DESKTOP, title, DW_FCF_SYSMENU | DW_FCF_TITLEBAR | 384 Window(const char *title) { SetHWND(dw_window_new(HWND_DESKTOP, title, DW_FCF_SYSMENU | DW_FCF_TITLEBAR |
379 DW_FCF_TASKLIST | DW_FCF_SIZEBORDER | DW_FCF_MINMAX)); Setup(); } 385 DW_FCF_TASKLIST | DW_FCF_SIZEBORDER | DW_FCF_MINMAX)); Setup(); }
386 Window(std::string title) { SetHWND(dw_window_new(HWND_DESKTOP, title.c_str(), DW_FCF_SYSMENU | DW_FCF_TITLEBAR |
387 DW_FCF_TASKLIST | DW_FCF_SIZEBORDER | DW_FCF_MINMAX)); Setup(); }
380 Window() { SetHWND(dw_window_new(HWND_DESKTOP, "", DW_FCF_SYSMENU | DW_FCF_TITLEBAR | 388 Window() { SetHWND(dw_window_new(HWND_DESKTOP, "", DW_FCF_SYSMENU | DW_FCF_TITLEBAR |
381 DW_FCF_TASKLIST | DW_FCF_SIZEBORDER | DW_FCF_MINMAX)); Setup(); } 389 DW_FCF_TASKLIST | DW_FCF_SIZEBORDER | DW_FCF_MINMAX)); Setup(); }
382 390
383 // User functions 391 // User functions
384 void SetText(const char *text) { dw_window_set_text(hwnd, text); } 392 void SetText(const char *text) { dw_window_set_text(hwnd, text); }
385 void SetText(std::string text) { dw_window_set_text(hwnd, text.c_str()); } 393 void SetText(std::string text) { dw_window_set_text(hwnd, text.c_str()); }
386 char *GetText() { return dw_window_get_text(hwnd); } 394 char *GetCText() { return dw_window_get_text(hwnd); }
395 std::string GetText() {
396 char *retval = dw_window_get_text(hwnd);
397 _dw_string_free_return(retval);
398 }
387 void SetSize(unsigned long width, unsigned long height) { dw_window_set_size(hwnd, width, height); } 399 void SetSize(unsigned long width, unsigned long height) { dw_window_set_size(hwnd, width, height); }
388 int Show() { return dw_window_show(hwnd); } 400 int Show() { return dw_window_show(hwnd); }
389 int Hide() { return dw_window_hide(hwnd); } 401 int Hide() { return dw_window_hide(hwnd); }
390 void SetGravity(int horz, int vert) { dw_window_set_gravity(hwnd, horz, vert); } 402 void SetGravity(int horz, int vert) { dw_window_set_gravity(hwnd, horz, vert); }
391 int Minimize() { return dw_window_minimize(hwnd); } 403 int Minimize() { return dw_window_minimize(hwnd); }
510 { 522 {
511 public: 523 public:
512 // User functions 524 // User functions
513 void SetText(const char *text) { dw_window_set_text(hwnd, text); } 525 void SetText(const char *text) { dw_window_set_text(hwnd, text); }
514 void SetText(std::string text) { dw_window_set_text(hwnd, text.c_str()); } 526 void SetText(std::string text) { dw_window_set_text(hwnd, text.c_str()); }
515 char *GetText() { return dw_window_get_text(hwnd); } 527 char *GetCText() { return dw_window_get_text(hwnd); }
528 std::string GetText() {
529 char *retval = dw_window_get_text(hwnd);
530 _dw_string_free_return(retval);
531 }
516 }; 532 };
517 533
518 class Button : public TextButton 534 class Button : public TextButton
519 { 535 {
520 public: 536 public:
531 { 547 {
532 public: 548 public:
533 // User functions 549 // User functions
534 void Set(unsigned long id) { dw_window_set_bitmap(hwnd, id, DW_NULL); } 550 void Set(unsigned long id) { dw_window_set_bitmap(hwnd, id, DW_NULL); }
535 void Set(const char *file) { dw_window_set_bitmap(hwnd, 0, file); } 551 void Set(const char *file) { dw_window_set_bitmap(hwnd, 0, file); }
552 void Set(std::string file) { dw_window_set_bitmap(hwnd, 0, file.c_str()); }
536 void Set(const char *data, int len) { dw_window_set_bitmap_from_data(hwnd, 0, data, len); } 553 void Set(const char *data, int len) { dw_window_set_bitmap_from_data(hwnd, 0, data, len); }
537 }; 554 };
538 555
539 // Image based button 556 // Image based button
540 class BitmapButton : public Clickable, public Focusable, public BitmapWidget 557 class BitmapButton : public Clickable, public Focusable, public BitmapWidget
591 { 608 {
592 public: 609 public:
593 // User functions 610 // User functions
594 void SetText(const char *text) { dw_window_set_text(hwnd, text); } 611 void SetText(const char *text) { dw_window_set_text(hwnd, text); }
595 void SetText(std::string text) { dw_window_set_text(hwnd, text.c_str()); } 612 void SetText(std::string text) { dw_window_set_text(hwnd, text.c_str()); }
596 char *GetText() { return dw_window_get_text(hwnd); } 613 char *GetCText() { return dw_window_get_text(hwnd); }
614 std::string GetText() {
615 char *retval = dw_window_get_text(hwnd);
616 _dw_string_free_return(retval);
617 }
597 int SetFont(const char *font) { return dw_window_set_font(hwnd, font); } 618 int SetFont(const char *font) { return dw_window_set_font(hwnd, font); }
598 char *GetFont() { return dw_window_get_font(hwnd); } 619 char *GetCFont() { return dw_window_get_font(hwnd); }
620 std::string GetFont() {
621 char *retval = dw_window_get_font(hwnd);
622 _dw_string_free_return(retval);
623 }
599 }; 624 };
600 625
601 // Class for handling static text widget 626 // Class for handling static text widget
602 class Text : public TextWidget 627 class Text : public TextWidget
603 { 628 {
675 private: 700 private:
676 bool ExposeConnected, ConfigureConnected, KeyPressConnected, ButtonPressConnected, ButtonReleaseConnected, MotionNotifyConnected; 701 bool ExposeConnected, ConfigureConnected, KeyPressConnected, ButtonPressConnected, ButtonReleaseConnected, MotionNotifyConnected;
677 #ifdef DW_LAMBDA 702 #ifdef DW_LAMBDA
678 std::function<int(DWExpose *)> _ConnectExpose; 703 std::function<int(DWExpose *)> _ConnectExpose;
679 std::function<int(int, int)> _ConnectConfigure; 704 std::function<int(int, int)> _ConnectConfigure;
680 std::function<int(char c, int, int, char *)> _ConnectKeyPress; 705 std::function<int(char c, int, int, char *)> _ConnectCKeyPress;
706 std::function<int(char c, int, int, std::string)> _ConnectKeyPress;
681 std::function<int(int, int, int)> _ConnectButtonPress; 707 std::function<int(int, int, int)> _ConnectButtonPress;
682 std::function<int(int, int, int)> _ConnectButtonRelease; 708 std::function<int(int, int, int)> _ConnectButtonRelease;
683 std::function<int(int, int, int)> _ConnectMotionNotify; 709 std::function<int(int, int, int)> _ConnectMotionNotify;
684 #endif 710 #endif
685 int (*_ConnectExposeOld)(Render *, DWExpose *); 711 int (*_ConnectExposeOld)(Render *, DWExpose *);
686 int (*_ConnectConfigureOld)(Render *, int width, int height); 712 int (*_ConnectConfigureOld)(Render *, int width, int height);
687 int (*_ConnectKeyPressOld)(Render *, char c, int vk, int state, char *utf8); 713 int (*_ConnectCKeyPressOld)(Render *, char c, int vk, int state, char *utf8);
714 int (*_ConnectKeyPressOld)(Render *, char c, int vk, int state, std::string utf8);
688 int (*_ConnectButtonPressOld)(Render *, int x, int y, int buttonmask); 715 int (*_ConnectButtonPressOld)(Render *, int x, int y, int buttonmask);
689 int (*_ConnectButtonReleaseOld)(Render *, int x, int y, int buttonmask); 716 int (*_ConnectButtonReleaseOld)(Render *, int x, int y, int buttonmask);
690 int (*_ConnectMotionNotifyOld)(Render *, int x, int y, int buttonmask); 717 int (*_ConnectMotionNotifyOld)(Render *, int x, int y, int buttonmask);
691 void Setup() { 718 void Setup() {
692 #ifdef DW_LAMBDA 719 #ifdef DW_LAMBDA
693 _ConnectExpose = 0; 720 _ConnectExpose = 0;
694 _ConnectConfigure = 0; 721 _ConnectConfigure = 0;
722 _ConnectCKeyPress = 0;
695 _ConnectKeyPress = 0; 723 _ConnectKeyPress = 0;
696 _ConnectButtonPress = 0; 724 _ConnectButtonPress = 0;
697 _ConnectButtonRelease = 0; 725 _ConnectButtonRelease = 0;
698 _ConnectMotionNotify = 0; 726 _ConnectMotionNotify = 0;
699 #endif 727 #endif
700 _ConnectExposeOld = 0; 728 _ConnectExposeOld = 0;
701 _ConnectConfigureOld = 0; 729 _ConnectConfigureOld = 0;
730 _ConnectCKeyPressOld = 0;
702 _ConnectKeyPressOld = 0; 731 _ConnectKeyPressOld = 0;
703 _ConnectButtonPressOld = 0; 732 _ConnectButtonPressOld = 0;
704 _ConnectButtonReleaseOld = 0; 733 _ConnectButtonReleaseOld = 0;
705 _ConnectMotionNotifyOld = 0; 734 _ConnectMotionNotifyOld = 0;
706 if(IsOverridden(Render::OnExpose, this)) { 735 if(IsOverridden(Render::OnExpose, this)) {
759 return classptr->_ConnectConfigureOld(classptr, width, height); 788 return classptr->_ConnectConfigureOld(classptr, width, height);
760 return classptr->OnConfigure(width, height); } 789 return classptr->OnConfigure(width, height); }
761 static int _OnKeyPress(HWND window, char c, int vk, int state, void *data, char *utf8) { 790 static int _OnKeyPress(HWND window, char c, int vk, int state, void *data, char *utf8) {
762 Render *classptr = reinterpret_cast<Render *>(data); 791 Render *classptr = reinterpret_cast<Render *>(data);
763 #ifdef DW_LAMBDA 792 #ifdef DW_LAMBDA
764 if(classptr->_ConnectKeyPress) 793 if(classptr->_ConnectCKeyPress)
765 return classptr->_ConnectKeyPress(c, vk, state, utf8); 794 return classptr->_ConnectCKeyPress(c, vk, state, utf8);
766 #endif 795 else if(classptr->_ConnectKeyPress) {
767 if(classptr->_ConnectKeyPressOld) 796 std::string utf8string = utf8 ? std::string(utf8) : std::string();
768 return classptr->_ConnectKeyPressOld(classptr, c, vk, state, utf8); 797 return classptr->_ConnectKeyPress(c, vk, state, utf8string);
798 }
799 #endif
800 if(classptr->_ConnectCKeyPressOld)
801 return classptr->_ConnectCKeyPressOld(classptr, c, vk, state, utf8);
802 else if(classptr->_ConnectKeyPressOld) {
803 std::string utf8string = utf8 ? std::string(utf8) : std::string();
804 return classptr->_ConnectKeyPressOld(classptr, c, vk, state, utf8string);
805 }
769 return classptr->OnKeyPress(c, vk, state, utf8); } 806 return classptr->OnKeyPress(c, vk, state, utf8); }
770 static int _OnButtonPress(HWND window, int x, int y, int buttonmask, void *data) { 807 static int _OnButtonPress(HWND window, int x, int y, int buttonmask, void *data) {
771 Render *classptr = reinterpret_cast<Render *>(data); 808 Render *classptr = reinterpret_cast<Render *>(data);
772 #ifdef DW_LAMBDA 809 #ifdef DW_LAMBDA
773 if(classptr->_ConnectButtonPress) 810 if(classptr->_ConnectButtonPress)
817 void BitBlt(int xdest, int ydest, int width, int height, Pixmap *src, int xsrc, int ysrc); 854 void BitBlt(int xdest, int ydest, int width, int height, Pixmap *src, int xsrc, int ysrc);
818 int SetFont(const char *fontname) { return dw_window_set_font(hwnd, fontname); } 855 int SetFont(const char *fontname) { return dw_window_set_font(hwnd, fontname); }
819 int SetFont(std::string fontname) { return dw_window_set_font(hwnd, fontname.c_str()); } 856 int SetFont(std::string fontname) { return dw_window_set_font(hwnd, fontname.c_str()); }
820 void GetTextExtents(const char *text, int *width, int *height) { dw_font_text_extents_get(hwnd, DW_NULL, text, width, height); } 857 void GetTextExtents(const char *text, int *width, int *height) { dw_font_text_extents_get(hwnd, DW_NULL, text, width, height); }
821 void GetTextExtents(std::string text, int *width, int *height) { dw_font_text_extents_get(hwnd, DW_NULL, text.c_str(), width, height); } 858 void GetTextExtents(std::string text, int *width, int *height) { dw_font_text_extents_get(hwnd, DW_NULL, text.c_str(), width, height); }
822 char *GetFont() { return dw_window_get_font(hwnd); } 859 char *GetCFont() { return dw_window_get_font(hwnd); }
860 std::string GetFont() {
861 char *retval = dw_window_get_font(hwnd);
862 _dw_string_free_return(retval);
863 }
823 void Redraw() { dw_render_redraw(hwnd); } 864 void Redraw() { dw_render_redraw(hwnd); }
824 void Flush() { dw_flush(); } 865 void Flush() { dw_flush(); }
825 #ifdef DW_LAMBDA 866 #ifdef DW_LAMBDA
826 void ConnectExpose(std::function<int(DWExpose *)> userfunc) 867 void ConnectExpose(std::function<int(DWExpose *)> userfunc)
827 { 868 {
859 } 900 }
860 } 901 }
861 #ifdef DW_LAMBDA 902 #ifdef DW_LAMBDA
862 void ConnectKeyPress(std::function<int(char, int, int, char *)> userfunc) 903 void ConnectKeyPress(std::function<int(char, int, int, char *)> userfunc)
863 { 904 {
905 _ConnectCKeyPress = userfunc;
906 if(!KeyPressConnected) {
907 dw_signal_connect(hwnd, DW_SIGNAL_KEY_PRESS, DW_SIGNAL_FUNC(_OnKeyPress), this);
908 KeyPressConnected = true;
909 }
910 }
911 void ConnectKeyPress(std::function<int(char, int, int, std::string)> userfunc)
912 {
864 _ConnectKeyPress = userfunc; 913 _ConnectKeyPress = userfunc;
865 if(!KeyPressConnected) { 914 if(!KeyPressConnected) {
866 dw_signal_connect(hwnd, DW_SIGNAL_KEY_PRESS, DW_SIGNAL_FUNC(_OnKeyPress), this); 915 dw_signal_connect(hwnd, DW_SIGNAL_KEY_PRESS, DW_SIGNAL_FUNC(_OnKeyPress), this);
867 KeyPressConnected = true; 916 KeyPressConnected = true;
868 } 917 }
869 } 918 }
870 #endif 919 #endif
871 void ConnectKeyPress(int (*userfunc)(Render *, char, int, int, char *)) 920 void ConnectKeyPress(int (*userfunc)(Render *, char, int, int, char *))
921 {
922 _ConnectCKeyPressOld = userfunc;
923 if(!KeyPressConnected) {
924 dw_signal_connect(hwnd, DW_SIGNAL_KEY_PRESS, DW_SIGNAL_FUNC(_OnKeyPress), this);
925 KeyPressConnected = true;
926 }
927 }
928 void ConnectKeyPress(int (*userfunc)(Render *, char, int, int, std::string))
872 { 929 {
873 _ConnectKeyPressOld = userfunc; 930 _ConnectKeyPressOld = userfunc;
874 if(!KeyPressConnected) { 931 if(!KeyPressConnected) {
875 dw_signal_connect(hwnd, DW_SIGNAL_KEY_PRESS, DW_SIGNAL_FUNC(_OnKeyPress), this); 932 dw_signal_connect(hwnd, DW_SIGNAL_KEY_PRESS, DW_SIGNAL_FUNC(_OnKeyPress), this);
876 KeyPressConnected = true; 933 KeyPressConnected = true;
1028 } 1085 }
1029 void BitBlt(int xdest, int ydest, int width, int height, Pixmap *src, int xsrc, int ysrc) { 1086 void BitBlt(int xdest, int ydest, int width, int height, Pixmap *src, int xsrc, int ysrc) {
1030 dw_pixmap_bitblt(DW_NOHWND, hpixmap, xdest, ydest, width, height, DW_NOHWND, src ? src->GetHPIXMAP() : DW_NULL, xsrc, ysrc); 1087 dw_pixmap_bitblt(DW_NOHWND, hpixmap, xdest, ydest, width, height, DW_NOHWND, src ? src->GetHPIXMAP() : DW_NULL, xsrc, ysrc);
1031 } 1088 }
1032 int SetFont(const char *fontname) { return dw_pixmap_set_font(hpixmap, fontname); } 1089 int SetFont(const char *fontname) { return dw_pixmap_set_font(hpixmap, fontname); }
1090 int SetFont(std::string fontname) { return dw_pixmap_set_font(hpixmap, fontname.c_str()); }
1033 void GetTextExtents(const char *text, int *width, int *height) { dw_font_text_extents_get(DW_NOHWND, hpixmap, text, width, height); } 1091 void GetTextExtents(const char *text, int *width, int *height) { dw_font_text_extents_get(DW_NOHWND, hpixmap, text, width, height); }
1034 void GetTextExtents(std::string text, int *width, int *height) { dw_font_text_extents_get(DW_NOHWND, hpixmap, text.c_str(), width, height); } 1092 void GetTextExtents(std::string text, int *width, int *height) { dw_font_text_extents_get(DW_NOHWND, hpixmap, text.c_str(), width, height); }
1035 void SetTransparentColor(unsigned long color) { dw_pixmap_set_transparent_color(hpixmap, color); } 1093 void SetTransparentColor(unsigned long color) { dw_pixmap_set_transparent_color(hpixmap, color); }
1036 unsigned long GetWidth() { return pwidth; } 1094 unsigned long GetWidth() { return pwidth; }
1037 unsigned long GetHeight() { return pheight; } 1095 unsigned long GetHeight() { return pheight; }
1052 class HTML : public Widget 1110 class HTML : public Widget
1053 { 1111 {
1054 private: 1112 private:
1055 bool ChangedConnected, ResultConnected; 1113 bool ChangedConnected, ResultConnected;
1056 #ifdef DW_LAMBDA 1114 #ifdef DW_LAMBDA
1057 std::function<int(int, char *)> _ConnectChanged; 1115 std::function<int(int, char *)> _ConnectCChanged;
1058 std::function<int(int, char *, void *)> _ConnectResult; 1116 std::function<int(int, char *, void *)> _ConnectCResult;
1059 #endif 1117 std::function<int(int, std::string)> _ConnectChanged;
1060 int (*_ConnectChangedOld)(HTML *, int status, char *url); 1118 std::function<int(int, std::string, void *)> _ConnectResult;
1061 int (*_ConnectResultOld)(HTML *, int status, char *result, void *scriptdata); 1119 #endif
1120 int (*_ConnectCChangedOld)(HTML *, int status, char *url);
1121 int (*_ConnectCResultOld)(HTML *, int status, char *result, void *scriptdata);
1122 int (*_ConnectChangedOld)(HTML *, int status, std::string url);
1123 int (*_ConnectResultOld)(HTML *, int status, std::string result, void *scriptdata);
1062 void Setup() { 1124 void Setup() {
1063 #ifdef DW_LAMBDA 1125 #ifdef DW_LAMBDA
1126 _ConnectCChanged = 0;
1127 _ConnectCResult = 0;
1064 _ConnectChanged = 0; 1128 _ConnectChanged = 0;
1065 _ConnectResult = 0; 1129 _ConnectResult = 0;
1066 #endif 1130 #endif
1131 _ConnectCChangedOld = 0;
1132 _ConnectCResultOld = 0;
1067 _ConnectChangedOld = 0; 1133 _ConnectChangedOld = 0;
1068 _ConnectResultOld = 0; 1134 _ConnectResultOld = 0;
1069 if(IsOverridden(HTML::OnChanged, this)) { 1135 if(IsOverridden(HTML::OnChanged, this)) {
1070 dw_signal_connect(hwnd, DW_SIGNAL_HTML_CHANGED, DW_SIGNAL_FUNC(_OnChanged), this); 1136 dw_signal_connect(hwnd, DW_SIGNAL_HTML_CHANGED, DW_SIGNAL_FUNC(_OnChanged), this);
1071 ChangedConnected = true; 1137 ChangedConnected = true;
1080 } 1146 }
1081 } 1147 }
1082 static int _OnChanged(HWND window, int status, char *url, void *data) { 1148 static int _OnChanged(HWND window, int status, char *url, void *data) {
1083 HTML *classptr = reinterpret_cast<HTML *>(data); 1149 HTML *classptr = reinterpret_cast<HTML *>(data);
1084 #ifdef DW_LAMBDA 1150 #ifdef DW_LAMBDA
1085 if(classptr->_ConnectChanged) 1151 if(classptr->_ConnectCChanged)
1086 return classptr->_ConnectChanged(status, url); 1152 return classptr->_ConnectCChanged(status, url);
1087 #endif 1153 else if(classptr->_ConnectChanged) {
1088 if(classptr->_ConnectChangedOld) 1154 std::string utf8string = url ? std::string(url) : std::string();
1089 return classptr->_ConnectChangedOld(classptr, status, url); 1155 return classptr->_ConnectChanged(status, utf8string);
1156 }
1157 #endif
1158 if(classptr->_ConnectCChangedOld)
1159 return classptr->_ConnectCChangedOld(classptr, status, url);
1160 else if(classptr->_ConnectChangedOld) {
1161 std::string utf8string = url ? std::string(url) : std::string();
1162 return classptr->_ConnectChangedOld(classptr, status, utf8string);
1163 }
1090 return classptr->OnChanged(status, url); } 1164 return classptr->OnChanged(status, url); }
1091 static int _OnResult(HWND window, int status, char *result, void *scriptdata, void *data) { 1165 static int _OnResult(HWND window, int status, char *result, void *scriptdata, void *data) {
1092 HTML *classptr = reinterpret_cast<HTML *>(data); 1166 HTML *classptr = reinterpret_cast<HTML *>(data);
1093 #ifdef DW_LAMBDA 1167 #ifdef DW_LAMBDA
1094 if(classptr->_ConnectResult) 1168 if(classptr->_ConnectCResult)
1095 return classptr->_ConnectResult(status, result, scriptdata); 1169 return classptr->_ConnectResult(status, result, scriptdata);
1096 #endif 1170 else if(classptr->_ConnectResult) {
1097 if(classptr->_ConnectResultOld) 1171 std::string utf8string = result ? std::string(result) : std::string();
1098 return classptr->_ConnectResultOld(classptr, status, result, scriptdata); 1172 return classptr->_ConnectResult(status, utf8string, scriptdata);
1173 }
1174 #endif
1175 if(classptr->_ConnectCResultOld)
1176 return classptr->_ConnectCResultOld(classptr, status, result, scriptdata);
1177 else if(classptr->_ConnectResultOld) {
1178 std::string utf8string = result ? std::string(result) : std::string();
1179 return classptr->_ConnectResultOld(classptr, status, utf8string, scriptdata);
1180 }
1099 return classptr->OnResult(status, result, scriptdata); } 1181 return classptr->OnResult(status, result, scriptdata); }
1100 public: 1182 public:
1101 // Constructors 1183 // Constructors
1102 HTML(unsigned long id) { SetHWND(dw_html_new(id)); Setup(); } 1184 HTML(unsigned long id) { SetHWND(dw_html_new(id)); Setup(); }
1103 HTML() { SetHWND(dw_html_new(0)); Setup(); } 1185 HTML() { SetHWND(dw_html_new(0)); Setup(); }
1113 int Raw(std::string buffer) { return dw_html_raw(hwnd, buffer.c_str()); } 1195 int Raw(std::string buffer) { return dw_html_raw(hwnd, buffer.c_str()); }
1114 int URL(std::string url) { return dw_html_url(hwnd, url.c_str()); } 1196 int URL(std::string url) { return dw_html_url(hwnd, url.c_str()); }
1115 #ifdef DW_LAMBDA 1197 #ifdef DW_LAMBDA
1116 void ConnectChanged(std::function<int(int, char *)> userfunc) 1198 void ConnectChanged(std::function<int(int, char *)> userfunc)
1117 { 1199 {
1200 _ConnectCChanged = userfunc;
1201 if(!ChangedConnected) {
1202 dw_signal_connect(hwnd, DW_SIGNAL_HTML_CHANGED, DW_SIGNAL_FUNC(_OnChanged), this);
1203 ChangedConnected = true;
1204 }
1205 }
1206 void ConnectChanged(std::function<int(int, std::string)> userfunc)
1207 {
1118 _ConnectChanged = userfunc; 1208 _ConnectChanged = userfunc;
1119 if(!ChangedConnected) { 1209 if(!ChangedConnected) {
1120 dw_signal_connect(hwnd, DW_SIGNAL_HTML_CHANGED, DW_SIGNAL_FUNC(_OnChanged), this); 1210 dw_signal_connect(hwnd, DW_SIGNAL_HTML_CHANGED, DW_SIGNAL_FUNC(_OnChanged), this);
1121 ChangedConnected = true; 1211 ChangedConnected = true;
1122 } 1212 }
1123 } 1213 }
1124 #endif 1214 #endif
1125 void ConnectChanged(int (*userfunc)(HTML *, int, char *)) 1215 void ConnectChanged(int (*userfunc)(HTML *, int, char *))
1216 {
1217 _ConnectCChangedOld = userfunc;
1218 if(!ChangedConnected) {
1219 dw_signal_connect(hwnd, DW_SIGNAL_HTML_CHANGED, DW_SIGNAL_FUNC(_OnChanged), this);
1220 ChangedConnected = true;
1221 }
1222 }
1223 void ConnectChanged(int (*userfunc)(HTML *, int, std::string))
1126 { 1224 {
1127 _ConnectChangedOld = userfunc; 1225 _ConnectChangedOld = userfunc;
1128 if(!ChangedConnected) { 1226 if(!ChangedConnected) {
1129 dw_signal_connect(hwnd, DW_SIGNAL_HTML_CHANGED, DW_SIGNAL_FUNC(_OnChanged), this); 1227 dw_signal_connect(hwnd, DW_SIGNAL_HTML_CHANGED, DW_SIGNAL_FUNC(_OnChanged), this);
1130 ChangedConnected = true; 1228 ChangedConnected = true;
1131 } 1229 }
1132 } 1230 }
1133 #ifdef DW_LAMBDA 1231 #ifdef DW_LAMBDA
1134 void ConnectResult(std::function<int(int, char *, void *)> userfunc) 1232 void ConnectResult(std::function<int(int, char *, void *)> userfunc)
1135 { 1233 {
1234 _ConnectCResult = userfunc;
1235 if(!ResultConnected) {
1236 dw_signal_connect(hwnd, DW_SIGNAL_HTML_RESULT, DW_SIGNAL_FUNC(_OnResult), this);
1237 ResultConnected = true;
1238 }
1239 }
1240 void ConnectResult(std::function<int(int, std::string, void *)> userfunc)
1241 {
1136 _ConnectResult = userfunc; 1242 _ConnectResult = userfunc;
1137 if(!ResultConnected) { 1243 if(!ResultConnected) {
1138 dw_signal_connect(hwnd, DW_SIGNAL_HTML_RESULT, DW_SIGNAL_FUNC(_OnResult), this); 1244 dw_signal_connect(hwnd, DW_SIGNAL_HTML_RESULT, DW_SIGNAL_FUNC(_OnResult), this);
1139 ResultConnected = true; 1245 ResultConnected = true;
1140 } 1246 }
1141 } 1247 }
1142 #endif 1248 #endif
1143 void ConnectResult(int (*userfunc)(HTML *, int, char *, void *)) 1249 void ConnectResult(int (*userfunc)(HTML *, int, char *, void *))
1250 {
1251 _ConnectCResultOld = userfunc;
1252 if(!ResultConnected) {
1253 dw_signal_connect(hwnd, DW_SIGNAL_HTML_RESULT, DW_SIGNAL_FUNC(_OnResult), this);
1254 ResultConnected = true;
1255 }
1256 }
1257 void ConnectResult(int (*userfunc)(HTML *, int, std::string, void *))
1144 { 1258 {
1145 _ConnectResultOld = userfunc; 1259 _ConnectResultOld = userfunc;
1146 if(!ResultConnected) { 1260 if(!ResultConnected) {
1147 dw_signal_connect(hwnd, DW_SIGNAL_HTML_RESULT, DW_SIGNAL_FUNC(_OnResult), this); 1261 dw_signal_connect(hwnd, DW_SIGNAL_HTML_RESULT, DW_SIGNAL_FUNC(_OnResult), this);
1148 ResultConnected = true; 1262 ResultConnected = true;
1224 void Delete(int index) { dw_listbox_delete(hwnd, index); } 1338 void Delete(int index) { dw_listbox_delete(hwnd, index); }
1225 void GetListText(unsigned int index, char *buffer, unsigned int length) { dw_listbox_get_text(hwnd, index, buffer, length); } 1339 void GetListText(unsigned int index, char *buffer, unsigned int length) { dw_listbox_get_text(hwnd, index, buffer, length); }
1226 void SetListText(unsigned int index, char *buffer) { dw_listbox_set_text(hwnd, index, buffer); } 1340 void SetListText(unsigned int index, char *buffer) { dw_listbox_set_text(hwnd, index, buffer); }
1227 void SetListText(unsigned int index, std::string buffer) { dw_listbox_set_text(hwnd, index, buffer.c_str()); } 1341 void SetListText(unsigned int index, std::string buffer) { dw_listbox_set_text(hwnd, index, buffer.c_str()); }
1228 void Insert(const char *text, int pos) { dw_listbox_insert(hwnd, text, pos); } 1342 void Insert(const char *text, int pos) { dw_listbox_insert(hwnd, text, pos); }
1343 void Insert(std::string text, int pos) { dw_listbox_insert(hwnd, text.c_str(), pos); }
1229 void ListAppend(char **text, int count) { dw_listbox_list_append(hwnd, text, count); } 1344 void ListAppend(char **text, int count) { dw_listbox_list_append(hwnd, text, count); }
1230 void Select(int index, int state) { dw_listbox_select(hwnd, index, state); } 1345 void Select(int index, int state) { dw_listbox_select(hwnd, index, state); }
1231 int Selected() { return dw_listbox_selected(hwnd); } 1346 int Selected() { return dw_listbox_selected(hwnd); }
1232 int Selected(int where) { return dw_listbox_selected_multi(hwnd, where); } 1347 int Selected(int where) { return dw_listbox_selected_multi(hwnd, where); }
1233 void SetTop(int top) { dw_listbox_set_top(hwnd, top); } 1348 void SetTop(int top) { dw_listbox_set_top(hwnd, top); }
1427 void SetCursor(int point) { dw_mle_set_cursor(hwnd, point); } 1542 void SetCursor(int point) { dw_mle_set_cursor(hwnd, point); }
1428 void SetEditable(int state) { dw_mle_set_editable(hwnd, state); } 1543 void SetEditable(int state) { dw_mle_set_editable(hwnd, state); }
1429 void SetVisible(int line) { dw_mle_set_visible(hwnd, line); } 1544 void SetVisible(int line) { dw_mle_set_visible(hwnd, line); }
1430 void SetWordWrap(int state) { dw_mle_set_word_wrap(hwnd, state); } 1545 void SetWordWrap(int state) { dw_mle_set_word_wrap(hwnd, state); }
1431 int SetFont(const char *font) { return dw_window_set_font(hwnd, font); } 1546 int SetFont(const char *font) { return dw_window_set_font(hwnd, font); }
1432 char *GetFont() { return dw_window_get_font(hwnd); } 1547 int SetFont(std::string font) { return dw_window_set_font(hwnd, font.c_str()); }
1548 char *GetCFont() { return dw_window_get_font(hwnd); }
1549 std::string GetFont() {
1550 char *retval = dw_window_get_font(hwnd);
1551 _dw_string_free_return(retval);
1552 }
1433 }; 1553 };
1434 1554
1435 class Notebook : public Widget 1555 class Notebook : public Widget
1436 { 1556 {
1437 private: 1557 private:
1511 class ObjectView : virtual public Widget 1631 class ObjectView : virtual public Widget
1512 { 1632 {
1513 private: 1633 private:
1514 bool ItemSelectConnected, ItemContextConnected; 1634 bool ItemSelectConnected, ItemContextConnected;
1515 #ifdef DW_LAMBDA 1635 #ifdef DW_LAMBDA
1516 std::function<int(HTREEITEM, char *, void *)> _ConnectItemSelect; 1636 std::function<int(HTREEITEM, char *, void *)> _ConnectCItemSelect;
1517 std::function<int(char *, int, int, void *)> _ConnectItemContext; 1637 std::function<int(char *, int, int, void *)> _ConnectCItemContext;
1518 #endif 1638 std::function<int(HTREEITEM, std::string, void *)> _ConnectItemSelect;
1519 int (*_ConnectItemSelectOld)(ObjectView *, HTREEITEM, char *, void *); 1639 std::function<int(std::string, int, int, void *)> _ConnectItemContext;
1520 int (*_ConnectItemContextOld)(ObjectView *, char *, int, int, void *); 1640 #endif
1641 int (*_ConnectCItemSelectOld)(ObjectView *, HTREEITEM, char *, void *);
1642 int (*_ConnectCItemContextOld)(ObjectView *, char *, int, int, void *);
1643 int (*_ConnectItemSelectOld)(ObjectView *, HTREEITEM, std::string, void *);
1644 int (*_ConnectItemContextOld)(ObjectView *, std::string, int, int, void *);
1521 static int _OnItemSelect(HWND window, HTREEITEM item, char *text, void *data, void *itemdata) { 1645 static int _OnItemSelect(HWND window, HTREEITEM item, char *text, void *data, void *itemdata) {
1522 ObjectView *classptr = reinterpret_cast<ObjectView *>(data); 1646 ObjectView *classptr = reinterpret_cast<ObjectView *>(data);
1523 #ifdef DW_LAMBDA 1647 #ifdef DW_LAMBDA
1524 if(classptr->_ConnectItemSelect) 1648 if(classptr->_ConnectCItemSelect)
1525 return classptr->_ConnectItemSelect(item, text, itemdata); 1649 return classptr->_ConnectCItemSelect(item, text, itemdata);
1650 else if(classptr->_ConnectItemSelect) {
1651 std::string utf8string = text ? std::string(text) : std::string();
1652 return classptr->_ConnectItemSelect(item, utf8string, itemdata);
1653 }
1526 #endif 1654 #endif
1527 if(classptr->_ConnectItemSelectOld) 1655 if(classptr->_ConnectItemSelectOld)
1528 return classptr->_ConnectItemSelectOld(classptr, item, text, itemdata); 1656 return classptr->_ConnectItemSelectOld(classptr, item, text, itemdata);
1657 else if(classptr->_ConnectItemSelectOld) {
1658 std::string utf8string = text ? std::string(text) : std::string();
1659 return classptr->_ConnectItemSelectOld(classptr, item, utf8string, itemdata);
1660 }
1529 return classptr->OnItemSelect(item, text, itemdata); 1661 return classptr->OnItemSelect(item, text, itemdata);
1530 } 1662 }
1531 static int _OnItemContext(HWND window, char *text, int x, int y, void *data, void *itemdata) { 1663 static int _OnItemContext(HWND window, char *text, int x, int y, void *data, void *itemdata) {
1532 ObjectView *classptr = reinterpret_cast<ObjectView *>(data); 1664 ObjectView *classptr = reinterpret_cast<ObjectView *>(data);
1533 #ifdef DW_LAMBDA 1665 #ifdef DW_LAMBDA
1534 if(classptr->_ConnectItemContext) 1666 if(classptr->_ConnectCItemContext)
1535 return classptr->_ConnectItemContext(text, x, y, itemdata); 1667 return classptr->_ConnectCItemContext(text, x, y, itemdata);
1536 #endif 1668 else if(classptr->_ConnectItemContext) {
1537 if(classptr->_ConnectItemContextOld) 1669 std::string utf8string = text ? std::string(text) : std::string();
1538 return classptr->_ConnectItemContextOld(classptr, text, x, y, itemdata); 1670 return classptr->_ConnectItemContext(utf8string, x, y, itemdata);
1671 }
1672 #endif
1673 if(classptr->_ConnectCItemContextOld)
1674 return classptr->_ConnectCItemContextOld(classptr, text, x, y, itemdata);
1675 else if(classptr->_ConnectItemContextOld) {
1676 std::string utf8string = text ? std::string(text) : std::string();
1677 return classptr->_ConnectItemContextOld(classptr, utf8string, x, y, itemdata);
1678 }
1539 return classptr->OnItemContext(text, x, y, itemdata); 1679 return classptr->OnItemContext(text, x, y, itemdata);
1540 } 1680 }
1541 protected: 1681 protected:
1542 void SetupObjectView() { 1682 void SetupObjectView() {
1543 #ifdef DW_LAMBDA 1683 #ifdef DW_LAMBDA
1684 _ConnectCItemSelect = 0;
1685 _ConnectCItemContext = 0;
1544 _ConnectItemSelect = 0; 1686 _ConnectItemSelect = 0;
1545 _ConnectItemContext = 0; 1687 _ConnectItemContext = 0;
1546 #endif 1688 #endif
1689 _ConnectCItemSelectOld = 0;
1690 _ConnectCItemContextOld = 0;
1547 _ConnectItemSelectOld = 0; 1691 _ConnectItemSelectOld = 0;
1548 _ConnectItemContextOld = 0; 1692 _ConnectItemContextOld = 0;
1549 if(IsOverridden(ObjectView::OnItemSelect, this)) { 1693 if(IsOverridden(ObjectView::OnItemSelect, this)) {
1550 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this); 1694 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this);
1551 ItemSelectConnected = true; 1695 ItemSelectConnected = true;
1573 } 1717 }
1574 public: 1718 public:
1575 #ifdef DW_LAMBDA 1719 #ifdef DW_LAMBDA
1576 void ConnectItemSelect(std::function<int(HTREEITEM, char *, void *)> userfunc) 1720 void ConnectItemSelect(std::function<int(HTREEITEM, char *, void *)> userfunc)
1577 { 1721 {
1722 _ConnectCItemSelect = userfunc;
1723 if(!ItemSelectConnected) {
1724 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this);
1725 ItemSelectConnected = true;
1726 }
1727 }
1728 void ConnectItemSelect(std::function<int(HTREEITEM, std::string, void *)> userfunc)
1729 {
1578 _ConnectItemSelect = userfunc; 1730 _ConnectItemSelect = userfunc;
1579 if(!ItemSelectConnected) { 1731 if(!ItemSelectConnected) {
1580 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this); 1732 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this);
1581 ItemSelectConnected = true; 1733 ItemSelectConnected = true;
1582 } 1734 }
1583 } 1735 }
1584 #endif 1736 #endif
1585 void ConnectItemSelect(int (*userfunc)(ObjectView *, HTREEITEM, char *, void *)) 1737 void ConnectItemSelect(int (*userfunc)(ObjectView *, HTREEITEM, char *, void *))
1586 { 1738 {
1739 _ConnectCItemSelectOld = userfunc;
1740 if(!ItemSelectConnected) {
1741 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this);
1742 ItemSelectConnected = true;
1743 }
1744 }
1745 void ConnectItemSelect(int (*userfunc)(ObjectView *, HTREEITEM, std::string, void *))
1746 {
1587 _ConnectItemSelectOld = userfunc; 1747 _ConnectItemSelectOld = userfunc;
1588 if(!ItemSelectConnected) { 1748 if(!ItemSelectConnected) {
1589 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this); 1749 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_SELECT, DW_SIGNAL_FUNC(_OnItemSelect), this);
1590 ItemSelectConnected = true; 1750 ItemSelectConnected = true;
1591 } 1751 }
1592 } 1752 }
1593 #ifdef DW_LAMBDA 1753 #ifdef DW_LAMBDA
1594 void ConnectItemContext(std::function<int(char *, int, int, void *)> userfunc) 1754 void ConnectItemContext(std::function<int(char *, int, int, void *)> userfunc)
1595 { 1755 {
1756 _ConnectCItemContext = userfunc;
1757 if(!ItemContextConnected) {
1758 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_CONTEXT, DW_SIGNAL_FUNC(_OnItemContext), this);
1759 ItemContextConnected = true;
1760 }
1761 }
1762 void ConnectItemContext(std::function<int(std::string, int, int, void *)> userfunc)
1763 {
1596 _ConnectItemContext = userfunc; 1764 _ConnectItemContext = userfunc;
1597 if(!ItemContextConnected) { 1765 if(!ItemContextConnected) {
1598 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_CONTEXT, DW_SIGNAL_FUNC(_OnItemContext), this); 1766 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_CONTEXT, DW_SIGNAL_FUNC(_OnItemContext), this);
1599 ItemContextConnected = true; 1767 ItemContextConnected = true;
1600 } 1768 }
1601 } 1769 }
1602 #endif 1770 #endif
1603 void ConnectItemContext(int (*userfunc)(ObjectView *, char *, int, int, void *)) 1771 void ConnectItemContext(int (*userfunc)(ObjectView *, char *, int, int, void *))
1604 { 1772 {
1773 _ConnectCItemContextOld = userfunc;
1774 if(!ItemContextConnected) {
1775 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_CONTEXT, DW_SIGNAL_FUNC(_OnItemContext), this);
1776 ItemContextConnected = true;
1777 }
1778 }
1779 void ConnectItemContext(int (*userfunc)(ObjectView *, std::string, int, int, void *))
1780 {
1605 _ConnectItemContextOld = userfunc; 1781 _ConnectItemContextOld = userfunc;
1606 if(!ItemContextConnected) { 1782 if(!ItemContextConnected) {
1607 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_CONTEXT, DW_SIGNAL_FUNC(_OnItemContext), this); 1783 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_CONTEXT, DW_SIGNAL_FUNC(_OnItemContext), this);
1608 ItemContextConnected = true; 1784 ItemContextConnected = true;
1609 } 1785 }
1613 class Containers : virtual public Focusable, virtual public ObjectView 1789 class Containers : virtual public Focusable, virtual public ObjectView
1614 { 1790 {
1615 private: 1791 private:
1616 bool ItemEnterConnected, ColumnClickConnected; 1792 bool ItemEnterConnected, ColumnClickConnected;
1617 #ifdef DW_LAMBDA 1793 #ifdef DW_LAMBDA
1618 std::function<int(char *, void *)> _ConnectItemEnter; 1794 std::function<int(char *, void *)> _ConnectCItemEnter;
1795 std::function<int(std::string, void *)> _ConnectItemEnter;
1619 std::function<int(int)> _ConnectColumnClick; 1796 std::function<int(int)> _ConnectColumnClick;
1620 #endif 1797 #endif
1621 int (*_ConnectItemEnterOld)(Containers *, char *, void *); 1798 int (*_ConnectCItemEnterOld)(Containers *, char *, void *);
1799 int (*_ConnectItemEnterOld)(Containers *, std::string, void *);
1622 int (*_ConnectColumnClickOld)(Containers *, int); 1800 int (*_ConnectColumnClickOld)(Containers *, int);
1623 static int _OnItemEnter(HWND window, char *text, void *data, void *itemdata) { 1801 static int _OnItemEnter(HWND window, char *text, void *data, void *itemdata) {
1624 Containers *classptr = reinterpret_cast<Containers *>(data); 1802 Containers *classptr = reinterpret_cast<Containers *>(data);
1625 #ifdef DW_LAMBDA 1803 #ifdef DW_LAMBDA
1626 if(classptr->_ConnectItemEnter) 1804 if(classptr->_ConnectCItemEnter)
1627 return classptr->_ConnectItemEnter(text, itemdata); 1805 return classptr->_ConnectCItemEnter(text, itemdata);
1628 #endif 1806 else if(classptr->_ConnectItemEnter) {
1629 if(classptr->_ConnectItemEnterOld) 1807 std::string utf8string = text ? std::string(text) : std::string();
1630 return classptr->_ConnectItemEnterOld(classptr, text, itemdata); 1808 return classptr->_ConnectItemEnter(utf8string, itemdata);
1809 }
1810 #endif
1811 if(classptr->_ConnectCItemEnterOld)
1812 return classptr->_ConnectCItemEnterOld(classptr, text, itemdata);
1813 else if(classptr->_ConnectItemEnterOld) {
1814 std::string utf8string = text ? std::string(text) : std::string();
1815 return classptr->_ConnectItemEnterOld(classptr, utf8string, itemdata);
1816 }
1631 return classptr->OnItemEnter(text, itemdata); 1817 return classptr->OnItemEnter(text, itemdata);
1632 } 1818 }
1633 static int _OnColumnClick(HWND window, int column, void *data) { 1819 static int _OnColumnClick(HWND window, int column, void *data) {
1634 Containers *classptr = reinterpret_cast<Containers *>(data); 1820 Containers *classptr = reinterpret_cast<Containers *>(data);
1635 #ifdef DW_LAMBDA 1821 #ifdef DW_LAMBDA
1643 protected: 1829 protected:
1644 void *allocpointer; 1830 void *allocpointer;
1645 int allocrowcount; 1831 int allocrowcount;
1646 void SetupContainer() { 1832 void SetupContainer() {
1647 #ifdef DW_LAMBDA 1833 #ifdef DW_LAMBDA
1834 _ConnectCItemEnter = 0;
1648 _ConnectItemEnter = 0; 1835 _ConnectItemEnter = 0;
1649 _ConnectColumnClick = 0; 1836 _ConnectColumnClick = 0;
1650 #endif 1837 #endif
1651 _ConnectItemEnterOld = 0; 1838 _ConnectItemEnterOld = 0;
1839 _ConnectCItemEnterOld = 0;
1652 _ConnectColumnClickOld = 0; 1840 _ConnectColumnClickOld = 0;
1653 if(IsOverridden(Container::OnItemEnter, this)) { 1841 if(IsOverridden(Container::OnItemEnter, this)) {
1654 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this); 1842 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this);
1655 ItemEnterConnected = true; 1843 ItemEnterConnected = true;
1656 } else { 1844 } else {
1700 void SetRowTitle(int row, const std::string title) { dw_container_set_row_title(allocpointer, row, title.c_str()); } 1888 void SetRowTitle(int row, const std::string title) { dw_container_set_row_title(allocpointer, row, title.c_str()); }
1701 void SetStripe(unsigned long oddcolor, unsigned long evencolor) { dw_container_set_stripe(hwnd, oddcolor, evencolor); } 1889 void SetStripe(unsigned long oddcolor, unsigned long evencolor) { dw_container_set_stripe(hwnd, oddcolor, evencolor); }
1702 #ifdef DW_LAMBDA 1890 #ifdef DW_LAMBDA
1703 void ConnectItemEnter(std::function<int(char *, void *)> userfunc) 1891 void ConnectItemEnter(std::function<int(char *, void *)> userfunc)
1704 { 1892 {
1893 _ConnectCItemEnter = userfunc;
1894 if(!ItemEnterConnected) {
1895 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this);
1896 ItemEnterConnected = true;
1897 }
1898 }
1899 void ConnectItemEnter(std::function<int(std::string, void *)> userfunc)
1900 {
1705 _ConnectItemEnter = userfunc; 1901 _ConnectItemEnter = userfunc;
1706 if(!ItemEnterConnected) { 1902 if(!ItemEnterConnected) {
1707 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this); 1903 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this);
1708 ItemEnterConnected = true; 1904 ItemEnterConnected = true;
1709 } 1905 }
1710 } 1906 }
1711 #endif 1907 #endif
1712 void ConnectItemEnter(int (*userfunc)(Containers *, char *, void *)) 1908 void ConnectItemEnter(int (*userfunc)(Containers *, char *, void *))
1909 {
1910 _ConnectCItemEnterOld = userfunc;
1911 if(!ItemEnterConnected) {
1912 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this);
1913 ItemEnterConnected = true;
1914 }
1915 }
1916 void ConnectItemEnter(int (*userfunc)(Containers *, std::string, void *))
1713 { 1917 {
1714 _ConnectItemEnterOld = userfunc; 1918 _ConnectItemEnterOld = userfunc;
1715 if(!ItemEnterConnected) { 1919 if(!ItemEnterConnected) {
1716 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this); 1920 dw_signal_connect(hwnd, DW_SIGNAL_ITEM_ENTER, DW_SIGNAL_FUNC(_OnItemEnter), this);
1717 ItemEnterConnected = true; 1921 ItemEnterConnected = true;
1769 int retval = dw_filesystem_setup(hwnd, flags, (char **)titles, count); 1973 int retval = dw_filesystem_setup(hwnd, flags, (char **)titles, count);
1770 SetupObjectView(); SetupContainer(); 1974 SetupObjectView(); SetupContainer();
1771 return retval; 1975 return retval;
1772 } 1976 }
1773 void ChangeFile(int row, const char *filename, HICN icon) { dw_filesystem_change_file(hwnd, row, filename, icon); } 1977 void ChangeFile(int row, const char *filename, HICN icon) { dw_filesystem_change_file(hwnd, row, filename, icon); }
1978 void ChangeFile(int row, std::string filename, HICN icon) { dw_filesystem_change_file(hwnd, row, filename.c_str(), icon); }
1774 void ChangeItem(int column, int row, void *data) { dw_filesystem_change_item(hwnd, column, row, data); } 1979 void ChangeItem(int column, int row, void *data) { dw_filesystem_change_item(hwnd, column, row, data); }
1775 int GetColumnType(int column) { return dw_filesystem_get_column_type(hwnd, column); } 1980 int GetColumnType(int column) { return dw_filesystem_get_column_type(hwnd, column); }
1776 void SetColumnTitle(const char *title) { dw_filesystem_set_column_title(hwnd, title); } 1981 void SetColumnTitle(const char *title) { dw_filesystem_set_column_title(hwnd, title); }
1777 void SetColumnTitle(std::string title) { dw_filesystem_set_column_title(hwnd, title.c_str()); } 1982 void SetColumnTitle(std::string title) { dw_filesystem_set_column_title(hwnd, title.c_str()); }
1778 void SetFile(int row, const char *filename, HICN icon) { dw_filesystem_set_file(hwnd, allocpointer, row, filename, icon); } 1983 void SetFile(int row, const char *filename, HICN icon) { dw_filesystem_set_file(hwnd, allocpointer, row, filename, icon); }
1984 void SetFile(int row, std::string filename, HICN icon) { dw_filesystem_set_file(hwnd, allocpointer, row, filename.c_str(), icon); }
1779 void SetItem(int column, int row, void *data) { dw_filesystem_set_item(hwnd, allocpointer, column, row, data); } 1985 void SetItem(int column, int row, void *data) { dw_filesystem_set_item(hwnd, allocpointer, column, row, data); }
1780 }; 1986 };
1781 1987
1782 class Tree : virtual public Focusable, virtual public ObjectView 1988 class Tree : virtual public Focusable, virtual public ObjectView
1783 { 1989 {
1823 Tree() { SetHWND(dw_tree_new(0)); SetupObjectView(); SetupTree(); } 2029 Tree() { SetHWND(dw_tree_new(0)); SetupObjectView(); SetupTree(); }
1824 2030
1825 // User functions 2031 // User functions
1826 void Clear() { dw_tree_clear(hwnd); } 2032 void Clear() { dw_tree_clear(hwnd); }
1827 HTREEITEM GetParent(HTREEITEM item) { return dw_tree_get_parent(hwnd, item); } 2033 HTREEITEM GetParent(HTREEITEM item) { return dw_tree_get_parent(hwnd, item); }
1828 char *GetTitle(HTREEITEM item) { return dw_tree_get_title(hwnd, item); } 2034 char *GetCTitle(HTREEITEM item) { return dw_tree_get_title(hwnd, item); }
2035 std::string GetTitle(HTREEITEM item) {
2036 char *retval = dw_tree_get_title(hwnd, item);
2037 _dw_string_free_return(retval);
2038 }
1829 HTREEITEM Insert(const char *title, HICN icon, HTREEITEM parent, void *itemdata) { return dw_tree_insert(hwnd, title, icon, parent, itemdata); } 2039 HTREEITEM Insert(const char *title, HICN icon, HTREEITEM parent, void *itemdata) { return dw_tree_insert(hwnd, title, icon, parent, itemdata); }
1830 HTREEITEM Insert(const char *title, HICN icon, HTREEITEM parent) { return dw_tree_insert(hwnd, title, icon, parent, NULL); } 2040 HTREEITEM Insert(const char *title, HICN icon, HTREEITEM parent) { return dw_tree_insert(hwnd, title, icon, parent, NULL); }
1831 HTREEITEM Insert(const char *title, HICN icon) { return dw_tree_insert(hwnd, title, icon, 0, NULL); } 2041 HTREEITEM Insert(const char *title, HICN icon) { return dw_tree_insert(hwnd, title, icon, 0, NULL); }
1832 HTREEITEM InsertAfter(const char *title, HTREEITEM item, HICN icon, HTREEITEM parent, void *itemdata) { return dw_tree_insert_after(hwnd, item, title, icon, parent, itemdata); } 2042 HTREEITEM InsertAfter(const char *title, HTREEITEM item, HICN icon, HTREEITEM parent, void *itemdata) { return dw_tree_insert_after(hwnd, item, title, icon, parent, itemdata); }
1833 HTREEITEM InsertAfter(const char *title, HTREEITEM item, HICN icon, HTREEITEM parent) { return dw_tree_insert_after(hwnd, item, title, icon, parent, NULL); } 2043 HTREEITEM InsertAfter(const char *title, HTREEITEM item, HICN icon, HTREEITEM parent) { return dw_tree_insert_after(hwnd, item, title, icon, parent, NULL); }
1927 named = dw_named_event_new(name); 2137 named = dw_named_event_new(name);
1928 } 2138 }
1929 event = 0; 2139 event = 0;
1930 SetHandle(reinterpret_cast<void *>(named)); 2140 SetHandle(reinterpret_cast<void *>(named));
1931 } 2141 }
2142 Event(std::string name) {
2143 // Try to attach to an existing event
2144 named = dw_named_event_get(name.c_str());
2145 if(!named) {
2146 // Otherwise try to create a new one
2147 named = dw_named_event_new(name.c_str());
2148 }
2149 event = 0;
2150 SetHandle(reinterpret_cast<void *>(named));
2151 }
1932 // Destructor 2152 // Destructor
1933 virtual ~Event() { if(event) { dw_event_close(&event); } if(named) { dw_named_event_close(named); } } 2153 virtual ~Event() { if(event) { dw_event_close(&event); } if(named) { dw_named_event_close(named); } }
1934 2154
1935 // User functions 2155 // User functions
1936 int Close() { 2156 int Close() {
2059 print = dw_print_new(jobname, flags, pages, DW_SIGNAL_FUNC(_OnDrawPage), this); 2279 print = dw_print_new(jobname, flags, pages, DW_SIGNAL_FUNC(_OnDrawPage), this);
2060 SetHandle(reinterpret_cast<void *>(print)); 2280 SetHandle(reinterpret_cast<void *>(print));
2061 _ConnectDrawPage = userfunc; 2281 _ConnectDrawPage = userfunc;
2062 _ConnectDrawPageOld = 0; 2282 _ConnectDrawPageOld = 0;
2063 } 2283 }
2284 Print(std::string jobname, unsigned long flags, unsigned int pages, std::function<int(Pixmap *, int)> userfunc) {
2285 print = dw_print_new(jobname.c_str(), flags, pages, DW_SIGNAL_FUNC(_OnDrawPage), this);
2286 SetHandle(reinterpret_cast<void *>(print));
2287 _ConnectDrawPage = userfunc;
2288 _ConnectDrawPageOld = 0;
2289 }
2064 #endif 2290 #endif
2065 Print(const char *jobname, unsigned long flags, unsigned int pages, int (*userfunc)(Print *, Pixmap *, int)) { 2291 Print(const char *jobname, unsigned long flags, unsigned int pages, int (*userfunc)(Print *, Pixmap *, int)) {
2066 print = dw_print_new(jobname, flags, pages, DW_SIGNAL_FUNC(_OnDrawPage), this); 2292 print = dw_print_new(jobname, flags, pages, DW_SIGNAL_FUNC(_OnDrawPage), this);
2293 SetHandle(reinterpret_cast<void *>(print));
2294 _ConnectDrawPageOld = userfunc;
2295 #ifdef DW_LAMBDA
2296 _ConnectDrawPage = 0;
2297 #endif
2298 }
2299 Print(std::string jobname, unsigned long flags, unsigned int pages, int (*userfunc)(Print *, Pixmap *, int)) {
2300 print = dw_print_new(jobname.c_str(), flags, pages, DW_SIGNAL_FUNC(_OnDrawPage), this);
2067 SetHandle(reinterpret_cast<void *>(print)); 2301 SetHandle(reinterpret_cast<void *>(print));
2068 _ConnectDrawPageOld = userfunc; 2302 _ConnectDrawPageOld = userfunc;
2069 #ifdef DW_LAMBDA 2303 #ifdef DW_LAMBDA
2070 _ConnectDrawPage = 0; 2304 _ConnectDrawPage = 0;
2071 #endif 2305 #endif
2113 } 2347 }
2114 public: 2348 public:
2115 // Constructors 2349 // Constructors
2116 #ifdef DW_LAMBDA 2350 #ifdef DW_LAMBDA
2117 Thread(std::function<void(Thread *)> userfunc) { 2351 Thread(std::function<void(Thread *)> userfunc) {
2118 tid = dw_thread_new(DW_SIGNAL_FUNC(_OnThread), this, THREAD_STACK); 2352 tid = dw_thread_new(DW_SIGNAL_FUNC(_OnThread), this, _DW_THREAD_STACK);
2119 SetHandle(reinterpret_cast<void *>(tid)); 2353 SetHandle(reinterpret_cast<void *>(tid));
2120 _ConnectThread = userfunc; 2354 _ConnectThread = userfunc;
2121 _ConnectThreadOld = 0; 2355 _ConnectThreadOld = 0;
2122 } 2356 }
2123 Thread(std::function<void(Thread *)> userfunc, int stack) { 2357 Thread(std::function<void(Thread *)> userfunc, int stack) {
2126 _ConnectThread = userfunc; 2360 _ConnectThread = userfunc;
2127 _ConnectThreadOld = 0; 2361 _ConnectThreadOld = 0;
2128 } 2362 }
2129 #endif 2363 #endif
2130 Thread(void (*userfunc)(Thread *)) { 2364 Thread(void (*userfunc)(Thread *)) {
2131 tid = dw_thread_new(DW_SIGNAL_FUNC(_OnThread), this, THREAD_STACK); 2365 tid = dw_thread_new(DW_SIGNAL_FUNC(_OnThread), this, _DW_THREAD_STACK);
2132 SetHandle(reinterpret_cast<void *>(tid)); 2366 SetHandle(reinterpret_cast<void *>(tid));
2133 _ConnectThreadOld = userfunc; 2367 _ConnectThreadOld = userfunc;
2134 #ifdef DW_LAMBDA 2368 #ifdef DW_LAMBDA
2135 _ConnectThread = 0; 2369 _ConnectThread = 0;
2136 #endif 2370 #endif
2150 #ifdef DW_LAMBDA 2384 #ifdef DW_LAMBDA
2151 _ConnectThread = 0; 2385 _ConnectThread = 0;
2152 #endif 2386 #endif
2153 } 2387 }
2154 Thread() { 2388 Thread() {
2155 tid = dw_thread_new(DW_SIGNAL_FUNC(_OnThread), this, THREAD_STACK); 2389 tid = dw_thread_new(DW_SIGNAL_FUNC(_OnThread), this, _DW_THREAD_STACK);
2156 SetHandle(reinterpret_cast<void *>(tid)); 2390 SetHandle(reinterpret_cast<void *>(tid));
2157 _ConnectThreadOld = 0; 2391 _ConnectThreadOld = 0;
2158 #ifdef DW_LAMBDA 2392 #ifdef DW_LAMBDA
2159 _ConnectThread = 0; 2393 _ConnectThread = 0;
2160 #endif 2394 #endif
2242 va_start(args, format); 2476 va_start(args, format);
2243 dw_vdebug(cformat, args); 2477 dw_vdebug(cformat, args);
2244 va_end(args); 2478 va_end(args);
2245 } 2479 }
2246 void Beep(int freq, int dur) { dw_beep(freq, dur); } 2480 void Beep(int freq, int dur) { dw_beep(freq, dur); }
2247 char *GetDir() { return dw_app_dir(); } 2481 char *GetCDir() { return dw_app_dir(); }
2482 std::string GetDir() {
2483 char *retval = dw_app_dir();
2484 return std::string(retval);
2485 }
2248 void GetEnvironment(DWEnv *env) { dw_environment_query(env); } 2486 void GetEnvironment(DWEnv *env) { dw_environment_query(env); }
2249 int GetScreenWidth() { return dw_screen_width(); } 2487 int GetScreenWidth() { return dw_screen_width(); }
2250 int GetScreenHeight() { return dw_screen_height(); } 2488 int GetScreenHeight() { return dw_screen_height(); }
2251 void GetPointerPos(long *x, long *y) { dw_pointer_query_pos(x, y); } 2489 void GetPointerPos(long *x, long *y) { dw_pointer_query_pos(x, y); }
2252 unsigned long GetColorDepth() { return dw_color_depth_get(); } 2490 unsigned long GetColorDepth() { return dw_color_depth_get(); }
2253 char *GetClipboard() { return dw_clipboard_get_text(); } 2491 char *GetCClipboard() { return dw_clipboard_get_text(); }
2492 std::string GetClipboard() {
2493 char *retval = dw_clipboard_get_text();
2494 _dw_string_free_return(retval);
2495 }
2254 void SetClipboard(const char *text) { if(text) dw_clipboard_set_text(text, (int)strlen(text)); } 2496 void SetClipboard(const char *text) { if(text) dw_clipboard_set_text(text, (int)strlen(text)); }
2255 void SetClipboard(const char *text, int len) { if(text) dw_clipboard_set_text(text, len); } 2497 void SetClipboard(const char *text, int len) { if(text) dw_clipboard_set_text(text, len); }
2256 void SetClipboard(std::string text) { dw_clipboard_set_text(text.c_str(), (int)strlen(text.c_str())); } 2498 void SetClipboard(std::string text) { dw_clipboard_set_text(text.c_str(), (int)strlen(text.c_str())); }
2257 void SetClipboard(std::string text, int len) { dw_clipboard_set_text(text.c_str(), len); } 2499 void SetClipboard(std::string text, int len) { dw_clipboard_set_text(text.c_str(), len); }
2258 void SetDefaultFont(const char *fontname) { dw_font_set_default(fontname); } 2500 void SetDefaultFont(const char *fontname) { dw_font_set_default(fontname); }