static void cc_region_panel_init (CcRegionPanel * self) { CcRegionPanelPrivate *priv; GtkWidget *prefs_widget; const char *desktop; GError *error = NULL; priv = self->priv = REGION_PANEL_PRIVATE (self); desktop = g_getenv ("XDG_CURRENT_DESKTOP"); priv->builder = gtk_builder_new (); gtk_builder_add_from_file (priv->builder, GNOMECC_UI_DIR "/gnome-region-panel.ui", &error); if (error != NULL) { g_warning ("Error loading UI file: %s", error->message); g_error_free (error); return; } if (!g_strcmp0 (desktop, "GNOME")) { prefs_widget = (GtkWidget *) gtk_builder_get_object (priv->builder, "region_notebook"); } else { prefs_widget = (GtkWidget *) gtk_builder_get_object (priv->builder, "vbox1"); } gtk_widget_set_size_request (GTK_WIDGET (prefs_widget), -1, 400); gtk_widget_reparent (prefs_widget, GTK_WIDGET (self)); setup_xkb_tabs (priv->builder); if (!g_strcmp0 (desktop, "GNOME")) { setup_language (priv->builder); setup_formats (priv->builder); setup_system (priv->builder); } }
int main_loop(int argc, char *argv[]) { setup_language(); se_env* env = se_env_init(); se_text_xviewer* viewer = se_text_xviewer_create( env ); long im_event_mask; XGetICValues( viewer->xic, XNFilterEvents, &im_event_mask, NULL ); int mask = ExposureMask | ButtonPressMask | ButtonReleaseMask | KeyPressMask | KeyReleaseMask | SubstructureNotifyMask | FocusChangeMask | im_event_mask; XSelectInput( env->display, viewer->view, mask ); XSetICFocus( viewer->xic ); viewer->repaint( viewer ); viewer->show( viewer ); while ( 1 ) { // sync the first expose event XEvent ev; XNextEvent( env->display, &ev ); if ( ev.xany.window == viewer->view && ev.type == Expose ) { viewer->redisplay( viewer ); break; } } while( !env->exitLoop ) { XEvent ev; XNextEvent( env->display, &ev ); if ( XFilterEvent( &ev, None ) == True ) { se_debug("IM filtered event: %s", XEventTypeString(ev.type) ); continue; } if ( ev.xany.window != viewer->view ) { se_msg( "skip event does not forward to view" ); continue; } switch( ev.type ) { case Expose: se_debug( "Expose" ); if ( ev.xexpose.count > 0 ) break; viewer->redisplay( viewer ); break; case KeyPress: case KeyRelease: viewer->key_handler( viewer, &ev ); break; case ConfigureNotify: case MapNotify: se_debug( "confiugration changed" ); viewer->configure_change_handler( viewer, &ev ); break; default: break; } } se_debug( "exit loop" ); XUnsetICFocus( viewer->xic ); XDestroyIC( viewer->xic ); se_env_release( env ); return 0; }
int main( int argc, char *argv[] ) { glob_t globdata; int i, j, l, file_arg_start, new_empty = TRUE, get_screenshot = FALSE; if (argc > 1) { if ( strcmp(argv[1], "--version") == 0 ) { printf("%s\n\n", MT_VERSION); exit(0); } if ( strcmp(argv[1], "--help") == 0 ) { printf("%s\n\n" "Usage: mtpaint [option] [imagefile ... ]\n\n" "Options:\n" " --help Output this help\n" " --version Output version information\n" " -s Grab screenshot\n" " -v Start in viewer mode\n\n" , MT_VERSION); exit(0); } } putenv( "G_BROKEN_FILENAMES=1" ); // Needed to read non ASCII filenames in GTK+2 #if GTK2VERSION >= 4 /* Tablet handling in GTK+ 2.18+ is broken beyond repair if this mode * is set; so unset it, if g_unsetenv() is present */ g_unsetenv("GDK_NATIVE_WINDOWS"); #endif #ifdef U_THREADS /* Enable threading for GLib, but NOT for GTK+ (at least, not yet) */ g_thread_init(NULL); #endif inifile_init("/etc/mtpaint/mtpaintrc", "~/.mtpaint"); #ifdef U_NLS #if GTK_MAJOR_VERSION == 1 /* !!! GTK+1 needs locale set up before gtk_init(); GTK+2, *QUITE* * the opposite - WJ */ setup_language(); #endif #endif #ifdef U_THREADS /* !!! Uncomment to allow GTK+ calls from other threads */ /* gdk_threads_init(); */ #endif gtk_init( &argc, &argv ); gtk_init_bugfixes(); #if GTK_MAJOR_VERSION == 2 { char *theme = inifile_get(DEFAULT_THEME_INI, ""); if (theme[0]) gtk_rc_parse(theme); } #endif #ifdef U_NLS #if GTK_MAJOR_VERSION == 2 /* !!! GTK+2 starts acting up if this is before gtk_init() - WJ */ setup_language(); #endif bindtextdomain("mtpaint", MT_LANG_DEST); textdomain("mtpaint"); #if GTK_MAJOR_VERSION == 2 bind_textdomain_codeset("mtpaint", "UTF-8"); #endif #endif file_arg_start = 1; if (argc > 1) // Argument received, so assume user is trying to load a file { if ( strcmp(argv[1], "-g") == 0 ) // Loading GIF animation frames { file_arg_start+=2; sscanf(argv[2], "%i", &preserved_gif_delay); } if ( strcmp(argv[1], "-v") == 0 ) // Viewer mode { file_arg_start++; viewer_mode = TRUE; } if ( strcmp(argv[1], "-s") == 0 ) // Screenshot { file_arg_start++; get_screenshot = TRUE; } if ( strstr(argv[0], "mtv") != NULL ) viewer_mode = TRUE; } /* Something else got passed in */ l = argc - file_arg_start; while (l) { /* First, process wildcarded args */ memset(&globdata, 0, sizeof(globdata)); /* !!! I avoid GLOB_DOOFFS here, because glibc before version 2.2 mishandled it, * and quite a few copycats had cloned those buggy versions, some libc * implementors among them. So it is possible to encounter a broken function * in the wild, and playing it safe doesn't cost all that much - WJ */ for (i = file_arg_start , j = 0; i < argc; i++) { if (strcmp(argv[i], "-w")) continue; j++; if (++i >= argc) break; j++; // Ignore errors - be glad for whatever gets returned glob(argv[i], (j > 2 ? GLOB_APPEND : 0), NULL, &globdata); } files_passed = l - j + globdata.gl_pathc; /* If no wildcarded args */ file_args = argv + file_arg_start; if (!j) break; /* If no normal args */ file_args = globdata.gl_pathv; if (l <= j) break; /* Allocate space for both kinds of args together */ file_args = calloc(files_passed + 1, sizeof(char *)); // !!! Die by SIGSEGV if this allocation fails /* Copy normal args if any */ for (i = file_arg_start , j = 0; i < argc; i++) { if (!strcmp(argv[i], "-w")) i++; // Skip the pair else file_args[j++] = argv[i]; } /* Copy globbed args after them */ if (globdata.gl_pathc) memcpy(file_args + j, globdata.gl_pathv, globdata.gl_pathc * sizeof(char *)); break; } string_init(); // Translate static strings var_init(); // Load INI variables mem_init(); // Set up memory & back end layers_init(); init_cols(); if ( get_screenshot ) { if (load_image(NULL, FS_PNG_LOAD, FT_PIXMAP) == 1) new_empty = FALSE; // Successfully grabbed so no new empty else get_screenshot = FALSE; // Screenshot failed } main_init(); // Create main window if ( get_screenshot ) { do_new_chores(FALSE); notify_changed(); } else { if ((files_passed > 0) && !do_a_load(file_args[0], FALSE)) new_empty = FALSE; } if ( new_empty ) // If no file was loaded, start with a blank canvas { create_default_image(); } update_menus(); THREADS_ENTER(); gtk_main(); THREADS_LEAVE(); spawn_quit(); inifile_quit(); return 0; }
gint prefs_apply( GtkWidget *widget, GdkEvent *event, gpointer data ) { int i, type; char txt[64]; for ( i=0; i<STATUS_ITEMS; i++ ) { sprintf(txt, "status%iToggle", i); inifile_set_gboolean( txt, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(prefs_status[i])) ); status_on[i] = inifile_get_gboolean(txt, TRUE); } gtk_spin_button_update( GTK_SPIN_BUTTON(spinbutton_maxmem) ); gtk_spin_button_update( GTK_SPIN_BUTTON(spinbutton_greys) ); gtk_spin_button_update( GTK_SPIN_BUTTON(spinbutton_nudge) ); gtk_spin_button_update( GTK_SPIN_BUTTON(spinbutton_trans) ); gtk_spin_button_update( GTK_SPIN_BUTTON(spinbutton_hotx) ); gtk_spin_button_update( GTK_SPIN_BUTTON(spinbutton_hoty) ); gtk_spin_button_update( GTK_SPIN_BUTTON(spinbutton_jpeg) ); gtk_spin_button_update( GTK_SPIN_BUTTON(spinbutton_recent) ); gtk_spin_button_update( GTK_SPIN_BUTTON(spinbutton_pan) ); for ( i=0; i<4; i++ ) gtk_spin_button_update( GTK_SPIN_BUTTON(spinbutton_grid[i]) ); // All needed in GTK+2 for late changes mem_undo_limit = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(spinbutton_maxmem) ); mem_background = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(spinbutton_greys) ); mem_nudge = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(spinbutton_nudge) ); mem_xpm_trans = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(spinbutton_trans) ); mem_xbm_hot_x = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(spinbutton_hotx) ); mem_xbm_hot_y = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(spinbutton_hoty) ); mem_jpeg_quality = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(spinbutton_jpeg) ); recent_files = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(spinbutton_recent) ); mem_grid_min = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(spinbutton_grid[0]) ); for ( i=0; i<3; i++ ) mem_grid_rgb[i] = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(spinbutton_grid[i+1]) ); for ( i=0; i<3; i++ ) { tablet_tool_use[i] = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_tablet[i])); inifile_set_gboolean( tablet_ini2[i], tablet_tool_use[i] ); tablet_tool_factor[i] = GTK_HSCALE(hscale_tablet[i])->scale.range.adjustment->value; inifile_set_gint32( tablet_ini[i], tablet_tool_factor[i]*100 ); } inifile_set_gint32( "gridMin", mem_grid_min ); inifile_set_gint32( "gridR", mem_grid_rgb[0] ); inifile_set_gint32( "gridG", mem_grid_rgb[1] ); inifile_set_gint32( "gridB", mem_grid_rgb[2] ); inifile_set_gint32( "panSize", gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(spinbutton_pan) ) ); inifile_set_gint32( "undoMBlimit", mem_undo_limit ); inifile_set_gint32( "backgroundGrey", mem_background ); inifile_set_gint32( "pixelNudge", mem_nudge ); inifile_set_gint32( "jpegQuality", mem_jpeg_quality ); inifile_set_gint32( "recentFiles", recent_files ); inifile_set_gboolean( "zoomToggle", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton_zoom)) ); inifile_set_gboolean( "pasteToggle", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton_paste)) ); inifile_set_gboolean( "cursorToggle", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton_cursor)) ); inifile_set_gboolean( "exitToggle", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton_exit)) ); #if GTK_MAJOR_VERSION == 2 inifile_set_gboolean( "scrollwheelZOOM", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton_wheel)) ); #endif inifile_set_gboolean( "pasteCommit", gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton_commit)) ); q_quit = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbutton_quit)); inifile_set_gboolean( "quitToggle", q_quit ); type = 0; #ifdef U_NLS for ( i=0; i<PREF_LANGS; i++ ) { if ( gtk_toggle_button_get_active( &(GTK_RADIO_BUTTON( pref_lang_radio[i] )->check_button.toggle_button) ) ) type = i; } inifile_set( "languageSETTING", pref_lang_ini[type*2] ); setup_language(); #endif strncpy( mem_clip_file[1], gtk_entry_get_text( GTK_ENTRY(clipboard_entry) ), 250 ); strncpy( mem_clip_file[0], mem_clip_file[1], 250 ); inifile_set( "clipFilename", mem_clip_file[0] ); show_paste = inifile_get_gboolean( "pasteToggle", TRUE ); update_all_views(); // Update canvas for changes set_cursor(); update_recent_files(); init_status_bar(); return FALSE; }