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 static gboolean widget_button_pressed( 55 GtkWidget *widget, 56 GdkEvent *event, 57 gpointer userdata) 58 { 59 UiEventData *eventdata = userdata; 60 61 UiMouseEvent me; 62 me.x = (int)event->button.x; 63 me.y = (int)event->button.y; 64 65 int exec = 0; 66 if(event->button.type == GDK_BUTTON_PRESS) { 67 exec = 1; 68 me.type = UI_PRESS; 69 } else if(event->button.type == GDK_2BUTTON_PRESS) { 70 exec = 1; 71 me.type = UI_PRESS2; 72 } 73 74 if(exec) { 75 UiEvent e; 76 e.obj = eventdata->obj; 77 e.window = eventdata->obj->window; 78 e.document = eventdata->obj->ctx->document; 79 e.eventdata = &me; 80 e.intval = 0; 81 eventdata->callback(&e, eventdata->userdata); 82 } 83 return TRUE; 84 } 85 86 void ui_drawingarea_getsize(UIWIDGET drawingarea, int *width, int *height) { 87 #ifdef UI_GTK3 88 *width = gtk_widget_get_allocated_width(drawingarea); 89 *height = gtk_widget_get_allocated_height(drawingarea); 90 #else 91 *width = drawingarea->allocation.width; 92 *height = drawingarea->allocation.height; 93 #endif 94 } 95 96 void ui_drawingarea_redraw(UIWIDGET drawingarea) { 97 gtk_widget_queue_draw(drawingarea); 98 } 99 100 void ui_drawingarea_mousehandler(UiObject *obj, UIWIDGET widget, ui_callback f, void *u) { 101 gtk_widget_set_events(widget, GDK_BUTTON_PRESS_MASK); 102 if(f) { 103 UiEventData *event = malloc(sizeof(UiEventData)); 104 event->obj = obj; 105 event->callback = f; 106 event->userdata = u; 107 108 g_signal_connect(G_OBJECT(widget), 109 "button-press-event", 110 G_CALLBACK(widget_button_pressed), 111 event); 112 } else { 113 // TODO: warning 114 } 115 } 116 117 118 // text layout 119 UiTextLayout* ui_text(UiGraphics *g) { 120 UiTextLayout *layout = malloc(sizeof(UiTextLayout)); 121 PangoContext *pc = ui_get_pango_context(g); 122 layout->layout = pango_layout_new(pc); 123 return layout; 124 } 125 126 void ui_text_setstring(UiTextLayout *layout, char *str) { 127 pango_layout_set_text(layout->layout, str, -1); 128 } 129 130 void ui_text_setstringl(UiTextLayout *layout, char *str, int len) { 131 pango_layout_set_text(layout->layout, str, len); 132 } 133 134 void ui_text_setfont(UiTextLayout *layout, char *font, int size) { 135 PangoFontDescription *fontDesc; 136 fontDesc = pango_font_description_from_string(font); 137 pango_font_description_set_size(fontDesc, size * PANGO_SCALE); 138 pango_layout_set_font_description(layout->layout, fontDesc); 139 pango_font_description_free(fontDesc); 140 } 141 142 void ui_text_getsize(UiTextLayout *layout, int *width, int *height) { 143 pango_layout_get_size(layout->layout, width, height); 144 *width = *width / PANGO_SCALE; 145 *height = *height / PANGO_SCALE; 146 } 147 148 void ui_text_setwidth(UiTextLayout *layout, int width) { 149 pango_layout_set_width(layout->layout, width * PANGO_SCALE); 150 pango_layout_set_ellipsize(layout->layout, PANGO_ELLIPSIZE_END); 151 //pango_layout_set_wrap(layout->layout, PANGO_WRAP_WORD_CHAR); 152 } 153 154 void ui_text_free(UiTextLayout *text) { 155 g_object_unref(text->layout); 156 free(text); 157 } 158