comparison src/audacious/ui_vis.c @ 3058:766a0fd12f7d

do not place GDK_INPUT_ONLY windows in widget->window, use a event_window field for them
author Giacomo Lozito <james@develia.org>
date Fri, 13 Jul 2007 12:36:30 +0200
parents b1b48ea20c16
children 1912eba1004b
comparison
equal deleted inserted replaced
3057:ad11e9cf86a4 3058:766a0fd12f7d
51 static void ui_vis_class_init (UiVisClass *klass); 51 static void ui_vis_class_init (UiVisClass *klass);
52 static void ui_vis_init (UiVis *vis); 52 static void ui_vis_init (UiVis *vis);
53 static void ui_vis_destroy (GtkObject *object); 53 static void ui_vis_destroy (GtkObject *object);
54 static void ui_vis_realize (GtkWidget *widget); 54 static void ui_vis_realize (GtkWidget *widget);
55 static void ui_vis_unrealize (GtkWidget *widget); 55 static void ui_vis_unrealize (GtkWidget *widget);
56 static void ui_vis_map (GtkWidget *widget);
57 static void ui_vis_unmap (GtkWidget *widget);
56 static void ui_vis_size_request (GtkWidget *widget, GtkRequisition *requisition); 58 static void ui_vis_size_request (GtkWidget *widget, GtkRequisition *requisition);
57 static void ui_vis_size_allocate (GtkWidget *widget, GtkAllocation *allocation); 59 static void ui_vis_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
58 static gboolean ui_vis_expose (GtkWidget *widget, GdkEventExpose *event); 60 static gboolean ui_vis_expose (GtkWidget *widget, GdkEventExpose *event);
59 static void ui_vis_toggle_doublesize (UiVis *vis); 61 static void ui_vis_toggle_doublesize (UiVis *vis);
60 62
91 93
92 object_class->destroy = ui_vis_destroy; 94 object_class->destroy = ui_vis_destroy;
93 95
94 widget_class->realize = ui_vis_realize; 96 widget_class->realize = ui_vis_realize;
95 widget_class->unrealize = ui_vis_unrealize; 97 widget_class->unrealize = ui_vis_unrealize;
98 widget_class->map = ui_vis_map;
99 widget_class->unmap = ui_vis_unmap;
96 widget_class->expose_event = ui_vis_expose; 100 widget_class->expose_event = ui_vis_expose;
97 widget_class->size_request = ui_vis_size_request; 101 widget_class->size_request = ui_vis_size_request;
98 widget_class->size_allocate = ui_vis_size_allocate; 102 widget_class->size_allocate = ui_vis_size_allocate;
99 103
100 klass->doubled = ui_vis_toggle_doublesize; 104 klass->doubled = ui_vis_toggle_doublesize;
120 124
121 vis->fixed = fixed; 125 vis->fixed = fixed;
122 vis->double_size = FALSE; 126 vis->double_size = FALSE;
123 127
124 vis->visible_window = TRUE; 128 vis->visible_window = TRUE;
129 vis->event_window = NULL;
125 130
126 gtk_fixed_put(GTK_FIXED(vis->fixed), GTK_WIDGET(vis), vis->x, vis->y); 131 gtk_fixed_put(GTK_FIXED(vis->fixed), GTK_WIDGET(vis), vis->x, vis->y);
127 132
128 return GTK_WIDGET(vis); 133 return GTK_WIDGET(vis);
129 } 134 }
165 attributes.colormap = gtk_widget_get_colormap(widget); 170 attributes.colormap = gtk_widget_get_colormap(widget);
166 attributes.wclass = GDK_INPUT_OUTPUT; 171 attributes.wclass = GDK_INPUT_OUTPUT;
167 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; 172 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
168 widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask); 173 widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
169 GTK_WIDGET_UNSET_FLAGS(widget, GTK_NO_WINDOW); 174 GTK_WIDGET_UNSET_FLAGS(widget, GTK_NO_WINDOW);
175 gdk_window_set_user_data(widget->window, widget);
170 } 176 }
171 else 177 else
172 { 178 {
179 widget->window = gtk_widget_get_parent_window (widget);
180 g_object_ref (widget->window);
181
173 attributes.wclass = GDK_INPUT_ONLY; 182 attributes.wclass = GDK_INPUT_ONLY;
174 attributes_mask = GDK_WA_X | GDK_WA_Y; 183 attributes_mask = GDK_WA_X | GDK_WA_Y;
175 widget->window = gdk_window_new (widget->parent->window, &attributes, attributes_mask); 184 vis->event_window = gdk_window_new (widget->window, &attributes, attributes_mask);
176 GTK_WIDGET_SET_FLAGS (widget, GTK_NO_WINDOW); 185 GTK_WIDGET_SET_FLAGS (widget, GTK_NO_WINDOW);
186 gdk_window_set_user_data(vis->event_window, widget);
177 } 187 }
178 188
179 widget->style = gtk_style_attach(widget->style, widget->window); 189 widget->style = gtk_style_attach(widget->style, widget->window);
180
181 gdk_window_set_user_data(widget->window, widget);
182
183 if (attributes.wclass == GDK_INPUT_ONLY)
184 gdk_window_show (widget->window);
185 } 190 }
186 191
187 static void ui_vis_unrealize(GtkWidget *widget) { 192 static void ui_vis_unrealize(GtkWidget *widget) {
188 UiVis *vis; 193 UiVis *vis;
189 vis = UI_VIS(widget); 194 vis = UI_VIS(widget);
190 195
196 if ( vis->event_window != NULL )
197 {
198 gdk_window_set_user_data( vis->event_window , NULL );
199 gdk_window_destroy( vis->event_window );
200 vis->event_window = NULL;
201 }
202
191 if (GTK_WIDGET_CLASS (parent_class)->unrealize) 203 if (GTK_WIDGET_CLASS (parent_class)->unrealize)
192 (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); 204 (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
205 }
206
207 static void ui_vis_map(GtkWidget *widget)
208 {
209 UiVis *vis;
210 vis = UI_VIS(widget);
211
212 if (vis->event_window != NULL)
213 gdk_window_show (vis->event_window);
214
215 if (GTK_WIDGET_CLASS (parent_class)->map)
216 (* GTK_WIDGET_CLASS (parent_class)->map) (widget);
217 }
218
219 static void ui_vis_unmap (GtkWidget *widget)
220 {
221 UiVis *vis;
222 vis = UI_VIS(widget);
223
224 if (vis->event_window != NULL)
225 gdk_window_hide (vis->event_window);
226
227 if (GTK_WIDGET_CLASS (parent_class)->unmap)
228 (* GTK_WIDGET_CLASS (parent_class)->unmap) (widget);
193 } 229 }
194 230
195 static void ui_vis_size_request(GtkWidget *widget, GtkRequisition *requisition) { 231 static void ui_vis_size_request(GtkWidget *widget, GtkRequisition *requisition) {
196 UiVis *vis = UI_VIS(widget); 232 UiVis *vis = UI_VIS(widget);
197 233
204 240
205 widget->allocation = *allocation; 241 widget->allocation = *allocation;
206 widget->allocation.x *= (1+vis->double_size); 242 widget->allocation.x *= (1+vis->double_size);
207 widget->allocation.y *= (1+vis->double_size); 243 widget->allocation.y *= (1+vis->double_size);
208 if (GTK_WIDGET_REALIZED (widget)) 244 if (GTK_WIDGET_REALIZED (widget))
209 gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height); 245 {
246 if (vis->event_window != NULL)
247 gdk_window_move_resize(vis->event_window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
248 else
249 gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
250 }
210 251
211 vis->x = widget->allocation.x/(vis->double_size ? 2 : 1); 252 vis->x = widget->allocation.x/(vis->double_size ? 2 : 1);
212 vis->y = widget->allocation.y/(vis->double_size ? 2 : 1); 253 vis->y = widget->allocation.y/(vis->double_size ? 2 : 1);
213 } 254 }
214 255