EGong

git clone git://xatko.vsos.ethz.ch/EGong.git
Log | Files | Refs

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 }