/* Execute selected entry; either show submenu or * call given function. */ static bool menu_execute_selected(WMenu *menu) { WMenuEnt *entry; WMenuData *data; WThing *context; if(menu->selected<0) return TRUE; /* Submenu already visible? -> return */ if(MENU_SUBMENU(menu)!=NULL) return TRUE; data=menu->data; context=menu->context; entry=&(data->entries[menu->selected]); if(entry->flags&WMENUENT_SUBMENU){ do_show_selected_submenu(menu, entry); return TRUE; } data->nref++; if(menu->flags&WMENU_KEEP){ menu_set_selected(menu, NO_ENTRY); }else{ finish_menu(menu, FALSE); } finish_contextual_menus(); if(data->exec_func!=NULL) data->exec_func(entry, context); if(--data->nref==0 && data->deinit_func!=NULL) data->deinit_func(data); return FALSE; }
void menu_button(WThing *thing, XButtonEvent *ev, WFunction *func, WFuncArg arg) { WMenu *menu; int x, y, entry; if(!WTHING_IS(thing, WTHING_MENU)) return; menu=(WMenu*)thing; x=ev->x_root-menu->x; y=ev->y_root-menu->y; entry=entry_at(menu, x, y); if(ev->type==ButtonPress){ /* press */ if(entry==menu->selected){ menu_set_selected(menu, NO_ENTRY); }else{ menu_set_selected(menu, entry); show_selected_submenu(menu); } return; } end_scroll(); /* release */ if(entry>=0){ if(menu->selected==entry) menu_execute_selected(menu); }else if(entry!=ENTRY_TITLE && !(menu->flags&WMENU_KEEP)){ finish_menu(menu, FALSE); } destroy_contextual_menus(); }
GtkWidget* ctk_gvo_sync_new(NvCtrlAttributeHandle *handle, GtkWidget *parent_window, CtkConfig *ctk_config, CtkEvent *ctk_event, CtkGvo *gvo_parent) { GObject *object; CtkGvoSync *ctk_gvo_sync; GtkWidget *frame; GtkWidget *hbox; GtkWidget *label; GtkWidget *alignment; GtkWidget *button; GtkWidget *table, *menu; gint val, i; NVCTRLAttributeValidValuesRec valid; ReturnStatus ret; gint row; const char *help_text; /* make sure we have a handle */ g_return_val_if_fail(handle != NULL, NULL); /* create and initialize the object */ object = g_object_new(CTK_TYPE_GVO_SYNC, NULL); ctk_gvo_sync = CTK_GVO_SYNC(object); ctk_gvo_sync->handle = handle; ctk_gvo_sync->parent_window = parent_window; ctk_gvo_sync->ctk_config = ctk_config; ctk_gvo_sync->ctk_event = ctk_event; ctk_gvo_sync->gvo_parent = gvo_parent; /* Query the current GVO state */ if ( !query_init_gvo_sync_state(ctk_gvo_sync) ) { // Free the object g_object_ref(object); gtk_object_sink(GTK_OBJECT(object)); g_object_unref(object); return NULL; } /* set container properties for the widget */ gtk_box_set_spacing(GTK_BOX(object), 10); /* banner */ hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(object), hbox, FALSE, FALSE, 0); ctk_gvo_sync->banner_box = hbox; /* * Sync options */ frame = gtk_frame_new("Sync Options"); ctk_gvo_sync->frame = frame; gtk_box_pack_start(GTK_BOX(object), frame, FALSE, FALSE, 0); table = gtk_table_new(6, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(table), 0); gtk_table_set_col_spacings(GTK_TABLE(table), 0); gtk_container_add(GTK_CONTAINER(frame), table); /* input video format */ label = gtk_label_new("Input Video Format: "); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, TABLE_PADDING, TABLE_PADDING); hbox = gtk_hbox_new(FALSE, 5); ctk_gvo_sync->input_video_format_text_entry = gtk_entry_new(); ctk_config_set_tooltip(ctk_config, ctk_gvo_sync->input_video_format_text_entry, __input_video_format_help); gtk_entry_set_width_chars (GTK_ENTRY(ctk_gvo_sync->input_video_format_text_entry), max_input_video_format_text_entry_length()); gtk_widget_set_sensitive(ctk_gvo_sync->input_video_format_text_entry, FALSE); update_input_video_format_text_entry(ctk_gvo_sync); gtk_box_pack_start(GTK_BOX(hbox), ctk_gvo_sync->input_video_format_text_entry, TRUE, TRUE, 0); /* Input video format detect button */ button = gtk_toggle_button_new_with_label("Detect"); alignment = gtk_alignment_new(1, 1, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), button); ctk_gvo_sync->input_video_format_detect_button = button; ctk_config_set_tooltip(ctk_config, button, __input_video_format_detect_help); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(detect_input_toggled), ctk_gvo_sync); gtk_box_pack_start(GTK_BOX(hbox), alignment, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, GTK_FILL, TABLE_PADDING, TABLE_PADDING); /* Composite Termination */ if (ctk_gvo_sync->caps & NV_CTRL_GVO_CAPABILITIES_COMPOSITE_TERMINATION) { button = gtk_check_button_new_with_label("Enable Composite Termination"); ctk_config_set_tooltip(ctk_config, button, __composite_termination_help); alignment = gtk_alignment_new(1, 1, 0, 0); gtk_container_add(GTK_CONTAINER(alignment), button); gtk_table_attach(GTK_TABLE(table), alignment, 0, 2, 2, 3, GTK_FILL | GTK_EXPAND, GTK_FILL, TABLE_PADDING, TABLE_PADDING); ctk_gvo_sync->composite_termination_button = button; init_composite_termination(ctk_gvo_sync); g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(composite_termination_toggled), ctk_gvo_sync); row = 3; } else { ctk_gvo_sync->composite_termination_button = NULL; row = 2; } /* Sync Mode */ menu = start_menu("Sync Mode: ", table, row); ctk_drop_down_menu_append_item(CTK_DROP_DOWN_MENU(menu), "Free Running", NV_CTRL_GVO_SYNC_MODE_FREE_RUNNING); ctk_drop_down_menu_append_item(CTK_DROP_DOWN_MENU(menu), "GenLock", NV_CTRL_GVO_SYNC_MODE_GENLOCK); ctk_drop_down_menu_append_item(CTK_DROP_DOWN_MENU(menu), "FrameLock", NV_CTRL_GVO_SYNC_MODE_FRAMELOCK); finish_menu(menu, table, row); row++; ctk_gvo_sync->sync_mode_menu = menu; ctk_drop_down_menu_set_tooltip(ctk_config, CTK_DROP_DOWN_MENU(menu), __sync_mode_help); ctk_drop_down_menu_set_current_value (CTK_DROP_DOWN_MENU(ctk_gvo_sync->sync_mode_menu), ctk_gvo_sync->sync_mode); g_signal_connect(G_OBJECT(ctk_gvo_sync->sync_mode_menu), "changed", G_CALLBACK(sync_mode_changed), (gpointer) ctk_gvo_sync); /* Sync Format */ menu = start_menu("Sync Format: ", table, row); for (i = 0; syncFormatNames[i].name; i++) { ctk_drop_down_menu_append_item(CTK_DROP_DOWN_MENU(menu), syncFormatNames[i].name, syncFormatNames[i].format); } finish_menu(menu, table, row); row++; ctk_gvo_sync->sync_format_menu = menu; ctk_drop_down_menu_set_tooltip(ctk_config, CTK_DROP_DOWN_MENU(menu), __sync_format_help); init_sync_format_menu(ctk_gvo_sync); g_signal_connect(G_OBJECT(ctk_gvo_sync->sync_format_menu), "changed", G_CALLBACK(sync_format_changed), (gpointer) ctk_gvo_sync); /* Sync Status */ label = gtk_label_new("Sync Status:"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_FILL, GTK_FILL, TABLE_PADDING, TABLE_PADDING); ctk_gvo_sync->sync_lock_status_text = gtk_label_new(""); update_sync_lock_status_text(ctk_gvo_sync); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_gvo_sync->sync_lock_status_text, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, row, row+1, GTK_FILL /*| GTK_EXPAND*/, GTK_FILL, TABLE_PADDING, TABLE_PADDING); row++; /* * Synchronization Skew (Delay/Advance) */ /* NV_CTRL_GVO_SYNC_DELAY_PIXELS */ ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_GVO_SYNC_DELAY_PIXELS, &valid); if ((ret == NvCtrlSuccess) && (valid.type == ATTRIBUTE_TYPE_RANGE)) { ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_SYNC_DELAY_PIXELS, &val); if (ret != NvCtrlSuccess) val = 0; if (ctk_gvo_sync->caps & NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW) { label = gtk_label_new("HSync Advance:"); help_text = __hsync_advance_help; } else { label = gtk_label_new("HSync Delay:"); help_text = __hsync_delay_help; } gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_FILL, GTK_FILL, TABLE_PADDING, TABLE_PADDING); ctk_gvo_sync->hsync_delay_spin_button = gtk_spin_button_new_with_range(valid.u.range.min, valid.u.range.max, 1); ctk_config_set_tooltip(ctk_config, ctk_gvo_sync->hsync_delay_spin_button, help_text); gtk_spin_button_set_value (GTK_SPIN_BUTTON(ctk_gvo_sync->hsync_delay_spin_button), val); g_signal_connect(G_OBJECT(ctk_gvo_sync->hsync_delay_spin_button), "value-changed", G_CALLBACK(hsync_delay_changed), ctk_gvo_sync); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_gvo_sync->hsync_delay_spin_button, FALSE, FALSE, 0); label = gtk_label_new("(pixels)"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, row, row+1, GTK_FILL /*| GTK_EXPAND*/, GTK_FILL, TABLE_PADDING, TABLE_PADDING); row++; } /* NV_CTRL_GVO_SYNC_DELAY_LINES */ ret = NvCtrlGetValidAttributeValues(handle, NV_CTRL_GVO_SYNC_DELAY_LINES, &valid); if ((ret == NvCtrlSuccess) && (valid.type == ATTRIBUTE_TYPE_RANGE)) { ret = NvCtrlGetAttribute(handle, NV_CTRL_GVO_SYNC_DELAY_LINES, &val); if (ret != NvCtrlSuccess) val = 0; if (ctk_gvo_sync->caps & NV_CTRL_GVO_CAPABILITIES_ADVANCE_SYNC_SKEW) { label = gtk_label_new("VSync Advance:"); help_text = __vsync_advance_help; } else { label = gtk_label_new("VSync Delay:"); help_text = __vsync_delay_help; } gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_table_attach(GTK_TABLE(table), label, 0, 1, row, row+1, GTK_FILL, GTK_FILL, TABLE_PADDING, TABLE_PADDING); ctk_gvo_sync->vsync_delay_spin_button = gtk_spin_button_new_with_range(valid.u.range.min, valid.u.range.max, 1); ctk_config_set_tooltip(ctk_config, ctk_gvo_sync->vsync_delay_spin_button, help_text); gtk_spin_button_set_value (GTK_SPIN_BUTTON(ctk_gvo_sync->vsync_delay_spin_button), val); g_signal_connect(G_OBJECT(ctk_gvo_sync->vsync_delay_spin_button), "value-changed", G_CALLBACK(vsync_delay_changed), ctk_gvo_sync); hbox = gtk_hbox_new(FALSE, 5); gtk_box_pack_start(GTK_BOX(hbox), ctk_gvo_sync->vsync_delay_spin_button, FALSE, FALSE, 0); label = gtk_label_new("(lines)"); gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); gtk_table_attach(GTK_TABLE(table), hbox, 1, 2, row, row+1, GTK_FILL /*| GTK_EXPAND*/, GTK_FILL, TABLE_PADDING, TABLE_PADDING); row++; } /* create the watch cursor (for use when the "Detect" button is toggled" */ ctk_gvo_sync->wait_cursor = gdk_cursor_new(GDK_WATCH); /* Set UI sensitivity */ update_gvo_sync_sensitivity(ctk_gvo_sync); /* Start listening for events */ register_for_gvo_sync_events(ctk_gvo_sync); /* show the page */ gtk_widget_show_all(GTK_WIDGET(object)); return GTK_WIDGET(object); } /* ctk_gvo_sync_new() */
void menu_command(WMenu *menu, int cmd) { WMenu *other; switch(cmd){ case MENU_CMD_PREV: if(menu->selected>0) menu_set_selected(menu, menu->selected-1); else menu_set_selected(menu, menu->data->nentries-1); vis_entry(menu, menu->selected); break; case MENU_CMD_NEXT: if(menu->selected<menu->data->nentries-1) menu_set_selected(menu, menu->selected+1); else menu_set_selected(menu, 0); vis_entry(menu, menu->selected); break; case MENU_CMD_ENTERSUB: case MENU_CMD_EXECUTE: if(menu->selected<0) break; if(MENU_SUBMENU(menu)==NULL){ if(menu->data->entries[menu->selected].flags&WMENUENT_SUBMENU) show_selected_submenu(menu); } other=MENU_SUBMENU(menu); if(other!=NULL){ set_active_menu(other); if(other->selected==NO_ENTRY) other->selected=0; vis_entry(other, other->selected); break; } if(cmd!=MENU_CMD_EXECUTE) break; menu_execute_selected(menu); break; case MENU_CMD_LEAVESUB: other=MENU_PARENT(menu); if(other!=NULL){ do_destroy_menu_tree(menu, FALSE, FALSE); /* set_active_menu is not used because unlink_winobj_d gives the * parent a focus if the destroyed menu is current. This should * not bee true in INPUT_CTXMENU mode. */ if(wglobal.input_mode==INPUT_CTXMENU) wglobal.grab_holder=(WThing*)other; vis_entry(other, other->selected); } break; case MENU_CMD_CLOSE: finish_menu(menu, TRUE); finish_contextual_menus(); break; case MENU_CMD_RAISEKEEP: raise_winobj((WWinObj*)menu); case MENU_CMD_KEEP: keep(menu); break; } }