GUI.c (7067B)
1 #include <EGong/Interfaces/GUI.h> 2 #include <EGong/Util/Config_Compiletime.h> 3 #ifdef USE_GTK 4 #include <EGong/Interfaces/GTK.h> 5 #endif 6 #ifdef USE_WINGUI 7 #include <EGong/Interfaces/Windows.h> 8 #include <winuser.h> 9 #endif 10 #include <EGong/Util/Log.h> 11 #include <stdlib.h> 12 13 14 struct EGong_GUI_item EGong_GUI_systray_sendmsgfield={.type=EGONG_GUI_TEXT, .extra=(void *)20, .text=NULL, .tooltip=GUIT("Nachricht eingeben"), .child=NULL}; 15 struct EGong_GUI_item EGong_GUI_newmessage={.type=EGONG_GUI_WINDOW, .extra=(void *)10, .text=GUIT("Nachricht senden"), .tooltip=NULL, .child=EGUI_ARR{ 16 EGUI_EL{.type=EGONG_GUI_HBOX, .extra=(void *)15, .text=NULL, .tooltip=NULL, .child=EGUI_ARR{ 17 EGUI_ELX(EGong_GUI_systray_sendmsgfield), 18 EGUI_EL{.type=EGONG_GUI_BUTTON, .text=GUIT("Senden"), .tooltip=GUIT("Nachricht Senden"), .child=NULL, .events=EEV_ARR{ 19 EEV_EL{.command={.type={.type=EGONG_COMMAND_FUNC_POINTER, .args=1}, .pointer=&EGong_GUI_event_hide}, .sources=EES_ARR{ 20 EES_EL{.type=EGONG_GUI_EVSRC_ELEMENT, .data=&EGong_GUI_newmessage}, 21 EES_FIN 22 }}, 23 EEV_EL{.command={.type={.type=EGONG_COMMAND_FUNC_STRING, .args=1}, .pointer=&EGong_cnc_sendmessage_broad}, .sources=EES_ARR{ 24 EES_EL{.type=EGONG_GUI_EVSRC_ELEMENT, .data=&EGong_GUI_systray_sendmsgfield}, 25 EES_FIN 26 }}, 27 EEV_FIN 28 }}, 29 EGUI_EL{.type=EGONG_GUI_TOGGLE_BUTTON, .extra=NULL, .text=GUIT("Test"), .tooltip=GUIT("Testen"), .child=NULL, .events=EEV_ARR{ 30 EEV_EL{.command={.type={.type=EGONG_COMMAND_BIT_SET, .args=2}, .pointer=&EGong_global_configuration.gui.destinations}, .sources=EES_ARR{ 31 EES_EL{.type=EGONG_GUI_EVSRC_STATIC, .data=(void *)(unsigned int)EGONG_CONFIG_GUI_DEST_WINDOW}, 32 EES_EL{.type=EGONG_GUI_EVSRC_ELEMENT_SELF, .data=NULL}, 33 EES_FIN 34 }}, 35 EEV_FIN 36 }}, 37 EGUI_FIN 38 }}, 39 EGUI_FIN 40 }}; 41 struct EGong_GUI_item EGong_GUI_systray={ 42 .type=EGONG_GUI_SYSTRAY, .text=NULL, .tooltip=NULL, .child=EGUI_ARR{ 43 EGUI_EL{.type=EGONG_GUI_MENU, .text=NULL, .tooltip=NULL, .child=EGUI_ARR{ 44 EGUI_EL{.type=EGONG_GUI_MENUITEM, .text=GUIT("Rufen"), .tooltip=GUIT("Vordefinierte Ruffunktionen"), .child=EGUI_ARR{ 45 EGUI_EL{.type=EGONG_GUI_MENUITEM, .text=GUIT("Essen"), .tooltip=GUIT("Zum Essen rufen"), .child=NULL, .events=EEV_ARR{ 46 EEV_EL{.command={.type={.type=EGONG_COMMAND_FUNC_STRING, .args=1}, .pointer=&EGong_cnc_sendmessage_broad}, .sources=EES_ARR{ 47 EES_EL{.type=EGONG_GUI_EVSRC_STATIC, .data="Essen"}, 48 EES_FIN 49 }}, 50 EEV_FIN 51 }}, 52 EGUI_FIN, 53 }}, 54 EGUI_EL{.type=EGONG_GUI_MENUITEM_IMAGE, .extra=(void *)EGUI_MIMG_EXIT, .text=GUIT("Exit"), .tooltip=GUIT("Programm beenden"), .child=NULL, .events=EEV_ARR{ 55 EEV_EL{.command={.type={.type=EGONG_COMMAND_FUNC_VOID, .args=0}, .pointer=EGong_if_gui_shutdown}}, 56 EEV_FIN 57 }}, 58 EGUI_FIN, 59 }}, 60 EGUI_ELX(EGong_GUI_newmessage), 61 EGUI_FIN, 62 } 63 }; 64 char *EGong_GUI_item_names[]={ 65 [EGONG_GUI_BUTTON]="Button", 66 [EGONG_GUI_DIALOG]="Dialog", 67 [EGONG_GUI_HBOX]="HBox", 68 [EGONG_GUI_MENU]="Menu", 69 [EGONG_GUI_MENUITEM]="Menuitem", 70 [EGONG_GUI_MENUITEM_IMAGE]="Menuitem Image", 71 [EGONG_GUI_MENUITEM_SEPARATOR]="Menuitem Separator", 72 [EGONG_GUI_SYSTRAY]="Systray", 73 [EGONG_GUI_TEXT]="Text", 74 [EGONG_GUI_WINDOW]="Window" 75 }; 76 #ifdef USE_GTK 77 struct EGong_if_gui_ptrtbl EGong_if_gui_pointers={ 78 .ifptrtbl=&EGong_if_gtk_ptrtbl, 79 .create=(void *(*)(struct EGong_GUI_item *, struct EGong_GUI_item *))&EGong_if_gtk_create_gui, 80 .get_value=&EGong_gtk_get_item_value, 81 .show=&EGong_if_gtk_show_element, 82 .free_value=&EGong_if_gtk_free_item_value 83 }; 84 #endif 85 #ifdef USE_WINGUI 86 struct EGong_if_gui_ptrtbl EGong_if_gui_pointers={ 87 .ifptrtbl=&EGong_if_win_ptrtbl, 88 .create=(void *(*)(struct EGong_GUI_item *, struct EGong_GUI_item *))&EGong_if_win_create_wrapper, 89 .get_value=&EGong_if_win_get_item_value, 90 .show=&EGong_if_win_show_element, 91 .free_value=&EGong_if_win_free_item_value 92 }; 93 #endif 94 void *EGong_GUI_create(struct EGong_GUI_item *gui){ 95 void *newgui=EGong_if_gui_pointers.create(NULL, gui); 96 return newgui; 97 } 98 void EGong_GUI_event_hide(void *gui_element){ 99 #ifdef USE_GTK 100 if(EGong_GUI_type==EGONG_GUI_TYPE_GTK){ 101 gtk_widget_hide_on_delete(gui_element); 102 } 103 #endif 104 #ifdef USE_WINGUI 105 if(EGong_GUI_type==EGONG_GUI_TYPE_WINGUI){ 106 ShowWindow(gui_element, SW_HIDE); 107 } 108 #endif 109 } 110 void EGong_GUI_event_callback(struct EGong_GUI_item *self, struct EGong_GUI_event *event){ 111 void *args[event->command.type.args]; 112 113 unsigned int i; 114 do_log("Constructing argarray", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG); 115 for(i=0;i<event->command.type.args;i++){ 116 if(event->sources[i]->type==EGONG_GUI_EVSRC_ELEMENT){ 117 args[i]=EGong_if_gui_pointers.get_value(event->sources[i]->data); 118 } 119 else if(event->sources[i]->type==EGONG_GUI_EVSRC_ELEMENT_SELF){ 120 args[i]=EGong_if_gui_pointers.get_value(self); 121 } 122 else if(event->sources[i]->type==EGONG_GUI_EVSRC_STATIC){ 123 args[i]=event->sources[i]->data; 124 } 125 } 126 do_log("Trying to execute command", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG); 127 EGong_command_exec(&event->command, args); 128 129 do_log("Command execution done, freeing memory...", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG); 130 131 for(i=0;i<event->command.type.args&&event->sources[i]!=NULL;i++){ 132 if(event->sources[i]->type==EGONG_GUI_EVSRC_ELEMENT){ 133 EGong_if_gui_pointers.free_value(event->sources[i]->data, args[i]); 134 } 135 else if(event->sources[i]->type==EGONG_GUI_EVSRC_ELEMENT_SELF){ 136 EGong_if_gui_pointers.free_value(self, args[i]); 137 } 138 } 139 do_log("Freeing done, good bye...", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG); 140 } 141 142 int EGong_if_gui_setup(struct EGong_interface *interface){ 143 do_log("Setting up GUI", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG); 144 EGong_if_gui_pointers.ifptrtbl->setup(interface); 145 EGong_if_gui_pointers.create(NULL, &EGong_GUI_systray); 146 EGong_if_gui_pointers.show(&EGong_GUI_systray); 147 return EGONG_INTERFACE_RETURN_OK; 148 } 149 unsigned short int EGong_GUI_has_been_shutdown=0; 150 int EGong_if_gui_cmd(char *msg){ 151 if(EGong_GUI_has_been_shutdown==1){ 152 return EGONG_INTERFACE_RETURN_EXIT; 153 } 154 return EGong_if_gui_pointers.ifptrtbl->cmd(msg); 155 } 156 157 int EGong_if_gui_cycle(struct EGong_interface *interface, String *msg, char **dest){ 158 if(EGong_GUI_has_been_shutdown==1){ 159 return EGONG_INTERFACE_RETURN_EXIT; 160 } 161 return EGong_if_gui_pointers.ifptrtbl->cycle(interface,msg,dest); 162 } 163 164 int EGong_if_gui_display(struct EGong_interface *interface, const String *msg){ 165 if(EGong_GUI_has_been_shutdown==1){ 166 return EGONG_INTERFACE_RETURN_EXIT; 167 } 168 return EGong_if_gui_pointers.ifptrtbl->display(interface,msg); 169 } 170 int EGong_if_gui_sockwatch(int sock, unsigned short int type){ 171 do_log("Adding sockwatch", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG); 172 return EGong_if_gui_pointers.ifptrtbl->sock_watch(sock, type); 173 } 174 int EGong_if_gui_loop(void){ 175 return EGong_if_gui_pointers.ifptrtbl->loop(); 176 } 177 int EGong_if_gui_shutdown(struct EGong_interface *interface){ 178 if(EGong_GUI_has_been_shutdown==1){ 179 return EGONG_INTERFACE_RETURN_EXIT; 180 } 181 EGong_GUI_has_been_shutdown=1; 182 do_log("Shutting down GUI", LOG_TYPE_NORMAL, LOG_LEVEL_DEBUG); 183 return EGong_if_gui_pointers.ifptrtbl->shutdown(interface); 184 }