Mercurial > audlegacy
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 |
