comparison gtk/dw.c @ 409:1d7be77cbfb5

Implemented signal removal system so it works like OS/2 and Windows.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Tue, 13 May 2003 05:07:02 +0000
parents a8124a9561c7
children 47273b6a8500
comparison
equal deleted inserted replaced
408:fecd529ba9d4 409:1d7be77cbfb5
126 typedef struct 126 typedef struct
127 { 127 {
128 HWND window; 128 HWND window;
129 void *func; 129 void *func;
130 gpointer data; 130 gpointer data;
131 gint cid;
132 void *intfunc;
131 133
132 } SignalHandler; 134 } SignalHandler;
133 135
134 #define SIGNALMAX 17 136 #define SIGNALMAX 17
135 137
195 197
196 sprintf(text, "_dw_sigwindow%d", counter); 198 sprintf(text, "_dw_sigwindow%d", counter);
197 sh.window = (HWND)gtk_object_get_data(GTK_OBJECT(widget), text); 199 sh.window = (HWND)gtk_object_get_data(GTK_OBJECT(widget), text);
198 sprintf(text, "_dw_sigfunc%d", counter); 200 sprintf(text, "_dw_sigfunc%d", counter);
199 sh.func = (void *)gtk_object_get_data(GTK_OBJECT(widget), text); 201 sh.func = (void *)gtk_object_get_data(GTK_OBJECT(widget), text);
202 sprintf(text, "_dw_intfunc%d", counter);
203 sh.intfunc = (void *)gtk_object_get_data(GTK_OBJECT(widget), text);
200 sprintf(text, "_dw_sigdata%d", counter); 204 sprintf(text, "_dw_sigdata%d", counter);
201 sh.data = gtk_object_get_data(GTK_OBJECT(widget), text); 205 sh.data = gtk_object_get_data(GTK_OBJECT(widget), text);
206 sprintf(text, "_dw_sigcid%d", counter);
207 sh.cid = (gint)gtk_object_get_data(GTK_OBJECT(widget), text);
202 208
203 return sh; 209 return sh;
204 } 210 }
205 211
206 static int _set_signal_handler(GtkWidget *widget, HWND window, void *func, gpointer data) 212 static void _remove_signal_handler(GtkWidget *widget, int counter)
213 {
214 char text[100];
215 gint cid;
216
217 sprintf(text, "_dw_sigcid%d", counter);
218 cid = (gint)gtk_object_get_data(GTK_OBJECT(widget), text);
219 gtk_signal_disconnect(GTK_OBJECT(widget), cid);
220 gtk_object_set_data(GTK_OBJECT(widget), text, NULL);
221 sprintf(text, "_dw_sigwindow%d", counter);
222 gtk_object_set_data(GTK_OBJECT(widget), text, NULL);
223 sprintf(text, "_dw_sigfunc%d", counter);
224 gtk_object_set_data(GTK_OBJECT(widget), text, NULL);
225 sprintf(text, "_dw_intfunc%d", counter);
226 gtk_object_set_data(GTK_OBJECT(widget), text, NULL);
227 sprintf(text, "_dw_sigdata%d", counter);
228 gtk_object_set_data(GTK_OBJECT(widget), text, NULL);
229 }
230
231 static int _set_signal_handler(GtkWidget *widget, HWND window, void *func, gpointer data, void *intfunc)
207 { 232 {
208 int counter = (int)gtk_object_get_data(GTK_OBJECT(widget), "_dw_sigcounter"); 233 int counter = (int)gtk_object_get_data(GTK_OBJECT(widget), "_dw_sigcounter");
209 char text[100]; 234 char text[100];
210 235
211 sprintf(text, "_dw_sigwindow%d", counter); 236 sprintf(text, "_dw_sigwindow%d", counter);
212 gtk_object_set_data(GTK_OBJECT(widget), text, (gpointer)window); 237 gtk_object_set_data(GTK_OBJECT(widget), text, (gpointer)window);
213 sprintf(text, "_dw_sigfunc%d", counter); 238 sprintf(text, "_dw_sigfunc%d", counter);
214 gtk_object_set_data(GTK_OBJECT(widget), text, (gpointer)func); 239 gtk_object_set_data(GTK_OBJECT(widget), text, (gpointer)func);
240 sprintf(text, "_dw_intfunc%d", counter);
241 gtk_object_set_data(GTK_OBJECT(widget), text, (gpointer)intfunc);
215 sprintf(text, "_dw_sigdata%d", counter); 242 sprintf(text, "_dw_sigdata%d", counter);
216 gtk_object_set_data(GTK_OBJECT(widget), text, (gpointer)data); 243 gtk_object_set_data(GTK_OBJECT(widget), text, (gpointer)data);
217 244
218 counter++; 245 counter++;
219 gtk_object_set_data(GTK_OBJECT(widget), "_dw_sigcounter", (gpointer)counter); 246 gtk_object_set_data(GTK_OBJECT(widget), "_dw_sigcounter", (gpointer)counter);
220 247
221 return counter - 1; 248 return counter - 1;
249 }
250
251 static void _set_signal_handler_id(GtkWidget *widget, int counter, gint cid)
252 {
253 char text[100];
254
255 sprintf(text, "_dw_sigcid%d", counter);
256 gtk_object_set_data(GTK_OBJECT(widget), text, (gpointer)cid);
222 } 257 }
223 258
224 static gint _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data) 259 static gint _set_focus_event(GtkWindow *window, GtkWidget *widget, gpointer data)
225 { 260 {
226 SignalHandler work = _get_signal_handler((GtkWidget *)window, data); 261 SignalHandler work = _get_signal_handler((GtkWidget *)window, data);
3871 3906
3872 subtree = gtk_tree_new(); 3907 subtree = gtk_tree_new();
3873 3908
3874 if(thisfunc && work.window) 3909 if(thisfunc && work.window)
3875 { 3910 {
3876 gtk_signal_connect(GTK_OBJECT(subtree), "select-child", GTK_SIGNAL_FUNC(thisfunc), 3911 int sigid = _set_signal_handler(subtree, work.window, work.func, work.data, thisfunc);
3877 (gpointer)_set_signal_handler(subtree, work.window, work.func, work.data)); 3912 gint cid =gtk_signal_connect(GTK_OBJECT(subtree), "select-child", GTK_SIGNAL_FUNC(thisfunc),(gpointer)sigid);
3913 _set_signal_handler_id(subtree, sigid, cid);
3878 } 3914 }
3879 3915
3880 thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_func"); 3916 thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_func");
3881 mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_data"); 3917 mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_data");
3882 work = _get_signal_handler(tree, mydata); 3918 work = _get_signal_handler(tree, mydata);
3883 3919
3884 if(thisfunc && work.window) 3920 if(thisfunc && work.window)
3885 { 3921 {
3886 gtk_signal_connect(GTK_OBJECT(subtree), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), 3922 int sigid = _set_signal_handler(subtree, work.window, work.func, work.data, thisfunc);
3887 (gpointer)_set_signal_handler(subtree, work.window, work.func, work.data)); 3923 gint cid =gtk_signal_connect(GTK_OBJECT(subtree), "button_press_event", GTK_SIGNAL_FUNC(thisfunc),(gpointer)sigid);
3924 _set_signal_handler_id(subtree, sigid, cid);
3888 } 3925 }
3889 3926
3890 gtk_object_set_user_data(GTK_OBJECT(parent), subtree); 3927 gtk_object_set_user_data(GTK_OBJECT(parent), subtree);
3891 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE); 3928 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE);
3892 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM); 3929 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM);
3998 4035
3999 subtree = gtk_tree_new(); 4036 subtree = gtk_tree_new();
4000 4037
4001 if(thisfunc && work.window) 4038 if(thisfunc && work.window)
4002 { 4039 {
4003 gtk_signal_connect(GTK_OBJECT(subtree), "select-child", GTK_SIGNAL_FUNC(thisfunc), 4040 int sigid = _set_signal_handler(subtree, work.window, work.func, work.data, thisfunc);
4004 (gpointer)_set_signal_handler(subtree, work.window, work.func, work.data)); 4041 gint cid =gtk_signal_connect(GTK_OBJECT(subtree), "select-child", GTK_SIGNAL_FUNC(thisfunc),(gpointer)sigid);
4042 _set_signal_handler_id(subtree, sigid, cid);
4005 } 4043 }
4006 4044
4007 thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_func"); 4045 thisfunc = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_func");
4008 mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_data"); 4046 mydata = (void *)gtk_object_get_data(GTK_OBJECT(tree), "_dw_container_context_data");
4009 work = _get_signal_handler(tree, mydata); 4047 work = _get_signal_handler(tree, mydata);
4010 4048
4011 if(thisfunc && work.window) 4049 if(thisfunc && work.window)
4012 { 4050 {
4013 gtk_signal_connect(GTK_OBJECT(subtree), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), 4051 int sigid = _set_signal_handler(subtree, work.window, work.func, work.data, thisfunc);
4014 (gpointer)_set_signal_handler(subtree, work.window, work.func, work.data)); 4052 gint cid =gtk_signal_connect(GTK_OBJECT(subtree), "button_press_event", GTK_SIGNAL_FUNC(thisfunc),(gpointer)sigid);
4053 _set_signal_handler_id(subtree, sigid, cid);
4015 } 4054 }
4016 4055
4017 gtk_object_set_user_data(GTK_OBJECT(parent), subtree); 4056 gtk_object_set_user_data(GTK_OBJECT(parent), subtree);
4018 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE); 4057 gtk_tree_set_selection_mode(GTK_TREE(subtree), GTK_SELECTION_SINGLE);
4019 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM); 4058 gtk_tree_set_view_mode(GTK_TREE(subtree), GTK_TREE_VIEW_ITEM);
7730 void dw_signal_connect(HWND window, char *signame, void *sigfunc, void *data) 7769 void dw_signal_connect(HWND window, char *signame, void *sigfunc, void *data)
7731 { 7770 {
7732 void *thisfunc = _findsigfunc(signame); 7771 void *thisfunc = _findsigfunc(signame);
7733 char *thisname = signame; 7772 char *thisname = signame;
7734 HWND thiswindow = window; 7773 HWND thiswindow = window;
7735 int _locked_by_me = FALSE; 7774 int sigid, _locked_by_me = FALSE;
7775 gint cid;
7736 7776
7737 DW_MUTEX_LOCK; 7777 DW_MUTEX_LOCK;
7738 if(GTK_IS_SCROLLED_WINDOW(thiswindow)) 7778 if(GTK_IS_SCROLLED_WINDOW(thiswindow))
7739 { 7779 {
7740 thiswindow = (HWND)gtk_object_get_user_data(GTK_OBJECT(window)); 7780 thiswindow = (HWND)gtk_object_get_user_data(GTK_OBJECT(window));
7752 } 7792 }
7753 #if GTK_MAJOR_VERSION > 1 7793 #if GTK_MAJOR_VERSION > 1
7754 else if(GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0) 7794 else if(GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0)
7755 { 7795 {
7756 thisfunc = _findsigfunc("tree-context"); 7796 thisfunc = _findsigfunc("tree-context");
7757 7797 sigid = _set_signal_handler(thiswindow, window, sigfunc, data, thisfunc);
7758 gtk_signal_connect(GTK_OBJECT(thiswindow), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), 7798 cid = gtk_signal_connect(GTK_OBJECT(thiswindow), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), (gpointer)sigid);
7759 (gpointer)_set_signal_handler(thiswindow, window, sigfunc, data)); 7799 _set_signal_handler_id(thiswindow, sigid, cid);
7760 gtk_signal_connect(GTK_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), 7800 sigid = _set_signal_handler(window, window, sigfunc, data, thisfunc);
7761 (gpointer)_set_signal_handler(window, window, sigfunc, data)); 7801 cid = gtk_signal_connect(GTK_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), (gpointer)sigid);
7802 _set_signal_handler_id(window, sigid, cid);
7762 DW_MUTEX_UNLOCK; 7803 DW_MUTEX_UNLOCK;
7763 return; 7804 return;
7764 } 7805 }
7765 else if(GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0) 7806 else if(GTK_IS_TREE_VIEW(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0)
7766 { 7807 {
7767 GtkWidget *treeview = thiswindow; 7808 GtkWidget *treeview = thiswindow;
7768 7809
7769 thiswindow = (GtkWidget *)gtk_tree_view_get_selection(GTK_TREE_VIEW(thiswindow)); 7810 thiswindow = (GtkWidget *)gtk_tree_view_get_selection(GTK_TREE_VIEW(thiswindow));
7770 thisname = "changed"; 7811 thisname = "changed";
7771 7812
7772 g_signal_connect(G_OBJECT(thiswindow), thisname, (GCallback)thisfunc, 7813 sigid = _set_signal_handler(treeview, window, sigfunc, data, thisfunc);
7773 (gpointer)_set_signal_handler(treeview, window, sigfunc, data)); 7814 cid = g_signal_connect(G_OBJECT(thiswindow), thisname, (GCallback)thisfunc, (gpointer)sigid);
7815 _set_signal_handler_id(thiswindow, sigid, cid);
7774 DW_MUTEX_UNLOCK; 7816 DW_MUTEX_UNLOCK;
7775 return; 7817 return;
7776 } 7818 }
7777 #else 7819 #else
7778 else if(GTK_IS_TREE(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0) 7820 else if(GTK_IS_TREE(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_CONTEXT) == 0)
7779 { 7821 {
7780 int counter = (int)_set_signal_handler(thiswindow, window, sigfunc, data);
7781
7782 thisfunc = _findsigfunc("tree-context"); 7822 thisfunc = _findsigfunc("tree-context");
7823 sigid = _set_signal_handler(thiswindow, window, sigfunc, data, thisfunc);
7783 7824
7784 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_container_context_func", (gpointer)thisfunc); 7825 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_container_context_func", (gpointer)thisfunc);
7785 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_container_context_data", (gpointer)counter); 7826 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_container_context_data", (gpointer)sigid);
7786 gtk_signal_connect(GTK_OBJECT(thiswindow), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), (gpointer)counter); 7827 cid = gtk_signal_connect(GTK_OBJECT(thiswindow), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), (gpointer)sigid);
7787 gtk_signal_connect(GTK_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), 7828 _set_signal_handler_id(thiswindow, sigid, cid);
7788 (gpointer)_set_signal_handler(window, window, sigfunc, data)); 7829 sigid = _set_signal_handler(window, window, sigfunc, data, thisfunc);
7830 cid = gtk_signal_connect(GTK_OBJECT(window), "button_press_event", GTK_SIGNAL_FUNC(thisfunc), (gpointer)sigid);
7831 _set_signal_handler_id(window, sigid, cid);
7789 DW_MUTEX_UNLOCK; 7832 DW_MUTEX_UNLOCK;
7790 return; 7833 return;
7791 } 7834 }
7792 else if(GTK_IS_TREE(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0) 7835 else if(GTK_IS_TREE(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0)
7793 { 7836 {
7794 if(thisfunc) 7837 if(thisfunc)
7795 { 7838 {
7839 sigid = _set_signal_handler(thiswindow, window, sigfunc, data, thisfunc);
7796 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_select_child_func", (gpointer)thisfunc); 7840 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_select_child_func", (gpointer)thisfunc);
7797 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_select_child_data", 7841 gtk_object_set_data(GTK_OBJECT(thiswindow), "_dw_select_child_data", (gpointer)sigid);
7798 (gpointer)_set_signal_handler(thiswindow, window, sigfunc, data));
7799 } 7842 }
7800 thisname = "select-child"; 7843 thisname = "select-child";
7801 } 7844 }
7802 #endif 7845 #endif
7803 else if(GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_ENTER) == 0) 7846 else if(GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_ENTER) == 0)
7804 { 7847 {
7805 gtk_signal_connect(GTK_OBJECT(thiswindow), "key_press_event", GTK_SIGNAL_FUNC(_container_enter_event), 7848 sigid = _set_signal_handler(thiswindow, window, sigfunc, data, _container_enter_event);
7806 (gpointer)_set_signal_handler(thiswindow, window, sigfunc, data)); 7849 cid = gtk_signal_connect(GTK_OBJECT(thiswindow), "key_press_event", GTK_SIGNAL_FUNC(_container_enter_event), (gpointer)sigid);
7850 _set_signal_handler_id(thiswindow, sigid, cid);
7807 7851
7808 thisname = "button_press_event"; 7852 thisname = "button_press_event";
7809 thisfunc = _findsigfunc(DW_SIGNAL_ITEM_ENTER); 7853 thisfunc = _findsigfunc(DW_SIGNAL_ITEM_ENTER);
7810 } 7854 }
7811 else if(GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0) 7855 else if(GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_ITEM_SELECT) == 0)
7850 { 7894 {
7851 DW_MUTEX_UNLOCK; 7895 DW_MUTEX_UNLOCK;
7852 return; 7896 return;
7853 } 7897 }
7854 7898
7855 gtk_signal_connect(GTK_OBJECT(thiswindow), thisname, GTK_SIGNAL_FUNC(thisfunc), 7899 sigid = _set_signal_handler(thiswindow, window, sigfunc, data, thisfunc);
7856 (gpointer)_set_signal_handler(thiswindow, window, sigfunc, data)); 7900 cid = gtk_signal_connect(GTK_OBJECT(thiswindow), thisname, GTK_SIGNAL_FUNC(thisfunc),(gpointer)sigid);
7901 _set_signal_handler_id(thiswindow, sigid, cid);
7857 DW_MUTEX_UNLOCK; 7902 DW_MUTEX_UNLOCK;
7858 } 7903 }
7859 7904
7860 /* 7905 /*
7861 * Removes callbacks for a given window with given name. 7906 * Removes callbacks for a given window with given name.
7862 * Parameters: 7907 * Parameters:
7863 * window: Window handle of callback to be removed. 7908 * window: Window handle of callback to be removed.
7864 */ 7909 */
7865 void dw_signal_disconnect_by_name(HWND window, char *signame) 7910 void dw_signal_disconnect_by_name(HWND window, char *signame)
7866 { 7911 {
7867 #if 0 7912 int z, count = (int)gtk_object_get_data(GTK_OBJECT(window), "_dw_sigcounter");
7868 gtk_signal_disconnect_by_name(window, signame); 7913 void *thisfunc = _findsigfunc(signame);
7869 #endif 7914
7915 for(z=0;z<count;z++)
7916 {
7917 SignalHandler sh = _get_signal_handler(window, (gpointer)z);
7918
7919 if(sh.intfunc == thisfunc)
7920 _remove_signal_handler(window, z);
7921 }
7870 } 7922 }
7871 7923
7872 /* 7924 /*
7873 * Removes all callbacks for a given window. 7925 * Removes all callbacks for a given window.
7874 * Parameters: 7926 * Parameters:
7875 * window: Window handle of callback to be removed. 7927 * window: Window handle of callback to be removed.
7876 */ 7928 */
7877 void dw_signal_disconnect_by_window(HWND window) 7929 void dw_signal_disconnect_by_window(HWND window)
7878 { 7930 {
7879 #if 0 7931 int z, count = (int)gtk_object_get_data(GTK_OBJECT(window), "_dw_sigcounter");
7880 gtk_signal_disconnect_by_window(window); 7932
7881 #endif 7933 for(z=0;z<count;z++)
7934 _remove_signal_handler(window, z);
7935 gtk_object_set_data(GTK_OBJECT(window), "_dw_sigcounter", NULL);
7882 } 7936 }
7883 7937
7884 /* 7938 /*
7885 * Removes all callbacks for a given window with specified data. 7939 * Removes all callbacks for a given window with specified data.
7886 * Parameters: 7940 * Parameters:
7887 * window: Window handle of callback to be removed. 7941 * window: Window handle of callback to be removed.
7888 * data: Pointer to the data to be compared against. 7942 * data: Pointer to the data to be compared against.
7889 */ 7943 */
7890 void dw_signal_disconnect_by_data(HWND window, void *data) 7944 void dw_signal_disconnect_by_data(HWND window, void *data)
7891 { 7945 {
7892 dw_signal_disconnect_by_data(window, data); 7946 int z, count = (int)gtk_object_get_data(GTK_OBJECT(window), "_dw_sigcounter");
7893 } 7947
7894 7948 for(z=0;z<count;z++)
7949 {
7950 SignalHandler sh = _get_signal_handler(window, (gpointer)z);
7951
7952 if(sh.data == data)
7953 _remove_signal_handler(window, z);
7954 }
7955 }
7956