/** \brief Description yet to be added. **/ static void switchPageFunc ( GtkNotebook *notebook, GtkNotebookPage *page, gint page_num, gpointer data ) { GnoclCommandData *cs = ( GnoclCommandData * ) data; GnoclPercSubst ps[] = { { 'w', GNOCL_STRING }, /* widget */ { 'p', GNOCL_INT }, { 0 } }; ps[0].val.str = gnoclGetNameFromWidget ( GTK_WIDGET ( notebook ) ); ps[1].val.i = page_num; gnoclPercentSubstAndEval ( cs->interp, ps, cs->command, 1 ); }
/** \brief \author \date **/ static int configure ( Tcl_Interp *interp, GtkWidget *widget, GnoclOption options[] ) { const char *dataIDa = "gnocl::data1"; const char *dataIDb = "gnocl::data2"; GtkWidget *arrow = gnoclFindChild ( GTK_WIDGET ( widget ), GTK_TYPE_BUTTON ); char *str; /* this will enable us to obtain widget data for the arrow object */ char *result = g_object_get_data ( G_OBJECT ( arrow ), dataIDa ); printf ( "cget result = %s\n", result ); result = g_object_get_data ( G_OBJECT ( arrow ), dataIDb ); printf ( "cget result = %s\n", result ); str = gnoclGetNameFromWidget ( arrow ); printf ( "configure %s\n", str ); return TCL_OK; }
static void doOnResize( GtkWidget *widget, GtkAllocation *alc, gpointer data ) { GnoclCommandData *cs = (GnoclCommandData *)data; GnoclPercSubst ps[] = { { 'w', GNOCL_STRING }, /* widget */ { 'x', GNOCL_INT }, /* */ { 'y', GNOCL_INT }, /* */ { 'W', GNOCL_INT }, /* */ { 'H', GNOCL_INT }, /* */ { 0 } }; ps[0].val.str = gnoclGetNameFromWidget( widget ); ps[1].val.i = alc->x; ps[2].val.i = alc->y; ps[3].val.i = alc->width; ps[4].val.i = alc->height; gnoclPercentSubstAndEval( cs->interp, ps, cs->command, 1 ); return; }
/** \brief Function associated with the widget. **/ int buttonFunc ( ClientData data, Tcl_Interp *interp, int objc, Tcl_Obj * const objv[] ) { static const char *cmds[] = { "delete", "configure", "cget", "onClicked", "class", "parent", "geometry", "toplevel", NULL }; enum cmdIdx { DeleteIdx, ConfigureIdx, CgetIdx, OnClickedIdx, ClassIdx, ParentIdx, GeometryIdx, ToplevelIdx }; GtkButton *button = GTK_BUTTON ( data ); int idx; if ( objc < 2 ) { Tcl_WrongNumArgs ( interp, 1, objv, "command" ); return TCL_ERROR; } if ( Tcl_GetIndexFromObj ( interp, objv[1], cmds, "command", TCL_EXACT, &idx ) != TCL_OK ) { return TCL_ERROR; } switch ( idx ) { case ToplevelIdx: { g_print ( "button ToplevelIdx\n" ); GtkWidget *toplevel; Tcl_Obj *obj = NULL; toplevel = gtk_widget_get_toplevel ( button ) ; obj = Tcl_NewStringObj ( gnoclGetNameFromWidget ( toplevel ), -1 ); Tcl_SetObjResult ( interp, obj ); return TCL_OK; } break; case GeometryIdx: { g_print ( "button GeometryIdx\n" ); char *txt = gnoclGetWidgetGeometry ( button ) ; Tcl_SetObjResult ( interp, Tcl_NewStringObj ( txt , -1 ) ); return TCL_OK; } break; case ParentIdx: { GtkWidget * parent; Tcl_Obj *obj = NULL; parent = gtk_widget_get_parent ( GTK_WIDGET ( button ) ); obj = Tcl_NewStringObj ( gnoclGetNameFromWidget ( parent ), -1 ); Tcl_SetObjResult ( interp, obj ); /* this function not working too well! */ /* return gnoclGetParent ( interp, data ); */ return TCL_OK; } break; case ClassIdx: { Tcl_SetObjResult ( interp, Tcl_NewStringObj ( "button", -1 ) ); break; } case DeleteIdx: { return gnoclDelete ( interp, GTK_WIDGET ( button ), objc, objv ); } case ConfigureIdx: { int ret = TCL_ERROR; if ( gnoclParseAndSetOptions ( interp, objc - 1, objv + 1, buttonOptions, G_OBJECT ( button ) ) == TCL_OK ) { ret = configure ( interp, button, buttonOptions ); } gnoclClearOptions ( buttonOptions ); return ret; } break; case OnClickedIdx: if ( objc != 2 ) { Tcl_WrongNumArgs ( interp, 2, objv, NULL ); return TCL_ERROR; } if ( GTK_WIDGET_IS_SENSITIVE ( GTK_WIDGET ( button ) ) ) { gtk_button_clicked ( button ); } break; case CgetIdx: { int idx; switch ( gnoclCget ( interp, objc, objv, G_OBJECT ( button ), buttonOptions, &idx ) ) { case GNOCL_CGET_ERROR: return TCL_ERROR; case GNOCL_CGET_HANDLED: return TCL_OK; case GNOCL_CGET_NOTHANDLED: return cget ( interp, button, buttonOptions, idx ); } } } return TCL_OK; }
/** \brief \author William J Giddings **/ static int cget ( Tcl_Interp *interp, GtkWidget *widget, GnoclOption options[], int idx ) { printf ( "cget\n" ); const char *dataIDa = "gnocl::data1"; const char *dataIDb = "gnocl::data2"; GtkWidget *arrow = gnoclFindChild ( GTK_WIDGET ( widget ), GTK_TYPE_BUTTON ); char *str; /* this will enable us to obtain widget data for the arrow object */ char *result = g_object_get_data ( G_OBJECT ( arrow ), dataIDa ); printf ( "cget result = %s\n", result ); result = g_object_get_data ( G_OBJECT ( arrow ), dataIDb ); printf ( "cget result = %s\n", result ); str = gnoclGetNameFromWidget ( arrow ); printf ( "configure %s\n", str ); /*-----*/ /* Tcl_Obj *obj = NULL; if ( idx == textIdx ) { obj = gnoclCgetButtonText ( interp, widget ); } else if ( idx == iconsIdx ) { GtkWidget *image = gnoclFindChild ( GTK_WIDGET ( widget ), GTK_TYPE_IMAGE ); if ( image == NULL ) obj = Tcl_NewStringObj ( "", 0 ); else { gchar *st; g_object_get ( G_OBJECT ( image ), "stock", &st, NULL ); if ( st ) { obj = Tcl_NewStringObj ( "%#", 2 ); Tcl_AppendObjToObj ( obj, gnoclGtkToStockName ( st ) ); g_free ( st ); } else { Tcl_SetResult ( interp, "Could not determine icon type.", TCL_STATIC ); return TCL_ERROR; } } } if ( obj != NULL ) { Tcl_SetObjResult ( interp, obj ); return TCL_OK; } */ return gnoclCgetNotImplemented ( interp, options + idx ); }
/** \brief Return window/widget-related information \author William J Giddings \date 01-Mar-09 **/ int gnoclWinfoCmd ( ClientData data, Tcl_Interp *interp, int objc, Tcl_Obj * const objv[] ) { static const char *cmd[] = { "parent", "toplevel", "geometry", "style", NULL }; enum optIdx { ParentIdx, ToplevelIdx, GeometryIdx, StyleIdx }; int idx; if ( objc != 3 ) { Tcl_WrongNumArgs ( interp, 1, objv, "option widgetid " ); return TCL_ERROR; } if ( Tcl_GetIndexFromObj ( interp, objv[1], cmd, "option", TCL_EXACT, &idx ) != TCL_OK ) { return TCL_ERROR; } // g_print ( "opt = %s id = %s\n", Tcl_GetString ( objv[1] ), Tcl_GetString ( objv[2] ) ); switch ( idx ) { case ParentIdx: { char buffer[128]; GtkWidget *widget = gnoclGetWidgetFromName ( Tcl_GetString ( objv[2] ), interp ); GtkWidget *parent = gtk_widget_get_parent ( widget ); sprintf ( buffer, "%s", gnoclGetNameFromWidget ( parent ) ); Tcl_SetObjResult ( interp, Tcl_NewStringObj ( buffer, -1 ) ); } break; case ToplevelIdx: { char buffer[128]; GtkWidget *widget = gnoclGetWidgetFromName ( Tcl_GetString ( objv[2] ), interp ); GtkWidget *toplevel = gtk_widget_get_toplevel ( widget ); sprintf ( buffer, "%s", gnoclGetNameFromWidget ( toplevel ) ); Tcl_SetObjResult ( interp, Tcl_NewStringObj ( buffer, -1 ) ); } break; /* probably best leave this to the widget commands themselves */ case GeometryIdx: { char buffer[128]; GtkWidget *widget; GtkRequisition req; gint x, y; widget = gnoclGetWidgetFromName ( Tcl_GetString ( objv[2] ), interp ); gdk_window_get_origin ( widget->window, &x, &y ); x += widget->allocation.x; x -= widget->style->xthickness; y += widget->allocation.y; y -= widget->style->ythickness; gtk_widget_size_request ( widget, &req ); sprintf ( buffer, "%d %d %d %d", x, y, req.width, req.height ); Tcl_SetObjResult ( interp, Tcl_NewStringObj ( buffer, -1 ) ); } break; case StyleIdx: { char buffer[128]; sprintf ( buffer, "%s", "Style" ); Tcl_SetObjResult ( interp, Tcl_NewStringObj ( buffer, -1 ) ); } break; } return TCL_OK; }
/** \brief Screen and Display size - returns the physical screen size in millimeters geometry -returns the logicaL screen size in pixels \author William J Giddings \date 03-Jan-2010 **/ int gnoclScreenCmd ( ClientData data, Tcl_Interp *interp, int objc, Tcl_Obj * const objv[] ) { static const char *cmd[] = { "size", "geometry", "name", "screens", "composited", "windowList", "toplevels", NULL }; enum optIdx { SizeIdx, GeometryIdx, NameIdx, ScreensIdx, CompositedIdx, WindowListIdx, TopLevelsIdx }; int idx; if ( objc != 2 ) { Tcl_WrongNumArgs ( interp, 1, objv, "option " ); return TCL_ERROR; } if ( Tcl_GetIndexFromObj ( interp, objv[1], cmd, "option", TCL_EXACT, &idx ) != TCL_OK ) { return TCL_ERROR; } /* display = gdk_display_get_default (); num_screen = gdk_display_get_n_screens (display); displayname = gdk_display_get_name (display); */ switch ( idx ) { case TopLevelsIdx: case WindowListIdx: { gchar buffer[16]; GdkScreen *screen; GSList *toplevels, *p; gchar *widgetName; screen = gdk_screen_get_default(); toplevels = gdk_screen_get_toplevel_windows ( screen ); /* check to see if the windows are registered with gnocl */ for ( p = toplevels; p != NULL ; p = p->next ) { /* this returns GDKWindow, not Gtk */ widgetName = gnoclGetNameFromWidget ( GTK_WIDGET ( p->data ) ); printf ( "toplevel %s\n", widgetName ); if ( widgetName != NULL ) { printf ( "toplevel %s\n", widgetName ); } else { printf ( "Missed this one! List length = %d\n", g_slist_length ( toplevels ) ); printf ( "toplevel %s\n", widgetName ); } } gboolean state = 0; sprintf ( &buffer, "%d", state ); Tcl_SetObjResult ( interp, Tcl_NewIntObj ( state ) ); } break; case CompositedIdx: { gchar buffer[16]; GdkScreen *screen; gboolean state; screen = gdk_screen_get_default(); state = gdk_screen_is_composited ( screen ); sprintf ( &buffer, "%d", state ); Tcl_SetObjResult ( interp, Tcl_NewIntObj ( state ) ); } break; case ScreensIdx: { gchar buffer[16]; GdkDisplay *display; display = gdk_display_get_default (); gint screens = gdk_display_get_n_screens ( display ); sprintf ( &buffer, "%d", screens ); Tcl_SetObjResult ( interp, Tcl_NewStringObj ( buffer, -1 ) ); } break; case NameIdx: { gchar buffer[16]; GdkDisplay *display; const gchar *name; display = gdk_display_get_default (); name = gdk_display_get_name ( display ); sprintf ( &buffer, "%s", name ); Tcl_SetObjResult ( interp, Tcl_NewStringObj ( buffer, -1 ) ); } break; case SizeIdx: { gchar buffer[16]; gint width_mm = 0; gint height_mm = 0; GdkScreen *screen; screen = gdk_screen_get_default(); width_mm = gdk_screen_get_width_mm ( screen ); height_mm = gdk_screen_get_height_mm ( screen ); sprintf ( &buffer, "%d %d", width_mm, height_mm ); Tcl_SetObjResult ( interp, Tcl_NewStringObj ( buffer, -1 ) ); } break; case GeometryIdx: { gchar buffer[16]; gint width = 0; gint height = 0; GdkScreen *screen; screen = gdk_screen_get_default(); width = gdk_screen_get_width ( screen ); height = gdk_screen_get_height ( screen ); sprintf ( &buffer, "%d %d", width, height ); Tcl_SetObjResult ( interp, Tcl_NewStringObj ( buffer, -1 ) ); } break; } return TCL_OK; }