comparison gtk/dw.c @ 472:d11be1f40f8c

Add support for column-click signal. Merge icon and filename into one column in a "filesystem" container. Support for creating a window minimized or maximized.
author mhessling@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 10 Oct 2003 09:26:07 +0000
parents 3251fbca6fb3
children ea099ba917c6
comparison
equal deleted inserted replaced
471:fa05a1a0f9b3 472:d11be1f40f8c
107 static gint _tree_select_event(GtkTreeSelection *sel, gpointer data); 107 static gint _tree_select_event(GtkTreeSelection *sel, gpointer data);
108 #else 108 #else
109 static gint _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data); 109 static gint _tree_select_event(GtkTree *tree, GtkWidget *child, gpointer data);
110 #endif 110 #endif
111 static gint _switch_page_event(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data); 111 static gint _switch_page_event(GtkNotebook *notebook, GtkNotebookPage *page, guint page_num, gpointer user_data);
112 static gint _column_click_event(GtkWidget *widget, gint column_num, gpointer user_data);
112 113
113 typedef struct 114 typedef struct
114 { 115 {
115 GdkPixmap *pixmap; 116 GdkPixmap *pixmap;
116 GdkBitmap *mask; 117 GdkBitmap *mask;
139 gint cid; 140 gint cid;
140 void *intfunc; 141 void *intfunc;
141 142
142 } SignalHandler; 143 } SignalHandler;
143 144
144 #define SIGNALMAX 17 145 #define SIGNALMAX 18
145 146
146 /* A list of signal forwarders, to account for paramater differences. */ 147 /* A list of signal forwarders, to account for paramater differences. */
147 static SignalList SignalTranslate[SIGNALMAX] = { 148 static SignalList SignalTranslate[SIGNALMAX] = {
148 { _configure_event, DW_SIGNAL_CONFIGURE }, 149 { _configure_event, DW_SIGNAL_CONFIGURE },
149 { _key_press_event, DW_SIGNAL_KEY_PRESS }, 150 { _key_press_event, DW_SIGNAL_KEY_PRESS },
159 { _tree_context_event, "tree-context" }, 160 { _tree_context_event, "tree-context" },
160 { _item_select_event, DW_SIGNAL_LIST_SELECT }, 161 { _item_select_event, DW_SIGNAL_LIST_SELECT },
161 { _tree_select_event, DW_SIGNAL_ITEM_SELECT }, 162 { _tree_select_event, DW_SIGNAL_ITEM_SELECT },
162 { _set_focus_event, DW_SIGNAL_SET_FOCUS }, 163 { _set_focus_event, DW_SIGNAL_SET_FOCUS },
163 { _value_changed_event, DW_SIGNAL_VALUE_CHANGED }, 164 { _value_changed_event, DW_SIGNAL_VALUE_CHANGED },
164 { _switch_page_event, DW_SIGNAL_SWITCH_PAGE } 165 { _switch_page_event, DW_SIGNAL_SWITCH_PAGE },
166 { _column_click_event, DW_SIGNAL_COLUMN_CLICK }
165 }; 167 };
166 168
167 /* Alignment flags */ 169 /* Alignment flags */
168 #define DW_CENTER 0.5f 170 #define DW_CENTER 0.5f
169 #define DW_LEFT 0.0f 171 #define DW_LEFT 0.0f
679 681
680 if(work.window) 682 if(work.window)
681 { 683 {
682 int (*switchpagefunc)(HWND, unsigned long, void *) = work.func; 684 int (*switchpagefunc)(HWND, unsigned long, void *) = work.func;
683 retval = switchpagefunc(work.window, _get_logical_page(GTK_WIDGET(notebook), page_num), work.data); 685 retval = switchpagefunc(work.window, _get_logical_page(GTK_WIDGET(notebook), page_num), work.data);
686 }
687 return retval;
688 }
689
690 static gint _column_click_event(GtkWidget *widget, gint column_num, gpointer data)
691 {
692 SignalHandler work = _get_signal_handler(widget, data);
693 int retval = FALSE;
694
695 if(work.window)
696 {
697 int (*clickcolumnfunc)(HWND, int, void *) = work.func;
698 retval = clickcolumnfunc(work.window, column_num, work.data);
684 } 699 }
685 return retval; 700 return retval;
686 } 701 }
687 702
688 static gint _container_select_row(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data) 703 static gint _container_select_row(GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data)
1815 if(flStyle & DW_FCF_SIZEBORDER) 1830 if(flStyle & DW_FCF_SIZEBORDER)
1816 flags |= GDK_DECOR_RESIZEH | GDK_DECOR_BORDER; 1831 flags |= GDK_DECOR_RESIZEH | GDK_DECOR_BORDER;
1817 1832
1818 if(flStyle & DW_FCF_BORDER || flStyle & DW_FCF_DLGBORDER) 1833 if(flStyle & DW_FCF_BORDER || flStyle & DW_FCF_DLGBORDER)
1819 flags |= GDK_DECOR_BORDER; 1834 flags |= GDK_DECOR_BORDER;
1835
1836 if(flStyle & DW_FCF_MAXIMIZE)
1837 {
1838 flags &= ~DW_FCF_MAXIMIZE;
1839 #if GTK_MAJOR_VERSION > 1
1840 gtk_window_maximize(GTK_WINDOW(tmp));
1841 #endif
1842 }
1843 if(flStyle & DW_FCF_MINIMIZE)
1844 {
1845 flags &= ~DW_FCF_MINIMIZE;
1846 #if GTK_MAJOR_VERSION > 1
1847 gtk_window_iconify(GTK_WINDOW(tmp));
1848 #endif
1849 }
1820 1850
1821 gdk_window_set_decorations(tmp->window, flags); 1851 gdk_window_set_decorations(tmp->window, flags);
1822 1852
1823 if(hwndOwner) 1853 if(hwndOwner)
1824 gdk_window_reparent(GTK_WIDGET(tmp)->window, GTK_WIDGET(hwndOwner)->window, 0, 0); 1854 gdk_window_reparent(GTK_WIDGET(tmp)->window, GTK_WIDGET(hwndOwner)->window, 0, 0);
4568 * titles: An array of strings with column text titles. 4598 * titles: An array of strings with column text titles.
4569 * count: The number of columns (this should match the arrays). 4599 * count: The number of columns (this should match the arrays).
4570 */ 4600 */
4571 int dw_filesystem_setup(HWND handle, unsigned long *flags, char **titles, int count) 4601 int dw_filesystem_setup(HWND handle, unsigned long *flags, char **titles, int count)
4572 { 4602 {
4573 char **newtitles = malloc(sizeof(char *) * (count + 2)); 4603 char **newtitles = malloc(sizeof(char *) * (count + 1));
4574 unsigned long *newflags = malloc(sizeof(unsigned long) * (count + 2)); 4604 unsigned long *newflags = malloc(sizeof(unsigned long) * (count + 1));
4575 4605
4576 newtitles[0] = "Icon"; 4606 newtitles[0] = "Filename";
4577 newtitles[1] = "Filename"; 4607
4578 4608 newflags[0] = DW_CFA_STRINGANDICON | DW_CFA_LEFT | DW_CFA_HORZSEPARATOR;
4579 newflags[0] = DW_CFA_BITMAPORICON | DW_CFA_CENTER | DW_CFA_HORZSEPARATOR | DW_CFA_SEPARATOR; 4609
4580 newflags[1] = DW_CFA_STRING | DW_CFA_LEFT | DW_CFA_HORZSEPARATOR; 4610 memcpy(&newtitles[1], titles, sizeof(char *) * count);
4581 4611 memcpy(&newflags[1], flags, sizeof(unsigned long) * count);
4582 memcpy(&newtitles[2], titles, sizeof(char *) * count); 4612
4583 memcpy(&newflags[2], flags, sizeof(unsigned long) * count); 4613 _dw_container_setup(handle, newflags, newtitles, count + 1, 1, 1);
4584
4585 _dw_container_setup(handle, newflags, newtitles, count + 2, 2, 1);
4586 4614
4587 free(newtitles); 4615 free(newtitles);
4588 free(newflags); 4616 free(newflags);
4589 return TRUE; 4617 return TRUE;
4590 } 4618 }
4797 DW_MUTEX_UNLOCK; 4825 DW_MUTEX_UNLOCK;
4798 return (void *)handle; 4826 return (void *)handle;
4799 } 4827 }
4800 4828
4801 /* 4829 /*
4830 * Internal representation of dw_container_set_item() extracted so we can pass
4831 * two data pointers; icon and text for dw_filesystem_set_item().
4832 */
4833 void _dw_container_set_item(HWND handle, void *pointer, int column, int row, void *data, char *text)
4834 {
4835 char numbuf[10], textbuffer[100];
4836 int flag = 0;
4837 GtkWidget *clist;
4838 int _locked_by_me = FALSE;
4839
4840 DW_MUTEX_LOCK;
4841 clist = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle));
4842 if(!clist)
4843 {
4844 DW_MUTEX_UNLOCK;
4845 return;
4846 }
4847
4848 sprintf(numbuf, "%d", column);
4849 flag = (int)gtk_object_get_data(GTK_OBJECT(clist), numbuf);
4850
4851 if(flag & DW_CFA_BITMAPORICON)
4852 {
4853 long hicon = *((long *)data);
4854 GdkBitmap *bitmap = NULL;
4855 GdkPixmap *pixmap = _find_pixmap(&bitmap, hicon, clist, NULL, NULL);
4856
4857 if(pixmap)
4858 gtk_clist_set_pixmap(GTK_CLIST(clist), row, column, pixmap, bitmap);
4859 }
4860 else if(flag & DW_CFA_STRINGANDICON)
4861 {
4862 long hicon = *((long *)data);
4863 GdkBitmap *bitmap = NULL;
4864 GdkPixmap *pixmap = _find_pixmap(&bitmap, hicon, clist, NULL, NULL);
4865
4866 if(pixmap)
4867 gtk_clist_set_pixtext(GTK_CLIST(clist), row, column, text, 2, pixmap, bitmap);
4868 }
4869 else if(flag & DW_CFA_STRING)
4870 {
4871 char *tmp = *((char **)data);
4872 gtk_clist_set_text(GTK_CLIST(clist), row, column, tmp);
4873 }
4874 else if(flag & DW_CFA_ULONG)
4875 {
4876 ULONG tmp = *((ULONG *)data);
4877
4878 sprintf(textbuffer, "%lu", tmp);
4879
4880 gtk_clist_set_text(GTK_CLIST(clist), row, column, textbuffer);
4881 }
4882 else if(flag & DW_CFA_DATE)
4883 {
4884 struct tm curtm;
4885 CDATE cdate = *((CDATE *)data);
4886
4887 curtm.tm_mday = cdate.day;
4888 curtm.tm_mon = cdate.month - 1;
4889 curtm.tm_year = cdate.year - 1900;
4890
4891 strftime(textbuffer, 100, "%x", &curtm);
4892
4893 gtk_clist_set_text(GTK_CLIST(clist), row, column, textbuffer);
4894 }
4895 else if(flag & DW_CFA_TIME)
4896 {
4897 struct tm curtm;
4898 CTIME ctime = *((CTIME *)data);
4899
4900 curtm.tm_hour = ctime.hours;
4901 curtm.tm_min = ctime.minutes;
4902 curtm.tm_sec = ctime.seconds;
4903
4904 strftime(textbuffer, 100, "%X", &curtm);
4905
4906 gtk_clist_set_text(GTK_CLIST(clist), row, column, textbuffer);
4907 }
4908 DW_MUTEX_UNLOCK;
4909 }
4910
4911 /*
4802 * Sets an item in specified row and column to the given data. 4912 * Sets an item in specified row and column to the given data.
4803 * Parameters: 4913 * Parameters:
4804 * handle: Handle to the container window (widget). 4914 * handle: Handle to the container window (widget).
4805 * pointer: Pointer to the allocated memory in dw_container_alloc(). 4915 * pointer: Pointer to the allocated memory in dw_container_alloc().
4806 * column: Zero based column of data being set. 4916 * column: Zero based column of data being set.
4807 * row: Zero based row of data being set. 4917 * row: Zero based row of data being set.
4808 * data: Pointer to the data to be added. 4918 * data: Pointer to the data to be added.
4809 */ 4919 */
4810 void dw_container_set_item(HWND handle, void *pointer, int column, int row, void *data) 4920 void dw_container_set_item(HWND handle, void *pointer, int column, int row, void *data)
4811 { 4921 {
4812 char numbuf[10], textbuffer[100]; 4922 _dw_container_set_item(handle, NULL, column, row, data, NULL);
4813 int flag = 0;
4814 GtkWidget *clist;
4815 int _locked_by_me = FALSE;
4816
4817 DW_MUTEX_LOCK;
4818 clist = (GtkWidget *)gtk_object_get_user_data(GTK_OBJECT(handle));
4819 if(!clist)
4820 {
4821 DW_MUTEX_UNLOCK;
4822 return;
4823 }
4824
4825 sprintf(numbuf, "%d", column);
4826 flag = (int)gtk_object_get_data(GTK_OBJECT(clist), numbuf);
4827
4828 if(flag & DW_CFA_BITMAPORICON)
4829 {
4830 long hicon = *((long *)data);
4831 GdkBitmap *bitmap = NULL;
4832 GdkPixmap *pixmap = _find_pixmap(&bitmap, hicon, clist, NULL, NULL);
4833
4834 if(pixmap)
4835 gtk_clist_set_pixmap(GTK_CLIST(clist), row, column, pixmap, bitmap);
4836 }
4837 else if(flag & DW_CFA_STRING)
4838 {
4839 char *tmp = *((char **)data);
4840 gtk_clist_set_text(GTK_CLIST(clist), row, column, tmp);
4841 }
4842 else if(flag & DW_CFA_ULONG)
4843 {
4844 ULONG tmp = *((ULONG *)data);
4845
4846 sprintf(textbuffer, "%lu", tmp);
4847
4848 gtk_clist_set_text(GTK_CLIST(clist), row, column, textbuffer);
4849 }
4850 else if(flag & DW_CFA_DATE)
4851 {
4852 struct tm curtm;
4853 CDATE cdate = *((CDATE *)data);
4854
4855 curtm.tm_mday = cdate.day;
4856 curtm.tm_mon = cdate.month - 1;
4857 curtm.tm_year = cdate.year - 1900;
4858
4859 strftime(textbuffer, 100, "%x", &curtm);
4860
4861 gtk_clist_set_text(GTK_CLIST(clist), row, column, textbuffer);
4862 }
4863 else if(flag & DW_CFA_TIME)
4864 {
4865 struct tm curtm;
4866 CTIME ctime = *((CTIME *)data);
4867
4868 curtm.tm_hour = ctime.hours;
4869 curtm.tm_min = ctime.minutes;
4870 curtm.tm_sec = ctime.seconds;
4871
4872 strftime(textbuffer, 100, "%X", &curtm);
4873
4874 gtk_clist_set_text(GTK_CLIST(clist), row, column, textbuffer);
4875 }
4876 DW_MUTEX_UNLOCK;
4877 } 4923 }
4878 4924
4879 /* 4925 /*
4880 * Changes an existing item in specified row and column to the given data. 4926 * Changes an existing item in specified row and column to the given data.
4881 * Parameters: 4927 * Parameters:
4884 * row: Zero based row of data being set. 4930 * row: Zero based row of data being set.
4885 * data: Pointer to the data to be added. 4931 * data: Pointer to the data to be added.
4886 */ 4932 */
4887 void dw_container_change_item(HWND handle, int column, int row, void *data) 4933 void dw_container_change_item(HWND handle, int column, int row, void *data)
4888 { 4934 {
4889 dw_container_set_item(handle, NULL, column, row, data); 4935 _dw_container_set_item(handle, NULL, column, row, data, NULL);
4890 } 4936 }
4891 4937
4892 /* 4938 /*
4893 * Sets an item in specified row and column to the given data. 4939 * Sets an item in specified row and column to the given data.
4894 * Parameters: 4940 * Parameters:
4898 * row: Zero based row of data being set. 4944 * row: Zero based row of data being set.
4899 * data: Pointer to the data to be added. 4945 * data: Pointer to the data to be added.
4900 */ 4946 */
4901 void dw_filesystem_set_file(HWND handle, void *pointer, int row, char *filename, unsigned long icon) 4947 void dw_filesystem_set_file(HWND handle, void *pointer, int row, char *filename, unsigned long icon)
4902 { 4948 {
4903 dw_container_set_item(handle, pointer, 0, row, (void *)&icon); 4949 _dw_container_set_item(handle, pointer, 0, row, (void *)&icon, filename);
4904 dw_container_set_item(handle, pointer, 1, row, (void *)&filename);
4905 } 4950 }
4906 4951
4907 /* 4952 /*
4908 * Sets an item in specified row and column to the given data. 4953 * Sets an item in specified row and column to the given data.
4909 * Parameters: 4954 * Parameters:
4913 * row: Zero based row of data being set. 4958 * row: Zero based row of data being set.
4914 * data: Pointer to the data to be added. 4959 * data: Pointer to the data to be added.
4915 */ 4960 */
4916 void dw_filesystem_set_item(HWND handle, void *pointer, int column, int row, void *data) 4961 void dw_filesystem_set_item(HWND handle, void *pointer, int column, int row, void *data)
4917 { 4962 {
4918 dw_container_set_item(handle, pointer, column + 2, row, data); 4963 _dw_container_set_item(handle, pointer, column + 1, row, data, NULL);
4919 } 4964 }
4920 4965
4921 /* 4966 /*
4922 * Sets the width of a column in the container. 4967 * Sets the width of a column in the container.
4923 * Parameters: 4968 * Parameters:
7237 else if(GTK_IS_COMBO(handle)) 7282 else if(GTK_IS_COMBO(handle))
7238 { 7283 {
7239 handle2 = GTK_COMBO(handle)->list; 7284 handle2 = GTK_COMBO(handle)->list;
7240 } 7285 }
7241 if(GTK_IS_LIST(handle2)) 7286 if(GTK_IS_LIST(handle2))
7287 {
7242 gtk_list_clear_items(GTK_LIST(handle2), index, index+1); 7288 gtk_list_clear_items(GTK_LIST(handle2), index, index+1);
7289 }
7243 DW_MUTEX_UNLOCK; 7290 DW_MUTEX_UNLOCK;
7244 } 7291 }
7245 7292
7246 /* Reposition the bar according to the percentage */ 7293 /* Reposition the bar according to the percentage */
7247 static gint _splitbar_size_allocate(GtkWidget *widget, GtkAllocation *event, gpointer data) 7294 static gint _splitbar_size_allocate(GtkWidget *widget, GtkAllocation *event, gpointer data)
8016 } 8063 }
8017 else if(GTK_IS_NOTEBOOK(thiswindow) && strcmp(signame, DW_SIGNAL_SWITCH_PAGE) == 0) 8064 else if(GTK_IS_NOTEBOOK(thiswindow) && strcmp(signame, DW_SIGNAL_SWITCH_PAGE) == 0)
8018 { 8065 {
8019 thisname = "switch-page"; 8066 thisname = "switch-page";
8020 } 8067 }
8068 else if(GTK_IS_CLIST(thiswindow) && strcmp(signame, DW_SIGNAL_COLUMN_CLICK) == 0)
8069 {
8070 thisname = "click-column";
8071 }
8021 8072
8022 if(!thisfunc || !thiswindow) 8073 if(!thisfunc || !thiswindow)
8023 { 8074 {
8024 DW_MUTEX_UNLOCK; 8075 DW_MUTEX_UNLOCK;
8025 return; 8076 return;