Mercurial > dwindows
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; |