diff options
| author | Joakim Verona | 2011-06-26 22:00:24 +0200 |
|---|---|---|
| committer | Joakim Verona | 2011-06-26 22:00:24 +0200 |
| commit | 76d08552619c83268f1353f449099f50ed6f93fa (patch) | |
| tree | 321a375628d83d5c8aeea5876cf375ec7ad93f58 /src/xwidget.c | |
| parent | 9fa0e291e866fb7945e18cd2ad8514090c13d510 (diff) | |
| parent | 5b66d427c05eba5493c27da28c460a129b4203cc (diff) | |
| download | emacs-76d08552619c83268f1353f449099f50ed6f93fa.tar.gz emacs-76d08552619c83268f1353f449099f50ed6f93fa.zip | |
first working example of mvc. multiple views of a slider are kept in sync
Diffstat (limited to 'src/xwidget.c')
| -rw-r--r-- | src/xwidget.c | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/src/xwidget.c b/src/xwidget.c index 8e8bd4ca4b4..4029adb141d 100644 --- a/src/xwidget.c +++ b/src/xwidget.c | |||
| @@ -101,6 +101,7 @@ extern Lisp_Object QCtype; | |||
| 101 | extern Lisp_Object QCwidth, QCheight; | 101 | extern Lisp_Object QCwidth, QCheight; |
| 102 | 102 | ||
| 103 | #define XG_XWIDGET "emacs_xwidget" | 103 | #define XG_XWIDGET "emacs_xwidget" |
| 104 | #define XG_XWIDGET_VIEW "emacs_xwidget_view" | ||
| 104 | struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); | 105 | struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); |
| 105 | 106 | ||
| 106 | int | 107 | int |
| @@ -201,6 +202,35 @@ gboolean xwidget_plug_removed(GtkSocket *socket, | |||
| 201 | } | 202 | } |
| 202 | 203 | ||
| 203 | 204 | ||
| 205 | void xwidget_slider_changed (GtkRange *range, | ||
| 206 | gpointer user_data) | ||
| 207 | { | ||
| 208 | //slider value changed. change value of siblings correspondingly. but remember that changing value will again trigger signal | ||
| 209 | //gtk_range_set_value () | ||
| 210 | //http://developer.gnome.org/gobject/unstable/gobject-Signals.html#g-signal-handler-block | ||
| 211 | double v; | ||
| 212 | printf("slider changed val:%f\n", v=gtk_range_get_value(range)); | ||
| 213 | //code meant to be refactored | ||
| 214 | struct xwidget_view* xvp = g_object_get_data (G_OBJECT (range), XG_XWIDGET_VIEW); | ||
| 215 | struct xwidget_view* xv; | ||
| 216 | for (int i = 0; i < MAX_XWIDGETS; i++) | ||
| 217 | { | ||
| 218 | xv = &xwidget_views[i]; | ||
| 219 | if(xvp->model == xv->model){ | ||
| 220 | g_signal_handler_block( xv->widget,xv->handler_id); | ||
| 221 | } | ||
| 222 | } | ||
| 223 | for (int i = 0; i < MAX_XWIDGETS; i++) | ||
| 224 | { | ||
| 225 | xv = &xwidget_views[i]; | ||
| 226 | if(xvp->model == xv->model){ | ||
| 227 | gtk_range_set_value(xv->widget, v); | ||
| 228 | g_signal_handler_unblock( xv->widget,xv->handler_id); | ||
| 229 | } | ||
| 230 | } | ||
| 231 | |||
| 232 | } | ||
| 233 | |||
| 204 | int xwidget_view_index=0; | 234 | int xwidget_view_index=0; |
| 205 | 235 | ||
| 206 | /* initializes and does initial placement of an xwidget view on screen */ | 236 | /* initializes and does initial placement of an xwidget view on screen */ |
| @@ -233,11 +263,12 @@ xwidget_init_view ( | |||
| 233 | //gtk_widget_modify_bg(xv->widget, GTK_STATE_NORMAL, &color); | 263 | //gtk_widget_modify_bg(xv->widget, GTK_STATE_NORMAL, &color); |
| 234 | g_signal_connect_after(xv->widget, "plug-added", G_CALLBACK(xwidget_plug_added), "plug added"); | 264 | g_signal_connect_after(xv->widget, "plug-added", G_CALLBACK(xwidget_plug_added), "plug added"); |
| 235 | g_signal_connect_after(xv->widget, "plug-removed", G_CALLBACK(xwidget_plug_removed), "plug removed"); | 265 | g_signal_connect_after(xv->widget, "plug-removed", G_CALLBACK(xwidget_plug_removed), "plug removed"); |
| 236 | } else if (EQ(xww->type, Qsocket)) { | 266 | } else if (EQ(xww->type, Qslider)) { |
| 237 | xv->widget = | 267 | xv->widget = |
| 238 | gtk_hscale_new (GTK_ADJUSTMENT | 268 | //gtk_hscale_new (GTK_ADJUSTMENT(gtk_adjustment_new (0.0, 0.0, 100.0, 1.0, 10.0, 10.0))); |
| 239 | (gtk_adjustment_new (0, 0, 100, 1, 1, 0))); | 269 | gtk_hscale_new_with_range ( 0.0, 100.0, 10.0); |
| 240 | gtk_scale_set_draw_value (GTK_SCALE (xv->widget), FALSE); //i think its emacs role to show text and stuff, so disable the widgets own text | 270 | gtk_scale_set_draw_value (GTK_SCALE (xv->widget), FALSE); //i think its emacs role to show text and stuff, so disable the widgets own text |
| 271 | xv->handler_id = g_signal_connect_after(xv->widget, "value-changed", G_CALLBACK(xwidget_slider_changed), "slider changed"); | ||
| 241 | } else if (EQ(xww->type, Qcairo)) { | 272 | } else if (EQ(xww->type, Qcairo)) { |
| 242 | //Cairo view | 273 | //Cairo view |
| 243 | //uhm cairo is differentish in gtk 3. | 274 | //uhm cairo is differentish in gtk 3. |
| @@ -253,7 +284,7 @@ xwidget_init_view ( | |||
| 253 | //xw->widgetwindow = GTK_CONTAINER (gtk_offscreen_window_new ()); | 284 | //xw->widgetwindow = GTK_CONTAINER (gtk_offscreen_window_new ()); |
| 254 | 285 | ||
| 255 | xv->widgetwindow = GTK_CONTAINER (gtk_fixed_new ()); | 286 | xv->widgetwindow = GTK_CONTAINER (gtk_fixed_new ()); |
| 256 | gtk_widget_set_has_window( xv->widgetwindow, TRUE); //if gtk_fixed doesnt have a window it will surprisingly not honor setsize so that children gets clipped later. the documentation is not consistent regarding if its legal to call this method | 287 | gtk_widget_set_has_window(GTK_WIDGET ( xv->widgetwindow), TRUE); //if gtk_fixed doesnt have a window it will surprisingly not honor setsize so that children gets clipped later. the documentation is not consistent regarding if its legal to call this method |
| 257 | //xv->widgetwindow = GTK_CONTAINER (gtk_event_box_new ()); | 288 | //xv->widgetwindow = GTK_CONTAINER (gtk_event_box_new ()); |
| 258 | 289 | ||
| 259 | //gtk_widget_set_size_request (GTK_WIDGET (xw->widget), xw->width, xw->height); | 290 | //gtk_widget_set_size_request (GTK_WIDGET (xw->widget), xw->width, xw->height); |
| @@ -267,6 +298,7 @@ xwidget_init_view ( | |||
| 267 | //store some xwidget data in the gtk widgets | 298 | //store some xwidget data in the gtk widgets |
| 268 | g_object_set_data (G_OBJECT (xv->widget), XG_FRAME_DATA, (gpointer) (s->f)); //the emacs frame | 299 | g_object_set_data (G_OBJECT (xv->widget), XG_FRAME_DATA, (gpointer) (s->f)); //the emacs frame |
| 269 | g_object_set_data (G_OBJECT (xv->widget), XG_XWIDGET, (gpointer) (xww)); //the xwidget | 300 | g_object_set_data (G_OBJECT (xv->widget), XG_XWIDGET, (gpointer) (xww)); //the xwidget |
| 301 | g_object_set_data (G_OBJECT (xv->widget), XG_XWIDGET_VIEW, (gpointer) (xv)); //the xwidget | ||
| 270 | g_object_set_data (G_OBJECT (xv->widgetwindow), XG_XWIDGET, (gpointer) (xww)); //the xwidget | 302 | g_object_set_data (G_OBJECT (xv->widgetwindow), XG_XWIDGET, (gpointer) (xww)); //the xwidget |
| 271 | 303 | ||
| 272 | //this seems to enable xcomposition. later we need to paint ourselves somehow, | 304 | //this seems to enable xcomposition. later we need to paint ourselves somehow, |