UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2017 Olaf Wintermann. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include <stdio.h> 30 #include <stdlib.h> 31 32 #include "graphics.h" 33 #include "container.h" 34 #include "../common/object.h" 35 36 UIWIDGET ui_drawingarea(UiObject *obj, ui_drawfunc f, void *userdata) { 37 GtkWidget *widget = gtk_drawing_area_new(); 38 39 if(f) { 40 UiDrawEvent *event = malloc(sizeof(UiDrawEvent)); 41 event->obj = obj; 42 event->callback = f; 43 event->userdata = userdata; 44 ui_connect_draw_handler(widget, event); 45 } 46 47 UiContainer *ct = uic_get_current_container(obj); 48 ct->add(ct, widget, TRUE); 49 50 return widget; 51 } 52 53 54 #if GTK_MAJOR_VERSION <= 3 55 static gboolean widget_button_pressed( 56 GtkWidget *widget, 57 GdkEvent *event, 58 gpointer userdata) 59 { 60 UiEventData *eventdata = userdata; 61 62 UiMouseEvent me; 63 me.x = (int)event->button.x; 64 me.y = (int)event->button.y; 65 66 int exec = 0; 67 if(event->button.type == GDK_BUTTON_PRESS) { 68 exec = 1; 69 me.type = UI_PRESS; 70 } else if(event->button.type == GDK_2BUTTON_PRESS) { 71 exec = 1; 72 me.type = UI_PRESS2; 73 } 74 75 if(exec) { 76 UiEvent e; 77 e.obj = eventdata->obj; 78 e.window = eventdata->obj->window; 79 e.document = eventdata->obj->ctx->document; 80 e.eventdata = &me; 81 e.intval = 0; 82 eventdata->callback(&e, eventdata->userdata); 83 } 84 return TRUE; 85 } 86 #endif 87 88 void ui_drawingarea_getsize(UIWIDGET drawingarea, int *width, int *height) { 89 #if GTK_MAJOR_VERSION >= 4 90 *width = gtk_widget_get_width(drawingarea); 91 *height = gtk_widget_get_height(drawingarea); 92 #elif GTK_MAJOR_VERSION == 3 93 *width = gtk_widget_get_allocated_width(drawingarea); 94 *height = gtk_widget_get_allocated_height(drawingarea); 95 #else 96 *width = drawingarea->allocation.width; 97 *height = drawingarea->allocation.height; 98 #endif 99 } 100 101 void ui_drawingarea_redraw(UIWIDGET drawingarea) { 102 gtk_widget_queue_draw(drawingarea); 103 } 104 105 void ui_drawingarea_mousehandler(UiObject *obj, UIWIDGET widget, ui_callback f, void *u) { 106 #if GTK_MAJOR_VERSION >= 4 107 // TODO 108 #else 109 gtk_widget_set_events(widget, GDK_BUTTON_PRESS_MASK); 110 if(f) { 111 UiEventData *event = malloc(sizeof(UiEventData)); 112 event->obj = obj; 113 event->callback = f; 114 event->userdata = u; 115 event->customdata = NULL; 116 event->value = 0; 117 118 g_signal_connect(G_OBJECT(widget), 119 "button-press-event", 120 G_CALLBACK(widget_button_pressed), 121 event); 122 } else { 123 // TODO: warning 124 } 125 #endif 126 } 127 128 129 // text layout 130 UiTextLayout* ui_text(UiGraphics *g) { 131 UiTextLayout *layout = malloc(sizeof(UiTextLayout)); 132 PangoContext *pc = ui_get_pango_context(g); 133 layout->layout = pango_layout_new(pc); 134 return layout; 135 } 136 137 void ui_text_setstring(UiTextLayout *layout, char *str) { 138 pango_layout_set_text(layout->layout, str, -1); 139 } 140 141 void ui_text_setstringl(UiTextLayout *layout, char *str, int len) { 142 pango_layout_set_text(layout->layout, str, len); 143 } 144 145 void ui_text_setfont(UiTextLayout *layout, char *font, int size) { 146 PangoFontDescription *fontDesc; 147 fontDesc = pango_font_description_from_string(font); 148 pango_font_description_set_size(fontDesc, size * PANGO_SCALE); 149 pango_layout_set_font_description(layout->layout, fontDesc); 150 pango_font_description_free(fontDesc); 151 } 152 153 void ui_text_getsize(UiTextLayout *layout, int *width, int *height) { 154 pango_layout_get_size(layout->layout, width, height); 155 *width = *width / PANGO_SCALE; 156 *height = *height / PANGO_SCALE; 157 } 158 159 void ui_text_setwidth(UiTextLayout *layout, int width) { 160 pango_layout_set_width(layout->layout, width * PANGO_SCALE); 161 pango_layout_set_ellipsize(layout->layout, PANGO_ELLIPSIZE_END); 162 //pango_layout_set_wrap(layout->layout, PANGO_WRAP_WORD_CHAR); 163 } 164 165 void ui_text_free(UiTextLayout *text) { 166 g_object_unref(text->layout); 167 free(text); 168 } 169