1a05542005-07-28Martin Nilsson /* -*- C -*- */ %{ #include <gdk/gdkprivate.h>
acacdd2008-07-19Martin Stjernholm #ifndef __NT__
1a05542005-07-28Martin Nilsson #include <gdk/gdkx.h> #else
acacdd2008-07-19Martin Stjernholm #include <gdk/gdkwin32.h>
1a05542005-07-28Martin Nilsson #endif /* The main stuff.. */
ba9e802006-02-27Martin Stjernholm int pgtk2_is_setup = 0, pgnome2_is_setup = 0;
1a05542005-07-28Martin Nilsson /* Not used in this file, really, but we need the require * 'preprocessor' stuff.. */
ba9e802006-02-27Martin Stjernholm int pgtk2_is_object_program(struct program *X)
1a05542005-07-28Martin Nilsson { #ifdef GTK_TYPE_TEXT_ITER
ba9e802006-02-27Martin Stjernholm  if ((X)==pgtk2_text_iter_program)
1a05542005-07-28Martin Nilsson  return 0; #endif #ifdef PANGO_TYPE_TAB_ARRAY
ba9e802006-02-27Martin Stjernholm  if ((X)==ppango2_tab_array_program)
1a05542005-07-28Martin Nilsson  return 0; #endif #ifdef GTK_TYPE_TEXT_ATTRIBUTES
ba9e802006-02-27Martin Stjernholm  if ((X)==pgtk2_text_attributes_program)
1a05542005-07-28Martin Nilsson  return 0; #endif #ifdef GTK_TYPE_TREE_ITER
ba9e802006-02-27Martin Stjernholm  if ((X)==pgtk2_tree_iter_program)
1a05542005-07-28Martin Nilsson  return 0; #endif #ifdef PANGO_TYPE_ATTR_LIST
ba9e802006-02-27Martin Stjernholm  if ((X)==ppango2_attr_list_program)
1a05542005-07-28Martin Nilsson  return 0; #endif #ifdef GTK_TYPE_TREE_PATH
ba9e802006-02-27Martin Stjernholm  if ((X)==pgtk2_tree_path_program)
1a05542005-07-28Martin Nilsson  return 0; #endif #ifdef PANGO_TYPE_FONT_DESCRIPTION
ba9e802006-02-27Martin Stjernholm  if ((X)==ppango2_font_description_program)
1a05542005-07-28Martin Nilsson  return 0; #endif
913cb02010-09-19Marcus Comstedt #ifdef GTK_TYPE_RECENT_INFO if ((X)==pgtk2_recent_info_program) return 0; #endif
1a05542005-07-28Martin Nilsson  return 1; } static void backend_callback(struct callback *_cb, void *arg,
02428c2007-06-26Henrik Grubbström (Grubba)  void *backend)
1a05542005-07-28Martin Nilsson {
02428c2007-06-26Henrik Grubbström (Grubba)  if(backend)
1a05542005-07-28Martin Nilsson  { struct timeval timeout = current_time; timeout.tv_usec += 20000; if(timeout.tv_usec > 1000000) { timeout.tv_usec-=1000000; timeout.tv_sec+=1; }
02428c2007-06-26Henrik Grubbström (Grubba)  backend_lower_timeout(backend, &timeout);
1a05542005-07-28Martin Nilsson  } else
d9ea182006-08-05Lance Dillon #ifdef HAVE_GTK22 while(g_main_context_iteration(NULL,0)); #else
1a05542005-07-28Martin Nilsson  while(g_main_iteration( 0 ) );
d9ea182006-08-05Lance Dillon #endif
1a05542005-07-28Martin Nilsson } static struct callback *backend_cb; %} void parse_rc(string rc) //! Takes a string and reads it as a gtkrc file. { char *s; get_all_args("parse_rc",args,"%s",&s); gtk_rc_parse_string(s);
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  push_int(0); /* gtk_widget_propagate_default_style(); */ } GDK2.Window root_window() //! Returns the root window of the current display { static struct object *_pgtk_root_window;
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems( args );
1a05542005-07-28Martin Nilsson  if(_pgtk_root_window && _pgtk_root_window->prog ) { ref_push_object( _pgtk_root_window ); return; } else if( _pgtk_root_window ) free_object( _pgtk_root_window );
ba9e802006-02-27Martin Stjernholm  _pgtk_root_window = low_clone( pgdk2_window_program );
1a05542005-07-28Martin Nilsson  call_c_initializers( _pgtk_root_window ); /* ugly...*/ #ifdef GDK_ROOT_PARENT ((struct object_wrapper *)_pgtk_root_window->storage)->obj= (void *)GDK_ROOT_PARENT(); #else ((struct object_wrapper *)_pgtk_root_window->storage)->obj= (void *)&gdk_root_parent; #endif add_ref( _pgtk_root_window ); ref_push_object( _pgtk_root_window ); } require gnome;
506cbd2006-01-11Henrik Grubbström (Grubba) require gnomeui;
1a05542005-07-28Martin Nilsson  /* array(string) gnome_init(string app_id, string app_version, array(string) argv, int|void corba_init_flags) */ array(string) gnome_init(string app_id, string app_version, array(string) argv) //! Initializes the application. This sets up all of the GNOME //! internals and prepares them (gdk/gtk, session-management, //! triggers, sound, user preferences). If corba init flags are specified, //! corba initialization is done as well as gnome initialization. //! corba_init_flags is 0 or more of GNORBA_INIT_SERVER_FUNC (1), //! GNORBA_INIT_DISABLE_COOKIES (2) and GNORBA_INIT_CORBA_PRIO_HIGH (4) { gchar **data; char *id, *vers; gint argc; INT_TYPE flags=0;
ba9e802006-02-27Martin Stjernholm  if( pgtk2_is_setup )
1a05542005-07-28Martin Nilsson  Pike_error( "You should only call GTK2.setup_gtk() or Gnome.init() once\n"); switch( args ) { default: Pike_error( "Too few arguments, expected at least 3\n"); case 4: flags = PGTK_GETINT( Pike_sp-1 ); case 3: if( !PGTK_ISSTR( Pike_sp-args ) || !PGTK_ISSTR( Pike_sp-args+1 ) ) Pike_error("Illegal argument to Gnome.init()\n"); id = PGTK_GETSTR( Pike_sp-args ); vers = PGTK_GETSTR( Pike_sp-args+1 ); data = get_argv( &argc, args-2 ); }
ba9e802006-02-27Martin Stjernholm  pgnome2_is_setup = 1; pgtk2_is_setup = 1;
1a05542005-07-28Martin Nilsson  gtk_set_locale(); /* if( args == 4 ) applet_widget_init( id, vers, argc, data, NULL, flags, NULL ); else */
362a712006-01-09Marcus Comstedt  gnome_program_init(id,vers,LIBGNOMEUI_MODULE,argc,data,GNOME_PARAM_NONE);
1a05542005-07-28Martin Nilsson  backend_cb = (void *)add_backend_callback( backend_callback, 0, 0);
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  push_and_free_argv( data, argc, 1 ); } /* void applet_widget_gtk_main_quit() //! Exit from the applet_widget_gtk_main function on the next iteration. { gtk_main_quit(); } void applet_widget_gtk_main() //! Special corba main loop for gnome panel applets { applet_widget_gtk_main(); } */ endrequire;
506cbd2006-01-11Henrik Grubbström (Grubba) endrequire;
1a05542005-07-28Martin Nilsson 
3d76632005-11-03Lance Dillon require gnome_vfs; void gnome_vfs_init() //! Initialize gnome-vfs. Usually done automatically by gnome_init(). { gnome_vfs_init(); } endrequire;
1a05542005-07-28Martin Nilsson %{ static gchar **get_argv( int *argc_ret, int an ) { struct array *a; int argc; gchar **data; if( Pike_sp[-an].type != PIKE_T_ARRAY ) Pike_error("Expected array\n"); a = Pike_sp[-an].u.array; if (!a->size) Pike_error ("Expected array with at least one element.\n"); data=g_malloc0(sizeof(char *)*(a->size+1)); if (data==NULL)
32353e2005-12-30Martin Nilsson  Pike_error(msg_out_of_mem);
1a05542005-07-28Martin Nilsson  for( argc=0; argc<a->size; argc++ ) if (!PGTK_ISSTR(ITEM(a)+argc)) { g_free(data); Pike_error("Index %d in the array given as argv " "is not a valid string.\n", argc); } else data[argc] = PGTK_GETSTR( ITEM(a)+argc ); *argc_ret = argc; return data; } static void push_and_free_argv(gchar **data, int argc, int np) { int i; for (i=0; i<argc; i++) { PGTK_PUSH_GCHAR(data[i]); if (!np) PGTK_FREESTR(data[i]); } if (!np) f_aggregate(argc); else push_int(0); g_free(data); } %} array(string) setup_gtk(array(string)|void argv, int|void do_not_parse_rc) //! Initialize GTK, and all that comes with it. //! Also parses $HOME/.pgtkrc and $HOME/.gtkrc if they exists. //! The single argument, if supplied, is the argument array passed to //! the program. This is used to set default window titles etc. //! The second argument, if supplied, indicates that pike specific *rc files //! should <b>not</b> be parsed. //! <p> //! The most common usage is GTK2.setup_gtk(argv);</p> { gchar **data; int argc;
ba9e802006-02-27Martin Stjernholm  if (pgtk2_is_setup)
1a05542005-07-28Martin Nilsson  Pike_error("You should only call GTK2.setup_gtk() or Gnome.init() once\n"); if (args) data=get_argv(&argc,args); else { data=g_malloc(sizeof(char *)*2); if (data==NULL) SIMPLE_OUT_OF_MEMORY_ERROR("setup_gtk",sizeof(char *)*2); data[0]=g_strdup("Pike GTK"); argc=1; }
ba9e802006-02-27Martin Stjernholm  pgtk2_is_setup=1;
1a05542005-07-28Martin Nilsson  gtk_set_locale(); gtk_init(&argc,&data); g_type_init(); backend_cb=(void *)add_backend_callback(backend_callback,0,0);
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  push_and_free_argv(data,argc,0); } void flush() //! Flush GDK. Not normally needed, can be useful while doing calculations. { gdk_flush(); while(g_main_iteration( 0 ) );
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  push_int(0); } void low_flush() //! Flush, but do not process events. Not normally needed. { #ifndef __NT__ XFlush( GDK_DISPLAY() ); #else gdk_flush(); #endif
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems( args );
1a05542005-07-28Martin Nilsson  push_int( 0 ); } array(string) gtk_init(array(string)|void argc, int|void no_pgtkrc) //! Low level GTK init function (used by setup_gtk). //! This function is more or less equivalent to the C-GTK+ function gtk_init. //! setup_gtk does some extra things (such as parsing ~/.pgtkrc). {
ba9e802006-02-27Martin Stjernholm  pgtk2_setup_gtk( args );
1a05542005-07-28Martin Nilsson } void main() //! Start GTK in blocking mode.<br /> //! Doing this disables asynchronous I/O in pike.<br /> //! You can return -1 from main in pike to run GTK (and the rest of //! pike) in asynchronous mode. {
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  gtk_main(); } void main_quit() //! Exit from the gtk_main function on the next iteration. {
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  gtk_main_quit(); } int main_level() //! Return the current recursion depth. {
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  push_int( gtk_main_level() ); } int main_iteration_do(int block) //! Run one iteration in the mainloop. If block is true, wait for an //! event before returning. { INT_TYPE n; get_all_args( "gtk_main_iteration_do", args, "%i", &n );
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  push_int( g_main_iteration( n ) ); } int true() //! Always returns true. {
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  push_int(1); } int false() //! Always returns false. {
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  push_int(0); } void grab_add(GTK2.Widget widget) //! Grab a widget. { struct object *o; get_all_args("gtk_grab_add",args,"%o",&o); gtk_grab_add(GTK_WIDGET(get_gobject(o)));
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson } void grab_remove(GTK2.Widget widget) //! Remove the grab. { struct object *o; get_all_args("gtk_grab_remove",args,"%o",&o); gtk_grab_remove(GTK_WIDGET(get_gobject(o)));
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson } require x11; /* Low-level X11 related functions */ %{ #ifdef HAVE_XDPMS #include <X11/Xext.h> #include <X11/extensions/dpms.h> #endif /* screen-saver on/off status variables. * * TODO: Add an atexit() that restores the screensaver. */ static int timeout_save, dpms_off; %} void saver_disable( ) //! Disable the screensaver. //! This is a low-level X11 function, and thus only works when GDK uses X11 { int interval, prefer_blank, allow_exp;
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  XGetScreenSaver(GDK_DISPLAY(), &timeout_save, &interval, &prefer_blank, &allow_exp); if (timeout_save) XSetScreenSaver(GDK_DISPLAY(), 0, interval, prefer_blank, allow_exp); #ifdef HAVE_XDPMS if (DPMSQueryExtension(GDK_DISPLAY(), &interval, &interval)) { CARD16 state; DPMSInfo(GDK_DISPLAY(), &state, &dpms_off); if (dpms_off) DPMSDisable(mDisplay); /* monitor powersave off */ } #endif } void saver_enable( ) //! Enable the screensaver again after @[saver_disable] has been called. //! This is a low-level X11 function, and thus only works when GDK uses X11. {
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  if( timeout_save ) { int dummy, interval, prefer_blank, allow_exp; XGetScreenSaver(GDK_DISPLAY(), &dummy, &interval, &prefer_blank, &allow_exp); XSetScreenSaver(GDK_DISPLAY(), timeout_save, interval, prefer_blank, allow_exp); } #ifdef HAVE_XDPMS if (dpms_off) { DPMSEnable(mDisplay); /* monitor powersave on */ dpms_off=0; } #endif } void move_cursor( int dx, int dy ) //! Move the mouse-cursor dx,dy pixels, relative to it's current position. //! This will generate a normal motion event. //! //! Note that this is a low-level X11 function, and thus only works //! when GDK uses X11. { INT_TYPE x, y; get_all_args( "move_cursor", args, "%i%i", &x, &y );
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  XWarpPointer( GDK_DISPLAY(), None, None, 0, 0, 0, 0, x, y ); } void move_cursor_abs( GDK2.Window w, int dx, int dy ) //! Move the mouse-cursor to x,y, relative to the upper left corner of //! the specified window. This will generate a normal motion event. //! //! Note that this is a low-level X11 function, and thus only works //! when GDK uses X11. { INT_TYPE x, y; struct object *o;
a885422008-07-20Marcus Comstedt  GdkWindow *w;
1a05542005-07-28Martin Nilsson  get_all_args("move_cursor_abs",args,"%o%i%i",&o,&x,&y);
a885422008-07-20Marcus Comstedt  w = GDK_WINDOW(get_gdkobject( o, window )); if( !w )
1a05542005-07-28Martin Nilsson  Pike_error("No window specified!\n");
a885422008-07-20Marcus Comstedt  XWarpPointer(GDK_DISPLAY(),None,GDK_WINDOW_XWINDOW(w),0,0,0,0,x,y);
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson } endrequire; /* x11 */ require gtk22; array(mapping(string:mixed)) get_formats() //! Get information about the image formats supported. { GSList *gsl,*gs2; gchar **gca; int i=0,j,k;
ba9e802006-02-27Martin Stjernholm  pgtk2_verify_setup(); pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  gs2=gsl=gdk_pixbuf_get_formats(); while (gs2) { i++; k=0;
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("name"));
74a5dd2010-09-19Marcus Comstedt  PGTK_PUSH_GCHAR(gdk_pixbuf_format_get_name(gs2->data));
1a05542005-07-28Martin Nilsson  k++;
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("description"));
74a5dd2010-09-19Marcus Comstedt  PGTK_PUSH_GCHAR(gdk_pixbuf_format_get_description(gs2->data));
1a05542005-07-28Martin Nilsson  k++;
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("mime_types"));
1a05542005-07-28Martin Nilsson  gca=gdk_pixbuf_format_get_mime_types(gs2->data); j=0; while (gca[j]) { PGTK_PUSH_GCHAR(gca[j]); j++; } f_aggregate(j); g_strfreev(gca); k++;
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("extensions"));
1a05542005-07-28Martin Nilsson  gca=gdk_pixbuf_format_get_extensions(gs2->data); j=0; while (gca[j]) { PGTK_PUSH_GCHAR(gca[j]); j++; } f_aggregate(j); g_strfreev(gca); k++; #ifdef HAVE_GTK26
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("disabled"));
1a05542005-07-28Martin Nilsson  push_int(gdk_pixbuf_format_is_disabled(gs2->data)); k++; #endif #ifdef HAVE_GTK26
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("license"));
74a5dd2010-09-19Marcus Comstedt  PGTK_PUSH_GCHAR(gdk_pixbuf_format_get_license(gs2->data));
1a05542005-07-28Martin Nilsson  k++; #endif
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("is_writable"));
1a05542005-07-28Martin Nilsson  push_int(gdk_pixbuf_format_is_writable(gs2->data)); k++; #ifdef HAVE_GTK26
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("is_scalable"));
1a05542005-07-28Martin Nilsson  push_int(gdk_pixbuf_format_is_scalable(gs2->data)); k++; #endif f_aggregate_mapping(k*2); gs2=g_slist_next(gs2); } f_aggregate(i); g_slist_free(gsl); } endrequire; require gtk24; mapping(string:mixed) get_file_info(string filename) //! Parses an image file far enough to determine its format //! and size. { GdkPixbufFormat *gpf; gchar **gca; int j,k; char *filename; int width,height; get_all_args("get_file_info",args,"%s",&filename); gpf=gdk_pixbuf_get_file_info(filename,&width,&height);
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  k=0;
3d76632005-11-03Lance Dillon 
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("name"));
74a5dd2010-09-19Marcus Comstedt  PGTK_PUSH_GCHAR(gdk_pixbuf_format_get_name(gpf));
1a05542005-07-28Martin Nilsson  k++;
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("description"));
74a5dd2010-09-19Marcus Comstedt  PGTK_PUSH_GCHAR(gdk_pixbuf_format_get_description(gpf));
1a05542005-07-28Martin Nilsson  k++;
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("mime_types"));
1a05542005-07-28Martin Nilsson  gca=gdk_pixbuf_format_get_mime_types(gpf); j=0; while (gca[j]) { PGTK_PUSH_GCHAR(gca[j]); j++; } f_aggregate(j); g_strfreev(gca); k++;
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("extensions"));
1a05542005-07-28Martin Nilsson  gca=gdk_pixbuf_format_get_extensions(gpf); j=0; while (gca[j]) { PGTK_PUSH_GCHAR(gca[j]); j++; } f_aggregate(j); g_strfreev(gca); k++; #ifdef HAVE_GTK26
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("disabled"));
1a05542005-07-28Martin Nilsson  push_int(gdk_pixbuf_format_is_disabled(gpf)); k++; #endif #ifdef HAVE_GTK26
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("license"));
74a5dd2010-09-19Marcus Comstedt  PGTK_PUSH_GCHAR(gdk_pixbuf_format_get_license(gpf));
1a05542005-07-28Martin Nilsson  k++; #endif
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("is_writable"));
1a05542005-07-28Martin Nilsson  push_int(gdk_pixbuf_format_is_writable(gpf)); k++; #ifdef HAVE_GTK26
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("is_scalable"));
1a05542005-07-28Martin Nilsson  push_int(gdk_pixbuf_format_is_scalable(gpf)); k++; #endif
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("width"));
1a05542005-07-28Martin Nilsson  push_int(width); k++;
9fb5032006-01-14Martin Nilsson  ref_push_string(_STR("height"));
1a05542005-07-28Martin Nilsson  push_int(height); k++; f_aggregate_mapping(k*2); } void set_default_icon(GDK2.Pixbuf icon) //! Sets an icon to be used as fallback for windows that haven't had set_icon() //! called on them from a pixbuf. { struct object *o1; get_all_args("set_default_icon",args,"%o",&o1); gtk_window_set_default_icon(GDK_PIXBUF(get_gobject(o1)));
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson } endrequire; require gtk22; void set_default_icon_from_file(string filename) //! Sets an icon to be used as fallback for windows that haven't had //! set_icon_list() called on them from a file on disk. { struct svalue *sv; get_all_args("set_default_icon_from_file",args,"%*",&sv);
3d76632005-11-03Lance Dillon 
1a05542005-07-28Martin Nilsson  gtk_window_set_default_icon_from_file(PGTK_GETSTR(sv),NULL);
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson } endrequire; require gtk26; void set_default_icon_name(string name) //! Sets an icon to be as fallback for windows that haven't had set_icon_list() //! called on them from a themed icon. { char *s; get_all_args("set_default_icon_name",args,"%s",&s); gtk_window_set_default_icon_name(s);
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson } endrequire; array(GTK2.Widget) list_toplevels() //! Returns a list of all existing toplevel windows. { GList *gl=gtk_window_list_toplevels(); GList *g2=gl; int i=0;
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  while (g2) { push_gobject(g2->data); i++; g2=g_list_next(g2); } f_aggregate(i); g_list_free(gl); } array(GDK2.Pixbuf) get_default_icon_list() //! Gets the value set by set_default_icon_list(). { GList *gl=gtk_window_get_default_icon_list(); GList *g2=gl; int i=0;
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  while (g2) { push_gobject(g2->data); g_object_ref(GDK_PIXBUF(g2->data)); i++; g2=g_list_next(g2); } f_aggregate(i); g_list_free(gl); }
bcbd6c2006-02-01Lance Dillon void set_default_icon_list(array(GDK2.Pixbuf) list) //! Sets an icon list to be used as fallback for windows that haven't had //! set_icon_list() called on them to set up a window-specific icon list. This //! function allows you to set up the icon for all windows in your app at once.
1a05542005-07-28Martin Nilsson {
bcbd6c2006-02-01Lance Dillon  GList *gl=NULL; struct array *a; int i; GdkPixbuf *gp; get_all_args("set_default_icon_list",args,"%A",&a); if (a==NULL) SIMPLE_ARG_ERROR("set_default_icon_list",args,"Invalid array"); for (i=0; i<a->size; i++) { if ((ITEM(a)+i)->type!=PIKE_T_OBJECT) continue; gp=GDK_PIXBUF(get_gobject((ITEM(a)+i)->u.object)); if (gp) gl=g_list_append(gl,gp); } if (gl) { gtk_window_set_default_icon_list(gl); g_list_free(gl); }
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson }
bcbd6c2006-02-01Lance Dillon require gtk24;
1a05542005-07-28Martin Nilsson void set_default_icon(GDK2.Pixbuf pix) //! Sets an icon to be used as fallback for windows that haven't had //! set_icon() called on them. {
bcbd6c2006-02-01Lance Dillon  struct object *o1; GdkPixbuf *gp; get_all_args("set_default_icon",args,"%o",&o1); gp=GDK_PIXBUF(get_gobject(o1)); if (gp) gtk_window_set_default_icon(gp);
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson }
bcbd6c2006-02-01Lance Dillon endrequire;
1a05542005-07-28Martin Nilsson 
bcbd6c2006-02-01Lance Dillon require gtk22; void set_default_icon_from_file(string filename)
1a05542005-07-28Martin Nilsson //! Sets an icon to be used as fallback from a file on disk. {
bcbd6c2006-02-01Lance Dillon  GError *err=NULL; char *filename; int res; get_all_args("set_default_icon_from_file",args,"%s",&filename); res=gtk_window_set_default_icon_from_file(filename,&err); if (!res) Pike_error("Unable to set icon from file %s: %s\n",filename,err->message);
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson }
bcbd6c2006-02-01Lance Dillon endrequire;
1a05542005-07-28Martin Nilsson  require gtk26; void set_default_icon_name(string name)
bcbd6c2006-02-01Lance Dillon //! Sets an icon to be used as fallback for windows that haven't had //! set_icon_list() called on them from a named themed icon.
1a05542005-07-28Martin Nilsson {
bcbd6c2006-02-01Lance Dillon  struct pike_string *t; get_all_args("set_default_icon_name",args,"%T",&t); if (t) { ref_push_string(t); f_string_to_utf8(1); gtk_window_set_default_icon_name(CGSTR0(Pike_sp[-1].u.string)); pop_stack(); }
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson } endrequire; require gtk24;
8f330d2006-08-07Lance Dillon +GTK2.IconTheme get_default_icon_theme()
1a05542005-07-28Martin Nilsson //! Gets the icon theme. { GtkIconTheme *git=gtk_icon_theme_get_default();
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson  push_gobject(git); } void add_builtin_icon(string name, int size, GDK2.Pixbuf pixbuf) //! Registers a built-in icon for icon theme lookups. The idea of build-in //! icons is to allow an application or library that uses themed icons to //! function requiring files to be present in the file system. For instance, //! the default images for all of GTK2+'s stock icons are registered as built-in //! icons. //! <p> //! In general, if you use add_builtin_icon() you should also install the icon //! in the icon theme, so that the icon is generally available. {
ba9e802006-02-27Martin Stjernholm  pgtk2_verify_inited();
1a05542005-07-28Martin Nilsson  { char *name;
cac4202005-12-17Marcus Comstedt  INT_TYPE size;
1a05542005-07-28Martin Nilsson  struct object *o1; get_all_args("add_builtin_icon",args,"%s%i%o",&name,&size,&o1); gtk_icon_theme_add_builtin_icon(name,size,GDK_PIXBUF(get_gobject(o1))); }
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
1a05542005-07-28Martin Nilsson } endrequire;
bcbd6c2006-02-01Lance Dillon require gtk22; void set_auto_startup_notification(int setting) //! By default, after showing the first GTK2.Window for each GDK2.Screen, //! GTK+ calls GDK2.Screen->notify_startup_complete(). Call this function to //! disable the automatic startup notification. You might do this if your //! first window is a splash screen, and you want to delay notification until //! after your real main window has been shown, for example. //! <p> //! In that example, you would disable startup notification temporarily, //! show your splash screen, then re-enable it so that showing the main //! window would automatically result in notification. { INT_TYPE set; get_all_args("set_auto_startup_notification",args,"%i",&set); gtk_window_set_auto_startup_notification(set);
ba9e802006-02-27Martin Stjernholm  pgtk2_pop_n_elems(args);
bcbd6c2006-02-01Lance Dillon } endrequire;
e34e262005-12-30Martin Nilsson array(int) version() //! Returns the version of the GTK library. { pop_n_elems(args); push_int( gtk_major_version ); push_int( gtk_minor_version ); push_int( gtk_micro_version ); f_aggregate(3); }
3c794f2005-12-29Martin Nilsson %{ #ifdef DYNAMIC_MODULE struct program *image_color_program = NULL; struct program *image_program = NULL; #else extern struct program *image_color_program; extern struct program *image_program; #endif
ef0ec72005-12-29Martin Nilsson #define INIT_VARIABLES
3c794f2005-12-29Martin Nilsson %} INIT { #ifdef DYNAMIC_MODULE image_color_program = PIKE_MODULE_IMPORT(Image, image_color_program); if(!image_color_program) Pike_error("Could not load Image module.\n"); image_program = PIKE_MODULE_IMPORT(Image, image_program); if(!image_program) Pike_error("Could not load Image module.\n"); #endif }