aboutsummaryrefslogtreecommitdiffstats
path: root/src/xwidget.c
diff options
context:
space:
mode:
authorJoakim Verona2011-06-26 22:00:24 +0200
committerJoakim Verona2011-06-26 22:00:24 +0200
commit76d08552619c83268f1353f449099f50ed6f93fa (patch)
tree321a375628d83d5c8aeea5876cf375ec7ad93f58 /src/xwidget.c
parent9fa0e291e866fb7945e18cd2ad8514090c13d510 (diff)
parent5b66d427c05eba5493c27da28c460a129b4203cc (diff)
downloademacs-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.c40
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;
101extern Lisp_Object QCwidth, QCheight; 101extern 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"
104struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w); 105struct xwidget_view* xwidget_view_lookup(struct xwidget* xw, struct window *w);
105 106
106int 107int
@@ -201,6 +202,35 @@ gboolean xwidget_plug_removed(GtkSocket *socket,
201} 202}
202 203
203 204
205void 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
204int xwidget_view_index=0; 234int 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,